Как перевести PO-файлы, не нарушая работу приложения

OpenL Team 7/3/2026
Как перевести PO-файлы, не нарушая работу приложения

TABLE OF CONTENTS

PO-файлы выглядят как обычные текстовые файлы, пока переведённая строка %s, отсутствующая форма множественного числа или изменённый msgid не сломают ваше приложение. Используйте этот рабочий процесс, чтобы переводить строки, предназначенные для пользователей, сохраняя структуру gettext нетронутой.

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

Метод 1: Используйте переводчик PO-файлов

Выберите этот способ, если хотите получить быстрый и безопасный черновик и не хотите вручную редактировать пары msgid / msgstr.

  1. Сделайте резервную копию оригинального .po-файла. Сохраните чистую копию в вашем репозитории перед тем, как отправлять файл переводчику. Если переведённый файл окажется повреждённым, вам понадобится рабочая версия для сравнения.

  2. Откройте переводчик, поддерживающий PO-файлы. Используйте инструмент, созданный для работы с файлами gettext, например OpenL PO Translator — платный сервис для перевода документов. Такой инструмент должен переводить только целевые строки, сохраняя исходные строки, комментарии, плейсхолдеры и структуру файла без изменений. Если вы ещё выбираете инструмент, сравните варианты в нашем гайде по лучшим переводчикам PO-файлов.

  3. Загрузите .po-файл. Используйте языковой файл, содержащий пары msgid и msgstr. Если у вас есть только шаблон .pot, сначала создайте на его основе .po-файл для целевого языка, а затем загрузите этот .po-файл.

  4. Выберите исходный и целевой язык. Исходный язык должен соответствовать тексту внутри msgid, а не языку вашего интерфейса администратора. Например, если в файле строки msgid на английском, а вам нужен перевод на испанский, выберите перевод с английского на испанский.

  5. Скачайте переведённый файл. Сохраните его с названием, соответствующим принятой в вашем фреймворке схеме локализации. Плагины WordPress часто используют схему text-domain плюс локаль, а Django обычно хранит файлы по пути locale/<язык>/LC_MESSAGES/.

  6. Сначала проверьте потенциально опасные строки. Поиск по переведённому файлу по символам %, {, }, <, >, а также по msgid_plural, msgctxt и #, fuzzy. Именно эти элементы чаще всего могут повлиять на поведение приложения во время выполнения.

  7. Протестируйте переведённый файл в вашем приложении. Загрузите язык локально и пройдитесь по экранам, где используются переведённые строки. Работа с PO-файлом не заканчивается на переводе; она завершена только тогда, когда приложение продолжает корректно отображаться.

Метод 2: Перевод PO-файлов в Poedit

Выберите этот способ, если вам нужен ручной контроль, совместимость с WordPress или поэтапная работа над каждой строкой.

  1. Откройте файл в Poedit. Poedit — это специализированный редактор переводов для PO и других форматов локализации; базовый редактор бесплатен, а для расширенных рабочих процессов доступны платные Pro-функции. Для WordPress в официальном руководстве Polyglots указано, что Poedit может создавать .po и .mo файлы из POT-файла и поддерживает формы множественного числа и кодировку UTF-8.

  2. Обновите файл из POT-шаблона, если исходный текст изменился. Если разработчики изменили текст приложения, обновите .po файл из последнего .pot перед началом перевода. Это позволит увидеть новые, удалённые и помеченные как “fuzzy” строки, а не незаметно выпустить устаревший текст интерфейса.

  3. Переводите только поле msgstr. msgid — это исходная строка, по которой ваше приложение ищет перевод. В стандартном рабочем процессе gettext переводчики должны редактировать только msgstr, а не msgid.

  4. Сохраняйте плейсхолдеры без изменений. Не переводите и не изменяйте пробелы у переменных вроде %s, %d, %1$s, {name}, %(count)s, :name или HTML-тегов. Если необходимо изменить порядок слов, перемещайте плейсхолдер как единое целое.

  5. Обрабатывайте формы множественного числа как отдельные переводы. Запись во множественном числе может содержать msgid, msgid_plural и несколько значений msgstr[n]. Заполните все формы множественного числа, необходимые для целевого языка, вместо того чтобы копировать одну и ту же фразу во все поля.

  6. Сохраните и скомпилируйте файл .mo, если это требуется вашему приложению. Некоторые стеки читают файлы .po напрямую во время разработки, но WordPress и многие реализации gettext используют скомпилированные файлы .mo во время выполнения. Poedit может компилировать .mo при сохранении; в Django компиляция сообщений выполняется командой django-admin compilemessages.

  7. Устраните предупреждения перед загрузкой. В Poedit значки предупреждений часто указывают на некорректные плейсхолдеры, отсутствующие переменные или несоответствие форм множественного числа. Исправьте их до импорта перевода в WordPress, Django, Drupal или вашу релизную ветку.

