タイトル今から始めるCocoaプログラミング》文書ファイルを扱うアプリケーションを作る(18)ローカライズ(2)カテゴリーユーザインタフェース, Cocoa, 今から始めるCocoaプログラミング
作成日2002/2/1 14:4:28作成者新居雅行
――――言語ごとのリソースを管理する
それでは、JapaneseのMainMenu.nibの英語になっている項目を1つ1つ手作業で日本語化するということもあるわけだが、それではあまりに非効率的だ。そこで、nibtoolというコマンドを使って作業を行なう。考え方は次の通りだ。まず、Englishをマスターとなるものとする。そして、マスターの中にある定義を、別途用意したテーブルをもとに変換をして、新たな定義を作成する…という具合の動作を行う。
nibtoolは、Developer Toolsのインストールによって、/usr/binディレクトリにコピーされるので、通常はコマンド名はそのまま利用できるはずだ。まず、このnibtoolを使って、変換テーブルのひな形を作る。ここでは、MOSAEditorのプロジェクトのフォルダをカレントフォルダにしておく。つまり、English.lprojやJapanese.lprojがあるフォルダをカレントしてにおくということだ。そして以下のようなコマンドを入力した。

% nibtool -L English.lproj/MainMenu.nib > menu.strings

ここでは、nibtoolのオプションとして、-Lがあり、出力結果をリダイレクトしている。この、-Lというオプションは、その後のnibファイルから、ローカライズすべき文字列を取り出して、テーブル形式で一覧するという機能を持っている。結果は標準出力に出すのだが、この状態では、プロジェクトのフォルダに、menu.stringsという名前のファイルを出力することとなる。そのファイルをエディタで見てみると次の通りだ。

◇-Lオプションで作成されたmenu.stringsファイル
 

コメントを除くと、メニューやダイアログボックスにある項目名が、イコールの左右に並んでいる。ここで、英語のリソースをもとに日本語のリソースを作るとすれば、次のように、イコールの左側はそのままにして、イコールの右側に日本語の文字列に入れ替える。ここでは作業をJeditでやっているが、ファイルはShift-JISで保存してよさそうだ。

◇対応表を日本語で書き換える
 

もちろん、全部の項目について、“日本語化”する必要がある(のだが、以下の説明は一部さぼっている。お許し頂きたい)。こうして、英語リソースを日本語リソースに変更する対応表ができた。続いて、次のようにコマンドを入力してみよう。もちろん、プロジェクトのフォルダがカレントになっている状態で入力する。

% nibtool -d menu.strings -W Japanese.lproj/MainMenu.nib English.lproj/MainMenu.nib

ここでは、nibtoolコマンドについて、-dと-Wのオプションがあるということになる。そして、一番最後のパラーメタであるEnglish.lproj/MainMenu.nibが元のリソースである。-dは変換テーブルの定義されたファイルを指定する。そして、-Wオプションは変換結果を書き出す先だ。つまり、English言語のMainMenu.nibを読み取り、menu.stringsの結果に照らし合わせて文字列の置換をしたものを、Japanese言語のMainMenu.nibファイルとして書き込むというものである。
こうして、Japanese.lproj/MainMenu.nibは書き換えられた。そこで、再度Interface Builderで開いてみる。Project Builderで、MainMenu.nibの下にあるJapaneseを開くわけだ。そうして、メニューなどを見てみると、確かに、menu.stringsで書き換えを行った部分は、日本語になっている。

◇テーブルに従ってメッセージが日本語化された
 

nibファイルは単にユーザインタフェースを定義するだけでなく、オブジェクトのインスタンス化やあるいは線でつないだ参照関係などさまざまな情報を含む。こうした情報をのなかの、メッセージだけを変換して、新たなnibファイルを作るということで、ローカライズができるわけだ。
もし、たとえば、新しくメニューが増えたとしたら、そのときは、そのメニュー項目に対応した変換項目を、この場合だと、menu.stringsに付け加えればよい。そして、前期のnibtoolコマンドを実行すればいいわけだ。こうして、Interface Builderでのさまざまな設定を引き継いだローカライズリソースが作成できる。とにかく作業は、英語版のリソースで設定をして、変換テーブルを追加変更してコマンドを走らせるということになる。もし、英語のメッセージに比べて日本語だと何倍にも長くなるようなら、レイアウトの変更も必要になる。そのときは、Japanese言語にあるnibファイルを開いて編集すれば良いだろう。
nibtoolで新たなnibファイルを生成するのなら、わざわざ最初にProject BuilderでJapaneseのリソースを作る必要はないと思うかもしれないが、nibtoolはバグとして、既存のファイルへの上書きしかできないことが明記されている。また、Project Builderでリソースを作っておけば、プロジェクトの登録や、ビルド関連の登録もされて、便利だということもあるわけだ。
なお、nibtoolをnibファイルのすべての中身について適用するような利用方法として、前記のものを紹介したが、一部分の設定だけを取り出すなどさまざまな機能があるので、詳細なニーズがある場合には、manコマンドでどんな機能があるのかをチェックしてもらいたい。たとえば、変換テーブルの適用だけでなく、さらに第三のnibファイルでレイアウト情報だけを取り出して適用するといった手法もある模様だ(-pオプション)。言語ごとに大きくレイアウトが違う場合で、後からのnibファイル修正があるような場合にはそうした方法も取ることができるだろう。

――――nibtoolの自動化
いちいちnibtoolコマンドを入力するのも面倒だし、パラメータの指定も大変である。そういうときには、自動化してしまえばよい。Project Builderで、コンパイルしてパッケージを作る前に、前記のnibtoolコマンドを実行するというわけである。Project Builderのターゲットの変種にある「ファイルとビルドフェーズ」というところで設定を行うが、1つのターゲットで、複数のビルドフェーズを定義することができ、そのフェーズを順番に行うというのが基本となっている。
では、ビルドフェーズを追加して、nibtoolコマンドを実行されるようにしておこう。「プロジェクト」メニューから「アクティブターゲットを編集」(Command+option+E)を選択するなどして、ターゲットの編集の状態にしておき「ファイルとビルドフェーズ」のタブを選択しておく。そして、とりあえずは、いちばん最初のHeadersの領域を選択しておく。

◇「ファイルとビルドフェーズ」で1つのフェーズを選択しておく
 

次に「プロジェクト」メニューの「新規ビルドフェーズ」から「新規フェルスクリプト・ビルドフェーズ」を選択する。

◇シェルスクリプトのビルドフェーズを追加する
 

そうすると、次のように、Shell Scriptというビルドフェーズが作成される。ここで、「スクリプト」として前記のコマンドを入力しておく。ここでは、プロジェクトのフォルダがカレントディレクトリとして機能するようなので、前のコマンドをそのまま入力すればよい。

◇スクリプトを定義した
 

こうすれば、アプリケーションんをビルドするときはいつもnibtoolコマンドが実行され、そのつど、English言語のMainMenu.nibの内容が変換されて、Japanese言語のMainMenu.nibとなることになる。ただし、nibtoolの処理によって更新される内容によるのか、単にビルドしただけでは、nibtoolによる処理の結果はアプリケーションには反映されない。そこで、いったんクリアすることで、設定は反映されるようだ。毎回クリアするのも面倒だが、いずれにしてもnibツールの結果を反映させたいときには、手作業でクリアをするというのがいちばん手軽だろう。いずれにしてもビルドフェーズに定義しておくことで、nibtoolの実行を忘れないでおくこともできる。
(この項、続く)
関連リンク