Перевод между языками с разным количеством множественного числа

Я пытаюсь создать файл перевода на упрощенном китайском языке из английского источника. Все это происходит в проекте Flask, и я использую Flask-Babel (до сих пор успешно) для перевода на испанский и французский языки. Я добавил файл китайского перевода, но столкнулся со следующей проблемой.

Рассмотрим следующие строки на английском языке:

msgid "One message"
msgid_plural "%(num)d messages"

Когда есть только одно сообщение, я не хочу отображать число 1, я хочу прописанную версию.

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

msgstr[0] "%(num)d [something in Chinese]"

Когда я попытался скомпилировать этот файл, я получил следующее сообщение об ошибке:

неизвестный именованный заполнитель 'num'

Поэтому я попытался продублировать строку следующим образом ( — это 1 на китайском языке):

msgstr[0] "一 [something in Chinese]"
msgstr[1] "%(num)d [something in Chinese]"

Но затем я получил эту ошибку:

msg имеет больше переводов, чем num_plurals каталога

что имеет смысл: в китайском языке nplurals равно 1, поэтому не должно быть более одного msgstr.

На данном этапе я вижу два варианта:

  1. Обманите мой китайский файл .po и объявите, что nplurals = 2 с тем же правилом, что и английский: "Plural-Forms: nplurals=2; plural=(n > 1)".
  2. Обновите все мои исходные строки, чтобы я всегда использовал %(num)d в единственном числе, если мне это нужно во множественном числе.

Меня не очень устраивает ни один из вариантов. Есть ли альтернатива?


person Arnaud    schedule 24.06.2019    source источник
comment
Ваш первый подход msgstr[0] "%(num)d [something in Chinese]" правильный и должен работать. Пожалуйста, опубликуйте всю запись po! Есть комментарий #, python-format? И как именно вы компилируете файл po? У обычного GNU msgfmt нет проблем с вашим примером.   -  person Guido Flohr    schedule 27.07.2019


Ответы (1)


Кажется, это ошибка в Babel, а не проблема gettext.

Следующая выдержка PO верна и компилируется с msgfmt --check:

msgid ""
msgstr ""
...
"Language-Team: Chinese (simplified) <[email protected]>\n"
"Language: zh_CN\n"
...
"Plural-Forms: nplurals=1; plural=0;\n"

#: example.c:1
#, python-format
msgid "One message"
msgid_plural "%(num)d messages"
msgstr[0] "%(num)d [something in Chinese]"

Пока ошибка не будет исправлена, использование варианта 1 (обман заголовка множественного числа) кажется жизнеспособным обходным путем. Или просто используйте msgfmt --check вместо скрипта Python для компиляции po-файла.

person Guido Flohr    schedule 27.07.2019