WPプラグインの日本語翻訳をカスタマイズ(更新時上書き防止)

はじめに

WordPressでサイト制作する時、様々なプラグインにお世話になります。海外の方が作成したものが多いため翻訳ファイルは欠かせませんが、たまに変な日本語になっていたり、言い回しや文言をカスタマイズしたい時があります。

翻訳ファイルを直接編集するのがお手軽ですが、アップデートがあった場合に上書きされてしまうのが問題です。

今回は、更新時の上書きを回避する方法をご紹介したいと思います。(スマートでベストな方法とは言い難いですが、現時点で自分の中ではベターかなと思います。)

functions.phpファイルの編集などができる方を対象にしています。

問題と解決

方法のご紹介の前に、問題点とその解決方法についてまとめてみました。不要な方は実装手順まで飛ばしてください。

上書き問題

翻訳ファイルの対象箇所を直接修正すると、更新時に上書きされて勝手に元に戻ってしまう事があります。翻訳ファイルは、こちら(WordPress公式)で有志の方などによって頻繁にアップデートされており、対象のプラグインに対応する翻訳ファイルがある場合、自動的に適応されるようです。

解決方法

翻訳ファイルは、あらかじめ決められた場所にダウンロードされており、更新時はその場所にあるファイルを上書きします。なので、所定の場所とは別の場所に翻訳ファイルを置いて、functions.phpファイルで読み込む事で回避します。

新しい更新内容が適応されない問題

上書き問題を回避する場合、新たに問題が発生します。所定の場所にある翻訳ファイルを使わずに別の場所に設置した翻訳ファイルを読み込んでいるため、翻訳ファイルがアップデートされてもそれが反映されないという事になります。

解決方法

複数の翻訳ファイルを読み込む際、それぞれの内容がマージ(合体)されるという特徴があるようなので、公式から提供されている翻訳ファイルと編集した翻訳ファイルを両方読み込むようにします。

マージのルール問題

複数の翻訳ファイルを読み込む際、同じ翻訳箇所がある場合、最初に読み込んだ方が優先されるようです。

解決方法

自作翻訳ファイルを作る際は、修正箇所のみで構成された翻訳ファイルにします。また、読み込む順番として、「自作ファイル」→「元の翻訳ファイル」とします。

翻訳ファイルの読み込み順問題

「自作翻訳ファイル」→「元の翻訳ファイル」と読み込みたいところですが、「元の翻訳ファイル」はプラグイン読み込み時に行われてしまうようで、「自作翻訳ファイル」の読み込みよりも先に読み込まれてしまう。

解決方法

先に読み込まれた「元の翻訳ファイル」を一旦解除してから「自作翻訳ファイル」→「元の翻訳ファイル」の順で読み込み直す。

実装手順

上記の問題と解決を踏まえた上で、以下の手順で実装して行きたいと思います。

  • 自作翻訳ファイルの作成
  • functions.phpに関数追加

自作翻訳ファイルの作成

翻訳ファイルについて

翻訳ファイルは拡張子が、.mo.poのファイル2つで1つとなっています。

.mo 翻訳ファイル本体
.po 翻訳ファイル作成用テキストファイル

.poの方はただのテキストファイルなのでテキストエディタで開いて簡単に編集できます。編集後にコンパイルして.moファイルを作成します。

コンパイルには以下のソフトがおすすめ。編集などもできます。

翻訳ファイルのコピー

一から作るのは大変なので、元の翻訳ファイルをコピーして編集します。元の翻訳ファイルは以下の場所にあります。(多分)

/wp-content/languages/plugins/

プラグインが独自に用意している場合などは、以下の場所にあるかもしれません。

/wp-content/plugins/[プラグイン名]/

その中に、

[プラグイン名]-ja.mo
[プラグイン名]-ja.po

という2つのファイルがあるので、[プラグイン名]-ja.poの方を任意の場所(今回はテーマフォルダに「languages」フォルダを作成してその中)にコピーします。

翻訳ファイルの編集

[プラグイン名]-ja.poをテキストエディタで開いて編集します。先頭何行かはヘッダがありますが、以降は以下のような対象文字翻訳文字のペアになっていると思います。

#: 説明文など
msgid "User Name"
msgstr "ユーザー名"

対象の箇所を修正したら、問題と解決での説明の通り、修正を行ったペアのみを残して他のペアは削除します。

コンパイル

コンパイルには、先程紹介したPoeditを使います。詳しい使い方はググってもらえばわかると思いますが、ここではコンパイルしたいだけなので、[プラグイン名]-ja.poファイルをPoeditで開いて「保存」ボタンを押すだけです。するとコンパイルされた[プラグイン名]-ja.moファイルが同階層に出来上がります。

functions.phpに関数追加

自作翻訳ファイルが出来たので、後は以下の関数をfunctions.phpファイルに追記するだけです。

プラグイン名の所だけ書き換えればコピペでOKです。

add_action('after_setup_theme', 'replace_textdomain');
function replace_textdomain()
{
    $domain = 'プラグイン名';
    $mofile = $domain . '-' . get_locale() . '.mo';

    $custom_mofile = get_stylesheet_directory() . '/languages/' . $mofile;
    $original_mofile = WP_CONTENT_DIR . '/languages/plugins/' . $mofile;

    unload_textdomain($domain);
    load_textdomain($domain, $custom_mofile);
    load_textdomain($domain, $original_mofile);
}

元の翻訳ファイルが、/wp-content/languages/plugins/以外の場所にあった場合は、$original_mofileのパスを修正してください。

解説付きコード

# 'after_setup_theme'フックでテーマ読み込み後に以下の関数を実行します。
add_action('after_setup_theme', 'replace_textdomain');
function replace_textdomain()
{
    # 対象のプラグイン名
    $domain = 'プラグイン名';
    # 翻訳ファイルの名前を定義
    $mofile = $domain . '-' . get_locale() . '.mo'; # get_locale()で「ja」を取得(日本の場合)

    # 自作翻訳ファイルの場所(相対パス)
    $custom_mofile = get_stylesheet_directory() . '/languages/' . $mofile;
    # 元の翻訳ファイルがある場所(相対パス)
    $original_mofile = WP_CONTENT_DIR . '/languages/plugins/' . $mofile;

    # 既に読み込み済みの翻訳ファイルを一旦解除します。
    unload_textdomain($domain);

    # 自作翻訳ファイル→元の翻訳ファイルの順で読み込み直します。
    load_textdomain($domain, $custom_mofile);
    load_textdomain($domain, $original_mofile);
}

まとめ

少し力技っぽい方法ですが、今のところ他に良い方法が思いつかないので記事に残しておきます。今回はプラグインの翻訳ファイルを対象にしていますが、テーマの翻訳ファイルのカスタマイズについても同様の方法でいけると思います。