Перейти к содержанию

Переводчикам

Эта страница — для того, кто редактирует каталог, а не для того, кто пишет код. Она намеренно короткая и рассчитана на то, чтобы её можно было дать ссылкой или скопировать в собственную инструкцию для переводчиков проекта.

Читать Python здесь не нужно нигде. Всё здесь — про одно: про части сообщения, заключённые в фигурные скобки.

Что такое заполнитель

Сообщение в каталоге может содержать имена в фигурных скобках:

msgid "Hello {name}"
msgstr ""

{name} — это заполнитель. Показывая это сообщение, программа заменяет {name} значением, которое подставляет сама: именем человека, именем файла, числом. Заполнитель — не слово для перевода, а место под значение.

Ваш перевод пишется в msgstr, и это место в нём должно сохраниться:

msgid "Hello {name}"
msgstr "こんにちは {name}"

Что можно менять, а что нельзя

Можно:

  • Переставить заполнитель туда, куда требует грамматика целевого языка, — в том числе в самое начало сообщения.
  • Повторить заполнитель, если языку нужно, чтобы значение прозвучало дважды.
  • Переписать любое другое слово, включая пунктуацию, пробелы и порядок частей предложения.

Нельзя:

  • Переводить имя внутри скобок. {name} остаётся {name} даже в языке, где больше ничего не пишется латиницей.
  • Убирать скобки или писать имя без них.
  • Заменять ASCII-скобки { } полноширинными . Многие методы ввода дают полноширинные формы; они выглядят почти так же и не работают.
  • Добавлять форматирование вроде {name!r} или {amount:.2f}. Как выглядит значение, решает программа, а не каталог.
  • Выдумывать заполнитель, которого нет в msgid.

Если сообщению нужно значение, которого оригинал не даёт, это сообщение должен изменить разработчик. Скажите об этом, а не обходите проблему.

Множественные формы

Сообщение со счётом приходит с одним слотом msgstr на каждую множественную форму вашего языка, а сколько их — решает сам язык: одна в японском, две в немецком, три в русском, шесть в арабском. Заполните каждый слот, который даёт каталог.

Два правила, на которых чаще всего спотыкаются:

  • Слоты — это не «единственное, множественное, ещё более множественное». Каждый индекс значит ровно то, что говорит правило множественного числа вашего языка. Третья форма латышского — только для нуля; вторая форма словенского — ровно для двух; валлийский ставит общий случай в индекс 0, а единственное число — в индекс 1.
  • Два слота могут законно содержать один и тот же текст. В турецком, венгерском, персидском и бенгальском существительное после числительного остаётся в единственном числе, поэтому обе формы сообщения со счётом — одна и та же строка. Это правильно, а не описка при копировании.

Правила о заполнителях, изложенные выше, действуют для каждой формы отдельно.

Записи fuzzy

Запись, помеченная fuzzy, — догадка машины: разработчик изменил исходное сообщение, и инструменты связали новый текст с вашим старым переводом, чтобы вам было от чего оттолкнуться.

#, fuzzy
msgid "Welcome back, {name}"
msgstr "こんにちは {name}"

Запись fuzzy программой не используется — вместо неё показывается непереведённый оригинал, — пока кто-нибудь не выправит текст и не снимет пометку fuzzy. В большинстве PO-редакторов для этого есть отдельная кнопка.

Чтение сообщений об ошибках

Инструменты проверяют заполнители при компиляции каталога, и сообщение об ошибке написано для вас, а не для программиста. Сказать просто «{name} отсутствует» — тупик, когда вы видите эти самые символы прямо перед собой, поэтому там, где заполнитель выглядит присутствующим, но таковым не является, сообщение объясняет почему. Для оригинала Hello {name} каждый из случаев ниже сообщается под заголовком translation does not match the source placeholders:

В вашем переводе Причина, которую называют
こんにちは {name} {name} is missing (the braces around it are not the ASCII { and })
こんにちは {{name}} {name} is missing (it is written {{name}}, which is how a literal brace is escaped)
こんにちは name {name} is missing (the name appears, but not inside braces)
こんにちは {名前} {name} is missing; {名前} is not in the source message

У символов, которых не видно, обращение особое. Неразрывный пробел внутри скобок — это то, что производит метод ввода и не показывает ни один редактор, поэтому сообщение печатает его кодовой точкой, а не называет символ, который вам всё равно было бы не найти:

placeholder {<U+00A0>name} has a space inside the braces; write {name}

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

translation does not match the source placeholders: {name} is missing;
{nаme} (n\u0430me) is not in the source message

То же различение применяется, когда греческое или кириллическое имя, записанное целиком в одной системе письма, конфликтует с ASCII-именем из оригинала, — включая случай однобуквенных латинской a и кириллической а.

Если вы столкнулись с одним из этих случаев, а очевидного исправления не видно, самый безопасный ход — удалить набранный вами заполнитель и скопировать его из msgid.

Чего проверки не могут

Инструменты убеждаются, что ваши заполнители целы. Верен ли перевод, звучит ли он естественно и подходит ли к контексту — этого они определить не могут, и это целиком остаётся за вами.

Больше любой проверки помогают две вещи:

  • Читайте комментарий для переводчика. Строка, начинающаяся с #. над сообщением, — это разработчик рассказывает вам, где сообщение появляется и что оно значит.
  • Спрашивайте про msgctxt. Если одно и то же слово встречается дважды с разными контекстами, это потому, что переводиться они должны по-разному: как кнопка «Open» и как состояние «Open», например.