l10n/i18n:如何处理带有动态项目列表的短语?

drd*_*man 6 translation localization list dynamic internationalization

处理动态列表的翻译和本地化的最明智方法是什么?

假设我已经查询了数据库,并得到了一个 list ["Foos", "Bars", "Bazes"]。我们还假设列表总是至少包含两个项目 - 我一定会为单项目情况使用不同的翻译。

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

我至少看到以下问题:

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

  • 不同的地区可能对如何加入项目有截然不同的规则。

    • 例如,CJK 语言环境需要“?” 代替 ”,”。
    • 而AFAIK在中文里会有“?” 或者 ”?” - 取决于完整的短语 - 在最后一项之前,所以我想翻译“and”会有一些歧义。
    • 而且,正如我所读到的,有些语言可能会避免使用标点符号,就像它在英语中使用的那样,但有其他概念,例如阿拉伯语翻译器可能更喜欢使用“?” 每个项目之前(尽管它们也有逗号,“?”)。不确定是否属实 - 我不会阿拉伯语,只是看到提到它。

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

在遇到这个问题之前,我已经使用过 GNU gettext,但是我还没有找到任何可以帮助我处理它的 API 和数据格式的东西。我能想象到的最好的方法是使用一些 DIY 技巧_("We have a wide choice of %s in our code", list_text)生成list_text。我不确定 XLIFF 格式是否也有类似的内容。我发现i18n-list-generator在故宫,但它的方式太simplicistic

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

小智 3

我的处理方法如下:

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

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

  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}被替换为先前呈现的字符串。

无耻的自我推销:您可能想看看支持此类占位符以及复数形式的Plurr库(您可能需要此类消息)。{FOO}它支持 JavaScript 以及其他语言。