WordPress6.5から採用された.l10n.php翻訳ファイルの優先適用機能。まず、自身の体感的には「そんなに速くなった感じはしないような..」という印象ではありますが、今後こちらが主流になっていくかも知れないので、一応生成方法は知っておいた方がいいのでは?と調べ始めました。
ただ、いくら調べていっても、このPHPファイルは開発環境があれば簡単にできるもののようで、開発環境がない場合には、自力でコツコツ作るか、癖のある以下のプラグインを使って生成してもらうしかなさそうな状況でした。
そんな中、オンラインツールを2つ使って多少の加工をすれば適用できる方法が見つかりましたので、メモとして公開しておきます。
本ページの内容は、自作したプラグインの翻訳ファイルで成功したという例であり、すべての翻訳ファイルでうまくいくとは限らないことを予めお断りしておきます
.l10n.phpファイルを生成して適用する手順
まずはメモとして、以下のようなことをしましたが、加工が大変だったり、コード中に不正な文字があるとサイトがストップしたりとさんざんでした。
- .poファイルをテキスト形式で開いて加工
- オンラインツールを使って.poファイルをphp形式へ変換
- 一からコツコツと生成
まあ仕方ないから、プラグインに頼るか、恐る恐るハンドメイドするしかないか..と諦めかけた時に発見したのが、これから紹介する「.po」→「.json」→「.php」という手順だったのです。
手順1 完全な翻訳ファイル(.po)を作る
l10n.phpの翻訳ファイルを作るには、まず通常の翻訳ファイルの元となる.po形式のファイルを作成する必要があります。
また、.poファイルの元となる.pot形式のファイルは、無料ツールの「Poedit」でも可能ですし、以下のプラグインを使って抽出することもできます。
生成した.poファイルに翻訳文字列を当て、完全な.poファイルを作るのが第一段階です。
【補足】2024年3月19日辺りにリリースされた、Loco Translateのバージョン2.6.7では、poファイルの保存時にl10n.phpファイルが生成(更新)できるようになりました
手順2 .poファイルを一旦.jsonファイルへ変換する
.poから.jsonへの変換はConvert Gettext PO filesというオンラインツールを使います。
画面右側の「JSON」→「Angular Gettext」を選択して左画面の「ファイルを選択」から、先ほど完成させた.poファイルを選択して変換を実行します(実行後ダウンロード画面が開くのでパソコンへ保存します)。

ダウンロードが終わったら、解凍しておきましょう。
手順3 .jsonファイルを.phpファイルへ変換する
前項の解凍したファイルを開いておきます。
.jsonから.phpへの変換はJSON to PHP Array encoder / decoderというオンラインツールを開きます。
大きな空白欄へ解凍したファイルの内容をコピーして貼り付けます。
「Align Array Values」「Compact」ともオフにして(赤枠の部分)、変換します。

