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

はい、数字自体は 2 回使用されます。最初に で名詞の正しい形式を取得し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 に答える