AumCreate

.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 ステップ

  1. .pot を探す。たいていプラグインやテーマのフォルダの languages/ にあります。
  2. 次の節の命名規則に従って、自分の言語の .po としてコピーする。
  3. 項目を翻訳する:PO エディタで 1 行ずつ、あるいは一括で。プレースホルダーは原文のとおり、1 文字も変えないこと。
  4. .po を .mo にコンパイルし、両方を WordPress が探す場所に置く。gettext が入っていなければブラウザだけでコンパイルできます

ファイルが大きい場合、日単位で時間を食うのは手作業の翻訳です。PO / POT 翻訳ツールは 1 回で全体を訳し、同じ形式で書き出します。送るのは文字列だけで、ファイルはアップロードされません。

ファイル名は細部ではなく、そのものです

WordPress は {テキストドメイン}-{ロケール}.mo という名前で探します。1 文字でも違えば、WordPress にとってそのファイルは存在しません。黙って英語に戻ります。エラーも通知も手がかりもありません。訳し終えたファイルが何もしない原因の第 1 位がこれです。

  • テキストドメインはプラグインやテーマ固有のもの:woocommercetwentytwentyfivemy-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/ フォルダ:動きますが、次の更新でフォルダごと置き換わり、訳文は消えます。

正しく見えるのに効かない,この順に確認する

  1. そもそも .mo はありますか。.po だけでは何も起きません。まずこれを消し込みます。
  2. ファイル名は厳密に {テキストドメイン}-{ロケール}.mo ですか。テキストドメインはプラグインヘッダーで、ロケールは WordPress の一覧で確認します。
  3. サイトの言語は本当にその言語に設定されていますか(設定 → 一般)。
  4. ファイルは wp-content/languages/… にありますか。プラグインのフォルダにしか無く、そのプラグインが更新されていたなら、もう消えています。
  5. それでもだめなら、オブジェクトキャッシュとページキャッシュを消します。翻訳はリクエストごとに 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、サイトマップ。プラグインのページ