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ロケールを使用します。

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);

返される値は次のようになります。

displayNameString fr_FR: francais (France)
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 fr_FR: French (France)
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が正規化する可能性があるので、ロケールが生成した文字列と同じ文字列であるとは限りません。

キーNSLocaleIdentifierobjectForKey:に送信するのと同等です。

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つのプロパティの解放を追加しています。


●実行結果

現状で『ビルドと実行』を行うと下図のようになります。

7924

デフォルトの英語(米国)の状態は正しく表示されます。

ここで『Language(言語)』を『Francais(フランス語)』、『Region Format(地域)』を『France(フランス)』と設定してみます。

7926

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

7925

これから言語環境設定のラベル以外のローカライズを行います。


●nibファイルのローカライズ

nibファイルLocalizeMeViewController.xibをローカライズし、ビュー左側の5つのラベルと下方の国旗の画像をフランス語に対応させます。

Xcodeの『グループとファイル』ペインの『Resources』下にあるLocalizeMeViewController.xibファイルを右クリックし、『情報を見る』を選択します。

7927

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

7928

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

7929

これにより英語版のnibファイルが生成されたことになります。

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

7930

iOSアプリケーションプログラミングガイド』の『アプリケーションバンドル(p.31)』の『ローカライズ済みリソースを置くサブディレクトリ(p.33)』などで示されているように、サブフォルダ名は言語名(または言語環境(言語+地域)名)である必要があると示されているのに(EnglishやFrenchでも動作するとは言え)何故このような仕様だったのかは謎です。

現行のXcode4では『en』で自動生成されるようになったらしいので不要な話になってしまいますが、フランス語用のローカリゼーションを追加するついでに、English.lprojを削除してen.lprojに差し替えます。

まず情報ウィンドウの『一般』タブの下方にある『ローカリゼーションを追加』ボタンをクリックします。

『新しいローカリゼーションの名前を入力』と出てきますが、ドロップダウンメニューを利用せずに、手動入力で『en』と入力して『追加』ボタンをクリックし、同様にフランス語用のローカリゼーション『fr』も追加します。

7931

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

7932

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

7933

ここで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)に変更し、保存します。

7934

次に国旗の画像ファイルflag.pngをローカライズします。

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

7935

現状ではfr.lprojフォルダ下のflag.pngファイルはコピーされた米国旗のままですので、iOS 3.x版のサンプルコードの『17 LocalizeMe』の『fr.lproj』フォルダ内にあるflag.pngファイルを自身のLocalizeMeプロジェクトのフォルダ下にある『fr.lproj』フォルダに上書きコピーします。

そしてXcodeに戻り、『ビルド』メニューの『すべてのターゲットをクリーニング』を行い、一度Xcodeを閉じて再度開くとフランス語版のflag.pngが差し替わります。

7936

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

7937



参考文献

iOSアプリケーションプログラミングガイド

NSLocale Class Reference

Foundation Functions Reference

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る

Beginning Ios 6 Development: Exploring the Ios SdkBeginning Ios 6 Development: Exploring the Ios Sdk
(2012/12/26)
David Mark、Jack Nutting 他

商品詳細を見る






Bose SoundLink around-ear wireless headphones II
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
06 | 2017/07 | 08
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Bose SoundLink around-ear wireless headphones II
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR