Справочник по формам множественного числа в KDE — различия между версиями

Материал из l10n.lrn.ru
Перейти к: навигация, поиск
м (Каковы причины перехода?)
(Содержимое страницы заменено на «Статья переехала: https://community.kde.org/RU/Справочник_по_формам_множественного_…»)
 
(не показано 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]]
+

Текущая версия на 23:38, 22 сентября 2018

Статья переехала: https://community.kde.org/RU/Справочник_по_формам_множественного_числа_в_KDE