iOSで現在のデバイス言語を取得しますか?
-
29-09-2019 - |
質問
デバイスUIが使用している現在の言語を表示したいと思います。どのコードを使用しますか?
私はこれをのようにしたいです NSString
完全に綴られた形式で。 ( @"en_us"ではありません)
編集:運転する人のために、新しいiOSリリースで答えが進化したため、ここにはたくさんの有用なコメントがあります。
解決
提供されるソリューションは、実際にデバイスの現在の領域を返します - 現在選択されている言語ではありません。これらはしばしば同じです。しかし、私が北米にいて、私が自分の言語を日本語に設定した場合、私の地域はまだ英語(米国)になります。現在選択されている言語を取得するために、次のことができます。
NSString * language = [[NSLocale preferredLanguages] firstObject];
これにより、現在選択されている言語の2文字コードが返されます。英語の「en」、「スペイン語」の「es」、ドイツ語の「de」など。その他の例については、このウィキペディアのエントリ(特に639-1列)を参照してください。
次に、2文字のコードを表示したい文字列に変換するという簡単な問題です。したがって、「en」の場合は、「英語」を表示します。
これが、地域と現在選択されている言語を区別しようとしている人に役立つことを願っています。
編集
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];
言語には必要なコンポーネントがあります
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は限られた翻訳セットのみを提供します。優先言語が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
}
これは、優先言語リストが次の場合に機能します。
- アフリカーンス (iOSはアフリカ人に翻訳されていません)
- スペイン語 (デバイス言語)
優先言語リスト 可能です で編集: :settings.app-> general->言語と地域 - >優先言語順序
デバイス言語コードを使用して、それを言語名に変換するよりもできます。次の行は、デバイス言語でデバイス言語を印刷します。たとえば、デバイスがスペイン語に設定されている場合、「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:
メソッド、次に、言語のネイティブ名を与えます。カントリーコードを削除して使用すると、私は発見しました fr
と en
, 、それはまた、ディスプレイ名から国を省略します(少なくともMac OS Xでは、iOSについてはわかりません)。
私は自分のために正しい解決策を見つけようとしました。使用するとき Locale.preferredLanguages.first
アプリ設定から優先言語を返しました。
ユーザーデバイス設定から言語を知りたい場合は、以下の文字列を使用する必要があります。
スウィフト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
}
}
ユーザーデバイスの現在の言語を取得するには、次のITコードを使用します。
NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];
迅速
デバイスの現在の言語を取得します
NSLocale.preferredLanguages()[0] as String
アプリケーション言語を取得するため
NSBundle.mainBundle().preferredLocalizations[0] as NSString
ノート:
それはあなたが与えた言語を取得します cfbundledevelopmentRegion info.plistの
もしも cfbundleallowmixedlocalizations info.plistでtrue cfbundlelocalizations info.plistが返されます
Monotouch C#開発者の使用:使用:
NSLocale.PreferredLanguages.FirstOrDefault() ?? "en"
注:これはiOSの質問であることは知っていますが、私はMonotouch開発者であるため、このページの答えが私を正しい方向に導き、結果を共有していると思いました。
の Swift
:
let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String
スウィフト3
let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)
Simple 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
}
優先言語コード( "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 3.0以下の場合、コードを使用して質問に答えることができます。
let language = Bundle.main.preferredLocalizations.first! as NSString
Swift 4.2およびXcode 10.1で
let language = NSLocale.preferredLanguages[0]
print(language)//en
Appleによると ドキュメンテーション
NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];
2文字の形式。 Appleはを使用します ISO標準ISO-3166.
NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
Swiftの@Amir応答:
// Get language prefered by user
let langageRegion = NSLocale.preferredLanguages().first!
let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
let language = languageDic[NSLocaleLanguageCode]
Swift3の場合:
nslocale.preferredLanguages [0] as string
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;
}
明らかに、たとえば、
[[NSLocale preferredLanguages] objectAtIndex:0]
通常、正常に動作し、現在のデバイス言語を返します。
しかし、場合によっては誤解を招く可能性があります。
この種のコードを使用して、この値を取得したいアプリがすでに言語を変更している場合:
NSString *lg = @"en"; // or anything like @"en", @"fr", etc.
[[NSUserDefaults standardUserDefaults]
setObject:[NSArray arrayWithObjects:lg, nil]
forKey:@"AppleLanguages"]
この場合、[nslocale feliedlanguages 実際に、現在のデバイス言語ではなく、この特定のアプリで優先言語セット(および使用される)を返します!
そして...この場合、実際の現在のデバイス言語を適切に取得する唯一の方法(以前にアプリに設定されていない)は、まずこのようなnsuserdefaultsのキー @"Applelanguages"をクリアすることです。
[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"];
次に、[nslocale PreferredLanguages]が正しい値を返します。
この助けを願っています。
Swift-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)