現在の言語とロケールを取得する


ほとんどの開発者にとって、使用する各国語化を選択することは、あなたがする必要のあることではありません。

NSBundle および CFBundle インタフェースはプログラム的な要求に対する応答として、どの各国語化されたリソースファイルを返すべきかを判断するために、自動的にユーザの環境設定を適用します。

けれども、あなたのプログラムが、どの各国語化が使用されているのかを知る必要があるといった、単純なリソース読み込みに留まらない状況もあることでしょう。

こうした状況のために、 NSBundle および CFBundle の両者は、あなたにこうした情報を得るための手段を提供します。

あなたのバンドルで対応している各国語化を明示する

どのようにして各国語化を取得するかの技法を述べる以前に、バンドルがどのように自らが対応している各国語化をシステムへ伝達するのかを覚えておくことは大切です。

バンドル化されたアプリケーションのほとんどは、Resources ディレクトリを含んでおり、その中には言語固有のプロジェクト(.lproj)【language-specific project】ディレクトリが属しています。

これら .lproj ディレクトリのそれぞれは、特定の言語や地域の方言と結び付けられたリソースを格納しています。

NSBundle および CFBundle はこれらのディレクトリを見つけ、対応している各国語化のリストを作成するためにこれらを用います。ただし、これがこのリストを作成する唯一の方法ではありません。

アプリケーションはそのインフォメーションプロパティリスト(Info.plist)ファイルを通じて、他にも各国語化に対応していることをシステムへ通知することができます。

あなたのバンドルの .lproj ディレクトリに含まれていない各国語化を指定するには、このファイルに CFBundleLocalizations キーを追加してください。このキーに対する値は、文字列の配列であり、そのそれぞれが「言語とロケールの指定」(19ページ)を参照してください。

優先する各国語化を取得する

もし、あなたが Carbon アプリケーションを手にしているか、あなたのプログラムバンドルを管理するために CFBundle を使用しているのであれば、あなたは最も適切な各国語化を取得するために、CFBundleCopyPreferredLocalizationsFromArray 関数【長ッ!】を使用することができます。このメソッドを呼ぶときは、あなたのソフトウェアが対応する各国語化のリストを渡さなければいけません。

あなたの使用しているバンドル情報に対してこのリストを生成するためには、CFBundleCopyBundleLocalizations 関数を使用することができます。

この関数は、対応されている各国語化を、ユーザの言語と地域の環境設定に対して比較します。

この比較【の結果】から、この関数は文字列の配列を返し、その一つはユーザにとってほとんどの場合には適切な、言語だけの各国語化となります。【(次段より)要は言語指定子が返ってくるらしい。】

もし、地域固有の各国語化も利用可能であれば、言語のみの各国語化よりも優先して、同様にその各国語化も返します。

もし、あなたが Cocoa アプリケーションを書いているのであれば、【前述の】CFBundleCopyPreferredLocalizationsFromArray および CFBundleCopyBundleLocalizations と同じ振る舞いを実装するために、NSBundle の preferredLocalizationsFromArray および localizations メソッドを使用することができます。

また、この二つのアクションを一つのメソッドで行う短縮形として、preferredLocalizations メソッドを使用することもできます。

CFBundle 関数と同じように、preferredLocalizations および preferredLocalizationsFromArray メソッドは、バンドルが用いている言語指定子を格納している、文字列の配列を返します。

Mac OS X は、各ユーザの優先言語のリストを、他のシステム全般の環境設定やアプリケーション固有の環境設定と一緒に、ユーザのデフォルトデータベースへと記録します。あなたはこのデータベースに、Core Foundation や Cocoa の双方に見られる、環境設定管理ルーチンを用いてアクセスすることができます。

優先言語の配列は、AppleLanguages キーと関連付けられています。また現在選択されているロケールは AppleLocale キー と関連付けられています。これらのキーはどちらも NSGlobalDomain 内にあります。

重要:優先ロケールと言語を読むためには、デフォルトデータベースの内容を直接読む代わりに、 CFBundle 関数か、NSBundle メソッドを使用することを推奨します。 データベース内に見られるコードは、言語 ID やロケール ID の正規の形式を含んでいないことがあります。

正規の言語 ID とロケール ID を取得する

