WordPress 6.5 版本进行了多项国际化(i18n)方面的改进,本开发者说明将重点关注这些改进。
性能改进的本地化翻译系统
在过去的一年里,WordPress 的贡献者们认真研究了现有的国际化(i18n)系统的性能,并最终创建了一个名为“Performance Translations”的新功能插件。这个插件提供了一个经过彻底优化的系统,可以显著提高性能。经过数千名Beta测试人员的测试和去年年底的合并公告,这个新的库现在已经包含在 WordPress 6.5 中了!有关所有详细信息,请阅读#59656 。
Performant Translations 插件依然非常有用,并且将持续维护,以提供在核心解决方案中无法获得的独特附加功能。目前,如果没有存在 PHP 文件,该插件会自动将任何 .mo 文件转换为 PHP 文件。这对于那些翻译不是来自 translate.wordpress.org 或者只存在于本地服务器的网站非常有帮助。
这个新库让加载二进制 .mo 文件更快,同时减少了内存的使用。它甚至支持同时加载多个语言环境,因此网站语言切换速度更快。此外,它还支持 PHP 文件中的翻译,避免使用二进制文件格式,并且可以利用 OPCache 缓存(如果可用)。
实际上,新库的速度非常快,以至于从 WordPress 6.5 开始,为了默认合并多个语言环境的翻译,它已经成为首选语言功能插件。
尽管这主要是一个悄无声息的、向后兼容的底层更改,但仍然有一些需要注意的事项:
新的.l10n.php
翻译文件格式
当您从WordPress.org下载语言包时,除了您熟悉的.mo和.po文件之外,您可能会注意到一个新文件,即.l10n.php。如果您的.mo翻译文件有对应的.l10n.php文件,系统将加载后者,从而实现更快的速度和更低的内存消耗。
这是一个渐进式的改进,因此即使只有一个.mo文件而没有对应的PHP文件,翻译仍然会按照预期加载。反之亦然!这意味着理论上您可以只使用.l10n.php翻译文件,而即时翻译加载等功能仍将正常工作。目前,WordPress仍然需要相应的.po文件和.mo文件来执行更新检查等操作。不过,这个限制未来可能会被解决,请参阅#60554了解更多信息。
请注意:如果您在wp-content/languages目录中没有看到任何.l10n.php翻译文件,这可能是因为语言包已经有一段时间没有更新,因此没有新的翻译可用。
以下是 WordPress 6.5 支持的 PHP 翻译文件示例:
注意:这里的 EOT 代表“传输结束”字符(U+0004,或在 PHP 中表示为“\4”)。它与 gettext 中用于将上下文与单数字符串连接在一起的分隔符相同。
生成 PHP 翻译文件
如果您希望自己生成这些 PHP 翻译文件,现在 GlotPress 的 4.0 版本已经支持新的 .l10n.php 格式,这是一个用于支持 translate.wordpress.org 的插件。
此外,WP-CLI 2.10.0(i18n-command 2.6.0)提供了一个新的 wp i18n make-php 命令,可从给定的 .po 文件创建这些 PHP 文件。例如:
如果您正在开发处理翻译的 WordPress 插件,现在还可以使用新的 WP_Translation_File 类将 .mo 文件转换为 PHP 文件。例如:
用于自定义此行为的新过滤器
如果您因某种原因想要禁用对 PHP 文件的支持,例如,如果您的项目尚未包含任何 PHP 文件,并且希望避免额外的文件查找操作,那么您可以使用新的 translation_file_format 过滤器来更改首选格式(默认为 PHP),示例如下:
现有的 load_textdomain_mofile 过滤器仍然可用于过滤 .mo 文件的路径,以加载特定文本域的翻译。但是,这个过滤器仅适用于 .mo 文件。如果您需要过滤翻译文件的路径(无论是 .l10n.php 文件还是 .mo 文件),请使用新的 load_translation_file 过滤器。
使用$l10n
全局变量
在以前的 WordPress 版本中,当加载翻译时,WordPress 会将 MO 类的实例存储在 $l10n
全局变量中。然而,在 WordPress 6.5 中,这将被一个新的 WP_Translations
类的实例所取代,它具有类似的功能。如果您的项目在某种方式上直接使用了这个全局变量或者 MO 类,那么您需要关注这个变化。
缓存的语言文件路径列表
这是另一个轻微的性能改进,但与前面介绍的新本地化库无关。
过去,WordPress 在 get_available_languages()
、WP_Textdomain_Registry
等地方直接使用 glob()
函数来检索特定目录下的所有 .mo
文件。这对于及时加载翻译以及了解安装了哪些翻译非常重要。然而,在具有大量语言文件的站点上,glob()
操作可能会变得非常耗时。
因此,在 #58919 / [57287] 中引入了新的缓存机制。现在,文件查找已经集中处理在 WP_Textdomain_Registry
中,并将结果存储在对象缓存中的 translations
组中。缓存键的格式为 cached_mo_files_<hash>
,其中 <hash>
是扫描目录的 MD5 哈希值,例如 wp-content/languages
。每当更新语言包时都会清除缓存。
此外,除了 .l10n.php
文件之外,查找现在还会扫描 .mo
文件,以防站点上仅存在前者。
要了解更多信息,请查看官方日志。
暂无评论内容