首页 > 解决方案 > 现代 Cpp 项目中的 I18n

问题描述

我正在开发一个现代 C++ 项目,目前和中期,但在某些时候作为 FOSS 项目。目前,我正处于必须实现国际化功能的地步。我研究了一下,发现口语一团糟。所以我没有办法自己实现像 i18n/l10n 库这样的东西。总结为:使用gettext。(在我的例子中是 Boost.Locale 包装器)

到目前为止一切顺利,但图书馆需要我直接在代码中编写原始/源文本。假定为英语。你可能注意到了,我不是一个土生土长的英国人。我的英语太糟糕了,不能用它作为源语言——我不想要这个。例如,要传达微妙的幽默感,就需要对语言有很好的了解。

现在我看到 3 个选项:

  1. std::cout << gettext("Hallo Welt") << std::endl;
  2. std::cout << gettext("Hello World") << std::endl;
  3. std::cout << my_own_crappy_lib(HELLO_WORLD_ID) << std::endl;

1)意味着在代码中编写我的母语,这使得非德国人无法使用我的代码库进行开发。它也很丑,因为我写的是英文源代码,英文代码文档,但是德文语言环境字符串。

2) 意思是写英文,希望有人纠正我的错别字并摒弃我的幽默。

3)自己实现一些将一些速记标识符映射到翻译的东西。但我完全不确定如何做到这一点以及如何处理复数形式等。

你能给我一些暗示我将如何继续吗?

OT:请不要怪我懒惰学习正确的英语。我是电视连续剧 Futurama 的忠实粉丝,您会看到即使是专业的翻译人员也无法翻译很多笑话或微妙的典故。

标签: c++localizationinternationalizationgettext

解决方案


你有两个选择:

1) 将项目的基础语言更改为德语。英语与德语具有相同的复数规则,因此您的项目将“正常工作”。

2) 将项目的基本语言更改为“Broken English”。en.po然后,您必须通过提供执行此映射的操作,找到将您的原始字符串翻译成正确的英语的人。但是,您的任务是定期将更正后的英文字符串写回到实际的源代码中。

选项 1 是直截了当的,但对于开源项目,如果基本语言不是英语,您将很难找到志愿者来翻译您的字符串。

选项 2 听起来比实际更可怕。PO 文件包含对源文件的引用,因此将更正的英文消息写回代码库相对容易。通常,只需在 PO 编辑器中单击鼠标即可。


推荐阅读