iOS Localization チュートリアル

Localization(ローカライゼーション)とは、アプリを他の言語に対応させる行為の意味として使われます。多くのケースではアプリを開発するときは日本語で開発してその後英語に対応させるか、もしくは英語で開発してその後日本語に対応させるというパターンが多いかと思います。

Localizationのプロセスは少し複雑で、しかもXCodeのバージョンが上がるごとに少しずつやり方が変わってきたりXCodeの機能追加に引っ張られて変わってきているため、ここで一度最新のXCode 7.3.1を使ったやり方で説明してみたいと思います。

まずLocalizationを始める前に自分のXCodeプロジェクトのInfoタブの中でUse Base Internationalizationというチェックマークがオンになっているか確認してください。この先に進むのにここがオンになっている必要があります。

“Base Internationalization”とは何か ?

新しいXCodeプロジェクトを作る時、XCodeが自動的に下のようなファイル構造を作ってくれます。

これが“Base言語”と呼ばれるものでここに自分のアプリの元言語となる言語のリソースを追加していきます。グローバル向けにアプリを開発されている方にとってはBaseは英語にすることが普通ですが、日本向けにアプリを開発されている場合はBaseは日本語になる場合もあります。

これ以降ではBaseを英語でそこに新たに日本語を追加していくというケースを例として説明していきます。

Localizationの追加

それではBase言語に加えて新しい言語を追加してみましょう。
Project Navigatorでプロジェクトファイルを選択し、プロジェクトのInfo タブを開きます。Localizationのセクションの中から“+” buttonをクリックし、表示されるポップアップから追加する言語を選択します。(今回は日本語追加なのでJapaneseを選択します。)

するとXCodeはどのリソースに対して日本語のローカライゼーションを追加するか選択するダイアログを表示します。Finishボタンを押すとこれらのファイルがja.lprojフォルダの下にできます。今回は日本語を選択したので、ja.lprojというフォルダでしたが、[言語コード].lprojというルールに従って選択した言語のリソースフォルダが作られます。

プロジェクトフォルダの中を確認すると下のようなファイルが作られれているのが確認できます。

Localizable.stringsファイルはどこにいったのか?

Localizable.stringsファイルとはLocalizationに必要な翻訳データをKey-Value形式で保存するファイルです。以前のXCodeはLocalizable.stringsファイルをプロジェクト作成時に自動的に作ってくれましたが今のXCodeではこれをやってくれません。
そこで、File->New->Fileで新しいファイルを作成するを選択しResourceタブの中からStrings Fileを選択しファイル名を Localizable.stringsとしてファイルを作成します。

これでBase言語の下にLocalizable.stringsファイルが作られました。

次に日本語用のLocalizable.stringsを追加するためにXCode右側のFile Inspector(ファイルインスペクター)の中でJapaneseを選択します。これでja.lprojフォルダの下にLocalizable.stringsファイルが追加されます。

ここまでのステップで2つのLocalizable.strings ファイルを追加しました。1つがBase.lprojの下、もう1つがja.lprojの下です。

次にアプリで使われている単語や文章をBase言語のLocalizable.stringsファイルに追加していきます。
下の例の1行目に
“Welcome” = “Welcome”;
という行があるのが見えると思います。

この左辺はKeyと呼ばれて後でNSLocalizedStringメソッドを使って右辺のテキスト(Value)を所得するのに使います。このようなKey-ValueのペアのデータがリストになったものがLocalizable.stringsファイルです。

下は実際にNSLocalizedStringメソッドが使われている例ですが、第1引数にKeyを渡すことで、この関数はLocalizable.stringsファイルの中からValueの値を取得して返してくれます。 下の例では、アラートに表示するタイトル、メッセージ、ボタンのテキストを設定する際にNSLocalizedStringを用いてローカライズされたテキストを取得するようにしています。

ここまでの状態で一度アプリを実行すると、下のように英語のテキストでアラートが表示されます。

次のステップとして、日本語の翻訳をja.lproj下のLocalizable.stringsファイルに追加してみましょう。 Base言語のLocalizable.stringの内容をこちらにコピー&ペーストした後に、右辺のValueを日本語に変更してみましょう。

ここでiOS Simulatorの言語を日本語にしてアプリを実行すると下のようにアラートが日本語で表示されるようになりました。

