|
|
(не показано 5 промежуточных версии 2 участников) |
Строка 1: |
Строка 1: |
− | С 20 июля 2010 года русский перевод KDE (стабильной и нестабильной ветвей) переведён на новую формулу работы с формами множественного числа (тождественную той, которая используется в сербском языке):
| + | Статья переехала: https://community.kde.org/RU/Справочник_по_формам_множественного_числа_в_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
| + | |
| | | |
− | Соответствие чисел в сообщении номерам форм множественного числа:
| + | [[Категория:KDE-перенаправления]] |
− | 0: для чисел 21, 31, 41 ... ,
| + | |
− | 1: для чисел 2, 3, 4, 22, 23 ... ,
| + | |
− | 2: для чисел 5, 6, 7 ... ,
| + | |
− | 3: для числа 1.
| + | |
− | | + | |
− | На этой странице вы можете найти ответы на самые распространённые вопросы, связанные с переходом.
| + | |
− | | + | |
− | __TOC__
| + | |
− | | + | |
− | == Зачем? ==
| + | |
− | | + | |
− | ===Каковы причины перехода?===
| + | |
− | | + | |
− | Рассмотрим пример. Пусть надо перевести на русский такую комбинацию сообщений (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 количественным числительным в сегментах перевода:
| + | |
− | | + | |
− | {| border="1" width=100%
| + | |
− | |+ ''Соответствие вкладок '''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 [[Краткий_справочник_переводчика_KDE#Как пользоваться Pology?|Pology]]:
| + | |
− | #!/usr/bin/env python
| + | |
− | # -*- coding: UTF-8 -*-
| + | |
− |
| + | |
− | import fallback_import_paths
| + | |
− | import os
| + | |
− | import sys
| + | |
− |
| + | |
− | from pology.file.catalog import Catalog
| + | |
− | from pology.misc.fsops import collect_catalogs
| + | |
− | from pology.misc.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, сохраните скрипт в [[Краткий_справочник_переводчика_KDE#Какова структура дерева переводов KDE? Где следует располагать файлы переводов (полезные скрипты)?|подкаталог 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'
| + | |
− | | + | |
− | В результате в поле четвёртой формы попадёт копия того, что было в первой. Изменённые переводы не будут отмечены как неточные, следовательно никаких неудобств возникнуть не должно.
| + | |
− | | + | |
− | ==Что дальше?==
| + | |
− | | + | |
− | Эксперименты показывают, что дополнительная четвертая форма обрезается без сообщений об ошибке Virtaal и Rosetta. Поэтому пользователи *buntu смогут видеть три формы предыдущей формулы. Резкий переход невозможен потому, что в Rosetta нет внутренних механизмов, обеспечивающих беспроблемную смену количества форм множественного числа.
| + | |
− | | + | |
− | Все остальные дистрибутивы, которые используют коды, предлагаемые для использования непосредственно командой KDE, смогут воспользоваться преимуществами нового формата.
| + | |
− | | + | |
− | Transifex, poEdit и Lokalize понимают новую формулу без проблем.
| + | |
− | | + | |
− | Безусловно, команда переводчиков KDE будет рада помочь всем, у кого возникнут вопросы, касающиеся новой формулы, поскольку, очевидно, проблемы, приведшие к переходу, существуют во многих рабочих средах (GNOME, XFCE...) и отдельных программах (Inkscape, Audacity...).
| + | |
− | | + | |
− | [[Категория:KDE]]
| + | |