7 декабря 2018 в 20:14
на сайт, и вы сможете вступить в группу.
Вы сможете подписаться на выход новых материалов группы.
Вы сможете подписаться на новые комментарии к выбранной записи группы.

WordPress 5.0 и не работающая функция перевода js строк wp_set_script_translations. Исправляем

Несколько часов провел заставляя работать функцию wp_set_script_translations()

В вордпресс 5.0 появилась новая функция wp_set_script_translations() - она должна устанавливать строки для перевода js-строк.

Предыстория такова: после обновления на вордпресс 5.0 в его новом редакторе блоков у моего блока исчез перевод. До этого под руководством Gutenberg переводы из js подхватывались и все работало как часы.

Мой гутенберг блок поддерживал локализацию - работало всё примерно так:

function my_localize_js(){
    $locale  = gutenberg_get_jed_locale_data( 'ogs-spoiler' );

    // добавляем в объект JS wp.i18n.setLocaleData.
    $content = 'wp.i18n.setLocaleData(' . json_encode( $locale ) . ', "ogs-spoiler" );';

    // и инлайним
    wp_script_add_data( 'ogs_script', 'data', $content );
add_action('init', 'my_localize_js');

Вначале я получил фаталити ошибку:

PHP Fatal error: Uncaught Error: Call to undefined function gutenberg_get_jed_locale_data()

Понятно дело - у меня уже не гутенберг редактор и эта функция при отключении гутенберга исчезла.

Но что там пишет команда вордпресс по локализации js?

Да все норм: они говорят радостно - мы умеем js! Ссылка

Увы у меня локализация внутри js блока умерла и не реанимировалась. Функция wp_set_script_translations() возвращала true - значит всё прошло успешно. Но результата я не увидел. В js скрипте я в console.log вставлял свою строку:

console.log(__( 'A custom block for displaying little spoiler.', 'ogs-spoiler' ));

но видел в консоли браузера английский вариант. Локаль в ВП у меня была русской - в этом ошибки нет.

При регистрации скрипта у меня тоже были все зависимости к wp-i18n:

wp_register_script(
    'ogs_script',
    plugins_url('dist/bundle.js', __FILE__),
    array( 'wp-editor', 'wp-blocks', 'wp-i18n', 'wp-element' )
);

- да и как оно тогда раньше в гутенберге работало 🙂

Что случилось при переходе с гутенберга на вордпресс 5.0 и почему "всё пропало" - я уже не знал куда смотреть и что дебажить.

Почти опустив руки и не найдя в гугле решения - ведь функция wp_set_script_translations() молодая и по ней результатов выдачи на 1.5 страницы:

не популярный запрос

Я решил заглянуть под капот функции гутенберга gutenberg_get_jed_locale_data() - здесь она
Как видим, там всё просто - получает доступные переводы и локаль и готовит нужным образом массив.
Ее я и взял за основу - переименовав:

function otfm_get_jed_locale_data( $domain ) {
	$translations = get_translations_for_domain( $domain );
	$locale = array(
		'' => array(
			'domain' => $domain,
			'lang'   => is_admin() ? get_user_locale() : get_locale(),
		),
	);
	if ( ! empty( $translations->headers['Plural-Forms'] ) ) {
		$locale['']['plural_forms'] = $translations->headers['Plural-Forms'];
	}
	foreach ( $translations->entries as $msgid => $entry ) {
		$locale[ $msgid ] = $entry->translations;
	}
	return $locale;
}

В первом коде переименуйте на 2-й строке и переводы у вас зацепятся.

Новый редактор блоков мне понравился. Я всеми фибрами за него. Но гугл выдача не спасает. Надеюсь моя подсказка вам поможет в похожей ситуации.

4 комментария

      1. В заключение хочу сказать спасибо! Действительно информации по данной функции 0. И ни один из советов офф. документации вордпресс по локализации, интернационализации, самой функции и пр. статей не помогли.
        Мне пришлось потратить более 6 часов на поиски, пока не вернулся к данной статье, которую нашел фактически сразу.
        У меня подтянулись переводы в скрипты после добавления my_localize_js(); на этапе 'wp_enqueue_scripts', главное указать свои домены и handle в эту функцию, даже wp_set_script_translations() не нужен. По хорошему это все должен поддерживать wpml, он и пытается создать что то похожее в папке wp-content\languages\wpml, но почему то создает только оболочку с правильным названием, но без перевода. Пока буду пользоваться этим способом, надеюсь в скором времени все заработает "из коробки". Автору ещё раз огромное спасибо за рабочий вариант!

        1

Оставьте комментарий

Авторизация
*
*
Регистрация
*
*
*
Настоящим подтверждаю, что я ознакомлен и согласен с условиями политики конфиденциальности
Генерация пароля
Закрыть