LINUX.ORG.RU

nplurals=4 для русского языка

 


0

1

Добрый день всем.

Может мне кто-нибудь рассказать всю историю вот этого?

"Language: Russian\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
"%100>=11 && n%100<=14)? 2 : 3);\n"

Речь о локализации приложений. Раньше, ещё совсем недавно, формула для русского языка имела nplurals=3 и там всё было довольно просто. Однако, насколько я понял, несколько лет назад ребята в KDE решили, что в русском языке четыре формы множественности (или как там оно называется), а не три. Сейчас я делаю локализацию в django-приложении и оно хочет, чтобы я тоже считал, что форм четыре. Проблема в том, что я, во-первых, знаю только три формы, во-вторых, даже тупым перебором не нашёл числа n, для которого из этой формулы получилась бы plural=3.

Если это баг в формуле, то куда его репортить? В gettext старая формула, с темя формами, откуда оно взялось в django — непонятно, наверно из KDE притащило.

http://web.archive.org/web/20101112232519/http://l10n.lrn.ru/wiki/Справочник_...

С 20 июля 2010 года русский перевод KDE (стабильной и нестабильной ветвей) переведён на новую формулу работы с формами множественного числа (тождественную той, которая используется в сербском языке):

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

Соответствие чисел в сообщении номерам форм множественного числа:

  • 0: для чисел 21, 31, 41 ... ,
  • 1: для чисел 2, 3, 4, 22, 23 ... ,
  • 2: для чисел 5, 6, 7 ... ,
  • 3: для числа 1.
hatefu1_dead ()

Эта формула не эквивалентна 4-вариантной KDE-шной, например для n=1 результат = 0, а в KDE был бы = 3.

Как я понял, приведённая выше формула вообще ни в каком случае не даёт результат 3.

aspotashev ★★ ()
Ответ на: комментарий от aspotashev

Да, в этом и проблема. В django эту формулу используют в своих переводах, поэтому я не могу её изменить.

name_no ★★ ()

В gettext старая формула,

Старый gettext старая формула?

Насколько я знаю, последняя форма используется для дробных чисел. ( 1.5 яблока )

greek_31 ★★ ()
Ответ на: комментарий от greek_31

По задумке ребят из KDE, последний вариант должен быть для случая n==1, то есть, когда ровно один предмет. Раньше для этого использовалась первая форма, которая так же использовалась для 21, 31, 121, 131 и т.п.

В обычной жизни первая и последняя форма должны совпадать, но в пользовательском интерфейсе для единственного числа бывает лучше убрать число совсем. В качестве примера: «Удален 21 файл», «Удалено 22 файла», «Удалено 25 файлов», «Файл удален» (вместо «Удален 1 файл»).

Я просто уже погуглил, и залез на github, и в общем выяснил, что Django переехало но новую платформу для краудсорсинга локализации (Transifex) и у этих ребят прописана неправильная формула, непонятно, откуда она там взялась, но в Django на это повлиять не могут.

name_no ★★ ()
Ответ на: комментарий от name_no

Я просто уже погуглил, и залез на github, и в общем выяснил, что Django переехало но новую платформу для краудсорсинга локализации (Transifex) и у этих ребят прописана неправильная формула, непонятно, откуда она там взялась, но в Django на это повлиять не могут.

С чего бы она не правильная? Там в даже документации есть ссылки на то как считаются эти формы. Стоит ли говорить что там про KDE-форму ничего не написано. Более того transifex перешел на эту форму около года назад. Сам перевожу на этой платформе, все нормально. Если четвертая форма вызывает у тебя когнитивный диссонанс, то оставь ее тупо пустой. В transifex она используется для отображения дробных частей.

greek_31 ★★ ()
Ответ на: комментарий от greek_31

С чего бы она не правильная?

Потому что из этой формулы никогда не получается четвёртый вариант

name_no ★★ ()
Ответ на: комментарий от greek_31

В transifex она используется для отображения дробных частей.

В том же django для локализации в интерфейсе используется gnu gettext, в котором эта формула используется вот в такой функции:

char * ngettext (const char *msgid1, const char *msgid2, unsigned long int n)

дробных частей там быть не может. В общем, мне всё понятно, спасибо за разъяснения

name_no ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.