RU/Справочник по формам множественного числа в KDE

From KDE Community Wiki
< RU
Revision as of 23:57, 22 September 2018 by Aspotashev (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

С 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 количественным числительным в сегментах перевода:

Соответствие вкладок 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...).