LocalizeMe(2)
2012. 03. 13
3)viewDidLoadメソッド
viewDidLoadメソッドでは、現在設定されている言語環境を取得してラベルに表示すると共に、ローカライズ文字列によるラベルの表示を行っています。
最初にcurrentLocaleメソッドで、現在の言語環境設定をキャッシュしたオブジェクトlocaleを取得します。
そしてdisplayNameForKey:value:メソッドで言語設定を文字列として出力します。
第一引数keyはどのような種類の値を取得するかを示すキーで、ここではロケール識別子のキーNSLocaleIdentifierを指定しています。
第二引数valueは値の取得対象となるオブジェクトで、ここではlocaleIdentifierメソッドで現在のロケール識別子を指定しています。
分かり易く言うと、
・レシーバ:出力される文字列の表記言語
・key:出力する内容(ロケール識別子の場合は『言語+地域』)
・value:出力する対象となるオブジェクト
となり、『現在設定されている言語環境』を『その言語』で文字列としているということになります。
生成した文字列は、ラベルlocaleLabelにtextプロパティで設定し表示します。
ローカライズ文字列はNSLocalizedStringメソッドで設定します。
第一引数はローカライズする文字列、第二引数は後述するローカライズ用文字列ファイルにおけるコメントが指定されています。
・currentLocale
+ (id)currentLocale
現在のユーザのために論理ロケールを返します。
ロケールは、システム環境設定でユーザが指定した任意のカスタム設定の上書きを含めた、現在のユーザが選択したシステムロケールの設定によって形成されています。
このメソッドは保持されたキャッシュオブジェクトを返します。
このロケールから取得した設定は、貴方の操作に一貫性を持たせるため、システム環境設定が変更されても変更されません。
通常は返されたオブジェクトでいくつかの操作を実行してから処理を行います。
また、返されたオブジェクトがキャッシュされている可能性があるので、無期限に保持する必要はありません。
autoupdatingCurrentLocaleの対象となっています。
・displayNameForKey:value:
- (NSString *)displayNameForKey:(id)key value:(id)value
指定された値の表示名を返します。
全てのロケールのプロパティキーが表示名の値での値を持っているわけではありません。
下記の例で示すように、他のロケールの言語にあるロケールの名前の取得にNSLocaleIdentifierキーを使用することができます。
最初はfr_FRロケールを使用します。
返される値は次のようになります。
次にen_GB localeロケールを使用した例を示します。
返される値は次のようになります。
key:ロケールのプロパティキーの値を指定します。(『定数』参照)
value:キーの値を指定します。
・NSLocale Component Keys
以下の定数はobjectForKey:でロケールの要素の取得に使用するキーを指定します。
NSString * const NSLocaleIdentifier;
NSString * const NSLocaleLanguageCode;
NSString * const NSLocaleCountryCode;
NSString * const NSLocaleScriptCode;
NSString * const NSLocaleVariantCode;
NSString * const NSLocaleExemplarCharacterSet;
NSString * const NSLocaleCalendar;
NSString * const NSLocaleCollationIdentifier;
NSString * const NSLocaleUsesMetricSystem;
NSString * const NSLocaleMeasurementSystem;
NSString * const NSLocaleDecimalSeparator;
NSString * const NSLocaleGroupingSeparator;
NSString * const NSLocaleCurrencySymbol;
NSString * const NSLocaleCurrencyCode;
NSString * const NSLocaleCollatorIdentifier;
NSString * const NSLocaleQuotationBeginDelimiterKey;
NSString * const NSLocaleQuotationEndDelimiterKey;
NSString * const NSLocaleAlternateQuotationBeginDelimiterKey;
NSString * const NSLocaleAlternateQuotationEndDelimiterKey;
NSLocaleIdentifier
ロケール識別子のキーです。
対応する値はNSStringオブジェクトです。
値の例:『es_ES_PREEURO』
NSLocaleLanguageCode
ロケールの言語コードのキーです。
対応する値はNSStringオブジェクトです。
値の例:『es』
NSLocaleCountryCode
ロケールの国コードのキーです。
対応する値はNSStringオブジェクトです。
値の例:『ES』
NSLocaleScriptCode
ロケールのスクリプトコードのキーです。
対応する値はNSStringオブジェクトです。
NSLocaleVariantCode
ロケールの別コードのキーです。
対応する値はNSStringオブジェクトです。
値の例:『PREEURO』
NSLocaleExemplarCharacterSet
ロケールに設定された見本文字セットのキーです。
対応する値はNSCharacterSetオブジェクトです。
NSLocaleCalendar
ロケールに関連付けられたカレンダーのキーです。
対応する値はNSCalendarオブジェクトです。
NSLocaleCollationIdentifier
ロケールに関連付けられた照合用のキーです。
対応する値はNSStringオブジェクトです。
NSLocaleUsesMetricSystem
ロケールがメートル法を使用するかどうかを示すフラグのキーです。
対応する値はブール型のNSNumberオブジェクトです。
値がNOの場合、通常はアメリカの測定単位(例えば法定マイルなど)を用いることができます。
NSLocaleMeasurementSystem
ロケールに関連付けられた測定システムのキーです。
対応する値は『Metric』や『U.S.』などのロケールによって使用される測定システムの説明を含むNSStringオブジェクトです。
NSLocaleDecimalSeparator
ロケールに関連付けられた小数点文字のキーです。
対応する値はNSStringオブジェクトです。
NSLocaleGroupingSeparator
ロケールに関連付けられた桁区切り文字のキーです。
対応する値はNSStringオブジェクトです。
NSLocaleCurrencySymbol
ロケールに関連付けられた通貨記号のキーです。
対応する値はNSStringオブジェクトです。
NSLocaleCurrencyCode
ロケールに関連付けられた通貨コードのキーです。
対応する値はNSStringオブジェクトです。
NSLocaleCollatorIdentifier
ロケールの照合識別子のキーです。
対応する値はNSStringオブジェクトです。
不明の場合はnilを返します。
NSLocaleQuotationBeginDelimiterKey
ロケールに関連付けられた開始引用符のキーです。
対応する値はNSStringオブジェクトです。
NSLocaleQuotationEndDelimiterKey
ロケールに関連付けられた終了引用符のキーです。
対応する値はNSStringオブジェクトです。
NSLocaleAlternateQuotationBeginDelimiterKey
ロケールに関連付けられた代替開始引用符のキーです。
いくつかのロケールでは、引用符がネスト(入れ子)されている時に代替引用符になります。
例えばNSLocaleQuotationBeginDelimiterKeyの後にNSLocaleAlternateQuotationBeginDelimiterKeyなどとなります。
対応する値はNSStringオブジェクトです。
NSLocaleAlternateQuotationEndDelimiterKey
ロケールに関連付けられた代替終了引用符のキーです。
いくつかのロケールでは、引用符がネスト(入れ子)されている時に代替引用符になります。
例えばNSLocaleQuotationEndDelimiterKeyの後にNSLocaleAlternateQuotationEndDelimiterKeyなどとなります。
対応する値はNSStringオブジェクトです。
・localeIdentifier
- (NSString *)localeIdentifier
レシーバの識別子を返します。
これはNSLocaleが正規化する可能性があるので、ロケールが生成した文字列と同じ文字列であるとは限りません。
キーNSLocaleIdentifierでobjectForKey:に送信するのと同等です。
・NSLocalizedString
NSString *NSLocalizedString(NSString *key, NSString *comment)
文字列のローカライズバージョンを返します。
戻り値はメインバンドル上でnilテーブルでlocalizedStringForKey:value:table:を呼び出した結果です。
\\Uxxxxを使用してキーにUnicode文字列を指定することができます。
genstringsユーティリティの-uオプションを参照してください。
詳細についてはNSBundleを参照してください。
特別な考慮事項
Mac OS X v10.4以前では、genstringsユーティリティによって正確な構文解析を保証するために、keyパラメータにhigh-ASCII文字を含めることはできません。
4)shouldAutorotateToInterfaceOrientation:メソッド
shouldAutorotateToInterfaceOrientation:のコメントアウトを解除してデフォルトのまま実装しています。
5)viewDidUnloadメソッド
viewDidUnloadに6つのプロパティの所有権放棄を追加しています。
6)deallocメソッド
deallocに6つのプロパティの解放を追加しています。
●実行結果
現状で『ビルドと実行』を行うと下図のようになります。

