Подтвердить что ты не робот

Несколько множественных форм в gettext()

См. этот пример функции _n(); (http://codex.wordpress.org/Function_Reference/_n):

sprintf( _n('%d comment.', '%d comments.', $number, 'text-domain'), $number );

на английском языке:

1 Comment
2 Comments

в таких языках, как польский, существует другой шаблон и несколько множественных форм:

1 Komentarz
2 Komentarze
3 Komentarze
4 Komentarze
5 Komentarzy
6 Komentarzy
...
21 Komentarzy
22 Komentarze
23 Komentarze
24 Komentarze
25 Komentarzy
...
31 Komentarzy
32 Komentarze
...
91 Komentarzy
92 Komentarze
...
111 Komentarzy
112 Komentarzy (!)
...
121 Komentarzy
122 Komentarze

Я ищу способ, с помощью которого переводчики могут устанавливать свой собственный шаблон, если их язык поддерживает несколько множественных форм. Можете ли вы придумать какой-либо творческий подход PHP для этого?

Некоторое решение, о котором я могу думать (но все же переводчики не смогут установить какой-либо шаблон):

if($number == 1){
    $message = __(‘1 Komentarz’ , ‘text-domain’);
}else if($number == 2){
    $message = __(‘2 Komentarze’ , ‘text-domain’);
}else if($number == 3){
    $message = __(‘3 Komentarze’ , ‘text-domain’);
}

EDIT: Я нашел это в файле PO для польского языка: "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n", но я до сих пор не понимаю, как подготовить _n(); функцию для поддержки этого.

4b9b3361

Ответ 1

Во-первых, ваш файл locale должен иметь определение множественного числа. Как вы добавили в вопросе, в польском случае вы можете увидеть

"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"

или аналогичное определение в файле (domain_name) -pl.po.

Затем вам нужно подготовить перевод для "% d Comment" / "% d комментариев" в файле .po. Например,

msgid "%d Comment"
msgid_plural "%d Comments"
msgstr[0] "%d Komentarz"
msgstr[1] "%d Komentarze"
msgstr[2] "%d Komentarzy"

Скомпилируйте файл .po в файл .mo и поместите в соответствующую папку. (например, языки /(domain_name) -pl.mo

В коде Wordpress (плагин/тема, который я предполагаю) вы можете называть его следующим образом:

for ($i=1;$i<15;$i++) {
  printf(_n("%d Comment", "%d Comments", $i, "(domain_name)"), $i);echo "<br />";
}
printf(_n("%d Comment", "%d Comments", 112, (domain_name)"), 112);echo "<br />";

то, конечно, установите языковой стандарт WordPress на польский, в wp-config.php,

define ('WPLANG', 'pl');

вы должны увидеть результаты с правильными множественными формами.

Ответ 2

Я думаю, что нашел способ сделать то, что хочу. Приложение POEdit позволяет создавать несколько множественных форм, используя шаблон, который вы можете указать в настройках.

Переводчик должен сам писать код (см. образец по-польски в моем вопросе). Я все еще изучаю эту тему, но если у кого-то есть аналогичный вопрос, тогда это хорошее место для начала: http://www.poedit.net/trac/wiki/Doc/PluralForms