プログラマでありたい

おっさんになっても、プログラマでありつづけたい

iPhone/iPadアプリを多言語対応する

 自作のiPhoneアプリを多言語対応してみました。
iPhoneというかObjective-Cに用意されている機構を使えば、割と簡単に対応出来ます。

まずは、サンプルのxibファイルです。

ラベル2個と、ボタン1個というシンプルな画面です。


 次に、Localizeファイルの用意します。
今回は例として、英語と日本語に対応してみます。
適当にLangというフォルダを作って、その下に、en.lprojとja.lprojというフォルダを作ります。この言語フォルダは、ISO_639で定義された2文字か3文字のコードです。他の言語に対応する場合は、このコードに対応したディレクトリを追加すれば大丈夫です。なお、xcodeのグループで作ろうとした場合、実ディレクトリが作れません。最初にFinderでディレクトリだけ作ることをお薦めします。


 ディレクトリを作ったら、Resourcesの下にLocalizable.stringsというファイルを作ります。新規ファイルの作成のMac OS X→Resource→Strings Fileで作れます。注意点は、先ほど作ったディレクトリを指定することです。(直下とかに作ると、二つ目の言語の時に名前が被って作れません)


 二つの言語を追加すると、次のようになります。
Localizable.stringsの下に二つの言語が出てきます。何か良い感じです。


Localizable.stringsの中身は、次のようになります。
English

/* 
   Localizable.strings
   LocalizeSample
 */
"label1"="label1";
"label2"="label2";
"button"="button";

日本語

/* 
   Localizable.strings
   LocalizeSample
 */
"label1"="ラベル1";
"label2"="ラベル2";
"button"="ボタン";

 書式は、"ラベル名"="表示させる内容";となります。
最後のコロンを忘れると、次のようなエラーが出るのでご注意を。プロパティファイルなので、XCodeは指摘してくれません。

Command /Developer/Library/Xcode/Plug-ins/CoreBuildTasks.xcplugin/Contents/Resources/copystrings failed with exit code 1


最後にコードの方で、上記のラベルを呼び出せば完了です。

	label1.text = NSLocalizedString(@"label1", @"");
	label2.text = NSLocalizedString(@"label2", @"");
	button.titleLabel.text = NSLocalizedString(@"button", @"");

引数の一つ目がラベル名です。二つ目はコメントなので指定しなくても大丈夫です。
ラベルが見つからなかったら、ラベル名が代入されます。


ちなみにこう言う書き方も出来ます。

	label1.text = [[NSBundle mainBundle] localizedStringForKey:@"label1" value:@"label1" table:nil];

localizedStringForKeyでラベルを探してきて、無かったらvalueの値をセットします。記述量が多いので、基本的には最初の書式で充分じゃないかと思います。


 実行すると次のようになります。
尚iOSシュミレータ上で言語の切替をするのは、シミュレータ上から設定ボタンで変更します。
少し変な感じです。


 また、言語別にアプリの表記名等を代える場合は、InfoPlist.stringsで可能です。

/*
 ja.lproj/InfoPlist.strings
 */
CFBundleDisplayName = "日本語アプリ";


 多言語対応した感想ですが、日本語しか対応しない場合も基本的にはこの作り方で作っておいた方が良いのではないかなと思います。1画面しか無い場合は恩恵は少ないですが、複数画面あるような場合は、表記名の一元管理に威力を発揮します。もちろん多言語対応する場合も簡単になります。是非これは覚えておくべき手法かなと思います。是非お試しあれ!!


参考:
livedoor Techブログ : iPhoneアプリを多言語対応にする