デフォルトの英語(米国)の状態は正しく表示されます。
ここで『Language(言語)』を『Francais(フランス語)』、『Region Format(地域)』を『France(フランス)』と設定してみます。

すると、nibファイルやラベルの文字列、そしてアプリケーションのタイトルはまだフランス語用にローカライズしていませんので、左右5つずつのラベルや国旗はそのままですが、言語環境設定を取得して表示するビュー上方のラベルだけは対応して変化することが分かります。

これから言語環境設定のラベル以外のローカライズを行います。
●nibファイルのローカライズ
nibファイルLocalizeMeViewController.xibをローカライズし、ビュー左側の5つのラベルと下方の国旗の画像をフランス語に対応させます。
Xcodeの『グループとファイル』ペインの『Resources』下にあるLocalizeMeViewController.xibファイルを右クリックし、『情報を見る』を選択します。

下方にある『ファイルをローカライズ可能にする』ボタンをクリックします。

するとタブが『一般』から『ターゲット』に移ると共に、LocalizeMeViewController.xibが階層化され、下に『English』と追加されます。

これにより英語版のnibファイルが生成されたことになります。
この『English』という名前は自動的に決定される物で、LocalizeMe-Info.plistの『Localization native development region』の値を『en』としても自動生成される名称は変えられず、情報ウィンドウの一般タブにある『ローカリゼーション』で名称変更しようとしても強制的に『English』に戻され、またLocalizeMeViewController.xib下の『English』を変更することができないという頑固な仕様になっています。

