WordPressプラグインの日本語翻訳を自動更新後でも独自翻訳にて常に強制上書きする方法

WordPressのプラグインは非常に優秀で、必要な機能はほとんどが誰かによって無料で提供されています。

その中には海外製のものも多く、日本向けにローカライズされているものの、日本語の翻訳が不自然なプラグインも少なくありません。

不自然な日本語が気になる方は、正しい日本語の修正案を公式フォーラムに提出し、修正を待つことも可能です。しかし、修正案が採用されるかどうかはプラグインの提供者によるところで、いつまでも不自然な日本語のままであることもあります。

そこで、今回はそういった方々のために、自分で不自然な日本語を直訳し、プラグインの自動更新後も自分の独自の翻訳が優先的に適用される方法を解説します。

日本語が不自然なプラグインを使って困っている方は、ぜひ自分の翻訳を試してみてください。

目次

翻訳ファイルの準備

WordPressの翻訳ファイルは2つあります。

.mo

翻訳ファイル本体

.po

翻訳ファイル作成用のテキストファイル

.poのファイルはテキストエディタなどで開いて翻訳内容を確認したり、修正などが出来たりします。

.moのファイルはWordPressが読み込むように変更されたファイルですので、テキストエディタで開いても文字化けして中身の確認や修正などは出来ません。

自分で翻訳ファイルを作成するとなれば、専用のツールにて.poのファイルを開き翻訳作業を行い.moファイルを作る必要があります。

Poedit

WordPressの翻訳作業に使う専用ツールはPoeditが有名です。

こちらのツールをダウンロード後、インストールを行い.poファイルを開いて翻訳作業を行いましょう。

翻訳ファイルの場所

翻訳ファイルの場所
翻訳ファイルの場所
/wp-content/languages/plugins/

WordPressの翻訳機能で翻訳された場合はこちらのディレクトリにあります

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

プラグインで独自に用意されている場合はこちらにあります

両方存在する場合どっちを使えば良いの?

/wp-content/languages/plugins/にある.poファイルを使って下さい。
WordPressの翻訳機能で作成されたファイルが最新だからです。

Poeditの使い方

ツールを起動すると以下の画面が表示されますので、翻訳したい.poファイルを開いてみましょう。

Poeditの起動画面

今回は例としてakismet-ja.poを開いてみます。

Poeditの編集画面

この画面から必要な箇所を翻訳して上書き保存するとakismet-ja.poがあるフォルダ内にakismet-ja.moファイルが同時に生成されます。

そのファイルをサーバーにアップロードすれば独自翻訳ファイルの完成です。

必要な翻訳のみにする

今回のコードでは、常に最新の翻訳状態を保つために、まず独自の翻訳を読み込み、次にオリジナルの翻訳を読み込むように設定されています。

WordPressの内部では、同じ翻訳箇所が存在した場合、最初に読み込んだ翻訳が優先され、後から読み込んだ翻訳は適用されません。このルールを利用して、独自の翻訳は必要最低限の箇所のみに限定することで、プラグインの更新後も常に最新の翻訳が自動的に適用されるようになります。

したがって、.poファイルをテキストエディタで開き、該当する翻訳箇所以外をすべて削除する作業を行います。

#: Program.php:478
msgid "hello"
msgstr "こんにちは"
コード解説
1行目

プログラムの該当行

msgid

翻訳前のテキスト

msgstr

翻訳後のテキスト

翻訳箇所は上記のブロックで一塊なので、最上部の” ”で囲まれた部分は削除せずに、翻訳箇所のみ綺麗に残すようにしましょう。

functions.phpにて実装

子テーマの階層

翻訳ファイルは子テーマなどの階層にlanguagesフォルダを作成しアップロードします。

以下のコードでは現在のスタイルシートが適応されている場所のlanguagesフォルダ内にある.moファイルを指定しておりますので、アップロード先を変更した場合は、適宜読み込み先を変更して下さい。

完成コード

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

    $custom_mo_file   = get_stylesheet_directory() . '/languages/' . $mo_file;
    $original_mo_file = WP_CONTENT_DIR . '/languages/plugins/' . $mo_file;

    // 翻訳ファイルが存在しない場合、プラグインのオリジナルを読み込む
    if (!file_exists($original_mo_file)) {
        $original_mo_file = WP_PLUGIN_DIR . '/' .$domain . '/languages/' . $mo_file;
    }

    // 翻訳ファイルの位置が適正である場合に処理実行
    if (file_exists($original_mo_file)) {
        unload_textdomain($domain);
        load_textdomain($domain, $custom_mo_file);
        load_textdomain($domain, $original_mo_file);
    }
});

