diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index 1b5427340f433..ace9811f32e1b 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -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; + } } } diff --git a/tests/phpunit/tests/blocks/fixtures/block.asset.php b/tests/phpunit/data/blocks/notice/block.asset.php similarity index 100% rename from tests/phpunit/tests/blocks/fixtures/block.asset.php rename to tests/phpunit/data/blocks/notice/block.asset.php diff --git a/tests/phpunit/tests/blocks/fixtures/block.css b/tests/phpunit/data/blocks/notice/block.css similarity index 100% rename from tests/phpunit/tests/blocks/fixtures/block.css rename to tests/phpunit/data/blocks/notice/block.css diff --git a/tests/phpunit/tests/blocks/fixtures/block.js b/tests/phpunit/data/blocks/notice/block.js similarity index 100% rename from tests/phpunit/tests/blocks/fixtures/block.js rename to tests/phpunit/data/blocks/notice/block.js diff --git a/tests/phpunit/tests/blocks/fixtures/block.json b/tests/phpunit/data/blocks/notice/block.json similarity index 71% rename from tests/phpunit/tests/blocks/fixtures/block.json rename to tests/phpunit/data/blocks/notice/block.json index 4cd2b4cd6912b..9a0ecc018da64 100644 --- a/tests/phpunit/tests/blocks/fixtures/block.json +++ b/tests/phpunit/data/blocks/notice/block.json @@ -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" } diff --git a/tests/phpunit/data/languages/plugins/notice-pl_PL.mo b/tests/phpunit/data/languages/plugins/notice-pl_PL.mo new file mode 100644 index 0000000000000..284872cf6f88a Binary files /dev/null and b/tests/phpunit/data/languages/plugins/notice-pl_PL.mo differ diff --git a/tests/phpunit/data/languages/plugins/notice-pl_PL.po b/tests/phpunit/data/languages/plugins/notice-pl_PL.po new file mode 100644 index 0000000000000..22ca6ef12914f --- /dev/null +++ b/tests/phpunit/data/languages/plugins/notice-pl_PL.po @@ -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" diff --git a/tests/phpunit/tests/blocks/register.php b/tests/phpunit/tests/blocks/register.php index 7cdc37d5e997f..5ea58af398acc 100644 --- a/tests/phpunit/tests/blocks/register.php +++ b/tests/phpunit/tests/blocks/register.php @@ -62,7 +62,7 @@ function tearDown() { $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 @@ function test_missing_asset_file_register_block_script_handle() { $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 @@ function test_handle_passed_register_block_script_handle() { */ 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 @@ function test_handle_passed_register_block_style_handle() { */ 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 @@ function test_metadata_not_found_in_the_current_directory() { */ 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 @@ function test_block_registers_with_metadata_fixture() { ); $this->assertSame( array( - 'my-plugin/message' => 'message', + 'tests/message' => 'message', ), $result->provides_context ); @@ -361,10 +361,48 @@ function test_block_registers_with_metadata_fixture() { ), $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 @@ public function test_filter_block_registration_metadata() { 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 @@ public function test_filter_block_registration_metadata_settings() { 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 );