2

我想使用 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'但我不确定......

无论字符串中的具体数字是多少(可能是某种格式),有什么方法可以翻译字符串?

4

3 回答 3

3

您谈论的问题很容易通过以下方式解决:

$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

于 2012-06-30T08:38:16.500 回答
0

如果你总是知道格式,sscanf可以帮助你。

sscanf('i am %d years old', $years);
$newString = sprintf('Tengo %d años de edad', $years);
于 2012-06-30T08:30:58.227 回答
0

您可以在翻译后使用替换数字。

str_replace('#NUM#', $num,  gettext('i slept #NUM# hours a day'));
于 2012-06-30T08:32:38.407 回答