Как подготовить перевод плагина WordPress?

19

Как лучше всего создать плагин, который готов к переводу?

Его не нужно переводить с самого начала, но его нужно легко перевести, чтобы коллеги-разработчики из разных культур могли участвовать в процессе локализации плагина.

Набиль Кадими
источник

Ответы:

38

1. Пишите с учетом локализации

Не используйте echoили print()для вывода текста, вместо этого используйте функции WordPress __()и _e():

/** Not localization friendly */
echo "Welcome to my plugin";    
// OR
print("Welcome to my plugin");

/** Localization friendly */
_e('Welcome to my plugin', 'my-plugin');
// OR
$my_text = __('Welcome to my plugin', 'my-plugin');
echo $my_text;

_e()и __()предоставит перевод - на текущем языке - текста, представленного в качестве первого параметра. _e()выведет текст, тогда как __()вернет его.

Второй параметр - это текстовый домен , вы будете использовать его, чтобы сообщить WordPress, что текст, предоставленный в качестве первого параметра, принадлежит этому плагину, вы можете использовать любое имя, которое хотите, но я предпочитаю использовать то же имя, которое я использовал для плагина Файл каталога, я считаю его более интуитивно понятным.

Как вывести динамический текст, например: «Hello <username>»?

С __()и sprintf():

/** Get the username */
$username = 'Magictrick';

/** Not localization friendly */
echo "Hello $username";     

/** Localization friendly */
printf(__('Hello %s', 'my-plugin'), $username);
// OR 
$my_text = sprintf(__('Hello %s', 'my-plugin'), $username);
echo $my_text;

2. Подготовьте файлы .pot / .po / .mo

Определения

  • Файл .pot : предоставлен в ваше распоряжение разработчиком плагина и используется в качестве отправной точки для создания новых переводов, WordPress его не использует.
  • Файл .po : это файл перевода, который вы или кто-то еще начали, и, возможно, завершенный, WordPress не использует его.
  • Файл A.mo : автоматически создается Poedit при каждом сохранении файла .po. Все, что вы можете сделать с этими файлами, это загрузить или повторно загрузить их при создании или обновлении файла .po. WordPress получает переводы из .mo файлов .

Откройте Poedit и создайте новый каталог (Файл ›Новый Catallog ...) со следующими настройками:

  • Информация о проекте: Используйте вашу (или вашу команду) информацию, язык и страна должны соответствовать языку вашего плагина по умолчанию
  • Дорожки:
    • Базовый путь: .
    • Пути: удалить все и добавить .., (мы будем хранить языковой файл в подкаталоге плагина под названием languages)
  • Ключевые слова: удалить все, добавить __и_e

Сохраните каталог как и отсканируйте файлы плагинов на предмет переводимого текста, нажав кнопку обновления. Когда обновление будет завершено, закройте этот каталог, вам не нужно будет обновлять этот файл, если вы не добавите в ваш плагин новые переводимые строки (т.е. вложенные в или )./my_wordpress_blog/wp-content/plugins/my-plugin/languages/my-plugin.pot__()_e()

Теперь давайте создадим первый перевод (я буду использовать fr_FR):

Используя Podeit , создайте каталог из файла POT (Файл ›Новый каталог из файла POT ...) :

  • Информация о проекте: используйте вашу (или вашу команду) информацию, измените язык и страну , я буду использовать французский и Францию
  • Пути: не меняются
  • Ключевые слова: не смейся

Сохраните каталог как . Переведите некоторые или все строки, снова сохраните файл .po, загрузите файлы .po и .mo./my_wordpress_blog/wp-content/plugins/my-plugin/languages/my-plugin-fr_FR.po

Обратите внимание, что всякий раз, когда вы сохраняете файл .po, создается файл .mo с тем же именем, имя файла .po имеет решающее значение , оно состоит из конкатенации текстового домена плагина (my-plugin) и языкового стандарта ( fr_FR), всегда называйте свои .po файлы для плагинов, например: [textdomain] - [locale] .po , вот несколько примеров:

  • Итальянский / Италия: wpcf7-it_IT.po
  • Португальский / Бразилия: wpcf7-pt_BR.po
  • Арабский: wpcf7-ar.po... Да!

Всякий раз, когда плагин обновляется новым текстом, обновляйте po-файл, переводите новые строки и повторно загружайте файлы .po и .mo

