iOS6から実装されたStoryboardをローカライズする方法
iOSではローカライズする方法が幾つかあります。
Localizable.stringsを使う
対応したい言語ごとに、ローカライズファイルを準備してプログラム側から文言を設定する方法です。
この方法の欠点はStoryboard上のボタンやラベルに対してローカライズを適用するにあたって、全てオブジェクトにIBOutletでViewControllerと接続する必要があります。
ローカライズの為だけにIBOutletを設定するのが何とも。
Storyboardを対応するローカライズ毎に準備する
こうすれば、IBOuteletを接続する必要もなくなります。しかし、Storyboardを分けているため、レイアウトの変更、ボタンやラベルの追加などが発生した場合に、対応する全てのStoryboardに同じ作業を行う必要がありました。何とも。
Storyboardの文言だけをローカライズする
今回紹介するのは上記の2つの欠点を補ってくれる素晴らしい機能(っと思っていた。。。)がWWDCで紹介されていたので、iOS6がリリースされたら試していようと思っていました。
取り敢えず手順を
まずは簡単な一画面のプエロジェクトを作ります。そして、Storyboard上のビューにラベルを配置して「Hello world」と入力します。
プロジェクトファイルを選択して「Use Base Internationalization」にチェックを入れます。
ダイアログが表示されるので、ローカライズしたいStoryboardを選択します。
その際に、基準とする言語(Reference Language)が選択します。Englishを選択しておけば問題ないかと。
追記:この後に日本語のローカライズファイルを追加するのですが、上手くローカライズファイルができない場合があるようです。
この場合には、Storyboardを選択して、右側のインスペクタでEnglishにチェックを入れます。
Localizationsから追加したい言語を選択します。
ダイアログが表示されたら、ローカライズしたいStoryboardを選択します。
「Reference Language」は「Base」で「File Types」は「localizable Strings」を選択してください。
ここまで行うと、Storyboard配下に、文言だけをローカライズするファイルが作成されます。
このファイル内は「Key = Value」の形になっているのでvalueの値をローカライズする言語に合わせて書き換えます。
これでローカライズは完成しました。iPhoneの言語設定を日本語、英語と切り替えるとローカライズされていると思います。
この方法を使えば、Storyboardのレイアウトの変更やボタンやレベルの追加などは、Storyboard(Base)に適用されるため、1回の変更で全ての言語に適用されます。
ソースコードは以下からどうぞ。
tochi/StoryboardLocalizeTest · GitHub
https://github.com/tochi/StoryboardLocalizeTest
これは素晴らしい!っと途中までは思ったのですが、Storyboardのローカライズファイルは画面のオブジェクトと1対1で紐付いています。
今回の例でいうと「brw-4w-pqj」というIDでStoryboardのラベルとローカライズファイルは紐付いています。
その為、複数の画面で同様の文言のボタンやラベルを配置した場合には、それぞれでローカライズの文言を記述する必要があるため、ローカライズファイル内で重複が発生します。
また、ローカライズファイルを作った後に、Storyboard上にボタンなどを追加した場合には、自分でローカライズファイルにkey=valueを記述してあげる必要があります。
最終的には「Localizable.stringsを使う」方法が最も「DRY」な方法でプログラマー的にはしっくりくるかなっという感じです。
適材適所で使い分けて見て下さい。
Please enjoy the development.