Вопрос или проблема
Я пытаюсь локализовать свой плагин и блок Gutenberg, на стороне PHP перевод выполнен, но на стороне JS нет никакого успеха.
Я воспользовался официальным руководством, несколькими другими блога постами, решениями, опубликованными в этом посте вставьте описание ссылки здесь и этом вставьте описание ссылки здесь, но ничего. Даже с самым простым блоком.
Может быть, я что-то упускаю…
Есть идеи? Заранее спасибо.
Версия WordPress: 6.1.1 , версия PHP: 8.0.28 , версия WP-CLI: 2.7.1
РЕДАКТИРОВАНО в соответствии с рекомендациями других ответов: все еще не работает
Моя структура:
/my-block/
/build/
- index.js
- index.js.map
- index.asset.php
/src/
- index.js
/languages/
- my-block-es_ES.mo
- my-block-es_ES.po
- my-block-es_ES.pot
- my-block-es_ES-1fdf421c05c1140f6d71444ea2b27638.json
- block.json
- my-block.php
- package.json
- ...
Основной файл PHP my-block.php:
<?php
/**
* Имя плагина: Мой Блок
* Требует как минимум: 6.1
* Требует PHP: 7.0
* Версия: 1
* Текстовый домен: my-block
*/
function create_block_my_block_block_init() {
register_block_type( __DIR__ );
// Загружаем MO файлы для PHP.
load_plugin_textdomain( 'my-block', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
}
add_action( 'init', 'create_block_my_block_block_init' );
function script_translations(){
// Загружаем JSON файлы для JS - это необходимо, если используется пользовательский путь к языкам!!
wp_set_script_translations( 'my-block-local-edit-script', 'my-block', plugin_dir_path( __FILE__ ) . '/languages' );
}
add_action( 'wp_enqueue_script', 'script_translations' );
block.json
{
"apiVersion": 2,
"title": "Тест заголовка блока Gutenberg",
"name": "my-block/local",
"category": "layout",
"textdomain": "my-block",
"icon": "universal-access-alt",
"editorScript": "file:build/index.js"
}
И src/index.js, который компилируется в build/index.js
/**
* Зависимости WordPress
*/
import { registerBlockType } from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';
// Регистрируем блок
registerBlockType('my-block/local', {
title: __('Мой локальный блок', 'my-block'),
edit: function () {
return <p> {__('Привет, мир', 'my-block')} (из редактора)</p>;
},
save: function () {
return <p> {__('Привет, мир', 'my-block')} (с фронтенда) </p>;
},
});
В вашем коде есть 2 основные проблемы:
-
Как указано в моем ответе, формат дескриптора скрипта – это
<имя блока с замененными слешами на дефисы>-editor-script
, поэтому, поскольку имя вашего блокаmy-block/local
, дескриптор скрипта — этоmy-block-local-editor-script
, а неmy-block-local-edit-script
. -
Правильное имя действия –
wp_enqueue_scripts
(обратите внимание на “s”), а неwp_enqueue_script
. Однакоwp_enqueue_scripts
не сработает, потому что это для фронтенда (неадминская часть). Для использования в админке, например, на экране редактирования постов наwp-admin/post.php
, вы можете использовать либоadmin_enqueue_scripts
, либо хук, специфичный для блока/редактора Gutenberg, такой какenqueue_block_editor_assets
. -
Ваш JSON файл перевода также должен использовать
dfbff627e6c248bcb3b61d7d06da9ca9
, который является значениемmd5( 'build/index.js' )
(без./
). Таким образом, имя файла должно бытьmy-block-es_ES-dfbff627e6c248bcb3b61d7d06da9ca9.json
🙂Это значение/хеш также будет получен, когда вы выполните это через WP-CLI:
wp i18n make-json my-block-<locale>.po ./ --no-purge
после того, как вы выполнитеcd languages
в каталоге вашего плагина.
Как исправить проблемы 1 и 2:
-
Измените строку
wp_set_script_translations()
(это строка 20 в вашем коде) на:wp_set_script_translations( 'my-block-local-editor-script', // дескриптор скрипта 'my-block', // текстовый домен plugin_dir_path( __FILE__ ) . 'languages' // путь к вашим файлам перевода );
Или вы можете использовать
generate_block_asset_handle()
для генерации дескриптора скрипта:$script_handle = generate_block_asset_handle( 'my-block/local', 'editorScript' ); wp_set_script_translations( $script_handle, 'my-block', plugin_dir_path( __FILE__ ) . 'languages' );
-
Измените
add_action( 'wp_enqueue_script', 'script_translations' );
(строка 22 в вашем коде) на:add_action( 'enqueue_block_editor_assets', 'script_translations' ); // Это также работает: //add_action( 'admin_enqueue_scripts', 'script_translations' ); //add_action( 'init', 'script_translations' );
Примечание о использовании
init
: Вызовregister_block_type()
будет автоматически и немедленно регистрировать скрипт редактора блока — смотритеregister_block_script_handle()
, так чтоinit
можно использовать для установки переводов скриптов, если он вызывается после вызоваregister_block_type()
.
Я создал блок, и перевод работает нормально через PHP и JS, но только в бэкенде, так ли это? Есть ли способ сделать так, чтобы это также работало на фронтенде?
Я использовал block.json
/**
* Регистрирует блок, используя метаданные, загруженные из файла `block.json`.
* Закулисно, он также регистрирует все активы, чтобы их можно было добавить
* через редактор блока в соответствующем контексте.
*
* @see https://developer.wordpress.org/reference/functions/register_block_type/
*/
function luxuryconcept_portfolio_block_init() {
register_block_type( __DIR__ . '/build' );
}
add_action( 'init', 'luxuryconcept_portfolio_block_init' );
/**
* Перевод JS файла для блока Gutenberg
* @see JSON файлы в папке плагина /languages
* @return void
*/
function script_translations() {
$script_handle = generate_block_asset_handle( 'luxuryconcept/portfolio', 'editorScript' );
wp_set_script_translations( $script_handle, 'luxuryconcept-portfolio', plugin_dir_path( __FILE__ ) . 'languages' );
}
add_action( 'enqueue_block_editor_assets', 'script_translations' );
Ответ или решение
Локализация блока Gutenberg в WordPress: Пошаговое руководство
Если вы разрабатываете плагин для WordPress и хотите локализовать блоки Gutenberg, это может потребовать некоторых дополнительных шагов для обеспечения правильной работы как с PHP, так и с JavaScript. В этом руководстве мы рассмотрим основные ошибки, которые могут возникнуть при локализации, и как их исправить.
Проблема с локализацией JavaScript
На основании вашего описания, вы успешно локализовали часть PHP, но у вас проблемы с JavaScript. Давайте разберем основные ошибки и их решения.
1. Ошибочный хендл скрипта
Вы указали, что используете следующий хендл скрипта:
'my-block-local-edit-script'
Однако, для блоков Gutenberg должен быть использован хендл в формате:
my-block-local-editor-script
Если ваше имя блока my-block/local
, то правильным хендлом для скрипта будет:
'my-block-local-editor-script'
2. Неправильное использование хуков
Вы используете add_action( 'wp_enqueue_script', 'script_translations' );
. Однако, правильным вариантом будет использовать один из следующих хуков:
enqueue_block_editor_assets
— для редактора блока в админке.admin_enqueue_scripts
— общий хук для администратора.
Таким образом, корректная строка будет выглядеть так:
add_action( 'enqueue_block_editor_assets', 'script_translations' );
3. Неправильный путь к JSON-файлу локализации
Ваш JSON-файл локализации должен использовать правильное имя, основанное на хеше файла, который вы собираете. Например, файл должен называться как my-block-es_ES-dfbff627e6c248bcb3b61d7d06da9ca9.json
, где dfbff627e6c248bcb3b61d7d06da9ca9
— это MD5-хеш вашего build/index.js
.
Пример кода
Ваш окончательный код может выглядеть следующим образом:
PHP-файл плагина:
/**
* Plugin Name: My Block
* Requires at least: 6.1
* Requires PHP: 7.0
* Version: 1
* Text Domain: my-block
*/
function create_block_my_block_block_init() {
register_block_type( __DIR__ );
// Загружаем MO файлы для PHP.
load_plugin_textdomain( 'my-block', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
}
add_action( 'init', 'create_block_my_block_block_init' );
function script_translations() {
$script_handle = generate_block_asset_handle( 'my-block/local', 'editorScript' );
wp_set_script_translations( $script_handle, 'my-block', plugin_dir_path( __FILE__ ) . 'languages' );
}
add_action( 'enqueue_block_editor_assets', 'script_translations' );
Локализация для фронтенда
Если вам нужно локализовать текст и для фронтенда, также убедитесь, что вы используете те же функции локализации. Однако, вместе с локализацией в редакторе, вы также можете использовать функцию wp_localize_script()
для передачи строк локализации на фронтенде.
Пример кода для локализации на фронтенде может выглядеть следующим образом:
function enqueue_frontend_scripts() {
wp_enqueue_script( 'my-block-frontend-script', plugin_dir_url( __FILE__ ) . 'build/index.js', array(), null, true );
// Строки локализации для фронтенда.
wp_localize_script( 'my-block-frontend-script', 'myBlockTranslations', array(
'greeting' => __( 'Hello World', 'my-block' ),
));
}
add_action( 'wp_enqueue_scripts', 'enqueue_frontend_scripts' );
Заключение
Следуя вышеуказанным рекомендациям, вы сможете успешно локализовать как PHP, так и JavaScript для ваших блоков Gutenberg. Убедитесь, что все имена файлов, хендлы и хуки соответствуют требованиям WordPress, и протестируйте локализацию на разных языках.
Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью в сообщество разработчиков WordPress. Удачи в вашем проекте!