RU/Справочник по формам множественного числа в KDE: Difference between revisions
No edit summary |
Aspotashev (talk | contribs) No edit summary |
||
Line 154: | Line 154: | ||
В результате в поле четвёртой формы попадёт копия того, что было в первой. Изменённые переводы не будут отмечены как неточные, следовательно никаких неудобств возникнуть не должно. | В результате в поле четвёртой формы попадёт копия того, что было в первой. Изменённые переводы не будут отмечены как неточные, следовательно никаких неудобств возникнуть не должно. | ||
==Файлы *_qt.po== | |||
Некоторые библиотеки и программы от KDE используют систему перевода, встроенную в Qt, и она поддерживает только традиционные 3 формы множественного числа для русского языка. Для удобства файлам шаблонов и переводов (.pot/.po) дают имена вида *_qt.po. Таким образом, если переводчик видит "_qt.po" в конце имени файла, он может сделать вывод, что в переводе будут доступны для заполнения три формы множественного числа. | |||
==Что дальше?== | ==Что дальше?== |
Latest revision as of 23:57, 22 September 2018
С 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.
На этой странице вы можете найти ответы на самые распространённые вопросы, связанные с переходом.
Зачем?
Каковы причины перехода?
Рассмотрим пример. Пусть надо перевести на русский такую комбинацию сообщений (digiKam):
msgid "You have edited the image caption. msgid_plural "You have edited the captions of %1 images"
Предыдущая формула записи форм множественного числа предоставляла возможность использовать для перевода три формы:
0: для 1, 21, 31, 41 ... подписи 1: для 2, 3, 4, 22, 23 ... подписей 2: для 5, 6, 7 ... подписей.
Типичной ошибкой, которую совершают как опытные, так и начинающие переводчки, является такой перевод:
msgstr [0] "Вы изменили подпись к снимку." msgstr [1] "Вы изменили подписи к %1 снимкам." msgstr [2] "Вы изменили подписи к %1 снимкам."
Простая проверка msgfmt -v -c digikam.po показывает, что такой перевод является некорректным с точки зрения gettext. Почему?
Вы, наверно, уже догадались: нулевая форма описывает не один, а бесконечно много вариантов. У нас же описан пока лишь перевод для единственного числа. Для исправления этого недостатка приходилось делать так:
msgstr [0] "Вы изменили подпись к %1 снимку." msgstr [1] "Вы изменили подписи к %1 снимкам." msgstr [2] "Вы изменили подписи к %1 снимкам."
Выглядит неуклюже (пользователю будет показана чрезмерная информация в случае 1 подписи), но работает.
Немного видоизменённый пример:
msgid "You have edited the image caption." msgid_plural "You have edited the captions of images"
Теперь любой перевод по старой формуле будет иметь ложные варианты:
msgstr [0] "Вы изменили подпись к снимку." msgstr [1] "Вы изменили подписи к снимкам." msgstr [2] "Вы изменили подписи к снимкам."
Ошибка: подписей может быть 21, а это отнюдь не «подпись».
msgstr [0] "Вы изменили подписи к снимкам." msgstr [1] "Вы изменили подписи к снимкам." msgstr [2] "Вы изменили подписи к снимкам."
Ошибка: подписей может быть 1, а это отнюдь не «подписи».
msgstr [0] "Вы изменили подпись к %1 снимку." msgstr [1] "Вы изменили подписи к %1 снимкам." msgstr [2] "Вы изменили подписи к %1 снимкам."
Ошибка: формально работает, но не проходит проверку msgfmt.
Новая формула лишена недостатков предыдущей. С ней мы можем чётко отмежевать единственное число от всех других случаев:
msgstr [0] "Вы изменили подписи к %1 снимку." msgstr [1] "Вы изменили подписи к %1 снимкам." msgstr [2] "Вы изменили подписи к %1 снимкам." msgstr [3] "Вы изменили подпись к снимку."
msgstr [0] "Вы изменили подписи к снимкам." msgstr [1] "Вы изменили подписи к снимкам." msgstr [2] "Вы изменили подписи к снимкам." msgstr [3] "Вы изменили подпись к снимку."
Чтобы легче было разобраться, приведём таблицу соответствия вкладок Lokalize количественным числительным в сегментах перевода:
Номер вкладки | Количество |
---|---|
1 | 21, 31, 41... |
2 | 2, 3, 4, 22, 23, 24... |
3 | 5, 6, 7, 8... |
4 | 1 |
Почему такой порядок форм? Не было бы логичнее использовать единственное число для формы [0]?
Дело в том, что в редакторах (Virtaal) и некоторых системах перевода (Launchpad/Rosetta) количество форм жёстко зашито в код. Таким образом, четвёртая (новая форма) будет обрезана при импортировании без каких-либо предупреждений. Если переставить форму [3] на место формы [0], мы получим результат, который, как уже упоминалось выше, не проходит проверки утилитами gettext и сценариями Rosetta.
Как перейти на новую формулу?
Часлав Илич (координатор сербской команды KDE) предоставил скрипт, который работает на основе оболочки обработки переводов KDE Pology:
#!/usr/bin/env python2 # -*- coding: UTF-8 -*- import fallback_import_paths import os import sys from pology.catalog import Catalog from pology.fsops import collect_catalogs from pology.report import report, error cmd = os.path.basename(sys.argv[0]) args = sys.argv[1:] if len(args) != 3: error("Usage: %(cmd)s PATH PLURALFORMS COPYMAP" % dict(cmd=cmd)) path = args.pop(0) newplhead = args.pop(0) copyspec = args.pop(0) # Process form mapping. srcforms = set() dstforms = set() copymap = {} for spec1 in copyspec.split(","): try: sform, dform = map(int, spec1.split(">")) except: error("Malformed copy map '%(map)s'." % dict(map=copyspec)) copymap[sform] = dform srcforms.add(sform) dstforms.add(dform) if max(srcforms) + 1 != len(srcforms): error("Gaps in source forms.") if max(dstforms) + 1 != len(dstforms): error("Gaps in destination forms.") copyord = [0] * len(dstforms) for sform, dform in copymap.items(): copyord[dform] = sform # Convert catalogs. for popath in collect_catalogs(path): cat = Catalog(popath) cat.header.replace_field_value(u"Plural-Forms", unicode(newplhead)) for msg in cat: if msg.msgid_plural is not None: msg.msgstr[:] = [msg.msgstr[x] for x in copyord] if cat.sync(): report(cat.filename)
Чтобы перевести ваши переводы на новую формулу, загрузите Pology, сохраните скрипт в подкаталог scripts и выполните команду:
./modplforms.py /путь/к/каталогу/переводов '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' '0>0,1>1,2>2,0>3'
В результате в поле четвёртой формы попадёт копия того, что было в первой. Изменённые переводы не будут отмечены как неточные, следовательно никаких неудобств возникнуть не должно.
Файлы *_qt.po
Некоторые библиотеки и программы от KDE используют систему перевода, встроенную в Qt, и она поддерживает только традиционные 3 формы множественного числа для русского языка. Для удобства файлам шаблонов и переводов (.pot/.po) дают имена вида *_qt.po. Таким образом, если переводчик видит "_qt.po" в конце имени файла, он может сделать вывод, что в переводе будут доступны для заполнения три формы множественного числа.
Что дальше?
Эксперименты показывают, что дополнительная четвертая форма обрезается без сообщений об ошибке Virtaal и Rosetta. Поэтому пользователи *buntu смогут видеть три формы предыдущей формулы. Резкий переход невозможен потому, что в Rosetta нет внутренних механизмов, обеспечивающих беспроблемную смену количества форм множественного числа.
Все остальные дистрибутивы, которые используют коды, предлагаемые для использования непосредственно командой KDE, смогут воспользоваться преимуществами нового формата.
Transifex, poEdit и Lokalize понимают новую формулу без проблем.
Безусловно, команда переводчиков KDE будет рада помочь всем, у кого возникнут вопросы, касающиеся новой формулы, поскольку, очевидно, проблемы, приведшие к переходу, существуют во многих рабочих средах (GNOME, XFCE...) и отдельных программах (Inkscape, Shotwell...).