您应该如何国际化分布在多个文件中但又构建在一个文件中的javascript?

时间:2020-05-17 作者:Mark

我遵循了国际化的说明: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文件。

3 个回复
最合适的回答,由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文件。

在这种情况下,您可以使用po2jsonnpx 运行可执行文件po2json 文件只需遵循问题中的步骤,除了:

确保翻译文件(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。


Themake-pot WP CLI命令仅在主题或插件的根目录中使用时执行预期任务。这也是包含PluginTheme 标题。

要获得预期结果,请运行以下命令:

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-potmake-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\' {} \\\\;"
  },

SO网友:Hasan Akhtar

此处的其他答案建议使用npx po2json 而不是wp i18n make-json 但这可能对每个人都不理想,因为wp i18n make-json 是生成json文件的标准方式。以下是您的工作方式:

确保使用@wordpress/scripts来构建JS。此软件包在后台使用webpack,所有翻译功能都已保留,因此make pot扫描仪可以扫描它们。有关此软件包的详细信息:https://developer.wordpress.org/block-editor/reference-guides/packages/packages-scripts/#advanced-usage

enter image description here

<运行make pot命令时,显式包括JS构建目录,并排除JS源目录:wp i18n make-pot ./ languages/domain.pot --exclude=path/to/js/src --include=path/to/js/build/ --ignore-domain. 现在,您的POT文件将只引用在页面上实际排队的生成文件。

运行make json。生成的JSON文件的md5哈希将正确引用页面上加载的实际脚本。

相关推荐

Plugin Localization

我刚刚为wp构建了我的第一个插件,即使它不是一个伟大的“代码诗意”;)它正常工作。这是一个使用GalleryView 3.0 jquery插件转换默认wp库的插件(http://spaceforaname.com/galleryview).我唯一不能做的就是本地化。此插件的本地化意味着转换管理界面,在这里可以配置jquery插件选项来更改结果库的外观。我试着关注网络上数百万的教程,在论坛上阅读了很多关于这个问题的帖子,并遵循了codex的指南。。。但仍然没有运气。这就是我所做的:每个文本行都位于gette