『iOSアプリケーションプログラミングガイド』の『アプリケーションバンドル(p.31)』の『ローカライズ済みリソースを置くサブディレクトリ(p.33)』などで示されているように、サブフォルダ名は言語名(または言語環境(言語+地域)名)である必要があると示されているのに(EnglishやFrenchでも動作するとは言え)何故このような仕様だったのかは謎です。
現行のXcode4では『en』で自動生成されるようになったらしいので不要な話になってしまいますが、フランス語用のローカリゼーションを追加するついでに、English.lprojを削除してen.lprojに差し替えます。
まず情報ウィンドウの『一般』タブの下方にある『ローカリゼーションを追加』ボタンをクリックします。
『新しいローカリゼーションの名前を入力』と出てきますが、ドロップダウンメニューを利用せずに、手動入力で『en』と入力して『追加』ボタンをクリックし、同様にフランス語用のローカリゼーション『fr』も追加します。

ローカリゼーションは個別に削除することができませんので、XcodeのLocalizeMeViewController.xib下にある『English』を右クリックし、『削除』→『一緒にゴミ箱に入れる』を選択します。

これでXcode上では『English』ローカリゼーションは消えていますが、LocalizeMeプロジェクトのEnglish.lprojフォルダ内のLocalizeMeViewController.xibファイルが削除されただけでEnglish.lprojフォルダ自体は残ります。

ここでEnglish.lprojフォルダも削除したいところですが、後で国旗の画像ファイルflag.pngなどをローカライズする際にまた自動生成されてしまうので、全てのファイルのローカライズが済んでから削除することにします。
さて、nibファイルLocalizeMeViewController.xibをローカライズしたことで、en.lprojフォルダとfr.lrojフォルダ下にはそれぞれLocalizeMeViewController.xibが存在しており、現状では同じ内容(英語版)ですので、フランス語版を修正します。
XcodeのLocalizeMeViewController.xib下にある『fr』をダブルクリックして、Interface Builderで開きます。
そして左側の5つのラベルのText(One、Two、Three、Four、Five)をフランス語(Un、Deux、Trois、Quatre、Cinq)に変更し、保存します。

