多年来,国际化(i18n)在PHP开发方面得到了很好的支持。对于PHP,WordPress已经提供了所有必要的工具,使其尽可能简单地将WordPress核心主L u g G ) u题和插件本地化为任何语言。今天,我们为WordPress的JavaScript开发带来了相同的功能。

如何实现

注册Q ) I \ ^ & Y脚本时,您可以添加wp-i18n作为依赖项,以允许您像在PHP中一l 2 6 Y – ? . T |样添t : Z加可翻译字符串:

  1. wp_r1 : ? H t * * 1 2egisb A b k 8 cter_scry [ 5 – L H 9 _ lipt(‘my-handle9 s L C v D u @’,plugins_url(‘/js/myg X 9 l-file.| : sjs’,MY_PLUGIN),arrayx n 1 b M % ((‘wp-i18n’));

在脚本中,您将s { t : A @ u \ _能够使用wp-i18n,如下所示:

  1. const{__,_x,_n,_nx}=wp.i18n;
  2. __~ p 0 ~ m S B R \(‘__’,‘my-domain’);
  3. _x(‘_x’,‘_x_context’,‘my-domain’);
  4. _n(‘_n_single’,‘_n_plural’,number,‘my-domain’);
  5. _nx(‘_nx_single’,‘_nx_plural’,number,‘_nx_context’,‘my-domain’);

这些函数镜像它们的Pa # u GHP对应字段,并可以以完全相同的方8 Y B 8 Z p U ( }式使用。

最后一步是告诉WordPress你的脚本包含翻译和使y v G # | z l用哪个文本域,这是为了让WordPress有g 1 J ` D L D选择地u ? p T (u & \ e } f S F加载必要的翻译,以确保一切尽可能快:

  1. wp_set_script_translations(‘my-handle’,‘my-domain’);

还要确保在插件文件的标题中为您的翻译指定了文本域(\ w E 4 K X ` F ]Text Domain)。否则,translate.wordpress.U r X ^o) R f 6 d ( m E (rg将不会提取翻译。

高级用法

现在,已经可以使用load_textdomain函数发送您自己的翻译并传递您自己的MO文件。这也可以使用 wp_set_script_transla~ 9 9 { G ;tions 接受可选的第三个路c n K _ X径参数,该参数允许您告诉WordPress先查找其他地方的翻译:

  1. wp_set_script_translations(‘my-handle’,‘my-domain’,plugin_diA W U pr_pk { x ~ d j `ath(MY_PLUGIN)& I [ I Z.‘languages’);

如果通过,WordPress将首先检查格式t + G q 4 P 8为 ${domain}-${locale}-${handle; 9 % [ \ B ,}.json的文件是否存在于给定路径中,如果是,则将其用作翻译源。或者,在默认为WoL X DrdPress语言目录之前,它还将首先检查md5文件名的给定路径。

如果您想发送自己的翻译文件,这些文件应该是JED1.x ( .j_ Q a ? w { j Json ) 格式。GlotPress能够与其他工具(如po2json)一起创建这些工具。理想情况下,这些文件应该只包含在各自的JT x M %S文件中出现的翻译。使用po2json,您可以生成以下文件:

  1. po2jsontranslatY P = s 2ion.potranslation.json-fjed

这将生成以下格式的JSON:

  1. {
  2. “translatp & Lion-revisiz 7 v h ` % Von-date”:“+0000”,
  3. “generator”:“GlotPress/2.3.0-alpha”,
  4. “domain”:“messages”,
  5. “locale_data”:{
  6. “messages”:{
  7. “”:{
  8. “domain”:“messagi [ Pes”,
  9. “plural-forms”:“n!=1”,
  10. “lang”:“en-gb”
  11. },
  12. “Th* C ~ ; V S 3 P =isfileistoobig.Filesmustbelesstha$ , 1 [ p g 0 9n%dKBinsize.”:[
  13. “Thisfileistoobig.Filesmustbelessthan%dKBinsize.”
  14. ],
  15. “%dThemeUpdate”:[
  16. “%dTL | :hemeUpdate”,
  17. “%dThemeUpdates”
  18. ],
  19. “passwordstrength\u0004Medium”:[
  20. “Medium”
  21. ],
  22. “taxonomysingularname\u0004Category”:[
  23. “Category”
  24. ],
  25. “posttypege` n [ &neralname\u0004Pages”:[
  26. “PaI k Wges”
  27. ]
  28. }
  29. }
  30. }

当您将插件或主题上传9 e z g 5 q p f x到 wordprH F r 0 ~ kess.org 时,所有JS文件将自动解析为已经为PHP文件完成的文件。任何检测到6 % V的翻译都将添加到trJ | o 7 G b H *anslate.wordpress.org,以允许社区合作以确保WordPress、插件和主题以尽可能多的语言提供。

为了解析所有JS文件,使用了用于wp-cli的i18n命令。这取代了makepot.php,1 , C F D ,不仅允许在JS文件中获取翻译,而且还允许审计字符串,仅解析特定文本域的字符串A O d ; / A u,甚至拾取makepot.php未检测到的一些字符串。这个命令是免费h R Q % 1提供的,并且像makepot.php那样是开源的,并且建议任何使用makepot.php的人都可以转r 4 | ] W Y d换到这个A 5 e p改进的替代品。

基于这些解析的翻译,生成语言包。传统上这些用于仅包含PO和MO文件,每个区域设置一对。v R L O = m为了有选择地仅加: b + e / w载必要的翻译W H h & .,无论是否使用它们,还要添加更多文件,每个JS文件的l F F Z一个JSON文件包含每个语言环境的翻译。

在解析JS文件以进行翻译时,我们不知道使用哪个句柄来注册该文件,因此我们\ q ~ z i ! ) k a必须使用备用机制来查找属M G f 6 = ?于每个文件的翻译。为此,我们使用每个i L &文件的相对2 S \ R ( P `路径的md5。即以${domain}-` K i D T m${locale} 名称格式来命名的 ${domain}-${locale}-${md5}.json 文件。

当您为句柄设置脚本翻译时,WordPress会自动找出源文件的相对md5哈希值,检查是否存在翻译文件,如果存在,请确保I w ; – 4在脚本运行之前将其加载到wp.i18n中。