HAScom 与你分享

WordPress 6.5 改进了i18n

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' => 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用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