Skip to content

Latest commit

 

History

History
242 lines (137 loc) · 17.9 KB

07_Multilingual_Support.md

File metadata and controls

242 lines (137 loc) · 17.9 KB

アドオンのUIを複数の言語に対応する

BlenderのUIは英語がデフォルトであることから、海外でも多くの3DCGデザイナーがBlenderを使ってCGを作成しています。このため、アドオンのUIも英語ベースで構築するほうが、アドオンを使ってくれる人が多くなります。
しかし一方で、英語が苦手な方が困らないように、日本語などの英語以外の言語をサポートしたいと思う方もいると思います。そこで本節では、アドオンのUIを複数の言語に対応する方法を説明します。

作成するアドオンの仕様

本節ではアドオンのUIを複数の言語に対応させる方法について説明するため、新たな機能は作らずに前に紹介したサンプルを改造します。このため、本節では次のような仕様のアドオンを作成します。

  • 3-1節 のサンプルを改造し、英語と日本語のUIに対応する

アドオンを作成する

1-5節を参考にして以下のソースコードを入力し、ファイル名 sample_3_7.py として保存してください。

import

アドオンを使用する

アドオンを有効化する

1-5節を参考に作成したアドオンを有効化すると、コンソールウィンドウに文字列が出力されます。言語を日本語にした場合には、以下の文字列が出力されます。

サンプル3-7: アドオン「サンプル3-7」が有効化されました。

一方、言語を英語にした場合は以下の文字列が出力されます。

Sample3-7: Enabled add-on 'Sample3-7'

アドオンの機能を使用する

有効化したアドオンの機能を使い、動作を確認します。3-1節と同じ機能を持つアドオンであるため、本節ではUIの言語を変えたときの動作確認方法の手順のみ説明します。

Work
1
情報 エリアのメニューから ファイル > ユーザー設定... を実行し、システム タブをクリックします。 3-7節 アドオンの使用 手順1

2
ローカライズ のチェックボックスにチェックが入っていることを確認し、言語を 日本語 (Japanese) に設定します。翻訳 ラベルに配置されているボタンが3つとも選択状態であることを確認します。 3-7節 アドオンの使用 手順2

3
3-1節に従ってアドオンを使用し、UIやコンソールウィンドウなどに出力されるメッセージが日本語になっていることを確認します。 3-7節 アドオンの使用 手順3

4
手順1を行った後、ローカライズ のチェックボックスにチェックが入っていることを確認し、言語を 英語 (English) に設定します。翻訳 ラベルに配置されているボタンが3つとも選択状態であることを確認します。 3-7節 アドオンの使用 手順4

5
3-1節に従ってアドオンを使用し、UIやコンソールウィンドウなどに出力されるメッセージが英語になっていることを確認します。 3-7節 アドオンの使用 手順5


アドオンを無効化する

1-5節を参考にして有効化したアドオンを無効化すると、コンソールウィンドウに文字列が出力されます。言語を日本語にした場合には、以下の文字列が出力されます。

サンプル3-7: アドオン「サンプル3-7」が無効化されました。

一方、言語を英語にした場合には以下の文字列が出力されます。

Sample3-7: Disabled add-on 'Sample3-7'

ソースコードの解説

本節のサンプルは3-1節のサンプルを改造したものであるため、3-1節で説明した処理については説明せず、複数の言語に対応する方法について説明します。

複数言語への対応方法

本節のサンプルでは、UIを日本語と英語に対応させます。本書でもUIを日本語にして説明していることから、「Blender自体が公式で日本語に対応しているため、アドオン側で特に何もしなくても自動的に翻訳してくれるのでは?」と思うかもしれません。しかし、Blenderが日本語に対応しているのはあくまで公式の機能のみであり、個人で作成したアドオンなどは、日本語を選んだとしても日本語には変換されずに英語のまま表示されます。このため、アドオンのUIを日本語に対応するためには、アドオン側で対応が必要になります。具体的には、次に示す手順でアドオンを複数の言語に対応させます。

  1. 対応する言語に対する翻訳辞書を作成する
  2. 翻訳辞書を登録する
  3. 翻訳箇所の文字列を自動翻訳関数に置き換える

1. 対応する言語に対する翻訳辞書を作成する