詳細な解説を含んだコードも併せて明記しておきます。

コード解説

add_action('after_setup_theme', function() {
    // プラグイン名(プラグインのディレクトリ名)
    $domain  = 'プラグイン名';
    
    // プラグインの.moファイル名
    $mo_file = $domain . '-' . get_locale() . '.mo';

    // 独自翻訳の.moファイルへの相対パス(保存場所が違う場合は要変更)
    $custom_mo_file = get_stylesheet_directory() . '/languages/' . $mo_file;

    // プラグインのオリジナル.moファイルへの相対パス
    $original_mo_file = WP_CONTENT_DIR . '/languages/plugins/' . $mo_file;

    // WPの翻訳ファイルが存在しない場合、プラグインディレクトリのオリジナルを読み込む
    if (!file_exists($original_mo_file)) {
        $original_mo_file = WP_PLUGIN_DIR . '/' .$domain . '/languages/' . $mo_file;
    }

    // 翻訳ファイルの位置が適正である場合のみ処理実行
    if (file_exists($original_mo_file)) {
        // 既に読み込まれた翻訳を一旦削除
        unload_textdomain($domain);
        
        // 先に独自翻訳を読み込む(必要最低限の翻訳にしておく)
        load_textdomain($domain, $custom_mo_file);
        
        // 最後にオリジナルの翻訳を読み込む(最新翻訳を当てるため)
        load_textdomain($domain, $original_mo_file);
    }
});

コードの詳細な解説

今回のコードでは翻訳の上書きを防ぐために、様々な回避策を講じています。

これらの回避策について、簡単な解説を備忘録として以下にまとめました。

上書きの回避

プラグインの翻訳ファイルを直接編集する方法は、プラグインのアップデート時に強制的に上書きされてしまうという欠点があります。

その度に翻訳ファイルを手直しするのは大変手間がかかります。そこで、翻訳ファイルを別に用意し、functions.phpから独自翻訳を優先的に読み込む方法を採用しました。

最新翻訳の適応

独自翻訳ファイルのみを読み込む方法を選択した場合、その翻訳ファイルは常にプラグインの最新バージョンの翻訳ファイルと比較し、差異があれば手動でアップデートする必要があります。

さもなければ、自分で翻訳した箇所以外は古い翻訳のまま残ってしまうことになるからです。

しかし、この方法では手作業で差異を確認し、翻訳をアップデートする必要があり、かえって作業量が増加してしまうというデメリットがあります。自動更新で放置できる状態とは言えず、効率的な運用とは言い難いでしょう。

そこでプラグインの最新翻訳ファイルを先に読み込み、必要に応じて自分の翻訳ファイルを上書きする方法が出来ないか探しました。

翻訳ファイルのマージ(合体)

WordPressでは、複数の翻訳ファイルを読み込み、同じ翻訳箇所が存在する場合、最初に読み込まれた翻訳が優先的に使用されます。

functions.phpでコードを実行する際、プラグインのオリジナル翻訳がすでに読み込まれている状態だったため、以下の手順で翻訳を読み込むように調整しました。

翻訳ファイルの読み込み順序
STEP
プラグインオリジナル翻訳ファイルを一度削除

unload_textdomain($domain);

STEP
自分の独自翻訳ファイルを最初にロード

load_textdomain($domain, $custom_mo_file);

STEP
プラグインオリジナル翻訳ファイルを最後にロード

load_textdomain($domain, $original_mo_file);

上記の調整により、独自翻訳が確実に優先されるようになりました。

実装例

実際に私のサイトでプラグインを翻訳して使用している実装例、カスタマイズ内容を記事にしております。

理解を更に深めたい方は以下の記事も読むと良いでしょう。

あとがき

今回、私が愛用しているプラグインの翻訳が一向に更新されず、公式フォーラムにて日本語修正の提案を何度行っても無視され、機械翻訳のままだったため、どうにか自分で翻訳し、プラグインの自動更新にも対応できる方法がないかな?と探して実現した方法です。

この方法により、翻訳が微妙だったプラグインも完全日本語対応が可能になりました。同じ現象でお困りの方は、ぜひ参考にしてください。

また、この記事を書くにあたって以下の記事を参考にさせていただきました。良質な記事をありがとう!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

このサイトはreCAPTCHAによって保護されており、Googleのプライバシーポリシー利用規約が適用されます。

reCAPTCHAの認証時間が切れたため、ページを再読み込みしてください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次