iPhoneアプリケーション多言語化をpoファイルを使ってやる方法
iPhoneアプリケーションを他言語対応したいとしたら、Apple側がすでに用意してくれている方法を使うのが自然かと思う。 僕も最初はその方法を試した。ドキュメント的には以下がエントリポイントだろうか:
iOS Reference Library - Internationalization Programming Topics
しかしこの方法にはいろいろな問題があり、大きなアプリケーションを作ろうとするとストレスがかかってくるので現在は使用していない。(小さなプロジェクトでは使うこともある)
その問題とは以下のようなものだ:
- 言語ファイル(Localizable.strings)が独自形式なため、既存の翻訳ツールを使うことが出来ない
- 一つ目と少しかぶるが翻訳抜けや言語一覧などをチェックする機能がない
- ibtool のマイグレーション機能がくそで、バージョンアップのたびにリソースファイル内の文字列を頑張って置換する作業が必要になる
など。これらを解決するために現在は以下のような手法でアプリの多言語化を行っている:
- 言語ファイルには一般的なファイルである GNU gettext のカタログファイル形式(.po)を使う
- ソースファイルから
NSLocalizedString
系の呼び出しを抽出して .po ファイルの雛型を作成してくれるスクリプト(xgettext.pl)を作成 - .po ファイルを Localizable.string に変換するスクリプト(po2string.pl)を作成
- .nib ファイル内の多言語化が必要な文字情報はすべてインタフェースビルダーでは設定せず
.m
.mm
ファイルからセット(上のツール群をそのまま使うため)
と言う感じでやっている。その二つのスクリプトはこんな感じ。
Locale::Maketext::Extract
に依存している。
$ ./xgettext.pl -o resources/ja.po src/*.m
みたいな感じでまず言語カタログを作成。このファイルは Emacs の po-mode や Poedit などのツールで編集することができる。 個人的には Emacs を使い編集しているが、翻訳者のために良いツールを探しているのでおすすめがある方は教えていただきたい。
このスクリプトのポイントは何回実行しても.poファイル内のすでに翻訳済みのエントリは変更しないという点だ。 アプリケーションを更新したらスクリプトを実行し、.poファイル内の未翻訳のところのみ訳す、というサイクルを繰り返すことができる。.poファイルエディタは未翻訳エントリだけを簡単に編集できるというところも便利ポイントかな。
.po ファイルが翻訳されたら
$ ./po2strings.pl --po=resources/ja.po --strings=resources/Japanese.lproj/Localizable.strings src/*.m
などのようにしてiPhoneアプリから使える言語ファイルに書き出してやって完了。 ソースファイルを渡す必要があるのはスクリプトソースを見てもらえばわかるがただの手抜きである。
あ、ちなみにわざわざ NSLocalizedString(...)
とか書くのは面倒なので、
#define L(s) NSLocalizedString(s, nil)
とかを定義しておいて L(@"Hello")
とかでいけるようにしている。(もちろんxgettext.plはその書式にも対応している)