テキストのローカライズ
使用言語に合わせて表示を変えるlocalize関数を使用すると、スクリプトで表示されるテキストを言語環境に合わせて変えることができる。
日本語環境では日本語で、英語環境では英語で...といった感じ。もちろん自動翻訳ではないので、それぞれの言語に翻訳したテキストは自分で用意しないといけない。社内向けや個人使用レベルなら不要だが、世界向けに販売するなどあれば使ってもいいかもしれない。
基本的な使い方
テキストを各言語で書いたものをオブジェクトとしてまとめておく。実態はただのオブジェクト。
キー名はそれぞれのロケール名(英語:en、ドイツ語;de、日本語:jaなど)にしておく。記述を変えればOS毎に区別も出来る。ロケール名について詳しくは後述。
それを localize() の引数にすることで、自動的に現在の環境に適したものを選んでくれる。
msg = { en: "Hello, world", de: "Hallo Welt" , ja : "ハローワールド" };
alert (localize (msg));
(JavaScript Tools Guideより一部改変)
文字列内に引数を含ませる
表示したい文字列の中に変数を入れたい場合、localize() メソッドの第2引数以降に入れる。%n の形で文字列内に入れておくと、それが追加引数の値で置き換わる。
言語によって表示順が変わる時なども以下のようにすれば対応できる。(ドイツ語は月より日の表示が先)
today = {
en: "Today is %1/%2.",
de: "Heute ist der %2.%1.",
ja: "今日は %1月%2日。"
};
d = new Date();
alert (localize (today, d.getMonth()+1, d.getDate()));
(JavaScript Tools Guideより一部改変)
自動ローカライズ
いちいち localize 関数を使うのも面倒。という人は、自動ローカライズ機能をONにすることができる。
ローカライズオブジェクトの自動翻訳を使用するには、次のステートメントを使用してスクリプトでローカライズを有効にする必要があります。
$.localize = true;
localize関数は、$.localize変数の設定に関係なく、常に変換を実行します。 例えば:
msg = {en: "Yes"、de: "Ja"、fr: "Oui"};
//$.localize=trueの場合のみ機能
alert( msg );
//$.localizeの値に関係なく常に機能します
alert( localize(msg) );
ローカライズされた文字列に変数を含める必要がある場合は、localize関数を使用します。
(JavaScript Tools Guideより)
とのこと。スクリプト内で $.localize = true にすれば、毎回 localize 関数を使わなくても自動的に適切なものを選択してくれる。ただ、変数が必要な場合は localize 関数を使わざるを得ない。
ロケール名について
まず、前提知識。ESTKなどで、
$.locale
を実行してみると、「ja_JP」が返ってくる。OSが日本語ならね。アメリカだと「en_US」。AEを英語起動しても変わらないのでお間違いなく。(AEの言語を知りたければ app.isoLanguage で拾える)
これは国際標準化機構という組織が決めているもので、世の中のありとあらゆる国際規格を決めている。Adobeとかそのレベルの話ではない。詳しくはググってもらうとして。
最初に小文字で言語、必要ならばその後にアンダースコアでつなげて国・地域を大文字で書く。
ja:日本語。地域指定なし。
ja_JP:日本における日本語。
en:何かしらの英語。地域指定なし。
en_US:アメリカ(United States)における英語。
en_GB:イギリス(Great Britain)における英語。
米国と英国では色を表す「カラー」も「color」と「colour」で違ったりするので、そこまで気を使って表示を変えることも出来る。
あとは、マニュアルを読めばだいたい理解できる。
ロケール名は、ISO 639言語指定子と、オプションでISO 3166地域指定子を含む識別子文字列であり、アンダースコアで区切られています。
▶ISO 639標準では、英語のenやドイツ語のdeなど、2文字の言語略語のセットが定義されています。
▶ISO 3166標準では、地域コード(別の2文字の識別子)が定義されており、オプションでアンダースコアを使用して言語識別子に追加できます。例えば、en_USはアメリカ英語を、en_GBはイギリス英語を識別します。
次のオブジェクトは、イギリス英語用に1つのメッセージ、他の全ての英語に別のメッセージ、および全てのドイツ語にまた別のメッセージを定義します。
message = {
en_GB: "Please select a colour."
en: "Please select a colour."
de: "Bitte wählen Sie eine Farbe."
};
プラットフォームごとに異なるメッセージを指定する必要がある場合は、別のアンダースコアとプラットフォームの名前(Win、Mac、またはUnixのいずれか)を追加できます。例えば、次のオブジェクトは、MacOSで表示されるイギリス英語のメッセージ、MacOSでの他のすべての英語、および他のすべてのプラットフォームでのすべての英語のメッセージを定義します。
pressMsg = {
en_GB_Mac: "Press Cmd-S to select a colour.",
en_Mac: "Press Cmd-S to select a color.",
en: "Press Ctrl-S to select a color."
};
これらの識別子はすべて大文字と小文字が区別されます。たとえば、EN_USは無効です。
ロケール名の決まり方
1. ExtendScriptは、ホスティングアプリケーションのロケールを取得します。例えば、en_US。
2. プラットフォーム識別子を追加します。たとえば、en_US_Win。
3. 一致するプロパティを探し、見つかった場合は値文字列を返します。
4. 見つからない場合、プラットフォーム識別子を削除して再試行します。(例えば、en_US)
5. 見つからない場合、地域指定子が削除され、再試行されます。(例えば、en)
6. 見つからない場合、識別子enを試します。(つまり、デフォルトの言語は英語です)
7. 見つからない場合、ローカライザーオブジェクト全体を返します。
(JavaScript Tools Guideより)
面白いのは、言語だけではなく、OSによって「Ctrl」と「Cmd」の表記を変えたりも出来るということですな。
あとは、言語が見つからない時は "en" がデフォルトになるということも覚えておきたい。
言語環境を変えてテストする
スクリプトで言語環境を取得するには2通りある。
app.isoLanguage
$.locale
1はAfterEffectsの言語を取得できる。日本でも英語起動すれば "en_US" が返ってくる。対して2はOSの言語。なのでAfterEffectsを英語起動しようが、OSが日本語なら "jp_JP" が返ってくる。で、localize関数で使われるのはどちらか、というのが問題になる。
実は2である。ということはローカライズ出来るスクリプトを作成したとしても日本語OSで他の言語の表示を確認できないのか?
心配御無用。$.localeの値は書き換えることが出来る。なので、テストしたいときは書き換えてやればいい。
ExtendScriptは、現在のロケールを変数$.localeに格納します。この変数は、ホスティングアプリケーションのロケールが変更されるたびに更新されます。
ローカライズされた文字列をテストするために、ロケールを一時的にリセットできます。 元の動作に戻すには、変数をnull、false、0、または空の文字列に設定します。
例:
$.locale = "ru"; // ロシア語ということにする
$.locale = null; // 元の言語に戻す
(JavaScript Tools Guideより)