Как перевести PO-файлы, не нарушая работу приложения
TABLE OF CONTENTS
PO-файлы выглядят как обычные текстовые файлы, пока переведённая строка %s, отсутствующая форма множественного числа или изменённый msgid не сломают ваше приложение. Используйте этот рабочий процесс, чтобы переводить строки, предназначенные для пользователей, сохраняя структуру gettext нетронутой.
Не вставляйте весь файл в обычный текстовый переводчик. PO-файл — это почти исходный код: слова можно переводить, но структура файла, плейсхолдеры, комментарии и индексы множественного числа должны остаться без изменений.
Метод 1: Используйте переводчик PO-файлов
Выберите этот способ, если хотите получить быстрый и безопасный черновик и не хотите вручную редактировать пары msgid / msgstr.
-
Сделайте резервную копию оригинального
.po-файла. Сохраните чистую копию в вашем репозитории перед тем, как отправлять файл переводчику. Если переведённый файл окажется повреждённым, вам понадобится рабочая версия для сравнения. -
Откройте переводчик, поддерживающий PO-файлы. Используйте инструмент, созданный для работы с файлами gettext, например OpenL PO Translator — платный сервис для перевода документов. Такой инструмент должен переводить только целевые строки, сохраняя исходные строки, комментарии, плейсхолдеры и структуру файла без изменений. Если вы ещё выбираете инструмент, сравните варианты в нашем гайде по лучшим переводчикам PO-файлов.
-
Загрузите
.po-файл. Используйте языковой файл, содержащий парыmsgidиmsgstr. Если у вас есть только шаблон.pot, сначала создайте на его основе.po-файл для целевого языка, а затем загрузите этот.po-файл. -
Выберите исходный и целевой язык. Исходный язык должен соответствовать тексту внутри
msgid, а не языку вашего интерфейса администратора. Например, если в файле строкиmsgidна английском, а вам нужен перевод на испанский, выберите перевод с английского на испанский. -
Скачайте переведённый файл. Сохраните его с названием, соответствующим принятой в вашем фреймворке схеме локализации. Плагины WordPress часто используют схему text-domain плюс локаль, а Django обычно хранит файлы по пути
locale/<язык>/LC_MESSAGES/. -
Сначала проверьте потенциально опасные строки. Поиск по переведённому файлу по символам
%,{,},<,>, а также поmsgid_plural,msgctxtи#, fuzzy. Именно эти элементы чаще всего могут повлиять на поведение приложения во время выполнения. -
Протестируйте переведённый файл в вашем приложении. Загрузите язык локально и пройдитесь по экранам, где используются переведённые строки. Работа с PO-файлом не заканчивается на переводе; она завершена только тогда, когда приложение продолжает корректно отображаться.
Метод 2: Перевод PO-файлов в Poedit
Выберите этот способ, если вам нужен ручной контроль, совместимость с WordPress или поэтапная работа над каждой строкой.
-
Откройте файл в Poedit. Poedit — это специализированный редактор переводов для PO и других форматов локализации; базовый редактор бесплатен, а для расширенных рабочих процессов доступны платные Pro-функции. Для WordPress в официальном руководстве Polyglots указано, что Poedit может создавать
.poи.moфайлы из POT-файла и поддерживает формы множественного числа и кодировку UTF-8. -
Обновите файл из POT-шаблона, если исходный текст изменился. Если разработчики изменили текст приложения, обновите
.poфайл из последнего.potперед началом перевода. Это позволит увидеть новые, удалённые и помеченные как “fuzzy” строки, а не незаметно выпустить устаревший текст интерфейса. -
Переводите только поле
msgstr.msgid— это исходная строка, по которой ваше приложение ищет перевод. В стандартном рабочем процессе gettext переводчики должны редактировать толькоmsgstr, а неmsgid. -
Сохраняйте плейсхолдеры без изменений. Не переводите и не изменяйте пробелы у переменных вроде
%s,%d,%1$s,{name},%(count)s,:nameили HTML-тегов. Если необходимо изменить порядок слов, перемещайте плейсхолдер как единое целое. -
Обрабатывайте формы множественного числа как отдельные переводы. Запись во множественном числе может содержать
msgid,msgid_pluralи несколько значенийmsgstr[n]. Заполните все формы множественного числа, необходимые для целевого языка, вместо того чтобы копировать одну и ту же фразу во все поля. -
Сохраните и скомпилируйте файл
.mo, если это требуется вашему приложению. Некоторые стеки читают файлы.poнапрямую во время разработки, но WordPress и многие реализации gettext используют скомпилированные файлы.moво время выполнения. Poedit может компилировать.moпри сохранении; в Django компиляция сообщений выполняется командойdjango-admin compilemessages. -
Устраните предупреждения перед загрузкой. В Poedit значки предупреждений часто указывают на некорректные плейсхолдеры, отсутствующие переменные или несоответствие форм множественного числа. Исправьте их до импорта перевода в WordPress, Django, Drupal или вашу релизную ветку.
Метод 3: Использование платформы локализации
Выберите этот способ, если над одними и теми же PO-файлами должны работать несколько переводчиков, редакторов или менеджеров релизов.
-
Импортируйте PO-файл на платформу, поддерживающую gettext. Weblate и аналогичные платформы локализации поддерживают работу с PO-файлами. Командные платформы локализации чаще всего являются платными продуктами, хотя у Weblate есть и опция с открытым исходным кодом для самостоятельного размещения. Их обработка комментариев, заголовков, неточных строк и плейсхолдеров различается, поэтому проверьте настройки формата перед загрузкой рабочих файлов.
-
Включите проверки плейсхолдеров и тегов. Активируйте правила контроля качества для плейсхолдеров в стиле printf, именованных переменных, HTML/XML-тегов и форм множественного числа. Такие проверки выявляют ошибки, которые обычная проверка орфографии не обнаружит.
-
Держите комментарии разработчиков видимыми. Комментарии в PO-файлах могут содержать контекст, такой как ссылки на исходный код, извлечённые заметки разработчиков, флаги и предыдущие исходные строки. Переводчикам нужны эти заметки, когда короткая метка интерфейса вроде “Open” может быть глаголом, прилагательным или командой меню.
-
Используйте память переводов с последующей проверкой. Память переводов полезна для повторяющихся строк интерфейса, но она может скопировать старый перевод в новый контекст. Проверяйте повторно используемые строки, если изменились
msgctxt, ссылки на исходный код или окружающий интерфейс. -
Экспортируйте PO-файлы и проводите локальные проверки. Не доверяйте экспорту вслепую. Поместите переведённый файл обратно в приложение, скомпилируйте при необходимости и протестируйте экраны до слияния изменений.
Правила работы с PO-файлами, которые нельзя нарушать
| PO item | Translate it? | Safe example | Why it matters |
|---|---|---|---|
msgid | Нет | msgid "Save changes" | Приложение использует эту исходную строку как ключ для поиска во многих рабочих процессах gettext. |
msgstr | Да | msgstr "Guardar cambios" | Это текст на целевом языке, который видят пользователи. |
msgctxt | Нет | msgctxt "button" | Контекст помогает различать одинаковые исходные строки. |
%s, %d, %1$s | Нет | Hello, %s -> Hola, %s | Во время выполнения кода эти плейсхолдеры заменяются актуальными значениями. |
{name}, %(count)s, :name | Нет | Welcome, {name} | Имена переменных должны совпадать с кодом приложения. |
| HTML-теги | Обычно нет | <strong>Warning</strong> | Переводите текст, а не синтаксис тегов. |
msgid_plural | Нет | msgid_plural "%d files" | Исходная форма множественного числа принадлежит оригинальному коду. |
msgstr[0], msgstr[1] | Да, внимательно | msgstr[0] "%d file" | Для каждого языка свои правила образования множественного числа. |
#, fuzzy | Сначала проверьте | #, fuzzy | Fuzzy означает, что перевод может быть устаревшим или неподтверждённым. |
#. developer comments | Обычно нет | #. Button label | Эти примечания помогают переводчикам понять контекст. |
Быстрый пример: корректный и некорректный перевод PO
Вот обычная запись gettext:
#. %s is the user's display name.
#, c-format
msgid "Welcome back, %s"
msgstr ""
Безопасный перевод на испанский сохраняет %s без изменений:
#. %s is the user's display name.
#, c-format
msgid "Welcome back, %s"
msgstr "Bienvenido de nuevo, %s"
Некорректный перевод изменяет плейсхолдер:
msgid "Welcome back, %s"
msgstr "Bienvenido de nuevo, % s"
Даже такой маленький пробел может иметь значение. GNU msgfmt --check-format предназначен для поиска несоответствий в форматных строках, например, неправильных плейсхолдеров %, а Poedit также предупреждает о типичных ошибках с плейсхолдерами. Для более полного списка строк, которые нельзя переводить, используйте наше руководство что не нужно переводить.
Как проверить переведённый PO-файл
- Запустите проверку gettext, если у вас установлен gettext.
msgfmt --check --check-format -o /tmp/messages.mo path/to/messages.po
Эта команда проверяет синтаксис, заголовки и форматные строки, а затем записывает временный скомпилированный каталог, если файл валиден.
- Скомпилируйте файл так, как ожидает ваш фреймворк.
django-admin compilemessages
Для проектов на Django команда compilemessages компилирует файлы .po, созданные с помощью makemessages, в файлы .mo для поддержки gettext.
- Поиск пустых переводов.
grep -n 'msgstr ""' path/to/messages.po
Пустые поля msgstr могут быть оставлены намеренно для непереведённых записей, но они не должны стать для вас неожиданностью при выпуске.
- Поиск неточных (fuzzy) строк.
grep -n '#, fuzzy' path/to/messages.po
Неточные строки должны быть проверены человеком перед выпуском. По умолчанию msgfmt не использует неточные переводы, если только вы не компилируете с опцией --use-fuzzy, поэтому неточная запись может вести себя как непереведённая строка в итоговом каталоге.
- Протестируйте реальный интерфейс. Откройте экраны, содержащие формы, варианты множественного числа, сообщения об ошибках, меню аккаунта и платёжные процессы. Проверка PO-файлов выявляет проблемы с файлами; только тестирование интерфейса позволяет обнаружить неуклюжие формулировки, переполнение текста и отсутствие контекста.
Какой метод использовать?
| Ситуация | Лучший метод | Почему |
|---|---|---|
| Вам нужен быстрый черновик для одного PO-файла | Переводчик PO-файлов | Самый быстрый способ с сохранением структуры |
| Вы поддерживаете плагин или тему WordPress | Poedit | Привычный рабочий процесс WordPress с компиляцией .mo |
| Вы поддерживаете приложение Django | Переводчик PO или Poedit, затем compilemessages | Перевод может быть быстрым, но компиляция в рамках фреймворка всё равно необходима |
| У вас много языков и рецензентов | Платформа локализации | Лучшее распределение задач, история, контроль качества и рецензирование |
| Вы переводите строки для разработчиков | Ручная проверка после машинного перевода | Важны термины кода, плейсхолдеры и контекст |
| Вы также локализуете JSON или фронтенд-файлы i18n | Используйте специализированный рабочий процесс | Правила PO не всегда применимы к JSON, YAML или ICU-сообщениям |
Если ваш проект сочетает PO-файлы gettext с локализационными файлами JSON, переводите каждый формат с помощью инструмента, который понимает его структуру. В PO-файлах используются msgid и msgstr; в локализации JSON — ключи и значения. Для такого процесса ознакомьтесь с нашим руководством по лучшим переводчикам JSON в 2026 году.
Часто задаваемые вопросы
Могу ли я переводить PO-файлы с помощью Google Translate?
Вы можете копировать отдельные значения msgstr в обычный переводчик, но загрузка или вставка всего PO-файла в обычный текстовый переводчик рискованна. Обычные переводчики могут изменить msgid, комментарии, экранирование кавычек, индексы множественного числа или плейсхолдеры. Вместо этого используйте переводчик, понимающий PO, Poedit или платформу локализации.
В чем разница между .po, .pot и .mo?
.pot — это шаблон, извлечённый из исходного кода. Обычно он содержит оригинальные строки, но не содержит готовых переводов. .po — редактируемый файл перевода для одного целевого языка. .mo — скомпилированный бинарный каталог, который многие приложения на базе gettext загружают во время выполнения.
Нужно ли переводить msgid?
Нет, не в обычном рабочем процессе. Переводите только msgstr. Руководство GNU gettext описывает msgid как исходную непереведённую строку, а msgstr — как перевод; строки msgid создаются и управляются инструментами gettext.
Как проверить, валиден ли PO-файл?
Запустите msgfmt --check --check-format, если gettext установлен, откройте файл в Poedit или воспользуйтесь проверками качества вашей платформы локализации. Затем скомпилируйте и протестируйте файл внутри приложения. Валидация необходима, но она не заменяет тестирование интерфейса.
Что произойдёт, если я нарушу структуру плейсхолдера?
В лучшем случае приложение покажет странную строку. В худшем — форматтер во время выполнения выдаст ошибку, потому что переведённая строка больше не соответствует переменным, которые передаёт код. Плейсхолдеры следует перемещать только как целые токены, их нельзя переводить или частично изменять.
Может ли OpenL переводить PO-файлы?
Да. OpenL PO Translator специально создан для файлов gettext .po и заявляет, что сохраняет плейсхолдеры и переменные без изменений при переводе на более чем 100 языков. Он использует модель оплаты за перевод документа, поэтому подходит для быстрого чернового варианта, когда важно сохранить структуру PO-файла, а не делать всё вручную. Если у вас есть только шаблон .pot, сначала создайте .po-файл для целевого языка, а затем используйте OpenL.
Источники
- Руководство GNU gettext: PO Files — Официальное объяснение формата файлов PO от gettext.
- Руководство GNU gettext: PO File Entries — Источник информации о
msgid,msgstr, комментариях, флагах и структуре записей. - Руководство GNU gettext: Entries with Plural Forms — Описание структуры записей с формами множественного числа.
- Руководство GNU gettext: msgfmt Invocation — Информация о
msgfmt --checkи проверке строк формата. - OpenL PO Translator — Страница продукта OpenL для перевода файлов
.poс сохранением плейсхолдеров и переменных. - Poedit — Официальный сайт Poedit, редактора переводов PO и его Pro-версии.
- WordPress Polyglots Handbook: Poedit — Руководство WordPress по использованию Poedit, файлов POT, PO, компиляции MO и предупреждениям о плейсхолдерах.
- Документация Django: Перевод — Описание рабочего процесса Django для файлов сообщений и перевода.
- Документация Django: compilemessages — Справка по команде Django для компиляции файлов
.poв.mo. - Документация Drupal: PO и POT файлы — Объяснение Drupal по работе с
.po,.pot, контекстом, формами множественного числа, комментариями и переменными. - Документация Weblate: GNU gettext PO — Описание платформы локализации о заголовках PO, предыдущих исходных строках, устаревших строках и сгенерированных MO-файлах.