尽管应用程序的国际化(简称i18n)远不止是将文本消息翻译成另一种语言的消息——日期、时间和货币格式也需要更改,一些语言是从左到右书写,而另一些是从右到左书写,字符编码可能不同,以及许多其他可能需要更改的事项——但这都是必要的第一步。
wxWidgets通过其wxLocale类为消息翻译提供了便利,并且wxWidgets本身已被完全翻译成多种语言。请访问wxWidgets主页以获取最新的翻译——如果您将其翻译成尚未完成的语言之一,您的翻译将非常受欢迎,并会被纳入未来版本的库中!
wxWidgets对i18n的处理方法紧密遵循GNU gettext包。wxWidgets使用消息目录,这些目录与gettext目录在二进制上兼容,这允许使用此包中的所有程序来处理它们,以及使用以这种格式处理消息目录的任何工具,如Poedit。
因此,在程序开发期间,您需要使用gettext包来处理翻译。但是,在运行时不需要额外的库,因此您只需要分发消息目录,不需要其他任何东西。
有两种类型的消息目录:源目录是扩展名为.po的文本文件,而二进制目录则是使用msgfmt程序(gettext包的一部分)从源文件创建的,其扩展名为.mo。在程序执行期间,只需要二进制文件。
翻译您的应用程序涉及几个步骤:
•使用wxGetTranslation或等效的_()宏来翻译程序文本中的字符串。
•从程序中提取待翻译的字符串:这一步利用了上一步的工作成果,因为用于字符串提取的xgettext程序可以识别标准的_()以及(使用其-k选项)我们的wxGetTranslation,并提取对这些函数的调用中的所有字符串。另外,您还可以使用-a选项来提取所有字符串,但通常会导致找到许多根本不需要翻译的字符串。这将创建一个文本消息目录——一个.po文件。
•将上一步提取的字符串翻译成其他语言。这涉及编辑.po文件。
•将.po文件编译成.mo文件,供程序使用。
•将.mo文件与您的应用程序一起安装在目标系统的适当位置(请参阅安装翻译目录)。
•在您的程序中设置适当的区域设置,以使用给定语言的字符串:请参阅wxLocale。
注意:在macOS上,您还需要在应用程序的Info.plist文件的CFBundleLocalizations键下列出所有支持的语言,以便应用程序支持相应的区域设置。
安装翻译目录
编译后的目录.mo文件必须与应用程序一起包含。默认情况下,wxFileTranslationsLoader用于从与应用程序一起安装的文件中加载它们(尽管您也可以使用wxResourceTranslationsLoader或一些自定义加载器)。
这些文件应位于资源目录中(由wxStandardPaths::GetLocalizedResourcesDir(wxStandardPaths::ResourceCat_Messages)返回)。如果消息目录未安装在此默认位置,您可以使用wxFileTranslationsLoader::AddCatalogLookupPathPrefix()明确指定,以便wxWidgets仍然能够找到它们,但建议在可能的情况下使用默认位置。
根据平台的不同,默认位置也不同。在Windows上,它与可执行文件相邻。在Unix上,预期翻译位于“$prefix/share/locale”。在macOS上,使用应用程序捆绑包的Resources子目录。
在所有情况下,都会在以ISO 639语言代码命名的子目录中搜索翻译。.mo文件应直接位于该目录中或位于LC_MESSAGES子目录中。在macOS上,针对每种语言的Resources子目录使用“.lproj”扩展名。
以下是一个应用程序在Unix上安装文件的典型方式:
/usr/bin/myapp
/usr/share/locale/de/LC_MESSAGES/myapp.mo
/usr/share/locale/fr/LC_MESSAGES/myapp.mo
在macOS上:
MyApp.app/Contents/MacOS/MyApp
MyApp.app/Contents/Resources/de.lproj/myapp.mo
MyApp.app/Contents/Resources/fr.lproj/myapp.mo
在Windows上:
C:\Program Files\MyApp\myapp.exe
C:\Program Files\MyApp\de\myapp.mo
C:\Program Files\MyApp\fr\myapp.mo
当然,也可以在所有地方使用Unix布局。
翻译菜单快捷键
如果您在菜单标签中翻译了快捷键修饰符名称(Ctrl、Alt和Shift),您可能会发现快捷键不再起作用。在您的消息目录中,您需要提供这些修饰符从小写名称(ctrl、alt、shift)的单独翻译,以便wxWidgets快捷键代码即使在翻译后也能识别它们。目前,wxWidgets没有为所有这些提供翻译。wxWidgets尚不处理翻译的特殊键名,例如Backspace、End、Insert等。
另请参阅:
• gettext手册:GNU gettext utilities
•编写非英语应用程序 - 主要关注处理与字符集相关的问题。
•国际化示例 - 展示这一切在实践中是如何运作的。
// END