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除此之外,WP-CLI 2.10.0(2.6.0)提供了一個新命令,用于從給定文件創建這些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.phpi18n-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





