自分が作成した GIMP3 プラグインを海外の人に使ってもらうには UI の国際化が必須です。そして、GIMP プラグイン開発における UI の国際化の標準的な方法については、すでに以下の 2 本の記事で紹介しました。
すでにご紹介したように、Python の多言語国際化用ライブラリを使うことがデフォルトとされているようですが、これを使う場合、poedit というアプリケーションを使って、コンパイルし mo 形式のバイナリファイルを作成しなければいけません。これは GIMP や darktable といった複雑なアプリケーションの大量の UI メッセージを国際化するには非常に便利ですが、UI に使われるメッセージ量が少ない場合、わざわざ poedit を起動して mo ファイルをコンパイルして... というのは結構手間です。
また、GIMP の UI は右書きのアラビヤ語やヘブライ語なども含む非常に多くの言語に翻訳されており、そのすべての言語を網羅する翻訳 mo ファイルをプラグイン作者が一人で全て賄うのも、仮に翻訳ツールを使うにしても、とても大変です。ですので、翻訳ファイルを用意しきれない言語に関しては、エンドユーザが自分で翻訳してもらえたら助かります。

しかし、専門翻訳ボランティアなら poedit を使って翻訳していくメリットは大きいのですが、一般エンドユーザに poedit を使っていちいち mo ファイルをコンパイルしろ、というのはちょっと無理があると思います。しかもそれぞれのプラグインの翻訳すべきメッセージ量は少ないので、なおさら poedit を使えとは言い難いです。
ちなみに当ブログでは以下で poedit を使った翻訳の仕方を紹介しています。
そこで、エンドユーザが poedit など使わなくても簡単に自力で翻訳ファイルを作れる、代替国際化の方法を考えました。これはすでに私が作成している GIMP3 プラグインに採用しています。この方法では、GIMP標準方式で使用されるmoファイルではなく、プログラマーが翻訳ファイルとしてプレーンテキストファイルを使用します。
この実装の目的は、言語ファイルが提供されていない一般エンドユーザーが自ら言語ファイルを作成できるようにすることです。翻訳ファイルは本プラグインディレクトリ下の「locale」ディレクトリに配置されます。自身の言語ファイルが見つからない場合、localeディレクトリに「default.txt」をオンラインAI翻訳サービスに投下し、結果を[言語コード].txtとしてlocaleディレクトリに保存すれば、簡単にスクリプトをローカライズできます。
比較的シンプルなサンプルファイルはこちらからダウンロードできます。
このサンプルプログラムは2つのファイルで構成されています。メインファイル(IN_sample_g3.py)とヘルパーファイル(translate_smpl.py)です。ヘルパーファイルは言語環境を認識し、「locale」ディレクトリ内の各言語翻訳ファイルを読み込みます。翻訳ファイルのフォーマットは以下の通りです。ファイルの各行は…
メッセージキー;翻訳スクリプト
という構成になっています。
例えば...
----------
MNU_LBL;国際化UIサンプル (コンボボックス)
MNU_EXPLANATION;国際化UIのサンプルプログラム
DLG_TITLE;国際化のサンプル
LBL_COMBO_SEL;チャンネルを選択してください:
----------
この形式はART / RawTherapeeの翻訳ファイルと同じです。ヘルパーファイルは、これらのメッセージキーを使用してファイルの内容を辞書型リスト変数に保存します。翻訳ファイルの名前は[ロケールコード].txtです。日本語の場合、ファイル名は ja.txt となります。
メインファイルは、このリスト変数 (以下のサンプルでは、mTrans) をデフォルト値(英語の説明文)で事前に準備し、ヘルパーファイルを呼び出します。
[デフォルト値を準備するコード]
import translate_smpl #------- for Internationalization ----- \# mTrans: list for message translation mTrans = dict( MNU_LBL = "IN sample with Combo box", MNU_EXPLANATION ="sample program of Internationalization UI.", DLG_TITLE = "sample of Internationalization", LBL_COMBO_SEL = "Select the channel:", LBL_CHOICE1 = "Lightness", LBL_CHOICE2 = "Red", LBL_CHOICE3 = "Green", LBL_CHOICE4 = "Blue", TP_COMBO_SEL = "Select the channel where you can see \n" + \ "the spots the most clearly.", LBL_RESULT = "Input Result:", LBL_BUTTON_C ="Cancel", LBL_BUTTON_O ="OK", MSG_ERR1 = "User canceled the operation." )
[ヘルパーファイルの呼び出し]
def do_set_i18n (self, name): print("i18n name: ", name) global mTrans try: print("Read locale file Start") mTrans = translate_smpl.open_locale_file(mTrans) except: print("cannot read translation list") return True
ヘルパーファイルが言語ファイルを正常に読み込んだ場合、リスト変数の内容は読み込んだ言語ファイルの内容に置き換えられます。読み込めなかった場合は、元のまま (つまり英語メッセージのまま) 保持されます。実際に UI に表示するメッセージは、このリスト変数を使用してメッセージキーで呼び出されます。例えば…
channels = [ mTrans["LBL_CHOICE1"], mTrans["LBL_CHOICE2"], mTrans["LBL_CHOICE3"], mTrans["LBL_CHOICE4"] ]
というようなコードになります。
このサンプルの中で、私はデフォルトの翻訳ファイル(default.txt)を用意しました。このファイルは運用時には使用されません。このファイルは、エンドユーザーがこれによって自分の言語向けの翻訳ファイルを作成するために用意しています。
なお、プログラマーの方は、AI翻訳サービスで翻訳されないようメッセージキーを設定してください。というのは、エンドユーザーがこれらの翻訳サービスでデフォルトファイルを翻訳しようとする可能性があるためです。
例えば、以下のようなメッセージキーと実際のメッセージの組み合わせを作成した場合…
RED;Red
これを翻訳サービスでフランス語に翻訳すると、メッセージキーも含めて次のように簡単に翻訳されてしまいます。
ROUGE;Rouge
この場合、エンドユーザーはメッセージキーを元の状態、つまり "RED" に戻す手間を掛ける必要があります。
しかし、以下のように組み合わせた場合は...
LBL_RED;Red
翻訳サービスに掛けると以下のようになり、メッセージキーは翻訳されず、実際のメッセージのみが翻訳されます。
LBL_RED;Rouge
つまり、メッセージキーの LBL_RED という文字列は、英単語として無意味な文字列としてみなされるので、翻訳されずに済むからです。
この場合、エンドユーザーはすぐに翻訳ファイルを作成できます。エンドユーザは、翻訳結果を適切なファイル名でテキストファイルとして保存し、ロケールディレクトリに配置するだけで済むのです。poedit の使い方を学ぶ必要はありません。
また、このように、標準的な方法と異なる方法で翻訳の仕組みを実装したとしても、これが他のプラグインや GIMP 全体のシステムに対して害を及ぼすことはありません。
なお、私は現在自作の GIMP3 プラグインに対し、ART のサポート言語からブラジル系ポルトガル語を除いた言語*1に、ポーランド語を加えた言語のファイルを用意しています。このうち自分のわかる言語 (日本語、英語、韓国語) を除いた言語ファイルは、DeepL もしくは Google 翻訳の結果をそのまま添付しています。ART のサポート言語をベースにして翻訳言語を決めているのは、現在私が ART の公式日本語翻訳を担当しているためです。またポーランド語を加えているのは、私のプラグインに関心を持っていただいている方がポーランドにいるためです。
これ以外の言語の方には、上の仕組みで自力で翻訳してください、ということにしています。