通常は端末設定の言語で表示言語が決まっていきますが、アプリ内の文言を端末設定とは違う言語で表示したいというシチュエーションもあるかと思います。今回は、その表示言語をアプリ内から切り替える方法をご紹介します。
端末設定に従う場合
通常通り Localizable.strings ファイルを作成します。ここでは例として日本語と英語の二種類を作ってみます。
- Localizable.strings (jp)
/* comment */ "hello" = "こんにちは";
/* comment */ "hello" = "hello";
この Localizable.strings ファイルを使うためには、通常
NSString *str = @"hello";
としていたところを
NSString *str = NSLocalizedString(@"hello", nil);
のようにします。
NSLocalizedString の第一引数は出力したい文字列のキーで、第二引数はコメントになります。このようにすることで、端末の言語設定が日本語であれば「こんにちは」、英語であれば「 hello 」が得られます。
端末設定とは違う言語で表示したい場合
アプリ側でユーザーが言語を切り替えたいというような場合は以下のようにすることで実現できます。
- (NSString *)localizedStringForKey:(NSString *)aKey { NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings" inDirectory:nil forLocalization:@"en"]; NSBundle *currentLangBundlePath = [[[NSBundle alloc] initWithPath:[bundlePath stringByDeletingLastPathComponent]] autorelease]; return NSLocalizedStringFromTableInBundle(aKey, nil, currentLangBundlePath, nil); }
@”en” となっているところが言語指定部分になります。
目当ての Localizable.strings ファイルのバンドルパスを取得して、NSLocalizedStringFromTableInBundle を使って文言を取得しています。このメソッドを NSLocalizedString の代わりに使えば、端末が日本語環境であっても Localisable.strings (en) でローカライズされた文言を得られます。
今回はわかりやすくするために @”en” はメソッドに組み込みましたが、実際に複数の言語を切り替えるときは引数で持つなどして切り替えを容易にするとよいと思います。
※ 注: システムが表示する文言は端末の言語設定に従います。