古腾堡如何处理React中的翻译?


11

我正在经历古滕贝格的源代码,例如这样,不能了解他们如何处理翻译...

他们确实导入了这个import { __ } from '@wordpress/i18n',然后在源代码中使用了this speak( __( 'Block settings closed' ) );

谁能告诉我他们如何在ReactJS中管理这些翻译并收集到普通的.po文件中?

我想他们有一些构建过程会遍历所有文件,包括JS并收集它们,但不确定。

Answers:


6

Gutenberg的GitHub存储库中,您可以看到所使用的i18n软件包的源代码。在此源代码中,您将看到Jed导入(gutenberg / packages / i18n / src / index.js的第4行),然后被用于后台的大多数翻译任务。

Jed推出了“用于现代JavaScript应用程序的Gettext样式i18n”(或至少在其网站上这样说)。

您的问题是.po文件。杰德在他们的网站上解释说:

有很多可用的.po到.json转换器。Gettext .po文件是大多数体面的翻译公司的标准输出,因为它是旧标准。

我目前使用:po2json

但是,我想在以后的版本中将此功能添加到单独的Jed模块中。

但是,这似乎不适用于这里。

进一步的挖掘结果setLocaleData( data: Object, domain: string )被用来通过翻译,如下所示

$locale_data = gutenberg_get_jed_locale_data( 'gutenberg' );
wp_add_inline_script(
    'wp-i18n',
    'wp.i18n.setLocaleData( ' . json_encode( $locale_data ) . ' );'
);

gutenberg_get_jed_locale_data( $domain )或多或少是的包装get_translations_for_domain( $domain )

因此,似乎WordPress通过PHP检索了翻译数据,然后将其传递给Jed。Jed本身似乎未加载任何翻译文件。

软件包的自述文件还说明了如何正确生成包含本地化字符串的.pot文件

该软件包还包括一个pot-to-php脚本,用于生成包含.pot文件中列出的消息的php文件。这对欺骗WordPress.org翻译字符串发现很有用,因为目前WordPress.org无法直接从JavaScript文件中解析字符串。

npx pot-to-php languages/myplugin.pot languages/myplugin-translations.php text-domain

这是否意味着Gutenberg将翻译存储在某些window属性中,作为wp_add_inline_scriptPHP 通过JSON加载,然后在React端检索它并将其传递给Jed?...而Jed还有进一步的魔法吗?
博洛格

@Bologer不一定是window属性,但是可以。PHP检索值并将其通过wp_add_inline_script
kero(

2
您应该使用添加到我的评论中的信息来扩展答案。这实际上评论似乎更符合OP长相什么
马克·卡普伦

2

至少到目前为止,只要没有更好的自动化流程,我建议根本不要从JS生成.pot文件。

正如@kero在他的回答中所解释的那样,GB转换作为一种Blob数组从.mo文件传递到JS。此工作流程将破坏所有依赖过滤__和关联结果的本地篡改插件。更好的工作流程是从正在通过__调用转换的字符串中显式生成blob数组,类似于在非GB上下文中进行JS转换的方式。这也将解决生成.pot文件的问题。

这里缺少的是一些自动化过程,该过程将运行JS文件并生成相关的PHP代码,然后可以通过诸如poedit之类的工具对其进行分析。



1
很好的起点,剩下的只有一部分是自动生成对wp_add_inline_script的调用,因为现在它可能只是出于生成锅的好处而生成了php,但实际上并没有使用它(我猜)
Mark Kaplun
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.