如何国际化从多个部分构建的字符串?

时间:2015-08-20 19:38:05

标签: language-agnostic internationalization translation

说我想让用户确认一个动作。该行动包括三个部分。这三个部分中的每一个都可以用两种方式之一进行格式化。在特定于人类语言的方式中,我可能会做这样的事情(伪代码):

res = ""
res = "Do you want to %1 at %2, %3 at time %4%5?" % (
    "foo" if fooing else "bar", foobar_data,
    "expiring" if expiring else "starting", the_time,
    ", without foobing" if no_foob else (", foobing at %1" % when_foob))

即使我用翻译函数包装所有可翻译的字符串(例如tr("Do you want to %1 at %2 ...")),这可能仅适用于英语,因为其他语言不太可能具有相同的句法结构。

但如果我写出整个句子,那么我会发生组合爆炸:

if fooing and expiring and no_foob:
    res = "Do you want to foo at %1, expiring at time %2, without foobing?"
elif fooing and expiring and not no_foob:
    res = "Do you want to foo at %1, expiring at time %2, foobing at %3?"
elif fooing and not expiring and no_foob:
    res = "Do you want to foo at %1, starting at time %2, without foobing?"
# etc ...
res = res % (foobar_data, the_time, when_foob) # account for sometimes not having when_foob somehow

处理这种情况的标准方法是什么?

2 个答案:

答案 0 :(得分:1)

我认为最好完全避免这种复杂的句子。相反,提供一个简单的句子并以类似表格的方式添加更多细节(表格更容易翻译)。

这有额外的好处,你可以隐藏每个默认的细节(渐进式披露)并保持主要信息短。这会增加用户完全阅读确认对话框的机会。

模拟式:

Do you really want to <Foo/Bar>?

[ Cancel ]  [ <Foo/Bar> ]      [ Details... ]
---------------------------------------------
Time: <Expring at %1 / Starting at %1>
Foobing: <Yes/No>

答案 1 :(得分:0)

  

即使我用翻译函数包装所有可翻译的字符串,这可能仅适用于英语,因为其他语言不太可能具有相同的语法结构。

是和否。显然,您可以切换句子和参数以适应目标语言:

Wollen Sie am %2 %1, %3 %4%5?

显然,棘手的部分是获得倾向,这是正确的;虽然在交换文字时,这些文字本身可能根本没有改变,但在其他语言中可能需要对其进行大量修改。

为此,在您的翻译系统中翻译所有必要的变体并能够使用上下文进行注释非常重要:

tr('foo', context='infinitive') if fooing else tr('bar', context='infinitive')
tr('expiring', context='verb before date') if expiring else tr('starting', context='verb before date')

PO file format例如内置了这个概念:

msgctxt "verb before date"
msgid "expiring"
msgstr "wird auslaufen am"

确实需要一些语言知识来正确分解句子,能够正确地对每个术语进行分类和注释,以便在必要时将其正确地翻译成所有语言,并且需要大量的Q&amp; A才能确保它完成正确。您希望在足够小的片段之间找到适当的平衡,以便可以重复使用翻译,并将其分解,以便正确翻译。

如果过于复杂,您也可以使用消息ID:

res = "question.confirmActivty" % (..)

msgid "question.confirmActivty"
msgstr "Do you want to %1 at %2, %3 at time %4%5?"