現在(絶賛)評価中のWordPress 6.5(Beta)を、いくつかの開発環境で試してみると、日本語で表示されないものがありました。Beta 1のころから3まで症状は解決しなかったので、昨日少し調べてみた。
前提としてその開発環境のロケールは’ja’となっている。これはサイトの言語設定、ユーザーの言語設定とも確認済み。
個別に__()などで翻訳テキストを取得しても、原文(英語)がそのまま返ってくる。
その開発環境のPHPバージョンは次の通り:
PHP 7.4.32 (cli) (built: Sep 28 2022 20:48:52) ( ZTS Visual C++ 2017 x86 )
そんなわけでmoファイルの読み込み部分をトレースしてみる。
「WordPress 6.5 Beta 1の紹介ページ」では直接触れられていないのだが、PHPの翻訳ファイルへの対応が含まれている。この対応にともなって翻訳処理が変更されており、wp-includesディレクトリにはl10nディレクトリが追加され、その中には5つのPHPファイルが存在する。その中の1つがclass-wp-translation-file-mo.phpである。
class-wp-translation-file-mo.phpでは、読み込んだmoファイルの先頭の4バイトを次のように定義されたクラス定数と比較し、moファイルが有効なファイルか評価している。
const MAGIC_MARKER = 0x950412de;
:
if ( self::MAGIC_MARKER === $big ) {
return 'N';
}
このコード、何の問題もないように見えるのだが、32ビット版PHPの場合は落とし穴が潜んでいる。self::MAGIC_MARKERをダンプすると、期待していたint型ではなく、float型になっていたのだ。
float(2500072158)
このことにより、読み込んだmoファイルは不適切なものとなり、正常に読み込まれていなかった。そして結果的にサイトの表記は英語のままとなっていた。
class-wp-translation-file-mo.phpの問題部分を自分なりに修正し、問題の開発環境にて日本語で表示されることを確認。この問題についてtracに報告した。
今朝、PHPの整数についてドキュメントを見直す。そこには、確かにint型の範囲を超える数値はfloat型になる旨が書かれている。個人的な感覚として、0x950412deはそのまま(8バイトの)int型になってもよさそうなのだが、32ビット版PHPではそうならなかった。
何はともあれ、次かその次のBetaでは修正されることを期待したい。