Метод 3: Использование платформы локализации

Выберите этот способ, если над одними и теми же PO-файлами должны работать несколько переводчиков, редакторов или менеджеров релизов.

  1. Импортируйте PO-файл на платформу, поддерживающую gettext. Weblate и аналогичные платформы локализации поддерживают работу с PO-файлами. Командные платформы локализации чаще всего являются платными продуктами, хотя у Weblate есть и опция с открытым исходным кодом для самостоятельного размещения. Их обработка комментариев, заголовков, неточных строк и плейсхолдеров различается, поэтому проверьте настройки формата перед загрузкой рабочих файлов.

  2. Включите проверки плейсхолдеров и тегов. Активируйте правила контроля качества для плейсхолдеров в стиле printf, именованных переменных, HTML/XML-тегов и форм множественного числа. Такие проверки выявляют ошибки, которые обычная проверка орфографии не обнаружит.

  3. Держите комментарии разработчиков видимыми. Комментарии в PO-файлах могут содержать контекст, такой как ссылки на исходный код, извлечённые заметки разработчиков, флаги и предыдущие исходные строки. Переводчикам нужны эти заметки, когда короткая метка интерфейса вроде “Open” может быть глаголом, прилагательным или командой меню.

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

  5. Экспортируйте PO-файлы и проводите локальные проверки. Не доверяйте экспорту вслепую. Поместите переведённый файл обратно в приложение, скомпилируйте при необходимости и протестируйте экраны до слияния изменений.

Правила работы с PO-файлами, которые нельзя нарушать

PO itemTranslate it?Safe exampleWhy 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Сначала проверьте#, fuzzyFuzzy означает, что перевод может быть устаревшим или неподтверждённым.
#. 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-файл

  1. Запустите проверку gettext, если у вас установлен gettext.
msgfmt --check --check-format -o /tmp/messages.mo path/to/messages.po

Эта команда проверяет синтаксис, заголовки и форматные строки, а затем записывает временный скомпилированный каталог, если файл валиден.

  1. Скомпилируйте файл так, как ожидает ваш фреймворк.
django-admin compilemessages

Для проектов на Django команда compilemessages компилирует файлы .po, созданные с помощью makemessages, в файлы .mo для поддержки gettext.

  1. Поиск пустых переводов.
grep -n 'msgstr ""' path/to/messages.po

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

  1. Поиск неточных (fuzzy) строк.
grep -n '#, fuzzy' path/to/messages.po

Неточные строки должны быть проверены человеком перед выпуском. По умолчанию msgfmt не использует неточные переводы, если только вы не компилируете с опцией --use-fuzzy, поэтому неточная запись может вести себя как непереведённая строка в итоговом каталоге.

  1. Протестируйте реальный интерфейс. Откройте экраны, содержащие формы, варианты множественного числа, сообщения об ошибках, меню аккаунта и платёжные процессы. Проверка PO-файлов выявляет проблемы с файлами; только тестирование интерфейса позволяет обнаружить неуклюжие формулировки, переполнение текста и отсутствие контекста.

Какой метод использовать?

СитуацияЛучший методПочему
Вам нужен быстрый черновик для одного PO-файлаПереводчик PO-файловСамый быстрый способ с сохранением структуры
Вы поддерживаете плагин или тему WordPressPoeditПривычный рабочий процесс 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.

Источники