mirror of
https://github.com/gosticks/wordpress-develop.git
synced 2025-10-16 12:05:38 +00:00
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:
parent
2651809673
commit
edd77c0791
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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"
|
||||
}
|
||||
BIN
tests/phpunit/data/languages/plugins/notice-pl_PL.mo
Normal file
BIN
tests/phpunit/data/languages/plugins/notice-pl_PL.mo
Normal file
Binary file not shown.
43
tests/phpunit/data/languages/plugins/notice-pl_PL.po
Normal file
43
tests/phpunit/data/languages/plugins/notice-pl_PL.po
Normal 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"
|
||||
@ -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 );
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user