Один файл на входе, пять форматов на выходе: как обеспечить перспективность ваших WordPress-переводов

Вы потратили три недели на перевод своей WordPress-темы на испанский язык. Файл .po идеален — каждая строка проверена, каждая переменная не повреждена, каждая форма множественного числа верна. Затем ваш клиент решает перейти с классической PHP-темы на headless-архитектуру с React на внешнем интерфейсе.
Внезапно ваш файл .po становится бесполезным. Приложению React нужен формат .json. Устаревшим PHP-виджетам по-прежнему нужен .mo. Фрилансер, занимающийся мобильным приложением, хочет .xliff. И ни у кого нет времени переводить 4000 строк в три разных формата.
Это не исключительный случай. Это реальность современной разработки WordPress, где темы поставляются как с PHP, так и с JavaScript-компонентами, плагины используют смесь Gettext и i18next, а клиенты меняют свое мнение об архитектуре чаще, чем свои пароли.
Почему форматы файлов перевода важны как никогда
Пять лет назад перевод WordPress был прост. У вас был файл .po (человекочитаемый источник) и файл .mo (скомпилированный бинарный файл). Это все. Каждая тема, каждый плагин, каждый инструмент перевода говорили на одном языке.
Сегодня в экосистеме WordPress используется как минимум пять форматов файлов перевода в production:
Пять форматов, которые вам нужно знать
.po (Portable Object) — человекочитаемый исходный формат, используемый GNU Gettext. Содержит исходные строки (msgid) и их переводы (msgstr). Это то, что редактируют переводчики.
msgid "Add to Cart"
msgstr "Anadir al carrito"
msgid "Your order has been shipped to %s"
msgstr "Su pedido ha sido enviado a %s"
.mo (Machine Object) — скомпилированная бинарная версия файла .po. WordPress читает файлы .mo во время выполнения, используя load_textdomain(). Быстрее, чем разбор .po во время выполнения, но не редактируется человеком.
.json (JavaScript Object Notation) — используется wp_set_script_translations() для переводов на основе JavaScript в блоках Gutenberg, компонентах React и современных темах. WordPress ожидает определенную структуру JSON с ключами locale_data.
{
"locale_data": {
"flavor-starter": {
"Add to Cart": ["Anadir al carrito"],
"Your order has been shipped to %s": ["Su pedido ha sido enviado a %s"]
}
}
}
.php (PHP Array) — все более популярный формат для тем и плагинов, которые используют загрузку переводов в стиле Laravel. Некоторые современные темы WordPress полностью обходят Gettext и загружают переводы из массивов PHP для повышения производительности.
<?php
return [
'Add to Cart' => 'Anadir al carrito',
'Your order has been shipped to %s' => 'Su pedido ha sido enviado a %s',
];
.xliff (XML Localization Interchange File Format) — отраслевой стандарт для обмена переводами между различными инструментами и платформами. Используется CAT (Computer-Assisted Translation) инструментами, такими как memoQ, Trados и Memsource. Необходим при работе с профессиональными переводчиками.
<trans-unit id="1">
<source>Add to Cart</source>
<target>Anadir al carrito</target>
</trans-unit>
Проблема: привязка к формату
Большинство инструментов перевода создают один выходной формат. Poedit дает вам .po и .mo. WPML хранит переводы в базе данных (вообще не в файлах). Weglot хранит переводы на своих серверах в проприетарном формате. Даже TMS-платформы, такие как Crowdin и Lokalise, требуют ручной настройки форматов экспорта для каждого проекта.
Это создает привязку к формату — ваши переводы оказываются в ловушке того формата, который создает ваш текущий инструмент. Когда ваши требования меняются, вы сталкиваетесь с двумя вариантами:
- Перевести все заново в новом формате (дорого, отнимает много времени, и вы теряете любые ручные исправления).
- Написать собственные скрипты преобразования (чревато ошибками, особенно для сложных форм множественного числа и переменных).
Ни один из вариантов не является хорошим. Оба тратят время и деньги. Оба создают риск.
Реальные сценарии, когда привязка к формату вредит
Сценарий 1: Модернизация темы. Тема вашего клиента перестраивается с помощью блоков Gutenberg. Старые PHP-шаблоны использовали файлы .mo. Новым блокам нужен .json для wp_set_script_translations(). Ваши 3000 переведенных строк должны существовать в обоих форматах во время перехода.
Сценарий 2: Рабочий процесс агентства. Вы управляете 20 сайтами клиентов. Некоторые используют классические темы (.mo). Некоторые используют headless-архитектуру (.json). Один использует пользовательский фреймворк, который читает массивы PHP. Вам нужны одни и те же переводы в разных форматах для разных клиентов.
Сценарий 3: Профессиональная проверка. Ваши AI-переводы точны на 95%, но вы хотите, чтобы носитель языка проверил оставшиеся 5%. Профессиональные переводчики используют CAT-инструменты, которые импортируют .xliff. Вам нужно экспортировать свои переводы в .xliff, отправить их на проверку и объединить исправления обратно.
Сценарий 4: Перенос платформы. Ваш клиент переходит с WordPress на пользовательское приложение Node.js. Новое приложение использует i18next и нуждается в файлах .json. Ваши 5000 переведенных строк в формате .po необходимо преобразовать — не потеряв ни одной переменной или формы множественного числа.
Решение: переведите один раз, получите каждый формат
SimplePoTranslate использует другой подход. Когда вы загружаете файл .po, .pot, .json или .xliff и запускаете перевод, вы получаете обратно ZIP-архив, содержащий все пять форматов:
translations-es_ES.zip
├── flavor-starter-es_ES.po
├── flavor-starter-es_ES.mo
├── flavor-starter-es_ES.json
├── flavor-starter-es_ES.php
└── flavor-starter-es_ES.xliff
Это не «премиум-функция», заблокированная за корпоративным уровнем. Каждый платный тарифный план — Pro (19 долларов в месяц) и Lifetime (399 долларов единовременно) — включает в себя все пять выходных форматов в каждом задании перевода.
Почему это важно для обеспечения перспективности
Когда у вас есть все пять форматов с самого начала, вам никогда не придется переводить заново. Ваши переводы — это актив, который адаптируется к любым техническим требованиям:
- Клиент переходит с классической версии на Gutenberg? Разверните файл
.json. - Новый разработчик предпочитает массивы PHP? Передайте им файл
.php. - Профессиональный переводчик хочет проверить? Отправьте файл
.xliff. - Переход на другую CMS? Файлы
.jsonи.xliffне зависят от платформы.
Вы переводите один раз. Форматы готовы, когда они вам понадобятся.
Как каждый формат работает в WordPress
Знание того, какой файл куда идет, необходимо для чистого развертывания.
Развертывание файлов .mo (классические PHP-темы и плагины)
wp-content/languages/plugins/woocommerce-es_ES.mo
wp-content/languages/themes/flavor-starter-es_ES.mo
WordPress загружает их автоматически, когда язык сайта совпадает. Плагин не требуется. Нулевая нагрузка на базу данных. Это подход, который обеспечивает лучшую производительность.
Развертывание файлов .json (блоки Gutenberg и JS-компоненты)
wp-content/languages/plugins/woocommerce-es_ES-{handle}-{md5}.json
Имя файла включает дескриптор скрипта и хеш MD5. WordPress сопоставляет их, когда вы вызываете wp_set_script_translations() в своем плагине или теме. Если вы создаете блоки Gutenberg, это файл, который обеспечивает правильное отображение переведенных меток и описаний блоков.
Использование файлов .xliff (рабочий процесс профессиональной проверки)
Файлы .xliff не развертываются в WordPress. Они используются в качестве формата обмена, когда вам нужно отправить переводы профессиональному рецензенту или импортировать их в CAT-инструмент. Рабочий процесс выглядит следующим образом:
- Загрузите
.poв SimplePoTranslate и получите.xliffв ZIP-архиве. - Отправьте
.xliffсвоему переводчику или рецензенту. - Получите исправленный
.xliffобратно. - Загрузите исправленный
.xliffв SimplePoTranslate и получите обновленные.moи.json.
Этот сквозной рабочий процесс сохраняет каждую переменную и форму множественного числа, поскольку блокировка синтаксиса SimplePoTranslate защищает их на каждом этапе.
Тест на привязку к поставщику
Вот простой тест, чтобы определить, есть ли у вашего текущего рабочего процесса перевода проблема привязки:
- Можете ли вы экспортировать свои переводы как стандартные файлы
.poпрямо сейчас? - Если вы отмените подписку на свой инструмент перевода сегодня, сохраните ли вы каждую переведенную строку?
- Можете ли вы импортировать свои переводы в совершенно другой инструмент или платформу без повторного перевода?
Если ответ на любой из этих вопросов — «нет», вы заблокированы. Сервисы, такие как Weglot и GTranslate, проваливают все три вопроса — отмените подписку, и ваши переводы исчезнут. WPML хранит переводы в базе данных, что делает экспорт возможным, но болезненным. Даже настольные инструменты, такие как Poedit, проходят тест на бумаге, но ограничивают вас только .po и .mo.
С SimplePoTranslate ответ на все три вопроса — «да». Вы загружаете стандартные файлы в пяти форматах. Они твои. Удалите свою учетную запись завтра, и каждый перевод, который вы когда-либо делали, все равно будет работать.
Создание не зависящей от формата библиотеки переводов
Для агентств и разработчиков, управляющих несколькими проектами, самый разумный подход — создать библиотеку переводов — репозиторий Git или общую папку, в которой хранятся переведенные файлы для каждого проекта клиента.
translations/
├── client-acme/
│ ├── es_ES/
│ │ ├── flavor-starter-es_ES.po
│ │ ├── flavor-starter-es_ES.mo
│ │ ├── flavor-starter-es_ES.json
│ │ ├── flavor-starter-es_ES.php
│ │ └── flavor-starter-es_ES.xliff
│ └── de_DE/
│ └── ...
├── client-globex/
│ └── ...
Когда клиенту нужен новый формат, он у вас уже есть. Когда клиент меняет платформы, ваши переводы переносятся без каких-либо усилий. Когда новый разработчик присоединяется к команде, он может точно видеть, что было переведено и в каких форматах.
Это то, что на самом деле означает «перспективный» — не предсказывать, какую технологию ваши клиенты будут использовать в следующем году, а убедиться, что ваши переводы работают с тем, что они выберут.
Готовы перестать беспокоиться о форматах файлов? Попробуйте SimplePoTranslate бесплатно — загрузите один файл, получите пять форматов обратно. Никаких скриптов преобразования, никакого повторного перевода, никакой блокировки.