変換が終わったら、中身をすべてコピーして、パソコン上へ新規作成したテキストファイルへ貼り付けます。
最後に拡張子を「php」にして保存します。
手順4 .phpファイルを編集し、適所へアップロードする
最後に、翻訳用の.l10n.phpを完成させ、プラグインの言語フォルダなど適所へアップロードします。
php形式の翻訳用ファイルは以下の要件が必要です。
- WordPressで読み込まれるようなコード体系にしなければならない
- PHPとして問題のない記述でなければいけない
- ファイル名は「テキストドメイン-ロケール.l10n」、拡張子は「.php」でなければいけない
この作業を順に行っていきます。
WordPressの翻訳体系に合わせる
まず、ここまでで出来上がった.php形式のファイルを、WordPressの翻訳用に加工しなければなりません。とはいっても、これまでの段取り通りに行っていれば難しくはありません。
WordPressでは.phpからの翻訳ファイルに関しては以下のような体系になっていなければいけません。
<?php
return [
'messages'=>[
'翻訳前の文字列' => '翻訳語の文字列',
]
];
一方、作成できた.phpファイルは先頭に「[」末尾に「]」があるだけなので、このままではWordPressが読み込んでくれないので、以下のようにして加工します。
まずは先頭の「[」を以下と置き換えます。
<?php
return [
'messages'=>[
次に末尾の「]」を以下と置き換えます。
]
];
単数形・複数形が存在するコードの処理
ファイル中のコードには、単数形と複数形の翻訳がセット化されたものがあり、ここまでの加工状態では以下のような形になっています。
"翻訳元文字列"=> [
[
"単数形の翻訳",
"複数形の翻訳"
]
],
このままだと角括弧の使い方がPHPに準拠していないため、この状態でアップロードすると「重大なエラーが発生しました..」とサイトがストップしてしまいます。
テキストエディターでファイルの冒頭と末尾以外に角括弧がないかを検索し、見つけたら以下のように書き換えていきます(それほど件数はないと思います)。
"翻訳元文字列"=> array(
array(
"単数形の翻訳",
"複数形の翻訳"
)
),
「’」と「”」の扱い
今回の加工手順では、文字列の冒頭と末尾が「”」で囲まれています。PHPでは「’」と「”」のどちらで囲んでも大丈夫なのですが、「,」で区切られた中で、「”」の中に「”」、「’」の中に「’」を入れることはできません。
翻訳文字列の中にはHTMLタグを使ってリンクなどを指定するのに「”」を使いますから、まさに「”」の中に「”」が存在する状態となっていますから、以下のようにして修正します。
【修正前】
"<a href=\"〇〇\">"=>"<a href=\"〇〇\">",
【修正後】
文字列の囲みを「’」へ変更して内部の文字列前の「¥」を削除します
'<a href="〇〇">'=>'<a href="〇〇">',
また、変数(%1$sや%1$dなど)がある場合もシングルクォート「’」でないとうまく認識されないようです。
ただし、どうしても文字列でという場所については「¥」を付けて文字列として扱うようにします
加工に失敗していると、サイトがストップしたり、以下のようなメッセージがページ上部にずらっと表示されたりします。
Warning: Undefined variable $s in /ファイルの場所とファイル名.l10n.php on line 問題のある行の番号
サイトがストップした場合にはFTPなどで一旦ファイルを削除すると元に戻ります
警告メッセージはデバッグモードを有効にしていないと出ませんから、必ず有効にして試すようにしましょう
これで加工はおしまいですといいながら、ファイルによっては結構な加工が必要となりますから、冒頭でも紹介した以下のプラグインを使用するのが恐らく確実かつ簡単でしょう。
正しいファイル名にする
前述したように、ファイル名は「テキストドメイン-ロケール.l10n」、拡張子は「.php」でなければなりません。
従って、例えばプラグインのテキストドメインが「abcdef」、言語が日本語(ja)の場合はファイル名を「abcdef-ja.l10n.php」にします。
これでファイルの編集とファイル名の変更は終了です。
あとは目的のプラグインやテーマの言語フォルダ(またはWordPressの言語フォルダ)など所定の場所へ転送すれば、その.l10n.phpファイルが優先適用され、翻訳の読み込み自体が高速化されます。
ここまで来てアレですが、自身では.moファイルでの読み込みとの差はほぼ感じられませんでした..
最後に、基本的には同名の.moファイルの場所へ転送すれば.phpが適用されるはずですが、そのプラグインやテーマの翻訳ファイルの読み込み方(コード)によっては適用されないケースもありますのでご注意ください。
アップロード作業を行ったことで「重大なエラー..」と表示され、サイトがストップしてしまうことがあります。これはファイル内に不正な文字列がある(前述した角括弧の扱いなど)場合に出ることがほとんどですので、一旦直前にアップロードしたl10n.phpファイルを削除するか、修正したもので上書きすれば解消できますので、エラーとなっても焦らないようにしましょう
結論
ここまでの内容をご覧いただいて、開発環境なし、プラグインなしでl10n.php翻訳ファイルを作成することはできないことはないというのは理解いただけたと思いますが、ファイルの種類によっては多くの加工が必要だったり、エラーでストップした時に戻すスキルが必要など結構大変な思いをするものも少なくありません。
開発環境を用意するのは大変ですが、何度も紹介している「Loco Translate」プラグインであれば普通にサイトへ導入が可能なので、l10n.phpファイルを生成する必要がある場合だけ利用するというのが、結論としては一番確実かつ安全な方法なのではないかと思います。
WordPressはバージョンアップにつれて、ブロック作成や今回の翻訳ファイルの生成など、開発環境ありきで何かをする必要が増えてきていて、簡単に何でもカスタマイズできるというツールではなくなってきている感じがしますね...。
ただ、今回の件に関しては、先ほど書いたように体感としてそれほど効果的ではない感じなのと、維持が大変なので、以下のコードを使ってphp形式の翻訳ファイルを無効にしておくのが一番なのかも知れませんね。
add_filter(
'translation_file_format',
static function () {
return 'mo';
}
);
この措置で無効にしていないと、WordPress本体のlanguagesディレクトリにl10n.phpファイルが存在する場合にはそちらが優先適用されるため、翻訳が更新される度に削除する作業を行う必要があります
なお、l10n.php形式の翻訳に関しては、公式サイトの「I18N Improvements in 6.5 (Performant Translations)」でいろいろと書かれていますので、参考にしてみてください。
【後述】.json形式のファイルは別に用意することが必要
最後にまたややこしい話ですが、WordPress5.0から可能になった、JavaScriptへ直接的に翻訳を適用させることができるjsonファイルというのが翻訳ファイルの種類にあります。
jsonファイルについての詳細は割愛しますが、.l10n.php形式のファイルはあくまでも.moの代わりで、.moよりも高速に読み込みができるというものなので、プログラム上でjson形式のファイルから翻訳を適用させる仕組みになっているプラグインなどでは別途jsonファイルを用意する必要があります。
ひと昔前までは.moファイルさえあれば翻訳が完了していたのに、.jsonが現れ、さらに.l10n.phpが現れ...どんどんややこしくなるWordPress翻訳..と最後にブツブツ言って、本ページを終わります(笑)。
コメントを残す