- Как скорректировать перевод WordPress, темы или плагина под себя
- Переопределение строк
- Оригинал строки
- Текстовый домен
- Контекст
- Строка замены
- Примеры
- Переименуем Товары в Услуги в плагине WooCommerce
- Формирование языкового пакета
- Переводы (локализация)
- Что переводить?
- Перевод темы/плагина из каталога WordPress
- Перевод темы/плагина НЕ из каталога WordPress
- Перевод своей темы/плагина
- Как работает перевод в WordPress (теория)
- Этап 1: Создадим свой плагин и переведем его
- Этап 2: Перевод. Создание .mo .po файлов (под нужную локаль)
- Обновление перевода (при изменении кода)
- Создание POT файла
- Подключение .mo файла перевода
- Функций перевода
- Ошибки при использовании функций перевода
- #1 Нельзя использовать переменные/константы в параметрах функций перевода
- #2 Не используйте HTML в строках перевода (если это возможно)
- #3 Не делите фразу на отдельные слова
- #4 Не оставляйте пробелы в конце/начале строки (если это возможно)
- Перевод множественного числа
- В заключение
- Размещение файла перевода в глобальной папке
- Термины связанные с переводом
- Плагин для перевода
Как скорректировать перевод WordPress, темы или плагина под себя
В одном из прошлых уроков, мы рассматривали как перевести плагин или тему из каталога WordPress. Сегодня разберемся как можно скорректировать перевод WordPress, темы или плагина под конкретный сайт.
Это можно сделать двумя способами: переопределить отдельные строки или сформировать свой языковой пакет.
Переопределение строк
Для переопределения отдельных строк подойдет плагин Say what?.
Установим и активируем его, а затем перейдем в раздел Инструменты -> Изменения текста.
Страница плагина представляет из себя таблицу из четырех столбцов: Оригинал строки, Текстовый домен, Контекст и Строка замены. Рассмотрим каждый из них.
Оригинал строки
Оригинал строки — это оригинальная фраза, заданная в коде плагина. Обычно на английском языке.
Чтобы найти соответствие между оригинальной строкой и переводом на русский язык, достаточно найти переведенную строку в проекте перевода WordPress, плагина или темы.
Текстовый домен
Текстовый домен — это уникальный идентификатор перевода плагина или темы, позволяющий их различать. Строки входящие в ядро WordPress такого идентификатора не имеют.
Текстовый домен идентичен ярлыку плагина или темы, который можно определить из их адреса в каталоге WordPress.
Контекст
Контекст позволяет более точно перевести термин, когда он является одним и тем же словом на английском языке, но его нужно переводить по-разному на другие языки. Например, фраза «Add New» может быть переведена как «Добавить новый», «Добавить новую» или «Добавить нового».
Строка замены
Строка замены — это та фраза, которая будет использоваться в качестве перевода.
Примеры
Рассмотрим несколько примеров:
Переименуем Записи в Статьи.
Щелкаем по кнопке «Добавить новую», находим оригинальную строку в проекте перевода WordPress текущей версии 4.9 и копируем ее вместе с контекстом в соответствующие поля формы, вводим строку замены, жмем кнопку «Добавить» и проверяем результат.
Переименуем Товары в Услуги в плагине WooCommerce
Алгоритм действий аналогичный. Находим оригинальную строку в проекте перевода WooCommerce — это строка «Products» с контекстом «Admin menu name». Добавляем новый элемент для замены и проверяем результат.
Формирование языкового пакета
Для формирования своего языкового пакета воспользуемся плагином Loco Translate. С помощью него удобнее переводить большие объемы строк, а также он позволяет корректировать динамичные строки, зависящие от числа, например, «1 комментарий», «2 комментария», «5 комментариев».
Для примера превратим количество комментариев в количество отзывов в теме Twenty Seventeen.
Устанавливаем и активируем плагин, переходим в пункт меню Loco Translate -> Themes -> Twenty Seventeen, жмем на Russian и в открывшемся списке ищем оригинальную строку для количества комментариев.
После этого возвращаемся на страницу списка переводов темы Twenty Seventeen, наводим мышкой на «Russian» и щелкаем по ссылке «Copy».
В открывшейся форме выбираем WordPress language: Russian и отмечаем галочку Use «ru_RU» as template when running Sync. Остальные параметры оставляем по умолчанию.
Галочка Use «ru_RU» as template when running Sync позволит синхронизировать наш пакет локализации с оригинальным при его обновлении в будущем.
Жмем кнопку Start translating, в открывшемся списке ищем оригинальные строки, содержащие «Reply To», и переводим их как «отзывы».
Не забудьте указать перевод для всех форм: отзыв, отзыва, отзывов во вкладках One, Few и Other соответственно. Жмем кнопку Save и проверяем результат.
Аналогичным образом мы можем переопределить строки, например, для плагина WooCommerce: переходим в Loco Translate -> Plugins -> WooCommerce, находим значение нужной оригинальной строки, создаем свой пакет локализации на основе оригинального путем копирования и добавляем новый перевод.
Если планируете изменять строки перевода этим способом, то всегда необходимо создавать свой пакет локализации, иначе, если Вы внесете изменения в оригинальный файл перевода, — они будут утеряны при следующем обновлении пакетов локализации в WordPress.
Также, стоит учитывать, что если на сайте используется плагины кеширования, то необходимо очистить их кеш для отображения изменений в публичной части сайта.
Переводы (локализация)
В этой статье поговорим о том, как создавать и подключать файлы перевода, и как затем переводить текст в плагинах и темах. Также, здесь я коротко рассмотрел некоторые теоретические моменты, частые ошибки, как работать с программой Poedit. Ну и дам некоторые советы касательно переводов.
Список локалей для всех языков смотрите здесь.
Что переводить?
Прежде чем переходить к переводу, давайте определимся что нам нужно перевести, потому что это влияет на то, как нужно переводить.
Перевод темы/плагина из каталога WordPress
Для такого перевода нужно использовать сайт translate.wordpress.org. Что нужно сделать:
- Авторизоваться.
- Выбрать нужный язык перевода
- Найти плагин/тему которую нужно перевести.
- И прям на сайте переводить.
После того, как ваш перевод будет проверен, в админке вашего сайта на WordPress вы уведите обновления перевода для плагина/темы.
Заметка: обновление появится не раньше, чем 95% всего перевода будет готово. Чтобы ускорить проверку, можете написать на форум в раздел «переводы» или в русскоязычный slack на канал #translations .
Заметка: Не все плагины из каталога поддерживают перевод через translate.wordpress.org. В таких случаях переводить нужно как обычно (читайте следующий пункт).
Перевод темы/плагина НЕ из каталога WordPress
В этом случае, нужно:
- Открыть папку плагина и найти в ней файлы перевода. Это файл .po , .pot , .mo . Обычно они лежать в папках languages или lang .
- Затем переходите к «Этап 2» из этой статьи. Т.е. вам нужно будет создать .mo файл перевода. Для создания такого файла, используйте программу Poedit и .pot (если есть в плагине) или .po файл (закидывайте этот файл в Poedit и там создаете перевод на свой язык, сохраняете его с правильным названием). Или для создания .mo файла можно использовать плагин «Loco Translate», он даже удобнее (подробности в этой статье не описаны).
Перевод своей темы/плагина
Как это делается и работает описано ниже в «Этап 1» и «Этап 2».
Если вы планируете размещать ваш плагин/тему в каталоге WordPress. То настоятельно рекомендуется делать перевод через translate.wordpress.org. Подробнее об этом читайте в руководстве (англ.) (подробности в этой статье не описаны).
Как работает перевод в WordPress (теория)
Начать надо с самого главного — это файлы перевода. Их бывает три: .mo .po .pot . PHP работает только с .mo файлом, .po и .pot — для людей и программ перевода.
.pot файл (Portable Object Template) — содержит оригинальные строки перевода (без перевода). Это шаблон перевода. POT файл является основой для создания .po файла (для создания перевода на любой язык). POT файл не является обязательным файлом, перевод можно делать и без него — это просто шаблон. Как создать .pot файл читайте ниже.
.po файл (Portable Object) — содержит оригинальные строки перевода и сам перевод этих строк. Его можно изменять в любом текстовом редакторе или в программе (например Poedit, с ней мы и будет работать ниже). Из .po файла автоматически создается .mo файл.
В WordPress для перевода используется только файл .mo . Во время генерации страницы этот файл подключается — из него создается PHP объект с переводами строк и помещается в память. Далее, при использовании функций перевода в коде, из этого объекта берется перевод запрашиваемой строки.
Вот так просто это работает.
Таким образом, чтобы переводить строки в теме/плагине нам нужно:
Создать файл .mo и разместить его в папку темы/плагина. Или в глобальную папку переводов.
Подключить этот файл в теме/плагине с помощью одной из функций: load_theme_textdomain(), load_plugin_textdomain(). (Если размещается в глобальной папке подключать необязательно, WP сам это сделает).
Важно понимать, что при подключении .mo файла ему задается идентификатор (параметр $domain ) и такой идентификатор (домен) указывается для функций перевода строк. Домен связывает файл .mo с функциями перевода. Т.е. при переводе, в функции мы указываем из какого MO файла нужно получить перевод указанной строки. Пример:
Этап 1: Создадим свой плагин и переведем его
Если у вас уже есть готовая тема/плагин и её простой нужно перевести, переходите сразу к переводу (этап 2).
Чтобы процесс перевода был понятен, давайте создадим очень просто плагин и переведем его на русский язык. Назовем плагин my-translation-demo . У нас должна получиться такая структура плагина:
- В папке плагинов WordPress создадим папку my-translation-demo : /plugins/my-translation-demo .
- В этой папке создадим папку lang : /my-translation-demo/lang .
- Создадим файл my-translation-demo.php : /my-translation-demo/my-translation-demo.php .
- Добавим следующий код в созданный php файл:
Плагин готов! Зайдем в админку, активируем плагин, перейдем на страницу плагина.
В плагине используются все функции перевода, которые есть в WordPress. А также подключается еще не существующий .mo файл перевода myl10n-ru_RU.mo . После создания .mo файла плагин будет переведен (его мы создадим ниже).
Локализация названия плагина
Обратите внимание на параметры в заголовках плагина. Их нужно указать правильно, чтобы на странице плагинов работал перевод для названия и описания плагина.
Также для этого мы добавляем Название и Описание в функции перевода, чтобы парсер их нашел.
Также, WordPress использует параметр Text Domain: чтобы искать файл перевода в глобальной папке переводов. Там файл должен называться ДОМЕН-ПЕРЕВОДА_ЛОКАЛЬ.mo .
Этап 2: Перевод. Создание .mo .po файлов (под нужную локаль)
Чтобы создать MO файл, нам нужно иметь готовый PO файл, поэтому вся задача сводиться к созданию PO файла.
Вариантов создать PO файл несколько, тут мы рассмотрим работу с программой «Poedit». Для начала нужно скачать Poedit и установить его (бесплатная версия позволяет делать все что нам нужно).
Создать PO файл можно через Poedit, но мы создадим его нестандартно — так гораздо проще:
Просто создадим файл с расширением .po в папке lang нашего плагина. Файл должен иметь название ДОМЕН_ПЕРЕВОДА-ЛОКАЛЬ.po , у нас это myl10n-ru_RU.po . (создавать файл нужно в кодировке UTF-8).
Именно такое название файла требует функция load_plugin_textdomain() и язык перевода (русский).
- myl10n — это название нашего перевода (домен), который используется в функции load_plugin_textdomain() .
- ru_RU — это язык перевода (локаль в WordPress, когда мы переключаемся на русский язык).
Для темы название файла должно быть ЛОКАЛЬ.po , подробнее см. ниже.
Откроем файл и скопируем в него следующий текст (при сохранении не забываем про кодировку UTF-8):
Пояснения по параметрам:
- Project-Id-Version — название и версия проекта.
- Last-Translator — имя и email переводчика.
- Language-Team — название команды переводчиков.
- Language — язык на который переводит файл.
- Plural-Forms — форма множественного числа.
- X-Poedit-KeywordsList — названия и параметры функций, строки из которых будут взяты для перевода. (тут указаны все возможные функции WordPress).
- X-Poedit-Basepath — основная папка. Файлы в ней и в её подпапках будут просматриваться на наличие строк перевода. .. две точки тут означает, что основная папка находится на уровень выше папки текущего файла. Так как .po файл у нас лежит в /lang папке, то папка на уровень выше — это корневая папка плагина.
- X-Poedit-SearchPath-0 — папки (относительно основной), в которых нужно просматривать файлы. . точка тут означает, что нужно просматривать все файлы.
X-Poedit-SearchPathExcluded-0 — тут можно указать папку (относительно основной), где не нужно просматривать файлы.
Все эти параметры можно изменить из программы Poedit, в любой момент. Для этого зайдите в Каталог > Свойства в Poedit.
Подробнее про формат PO файла смотрите в документации.
Откроем установленную программу Poedit и закинем в нее наш, пока еще пустой, файл .po .
Выбираем «Извлечь из исходного кода».
В появившемся окне меняем настройки перевода (не обязательно) и жмем OK.
Ждем пока программа просканирует код и соберет из него все строки перевода.
Переводим, жмем «Сохранить»
Все, MO файл готов! При нажатии на «Сохранить» он автоматически создастся рядом с сохраненным .po файлом с таким же называнием.
Перевод готов и работает. Если теперь зайти на страницу плагина, то все строки будут переведены:
Почему удобно создавать .po файл вручную, а не через программу Poedit?
Потому что так быстрее: в этом случае не надо указывать никаких настроек, можно просто скопировать код (из пункта 2) в .po файл, закинуть этот файл в Poedit, нажать «Извлечь из исходного кода», затем «ОК» и переводить. (настройки можно изменить в самом po файле, программа для этого не нужна).
А чтобы создать файл через Poedit нужно:
- Открыть Poedit.
- Выбрать: Файл > Создать. .
- В появившемся окне выбрать язык на который переводим.
- Окно просто пропадет, а мы сидим тупим «а что дальше то делать?».
- А дальше, нужно нажать на кнопку Сохранить, в появившемся проводнике найти папку темы зайти в папку lang , вписать название файла myl10n-ru_RU.po и нажать ОК.
- Окно опять пропадает, а мы дальше тупим «что теперь делать?».
А теперь, нужно нажать кнопку: Извлечь из исходного кода. Откроется окно где нужно выставить настройки для PO файла. Все то что написано в коде для PO файла выше: название проекта, команда проекта, кодировки, папки где собирать строки перевода, ключевые слова для поиска строк перевода. В общем, тут надо будет повозиться и не ошибиться.
После того как настройки выставлены жмем «ОК».
Обновление перевода (при изменении кода)
Тут все предельно просто:
- Открываем Poedit.
- Закидываем в него любой PO файл из проекта и жмем «Обновить из кода» (кнопка на панели).
- Переводим новые строки и жмем «Сохранить» (кнопка на панели).
- Перевод обновлен! Можно закрыть Poedit.
Создание POT файла
.pot файл — это шаблон перевода. Это прям копия .po файла, только когда не переведена ни одна строка. Т.е. все строки перевода получены из файлов проекта, но еще ничего не переведено.
Из вышесказанного следует, чтобы создать POT файл нужно пройти всю процедуру по созданию .po файла, и под конец ничего не переводить, а зайти в Файл > Сохранить как и сохранить файл с расширением .pot .
Создать POT файл можно еще проще. Взять .po файл и поменять ему расширение на .pot . Это грубый метод, но такой файл с переведенными строками, тоже можно использовать как шаблон для создания перевода на любой язык (по крайней мере так работает Poedit).
Зачем нужен .pot файл?
Для того, чтобы был какой-то один файл, в котором всегда актуальные строки перевода. Чтобы использовать его как основу для создания перевода на очередной язык.
Например, если PO и MO файлы перевода размещаются в глобальную папку переводов, то мы не можем закинуть PO файл в программу и нажать «Обновить из кода», потому в PO файле скорее всего путь до файлов плагина будет неправильный (или его там вообще не будет) и строки перевода обновиться не смогут. В этом случае используется POT файл, который всегда должен лежать в папке плагина и при изменении кода в нем нужно обновлять строки перевода, так мы всегда будем иметь актуальные строки для перевода.
Повторюсь: если PO файл лежит в папке плагина, то POT файл не нужен, перевод можно создать из PO файла.
Подключение .mo файла перевода
Как подключить MO файл в плагине, уже есть в коде плагина выше. А тут я сделаю акцент на функциях WordPress для подключения этого файла. Функции:
load_plugin_textdomain( $domain, false, $plugin_rel_path ) Подключает MO файл из плагина. Обертка для load_textdomain() . Сначала ищет MO файл в общей папке переводов плагинов: /wp-content/language/plugins . Файл должен называться ДОМЕН_ПЕРЕВОДА-ЛОКАЛЬ.mo . load_muplugin_textdomain( $domain, $plugin_rel_path ) Подключает MO файл из MU плагина. Обертка для load_textdomain() . Сначала ищет MO файл в общей папке переводов плагинов: /wp-content/language/plugins . Файл должен называться ДОМЕН_ПЕРЕВОДА-ЛОКАЛЬ.mo . load_theme_textdomain( $domain, $path ) Подключает MO файл из темы. Обертка для load_textdomain() . Сначала ищет MO файл в общей папке переводов тем: /wp-content/language/themes . Файл должен называться ЛОКАЛЬ.mo (когда файл внутри темы) и ПАПКА_ТЕМЫ-ЛОКАЛ.mo (когда файл в общей папке). load_child_theme_textdomain( $domain, $path ) Подключает MO файл из дочерней темы. Обертка для load_theme_textdomain() . load_textdomain( $domain, $mofile ) Подключает MO файл из любого места (нужно указать полный путь до MO файла, вместе с названием файла).
Рассмотрим примеры подключения MO файлов.
Подразумевается, что код подключения будет расположен в основном файле плагина/темы или в файле, который находится в корневой директории плагина/темы. Если это не так, то __FILE__ нужно заменить на соответствующий путь.
Не обязательно подключать функции на хуки, но в примерах я все же сделал как рекомендуется.
Заметка: если файл перевода размещается в глобальной папке переводов, то эти функции можно не использовать. WordPress автоматически подключает файлы переводов из глобальной папки, опираясь на параметр Text Domain: в заголовке плагина.
Функций перевода
Как использовать функции перевода, уже есть в коде плагина выше. А тут я опишу каждую функцию (подробное описание читайте в описании функции).
__( $text, $domain ) Переводит указанный текст и возвращает его для обработки. _e( $text, $domain ) Переводит указанный текст и выводит его на экран. _x( $text, $context, $domain ) Переводит указанный текст с учетом указанного контекста и возвращает его для обработки. _ex( $text, $context, $domain ) Переводит указанный текст с учетом указанного контекста и выводит его на экран. _n( $single, $plural, $number, $domain ) Получает строку перевода единственного или множественного числа, ту которая соответствует указанному числу (1 комментарий, 2 комментария). _nx( $single, $plural, $number, $context, $domain ) Получает строку перевода единственного или множественного числа с учетом указанного контекста. _n_noop( $singular, $plural, $domain ) Функция пустышка. Аналог _n() . Используется когда нужно определить строки перевода для множественных числе, но использовать их где-то позднее в коде. Результат который возвразает функцию нужно обрабатывать функцией translate_nooped_plural(). Результат этой функции, например, удобно использовать в параметрах, когда мы заранее не знаем какое будет число и нужно сделать перевод позднее. _nx_noop( $singular, $plural, $context, $domain ) Тоже что _n_noop(), только с контекстом. esc_attr__( $text, $domain ) Перевод для значений атрибутов HTML тегов. Сокращение для esc_attr( __() ) . esc_attr_e( $text, $domain ) Тоже что esc_attr__() , только сразу выводит результат на экран. esc_html__( $text, $domain ) Перевод текста в котором могут быть HTML теги. Сокращение для esc_html( __() ) . esc_html_e( $text, $domain ) Тоже что esc_html__() , только сразу выводит результат на экран.
Ошибки при использовании функций перевода
#1 Нельзя использовать переменные/константы в параметрах функций перевода
Потому что программы умеют парсить только строки, но не переменные. Программы не анализируют что там в указанной переменной, а просто сканируют код как текст и вытаскивают строки для перевода.
#2 Не используйте HTML в строках перевода (если это возможно)
Например, если указать
В 90% случаев HTML теги можно и нужно выносить за пределы строки перевода, рассмотрим несколько примеров:
#3 Не делите фразу на отдельные слова
При переводе строк в программе по возможности должно быть понятно о чем речь. Но вот если разделить строку на части, отдельные слова могут стать не понятными:
#4 Не оставляйте пробелы в конце/начале строки (если это возможно)
При переводе пробелы на концах часто не заметны и их можно пропустить, в итоге после перевода будет «залипуха». Поэтому, лучше выносить пробелы в код.
Перевод множественного числа
В плагине выше, уже есть пример как переводить строки где используются числа. Тут я сделаю на этом акцент.
Для перевода строк с числами, когда нужно получить разные переводы в зависимости от числа, в WordPress используется функция _n( $single, $plural, $number, $domain ) или _nx() (с контекстом). Она вернет разный вариант строки в зависимости от указанного числа. Например:
Однако, чтобы все это правильно работало нужно:
В настройках .po файла правильно указать форму множественного числа. Мы её указали в параметре Plural-Forms :
В настройках .po файла правильно указать шаблоны поиска функций:
- _n:1,2 — для функции _n() . 1 и 2 — это параметры функции для множ. и единс. числа.
- _nx:1,2,4c — для функции _nx() . Тут 4с — значит что 4 параметр функции это строка контекста.
При переводе правильно перевести строки. Для русского языка нужно указать три варианта для перевода одной строки.
В заключение
Размещение файла перевода в глобальной папке
В WordPress есть общая папка для файлов перевода: /wp-content/languages . В ней лежат файлы перевода самого WordPress, а также могут лежать файлы переводов тем и плагинов (это работает в WordPress по умолчанию).
Все функции подключения MO файлов (кроме load_textdomain() ), сначала проверяют наличие файла перевода в общей папке, и только потом ищут его в папке плагина или темы. Это чем-то похоже на иерархию файлов шаблона, только тут иерархия файлов перевода.
Общая папка переводов для:
- плагинов /wp-content/languages/plugins/ДОМЕН_ПЕРЕВОДА-ЛОКАЛЬ.mo .
- тем /wp-content/languages/themes/ДОМЕН_ПЕРЕВОДА-ЛОКАЛЬ.mo .
В такие общие папки, например, загружается и обновляется перевод плагина, который находится в каталоге плагинов WordPress. Вы наверное видели переведенные плагины, в которых нет файлов перевода (это как раз эта тема). Как я писал в начале статьи плагины из каталога можно переводить через сайт translate.wordpress.org.
Заметка: если файл перевода есть в глобальной папке, то в плагине его подключать через функции load_(plugin/theme)_textdomain() не обязательно! WordPress автоматически его подключит, опираясь на параметр Text Domain: в заголовке плагина.
Термины связанные с переводом
Некоторые термины, которые нужно знать. Это самые основные (сокращением этих терминов в WordPress названы некоторые функции и хуки):
Интернационализация (internationalization — i18n) — процесс изменения программного обеспечения, чтобы оно не было привязано к одному языку. Т.е. это весь комплекс функций и классов ядра WordPress позволяющий переводить сайт на разные языки.
Локализация (localization — l10n) — процесс добавления соответствующих ресурсов в ваше программное обеспечение для поддержки определенного языка/локали. Т.е. это сам процесс перевода на разные языки.
Плагин для перевода
Loco Translate — отличный плагин для создания перевода (.mo файла). Этот плагин полностью заменяет программу Poedit. Он позволяет создавать переводы для чего угодно тем, плагинов или отдельных MU плагинов. Плагин можно активировать, перевести что нужно и деактивировать чтобы не «мешался».