連載
» 2010年08月20日 00時00分 公開

SDKで始めるiPad/iPhoneアプリ開発の勘所(3):iPhone/iPadアプリ作成の仕上げ・国際化・デバッグ (2/4)

[竹内彰吾,株式会社ビーブレイクシステムズ]

iPhone/iPadアプリを国際化するには

 iPhone/iPadアプリ制作のだいご味の1つは、アップルのiTunes App Storeを通して全世界を相手にアプリを販売できることでしょう。しかし、そのためには「アプリの国際化」が必須です。

 アプリの国際化とは、例えば端末設定で[一般]→[言語環境]の言語を「日本語」から「English」に変更した際、アプリ内の文字表示などもすべて英語に切り替わるようにすることを指します。また、このようにある特定言語にアプリを対応させることを「ローカライズ」と呼びます。

 iPhone/iPadアプリにおける国際化対象には、次のものがあります。

  • コードが生成するテキスト(日付け、時刻、数値表記なども含む)
  • 静的テキスト(アプリから参照されるHTMLファイルなど)
  • アイコンおよび、そのほかの画像(テキストが含まれている場合や特定の文化に固有の意味を表現する場合)
  • 話し言葉を含むサウンドファイル
  • NIBファイル

 今回のサンプルであるBMI計算アプリでは、上記に該当する国際化対象は以下の項目です。

  • アプリ名(コードが生成するテキスト)
  • BMICalcViewController.m(コードが生成するテキスト)
  • BMICalcViewController.xib(NIBファイル)

「lproj」フォルダの作成

 アプリをローカライズするには、まず「lproj」と呼ばれるサブフォルダを作成します。

 lprojフォルダは「【言語の略称】.lproj」という名前で作成する必要があります。【言語の略称】には、「ISO 639-1」または「ISO 639-2」という国際規格で決められた言語の略称が使用できます。

アプリ名の国際化

 まずは、Finderでプロジェクト直下に日本語用の「ja.lproj」と英語用の「en.lproj」フォルダを作成します。

 ローカライズされたアプリ名は、「InfoPlist.strings]というファイルに記述します。Xcodeで[Resources]を[control]キーを押しながらマウスでクリックし、[追加]→[新規ファイル]を選択します。

 [新規ファイル]画面で、[Resources]から[Strings File]選択し、[次へ]をクリックします。

 [ファイル名]を「InfoPlist.strings]、[保存場所]に先ほど作成した「ja.lploj」フォルダを指定して、[完了]をクリックします。

 すると、Xcodeの[グループとファイル]に「InfoPlist.strings」が追加され、その配下に「ja」という項目が入っています。

 この「ja」を開き、下記の行を追加します。

CFBundleName = "BMI計算";
CFBundleDisplayName = "BMI計算";

 同様に、「en.lproj」配下に英語用の「InfoPlist.strings」ファイルを追加し、下記の行を追加します。

CFBundleName = "BMICalc";
CFBundleDisplayName = "BMICalc";

 この「CFBundleName」「CFBundleDisplayName」というキーで設定した値が、ローカライズされたアプリ名になります。

コードが生成するテキストの国際化

 前回は、Xcodeでのコーディング時にソースコードに直接日本語のテキストを書き込んでいました。このままでは言語設定を変更しても日本語でしか表示されません。「BMICalcViewController.m」のexecuteCalcメソッド内の下記の部分が国際化の対象です。

    // BMIが18.51より小さければ「やせ気味」
    if (bmi < 18.5) {
        result = @"「やせ気味」です。";
    // BMIが18.5以上、25より小さければ「理想の体重」
    } else if (bmi >= 18.5 && bmi < 25) {
        result = @"「理想の体重」です。";
    // それ以上の場合は「肥満」
    } else {
        result = @"「肥満」です。";
    }
    
    // 判定結果を結果ラベルに設定
    resultLabel.text = [NSString stringWithFormat:@"%@%@%@%@%@%@",
                        @"BMI\n", bmiStr, 
                        @"\n\n標準体重\n", stdWeightStr, @"kg\n\n",
                        result];

 コードに含まれる文字列を国際化するには、NSLocalizedString関数を使用します。NSLocalizedString関数の構文は、以下のとおりです。

