陷阱

有几个你最终会自己发现的错误。但本小节可能能帮助你避免它们。

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));

25.4.3. 假设显示字符串所需的空间

你永远不知道一个字符串被翻译后要在屏幕上显示它需要消耗多少空间。它可能是原始英文字符串的两倍甚至更多。幸运的是 gtkmm的多数部件都能在运行时自动扩展到需要的尺寸。

25.4.4. "黑话"

你应该避免使用不常见的用于例如缩写、俚语、行话。通常它们对于译者来说很难翻译,甚至将该语言作为母语的译者也无法理解。例如,最好使用"application"而不是"app"

25.4.5. 在字符串中使用非ASCII字符

当前,gettext并不支持在源代码中使用非ASCII字符。例如,你不能使用版权标志(©)

要解决这个问题你可以使用注释提醒译者可以使用他们语言中可用的特殊字符。对于英语用户你可以在美国英语en_US.po翻译中使用特殊字符。