Storyboardの多言語対応を行う&ハマったこと

普通のテキストなんかは NSLocalizedString(@"text",@"comment") で
書くように癖を付けとけば、基本的に多言語対応するときにもそんなに困りません。


iOS6以降で、storyboardを使って開発を行っていると
storyboardの要素に付いても多言語対応するのが簡単になりました。


基本的にはこちらのブログを参照すると分かると思います。


◆ 国際化したStoryboardを一つにまとめる / ninjinkun's diary
http://ninjinkun.hatenablog.com/entry/2013/01/14/192206


これで後は追加した.stringsファイルを編集すれば
言語ごとにstoryboardを作らなくて良くなるので、ヒャッハーって言う
感じではありますが色々とハマったことがありましたので備忘録。


“Could not find a storyboard named .."とか言われる

Baseを追加してから、[UIStoryboard storyboardWithName: bundle:]で読み出そうとすると
なんか見つからないとか言ってきました。
Cleanしても無駄だし、なんだこりゃって感じで。


私の環境では、一応こちらに挙げられていた解決方法で直りました。
http://stackoverflow.com/questions/15848165/base-internationalization-and-could-not-find-a-storyboard-named
Xcodeを完全に終了してから再起動して、Cleanして再ビルド。



変更が反映されない

色んな箇所を英語化したのに、反映されませんでした。
日本語のLocalizableを削除して、英語だけにしたのに反映されませんでした。


なんかこれキャッシュが効いてるんじゃないかってことで
アプリを一回削除してから再インストールしたら反映されました。
キャッシュ強過ぎ。



特定のLabel、Buttonだけ言語が反映されない

削除して再インストールなんかをしても、特定のコントロールだけ
変更が全然反映されませんでした。
どうやら、たとえ継承していたとしてもCustom Classだと適用されないぽい。ひどい。


◆ Localization of custom class set in storyboard doesn't work
http://stackoverflow.com/questions/19397896/localization-of-custom-class-set-in-storyboard-doesnt-work


仕方がないので、こちらで挙げられている形で修正をかけていくことにしました。

myLabel.text = NSLocalizedStringFromTable(@"ObjectID.text", @"storyboardName", nil)

各Storyboard.stringsの要素をNSLocalizedStringFromTableを使って参照して適用。
取りあえず手元で確認した限りでは、これでOKでした。


ただ、存在しない言語の場合に"ObjectID.text"という名前で表示されてしまう問題も発生します。
私は今回、デフォルト言語を英語にして日本語の場合だけ変えるって形にしたので
事前に言語設定の判定関数を呼び出して日本語の場合だけこの処理を通るようにしています。


また、多言語対応でハマったことがあったらここに追記しようかと思います。