我想使用 gettext 来翻译一个句子并保留数字,如以下示例所示:
"i am 100 years old" -> Tengo 100 años de edad (spanish)
"i am 10 years old" -> Tengo 10 años de edad (spanish)
"i slept 24 hours a day" -> Ich schlief 24 Stunden am Tag (german)
"i slept 4 hours a day" -> Ich schlief 4 Stunden am Tag (german)
我想字符串应该是这样的:'i slept #24# hours a day'
但我不确定...
有没有办法翻译字符串,不管其中的具体数字(也许是某种格式)?
你说的问题用这个很容易解决:
$translation = gettext("I am %d years old");
$phrase = sprintf($translation, $n);
但实际上还有另一个问题。在某些语言中,数字后面的名词(示例中为"年")的翻译会根据使用的数字而有所不同。它不仅与单一/复数形式有关:例如,在俄语中
"I am 10 years old" = "Мне 10 лет"
"I am 21 years old" = "Мне 21 год"
对于这些类型的翻译,您应该使用更高级的 ngettext() 函数,如下所示:
setlocale(LC_ALL, 'cs_CZ');
printf(ngettext("%d window", "%d windows", 1), 1); // 1 okno
printf(ngettext("%d window", "%d windows", 2), 2); // 2 okna
printf(ngettext("%d window", "%d windows", 5), 5); // 5 oken
是的,数字本身被使用了两次:首先是为了获得ngettext
名词的正确形式,然后用printf
填充占位符。
如果您始终了解格式,sscanf
可以帮助您。
sscanf('i am %d years old', $years);
$newString = sprintf('Tengo %d años de edad', $years);
您可以在翻译后使用替换数字。
str_replace('#NUM#', $num, gettext('i slept #NUM# hours a day'));