【问题标题】:Advanced string localization高级字符串本地化
【发布时间】:2014-05-23 23:32:55
【问题描述】:

我正在寻求高级本地化的帮助(和一些工具)。我使用的是 Node 后端,所以我更喜欢 JS 中的工具/库。

我目前使用本地化为不同语言的属性文件进行一些简单的字符串替换。

home_en.properties

page.title=My Site
page.header=Hello %s

home_de.properties

page.title=Meine Seite
page.header=Hallo %s

到目前为止一切都很好......但这里有一些我正在尝试解决的更高级的例子:

倍数

我需要能够正确翻译倍数,例如:

您有 1 条消息

对

您有 2 条消息

我不想在我的代码中出现这样的逻辑

if (i == 1) { // use page.messages.singular }
else { // use page.messages.plural }

因为我不相信 check 属于我的业务逻辑,而且我知道不同的语言对待单数/复数的方式不同(即单数包含 0)

多个倍数

上面的一些问题,但现在有多个倍数的组合,例如:

您有 %d 条未读消息和 %d 条已读消息

或

您有 %d 条未读消息和 %d 条已读消息,以及 %d 条私人通知

性别

这是一个我想解决的例子:

我爱我的 %s

可能的值为cat, dog, horse

英文没问题,但德文则需要:

home_de.properties

animals.like.male=Ich liebe meinen %s
animals.like.female=Ich liebe meine %s
animals.like.neutral=Ich liebe mein %s

这会导致不必要的英语条目:

home_en.properties

animals.like.male=I love my %s
animals.like.female=I love my %s
animals.like.neutral=I love my %s

问题

对于以下问题,这是一个冗长的设置:

有哪些工具/库可以解决这样的高级字符串本地化问题?

【问题讨论】:

标签: javascript node.js localization translation


【解决方案1】:

以下答案适用于通用翻译方法,不限于特定的本地化框架。不过,为了简单起见,我将选择i18next 来说明如何实现这些想法。

倍数(复数)

一般来说,您所指的“Mutliples”是很多本地化框架中称为“复数”的概念。

复数字符串表示存在影响字符串输出内容的变量。

以下代码显示了带有计数变量的字符串如何满足您的需求。 (参考:http://i18next.com/pages/sample.html)

这样,你可以创建一个这样的字符串:

{
   "app": {
        "new_messgae": "You have __count__ message.",
        "new_messgae_plural": "You have __count__ messages."
    }
}

多个倍数(具有多个计数的复数字符串)

处理这种字符串的方法很棘手,但通常我们将具有>1个变量的单个字符串分成2个/多个具有1个变量的复数字符串。

性别(带上下文的字符串)

对于具有特定上下文(例如:性别)的字符串,您可以利用本地化框架中的“上下文”功能使其工作。 (请访问http://i18next.com/pages/sample.html 的“上下文”部分获取信息)

【讨论】:

  • 非常感谢您的回答。我以前没有听说过i18next,所以我一定会调查一下。不过,我对您的回答有两个问题:1)我了解复数方法,但是您在哪里定义何时使用复数?例如,法语,其中 0 被视为单数。或具有不止 2 种形式的其他语言。 2)您如何将具有> 1个变量的句子“分离”成几个1个变量的字符串。本地化的第一条规则通常是不要分隔字符串并稍后重新组合。
  • 1) 这里定义了不同语言的复数规则unicode.org/cldr/charts/latest/supplemental/…。
  • 2) 对于这种方法的进一步解释,我希望这对你有用stackoverflow.com/questions/1888487/…
猜你喜欢
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多