Subscribed unsubscribe Subscribe Subscribe

iPhoneアプリにおけるローカライズの挙動が謎

Cocoaアプリ/iPhoneアプリに共通して、NSLocalizedStringによる文字列のローカライズが可能になっている。
方法はだいたい以下の通り。

  • 使用したい文字列をNSLocalizedString関数で呼び出すようにする。
NSLog(NSLocalizedString(@"helloworld", nil));

→1つ目の引数が後で使うkey。2つ目の引数はコメントらしいので多分nilでおk。

$ genstrings $(find . -name "*.m")

→.mファイルに含まれるNSLocalizedString関数に記述されているkeyを元にLocalizable.stringsが生成される

/* No comment provided by engineer. */
"helloworld" = "helloworld";

ソースファイル内でコメントアウトされていてもお構い無しに生成してくれる模様。

  • 生成されたLocalizable.stringsファイルを「Resources」フォルダへ「プロジェクトに追加」

→このときファイルのエンコードは必ず「UTF-16」を指定すること

  • 追加されたLocalizable.stringsを選択し「情報を見る」で情報ウィンドウを開く
  • 「一般」タブで「ファイルをローカライズ可能にする」ボタンを押す。

→デフォルトではEnglishだけが設定されている模様。これは変えられるのか?

ローカリゼーションテーブルに新しいローカリゼーションが追加される
→情報ウィンドウを閉じると、「グループとファイル」内のLocalizable.stringsがEnglishともう一種類追加されている
→プロジェクトフォルダ内ではEnglish.lprojと<新しいローカリゼーション>.lprojのフォルダが作成されており、それぞれにLocalizable.stringsが出来ている

  • それぞれのLocalizable.stringsファイルを編集し、keyに対応する文字を指定する

English.lproj/Localizable.strings

/* No comment provided by engineer. */
"helloworld" = "Hello World!!";


Japanese.lproj/Localizable.strings

/* No comment provided by engineer. */
"helloworld" = "こんにちは、世界!";


以上。
参考:http://developer.apple.com/documentation/MacOSX/Conceptual/BPInternational/Articles/StringsFiles.html#//apple_ref/doc/uid/20000005


…で、これを実行すると、言語環境に対応したlprojのLocalizable.stringsが呼び出されるようになるわけです。
問題は、ここで作成しなかったローカリゼーションの言語環境で実行した場合にどうなるか、ということ。


Mac OS X上で動くCocoaアプリの場合は、言語環境の設定が「システム環境設定」の「言語環境」から行うわけだけど、
これは言語リストをドラッグ&ドロップで並べ替えることで上から順に優先順位を決めることになる。
英語が一番上にリストされていれば、English.lproj/Localizable.stringsを使って文字列が呼び出される。
そして、ローカリゼーションに追加していない言語を一番上に持っていった場合は…
どうやら、上から順番に見ていって存在しているローカリゼーションを採用している模様。
例えば日本語と英語のローカリゼーションを可能にしていた場合、言語環境のリストを
「ドイツ語」→「英語」→「日本語」の順に並べた場合は英語に、
「ドイツ語」→「日本語」→「英語」の順に並べた場合は日本語に、
ローカライズされるようだ。少なくとも自分の環境ではそうなった。


では、iPhoneアプリの場合はこれはどうなるのだろうか…?
iPhone/iPod touchでは、言語環境の設定はリストの並べ替えではなく、リストからの「選択」になっている。
英語を選択していれば、「英語」→「日本語」→「フランス語」→「ドイツ語」の順に、
日本語を選択していると「日本語」→「英語」→「フランス語」→「ドイツ語」の順に、
ドイツ語を選択していると「ドイツ語」→「英語」→「日本語」→「フランス語」の順に表示される、ようだ。
現在選択されている言語が一番上にきて、それ以外の言語の順番は固定されているっぽい
これに起因しているかどうかは分からないが、日本語と英語のローカリゼーションだけを可能にしている場合にドイツ語環境で実行すると、結果は英語のローカリゼーションが採用されていた。


ローカリゼーションについて解説しているWebページは多々あれど、対応していない環境でどうなるか、については記述が見つからなかった。
まぁぶっちゃけ、最低限英語のローカリゼーションだけでも用意しておけば問題ないと思うんだけど、なんとなく気になったので書いてみた。
iPhoneの場合は設定画面のリストの順番に従ってローカリゼーションが採用されます」とどこかに明記されてたりしないんだろうか。。