より効率的なCocoaアプリケーションの日本語化を目指して
前回のCocoaアプリケーションを地道に日本語化する方法は、実は多くの問題を抱えている。初めての翻訳作業はやる気満々、頑張って翻訳して日本語で表示されて嬉しくなるが、ソフトウェアというものに開発の終わりはない。常にバージョンアップ、不具合修正を繰り返すのが常である。そして2回目以降の翻訳作業で気付くのである...。
- 修正箇所が多岐に渡ると、日本語リソースのどの部分を修正するべきか、追加するべきか、削除するべきか、そのままで良いのか、非常に分かり難い。その結果、翻訳漏れ、翻訳間違いが発生し易い。
- 英語リソースを修正したら、日本語リソースも修正しなければならない。もし、その他の言語リソースにも対応するなら言語の数だけ上記の試練を感じながら翻訳作業をしなければならない。
- アプリケーションのメニューには、共通の基本メニューが多く(新規、開く...、カット、コピー、ペースト等)、新規開発のたびに翻訳することに’無駄を感じる。
以上のことに目をつぶり、ひたすら翻訳する姿は正に地道だ。何か面倒な処理を解決するためにソフトウェアを作っているのに、これでは言語環境に対応するだけでやる気が失せてくる...。(現状のMinuではそれほど手間を感じないが。)*1
ということで、より効率的なCocoaアプリケーションの日本語化の作業環境を調べてみた。
作業環境
AppleGlotを使う
AppleGlotはアップル純正のローカライズ支援ソフトらしい。使い始めるまでの設定は手間だし、操作方法も分かり難いが、慣れてしまえば完全手作業の翻訳よりはずっと効率的だと思う。
ダウンロード
- Localization Tools http://developer.apple.com/internationalization/localization/tools.html
- 上記のダウンロードページから、以下のものをダウンロードしておいた。
AppleGlotの環境設定
- AppleGlotを起動して、「Tool >> Create Empty Environment...」から、現在開発中のminuプロジェクトフォルダを指定して開いた。
- minuフォルダに以下のAppleGlot用のフォルダが追加される。(フォルダ名はすべて「_アンダースコア」から始まっている。)
- _ApplicationDictionaries(_WorkGlossaryで翻訳済みの部分が転送され、xmlファイルとして保存される。拡張子は.ad。)
- _LanguageGlossaries(_ApplicationDictionariesと同じ形式の翻訳辞書。拡張子は.lgに変更。例えばText Editの翻訳辞書を設定しておけば、基本的な「ファイル-開く...」「編集-コピー」等の基本メニューが、この辞書を利用して翻訳される。)
- _Logs
- _NewBase(翻訳前のアプリケーション.appを入れる)
- _NewLoc(翻訳済みのアプリケーション.appが出力される)
- _OldBase(前バージョンの翻訳前のアプリケーション.appを入れる)
- _OldLoc(前バージョンの翻訳済みのアプリケーション.appを入れる)
- _Projects
- _Rules
- _Temporary
- _Translators
- _WorkGlossary(翻訳前の辞書がxmlファイルとして保存される。ここのファイルを開いて翻訳する。)
- _LanguageGlossariesにテキストエディットの翻訳辞書を設定した。
- _NewBase、_OldBase、_OldLocフォルダに、現状のXcodeの開発状態でビルドしたミニマムメニュー.appをコピーする。(InfoPlist.stringsの日本語リソースによって、日本語のファイル名で表示されている。)
- AppleGlotでメニューの「File >> Open...」からminuプロジェクトフォルダを開く。
- 左側のチェックを入れておく。(チェックを入れた行が翻訳作業の対象になる)
-
- 「AppleGlot >> Preferences...」の設定
-
- 「Tool >> Set Target and Base Locales...」の設定
翻訳作業の始まり
- 「Actions >> Initial Pass」を実行
- _NewLocフォルダに日本語に翻訳されたミニマムメニュー.appが出力される。(AppleGlotのウィンドウからNewLocのminu.appをダブルクリックすれば、翻訳されたアプリケーションが起動する。)
-
- InfoPlist.stringsの日本語リソース分については、_ApplicationDictionariesに翻訳辞書が生成され翻訳済みの状態になっている。(_OldLocから未変更の部分は翻訳済みの状態になる。)
- _WorkGlossaryのminu.app.wgをXcodeで開くと、翻訳中の辞書の状態が確認できる。(_LanguageGlossariesのテキストエディットの辞書を活用して既にある程度に翻訳済みになっている。)
- 現状は以下のような翻訳状態。アラートウィンドウは翻訳されず、メニューの一部(環境設定...、サービス、ほかを隠す、すべて表示)が翻訳済み。
- 「Actions >> Incremental Pass」を実行
- _WorkGlossaryのminu.app.wgで翻訳済みの分が_ApplicationDictionariesのminu.app.adに移動する。
- アラートウィンドウのボタンも日本語に翻訳された。(Cancel → キャンセル)
- _WorkGlossaryに残っているまだ翻訳されていない辞書の翻訳を行う。
- 翻訳するには...
//翻訳前 <base loc="en" >This is test.</base> <tran loc="ja" origin=""></tran> //tranタグに訳を挿入して翻訳 <base loc="en" >This is test.</base> <tran loc="ja" origin="">これはテストです。</tran>
-
- 翻訳済みの_WorkGlossary/minu.app.wg
<?xml version="1.0" encoding="UTF-8"?> <!-- Comment here. (1.0a10c2) --> <Proj> <ProjName>minu.app</ProjName> <!-- --> <!-- minu.app/../Localizable.strings --> <!-- --> <File> <Filepath>minu.app/Contents/Resources/English.lproj/Localizable.strings</Filepath> <TextItem> <Description></Description> <Position>testMessage</Position> <TranslationSet> <base loc="en" >This is test.</base> <tran loc="ja" origin="">これはテストです。</tran> </TranslationSet> </TextItem> <TextItem> <Description> testRunAlertPanel</Description> <Position>testTitle</Position> <TranslationSet> <base loc="en" >Test</base> <tran loc="ja" origin="">テスト</tran> </TranslationSet> </TextItem> </File> <!-- --> <!-- minu.app/../MainMenu.nib.strings --> <!-- --> <File> <Filepath>minu.app/Contents/Resources/English.lproj/MainMenu.nib.strings</Filepath> <TextItem> <Description> Class = "NSMenuItem"; title = "Hide Minu"; ObjectID = "134"; </Description> <Position>134.title</Position> <TranslationSet> <base loc="en" >Hide Minu</base> <tran loc="ja" origin="">ミニューを隠す</tran> </TranslationSet> </TextItem> <TextItem> <Description> Class = "NSMenuItem"; title = "Quit Minu"; ObjectID = "136"; </Description> <Position>136.title</Position> <TranslationSet> <base loc="en" >Quit Minu</base> <tran loc="ja" origin="">ミニューを終了</tran> </TranslationSet> </TextItem> <TextItem> <Description> Class = "NSMenu"; title = "AMainMenu"; ObjectID = "29"; </Description> <Position>29.title</Position> <TranslationSet> <base loc="en" >AMainMenu</base> <tran loc="ja" origin=""></tran> </TranslationSet> </TextItem> <TextItem> <Description> Class = "NSMenuItem"; title = "About Minu"; ObjectID = "58"; </Description> <Position>58.title</Position> <TranslationSet> <base loc="en" >About Minu</base> <tran loc="ja" origin="">ミニューについて</tran> </TranslationSet> </TextItem> </File> </Proj>
- 上記を保存して、再び「Actions >> Incremental Pass」を実行した。
- _WorkGlossary/minu.app.wgの翻訳済みの部分が、_ApplicationDictionaries/minu.app.adに移動した。
- すべての翻訳が_NewLocに出力されたアプリケーションに反映された。
なぜか翻訳が反映されない時には...
AppleGlotのメニューから「Tool >> Repair Environment...」を実行してみる。(minuプロジェクトフォルダを再指定)
iLingualを使う
iLingualというローカライズ支援ソフトの存在も知った。というより、iLingualを知ってしまったら、もはやAppleGlotに戻ることなんて出来ない...。AppleGlotのような複雑なフォルダ構成や環境設定、分かり難い操作手順とは無縁。とても快適に日本語リソースを作ることができた!
使い方は、AppleGlotを体験した今、iアプリのように直感的でほとんど迷うことはなかった。素晴らしい日本語のマニュアルも付属しているので、ここで説明するのは無意味だ。
シェアウェアということになっているが、非商用利用の場合に限定して、フリーウェアとなるようだ。素晴らしい!iLingualの作者さんに感謝。
*1:自分用のアプリケーションなら、割り切って最初から日本語リソースのみで開発してしまうのも一つの解決方法かも。しかし、開発する時のリソースは英語で、特にInterface Builderのメニューは英語のセットになっているので、毎回日本語に変更するのは手間だ。さらに日本語リソースしかなければ、より多くの人に受け入れられる可能性は無くなる。自分自身で考えてみても、いくら優秀なソフトウェアであっても、英語以外の言語では使う気にはならないだろう。英語なら何とか使える気がする。