Blocks: Add i18n support to register_block_type_from_metadata

Related Gutenberg issue: https://github.com/WordPress/gutenberg/issues/23636.
Related WP-CLI PR: https://github.com/wp-cli/i18n-command/pull/210.
Related documentation proposal: https://github.com/WordPress/gutenberg/blob/master/docs/designers-developers/developers/block-api/block-metadata.md#internationalization-not-implemented

Adds programatic i18n support to `register_block_type_from_metadata` function for block settings registered from `block.json` file that provides `textdomain` field.


Props swissspidy, ocean90.
Fixes #52301.



git-svn-id: https://develop.svn.wordpress.org/trunk@49981 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Greg Ziółkowski 2021-01-19 11:04:03 +00:00
parent 2651809673
commit edd77c0791
8 changed files with 154 additions and 24 deletions

View File

@ -134,7 +134,15 @@ function register_block_script_handle( $metadata, $field_name ) {
$script_asset['dependencies'],
$script_asset['version']
);
return $result ? $script_handle : false;
if ( ! $result ) {
return false;
}
if ( ! empty( $metadata['textdomain'] ) ) {
wp_set_script_translations( $script_handle, $metadata['textdomain'] );
}
return $script_handle;
}
/**
@ -229,7 +237,48 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
foreach ( $property_mappings as $key => $mapped_key ) {
if ( isset( $metadata[ $key ] ) ) {
$settings[ $mapped_key ] = $metadata[ $key ];
$value = $metadata[ $key ];
if ( empty( $metadata['textdomain'] ) ) {
$settings[ $mapped_key ] = $value;
continue;
}
$textdomain = $metadata['textdomain'];
switch ( $key ) {
case 'title':
case 'description':
// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralContext,WordPress.WP.I18n.NonSingularStringLiteralDomain
$settings[ $mapped_key ] = translate_with_gettext_context( $value, sprintf( 'block %s', $key ), $textdomain );
break;
case 'keywords':
$settings[ $mapped_key ] = array();
if ( ! is_array( $value ) ) {
continue 2;
}
foreach ( $value as $keyword ) {
// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain
$settings[ $mapped_key ][] = translate_with_gettext_context( $keyword, 'block keyword', $textdomain );
}
break;
case 'styles':
$settings[ $mapped_key ] = array();
if ( ! is_array( $value ) ) {
continue 2;
}
foreach ( $value as $style ) {
if ( ! empty( $style['label'] ) ) {
// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain
$style['label'] = translate_with_gettext_context( $style['label'], 'block style label', $textdomain );
}
$settings[ $mapped_key ][] = $style;
}
break;
default:
$settings[ $mapped_key ] = $value;
}
}
}

View File

@ -1,13 +1,13 @@
{
"apiVersion": 2,
"name": "my-plugin/notice",
"name": "tests/notice",
"title": "Notice",
"category": "common",
"parent": [
"core/group"
],
"providesContext": {
"my-plugin/message": "message"
"tests/message": "message"
},
"usesContext": [
"groupId"
@ -18,7 +18,7 @@
"alert",
"message"
],
"textDomain": "my-plugin",
"textdomain": "notice",
"attributes": {
"message": {
"type": "string",
@ -46,8 +46,8 @@
"message": "This is a notice!"
}
},
"editorScript": "my-plugin-notice-editor-script",
"script": "my-plugin-notice-script",
"editorStyle": "my-plugin-notice-editor-style",
"style": "my-plugin-notice-style"
"editorScript": "tests-notice-editor-script",
"script": "tests-notice-script",
"editorStyle": "tests-notice-editor-style",
"style": "tests-notice-style"
}

Binary file not shown.

View File

@ -0,0 +1,43 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: 2015-12-31 16:31+0100\n"
"PO-Revision-Date: 2021-01-14 18:26+0100\n"
"Language: pl_PL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.2\n"
"X-Poedit-Basepath: .\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-KeywordsList: __;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;"
"_nx_noop:1,2,3c;esc_attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;"
"esc_html_x:1,2c\n"
"X-Textdomain-Support: yes\n"
"Last-Translator: \n"
"Language-Team: \n"
"X-Poedit-SearchPath-0: .\n"
msgctxt "block title"
msgid "Notice"
msgstr "Powiadomienie"
msgctxt "block description"
msgid "Shows warning, error or success notices…"
msgstr "Wyświetla ostrzeżenie, błąd lub powiadomienie o sukcesie…"
msgctxt "block keyword"
msgid "alert"
msgstr "ostrzeżenie"
msgctxt "block keyword"
msgid "message"
msgstr "wiadomość"
msgctxt "block style label"
msgid "Default"
msgstr "Domyślny"
msgctxt "block style label"
msgid "Other"
msgstr "Inny"

View File

@ -62,7 +62,7 @@ class WP_Test_Block_Register extends WP_UnitTestCase {
$registry = WP_Block_Type_Registry::get_instance();
foreach ( array( 'core/test-static', 'core/test-dynamic', 'my-plugin/notice' ) as $block_name ) {
foreach ( array( 'core/test-static', 'core/test-dynamic', 'tests/notice' ) as $block_name ) {
if ( $registry->is_registered( $block_name ) ) {
$registry->unregister( $block_name );
}
@ -193,7 +193,7 @@ class WP_Test_Block_Register extends WP_UnitTestCase {
$metadata = array(
'file' => __FILE__,
'name' => 'unit-tests/test-block',
'script' => 'file:./fixtures/missing-asset.js',
'script' => 'file:./blocks/notice/missing-asset.js',
);
$result = register_block_script_handle( $metadata, 'script' );
@ -217,9 +217,9 @@ class WP_Test_Block_Register extends WP_UnitTestCase {
*/
function test_success_register_block_script_handle() {
$metadata = array(
'file' => __FILE__,
'file' => DIR_TESTDATA . '/blocks/notice/block.json',
'name' => 'unit-tests/test-block',
'script' => 'file:./fixtures/block.js',
'script' => 'file:./block.js',
);
$result = register_block_script_handle( $metadata, 'script' );
@ -262,9 +262,9 @@ class WP_Test_Block_Register extends WP_UnitTestCase {
*/
function test_success_register_block_style_handle() {
$metadata = array(
'file' => __FILE__,
'file' => DIR_TESTDATA . '/blocks/notice/block.json',
'name' => 'unit-tests/test-block',
'style' => 'file:./fixtures/block.css',
'style' => 'file:./block.css',
);
$result = register_block_style_handle( $metadata, 'style' );
@ -303,12 +303,12 @@ class WP_Test_Block_Register extends WP_UnitTestCase {
*/
function test_block_registers_with_metadata_fixture() {
$result = register_block_type_from_metadata(
__DIR__ . '/fixtures'
DIR_TESTDATA . '/blocks/notice'
);
$this->assertInstanceOf( 'WP_Block_Type', $result );
$this->assertSame( 2, $result->api_version );
$this->assertSame( 'my-plugin/notice', $result->name );
$this->assertSame( 'tests/notice', $result->name );
$this->assertSame( 'Notice', $result->title );
$this->assertSame( 'common', $result->category );
$this->assertSameSets( array( 'core/group' ), $result->parent );
@ -327,7 +327,7 @@ class WP_Test_Block_Register extends WP_UnitTestCase {
);
$this->assertSame(
array(
'my-plugin/message' => 'message',
'tests/message' => 'message',
),
$result->provides_context
);
@ -361,10 +361,48 @@ class WP_Test_Block_Register extends WP_UnitTestCase {
),
$result->example
);
$this->assertSame( 'my-plugin-notice-editor-script', $result->editor_script );
$this->assertSame( 'my-plugin-notice-script', $result->script );
$this->assertSame( 'my-plugin-notice-editor-style', $result->editor_style );
$this->assertSame( 'my-plugin-notice-style', $result->style );
$this->assertSame( 'tests-notice-editor-script', $result->editor_script );
$this->assertSame( 'tests-notice-script', $result->script );
$this->assertSame( 'tests-notice-editor-style', $result->editor_style );
$this->assertSame( 'tests-notice-style', $result->style );
}
/**
* @ticket 52301
*/
function test_block_registers_with_metadata_i18n_support() {
function filter_set_locale_to_polish() {
return 'pl_PL';
}
add_filter( 'locale', 'filter_set_locale_to_polish' );
load_textdomain( 'notice', WP_LANG_DIR . '/plugins/notice-pl_PL.mo' );
$result = register_block_type_from_metadata(
DIR_TESTDATA . '/blocks/notice'
);
unload_textdomain( 'notice' );
remove_filter( 'locale', 'filter_set_locale_to_polish' );
$this->assertInstanceOf( 'WP_Block_Type', $result );
$this->assertSame( 'tests/notice', $result->name );
$this->assertSame( 'Powiadomienie', $result->title );
$this->assertSame( 'Wyświetla ostrzeżenie, błąd lub powiadomienie o sukcesie…', $result->description );
$this->assertSameSets( array( 'ostrzeżenie', 'wiadomość' ), $result->keywords );
$this->assertSame(
array(
array(
'name' => 'default',
'label' => 'Domyślny',
'isDefault' => true,
),
array(
'name' => 'other',
'label' => 'Inny',
),
),
$result->styles
);
}
/**
@ -433,7 +471,7 @@ class WP_Test_Block_Register extends WP_UnitTestCase {
add_filter( 'block_type_metadata', $filter_metadata_registration, 10, 2 );
$result = register_block_type_from_metadata(
__DIR__ . '/fixtures'
DIR_TESTDATA . '/blocks/notice'
);
remove_filter( 'block_type_metadata', $filter_metadata_registration );
@ -451,7 +489,7 @@ class WP_Test_Block_Register extends WP_UnitTestCase {
add_filter( 'block_type_metadata_settings', $filter_metadata_registration, 10, 2 );
$result = register_block_type_from_metadata(
__DIR__ . '/fixtures'
DIR_TESTDATA . '/blocks/notice'
);
remove_filter( 'block_type_metadata_settings', $filter_metadata_registration );