l10n / i18n:如何使用动态项目列表处理短语?

时间:2017-08-21 16:51:32

标签: list dynamic localization internationalization translation

处理动态列表的翻译和本地化的最佳方式是什么?

假设我已经查询了数据库,并获得了一个列表["Foos", "Bars", "Bazes"]。让我们假设列表总是包含至少两个项目 - 我将确保对单项案例使用不同的翻译。

如果我需要像“我们的代码中有多种选择的Foos,Bars和Bazes ”这样的短语,我该怎么办? (假设列表项是动态的,所以我不能只是预先翻译所有可能的排列,并且需要在运行时做一些事情。)

我至少看到以下问题:

  • 我需要将所有项目都改为正确的形式(根据列表中的位置,是否需要不同形式的语言?)

  • 不同的区域设置可能具有截然不同的规则,如何加入项目。

    • E.g。 CJK语言环境需要“,”而不是“,”。
    • AFAIK在中文里会有“及”或“和” - 取决于完整的短语 - 在最后一项之前,所以我想在翻译“和”方面有些含糊不清。
    • 而且,正如我所读到的,某些语言可能会像英语中那样使用标点符号,但却有其他概念,例如:阿拉伯语翻译者可能更喜欢在每个项目之前使用“و”(尽管他们也有逗号,“,”)。不确定是否真实 - 我不懂阿拉伯语,只是看到它提到了。

我的问题是,我甚至不知道什么工具可以帮助我。虽然Python或JavaScript是最好的,但我没有任何特定的编程语言要求。但我想我可以运行任何东西,因为我可以构建一个l10n微服务并从我的项目中查询它。

在我遇到这个之前,我已经使用过GNU gettext,但是我找不到任何可以帮助我的API和数据格式的东西。我能想象的最好的是_("We have a wide choice of %s in our code", list_text)并使用一些DIY黑客生成list_text。我不确定XLIFF格式是否也有这样的东西。我在npm找到i18n-list-generator,但它是way too simplicistic

有没有人处理过这样的事情?你做了什么?是否有任何库来处理这个问题 - 所以我可以看看它的API并了解它是如何做到的?

2 个答案:

答案 0 :(得分:2)

这是我如何接近它:

  1. 没有连接。所有字符串连接都需要通过带占位符的格式字符串完成。

  2. 仅使用支持命名/编号占位符的格式字符串。例如。 {FOO}$1代替%s(这是为了允许参数重新排序)。命名占位符也更好,因为它们为翻译人员提供了更多背景信息。我们假设我们使用{FOO}式占位符。

  3. 要呈现列表,我会使用几个格式字符串,例如:joinItem = "{LIST}, {ITEM}"将项目附加到列表中,joinLastItem = "{LIST} and {ITEM}"附加最后一项。这将允许人们像Foos, Bars and Bases一样呈现字符串,更改标点符号,甚至在必要时反转列表的顺序。

  4. 最后,您可以使用最终格式字符串,例如weHaveTheseItems = "We have a wide choice of {ITEMS} in our code",假设{ITEMS}被先前渲染的字符串替换。

  5. 无耻的自我推销:您可能希望查看支持此类{FOO}式占位符的Plurr库,以及复数(此类消息可能需要的内容)。它支持JavaScript和其他语言。

答案 1 :(得分:0)

这很痛苦,因为您指出并非所有语言环境都可以支持“ 、、和”格式。

受@GSerg和@Igor Afanasyev的启发,我想出了一个基于GNU Gettext的解决方案,如下所示(伪gettext调用):

GettextPlural(
    // TRANSLATORS: For multiple "choices", each will be prefixed with a new-line (\n)
    "We have a wide choice of {choices} in our code",
    "In our code we have a wide choice of{choices}", choices.Count)

应打印为:

"We have a wide choice of FOOs in our code"

"In our code we have a wide choice of
FOOs
BARs
BAZs"

请记住将--add-comments=TRANSLATORS保留在您的xgettext调用中。

出于网络目的,您可以使用<ul><li>...</li>... </ul>或其他任何方式代替\n

好处是布局至少与UI布局一样普遍,但是您仍然允许使用非英语的语言环境复数形式。

某些语言只有一种复数形式,因此它们的翻译必须同时具有单选和多选功能,因此,特别地,它们不能有条件换行。