WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

load_plugin_textdomain() WP 1.5

Подключает .mo файл перевода из указанной папки. Не работает с MU плагинами.

.mo файл должен называться: ДОМЕН_ПЕРЕВОДА-ЛОКАЛЬ.mo, где локаль это код языка (см. get_locale()). Например, если ДОМЕН_ПЕРЕВОДА = my-plugin и выбран русский язык ЛОКАЛЬ = ru_RU, то файлы должны назваться: my-plugin-ru_RU.mo и my-plugin-ru_RU.po.

Вызывать функцию рекомендуется через хук plugins_loaded.

С версии 4.6. функция сначала пытается загрузить .mo файл с папки WP_LANG_DIR/plugins/ обычно это /wp-content/language/plugins.

Для подключения перевода темы, используйте load_theme_textdomain().

Работает на основе: load_textdomain()
Хуки из функции
Возвращает

true/false. Вернет false, если .mo файл не существует по указанному пути. В остальных случаях функция вернет true.

Использование

load_plugin_textdomain( $domain, $deprecated, $plugin_rel_path );
$domain(строка) (обязательный)
Уникальный идентификатор для получения строки перевода.
По умолчанию: нет
$deprecated(строка)
Отмененный аргумент, работает до версии 2.7. Путь подобный ABSPATH, до .mo файла.
По умолчанию: false
$plugin_rel_path(строка)

Путь до каталога .mo файла относительно WP_PLUGIN_DIR.

Если путь не указан, то им будет корневая директория плагинов WP_PLUGIN_DIR. Т.е. путь до файла будет такой: WP_PLUGIN_DIR/domain-ru_RU.mo

По умолчанию: false

Примеры

#1. Регистрация файла перевода для плагина

Подразумевается, что этот код будет расположен в основном файле плагина или в файле, который находится в корневой директории плагина. Если это не так, то __FILE__ нужно заменить на соответствующий путь.

Файл перевода должен лежать в каталоге плагина и должен называться: my-plugin-ru_RU.mo.

add_action( 'plugins_loaded', 'myplugin_init' );
function myplugin_init(){
	load_plugin_textdomain( 'my-plugin', false, dirname( plugin_basename( __FILE__ ) ) ); 
}

#1.2 Если мы хотим расположить файл перевода .mo в подпапку languages:

add_action( 'plugins_loaded', 'myplugin_init' );
function myplugin_init() {
	 load_plugin_textdomain( 'my-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
}

#2. Регистрация файла перевода для MU плагина

В WP есть специальная функция load_muplugin_textdomain().

Список изменений

С версии 1.5.0 Введена.
С версии 4.6.0 The function now tries to load the .mo file from the languages directory first.

Код load plugin textdomain: wp-includes/l10n.php WP 5.2.3

<?php
function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path = false ) {
	/**
	 * Filters a plugin's locale.
	 *
	 * @since 3.0.0
	 *
	 * @param string $locale The plugin's current locale.
	 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
	 */
	$locale = apply_filters( 'plugin_locale', determine_locale(), $domain );

	$mofile = $domain . '-' . $locale . '.mo';

	// Try to load from the languages directory first.
	if ( load_textdomain( $domain, WP_LANG_DIR . '/plugins/' . $mofile ) ) {
		return true;
	}

	if ( false !== $plugin_rel_path ) {
		$path = WP_PLUGIN_DIR . '/' . trim( $plugin_rel_path, '/' );
	} elseif ( false !== $deprecated ) {
		_deprecated_argument( __FUNCTION__, '2.7.0' );
		$path = ABSPATH . trim( $deprecated, '/' );
	} else {
		$path = WP_PLUGIN_DIR;
	}

	return load_textdomain( $domain, $path . '/' . $mofile );
}

Cвязанные функции

Из метки: textdomain (файлы переводов po mo)

Еще из метки: localize (l10n i18n локализация Internationalization)

Еще из раздела: Локализация

8 комментов
  • А как переводить результат работы плагина? Я разобрался, что данным способом потом мы открываем потом .pot файл и в нем видим поля, которые доступны для перевода. В моем случае - это все поля, а точнее label полей и прочие названия, описания которые я вижу в админке. Но в админке плагином я создаю свои поля, в которые задаю названия кнопок допустим, label и прочие. От сюда вопрос, как переводить именно результат работы плагина, т.е. именно то, что он выводит на страницу?

    Ответить3.4 года назад #
    • Kama7600

      У меня нет статьи на эту тему, но в сети их хватает...

      Если коротко то так. В плагине используешь функции __() и _e(). Далее создаешь файлы переводов с помощью poedit или плагинов. Далее подключаешь эти файлы с помощью этой функции. И все, перевод готов...

      Ответить3 года назад #
  • @ вася

    Если расположить файл перевода плагина в дочерней теме и подключить его в файле functions.php (который в дочерней теме), то получается плагин при загрузке будет брать этот самый перевод?

    Я разместил код в файле functions.php, но перевод не сработал. В админке во всяком случае не видно перевода.

    add_action( 'plugins_loaded', 'myplugin_init' );
    function myplugin_init() {
    	 load_plugin_textdomain( 'my-plugin', false, get_stylesheet_directory_uri().'/languages/' );
    }
    1
    Ответить8 мес назад #
    • Kama7600
      add_action( 'plugins_loaded', 'myplugin_init' );

      Это хук работает для плагинов, если использовать его в файле functions.php то код просто не будет работать вообще. В этом случае нужно использовать хук after_setup_theme:

      add_action( 'after_setup_theme', 'mytheme_load_plugin_textdomain' );
      function mytheme_load_plugin_textdomain() {
      	 load_plugin_textdomain( 'my-plugin', false, get_stylesheet_directory_uri().'/languages/' );
      }
      Ответить8 мес назад #
      • @ elephant3 work-click.ru

        Вы уверены, что так можно подключить файл перевода плагина из дочерней темы?! Лично у меня не выходит(функция load_plugin_textdomain() возвращает false).

        Ответить8 мес назад #
        • Kama7600

          Да, должен включить, если перенести файл перевода в тему, в папку languages.

          Ответить8 мес назад #
          • @ elephant3 work-click.ru

            У меня подключается только из глобальной папки файл .mo плагина. Из дочерней ни в какую не хочет.

            Ответить8 мес назад #
        • Kama7600

          Нет, код неправильный, он работать не будет, не знаю почему я сразу не обратил внимания...

          В файле functions.php нужно использовать такой код:

          add_action( 'after_setup_theme', 'mytheme_load_plugin_textdomain' );
          function mytheme_load_plugin_textdomain() {
          	load_textdomain( 'my-plugin', get_stylesheet_directory() . '/languages/my-plugin-'. determine_locale() . '.mo' );
          }

          При этом MO файл перевода должен находится в папке темы languages и иметь название my-plugin-ru_RU.mo

          Ответить7 мес назад #
Здравствуйте, !     Войти . Зарегистрироваться