Localizeの結果を確認するために毎回iOSシミューレーターの言語設置を変えるのは時間がかかります。この手間を省く機能がXCodeにはあります。
XCodeの左上のドロップダウンリストからEdit Schemeを選択し、Application LanguageSystem LanguageからJapaneseに変えます。(したのスクリーンショットを参考にしてください。)
この方法だとiOSシミュレーターの言語設定を変えることなくアプリの実行環境の中だけで言語設定が切り替えられます。この機能は後にたくさんの言語を足した後に各言語のLocalizationの結果を何度もチェックするような時に大変便利ですので覚えておいてください。

StoryboardのLocalization

ここまででLocalizalbe.stringsファイルに翻訳データを追加してNSLocalizedStringで取得することはできるようになりました。
プログラムの中からユーザーに表示するテキストを設定する場合はこれで十分ですが、Storyboard内でUIに表示するテキスト(ボタンのタイトルなど)を設定してある場合はこれでは不十分です。ここではStoryboard内で設定されたテキストをLocalizeする方法について説明します。
Project NavigatorでStoryboardファイルを選択し、それから右側のFile InspectorでJapaneseを選択します。これで[Storyboardの名前].stringsファイルがja.lprojフォルダの下に作られます。今回の例ではStoryboardファイルの名前がMain.storyboardなのでMain.strings(Japanese)というファイルが作られていることがProject Navigatorで確認できると思います。

Main.strings(Japanese)ファイルの中で下のような行ができているかと思います。(Storyboardの中に何もUIKitのコンポーネントがない場合は何も生成されていません。Main.stringsファイルを一度消して、StoryboardにUIKitのコンポーネントを足してからやり直してみてください。)

右辺の“Get Started” という部分を日本語に置き換えます。

これでアプリを起動するとボタンのタイトルが日本語に翻訳されているのがわかると思います。

[Storyboard].stringsファイルの難点

Main.stringsファイル生成時の一つの難点は新しいUIKitのコンポーネントをStoryboardに足しても自動的にその分のKey-ValueペアがMain.stringsファイルに追加されないことです。Main.stringsファイル生成時にStoryboard上にあったものしかファイルには追加してくれないので、Storyboardを更新した後は、新しい言語を足して新たなMain.stringsファイルを生成し、そこの中から新たに追加されたKey-Valueペアのデータを元々ある言語のMain.stringsファイルにコピー&ペーストして編集するなどのトリックが必要です。

アプリのタイトルのローカライズ

アプリのタイトルのローカライズや、Info.plistファイル内のその他の文言のローカライズのためにはInfoPlist.stringsファイルというファイルを作ります。File->New->Fileと選択してResourceタブの下からStrings Fileを選択しInfoPlist.stringsという名前をつけます。Base.lprojフォルダを生成先として選択します。(こうすることによりこのInfoPlist.stringsファイルがBase言語のものであるとXCodeに認識されます。)

通常であれば、Info.plistの中でローカライズの必要がある可能性のあるアイテムは下の2つだけです。

  • CFBundleDisplayName — ホームスクリーンなどに表示されるアプリのタイトル
  • NSHumanReadableCopyright — Copyrightの記述(2014 Goldrush Computing Inc. All right reserved等)

下のように左辺にこれらのInfo.plistのKey名、右辺に実際のテキストというふうに配置します。下を参考にしてみてください。

File Inspector,で JapaneseをチェックしInfoPlist.stringsファイルを今度はja.lprojフォルダの下に作ります。(InfoPlist.stringsがProject Navigatorの中で選択されたままの状態でこの作業をします。)

InfoPlist.strings (Japanese)ファイルの中で右辺を日本語の翻訳に入れ替えます。

アプリを実行するとアプリのタイトルが日本語になっていることがホームスクリーンで確認できます。

以上がアプリを1つの言語に新たに対応するステップの全てになります。

アプリのローカライズの新しい方法

今まで私は多くのアプリを作ってきてローカライズも多いケースでは1アプリを19言語に対応させるということをやってきましたが上記のプロセスを19言語に対して行い、また機能アップデートのたびに.stringsファイルの更新をする作業をするのは相当な作業です。例えばViewController1個分の機能アップデートで10個くらいの新しい単語・フレーズを追加するだけでも19言語をサポートしている場合はまる3日くらいの作業になることもあります。ローカライズ作業を少しでも楽にする方法はないかと模索してきて“InAppTranslation”というツールを作りました。もし興味のある方は是非見てみてください。
https://inapptranslation.com