c++ - 现代 Cpp 项目中的 I18n
问题描述
我正在开发一个现代 C++ 项目,目前和中期,但在某些时候作为 FOSS 项目。目前,我正处于必须实现国际化功能的地步。我研究了一下,发现口语一团糟。所以我没有办法自己实现像 i18n/l10n 库这样的东西。总结为:使用gettext。(在我的例子中是 Boost.Locale 包装器)
到目前为止一切顺利,但图书馆需要我直接在代码中编写原始/源文本。假定为英语。你可能注意到了,我不是一个土生土长的英国人。我的英语太糟糕了,不能用它作为源语言——我不想要这个。例如,要传达微妙的幽默感,就需要对语言有很好的了解。
现在我看到 3 个选项:
std::cout << gettext("Hallo Welt") << std::endl;
std::cout << gettext("Hello World") << std::endl;
std::cout << my_own_crappy_lib(HELLO_WORLD_ID) << std::endl;
1)意味着在代码中编写我的母语,这使得非德国人无法使用我的代码库进行开发。它也很丑,因为我写的是英文源代码,英文代码文档,但是德文语言环境字符串。
2) 意思是写英文,希望有人纠正我的错别字并摒弃我的幽默。
3)自己实现一些将一些速记标识符映射到翻译的东西。但我完全不确定如何做到这一点以及如何处理复数形式等。
你能给我一些暗示我将如何继续吗?
OT:请不要怪我懒惰学习正确的英语。我是电视连续剧 Futurama 的忠实粉丝,您会看到即使是专业的翻译人员也无法翻译很多笑话或微妙的典故。
解决方案
你有两个选择:
1) 将项目的基础语言更改为德语。英语与德语具有相同的复数规则,因此您的项目将“正常工作”。
2) 将项目的基本语言更改为“Broken English”。en.po
然后,您必须通过提供执行此映射的操作,找到将您的原始字符串翻译成正确的英语的人。但是,您的任务是定期将更正后的英文字符串写回到实际的源代码中。
选项 1 是直截了当的,但对于开源项目,如果基本语言不是英语,您将很难找到志愿者来翻译您的字符串。
选项 2 听起来比实际更可怕。PO 文件包含对源文件的引用,因此将更正的英文消息写回代码库相对容易。通常,只需在 PO 编辑器中单击鼠标即可。
推荐阅读
- c# - 对如何有效地循环通过正确的文件夹感到困惑
- python - 为 seaborn 图重新排列两个或多个 pandas 数据帧
- gnuplot - 在gnuplot中,如何在文件中搜索字符串并使用字符串后面的值?
- android - ImageView 缩放和设置另一个图像问题
- regex - 如何限制正则表达式之前和之后的内容
- ios - 数组中的对象未被修改
- css - 垂直对齐不同大小的文本
- authentication - 使用 OAuth 的 POP3 身份验证给出“Err 协议错误。连接已关闭”
- typescript - 在新对象实例上执行的 Typescript 类方法
- xamarin.ios - 如何在 Xamarin.iOS 中使用 ViewModel