前述しましたが、Blenderが日本語に対応しているのは公式の機能のみです。アドオン開発者が何も対応することなく、Blenderが自動的にアドオンのUIを日本語に翻訳してくれる部分は、ほとんどないと思った方がよいでしょう。このため、Blenderが翻訳できないところは、アドオン開発者が翻訳後(日本語)のテキストをBlenderに教えてあげる必要があります。この時必要になってくるのが、翻訳後のテキストと翻訳前(英語)のテキストを結びつけた翻訳辞書と呼ばれるものです。人間がわからない単語を辞書で調べて翻訳後の単語を知るのと同じように、Blenderはわからない単語(テキスト)を翻訳辞書で調べて翻訳後の単語(テキスト)を知ることができます。ここで単語(テキスト)と書いたのは、単語だけでなくテキスト(文字列)も、翻訳辞書に登録することができるからです。

登録する翻訳辞書は辞書型の変数で、次に示す形式で指定する必要があります。基本的には、ロケールごとにキーと翻訳語のテキストのペアを指定して、辞書を作っていきます。このため、翻訳辞書は2段の辞書型から構成されることになります。

{
    locale: {
        (context, key) : translated_str,
        (context, key) : translated_str,
        ...
    },
    locale: {
        (context, key) : translated_str,
        ...
    }
    ...
}

上記の辞書型に指定する各パラメータの意味を次に示します。

パラメータ 意味
locale 翻訳対象のロケールを指定します。日本語なら "jp_JP" 、英語なら "en_US" を指定します。ロケールの調べ方は後述します。
context コンテキストを指定します。基本的には "*" を指定します。
key 自動翻訳関数(後述)に指定するキー文字列を指定します。同じ key に対して指定した、いずれかの locale に属する translated_str の文字列を指定するとよいと思います。もし作成したアドオンが英語をサポートするのであれば、文字化けしない英語を指定するのがおすすめです。
translated_str 翻訳後の文字列を指定します。現在のBlenderのロケールが locale と同じ、かつ自動翻訳関数にkey が指定されたとき、本パラメータに指定した文字列が表示されます。現在のBlenderのロケールがいずれの locale にも存在しない場合は、key に指定した文字列が表示されます。

パラメータcontextには""以外の値も設定できるようですが、指定できる具体的な値はよくわかっていません。本パラメータを指定する意味がわからない状態で、APIを使用するのはあまりよいとは言えませんが、とりあえず "" を指定しておけば正しく翻訳処理が行われるようです。

本節のサンプルでは、翻訳辞書としてグローバル変数 translation_dict を定義しています。辞書に登録したテキストとその翻訳内容は次の通りです。なお、key にロケールが英語のときの翻訳語の文字列を指定することで、日本語や英語以外のロケールが指定されたときに英語の文字列が表示されるようにしました。

日本語 英語 その他(keyに指定する文字列)
マウスの右クリックで面を削除 Delete Face By Right Click Delete Face By Right Click
サンプル3-7: 選択範囲外です。 Sample3-7: Out of range Sample3-7: Out of range
サンプル3-7: 面以外を選択しました。 Sample3-7: No face is selected Sample3-7: No face is selected
サンプル3-7: 面を削除しました。 Sample3-7: Deleted Face Sample3-7: Deleted Face
サンプル3-7: 削除処理を開始しました。 Sample3-7: Start deleting faces Sample3-7: Start deleting faces
サンプル3-7: %d個の面を削除しました。 Sample3-7: %d face(s) are deleted Sample3-7: %d face(s) are deleted
開始 Start Start
終了 End End
サンプル3-7: アドオン「サンプル3-7」が有効化されました。 Sample3-7: Enabled add-on 'Sample3-7' Sample3-7: Enabled add-on 'Sample3-7'
サンプル3-7: アドオン「サンプル3-7」が無効化されました。 Sample3-7: Disabled add-on 'Sample3-7' Sample3-7: Disabled add-on 'Sample3-7'

Blenderに設定されたロケールを調べる方法

ロケールは、IT用語で言語や国・地域ごとに異なる表記方法の集合のことを指します。つまり、ロケールを変えると表示方法が指定したロケールの表記方法に従って表示されるようになります。例えば、ロケールを日本語にした場合は、UIなどで表示される文字列が日本語になりますし、ロケールを英語にすれば英語で表示されるようになります。Blenderもこのロケールに従って、UIやメッセージなどの表示内容を決定します。

Blenderに設定されている現在のロケールを調べるためには、Pythonコンソール エリアから次のコードを実行します。コードを実行すると、現在のロケールが文字列で表示されます。ここで表示された文字列を翻訳辞書の locale に指定します。アドオンでサポートする全ての言語について、この方法を利用して一通り確認しておくとよいでしょう。

