2011年8月3日水曜日

ローカライズ(国際化・多言語化)

iphoneのアプリはApp storeで簡単に世界中の人に公開できる環境となっています。
そこでせっかくアプリを作るのだから世界中の人に使ってもらたいと考えたりするかと思います。
しかしそういったときにはアプリ内の文字を各国の言語で表示してあげるべきですので、今回はその方法を自分なりにまとめてみました。

iphoneの設定が日本語ならアプリケーション内の文字を日本語で表示し、設定が英語なら英語で表示する為の手順となります。

大きく分けて下記の内容を対象にしていきます。
・ソースコード内の文字列のローカライズ
・xibリソースファイルのローカライズ
・アプリケーション名のローカライズ
・プログラム中で現在の言語設定を調べる方法


1.ソースコード内の文字列のローカライズ

まずはソース内の文字列をNSLocalizedString()関数を使って置き換えます。
実際に表示される文字列はあとでLocalizable.stringsファイルを日本語用、英語用と用意してそこにまとめて記述します。

NSString *NSLocalizedString(NSString *key, NSString *comment)

keyはローカライズする文字を識別するキー
commentは文字列の説明文です(コメントのようなものです)

 元のコード
label_1.text = @"ラベルのサンプル";
[button_1 setTitle:@"日本語ボタン" forState:UIControlStateNormal];
これを、
 修正後
label_1.text = NSLocalizedString(@"label_1",@"1個目のラベル");
[button_1 setTitle:NSLocalizedString(@"button_1",@"ボタンのラベル") forState:UIControlStateNormal];
とします。

ソースコード内のローカライズ対象の文字列をすべてNSLocalizedString()で置き換えたら、次にgenstringsコマンドを使ってプロジェクト内のソースコードからLocalizable.stringsファイルを作成します。

アプリケーションからターミナルを起動して下記コマンドを実行
cd プロジェクトのディレクトリ
genstrings `find . -name '*.m'`

カレントディレクトリにLocalizable.stringsファイルが作成されますので、それをプロジェクトに追加します。
FinderからDrag&Dropで構いません。
(Xcode3ならこの時にUTF-16を選択)

Xcode3ではファイル追加時にUTF-16を選択できますが、Xcode4だと追加した時点で文字化けしてしまいます。


Xcode4ではファイル追加した後にText encodingをUTF-16に変更して保存てください。
それでも文字化けしたままですので、もう一度genstringsを実行して作ったファイルを直接上書きすると正常になります。
(もっといい方法あるのかな?)

次にLocalizationにEnglishとJapaneseを追加します。






Localizable.stringsのファイルに▼が付き(English)と(Japanese)に分かれますので、それぞれ各言語用に文字を編集します。







※上記はXcode4での手順ですが、Xcode3の場合はLocalizable.stringsから右クリックメニューで「情報を見る」を選択して表示されたダイアログで「ファイルをローカライズ可能にする」→「ローカリゼーションを追加」によって同様にローカライズを追加できます。

以上でソースコード内のローカライズが完了しました。






2.xibリソースファイルのローカライズ
xibファイルのユーザーインターフェイス内の文字列もローカライズ可能です。
xibファイルをクリックして先ほどと同様にLocalizationにEnglishとJapaneseを追加します。



それぞれのxibファイル内の文字列を各国語で編集しなおしてください。






3.アプリケーション名のローカライズ
InfoPlist.stringsファイルに下記を追加します。

CFBundleDisplayName = "アプリ名";

次にInfoPlist.stringsを先ほどと同様にLocalizationにEnglishとJapaneseを追加します。
それぞれのファイルでアプリ名を編集してください。




※ここまででうまく反映されない場合はCleanビルドやシミュレータから一度アプリを削除してから再度ビルド・インストールをするとうまく行く場合があります。


4.プログラム中で現在の言語設定を調べる方法
NSLocaleクラスのpreferredLanguagesで言語設定リストを取得すると、その1番目の値が現在の言語となっています。

NSString *lang = [[NSLocale preferredLanguages] objectAtIndex:0];
if([lang isEqualToString:@"ja"]){
NSLog(@"日本語です");
}else if([lang isEqualToString:@"en"]){
NSLog(@"英語です");
}

en:English
ja:日本語
です。

参考ブログ