iPhoneアプリ内のテーブルアイテムのローカライズ

iPhoneアプリの開発をやってるとやはり気になるのがローカライズ(多言語化)ですよね。
世界中のユーザ向けにアプリを提供する気ならば間違いなく避けては通れません。
リソースファイルによる多言語化は各所で解説がなされています。
例えば、ラベルやプレイスホルダー、アラートなど単一のメッセージに対してのローカライズ手法です。
以下のサイトがわかりやすく解説しています。
 
SE奮闘記/【Objective-C】iPhoneアプリの多言語化(ローカライズ)
 
今回はこのローカライズをテーブルアイテムに適用してみようという試みです。
基本的な方法は以下。
 
1.各言語のテーブルアイテム用リソースファイルを作成
2.<国記号>.lprojフォルダに作成したファイルをコピー
3.XCodeにてコピーしたファイルを追加
4.追加したファイルを読み込む
ex.テーブル追加例
 
1.各言語のリストアイテム用リソースファイルを作成
 リソースファイルの形式に決まりはありません。
 ですので、JSONなりXMLなりで各言語ごとに作成してください。*1
 ポイントとしては、全てのリソースファイルは共通のファイル名を持つようにしてください。
 例えば、「sample.xml」というリソースファイルを作成したならば、
 英語用も日本語用も中国語用も全て同じ名前にする必要があります。
 
 
2.<国記号>.lprojフォルダに作成したファイルをコピー
 作成したリソースファイルを<国記号>.lprojフォルダにコピーします。
 例えば、英語用リソースファイルならば「en.lproj」、
 日本語用リソースファイルならば「ja.lproj」にコピーしてください。
 これらのリソースフォルダはiPhoneの設定で
 言語環境を変更した場合に呼ばれるフォルダとなります。
 これらのフォルダがない場合はFinderより作成して、XCodeに追加してください。
 
 
3.XCodeにてコピーしたファイルを追加
 XCodeから利用できるようにするためにXCodeに追加しましょう。
 
 1.XCodeの左ペインのツリーより[Resources]を右クリック
 2.[追加] > [既存のファイル]
 3.先ほどコピーしたリソースファイルを選択する。
 ※追加オプションはデフォルトで問題ないと思います。
 
 ファイルが追加されると[Resources]配下が以下のようになると思います。

<英語用と日本語用を追加した場合>
 
▼Resources
 ▼[追加したファイル名]
  en
  ja

 
 
4.追加したファイルを読み込む
 次に追加したファイルを読み込みます。

NSString *fileName = [ [NSBundle mainBundle]
 pathForResource:@"ファイル名" ofType:@"ファイル拡張子"];
NSString *fileDesc = [ [NSString alloc]
 initWithContentsOfFile:fileName encoding:NSUTF8StringEncoding error:nil];

 上記例ではファイルをUTF8エンコードでNSString型で読み込んでいます。
 
 
ex.テーブル追加例
 テーブルアイテムとして追加する例を以下に示します。
 今回、読み込むデータはJSONで作成しており、
 JSONパーサとしてJSON-Frameworkを利用しています。*2

/** samleData.json **/
{"items":[
 {"key":"firstKey","val":"firstValue"},
 {"key":"secondKey","val":"secondValue"},
 {"key":"thirdKey","val":"thirdValue"}
]}

/** Table View**/
@synthesize sampleArray
 
- (void)viewDidLoad {
 [super viewDidLoad];
 sampleArray = [ [NSMutableArray alloc] initWithCapacity:10];
 NSString *fileName = [ [NSBundle mainBundle]
           pathForResource:@"sampleData"
           ofType:@"json"];
 NSString *jsonString = [ [NSString alloc]
            initWithContentsOfFile:fileName
            encoding:NSUTF8StringEncoding error:nil];
 NSDictionary *jsonDic = [jsonString JSONValue];
 [sampleArray removeAllObjects];
 [sampleArray addObjectsFromArray:[jsonDic objectForKey:@"items"]];
 [jsonString release];
}
 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)TableView {
 return 1;
}
 
- (NSInteger)tableView:(UITableView *)TableView numberOfRowsInSection:(NSInteger)section {
 return [sampleArray count];
}
 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 
 static NSString *CellIdentifier = @"Cell";

 UITableViewCell *cell =
  [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
 
 if (cell == nil) {
  cell = [[[UITableViewCell alloc]
   initWithStyle:UITableViewCellStyleDefault
   reuseIdentifier:CellIdentifier] autorelease];
 }
 
 NSDictionary *tmp = [sampleArray objectAtIndex:indexPath.row];
 cell.textLabel.text = [tmp objectForKey:@"key"];
 
 return cell;
}

 必要な箇所のみ記述してあります。
 このソースでは「sampleData.json」を読み込み、それを配列に格納しています。
 その後、格納した配列から列を取り出して、それをNSDictionaryとして扱っています。
 テーブルに表示されるのは、「key」で指定した値ということになりますね。
 これだけでiPhoneの言語設定に合わせたファイルを取得することができます。
 ちょっとした静的リストを扱いたいときなどには便利ですね。

*1:JSONを利用する場合は外部ライブラリを利用する必要があります。

*2:Google Code json-framework