次に国旗の画像ファイルflag.pngをローカライズします。
nibファイルの場合と同様に、XcodeのResources下にあるflag.pngを右クリックし『情報を見る』で情報ウィンドウを開き、『一般』タブで『ファイルをローカライズ可能にする』ボタンをクリック、『ローカリゼーションを追加』でenとfrを追加、Xcodeに戻りflag.png下のEnglishを削除します。

現状ではfr.lprojフォルダ下のflag.pngファイルはコピーされた米国旗のままですので、iOS 3.x版のサンプルコードの『17 LocalizeMe』の『fr.lproj』フォルダ内にあるflag.pngファイルを自身のLocalizeMeプロジェクトのフォルダ下にある『fr.lproj』フォルダに上書きコピーします。
そしてXcodeに戻り、『ビルド』メニューの『すべてのターゲットをクリーニング』を行い、一度Xcodeを閉じて再度開くとフランス語版のflag.pngが差し替わります。

実行すると下図のようになります。

参考文献
・iOSアプリケーションプログラミングガイド
・NSLocale Class Reference
・Foundation Functions Reference
viewDidLoadメソッドでは、現在設定されている言語環境を取得してラベルに表示すると共に、ローカライズ文字列によるラベルの表示を行っています。
最初にcurrentLocaleメソッドで、現在の言語環境設定をキャッシュしたオブジェクトlocaleを取得します。
そしてdisplayNameForKey:value:メソッドで言語設定を文字列として出力します。
第一引数keyはどのような種類の値を取得するかを示すキーで、ここではロケール識別子のキーNSLocaleIdentifierを指定しています。
第二引数valueは値の取得対象となるオブジェクトで、ここではlocaleIdentifierメソッドで現在のロケール識別子を指定しています。
分かり易く言うと、
・レシーバ:出力される文字列の表記言語
・key:出力する内容(ロケール識別子の場合は『言語+地域』)
・value:出力する対象となるオブジェクト
となり、『現在設定されている言語環境』を『その言語』で文字列としているということになります。
生成した文字列は、ラベルlocaleLabelにtextプロパティで設定し表示します。
ローカライズ文字列はNSLocalizedStringメソッドで設定します。
第一引数はローカライズする文字列、第二引数は後述するローカライズ用文字列ファイルにおけるコメントが指定されています。
・currentLocale
+ (id)currentLocale
現在のユーザのために論理ロケールを返します。
ロケールは、システム環境設定でユーザが指定した任意のカスタム設定の上書きを含めた、現在のユーザが選択したシステムロケールの設定によって形成されています。
このメソッドは保持されたキャッシュオブジェクトを返します。
このロケールから取得した設定は、貴方の操作に一貫性を持たせるため、システム環境設定が変更されても変更されません。
通常は返されたオブジェクトでいくつかの操作を実行してから処理を行います。
また、返されたオブジェクトがキャッシュされている可能性があるので、無期限に保持する必要はありません。
autoupdatingCurrentLocaleの対象となっています。
・displayNameForKey:value:
- (NSString *)displayNameForKey:(id)key value:(id)value
指定された値の表示名を返します。
全てのロケールのプロパティキーが表示名の値での値を持っているわけではありません。
下記の例で示すように、他のロケールの言語にあるロケールの名前の取得にNSLocaleIdentifierキーを使用することができます。
最初はfr_FRロケールを使用します。
NSLocale *frLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"] autorelease];
NSString *displayNameString = [frLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"];
NSLog(@"displayNameString fr_FR: %@", displayNameString);
displayNameString = [frLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"];
NSLog(@"displayNameString en_US: %@", displayNameString);
NSString *displayNameString = [frLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"];
NSLog(@"displayNameString fr_FR: %@", displayNameString);
displayNameString = [frLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"];
NSLog(@"displayNameString en_US: %@", displayNameString);
返される値は次のようになります。
displayNameString fr_FR: francais (France)
displayNameString en_US: anglais (Etats-Unis)
displayNameString en_US: anglais (Etats-Unis)
次にen_GB localeロケールを使用した例を示します。
NSLocale *gbLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"] autorelease];
displayNameString = [gbLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"];
NSLog(@"displayNameString fr_FR: %@", displayNameString);
displayNameString = [gbLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"];
NSLog(@"displayNameString en_US: %@", displayNameString);
displayNameString = [gbLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"];
NSLog(@"displayNameString fr_FR: %@", displayNameString);
displayNameString = [gbLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"];
NSLog(@"displayNameString en_US: %@", displayNameString);
返される値は次のようになります。
displayNameString fr_FR: French (France)
displayNameString en_US: English (United States)
displayNameString en_US: English (United States)
key:ロケールのプロパティキーの値を指定します。(『定数』参照)
value:キーの値を指定します。
・NSLocale Component Keys
以下の定数はobjectForKey:でロケールの要素の取得に使用するキーを指定します。
NSString * const NSLocaleIdentifier;
NSString * const NSLocaleLanguageCode;
NSString * const NSLocaleCountryCode;
NSString * const NSLocaleScriptCode;
NSString * const NSLocaleVariantCode;
NSString * const NSLocaleExemplarCharacterSet;
NSString * const NSLocaleCalendar;
NSString * const NSLocaleCollationIdentifier;
NSString * const NSLocaleUsesMetricSystem;
NSString * const NSLocaleMeasurementSystem;
NSString * const NSLocaleDecimalSeparator;
NSString * const NSLocaleGroupingSeparator;
NSString * const NSLocaleCurrencySymbol;
NSString * const NSLocaleCurrencyCode;
NSString * const NSLocaleCollatorIdentifier;
NSString * const NSLocaleQuotationBeginDelimiterKey;
NSString * const NSLocaleQuotationEndDelimiterKey;
NSString * const NSLocaleAlternateQuotationBeginDelimiterKey;
NSString * const NSLocaleAlternateQuotationEndDelimiterKey;
NSLocaleIdentifier
ロケール識別子のキーです。
対応する値はNSStringオブジェクトです。
値の例:『es_ES_PREEURO』
NSLocaleLanguageCode
ロケールの言語コードのキーです。
対応する値はNSStringオブジェクトです。
値の例:『es』
NSLocaleCountryCode
ロケールの国コードのキーです。
対応する値はNSStringオブジェクトです。
値の例:『ES』
NSLocaleScriptCode
ロケールのスクリプトコードのキーです。
対応する値はNSStringオブジェクトです。
NSLocaleVariantCode
ロケールの別コードのキーです。
対応する値はNSStringオブジェクトです。
値の例:『PREEURO』
NSLocaleExemplarCharacterSet
ロケールに設定された見本文字セットのキーです。
対応する値はNSCharacterSetオブジェクトです。
NSLocaleCalendar
ロケールに関連付けられたカレンダーのキーです。
対応する値はNSCalendarオブジェクトです。
NSLocaleCollationIdentifier
ロケールに関連付けられた照合用のキーです。
対応する値はNSStringオブジェクトです。
NSLocaleUsesMetricSystem
ロケールがメートル法を使用するかどうかを示すフラグのキーです。
対応する値はブール型のNSNumberオブジェクトです。
値がNOの場合、通常はアメリカの測定単位(例えば法定マイルなど)を用いることができます。
NSLocaleMeasurementSystem
ロケールに関連付けられた測定システムのキーです。
対応する値は『Metric』や『U.S.』などのロケールによって使用される測定システムの説明を含むNSStringオブジェクトです。
NSLocaleDecimalSeparator
ロケールに関連付けられた小数点文字のキーです。
対応する値はNSStringオブジェクトです。
NSLocaleGroupingSeparator
ロケールに関連付けられた桁区切り文字のキーです。
対応する値はNSStringオブジェクトです。
NSLocaleCurrencySymbol
ロケールに関連付けられた通貨記号のキーです。
対応する値はNSStringオブジェクトです。
NSLocaleCurrencyCode
ロケールに関連付けられた通貨コードのキーです。
対応する値はNSStringオブジェクトです。
NSLocaleCollatorIdentifier
ロケールの照合識別子のキーです。
対応する値はNSStringオブジェクトです。
不明の場合はnilを返します。
NSLocaleQuotationBeginDelimiterKey
ロケールに関連付けられた開始引用符のキーです。
対応する値はNSStringオブジェクトです。
NSLocaleQuotationEndDelimiterKey
ロケールに関連付けられた終了引用符のキーです。
対応する値はNSStringオブジェクトです。
NSLocaleAlternateQuotationBeginDelimiterKey
ロケールに関連付けられた代替開始引用符のキーです。
いくつかのロケールでは、引用符がネスト(入れ子)されている時に代替引用符になります。
例えばNSLocaleQuotationBeginDelimiterKeyの後にNSLocaleAlternateQuotationBeginDelimiterKeyなどとなります。
対応する値はNSStringオブジェクトです。
NSLocaleAlternateQuotationEndDelimiterKey
ロケールに関連付けられた代替終了引用符のキーです。
いくつかのロケールでは、引用符がネスト(入れ子)されている時に代替引用符になります。
例えばNSLocaleQuotationEndDelimiterKeyの後にNSLocaleAlternateQuotationEndDelimiterKeyなどとなります。
対応する値はNSStringオブジェクトです。
・localeIdentifier
- (NSString *)localeIdentifier
レシーバの識別子を返します。
これはNSLocaleが正規化する可能性があるので、ロケールが生成した文字列と同じ文字列であるとは限りません。
キーNSLocaleIdentifierでobjectForKey:に送信するのと同等です。
・NSLocalizedString
NSString *NSLocalizedString(NSString *key, NSString *comment)
文字列のローカライズバージョンを返します。
戻り値はメインバンドル上でnilテーブルでlocalizedStringForKey:value:table:を呼び出した結果です。
\\Uxxxxを使用してキーにUnicode文字列を指定することができます。
genstringsユーティリティの-uオプションを参照してください。
詳細についてはNSBundleを参照してください。
特別な考慮事項
Mac OS X v10.4以前では、genstringsユーティリティによって正確な構文解析を保証するために、keyパラメータにhigh-ASCII文字を含めることはできません。
4)shouldAutorotateToInterfaceOrientation:メソッド
shouldAutorotateToInterfaceOrientation:のコメントアウトを解除してデフォルトのまま実装しています。
5)viewDidUnloadメソッド
viewDidUnloadに6つのプロパティの所有権放棄を追加しています。
6)deallocメソッド
deallocに6つのプロパティの解放を追加しています。
●実行結果
現状で『ビルドと実行』を行うと下図のようになります。

デフォルトの英語(米国)の状態は正しく表示されます。
ここで『Language(言語)』を『Francais(フランス語)』、『Region Format(地域)』を『France(フランス)』と設定してみます。

すると、nibファイルやラベルの文字列、そしてアプリケーションのタイトルはまだフランス語用にローカライズしていませんので、左右5つずつのラベルや国旗はそのままですが、言語環境設定を取得して表示するビュー上方のラベルだけは対応して変化することが分かります。

これから言語環境設定のラベル以外のローカライズを行います。
●nibファイルのローカライズ
nibファイルLocalizeMeViewController.xibをローカライズし、ビュー左側の5つのラベルと下方の国旗の画像をフランス語に対応させます。
Xcodeの『グループとファイル』ペインの『Resources』下にあるLocalizeMeViewController.xibファイルを右クリックし、『情報を見る』を選択します。

下方にある『ファイルをローカライズ可能にする』ボタンをクリックします。

するとタブが『一般』から『ターゲット』に移ると共に、LocalizeMeViewController.xibが階層化され、下に『English』と追加されます。

これにより英語版のnibファイルが生成されたことになります。
この『English』という名前は自動的に決定される物で、LocalizeMe-Info.plistの『Localization native development region』の値を『en』としても自動生成される名称は変えられず、情報ウィンドウの一般タブにある『ローカリゼーション』で名称変更しようとしても強制的に『English』に戻され、またLocalizeMeViewController.xib下の『English』を変更することができないという頑固な仕様になっています。

『iOSアプリケーションプログラミングガイド』の『アプリケーションバンドル(p.31)』の『ローカライズ済みリソースを置くサブディレクトリ(p.33)』などで示されているように、サブフォルダ名は言語名(または言語環境(言語+地域)名)である必要があると示されているのに(EnglishやFrenchでも動作するとは言え)何故このような仕様だったのかは謎です。
現行のXcode4では『en』で自動生成されるようになったらしいので不要な話になってしまいますが、フランス語用のローカリゼーションを追加するついでに、English.lprojを削除してen.lprojに差し替えます。
まず情報ウィンドウの『一般』タブの下方にある『ローカリゼーションを追加』ボタンをクリックします。
『新しいローカリゼーションの名前を入力』と出てきますが、ドロップダウンメニューを利用せずに、手動入力で『en』と入力して『追加』ボタンをクリックし、同様にフランス語用のローカリゼーション『fr』も追加します。

ローカリゼーションは個別に削除することができませんので、XcodeのLocalizeMeViewController.xib下にある『English』を右クリックし、『削除』→『一緒にゴミ箱に入れる』を選択します。

これでXcode上では『English』ローカリゼーションは消えていますが、LocalizeMeプロジェクトのEnglish.lprojフォルダ内のLocalizeMeViewController.xibファイルが削除されただけでEnglish.lprojフォルダ自体は残ります。

ここでEnglish.lprojフォルダも削除したいところですが、後で国旗の画像ファイルflag.pngなどをローカライズする際にまた自動生成されてしまうので、全てのファイルのローカライズが済んでから削除することにします。
さて、nibファイルLocalizeMeViewController.xibをローカライズしたことで、en.lprojフォルダとfr.lrojフォルダ下にはそれぞれLocalizeMeViewController.xibが存在しており、現状では同じ内容(英語版)ですので、フランス語版を修正します。
XcodeのLocalizeMeViewController.xib下にある『fr』をダブルクリックして、Interface Builderで開きます。
そして左側の5つのラベルのText(One、Two、Three、Four、Five)をフランス語(Un、Deux、Trois、Quatre、Cinq)に変更し、保存します。

次に国旗の画像ファイルflag.pngをローカライズします。
nibファイルの場合と同様に、XcodeのResources下にあるflag.pngを右クリックし『情報を見る』で情報ウィンドウを開き、『一般』タブで『ファイルをローカライズ可能にする』ボタンをクリック、『ローカリゼーションを追加』でenとfrを追加、Xcodeに戻りflag.png下のEnglishを削除します。

現状ではfr.lprojフォルダ下のflag.pngファイルはコピーされた米国旗のままですので、iOS 3.x版のサンプルコードの『17 LocalizeMe』の『fr.lproj』フォルダ内にあるflag.pngファイルを自身のLocalizeMeプロジェクトのフォルダ下にある『fr.lproj』フォルダに上書きコピーします。
そしてXcodeに戻り、『ビルド』メニューの『すべてのターゲットをクリーニング』を行い、一度Xcodeを閉じて再度開くとフランス語版のflag.pngが差し替わります。

実行すると下図のようになります。

参考文献
・iOSアプリケーションプログラミングガイド
・NSLocale Class Reference
・Foundation Functions Reference
![]() | はじめてのiPhone3プログラミング (2009/12/17) Dave Mark、Jeff LaMarche 他 商品詳細を見る |
![]() | Beginning Ios 6 Development: Exploring the Ios Sdk (2012/12/26) David Mark、Jack Nutting 他 商品詳細を見る |