Mac OS X v10.4 よりも前には、言語の方言は言語指定子と地域指定子を結合することによって特定されていました。

独自方言コード(「言語とロケールのID」(20ページ)を参照)への対応の導入に伴い、適切な言語コードの取得は、今やより複雑なものとなっています。

幸い、Mac OS X はあなたの持つ情報を元にして、あなたが適切な言語とロケールのコードを決定することを助けるためのルーチン群を提供しています。

Mac OS X v10.3 において、CFLocale 不透明【opaque】型が Core Foundation に導入されました。この型と共に導入された関数の一つが CFLocaleCreateCanonicalLocaleIdentifierFromString 関数であり、これはあなたの指定するロケールコードを得て、適切な正規バージョンを返します。

この関数は、従来の英語ベースの .lproj ディレクトリ名を ISO 準拠の名前に直す場合のように、特に従来のロケール文字列を変換するために便利です。

Mac OS X v10.4 において、言語コードと方言コードのために同じ正規変換を行うために、CFLocaleCreateCanonicalLanguageIdentifierFromString 関数が追加されました。この関数は、たとえば繁体字中国語のための従来の指定子(zh_TW)を、より新しいバージョン(zh-Hant)に変換します。

また Mac OS X v10.4 においては、対応する Core Foundation 関数のための Objective-C ラッパを提供するための、NSLocale クラスが Cocoa に加えられました。

もし、あなたのバンドルから言語固有のリソースを取得するために、CFBundle か NSBundle を使用すれば、あなたは言語識別子について直接心配する必要はなくなります。

CFBundle および NSBundle のルーチンは言語 ID とロケール ID を、正規または非正規の形式で、自動的に取り扱います。

もしあなたのコードが Mac OS X v10.4 以降を必要とするのであれば、あなたは言語とロケールの ID のための、新しい正規の形式の使用を開始すべきです。従来の言語コードのいくつかは、v10.4 では新しいコードによって置き換えられました。いくつかの中国語コードに加えて、新しくノルウェー語の ISO コード(nb)への対応が現在は利用可能であり、従来バージョンよりもこちらを優先すべきです。

ですが、もしあなたのコードが今でも Mac OS X の以前のバージョン上で動作するのであれば、代わりに従来の形式を使い続ける必要があります。

注:もし、あなたのプログラムが 10.3 より前のバージョンの Mac OS X にも対応するのであれば、あなたはあなた独自の正規 ID のテーブルを管理する必要がある場合があります。

言語とロケールの環境設定を直接取得する

あなたが、優先ロケール ID や言語のリストを、ユーザ環境設定から直接取得したいというような状況があるかもしれません。

Mac OS X は各ユーザの優先言語のリストを、ユーザのデフォルトデータベースに記録します。優先言語のリストは、デフォルトでは AppleLanguages キーによって識別され、グローバル変数 NSGlobalDomain に記録されます。

あなたはこのリストに、Cocoa の NSUserDefaults クラスか、Core Foundation 環境設定関数を用いてアクセスすることができます。

重要:もしあなたがユーザの言語の環境設定をデフォルトデータベースから取得するのなら、識別子を使用する前に、CFLocaleCreateCanonicalLanguageIdentifierFromString 関数(Mac OS X v10.4 以降)か、CFLocaleCreateCanonicalLocaleIdentifierFromString 関数(Mac OS X v10.3 以降)を用いて、正規の形式を取得しなければなりません。

以下の例は、Cocoa を用いた、デフォルトデータベースから優先言語のリストの取得の仕方を示します。

返ってくる配列は、ユーザの優先順に AppleLanguages キーに関連付けられた言語を格納しています。従って、ほとんどの場合には、あなたは単純に配列の先頭のオブジェクトを取得したいはずです。

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];

また、現在のユーザのためのロケールも、デフォルトデータベースの AppleLocale キーの配下に記録されています。

重要:あなたはユーザの優先設定をデフォルトデータベースから取得することができますが、代わりに CFBundle 関数か、NSBundle クラスを使用することを推奨します。 これらのオブジェクトに関連する関数やメソッドは、あなたのアプリケーションに対応されている優先言語やロケールを返します。(戻り値は、ユーザの厳密な環境設定とは直接一致しないことがあるという点を心に留めておきましょう。)