アプリをつくる時には国際化のことも考えないといけません。
App Store は、150 を超える国で利用され、40 を超える言語をサポートしているとのことですが、これら全ての言語をサポートするのは無理としても、日本語の他にせめて、英語ぐらいはサポートしておきたいところです。
最初からiPhoneアプリを国際化するつもりでいる場合は、通常、アプリで使用するメッセージ類は全て英語で書いておいて、後からそれらに対応する翻訳用のファイルを用意することで対応します。C言語等で利用するgettextとpoファイルの関係に似ています。
デフォルトの言語を英語にしておけば 、翻訳していない言語でアプリが使用される場合は英語で表示されることになります。
国際化する場合は、まずXCodeのプロジェクトの設定で、ターゲットの言語を追加します。
プロジェクトで使用中のストーリーボードや文字列リソースの一覧が表示されるので、翻訳するファイルを選びます。
この時プロジェクトのフォルダの中に言語毎に特定のフォルダが作成され、そのフォルダに各言語毎のファイルが置かれます。英語用はen.lproj、日本語用はja.lprojというフォルダ名です。
選んだファイルの各言語版が作成されたので、これらで使用されている文字列を適宜翻訳していきます。
ボタンのラベルなど固定的な文字列は、このようにストーリーボードの各言語対応版をつくって直接ストーリーボードを変更した方が便利です。
プログラムソース内に記述した文字列は、各言語毎の翻訳用のファイルに翻訳内容を書いていきます。
プログラムソースには、以下のように、NSLocalizedString関数を使って文字列を記述します。
self.title = NSLocalizedString(@"Hello, world", @"view's title");
:
[self showAlert:NSLocalizedString(@"Please login", @"alert message")];
:
第1引数は翻訳対象の文字列で、第2引数はその文字列に対するコメントです。第2引数は別になくてもよく、その場合はnilを指定します。
このように、ソース内の表示に関する全ての文字列をNSLocalizedString関数で記述したあと、翻訳用のファイルに翻訳文字列を記述します。
翻訳ファイルは、ファイルの新規作成でStrings Fileを選択して作成し、
その中に次のように対応する翻訳文字列を記述していきます。
"Hello, world" = "こんにちは、世界";
"Please login" = "ログインしてください";
このとき、全てのソースから翻訳対象の文字列を全て手作業で列挙していくのは大変です。genstringsというコマンドラインツールを使うと、ソース内の翻訳対象文字列を調べて翻訳用ファイルを生成してくれます。
コマンドラインでプロジェクトフォルダに移動し、次のように入力します。
genstrings -o en.lproj *.m
これは、そのフォルダ内の拡張子 m のファイルを調べて結果をen.lprojフォルダに生成するように指定しています。
実行が終わると、en.lprojフォルダの中に、次のような内容のLocalizable.stringsというファイルが生成されています。
/* と */で囲まれた部分はコメントで、NSLocalizedStringの第2引数に指定した文字列です。nilを指定した場合は、/* No comment provided by engineer. */と出力されます。
genstringsコマンドは実行する度にLocalizable.stringsを上書きするので注意が必要です。また、実行時のフォルダ内のファイルしか処理しないので、サブフォルダ内のファイルも処理させたい場合は、findコマンドと組み合わせる等する必要があります。
翻訳ファイルの生成がおわったら、プロジェクトに追加して、Localizationのチェックをつけて翻訳の作業をしていきます。
Xcodeのバグなのか、Localizable.stringsをプロジェクトに追加できない場合がありますが、この場合は最初に新規作成で、Localizable.stringsというStrings Fileを作成しておき、その後にgenstringsコマンドを実行するといいです。但し、genstringsは実行するたびにファイルを上書きするので編集後に実行する場合は、編集内容が失われないように注意が必要です。
翻訳した言語でアプリがどのように表示されるかは、iPhoneの設定で、「一般」→「言語環境」→「言語」で言語を切り替えてやることで確認することができます。