Cocoa アプリのローカライズ
(2005/10/07 記)
せっかく多言語対応の OS を使っているのに、自分でプログラムを書く時はローカライズのことを考えずに英語(ないしは日本語)決め打ちで作ってしまうことが多い。要するに面倒くさいからなのだが、必要な事項を覚え書きでまとめておけば多少は面倒さが減るかもしれないので、メモしておく。
1. 文字列定数
言うまでもなく、ソースコードに文字列を直接書き込んでしまうのが一番いけない。必要な手順は次の通り。
- Localizable.strings なるファイルを作る。このファイルの文字コードは UTF-16(UTF-8に非ず)にしておくこと。Xcode 上で文字コードを設定するには、エディタをアクティブにした状態で Format > File Encoding メニューを使う。Groups & Files のカラムでファイル名を選択した状態ではこのメニューは使えないので注意(けっこう悩んだ)。
- ユーザーの目に触れる文字列が出て来たら、
@"..."
で直接書かずに、NSLocalizedString(@"keyString", @"");
(keyString は任意の文字列)と書いておき、Localizable.strings
の中に "keyString" = "..."
; という一行を書き加える。セミコロンを忘れずに。
Unicode ファイルを使う時の一般的な問題だが、バックスラッシュの取り扱いに注意が必要。エディタの種類・設定によっては、バックスラッシュ (0x5c) を円マーク (0xa5) で保存してしまうことがある。僕は mi 2.1.5 をデフォルト状態で使っていてハマってしまった。Xcode のエディタで編集し直してしのいだが、あとで見たら mi にもバックスラッシュを 0x5c で保存するための設定がちゃんとあった(「モードの設定」の中の「文字コード」)。
2. Nib ファイル、strings ファイルなどのローカライズ対応
Xcode の Groups & Files カラムでファイルを選んで Get Info (command-I) し、"Make File Localizable" を押すと、そのファイルが English.lproj の中に移動され、ローカライズ対応になる。
3. AppleGlot を使う
手動で nib ファイル、strings ファイルなどを Japanese.lproj フォルダにコピーして書き換えるのは面倒だし、間違いも多くなる。Apple 純正のローカライズツールの AppleGlot を使えば、テキストベースでローカライズができる。ちょっと使い方は複雑なのだが、わかってしまえば難しくはない。AppleGlot は Apple Developer Connection の Localization Tools のページからダウンロードできる。一般的な手順は下の通り。
- AppleGrot の Tools > Create Empty Environment で新しい作業用フォルダを作る。CocoaRsync のローカライズの時は、CocoaRsync Localize というフォルダを作って作業した。
- とりあえず英語版でアプリケーションを作成する。Nib ファイル、strings ファイルなどはできるだけローカライズ対応にしておく。
- 作ったアプリケーションを、先ほど作成した作業用フォルダの中の _NewBase というフォルダにコピーする。これを元にして、ローカライズされたアプリケーションが _NewLoc フォルダに作られる。
- もし、作った英語版アプリケーションの中に、手動でローカライズしたリソースがすでに存在するなら、_OldBase, _OldLoc フォルダにも同じアプリケーションをコピーする。ここに入っているアプリケーションは部分的にローカライズが済んでいると見なされ、_OldLoc 中のアプリケーションが持っている Japanese.lproj などのローカライズリソースはそのまま _NewLoc に作られる新しいアプリケーションにコピーされる。
この手順を踏まないと、_NewLoc 中の新しいアプリケーションの Japanese.lproj などのリソースはすべて English.lproj のものから作成されるので、手動でローカライズしたリソースが上書きされてしまう。CocoaRsync のローカライズの時には、手動でローカライズした Credits.rtf が上書きされてしまって困った。
- メニューアイテム名(File, Edit, Window およびそのサブメニュー)などには、多くの Mac OS X アプリケーションに共通の単語がある。これらは用語を統一しておかないと使いにくくなるので、同じページからダウンロードできる Glossaries を利用する。ちなみに、この Glossaries は ftp.apple.com に置いてあり、Safari ではうまくダウンロードできないことがある。Internet Explorer を使うとダウンロードできた。
この Glossaries には、その言語にローカライズされた多くのアプリケーションのローカライズ設定ファイルが収められているので、自分のアプリケーションと似た単語・メッセージを持っていそうなアプリケーションを選んで、その設定ファイルを _LanguageGlossaries にコピーする。CocoaRsync では、テキストエディットの設定ファイルを利用した。
- AppleGlot で作業用フォルダを開くと、NewBase のカラムに先ほどコピーした自分の英語版アプリケーションがリストされているはず。左端のカラムのチェックボックスを ON にしておく。また、Tools > Set Base and Target Locales で、Base Locale を English, Target Locale を Japanese にしておく。
- Actions > Initial Pass を実行する。_NewLoc 中にアプリケーションのコピーが作られるが、この段階では Japanese.lproj の中のリソースは English.lproj と同じものが入っている。同時に、_WorkGlossaries フォルダの中に "アプリケーション名.app.wg" という xml ファイルが作成される。このファイルは、nib, strings ファイルから抜き出された文字列が入っており、元の文字列に対してローカライズされた文字列を並べて記述できるようになっている。_LanguageGlossaries に入れた設定ファイル(形式は同じ xml)中に同じ文字列があれば、対応するローカライズ文字列が自動的に挿入される。そうでない場合は、ローカライズされた文字列の欄は空白になっている。
- "アプリケーション名.app.wg" ファイルを編集して、適切なローカライズ文字列を記入する。このとき xml の構造を壊さないように注意。CocoaRsync の時は、タグの < を1箇所間違って消去してしまい、そのエラーがどこにあるか見つけるのにえらく苦労した。(xml ファイルを分割して半分ずつ書き戻しては、エラーのある箇所を狭めて行く、というやり方。昔の「INITコンフリクト」対策の応用!)ちゃんとした xml エディタを使った方がよい。また、前に述べたバックスラッシュ問題にも注意。ちなみに、この xml ファイルは UTF-8 エンコーディングである。
- AppleGlot に戻り、Actions > Incremental Pass を実行する。.wg ファイルに問題がなければ、Japanese.lproj の nib, strings ファイルが書き換えられ、日本語にローカライズされたアプリケーションが _NewLoc の中に完成する。同時に、元の文字列・ローカライズ文字列の対応が _ApplicationDictionaries フォルダの中に "アプリケーション名.app.ad" という名前で残される。
なお、この手順を考え出すにあたっては、nakamuxu さんが公開されている CotEditor のローカライズファイルに同梱されているメモを参考にしました。