タイトル今から始めるCocoaプログラミング》文書ファイルを扱うアプリケーションを作る(補足)NSBundle(1)カテゴリーテキスト/フォント, Cocoa, 今から始めるCocoaプログラミング
作成日2002/2/4 15:22:31作成者新居雅行
   この記事のPDFファイル(367KB)は以下のアドレスにあります。
   ダウンロードには、MDOnlineのアカウントが必要です。
   pdfs/MDOnline020004.pdf
 ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
言語ごとに異なる文字列を得るには、NSBundleの機能を使うのがいちばん手軽だろう。言語リソースの変換テーブルを作成しておき、そこで、英語のメッセージとその言語のメッセージの対応表を作っておく。そうすれば、実行時に選択されている言語に合わせた文字列を取得することができる。

――――NSBundleと言語リソース
前回の記事では、nibファイルを言語ごとに用意するということを説明した。ウインドウのボタン名など、nibファイルで定義されるものについては、この方法で十分に国際化対応が可能になる。ただし、こうした文字列は、nibファイルに定義しているものだけでなく、ソースの中にもでてくる。もちろん、それらをテーブルとして管理して、言語に応じて…というのは簡単だが、なかなか後手後手になって、最後に苦労するということもあるかもしれない。しかしながら、NSBundleの機能を使えば、やや語弊があるかもしれないが、けっこう気楽に文字列の多言語対応ができてしまうのである。
NSBundleは、もちろんバンドルを扱うためのクラスだ。バンドルとは、実体はフォルダであるが、フォルダの中のものを一括してまとめて扱うための仕組みの一般的な名称である。アプリケーションやフレームワークはバンドルの一種である。アプリケーションの中は一定の決められたフォルダ構成となっている。こうした取り決めを、バンドルを扱うクラスで隠ぺいすることで、具体的な相対パスを知らなくても決められたメソッドを利用することで、バンドル内のさまざまなリソースにアクセスできるというわけである。
文字列の多言語対応については、その変換テーブルを言語リソースに置くのが基本だ。たとえば、日本語だと、パッケージの中のResourcesフォルダにあるJapanese.lprojフォルダに置く。だが、NSBundleでは、現在選択されている言語に応じて言語リソースを探し、優先順位に従って適切な言語リソースフォルダのテーブルファイルを参照するといったことを背後で自動的に行ってくれる。だから、プログラムの中ではファイルのパスは書かなくてもいいということである。あとは、決められた名前で決められた位置に、テーブルとなるファイルを置いておくだけでいいのである。

――――NSBundleの文字列変換機能
まず、NSBundleにあるメソッドを紹介しておこう。NSBundleにはいろいろな機能があるが、ここでは、文字列の多言語対応にかかわるもののうち、便利な機能にしぼって紹介する。いくつかのメソッドがあるが、通常は以下の1つのメソッドを使うだけで事は足りると思われる。動作については、表だけでは説明しきれないので、その後の本文を参照していただきたい。

☆指定した文字列に対し、変換テーブルに従って現在の言語に応じた文字列を得る(Static)
 String NSBundle.localizedString(String key)
 String NSBundle.localizedString(String key, String comment)
 String NSBundle.localizedString(String key, String tableName, String comment)
 戻り値 規則に従って変換された文字列
  引数 key     もとになる文字列
     comment   コメント
     tableName  テーブル名(テーブルとなるファイルのファイル名)。
            指定がない場合には、Localizableが指定されたものと
            みなす
  備考 メソッドlocalizedStringとして、この3つのメソッド以外に、異なる
     バンドルにあるテーブルを利用するものも定義されている

まず、プログラム中の文字列は、ダブルクォーテーションで囲った “String” といったものが代表的なリテラル表記である。その、文字列が、言語に応じてバリエーションを持たせる必要がある。したがって、1つの文字列に対して、複数の言語ごとの表現が存在するということになる。
こうした対応を取るために、たとえば、ある文字列が「msg1」だというキーワードで与えて、それを元に、言語ごとの文字列を "Processing" "処理中" などと表示するということは1つの方法だろう。このように、キーと値を対応付けるというやり方は、Cocoaでもよく見られる手法だ。ローカライズ文字列の処理はそれが基本とはなっている。しかしながら、もう少し簡便な方法を取っている。
まず、最初に、英語の表現を基本として、英語の文字列を決める。たとえば、"Processing" だったとしよう。英語が言語として選択されている場合には、その文字列を使う。一方、日本語が言語として選択されているのであれば、Processingをキーにして、「テーブル」を参照し、そこから "処理中" という文字列を得るという処理を行うことにする。つまり、英語の場合の文字列がキーとなって、テーブルからの表引きを行うというようにしたいということである。
ここで、テーブルというのは、実際にはファイルである。基本的には次のような規則での作成となる。

  • テーブルの中身はテキストファイルである。
  • 各行に、キー = 値; の形式で、対応表を作る。
  • キーや値は、ダブルクォーテーションで囲う。
  • /* */でのコメントも記載できる。
  • テーブルは、言語ごとに作成され、アプリケーションパッケージのResoucesフォルダの中の言語リソースのフォルダ(日本語なら、Japanese.lprojフォルダ)に存在する必要がある。
  • テーブルファイルのファイル名には、.stringsが拡張子としてつけられる。
  • .stringsを含まないファイル名を「テーブル名」として参照する。

こうして、テキストファイルでテーブルを用意しておけば、実行時に、テーブルに応じて変換された文字列が、プログラムの中で得られるという具合だ。ただ、これをさらにやりやすいような仕組みが用意されている。
(この項、続く)
関連リンク