陷阱
有几个你最终会自己发现的错误。但本小节可能能帮助你避免它们。
- 25.4.1. 不同语义的同一字符串。
- 25.4.2. 合成字符串
- 25.4.3. 假设显示字符串所需的空间
- 25.4.4. "黑话"
- 25.4.5. 在字符串中使用非ASCII字符
25.4.1. 不同语义的同一字符串。
有时,两个英文字符串是相同的但是在不同的上下文中有不同的含义,因此他们的译文不一定相同。此时用英文字符串作为查找键会引起问题。
在这个情况下,你应该在字符串中添加额外的字符。例如,使用"jumps[noun]"和"jumps[verb]"而不是用"jumps"并在调用gettext后将它们剥离。如果你添加了额外的字符,你还应该在调用gettext之前为译者添加注释。这样的注释将被显示于.po中。例如:
// note to translators: don't translate the "[noun]" part - it is // just here to distinguish the string from another "jumps" string text = strip(gettext("jumps[noun]"), "[noun]");
如果你使用Glib宏,将会更为方便。你只需要使用C_()替换_()。例如:
GLib::ustring text(C_("noun", "jumps"));
25.4.2. 合成字符串
C程序员使用sprintf()合成和拼接字符串。而C++支持流,不幸的是,使用这种方法生成的字符串将给翻译带来困难,因为文本被分成了多个片段,译者必须分开翻译多个片段而不能进行重新排列,这会导致很多字符串无法被正确翻译。
例如,此代码将会出现问题:
std::cout << _("Current amount: ") << amount << _(" Future: ") << future << std::endl; label.set_text(_("Really delete ") + filename + _(" now?"));
因此你应该避免这种情况的出现或者使用Glib::ustring::compose()以支持如下所示的语法:
std::cout << Glib::ustring::compose( _("Current amount: %1 Future: %2"), amount, future) << std::endl; label.set_text(Glib::ustring::compose(_("Really delete %1 now?"), filename));