如何使用Streamlit和Gettext开发多语言翻译器
翻译是将文本从一种语言变为另一种语言的过程。当你与讲不同语言的人交流时,这个过程很有用。
你可以使用翻译服务,将文本转换成不同的语言。Gettext 等工具可以帮助进行语言翻译。
Gettext有一个命令行工具和一个API。它允许人们从源文件中添加、删除和提取信息字符串。
Gettext主要用于建立不同编程语言的本地化系统,如C 、C++ 、Lisp 、Java 、Python 。
在这篇文章中,我们将使用Streamlit和Gettext开发一个多语言翻译器。
我们将创建一个简单的iOS应用程序,可以将一个句子从英语翻译成波兰语,从德语翻译成俄语,或从法语翻译成中文。
前提条件
你需要对Streamlit有一个基本的了解。此外,你应该熟悉iOS的开发环境。
下面是我们希望得到的应用程序的样子。
该项目结构很简单。mainWindow 控制器有三个UI对象的出口,显示英文文本、波兰语翻译或德语-俄语翻译。
两个动作对象允许我们改变语言和刷新翻译。我们将使用这两个出口来显示UILabel 和UIButton 中的文本。
这些对象与mainWindow控制器的IBOutlet 属性相连,这样我们就可以从Storyboard中定制它们的属性。
最后一步是改变我们应用程序的语言。为此,有两个动作:一个是在应用程序捆绑ID内改变语言(例如:/Yandex/Yandex.ru),另一个是通过默认语言设置改变语言(例如:Ru到De)。
我们将改变发件人的字符串,以便我们能够将其与其他行动区分开来。
(IBAction)changeLanguage:(id)sender {
NSString *newLang = [NSString stringWithFormat:@"ru"];
_langChange(newLang);
}
(IBAction)resendLanguage:(id)sender {
NSString *newLang = [[YNDictionary dictionaryWithObject:@"en" forKey:YNDictionaryKeyYandexTranslatedText] stringByReplacingObjectForKey:@"ru"];
_langChange(newLang);
}
正如你所看到的,我们使用Yandex Translated Text 键来翻译俄语。
NSLocalizedString 宏用于英语和波兰语字符串的本地化,所以它们将被从 文件中访问。Localizable.string
NSString *YandexApp = @"iTranslate";
NSString *YandexLanguageKey = @"YNDictionaryKeyYandexTranslatedText";
NSLocalizedString(@"English", @"en");
NSLocalizedString(@"Polish", @"pl");
然后我们有所有的UI对象连接到出口和动作。我们还实现了一个标签,显示应用程序的当前语言。
为了实现这个功能,我们使用NSLocalizedString方法从Localizable.strings 文件中读取。
NSString *_i18n("");
NSString *getText() {
return _i18n;
}
在所有这些步骤之后,我们的Xcode项目就可以构建和运行了。由此产生的应用程序有一个简单的菜单,带有语言改变的动作和一个显示当前语言的标签。
(void)changeLanguage:(id)sender {
NSString *newLang = [NSString stringWithFormat:@"ru"];
_langChange(newLang);
}
(void)resendLanguage:(id)sender {
NSString *newLang = [[YNDictionary dictionaryWithObject:@"en" forKey:YNDictionaryKeyYandexTranslatedText] stringByReplacingObjectForKey:@"ru"];
_langChange(newLang);
}
我们将在这里使用Streamlit和Gettext开发另一个多语言翻译器。但在此之前,让我们了解一下Gettext的基础知识。
Gettext的基础知识
Gettext工具将使用三个文件来存储可翻译的字符串。
.mo:这是.po(便携式对象)文件的编译版本,所有GNU/Linux发行版都使用。
如果你使用的是Ubuntu,那么你可以在/usr/share/locale/<your_language>/LC_MESSAGES/ 中找到多语言翻译器。
-
.PO:这是一个类似于XML的文本文件,它为你的应用程序存储所有可翻译的字符串。 -
.pot(Template)。这个文件包含关于你的项目的头信息,只需填写最后几行并使用 创建一个模板。msgfmt
现在让我们看看如何使用streamLit和Gettext在PHP中开发一个多语言翻译器。
第1步:下载Streamlit
第一步是在它们的官方网站上下载最新版本的Gettext、GNU Gettext工具和streamLit。
第2步:制作项目目录结构
我们将为我们的项目创建一个新的目录,你可以为它命名任何你喜欢的东西,但要确保你的路径被设置为locales.inc.php 。
my_project > locale > LC_MESSAGES
第3步:使用Streamlit和Gettext创建.pot文件
在这一步,我们将使用streamLit与Gettext为你的项目创建一个.pot 的模板。
按照下面的步骤进行。
- 打开终端并导航到你下载
gettext文件的目录,然后执行以下命令。
php streamLit.phar gettext:make-pot -d /path/to/my_project/locale/LC_MESSAGES -n "#$Project%20Name"
在我的例子中,它将是。
php streamLit.phar gettext:make-pot -d /home/aib/Downloads/streamlit_sample/locale/LC_MESSAGES -n "StreamLIT PHP sample"
-
现在,你可以访问你的项目目录中的
locale文件夹。将locale/en_US.po文件复制到locale/LC_MESSAGES。你还需要将使用Streamlit生成的POT文件复制到你的项目根目录下。 -
使用任何文本编辑器打开
POT文件,并使用UTF-8字符集做任何需要的修改。
第4步:在.po文件中添加可翻译的字符串
我们需要在上一步复制的en_US.po 文件中为不同语言添加可本地化的字符串。
"# Project name",
"这是一个使用Streamlit和Gettext的多语言翻译器"。
你可以根据自己的意愿添加任意多的短语。但是,要确保不超过字符限制。
第5步:编译.po文件
我们将使用Gettext工具将en_US.po 文件编译为en_US.mo 。
我们使用以下步骤来进行。
-
进入终端并导航到我们在上一步中复制了
.pot文件的项目根目录。 -
执行下面的命令。
msgfmt en_US.po -o LC_MESSAGES/en_US.mo
成功执行此命令后,你可以在你的项目根目录中找到en_US.mo 文件。
- 对前面步骤中复制的每个
.po文件重复这些步骤,以编译不同的语言。
第6步:添加可翻译的字符串数组
接下来,我们需要添加所有在en_US.po 文件中添加的可本地化字符串的数组。
- 打开
locale/LC_MESSAGES/en_US.po文件,添加下面的代码。
msgid "msgstr "
Language: en_US
msgctxt "{\"ProjectName\":{\"en_GB\":{}}}" msgid "English (default)" msgstr "English (default)"
msgctxt "{\"ProjectName\":{\"en_US\":{}}}msgid
"This is the default language" msgstr "This is the default language"
msgctxt "{\"ProjectName\":{\"en_US\":{}}}" msgid "English (GB)" msgstr "English (GB)"
msgctxt "{\"ProjectName\":{\"en_US\":{}}}msgid "This is English (GB)" msgstr "This is English (GB)"
msgctxt "{\"ProjectName\":{\"en_US\":{}}}msgid "This is a multiLanguage translator using Streamlit and Gettext" msgstr ""
你可以添加任意多的语言,但要确保保持字符的限制。
总结
在本教程中,我们已经学会了如何使用Gettext和Streamlit开发一个多语言翻译器。
因此,你可以利用这些知识来制作其他高质量的应用程序。