NSLocalizedString(NSString *key, NSString *comment);

 第1引数「key」には、ローカライズされた文字列に対する一意のキーを、第2引数「comment」には、翻訳者の参考になるような説明を記述します。

 NSLocalizedStringを使ってBMICalcViewController.mの該当部分を以下のように書き換えます。

    // BMIが18.51より小さければ「やせ気味」
    if (bmi < 18.5) {
        result = NSLocalizedString(@"wei_thin", @"Message for result thin.");
      // BMIが18.5以上、25より小さければ「理想の体重」
    } else if (bmi >= 18.5 && bmi < 25) {
        result = NSLocalizedString(@"wei_normal", @"Message for result normal.");
    // それ以上の場合は「肥満」
    } else {
        result = NSLocalizedString(@"wei_fat", @"Message for result fat.");
    }
    
    // 判定結果を結果ラベルに設定
    resultLabel.text = [NSString stringWithFormat:@"%@%@%@%@%@%@",
                        @"BMI\n", bmiStr, 
                        NSLocalizedString(@"stdWeight", @"Label for Standard weight."),
                                        stdWeightStr, @"kg\n\n",
                        result];

 次に、ローカライズされた文字列を保持する「Localizable.strings」ファイルを作成します。「InfoPlist.strings」を作成したときと同様に、新規ファイルで[Strings File]を選択します。[ファイル名]を「Localizable.strings」にして、[保存場所]に「ja.lproj」フォルダを選択して[完了]をクリックします。

 同様に「en.lploj」フォルダにも「Localizable.strings」ファイルを追加します。

 この言語ごとの「Localizable.strings」ファイルに、NSLocalizedString関数で指定したキーに対応する文字列を記述します。

 ソースコードからキーの値をコピー&ペーストしてもいいですが、1つの手法として[genstrings]コマンドを使ってソースコード中のNSLocalizedStringのキーを一括してファイルに書き出せます。

 Mac OS X付属アプリの[ターミナル]を立ち上げてBMICalcプロジェクトのフォルダに移動します(「./iPhone/BMICalc」の部分は各自のプロジェクトフォルダを指定してください)。

$ cd ./iPhone/BMICalc

 下記のように[genstring]コマンドを実行します。

genstrings -a ./Classes/*.m

 すると、「BMICalc」フォルダ直下に「Localizable.strings」ファイルが作成されます。

 作成されたファイルには、「BMICalcViewController.m」で指定した、ローカライズ対象文字列のキーがすべて書き出されています。この内容をコピーして、「ja.lproj」配下と、「en.lproj」配下の「Localizable.strings」を編集すると、非常に便利です。

 ファイルを開き、それぞれ下記のように編集します。

    /* Label for Standard weight. */
    "stdWeight" = "\n\n標準体重\n";
 
    /* Message for result fat. */
    "wei_fat" = "「肥満」です。";
 
    /* Message for result normal. */
    "wei_normal" = "「理想の体重」です。";
 
    /* Message for result thin. */
    "wei_thin" = "「やせ気味」です。";
Localizable.strings(ja)
    /* Label for Standard weight. */
    "stdWeight" = "\n\nStandard Weight\n";
 
    /* Message for result fat. */
    "wei_fat" = "You are Fat.";
 
    /* Message for result normal. */
    "wei_normal" = "You are Normal.";
 
    /* Message for result thin. */
    "wei_thin" = "You are Thin.";
Localizable.strings(en)

 ソースコード中の文字列の国際化については、以上です。

NIBファイルの国際化

 最後に、Interface Builderで作成した「BMICalcViewController.xib」にも国際化を行ってみましょう。

 プロジェクトからいったん「BMICalcViewController.xib」を削除します。「BMICalcViewController.xib」を[control]キーを押しながらマウスでクリックし、[削除]をクリックします。

 削除のダイアログで[参照を削除]をクリックします。

 Finderで 「BMICalcViewController.xib」をプロジェクト直下から、「ja.lproj」フォルダに移動します。

 また、「BMICalcViewController.xib」を「en.lproj」フォルダにもコピーします。

 Xcodeに戻り、[Resources]を[control]キーを押しながらマウスでクリックし、[追加]→[既存のファイル]を選択します。「ja.lproj」配下と、「en.lproj」配下にある「BMICalcViewController.xib」を選択し、[追加]をクリックします。

 [Resources]配下に「BMICalcViewController.xib」が追加され、「InfoPlist.strings」や「Localizable.strings」と同様に、配下に「en」「ja」が表示されるようになります。

 前回作成した「BMICalcViewController.xib」には、ラベルやボタンに日本語テキストが書かれているため、jaの方はこのまま日本語用のリソースとして用います。次に、BMICalcViewController.xib(en)をInterface Builderで開き、下記のようにラベルを英語に書き換えて保存します。

 以上で、NIBファイルの国際化も完了しました。シミュレータを起動し、言語設定を[日本語]から[English]に変えてみます。

 BMI計算アプリの表示が下記のように英語に変更されたでしょうか。

 なお、上記手順で国際化がうまく反映されない場合は、一度[ビルド]→[クリーニング]を実行し、その後再び[ビルドと実行]を試すと正しく反映される場合があります。

 BMI計算アプリの国際化についての説明は以上です。

 ホームアイコンと起動画像を設定し、国際化も行ってBMI計算アプリもiPhoneアプリとしての格好が付いてきました。ここから先は各自がよりユーザーが使いやすいアプリとなるように改良を施してみるとよいでしょう。

Copyright © ITmedia, Inc. All Rights Reserved.

編集部からのお知らせ

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。