一文全面了解 wxWidgets 程序国际化(i18n)处理

尽管应用程序的国际化(简称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

  • 14
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
wxWidgets的初始化是通过调用wxInitializer类的构造函数来完成的。在构造函数中,会调用wxInitialize函数来进行初始化。该函数的参数是argc和argv,这些参数通常是由主函数传递给应用程序的命令行参数。通过调用wxInitialize函数来初始化wxWidgets库,可以确保在使用wxWidgets之前,所有必要的初始化工作都已完成。 在使用wxWidgets的样本程序时,如果遇到了无法运行的问题,可以尝试在构建新的wxWidgets项目时勾选"use dynamic wxWidgets libs"选项。这个选项的前提是按照动态库构建的wxWidgets。这样可以确保程序能够正确链接和加载wxWidgets库,并进行正确的初始化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [wxWidgets初始化分析-应用定义和初始化](https://blog.csdn.net/weixin_30376083/article/details/96446977)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [linux下code::blocks开发wxWidgets项目的初始化工作](https://blog.csdn.net/weixin_30244681/article/details/96767073)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值