PHPの整数ってムズくないですか?

現在(絶賛)評価中のWordPress 6.5(Beta)を、いくつかの開発環境で試してみると、日本語で表示されないものがありました。Beta 1のころから3まで症状は解決しなかったので、昨日少し調べてみた。

前提としてその開発環境のロケールは’ja’となっている。これはサイトの言語設定、ユーザーの言語設定とも確認済み。

個別に__()などで翻訳テキストを取得しても、原文(英語)がそのまま返ってくる。

その開発環境のPHPバージョンは次の通り:

そんなわけで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ファイルが有効なファイルか評価している。

このコード、何の問題もないように見えるのだが、32ビット版PHPの場合は落とし穴が潜んでいる。self::MAGIC_MARKERをダンプすると、期待していたint型ではなく、float型になっていたのだ。

このことにより、読み込んだmoファイルは不適切なものとなり、正常に読み込まれていなかった。そして結果的にサイトの表記は英語のままとなっていた。

class-wp-translation-file-mo.phpの問題部分を自分なりに修正し、問題の開発環境にて日本語で表示されることを確認。この問題についてtracに報告した。

今朝、PHPの整数についてドキュメントを見直す。そこには、確かにint型の範囲を超える数値はfloat型になる旨が書かれている。個人的な感覚として、0x950412deはそのまま(8バイトの)int型になってもよさそうなのだが、32ビット版PHPではそうならなかった。

何はともあれ、次かその次のBetaでは修正されることを期待したい。

カテゴリーblog