我正在开发一个支持多种语言的项目。我们的一个功能是支持替换参数。 这是我的意思的简化示例:
字符串“{CUSTNAME} has 10 customers
”在某处定义。它包含一个参数{CUSTNAME}
,它将在将使用此字符串的层次结构中定义。当打开带有此字符串的项目时,{CUSTNAME}
将解析为其定义的值。
由于在某些语言中,单个单词或短语实际上可以更改句子中的前一个或后一个字符,如何在该情况下实现替换字段功能?
答案 0 :(得分:0)
你需要做一些事情。
(1)。根据该语言的数量和规则设置一些返回不同翻译的函数。
除了您的客户名称替换之外,显示10 customers
的部分也需要一些替换,并且需要使用看起来更像的函数调用来构建:
ngettext( 'customer', 'customers', 10 )
这与Gettext works的方式一致。
(2)。设置您的翻译源字符串,以便他们了解复数规则。
你还没有说过你正在使用什么技术,但Gettext内置了这种技术,包括PHP在内的多种语言可以与你的系统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,那么请查看Loco作为管理复数规则并导出为您可以使用的文件格式的方法。