处理动态列表的翻译和本地化的最佳方式是什么?
假设我已经查询了数据库,并获得了一个列表["Foos", "Bars", "Bazes"]
。让我们假设列表总是包含至少两个项目 - 我将确保对单项案例使用不同的翻译。
如果我需要像“我们的代码中有多种选择的Foos,Bars和Bazes ”这样的短语,我该怎么办? (假设列表项是动态的,所以我不能只是预先翻译所有可能的排列,并且需要在运行时做一些事情。)
我至少看到以下问题:
我需要将所有项目都改为正确的形式(根据列表中的位置,是否需要不同形式的语言?)
不同的区域设置可能具有截然不同的规则,如何加入项目。
我的问题是,我甚至不知道什么工具可以帮助我。虽然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并了解它是如何做到的?
答案 0 :(得分:2)
这是我如何接近它:
没有连接。所有字符串连接都需要通过带占位符的格式字符串完成。
仅使用支持命名/编号占位符的格式字符串。例如。 {FOO}
或$1
代替%s
(这是为了允许参数重新排序)。命名占位符也更好,因为它们为翻译人员提供了更多背景信息。我们假设我们使用{FOO}
式占位符。
要呈现列表,我会使用几个格式字符串,例如:joinItem = "{LIST}, {ITEM}"
将项目附加到列表中,joinLastItem = "{LIST} and {ITEM}"
附加最后一项。这将允许人们像Foos, Bars and Bases
一样呈现字符串,更改标点符号,甚至在必要时反转列表的顺序。
最后,您可以使用最终格式字符串,例如weHaveTheseItems = "We have a wide choice of {ITEMS} in our code"
,假设{ITEMS}
被先前渲染的字符串替换。
无耻的自我推销:您可能希望查看支持此类{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布局一样普遍,但是您仍然允许使用非英语的语言环境复数形式。
某些语言只有一种复数形式,因此它们的翻译必须同时具有单选和多选功能,因此,特别地,它们不能有条件换行。