3. Поручите плагину загрузить переведенный текст для текущего языка

Где-то в вашем плагине вы должны указать WordPress использовать ваш файл .mo, вы можете сделать это, используя этот код в начале вашего файла плагина:

function my_plugin_init() {
  load_plugin_textdomain( 'my-plugin', false, 'my-plugin/languages' );
}
add_action('init', 'my_plugin_init');

Замените my-pluginна имя вашего плагина в 1-м и 3-м параметре load_plugin_textdomainфункции.

4. Проверьте и устраните неполадки

Некоторые причины могут не работать:

  • Строки не импортируются в файл .pot или .po
    • → Неправильные настройки каталога (путь или ключевые слова или оба)
  • Текст не переведен на сайте WordPress
    • → .mo файл для этого языка отсутствует или имеет неправильное имя файла
    • → Текстовый домен не используется (заменить _e('my text')на _e('my text', 'my-plugin'))
    • → Текстовый домен не загружен (используйте приведенный выше пример с правильными параметрами, WP не предупредит вас об ошибках)
Набиль Кадими
источник
3
+1 Хорошая рецензия :) Взгляните на эту статью: Как правильно загрузить языковые файлы WordPress , « Практические рекомендации по облегчению загрузки языковых файлов в WordPress ». :::::: Glotpress и полиглотов группа может быть стоит упомянуть тоже.
brasofilo
Спасибо за эту хорошую инструкцию! Стоит отметить, что load_plugin_textdomain () необходимо вызывать в каждом методе, где вы используете _e () и __ ()
Андреас
2

Набиль довольно полон ответа, но есть несколько вариантов:

  1. Ваш плагин находится в хранилище плагинов WordPress.org

  2. Вы хотите, чтобы ваш плагин работал только с WordPress 4.6 или выше.

Шаги следующие:

  1. В файле readme.txt вашего плагина добавьте Requires at least: 4.6. См. Https://developer.wordpress.org/plugins/wordpress-org/how-your-readme-txt-works/

  2. если это не так, загрузите ваш плагин в хранилище плагинов WordPress. Смотрите https://wordpress.org/plugins/developers/add/ .

  3. Найдите слаг / текстовый домен вашего плагина. Для этого перейдите на страницу вашего плагина в хранилище плагинов WordPress. URL будет похож на https://wordpress.org/plugins/your-plugin-slug/ . Последняя часть URL, «ваш-плагин-слаг», является слагом вашего плагина. Это то, что вы используете для текстовой области функций перевода.

  4. Используйте функции перевода WordPress в вашем плагине (например __e(‘hello’, ‘my-plugin-domain’);). Просто убедитесь, что вы используете правильный текстовый домен плагина, полученный на предыдущем шаге. См. Https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/ для получения дополнительной информации.

Если вы выполните описанные выше шаги, WordPress позаботится о:

  • Разбор вашего плагина для всех переводимых строк (не нужно устанавливать и запускать Poedit или что-то еще)
  • Сделайте так, чтобы любой мог с легкостью размещать переводы вашего плагина на translate.wordpress.org (нет необходимости иметь свой собственный сайт, посвященный переводу вашего плагина, или иметь собственный процесс для переводчиков, чтобы отправлять вам свои переводы)
  • когда кто-то использует ваш плагин, WordPress позаботится о том, чтобы он проверял, переводит ли он на свой язык, и, если да, показывает его на своем языке (им и вам не нужно загружать файлы перевода на свой веб-сайт).

(Ответ из моего поста здесь: https://cmljnelson.blog/2019/01/01/the-really-lazy-way-to-translate-a-wordpress-plugin/ )

thespacecamel
источник
Я не уверен, почему это было понижено. Это то, что я сделал, чтобы wordpress.org/plugins/print-my-blog был готов к переводу (и плагин был успешно переведен)
thespacecamel
Означает ли это, что если плагин / тема не находится в хранилище плагинов WordPress, а использует там текстовый домен плагина, WordPress загрузит неправильные файлы перевода?
Бодо
Хороший вопрос @ бодо. Если плагин указывает на использование текстового домена другого плагина, который находится в репозитории wp.org, я думаю, что WordPress с радостью будет использовать файлы перевода плагина wp.org. Но извините, я не уверен.
thespacecamel