获取带有数字的字符串的文本


gettext of string with number

我想使用 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'));