>>> bpy.app.translations.locale
'en_US'

2. 翻訳辞書を登録する

作成した翻訳辞書をBlenderに登録します。サンプルでは、register() 関数において bpy.app.translations.register() 関数を呼び出すことで翻訳辞書を登録します。

import:"register_dict", unindent:"true"

bpy.app.translations.register() 関数の第1引数には、翻訳辞書の登録先モジュールを指定します。bpy.utils.register_module() の引数に __name__ を指定して自身のモジュールを登録したときと同じように、bpy.app.translations.register() 関数の引数に __name__ を指定することで、自身のモジュールに対して翻訳辞書を登録することができます。bpy.app.translations.register() 関数の第2引数には、翻訳辞書を保存した変数を指定します。

なお、登録した翻訳辞書は、不要になった時点で bpy.app.translations.unregister() 関数を用いて登録を解除する必要があります。サンプルでは、アドオンを無効化したときに翻訳辞書を登録解除するため、unregister() 関数の処理内で bpy.app.translations.unregister() 関数を呼び出します。

3. 翻訳箇所の文字列を自動翻訳関数に置き換える

翻訳辞書の登録を行うと、Blenderの現在の言語設定(ロケール)に応じて、自動翻訳関数で指定したキーに対応した文字列が表示されるようになります。このため、翻訳を行いたい箇所を自動翻訳関数 bpy.app.translations.pgettext() で置き換えます。

本節のサンプルでは複数の箇所に自動翻訳関数を追加していますが、ここではアドオン有効化時にコンソールウィンドウへ文字列を表示する部分について説明します。

import:"translation_func", unindent:"true"

自動翻訳関数 bpy.app.translations.pgettext() の引数には、表示したい翻訳後の文字列 translated_str に対応する key に指定した文字列を指定します。上記の例では、引数に "Sample3-7: Enabled add-on 'Sample3-7'" を指定することで、ロケールが英語("en_US")の場合は "Sample3-7: Enabled add-on 'Sample3-7'" が、ロケールが日本語("ja_JP")の場合は "サンプル3-7: アドオン「サンプル3-7」が有効化されました。"bpy.app.translations.pgettext() 関数の戻り値として返ります。関数の戻り値を print() 関数で表示することで、ロケールに応じてコンソールウィンドウに出力される文字列が変わるため、ユーザがBlenderの言語設定を変えた時に、あたかも自動的に翻訳されているようにみえます。

なお、bpy.app.translations.pgettext() を用いることで文字列の翻訳が完了しますが、次に示す処理のように文字列フォーマットによる文字列を翻訳する場合は、代わりに bpy.app.translations.pgettext_iface() を用いる必要があることに注意が必要です。

import:"translation_func_with_format", unindent:"true"

まとめ

本節では、Blenderの言語設定を変更した時に、アドオンが表示するテキストを設定した言語に自動的に変更する方法を説明しました。アドオンのUIを多言語化する上で必要な処理はそれほど多くないため、翻訳用の辞書を作成するところが一番大変かもしれません。特に翻訳量が多い場合は、翻訳に時間を使ってしまってアドオンの開発どころではなくなってしまうかもしれません。このため、正確さに少し難がありますが、Python向けに用意されている自動翻訳APIを利用して自動翻訳に頼ってしまう方法もあります。翻訳数をもとに、自動翻訳を利用することを検討してみてください。

海外に向けてアドオンを提供することを考えている方は、ぜひこの機会にアドオンのUIの多言語化に挑戦してみてください。世界共通語といってもよい英語をサポートするだけで、アドオンを使ってくれるユーザは非常に多くなりますし、海外の方からのフィードバックを得られる機会も多くなります。このフィードバックがきっかけで、海外のBlenderユーザと知り合いになれるかもしれません。ただし海外に向けてアドオンを提供する場合は、翻訳数が多すぎるなどよほどのことがない限り、自動翻訳を利用しない方がよいです。自動翻訳された日本語をみて違和感を感じるのと同じように、自動翻訳によって日本語を別の言語に翻訳するとどうしても違和感のある訳になってしまうため、ユーザを混乱させてしまいます。

ポイント

  • アドオンのUIを複数の言語に対応させるためには、開発者が作成した翻訳辞書を bpy.app.translations.register() 関数で登録し、翻訳する文字列を bpy.app.translations.pgettext() で置き換える必要がある
  • Blenderがサポートするすべての言語について辞書を作成するのは時間がかかるため、最初は英語をサポートすることからはじめよう