.pot・.po・.mo:WordPress の言語ファイルとは何か、どう翻訳するか
· 2026年9月23日 に実画面で確認
テーマやプラグインには .pot ファイルが同梱されています。翻訳可能な文字列がすべて入っていて、訳文は空です。これを自分の言語の .po にコピーして訳文を埋め、その .po を .mo にコンパイルします。WordPress が実行時に読むのは .mo で、.po だけではサイトの表示は 1 文字も変わりません。
入力した訳文が反映されない場合、答えはほぼ必ずこのページの最後の 2 節にあります。コンパイルしていないか、ファイル名が違うかです。
3 つのファイル、それぞれ 1 行で
- .pot,テンプレート。テーマやプラグイン内の翻訳可能な文字列がすべて入り、訳文は空。開発者がソースから生成します。編集するものではなく、コピーするものです。
- .po,ある 1 言語。人が読めるテキストで、原文の下に訳文が並びます。実際に作業するのはこのファイルです。
- .mo,.po をコンパイルしたもの。バイナリで、人が読むためのものではありません。WordPress が読み込むのはこれです。
WordPress 6.5 からは 4 つめとして .l10n.php があります。読み込みが速く、存在すれば優先され、.mo はフォールバックになります。自分で用意する必要はなく WordPress が生成しますが、置いた覚えのないファイルが見える理由はこれです。
.pot から実際に効くまで、4 ステップ
- .pot を探す。たいていプラグインやテーマのフォルダの
languages/にあります。 - 次の節の命名規則に従って、自分の言語の
.poとしてコピーする。 - 項目を翻訳する:PO エディタで 1 行ずつ、あるいは一括で。プレースホルダーは原文のとおり、1 文字も変えないこと。
- .po を .mo にコンパイルし、両方を WordPress が探す場所に置く。gettext が入っていなければブラウザだけでコンパイルできます。
ファイルが大きい場合、日単位で時間を食うのは手作業の翻訳です。PO / POT 翻訳ツールは 1 回で全体を訳し、同じ形式で書き出します。送るのは文字列だけで、ファイルはアップロードされません。
ファイル名は細部ではなく、そのものです
WordPress は {テキストドメイン}-{ロケール}.mo という名前で探します。1 文字でも違えば、WordPress にとってそのファイルは存在しません。黙って英語に戻ります。エラーも通知も手がかりもありません。訳し終えたファイルが何もしない原因の第 1 位がこれです。
- テキストドメインはプラグインやテーマ固有のもの:
woocommerce、twentytwentyfive、my-cool-plugin。プラグインヘッダーで宣言され、フォルダ名と同じとは限りません。 - ロケールは WordPress のもので、2 文字の言語コードではありません。日本語は
ja、アラビア語はar、フィンランド語はfiと地域なし。一方で簡体字中国語はzh_CN、英語はen_US、フランス語はfr_FRです。 - 元ファイルに既にロケールが入っている場合(
woocommerce-en_US.po)は、先に外してから付け直します。さもないとwoocommerce-en_US-ja.moのような、何にも一致しない名前になります。
ファイルの置き場所
2 か所とも機能しますが、プラグイン更新時に差が出ます。
wp-content/languages/plugins/とwp-content/languages/themes/,こちらを使うこと。 WordPress が先に見る場所で、プラグインやテーマの更新で上書きされません。- プラグインやテーマ自身の
languages/フォルダ:動きますが、次の更新でフォルダごと置き換わり、訳文は消えます。
正しく見えるのに効かない,この順に確認する
- そもそも
.moはありますか。.poだけでは何も起きません。まずこれを消し込みます。 - ファイル名は厳密に
{テキストドメイン}-{ロケール}.moですか。テキストドメインはプラグインヘッダーで、ロケールは WordPress の一覧で確認します。 - サイトの言語は本当にその言語に設定されていますか(設定 → 一般)。
- ファイルは
wp-content/languages/…にありますか。プラグインのフォルダにしか無く、そのプラグインが更新されていたなら、もう消えています。 - それでもだめなら、オブジェクトキャッシュとページキャッシュを消します。翻訳はリクエストごとに 1 度だけ読み込まれ、強くキャッシュされます。
プレースホルダー:ここだけは緩められません
%1$s 件中 %2$s 件を表示 のような文字列には、PHP が値を入れるプレースホルダーが入っています。訳文で 1 つ落とす、番号付きの形にせず順序を入れ替える、%s を全角の %s にしてしまう:これは表示の問題ではなく、実際のページで起きる実行時エラーです。ファイルを出す前にプレースホルダーを点検してください。まともなコンパイラなら指摘してくれます。
よくある質問
- .po ファイルをそのままアップロードではだめですか。
- だめです。WordPress が読むのは `.mo`(6.5 以降は `.l10n.php` も)で、`.po` は読みません。languages フォルダに `.po` を置いてもサイトは 1 文字も変わりません。だからこそ多くの人がここで止まります:壊れてもおらず、何も報告されず、サイトは英語のままです。
- gettext や Poedit のインストールは必要ですか。
- コンパイルには不要です。ブラウザだけで .po を .mo にできます:[こちらはローカルで変換する](/tools/po-compiler?utm_source=guide&utm_medium=tutorial&utm_campaign=po-files)ので、ファイルは手元から出ません。1 行ずつ丁寧に編集するなら、デスクトップの PO エディタのほうが快適です。
- .pot に入っていない文字列はどうすればいいですか。
- ソースコードで翻訳可能として印が付いていないので、どんな言語ファイルも届きません。テーマやプラグイン自体の修正が必要で、言語ファイルでは解決しません。自分で書いたコンテンツ(固定ページ・商品・投稿)はさらに別の話で、.po ではなく多言語プラグインの領域です。
- テーマは翻訳されたのにプラグインは英語のままです。なぜですか。
- テーマもプラグインも、それぞれ固有のテキストドメインと言語ファイルを持ちます。片方を訳しても他方には影響しません。WordPress が対応する言語なら、多くは translate.wordpress.org から自動で訳文が届きます。残る穴はたいてい商用プラグインで、誰も訳していないからです。
このガイドで使うプラグイン
AumLangElementor・Gutenberg・WooCommerce のコンテンツをレイアウトを崩さずに翻訳し、SEO 側も正しく:言語ごとの URL、hreflang、canonical、サイトマップ。プラグインのページ →