如何使用Streamlit和Gettext开发一个多语言翻译器

531 阅读5分钟

如何使用Streamlit和Gettext开发多语言翻译器

翻译是将文本从一种语言变为另一种语言的过程。当你与讲不同语言的人交流时,这个过程很有用。

你可以使用翻译服务,将文本转换成不同的语言。Gettext 等工具可以帮助进行语言翻译。

Gettext有一个命令行工具和一个API。它允许人们从源文件中添加、删除和提取信息字符串。

Gettext主要用于建立不同编程语言的本地化系统,如CC++LispJavaPython

在这篇文章中,我们将使用Streamlit和Gettext开发一个多语言翻译器。

我们将创建一个简单的iOS应用程序,可以将一个句子从英语翻译成波兰语,从德语翻译成俄语,或从法语翻译成中文。

前提条件

你需要对Streamlit有一个基本的了解。此外,你应该熟悉iOS的开发环境。

下面是我们希望得到的应用程序的样子。

该项目结构很简单。mainWindow 控制器有三个UI对象的出口,显示英文文本、波兰语翻译或德语-俄语翻译。

两个动作对象允许我们改变语言和刷新翻译。我们将使用这两个出口来显示UILabelUIButton 中的文本。

这些对象与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工具将使用三个文件来存储可翻译的字符串。

  1. .mo:这是.po (便携式对象)文件的编译版本,所有GNU/Linux发行版都使用。

如果你使用的是Ubuntu,那么你可以在/usr/share/locale/<your_language>/LC_MESSAGES/ 中找到多语言翻译器。

  1. .PO:这是一个类似于XML的文本文件,它为你的应用程序存储所有可翻译的字符串。

  2. .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 的模板。

按照下面的步骤进行。

  1. 打开终端并导航到你下载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"
  1. 现在,你可以访问你的项目目录中的locale 文件夹。将locale/en_US.po 文件复制到locale/LC_MESSAGES 。你还需要将使用Streamlit生成的POT 文件复制到你的项目根目录下。

  2. 使用任何文本编辑器打开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开发一个多语言翻译器。

因此,你可以利用这些知识来制作其他高质量的应用程序。