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-й строке и переводы у вас зацепятся.
Новый редактор блоков мне понравился. Я всеми фибрами за него. Но гугл выдача не спасает. Надеюсь моя подсказка вам поможет в похожей ситуации.
Спасибо. Но не понятно что переименовать во 2 строке? Коды идентичны тут и по ссылке.
Разве функция в 1-м коде
gutenberg_get_jed_locale_data()
и моя замена:otfm_get_jed_locale_data()
это одно и тоже?Функцией
otfm_get_jed_locale_data()
вы будете переводить, вот её и впишите на 2-й строкеДа, пардон, я понял предложение буквально, как отсылку к "первому" коду на гитхабе.
В заключение хочу сказать спасибо! Действительно информации по данной функции 0. И ни один из советов офф. документации вордпресс по локализации, интернационализации, самой функции и пр. статей не помогли.
Мне пришлось потратить более 6 часов на поиски, пока не вернулся к данной статье, которую нашел фактически сразу.
У меня подтянулись переводы в скрипты после добавления
my_localize_js();
на этапе'wp_enqueue_scripts'
, главное указать свои домены и handle в эту функцию, дажеwp_set_script_translations()
не нужен. По хорошему это все должен поддерживать wpml, он и пытается создать что то похожее в папке wp-content\languages\wpml, но почему то создает только оболочку с правильным названием, но без перевода. Пока буду пользоваться этим способом, надеюсь в скором времени все заработает "из коробки". Автору ещё раз огромное спасибо за рабочий вариант!