WordPress 6.5 改进了i18n

WordPress 6.5 中提供了各种国际化 (i18n) 改进,本文将重点介绍这些改进。

新的本地化系统,性能得到提升

在过去的一年里,WordPress 贡献者仔细分析了 WordPress 中现有 i18n 系统的性能,并最终创建了一个新的 Performant Translations 功能插件,该插件提供了一个经过全面检修的系统,性能明显更好。经过数以千计的 beta 测试人员和去年年底的合并公告,这个新库现在包含在 WordPress 6.5 中!

Performant Translations 插件仍然有用,并将继续维护,以构建在核心解决方案之上,并具有独特的附加功能。与今天的情况一样,如果当前不存在 PHP 文件,该插件会自动将任何文件转换为 PHP 文件。这对于翻译不是来自 translate.wordpress.org 或仅存在于该服务器上的本地站点非常有用。

这个新库在加载二进制文件方面速度更快,并且使用更少的内存。它甚至支持同时加载多个语言环境,这使得语言环境切换速度更快。除此之外,它还支持包含在 PHP 文件中的翻译,避免使用二进制文件格式并利用 OPCache(如果可用)。

事实上,新库的速度如此之快,以至于它为首选语言功能插件铺平了道路,从 WordPress 6.5 开始,默认情况下可以合并多个语言环境的翻译。

虽然这在很大程度上是一种无声且向后兼容的底层更改,但仍有一些事情需要注意:

新的翻译文件格式.l10n.php

从 WordPress.org 下载语言包时,除了您已经熟悉的 和 文件外,还会有一个新文件。如果翻译文件有相应的文件,则将加载后者,从而使速度更快,占用的内存更少。.l10n.php .mo .po .mo .l10n.php

这是一个渐进式增强功能,因此,如果只有一个文件而没有 PHP 文件,翻译仍将按预期加载。然而,反之亦然!因此,从理论上讲,您可以在项目中仅使用翻译文件,并且即时翻译加载等功能将继续工作。目前,WordPress仍然需要相应的文件来进行更新检查等操作。.mo .l10n.php .po .mo

注意:如果您还没有看到任何翻译文件,可能是语言包有一段时间没有更新了,即没有新的翻译。.l10n.phpwp-content/languages

以下是 WordPress 6.5 支持的 PHP 翻译文件示例:

<?php
return [
'project-id-version' => 'WordPress - 6.5.x - Development',
'report-msgid-bugs-to' => 该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。',
'messages' =>
[
'original' => 'translation',
'contextEOToriginal with context' => 'translation with context',
'plural0' => 'translation0' . "\0" . 'translation1',
'contextEOTplural0 with context' => 'translation0 with context' . "\0" . 'translation1 with context',
'Product' => 'Produkt' . "\0" . 'Produkte',
https://github.com/glotPress/GlotPress/" style="box-sizing: border-box; text-decoration: underline; color: rgb(0, 114, 169); font-weight: inherit; border-top: 0px; border-right: 0px; border-bottom: none; border-left: 0px; border-image: initial; font-family: inherit; font-size: 16px; font-style: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; overflow-wrap: break-word;">GlotPress 的 4.0 版(支持 translate.WordPress.org 的插件)已经支持新格式。.l10n.php
除此之外,WP-CLI 2.10.0(2.6.0)提供了一个新命令,用于从给定文件创建这些PHP文件。例子:i18n-commandwp i18n make-php.po

# Create PHP files for all PO files in the current directory.
$ wp i18n make-php .

# Create a PHP file from a single PO file in a specific directory.
$ wp i18n make-php example-plugin-de_DE.po languages

如果您正在开发一个处理翻译的 WordPress 插件,您还可以使用 new 类将文件转换为 PHP 文件。例:WP_Translation_File.mo

$contents = WP_Translation_File::transform( $mofile, 'php' );
if ( $contents ) {
file_put_contents( $path_to_php_file, $contents );}

用于自定义此行为的新筛选器

如果您出于某种原因想禁用对PHP文件的支持;例如,如果您的项目中还没有任何文件,并且想要阻止额外的文件查找操作,则可以使用新过滤器来更改首选格式(默认为 ),如下所示:translation_file_formatphp

add_filter(
'translation_file_format',
static function () {
return 'mo';
}
);

现有筛选器仍可用于筛选文件路径,以便加载特定文本域的翻译。但是,它仅适用于文件。要过滤翻译文件(无论是文件还是文件)的路径,请使用新的过滤器。load_textdomain_mofile.mo.mo.l10n.php.moload_translation_file

使用全局变量$l10n

以前,在加载翻译时,WordPress 会将类的实例存储在全局变量中。在 WordPress 6.5 中,这将是一个新类的实例,该类充当具有类似特征的填充码。如果你的项目以某种方式直接使用这个全局变量或类,这是一个值得关注的领域。MO$l10nWP_TranslationsMO

语言文件路径的缓存列表

这是另一个轻微的性能改进,但与上面介绍的新本地化库无关。

在诸如 和 的地方,WordPress 曾经直接使用该函数来检索特定目录中的所有文件。这对于即时翻译加载和通常知道安装了哪些翻译非常重要。但是,在具有大量语言文件的网站上,该操作可能会变得昂贵。get_available_languages()WP_Textdomain_Registryglob().moglob()

因此,在 #58919 / [57287] 中引入了一种新的缓存机制。文件查找现在集中处理并存储在组中的对象缓存中,缓存键的格式为 ,其中扫描目录的 MD5 哈希值,例如 .每当更新语言包时,都会清除缓存。WP_Textdomain_Registrytranslationscached_mo_files_<hash><hash>wp-content/languages

此外,查找现在还会扫描除文件之外的文件,以防站点上仅存在前者。.l10n.php.mo