Localization 多语言应用程序中的替换字段

Localization 多语言应用程序中的替换字段,localization,globalization,Localization,Globalization,我正在开发一个支持多种语言的项目。我们的功能之一是支持替换参数。 以下是我的意思的简化示例: 在某个地方定义了一个字符串“{CUSTNAME}有10个客户”。它包括一个参数{CUSTNAME},该参数将在使用该字符串的层次结构中定义。打开带有此字符串的项时,{CUSTNAME}将解析为其定义的值 由于在某些语言中,单个单词或短语实际上可以更改句子中的上一个或下一个字符,因此在这种情况下,如何实现替换字段功能?您需要做一些事情 (1) 。设置一些函数,根据语言的数量和规则返回不同的翻译 除了更换客

我正在开发一个支持多种语言的项目。我们的功能之一是支持替换参数。 以下是我的意思的简化示例:

在某个地方定义了一个字符串“
{CUSTNAME}有10个客户
”。它包括一个参数
{CUSTNAME}
,该参数将在使用该字符串的层次结构中定义。打开带有此字符串的项时,
{CUSTNAME}
将解析为其定义的值


由于在某些语言中,单个单词或短语实际上可以更改句子中的上一个或下一个字符,因此在这种情况下,如何实现替换字段功能?

您需要做一些事情

(1) 。设置一些函数,根据语言的数量和规则返回不同的翻译

除了更换客户名称外,标有
10个客户的零件也需要更换,并且需要使用类似以下内容的函数调用进行构建:

ngettext( 'customer', 'customers', 10 )
这是怎么做的

(2) 。设置翻译源字符串,使其了解复数化规则

您还没有说明使用的是什么技术,但是Gettext内置了这种技术,并且许多语言可以与您的系统Gettext交互

(3) 。将文本替换分为两个阶段。可能使用sprintf代替您的代币替换,但这部分由您决定

因为您使用的是存储的翻译,再加上您自己的客户名称替换,所以我将按如下方式执行:

使用每种语言的完整模板设置翻译字符串,如Gettext PO文件中所示:

# ....
msgid "%1$s has one customer"
msgid_plural "%1$s has %2$u customers"
msgstr[0] "%1$s a un client"
msgstr[1] "%2$u clients pour %1$s"
然后,您将根据数量获取所需的模板,然后执行替换。例如,在PHP中:

$n = 10;
$name = "Pierre";
$template = ngettext( '%1$s has one customer', '%1$s has %2$u customers', $n );
$rendered = sprintf( $template, $name, $n );
这里有很多陷阱,并不是所有的语言包格式都支持复数。如果您无法在系统中使用Gettext,那么可以将其作为一种管理复数规则并导出为您可以使用的文件格式的方法