デバイスのUIが現在使用している言語を表示したいのですが。どのコードを使用しますか?
これを完全なスペル形式のNSString
として欲しいのです。 (@ "en_US"ではありません)
編集:で運転している人のために、答えが新しいiOSのリリースとともに進化してきたので、ここにたくさんの役に立つコメントがあります。
提供されているソリューションは、実際には現在選択されている言語ではなく、デバイスの現在の地域を返します。これらはしばしば全く同じものです。しかし、私が北米にいて、私の言語を日本語に設定した場合、私の地域は依然として英語(アメリカ)です。現在選択されている言語を取得するには、次のようにします。
NSString * language = [[NSLocale preferredLanguages] firstObject];
現在選択されている言語の2文字のコードが返されます。英語の場合は "en"、スペイン語の場合は "es"、ドイツ語の場合は "de"など。その他の例については、このWikipediaのエントリ(特に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's answer を見てください。
選択した回答は現在のデバイス言語を返しますが、アプリで使用されている実際の言語は返しません。ユーザーの優先言語用にアプリでローカライズを提供しない場合は、ユーザーの優先順に並べられた、最初に使用可能なローカライズが使用されます。
ローカライズ内で選択されている現在の言語を見つけるには
[[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];
language = "en-US"
NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];
languageDicに必要なコンポーネントがあります
NSString *countryCode = [languageDic objectForKey:@"kCFLocaleCountryCodeKey"];
countryCode = "US"
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がアプリを翻訳した言語の1つである場合は、それもデバイスの言語になります。 ただし ユーザーが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 - >一般 - >言語と地域 - >優先言語順
その場合は、デバイスの言語コードを使用してそれを言語名に変換することができます。次の行はデバイス言語でデバイス言語を印刷します。たとえば、デバイスがスペイン語に設定されている場合は "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)
}
}
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);
版画:英語、ドイツ語、スウェーデン語
私はこれを使う
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
NSLocale
のdisplayNameForKey:value:
メソッドを使用できます。
// 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:
メソッドに同じロケール識別子を指定した場合は、その言語のネイティブ名が表示されます。国コードを削除してfr
とen
だけを使用すると、表示名から国も除外されることがわかりました(少なくともMac OS Xでは、iOSについては不明です)。
ユーザーのデバイスの現在の言語を取得するには、それが私のために働いた以下のitコードを使用してください。
NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];
私は自分のために正しい解決策を見つけようとしました。私がLocale.preferredLanguages.first
を使うとき、あなたのアプリ設定から優先言語が返されました。
ユーザーのデバイス設定から言語を知りたい場合は、以下の文字列を使用してください。
Swift 3
let currentDeviceLanguage = Locale.current.languageCode
// Will return the optional String
展開して使用するには、以下の行を見てください。
if let currentDeviceLanguage = Locale.current.languageCode {
print("currentLanguage", currentDeviceLanguage)
// For example
if currentDeviceLanguage == "he" {
UIView.appearance().semanticContentAttribute = .forceRightToLeft
} else {
UIView.appearance().semanticContentAttribute = .forceLeftToRight
}
}
現在の端末の言語を取得する
NSLocale.preferredLanguages()[0] as String
アプリケーションの言語を取得する
NSBundle.mainBundle().preferredLocalizations[0] as NSString
注:
Info.plistのCFBundleDevelopmentRegionで与えた言語を取得します
info.plistでCFBundleAllowMixedLocalizationsがtrueの場合、CFBundleLocalizationsの最初の項目info.plistが返される
Swift
内:
let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String
シンプルなSwift 3の機能:
@discardableResult
func getLanguageISO() -> String {
let locale = Locale.current
guard let languageCode = locale.languageCode,
let regionCode = locale.regionCode else {
return "de_DE"
}
return languageCode + "_" + regionCode
}
MonoTouch C#開発者のために使用する:
NSLocale.PreferredLanguages.FirstOrDefault() ?? "en"
注:私はこれがiOSの質問であることを知っていますが、私はMonoTouch開発者であるため、このページの答えは私を正しい方向へ導き、その結果を共有したいと思いました。
Swift 3
let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)
優先言語コード( "en"、 "de"、 "es" ...)、およびローカライズされた優先言語名(現在のロケール用)を探しているなら、これはSwiftの簡単な拡張です。
extension Locale {
static var preferredLanguageIdentifier: String {
let id = Locale.preferredLanguages.first!
let comps = Locale.components(fromIdentifier: id)
return comps.values.first!
}
static var preferredLanguageLocalizedString: String {
let id = Locale.preferredLanguages.first!
return Locale.current.localizedString(forLanguageCode: id)!
}
}
-(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;
}
あなたがここで唯一の言語を手に入れたいのであれば、私の提案した答えは:
NSString *langplusreg = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString * langonly = [[langplusreg componentsSeparatedByString:@"-"]
objectAtIndex:0];
私の場合、私はただロケール言語ではなく、ロケール地域だけを望んでいました。
出力:ロケールの言語が日本語でロケール地域が日本の場合
langplusreg = ja-JP
langonly = ja
Swift 4の回答を更新しました
let language = Bundle.main.preferredLocalizations.first
Swift 4.2とXcode 10.1では
let language = NSLocale.preferredLanguages[0]
print(language)//en
Swift 3.0の場合、以下のコードを使用して質問に回答できます。
let language = Bundle.main.preferredLocalizations.first! as NSString
IOS 9の時点で、国コードなしで言語コードを使いたいだけなら、この種のヘルパー機能が必要になります。言語には国コードが含まれるためです。
// gets the language code without country code in uppercase format, i.e. EN or DE
NSString* GetLanguageCode()
{
static dispatch_once_t onceToken;
static NSString* lang;
dispatch_once(&onceToken, ^
{
lang = [[[NSLocale preferredLanguages] objectAtIndex:0] uppercaseString];
NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"^[A-Za-z]+" options:0 error:nil];
NSTextCheckingResult* match = [regex firstMatchInString:lang options:0 range:NSMakeRange(0, lang.length)];
if (match.range.location != NSNotFound)
{
lang = [lang substringToIndex:match.range.length];
}
});
return lang;
}
2文字フォーマットAppleは ISO標準ISO-3166 を使います。
NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
アップル のドキュメントによると
NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];
Swift 3の場合:
文字列としてのNSLocale.preferredLanguages [0]
明らかに、例えばに頼る解決策は
[[NSLocale preferredLanguages] objectAtIndex:0]
通常はうまく機能し、現在のデバイス言語を返します。
しかし、場合によっては誤解を招く可能性があります。
この値を取得したいアプリがすでに言語を変更している場合は、たとえば次のようなコードになります。
NSString *lg = @"en"; // or anything like @"en", @"fr", etc.
[[NSUserDefaults standardUserDefaults]
setObject:[NSArray arrayWithObjects:lg, nil]
forKey:@"AppleLanguages"]
この場合、[NSLocale preferredLanguages]は実際にはこの特定のアプリで使用されている優先言語セットを返します。現在のデバイス言語ではありません!
そして...この場合、実際に現在のデバイス言語を(そして以前にアプリで設定されたものではなく)正しく取得する唯一の方法は、まず次のようにNSUserDefaultsのキー@ "appleLanguages"をクリアすることです:
[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"];
それから、[NSLocale preferredLanguages]は正しい値を返すようになりました。
この助けを願っています。
スイフト4
// To get device default selected language. It will print like short name of zone. For english, en or spain, es.
let language = Bundle.main.preferredLocalizations.first! as NSString
print("device language",language)
Swiftでの@amirレスポンス:
// Get language prefered by user
let langageRegion = NSLocale.preferredLanguages().first!
let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
let language = languageDic[NSLocaleLanguageCode]