Перевод множественных чисел

Перевод множественных чисел должен обязательно содержать @count для единственного числа, например

<?php
msgid 
"1 answer"
msgid_plural "@count answers"
msgstr[0"@count ответ"
msgstr[1"@count ответа"
msgstr[2"@count[2] ответов"
?>

если будет переведено "1 ответ", то, например, 151 ответ будет также выводиться как 1 ответ

Будте, пожалуйста очень внимательны! Некоторые строки я уже поправил, но уже много осталось неправильных (с 1 вместо @count)

Комментарии (7)

Данный сервер пока еще использует 1ю версию(релиз) l10n_server, поэтому вероятно тут могут быть баги... хотя очень странно (насчет 3й формы в которую копируются строки из 2й формы)

Лично я храню переводы на своем сервере (использую 2й релиз) и пользуюсь http://dgo.to/l10n_update

Искренне благодарю за добротное объяснение.
В качестве выжимки:

  • Для 3 варианта всегда пишем @count[2]. Это просто особенность (баг aka фича) друпала, так надо. Алсо, тестируем и отписываемся по поводу этого патча.
  • По той же причине формулу выбора множественных форм в файле оставляем как есть (кстати, в прошлом посте я её объяснил не совсем точно - исправил). Увы, но сделать варианты для разных падежей, родов, времён и т.п. всё равно не получится.
  • Редактировать список вариантов в GUI нельзя. Здесь же (на сайте) интерфейс при работе со строками во множественных формах немного глючит (при редактировании имеющегося перевода в поле для 3 варианта выводится текст от 2-го, хотя в базе всё ok). Поэтому лично мне кажется оптимальным такой способ:
    1. Проверям, что в файле перевода имеется формула (в самом начале: "Plural-Forms: nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?(0):(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?(1):2));\n")
    2. Удаляем из файла строки, которые сейчас редактировать не будем (см. п. 5).
    3. Если редактируемая строка в оригинале только с 1 вариантом (есть только msgid - msgstr), заменяем строку msgstr на 2 пустых строки: msgid_plural и msgstr[0]. Итого:

      #: module.file:строка(оставляем как было)
      msgid "Original string"
      msgid_plural ""
      msgstr[0] ""
    4. Сохраняем файл и переводим с помощью poEdit. Он автоматом создаст недостающие варианты. Не забываем на 3-ей вкладке для русского языка (вариант [2]) указать @count[2] вместо @count.
    5. Исправленный файл импортируем сюда. Он содержит только те строки, что мы перевели - так что остальные останутся нетронутыми (на случай, если, пока мы работали локально, здесь их уже кто-то перевёл).
    6. Я использую Live Translation (чего и Вам рекомендую) - так что у меня на сайте эти переводы появятся при ближайшем обновлении. Если же у Вас этого модуля нет - просто импортируем исправленный файл ещё и на наш сайт.

За разъяснения и потраченное время ещё раз спасибо. Во всех импортированных мной переводах уже исправил на @count[2]. В ближайшее время постараюсь пройтись вообще по всем имеющимся переводам, повставлять @count[2] вместо @count для 3-го варианта.

Спасибо за развернутое объяснение! Все расписано верно!

По поводу @count[2]:

На сегодняшний день drupal-6 & drupal-7 используют для перевода строк функцию t(), а для перевода строк на страницах используется её симметричный JavaScript аналог Drupal.t() данные для которого подготавливаются в _locale_rebuild_js().

А для вывода множественных форм строки, зависящих от численного значения (параметр @count) используется format_plural() и её JavaScript аналог Drupal.formatPlural() (исходник можно посмотреть в misc/drupal.js)

Как видно из кода для 3-й формы (варианта) используется:

217 args['@count[' + index + ']'] = args['@count'];
218 delete args['@count'];
219 return Drupal.t(plural.replace('@count', '@count[' + index + ']'), args);

'@count' будет заменен на '@count[2]' (index = 2)

В ввиду того, что строка 3-й множественной формы может использоваться в JavaScript (модулей много, всего не предусмотришь) все строки в 3й форме должны быть @count[2], чтобы иметь перевод.

Я написал эту заметку, чтобы люди просто взяли за правило использовать именно @count[2] для 3-й множественной формы, тогда в будущем будет меньше ошибок и исправлений.

На текущий момент JavaScript перевод множественных форм в drupal 6 работает не корректно с языками у которых больше 2-х форм. Исправление http://drupal.org/node/504506 уже принято в drupal 7 и ожидает отзывов пользователей для включения в ядро 6.

Количество множественных форм и формула вычисления в drupal привязаны к языку, единственной возможностью их установить и изменить - импортировать .PO файл содержащий формулу и определение кол-ва форм.

Замечание: Простое добавление языка в систему не назначает этих параметров, необходим именно импорт .PO файла, тогда ядро начнет собирать строки для перевода. Но ядро не умеет определять принадлежность строки к участию во множественном переводе - это связано со способом хранения множественных строк в ядре.

Вероятно это изменение пойдет уже в 8е ядро - http://drupal.org/node/532512 так как нужно знать количество множественных форм, чтобы переводить при помощи ядра и/или localiation client

На сегодняшгий день, невозможно узнать, какие строки требуют множественного перевода, так как связь между единственной и остальными формами устанавливается только для переведенных (импортированных) строк.

ЗЫЖ для многих языков описаны формулы и количество множественных форм - http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms

Большое спасибо. Почитал, картина прояснилась. Правда так и не понял, почему надо именно @count[2] (просто возьму на веру), и можно ли обзывать переменную как-то иначе, например @d, как там.

Что понял - разъясню для тех, кто столкнётся с этой же проблемой.

Цифры в квадратных скобках - это не то, чем заканчивается число, а номера элементов массива/вариантов. То, какой из вариантов используется, определяется формулой. Здесь она не указана, но в самом файле перевода она есть в самом начале. Суть её такова:

  • для чисел, заканчивающихся на цифру 1, кроме 11 - использовать вариант под индексом [0] aka Основной Вариант;
  • для чисел, заканчивающихся цифрами 2-4, кроме второго десятка (12-14) - под индексом [1] aka Второй Вариант;
  • для всех остальных - под индексом [2] aka Третий Вариант.

Ну во всяком случае для русского языка формула обычно такая.

Единственное, что ещё хотелось бы уточнить:

  1. Как я понял, GNU Gettext - это всего лишь стандарт, который интерпретироваться может по-разному. Так вот, Drupal использует одну глобальную формулу выбора вариантов (которая определяется по id языка), или формулы могут быть разными, определяемыми в самих po-файлах? Если последнее, то:
  2. Есть ли способ редактировать условия / добавлять варианты через GUI, например тот же Localization Client?
  3. В качестве переменной-"селектора варианта" может выступать только число, или, скажем, слово/строка? Так можно было бы делать корректные варианты для мужского и женского рода или для разных падежей, если заранее известно, какая строка может оказаться на месте селектора.

Не напрашиваюсь, но если не трудно - прошу пояснить.

Поясняю, посмотреть можно и нужно на официальном сайте http://www.gnu.org/software/gettext/manual/gettext.html#Translating-plur...

Для 3й формы предпочтительнее использовать @count[2] ибо именно так строки будут нормально подхватываться в JavaScript Drupal.t() функции

msgid "1 answer"
msgid_plural "@count answers"
msgstr[0] "@count ответ" -- 1, 21, 31...
msgstr[1] "@count ответа" -- 2-4, 22-24, ...
msgstr[2] "@count[2] ответов" -- 0, 5-10.... 20, 30

Прошу прощения, если на вопрос уже неоднократно отвечали - однако я что местным поиском, что через гугл нашёл только этот топик.

Где можно ознакомиться с более подробным описанием синтаксиса для таких "множественных" вариантов перевода в зависимости от числа?
Потому что не понятно:

  1. почему в последней строке @count[2], а не просто @count
  2. почему для 0 (msgstr[0]) указано "ответ", хотя должно быть "ответов"
  3. как делать варианты перевода для диапазонов ([0] - ответов, [1] - ответ, [2-4] - ответа, [5-9] - ответов)


Новые сообщения форума

Новые комментарии на форуме