WordPress как на ладони
Наставник Трепачёв Д.П., phphtml.net wordpress jino

load_textdomain() WP 1.5.0

Подключает домен и .mo файл в данные локализации.

Если файл подключен успешно, то его данные будут размещены в глобальную переменную $l10n:

$l10n[ $domain ] = & $mo;

Если указанный домен уже существует в данных, то подключаемые строки локализации объединяться с имеющимися. См. метод $mo->merge_with().

Файл перевода должен быть подключен до того, как он будет использован. Поэтому load_textdomain() принято вызывать во время события plugins_loaded.

Для перевода любой строки в WordPress, у строки должен быть перевод, а чтобы он был нужно подключить данные перевода, среди которых будет перевод нужной строки. Подключить данные перевода, а именно загрузить .mo файл перевода в глобальные данные локализации можно с помощью:

Используется в: load_theme_textdomain(), load_plugin_textdomain().
Хуки из функции:
Возвращает

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

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

load_textdomain( $domain, $mofile )
$domain(строка) (обязательный)
Уникальный идентификатор, по которому, для перевода строки, в дальнейшем можно будет обращаться.
$mofile(строка) (обязательный)
Абсолютный путь до .mo файла (home/site.ru/wp-content/plugins/my-plugin.mo).

Примеры

#1 Перевод строки в WordPress

В этом примере переведем строку __('book', 'domain'). Подразумевается, что .mo файл для перевода уже создан и в нем есть данные для перевода этой строки:

// здесь .mo файл должен лежать в папке lang, которая находится в папке где находится сам файл в котором вызывается эта строка
// Подключаем имеющийся файл .mo (название файла: ru_RU.mo или другое, зависит от локали)
add_action('plugins_loaded', 'load_my_textdomain');
function load_my_textdomain(){
	$mo_file_path = dirname(__FILE__) . '/lang/'. get_locale() . '.mo';
	load_textdomain('mytranslate', $mo_file_path );
}

Теперь, допустим в теме, используем:

<?php _e('book', 'mytranslate'); ?>

Выведет "книга".

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

<?php
function load_textdomain( $domain, $mofile ) {
	global $l10n, $l10n_unloaded;

	$l10n_unloaded = (array) $l10n_unloaded;

	/**
	 * Filters whether to override the .mo file loading.
	 *
	 * @since 2.9.0
	 *
	 * @param bool   $override Whether to override the .mo file loading. Default false.
	 * @param string $domain   Text domain. Unique identifier for retrieving translated strings.
	 * @param string $mofile   Path to the MO file.
	 */
	$plugin_override = apply_filters( 'override_load_textdomain', false, $domain, $mofile );

	if ( true == $plugin_override ) {
		unset( $l10n_unloaded[ $domain ] );

		return true;
	}

	/**
	 * Fires before the MO translation file is loaded.
	 *
	 * @since 2.9.0
	 *
	 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
	 * @param string $mofile Path to the .mo file.
	 */
	do_action( 'load_textdomain', $domain, $mofile );

	/**
	 * Filters MO file path for loading translations for a specific text domain.
	 *
	 * @since 2.9.0
	 *
	 * @param string $mofile Path to the MO file.
	 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
	 */
	$mofile = apply_filters( 'load_textdomain_mofile', $mofile, $domain );

	if ( !is_readable( $mofile ) ) return false;

	$mo = new MO();
	if ( !$mo->import_from_file( $mofile ) ) return false;

	if ( isset( $l10n[$domain] ) )
		$mo->merge_with( $l10n[$domain] );

	unset( $l10n_unloaded[ $domain ] );

	$l10n[$domain] = &$mo;

	return true;
}

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

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

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

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

load_textdomain 5 комментариев
  • Максим
    @

    Пока никак не могу понять в чем разница между load_textdomain() и load_plugin_textdomain() если использовать их для локализации например плагина. В некоторых плагинах встречал вызов обеих функций по очереди, в некоторых только одну функцию вызывают

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

      load_plugin_textdomain() - это обертка для функции load_textdomain(). Её рекомендуется использовать для плагинов, чтобы был единый стандарт подключаемых файлов перевода.

      Но load_textdomain() тоже можно в плагинах юзать, просто получится немного не по стандарту WP. А это и не всегда надо. Мне лично load_plugin_textdomain() не очень нравится...

      Ответитьгод назад #
      • Максим
        @

        Я просто не мог понять почему в некоторых плагинах вызывают эти функции по очереди, в том же woocommerce

        load_textdomain( 'woocommerce', WP_LANG_DIR . '/woocommerce/woocommerce-' . $locale . '.mo' );
        load_plugin_textdomain( 'woocommerce', false, plugin_basename( dirname( __FILE__ ) ) . '/i18n/languages' );

        правда потом уже нашел информацию, что если для одного и того же $domain прописано несколько mo-файлов (как раз пример когда в плагинах используют сначала одну функцию, потом другую)
        то будет использоваться первый найденный перевод (таким образом можно дополнять перевод который к примеру лежит в WP_LANG_DIR но в нем что то не переведено, свои переводом который будет например лежать в
        plugin_basename( dirname( __FILE__ ) ) .'languages'

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

Здравствуйте, !

Ваш комментарий