我遵循了国际化的说明:https://developer.wordpress.org/block-editor/developers/internationalization/, 但它似乎与Gutenberg的开发工具没有很好的配合。它将在src
多个目录中的目录js
文件,并将其用作相对路径npm run build
将制作一个build/index.js
我正在排队的文件。这个wp i18n make-json languages --no-purge
将创建多个MD5无法工作的文件(可能是因为相对路径),我无法将它们命名为al${domain}-${local}-${handler}.json
.
更好地理解我的意思。我现在有以下内容:
npm init
npm i --save-dev --save-exact @wordpress/scripts
mkdir build
mkdir src
cd src
touch index.js
touch edit.js
index.js
import { __ } from \'@wordpress/i18n\';
import { registerBlockType } from \'@wordpress/blocks\';
import edit from \'./edit.js\';
registerBlockType( \'gbg/myguten\', {
title: __( "My Gutenberg Example", "gbg" ),
category: "widgets",
edit
} );
edit.js
import { __ } from \'@wordpress/i18n\';
export default () => (<h1>{ __( "Hello World", "gbg" ) }</h1>);
然后生成翻译:
mkdir lang
wp i18n make-pot ./ lang/myguten.pot
cp myguten.pot myguten-en_US.po
wp i18n make-json myguten-en_US.po --no-purge
这将生成多个json文件,而我有一个组合的json文件。
npm run build
将生成一个索引。我用来在WordPress中注册的js文件。
/**
* Plugin Name: My Guten
* Text Domain: gbg
*/
function gbg_myguten_block_init() {
load_plugin_textdomain( \'gbg\', false, dirname( plugin_basename(__FILE__) ) . \'/lang/\' );
wp_register_script(
\'gbg-myguten-script\',
plugins_url( \'build/index.js\', __FILE__ ),
array( \'wp-blocks\', \'wp-element\', \'wp-i18n\' ),
time(),
true
);
register_block_type(
\'gbg/myguten\',
array(
\'editor_script\' => \'gbg-myguten-script\',
)
);
wp_set_script_translations( \'gbg-myguten-script\', \'gbg\', plugin_dir_path( __FILE__ ) . \'lang\' );
}
add_action( \'init\', \'gbg_myguten_block_init\' );
现在它将搜索
${domain}-${locale}-${handle}.json
而存在多个json文件。
最合适的回答,由SO网友:Sally CJ 整理而成
(我修改了这个答案,主要是为了让其他读者和您知道我最初在您的步骤中注意到的问题,如问题所示。)
因此,在我最初的回答中,我的重点是建议您只使用多个脚本翻译文件,但我认为我应该澄清以下三件事:
它将在src
多个目录中的目录js
文件,并将其用作相对路径npm run build
将制作一个build/index.js
我正在排队的文件。
是的,wp i18n make-json
将创建一个JED-根据JavaScript源文件格式化JSON文件more details on Make WordPress.
与npm run build
(使用wp-scripts
package), 据我所知,它只构建JavaScript源文件(.js
) 而不是JSON文件的JED文件。(不过,还有JS linter和其他工具。)
的wp i18n make-json
将创建多个MD5无法工作的文件(可能是因为相对路径)
只要您为PO文件指定正确的文件名(格式为${domain}-${locale}.po
(参见Plugin Handbook » Loading Text Domain) — e、 g。my-plugin-it_IT.po
如果文本域是my-plugin
并且语言环境设置为it_IT
(意大利语)。
但是,您使用了错误的文本域,例如,在命令中wp i18n make-pot ./ lang/myguten.pot
, 你应该用gbg
而不是myguten
因为Text Domain
在插件标题中是gbg
(即。Text Domain: gbg
).
此外,您的cp
(“copy”)命令前面应该有cd lang
.
与MD5一样,它是JS源文件路径的MD5散列,正如您在PO文件中看到的那样,因此路径是(或者应该是)相对于插件文件夹的路径。
E、 g.我的示例插件的结构:
wpse-366881/
build/
index.js <- relative path = build/index.js
lang/
src/
edit.js <- relative path = src/edit.js
index.js <- relative path = src/index.js
index.php
package.json
我宁愿有一个组合的JSON文件。
在这种情况下,您可以使用po2json
和npx
运行可执行文件po2json
文件那么,您应该如何将JavaScript国际化,将其分散在多个文件中,而构建在一个文件中只需遵循问题中的步骤,除了:
确保翻译文件(POT、PO、MO和JED/JSON),即内部代码和文件名,使用插件头中定义的文本域。此外,将所有翻译文件放在正确的目录中。
E、 g。wp i18n make-pot ./ lang/gbg.pot
无需运行wp i18n make-json
命令创建多个文件,只需使用po2json
从PO文件创建单个JED/JSON文件。
这方面的命令是:(注意,在编写时,WordPress使用JED 1.x)
npx po2json <path to PO file> <path to JSON file> -f jed1.x
E、 g。
npx po2json lang/gbg-en_US.po lang/gbg-en_US-gbg-myguten-script.json -f jed1.x
我用于测试目的的示例插件(供其他读者尝试)
您可以找到它
on GitHub &mdash
尝试(&T);已在WordPress 5.4.1上测试工作,站点区域设置/语言设置为it_IT
/意大利语和代码基本上都基于您的代码,除了
index.php
, 我用了
build/index.asset.php
文件收件人
automatically load dependencies and version.
顺便说一句,这个插件最初是基于the example here.
SO网友:Mark
在Sally CJ写的标记答案的帮助下,我能够写出这个答案,这是我想要的答案的一个更简洁的版本。
在下面的示例中,我使用的是荷兰语言环境(nl\\u nl),但可以随意使用其他语言环境,如it\\it或en\\US。
The
make-pot
WP CLI命令仅在主题或插件的根目录中使用时执行预期任务。这也是包含
Plugin 或
Theme 标题。
要获得预期结果,请运行以下命令:
1. wp i18n make-pot .
2. cp ./languages/my-plugin-slug.pot ./languages/my-plugin-slug-nl_NL.po
3. npx po2json languages/my-plugin-slug-nl_NL.po languages/my-plugin-slug-nl_NL-my-plugin-script-handler.json -f jed1.x;
在插件PHP文件中,使用以下代码:
function register_block_my_gutenberg_block() {
load_plugin_textdomain( \'my-plugin-slug\', false, plugin_dir_path( __FILE__ ) . \'languages\' );
$asset_file = include( plugin_dir_path( __FILE__ ) . \'build/index.asset.php\' );
wp_register_script(
\'my-plugin-script-handler\',
plugin_dir_url( __FILE__ ) . \'build/index.js\',
$asset_file[\'dependencies\'],
$asset_file[\'version\'],
true
);
register_block_type(
\'my-namespace/my-gutenberg-block\',
array(
\'editor_script\' => \'my-plugin-script-handler\'
)
);
wp_set_script_translations(
\'my-plugin-script-handler\',
\'my-plugin-slug\',
plugin_dir_path( __FILE__ ) . \'languages\'
);
}
add_action( \'init\', \'register_block_my_gutenberg_block\' );
如文件中所述,
How to Internationalize Your Plugin, “文本域必须与插件的slug匹配”。这就是为什么
my-plugin-slug
用于标记为文本域的位置。
PoEdit
您也可以使用PoEdit进行翻译。只需使用
make-pot
如上步骤1所述,然后在PoEdit中打开新创建的pot文件。创建翻译并将其另存为
my-plugin-slug-nl_NL.po
. 然后使用步骤3中的命令生成
.json
-文件
Package.json
你可以通过添加
make-pot
和
make-json
到您的
package.json
文件现在如果你
npm run make-pot
, 将创建pot文件。用它来翻译。然后使用
npm run make-json
要为所有
.po
文件。确保更改
my-plugin-handler.json
到PHP文件中定义的脚本处理程序的名称
wp_register_script
.
"scripts": {
"build": "wp-scripts build",
"format:js": "wp-scripts format-js",
"lint:js": "wp-scripts lint-js src",
"packages-update": "wp-scripts packages-update",
"start": "wp-scripts start",
"make-pot": "wp i18n make-pot .",
"make-json": "find . -iname \\"*.po\\" -type f -exec sh -c \'npx po2json $0 $(dirname $0)/$(basename $0 .po)-my-plugin-script-handler.json -f jed1.x\' {} \\\\;"
},