iPhone/iPad/MacAppの多言語対応

iPhone/iPadアプリや、Macアプリでの多言語対応についてまとめる。 XCode4でGUI操作の部分がちょっと変わったけど、 今さらXCode3について記載してもしょうがないので4についてまとめる。

基本的な流れとしては、
1. ソースコード内の多言語対応したい部分でNSLocalizedString(key, comment)メソッドを利用
2. keyに対応する文字列を言語ごとに設定
という流れになる。

  1. のコードは簡単。
[testLabel setStringValue: NSLocalizedString(@"TestLabelText", @"Message for TestLabel")];

keyの部分は後述するLocalizable.stringsと対応づけられるようにする。 commentの部分は後でプログラマが分かるように書けばなんでもよい。

2.について。ここでちょっとはまった。 Localizable.stringsというテキストファイルを作ってやればよいのだが、 手作業でやるとモレが出かねないので、ツールを利用する。

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

Unixを触ったことがある人は分かると思うけど、 .mファイルを検索して、それらに対してgenstringsコマンドを実行している。 だから、.mmファイルとかを作っている人は.mじゃなくて.mmについても実行することになる。 -aオプションをつけておくと追記してくれるので、何回実行しても特に問題はない。

さて、このコマンドを実行すると、Localizable.stringsというファイルが生成されるので、 これをプロジェクトに追加する。 XCodeで表示すると思いっきり文字化けすると思うけど、 これはこのファイルの文字コードがUTF-16だから。 多言語対応のため、UTF-16を使うのがデフォルトらしいので、 このファイルの文字コードを直すのではなく、 XCode側で文字コードを指定して読み込めばいい。 この操作については後述する。

さて、Localizable.stringsを選択し、FileInspector > Localizationを選択する。 (FileInspectornの表示方法については画像中1参照) Localizationの下にある+ボタンを押して、対応したい言語を追加する。 ここではEnglishとJapaneseを追加している(画像中2参照) ここで一番上に表示されている言語がデフォルト言語として利用され、 対応言語がない場合はデフォルト言語で表示される。

今回の場合、 ・English ・Japanese の順にしているので、例えばフランス語圏の人が利用しようとすると英語で表示されることになる。 まあ英語をデフォルトにしときゃあ問題ないんじゃね?ということでEnglishを一番上にしておく。

さて、この作業を行うと、Localizable.stringsの下にLocalizable.strings(English)と、Localizable.strings(Japanese)が表示される(画像中3) このファイルの中に記述した物が表示される。 ここでさっきの文字化けを直す。 Localizable.strings(English)やLocalizable.strings(Japanese)を選んで、 FileInspector > TextSettingsでUnicode(UTF-16)を選択する(画像中4) そうするとダイアログが表示されるので、ConvertではなくReloadを選択すれば、正常な形で読み込まれる。

さて、各言語についての具体的な設定は以下の通り。 Localizable.strings(English)

/* Message for TestLabel */
"TestLabelText" = "this is a test";

Localizable.strings(Japanese)

/* Message for TestLabel */
"TestLabelText" = "てすと"

とかしておくと、testLabelに、 英語環境では”this is a test” 日本語環境では”てすと” と表示されることになる。

注意点として、このローカライズファイルの記述や文字コードが間違っていると、 Localizable.strings:0: warning: validation failed: The data couldn’t be read because it has been corrupted. というwarningが表示され、コンパイルは通るものの反映されない。 個人的にハマった注意点を2つ記載しておく。 ・文字コードをUTF-16にする ・行末のセミコロンを忘れないこと

念のためちゃんと多言語対応できているか、実行して確認しておいた方がいい。 iPhone/iPadでは設定 > 一般 > 言語環境 > 言語 Macではシステム環境設定 > 言語とテキスト から別の言語に設定しなおして起動してみればよい。

とりあえず以上。そのうちプロジェクトファイルとしてまとめてアップロードしておこう。

Written on June 26, 2011