デバイスUIが使用している現在の言語を表示したいと思います。どのコードを使用しますか?
私はこれをNSString
完全に綴られたフォーマットとして欲しい。(@ "en_US"ではありません)
編集:答えは新しいiOSリリースで進化したので、これから進んでいる人たちのために、ここにはたくさんの有用なコメントがあります。
デバイスUIが使用している現在の言語を表示したいと思います。どのコードを使用しますか?
私はこれをNSString
完全に綴られたフォーマットとして欲しい。(@ "en_US"ではありません)
編集:答えは新しいiOSリリースで進化したので、これから進んでいる人たちのために、ここにはたくさんの有用なコメントがあります。
提供されるソリューションは、現在選択されている言語ではなく、デバイスの現在の地域を実際に返します。多くの場合、これらはまったく同じです。ただし、北米にいて、言語を日本語に設定した場合、地域は引き続き英語 (米国) になります。現在選択されている言語を取得するには、次のようにします。
NSString * language = [[NSLocale preferredLanguages] firstObject];
これにより、現在選択されている言語の 2 文字のコードが返されます。英語の場合は「en」、スペイン語の場合は「es」、ドイツ語の場合は「de」などです。その他の例については、このウィキペディアのエントリ (特に、639-1 列) を参照してください。
次に、2 文字のコードを表示したい文字列に変換するのは簡単なことです。なので「en」なら「English」と表示します。
編集
NSLocale.h からヘッダー情報を引用する価値があります。
+ (NSArray *)preferredLanguages NS_AVAILABLE(10_5, 2_0); // note that this list does not indicate what language the app is actually running in; the [NSBundle mainBundle] object determines that at launch and knows that information
アプリ言語に興味がある人は、@mindvision の回答をご覧ください
選択した回答は現在のデバイスの言語を返しますが、アプリで使用されている実際の言語は返しません。アプリでユーザーの優先言語のローカリゼーションを提供しない場合は、ユーザーの優先順序で並べ替えられた、最初に利用可能なローカリゼーションが使用されます。
ローカリゼーション内で選択されている現在の言語を見つけるには、次を使用します
[[NSBundle mainBundle] preferredLocalizations];
例:
NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];
迅速:
let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
iOS 9 のソリューション:
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];
言語 = "en-US"
NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];
languageDic には必要なコンポーネントがあります
NSString *countryCode = [languageDic objectForKey:@"kCFLocaleCountryCodeKey"];
countryCode = "米国"
NSString *languageCode = [languageDic objectForKey:@"kCFLocaleLanguageCodeKey"];
languageCode = "en"
これはおそらくあなたが望むものを与えるでしょう:
NSLocale *locale = [NSLocale currentLocale];
NSString *language = [locale displayNameForKey:NSLocaleIdentifier
value:[locale localeIdentifier]];
言語自体で、言語の名前が表示されます。例えば:
Français (France)
English (United States)
受け入れられた回答と他の回答はすべて、優先言語がデバイスの言語以外の言語になる可能性があることを考慮していません。
デバイス言語は、オペレーティング システム要素と Apple アプリが表示される言語です。
優先言語は、ユーザーがアプリのローカライズを希望する言語です。Apple が提供する翻訳のセットは限られています。優先言語が Apple がアプリを翻訳した言語である場合、それはデバイスの言語にもなります。ただし、Apple が翻訳を提供していない言語をユーザーが希望する場合、デバイスと優先言語は一致しません。デバイスの言語は、優先言語リストの最初の位置にはありません。
次の関数は、優先言語リストを調べて、Apple フレームワークに翻訳があるかどうかを確認します。翻訳される最初の言語は、デバイスの言語です。関数はその言語コードを返します。
func deviceLanguage() -> String? {
let systemBundle: NSBundle = NSBundle(forClass: UIView.self)
let englishLocale: NSLocale = NSLocale(localeIdentifier: "en")
let preferredLanguages: [String] = NSLocale.preferredLanguages()
for language: String in preferredLanguages {
let languageComponents: [String : String] = NSLocale.componentsFromLocaleIdentifier(language)
guard let languageCode: String = languageComponents[NSLocaleLanguageCode] else {
continue
}
// ex: es_MX.lproj, zh_CN.lproj
if let countryCode: String = languageComponents[NSLocaleCountryCode] {
if systemBundle.pathForResource("\(languageCode)_\(countryCode)", ofType: "lproj") != nil {
// returns language and country code because it appears that the actual language is coded within the country code aswell
// for example: zh_CN probably mandarin, zh_HK probably cantonese
return language
}
}
// ex: English.lproj, German.lproj
if let languageName: String = englishLocale.displayNameForKey(NSLocaleIdentifier, value: languageCode) {
if systemBundle.pathForResource(languageName, ofType: "lproj") != nil {
return languageCode
}
}
// ex: pt.lproj, hu.lproj
if systemBundle.pathForResource(languageCode, ofType: "lproj") != nil {
return languageCode
}
}
return nil
}
これは、優先言語リストが次の場合に機能します。
優先言語リストは、 Settings.app -> General -> Language & Region -> Preferred Language Orderで編集できます。
デバイスの言語コードを使用して、それを言語名に翻訳することができます。次の行は、デバイス言語をデバイス言語で出力します。たとえば、デバイスがスペイン語に設定されている場合は「Español」です。
if let deviceLanguageCode: String = deviceLanguage() {
let printOutputLanguageCode: String = deviceLanguageCode
let printOutputLocale: NSLocale = NSLocale(localeIdentifier: printOutputLanguageCode)
if let deviceLanguageName: String = printOutputLocale.displayNameForKey(NSLocaleIdentifier, value: deviceLanguageCode) {
// keep in mind that for some localizations this will print a language and a country
// see deviceLanguage() implementation above
print(deviceLanguageName)
}
}
私はこれを使います
NSArray *arr = [NSLocale preferredLanguages];
for (NSString *lan in arr) {
NSLog(@"%@: %@ %@",lan, [NSLocale canonicalLanguageIdentifierFromString:lan], [[[NSLocale alloc] initWithLocaleIdentifier:lan] displayNameForKey:NSLocaleIdentifier value:lan]);
}
メモリリークを無視します。
結果は
2013-03-02 20:01:57.457 xx[12334:907] zh-Hans: zh-Hans 中文(简体中文)
2013-03-02 20:01:57.460 xx[12334:907] en: en English
2013-03-02 20:01:57.462 xx[12334:907] ja: ja 日本語
2013-03-02 20:01:57.465 xx[12334:907] fr: fr français
2013-03-02 20:01:57.468 xx[12334:907] de: de Deutsch
2013-03-02 20:01:57.472 xx[12334:907] nl: nl Nederlands
2013-03-02 20:01:57.477 xx[12334:907] it: it italiano
2013-03-02 20:01:57.481 xx[12334:907] es: es español
en_USなどの言語コードを英語 (米国)に翻訳する機能は の組み込み機能でNSLocale
ありNSLocale
、言語コードをどこから取得してもかまいません。したがって、受け入れられた回答が示唆するように、独自の翻訳を実装する理由は本当にありません。
// Example code - try changing the language codes and see what happens
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"];
NSString *l1 = [locale displayNameForKey:NSLocaleIdentifier value:@"en"];
NSString *l2 = [locale displayNameForKey:NSLocaleIdentifier value:@"de"];
NSString *l3 = [locale displayNameForKey:NSLocaleIdentifier value:@"sv"];
NSLog(@"%@, %@, %@", l1, l2, l3);
プリント:英語、ドイツ語、スウェーデン語
displayNameForKey:value:
次の方法を使用できますNSLocale
:
// get a French locale instance
NSLocale *frLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"] autorelease];
// use it to get translated display names of fr_FR and en_US
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"]);
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"]);
これは印刷されます:
français (France)
anglais (États-Unis)
initWithLocaleIdentifier:
とメソッドに同じロケール識別子を指定するとdisplayNameForKey:value:
、言語のネイティブ名が表示されます。国コードを削除してandだけを使用するfr
とen
、表示名から国も省略されることがわかりました(少なくとも、Mac OS Xでは、iOSについてはわかりません)。
デバイスの現在の言語を取得するには
NSLocale.preferredLanguages()[0] as String
アプリケーション言語を取得するには
NSBundle.mainBundle().preferredLocalizations[0] as NSString
ノート:
info.plist のCFBundleDevelopmentRegionで指定した言語を取得します
info.plist でCFBundleAllowMixedLocalizationsが true の場合、info.plist の CFBundleLocalizations の最初の項目が返されます
スイフト3
let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)
MonoTouch C# 開発者の場合は、次を使用します。
NSLocale.PreferredLanguages.FirstOrDefault() ?? "en"
注: これが iOS に関する質問であることは知っていますが、私は MonoTouch 開発者であるため、このページの回答が正しい方向に導いてくれたので、結果を共有したいと思いました。
ここで言語のみを取得したい場合は、私の提案する答えです:
NSString *langplusreg = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString * langonly = [[langplusreg componentsSeparatedByString:@"-"]
objectAtIndex:0];
私の場合、ロケール地域ではなくロケール言語のみが必要でした。
出力: ロケール言語が日本語で、ロケール地域が日本の場合:
langplusreg = ja-JP
langonly = 日
-(NSString *)returnPreferredLanguage { //as written text
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
NSArray *preferredLanguages = [defaults objectForKey:@"AppleLanguages"];
NSString *preferredLanguageCode = [preferredLanguages objectAtIndex:0]; //preferred device language code
NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"]; //language name will be in English (or whatever)
NSString *languageName = [enLocale displayNameForKey:NSLocaleIdentifier value:preferredLanguageCode]; //name of language, eg. "French"
return languageName;
}
Swift での @amir 応答:
// Get language prefered by user
let langageRegion = NSLocale.preferredLanguages().first!
let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
let language = languageDic[NSLocaleLanguageCode]
私は実際に元の質問を読み違え、「デバイスUI」ではなく「アプリUI」言語(それは私がグーグルで検索したものです)を求めていると思いましたpreferredLocalizations
。コードを作成する場合は、表示する適切な文字列を取得するための手順がもう 1 つあります。したがって、「デバイス UI」言語は既に回答されていますが、サポートしている UI 言語のうち現在使用されている適切な文字列を表示したい場合、明らかに最も簡単な解決策は次のとおりです。
NSLocalizedString(@"currentLanguage", @"")
UI ローカリゼーションのすべての場所で、表示したい方法で正確に指定しました。たとえば、ファイルのen
バージョンでは次のよう.strings
になります。
"currentLanguage"="English";
あなたが持っているファイルのあなたのfr
バージョンでは:.strings
"currentLanguage"="Francais";
コードなどをいじる必要はありません。独自の文字列を作成して、UI にうまく一致させます。
アップルのドキュメントによると
NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];
スウィフト 3 の場合:
NSLocale.preferredLanguages[0] 文字列として
2 文字形式。Apple は、ISO 標準 ISO-3166を使用しています。
NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
Swiftでは、現在のアプリ言語を取得するためのより簡単な方法があります。
Locale(identifier: Bundle.main.preferredLocalizations[0]).languageCode!
たとえば、次のように切り替えることができます。
let supportUrl: URL = {
switch Locale(identifier: Bundle.main.preferredLocalizations[0]).languageCode {
case "de":
return Constants.supportUrlGerman
default:
return Constants.supportUrlEnglish
}
}
これが役立つことを願っています!