iOS開発で Xibの多言語化は厄介なところだが、その作業を楽にしてくれるツールとライブラリのセット。
仕組みはこんな感じ
まずコマンドラインツールagi18nを使って .stringsファイルを生成する
xib ↓ agi18n実行 ↓ xibのコントロール上のラベルを元に生成した .stringsファイルこれが各言語毎に自動的に生成される。これを各言語に合わせて翻訳しておく。
特徴的なのは、この時生成される .stringsは既に翻訳してあるところは残して、新しいものだけマージしてくれるところ。この為、開発中に何度でも実行することができる。また重複する文言をまとめてくるようだ。
プロジェクトにはツールと一緒に提供されているライブラリを追加しておく。このライブラリは実行時のxibロード時に実行環境に合わせた言語.stringsの文字をコントロールのラベルへ自動的に設定してくれる。
アプリ実行 ↓ xibロード ↓ (agi18nライブラリ).stringsファイルから文字を取得し xib上のコントロールのラベルへセット。 ↓ 表示NSObjectのカテゴリ内でawakeFromNibをswizzlingでフックし、そのタイミングで .stringsファイルの文字をxib上のコントロールのラベルに反映する処理を実行している。これによってアプリのコードの修正無しに文字の設定が自動的に行われる。
カスタムコントロールの場合は自分でlocalizeFromNibを実装しておけば同様に自動設定をしてくれる。作者によればこの自動設定によるオーバーヘッドは通常のxibロードにかかる時間の 5%増程度とのこと。
- - - -
Xibの多言語化方法は大別して (a)ibtoolsなどを使い言語毎にXibを作る方法 (b)新たにサポートされたXcodeのxibローカライズを使う方法 (c)コントロール全部のアウトレットを作ってNSLocalizedStringで詰め込む方法の3種類がある。自分の場合は保守性を優先して(c)を使っている。アウトレットが面倒だけれどもstringsファイルの管理だけで済むので一旦形ができれば楽。それはともかくいずれの方法も一長一短があって決定的な方法が無いのが悩ましいところ(この辺りの考察は上記の作者のページで解説されている)。実行時の自動設定というアイディアは現時点のiOS開発の多言語化方式の状況を考えると悪くはなく、そこに専用のツールをセットで提供して保守作業の負荷を軽減する考えは実用的だと思った。なお実行時に自動的にラベルをセットする方法は過去自分もやったことがありその時はかなり楽だったので案外このアイディアは悪くないと思う。