iOSで現在のデバイス言語を取得していますか?


431

デバイスUIが使用している現在の言語を表示したいと思います。どのコードを使用しますか?

私はこれをNSString完全につづった形式で欲しい。(@ "en_US"ではない)

編集:新しいiOSのリリースで答えが進化したため、ここを運転している人のために、ここにはたくさんの役立つコメントがあります。


1
これはに組み込まれていNSLocaleます。私の答えを見てください。
Erik B

15
iOS9のコメント:奇妙な理由で、Appleがによって返される形式を変更したという事実に注意して[NSLocale preferredLanguages]ください。以前はアンダースコア(たとえばen_US)で区切られていましたが、現在はダッシュに変更されています:en-US
ishahak

7
iOS9の詳細:iOS 8.4シミュレーターと9.0シミュレーターで[NSLocale preferredLanguages]を取得することにも矛盾があります。iOS 8.4では「en」、iOS 9.0では「en-US」
Kris Subramanian

このコメントは私を大いに助けてくれました!私はあなたのコメントを見るまで約1時間何がうまくいかないのかと思っていた単純な問題で立ち往生しました。
thandasoru 2015年

3
NSLocaleメソッドを持っているcomponentsFromLocaleIdentifier:し、localeIdentifierFromComponents:これはおそらく、(潜在的に変更可能)フォーマットを処理するための正しい方法です。
ベンジョン2016

回答:


808

提供されるソリューションは、実際にデバイスの現在の地域を返します-現在選択されている言語ではありません。これらはしばしば同じものです。ただし、北米にいて、言語を日本語に設定した場合、私の地域は英語(米国)のままです。現在選択されている言語を取得するには、次のようにします。

NSString * language = [[NSLocale preferredLanguages] firstObject];

これにより、現在選択されている言語の2文字のコードが返されます。英語の "en"、スペイン語の "es"、ドイツ語の "de"など。他の例については、次のWikipediaのエントリ(特に639-1列)を参照してください。

ISO 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の答えを見てみましょう


2
まさに私が探していたもの。地域が言語と同じではないという同じ問題がありました。
Jasarien 2011

12
悪い答え:isoのコードではない中国語のzh-Hansを返します。
シリルチャンピア2012

2
最初の2文字は国を示し、ダッシュの後の部分は地域を示し、残りはそれをさらに絞り込むためのものです(地方の方言など)。zhは中国語のisoコードとしてリストされます。私のような特定の言語を探している人は、IANAレジストリを
Xono

3
zh-Hansが唯一の例外であるか、ISO 639-1標準とは異なる他の言語コードがありますか?
MPaulo 2014年

57
警告:iOS 9では、NSLocale preferredLanguages変更されたの戻り値。:あなたが取得されています前に、 "エン"だけで、iOSの9で、あなたは"EN-US"または"EN-JP"などのリファレンスを取得する場合は happyteamlabs.com/blog/...
DJのS

281

選択した回答は現在のデバイス言語を返しますが、アプリで使用されている実際の言語は返しません。アプリでユーザーの優先言語のローカリゼーションを提供しない場合、ユーザーの優先順序で並べられた、利用可能な最初のローカリゼーションが使用されます。

ローカリゼーション内で選択されている現在の言語を見つけるには、

[[NSBundle mainBundle] preferredLocalizations];

例:

NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];

迅速:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString

すばらしい、これも私が興味を持っていたものです。テストされ、正しく動作します!
スマイリーボー2013

5
完璧!これにより、アプリがサポートする言語のみでローカライズされたリモートリソースパスを適切な順序で構築できます。
Yevhen Dubinin

この後に完全な言語名を取得したい場合はどうなりますか?
Shabarinath Pabba 2017

preferredLocalizationから完全な言語名を取得する場合は、[[NSLocale alloc] initWithLocaleIdentifier:language](上記から)を使用できます。次に、ロケールがあり、displayNameForKeyを呼び出すことができます。
Vanessa Forney

87

iOS 9のソリューション:

NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];

言語= "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDicには必要なコンポーネントがあります

NSString *countryCode = [languageDic objectForKey:@"kCFLocaleCountryCodeKey"];

countryCode = "US"

NSString *languageCode = [languageDic objectForKey:@"kCFLocaleLanguageCodeKey"];

languageCode = "en"


5
kCFLocaleLanguageCodeKeyは、独自の文字列を作成する代わりに使用できる定義済みの定数です。
SNyamathi 2016

1
NSLocaleLanguageCode = @ "kCFLocaleCountryCodeKey"
カラス

@ "kCFLocaleCountryCodeKey"、@ "kCFLocaleLanguageCodeKey"にNSLocaleCountryCodeとNSLocaleLanguageCodeを使用してください
crow

65

これはおそらくあなたが望むものを与えるでしょう:

NSLocale *locale = [NSLocale currentLocale];

NSString *language = [locale displayNameForKey:NSLocaleIdentifier 
                                         value:[locale localeIdentifier]];

言語自体の中に、言語の名前が表示されます。例えば:

Français (France)
English (United States)

31
間違った答え:これは言語ではなくロケールを返します。これは異なる場合があります...
cyrilchampier 2012

4
これは間違いです。たとえば、電話の設定で言語を英語に設定し、地域の形式をドイツ語、ドイツ語と言う場合、上記の例は「ドイツ語」を返します。それでも電話の言語は英語に設定されています。
jake_hetfield 2013年

2
これはまったく間違っていません。ロケールには、言語と地域の両方の情報が含まれています。したがって、@ jake_hetfieldの例では、「ドイツ語」は返されず、「英語(ドイツ語)」が返されます。これとドリームラボの答えを組み合わせると、正しい答えになるはずです。
SeanR

36

警告受け入れられた、および他のすべての回答は、優先言語がデバイス言語以外の言語である可能性があることを考慮していません

デバイスの言語、オペレーティングシステムの構成要素と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
}

これは、優先言語リストが次の場合に機能します。

  1. アフリカーンス語 (iOSは翻訳されていません)
  2. スペイン語(デバイス言語)

優先言語リストができますで編集 - >一般- >言語と地域- >優先言語順序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)
    }
} 

私の理解では、バンドルインスタンスを初期化NSBundle(forClass: UIView.self)することで、特定のビューに最も具体的な言語を提供しようとしています。しかし、これを使用して、特定のクラスの言語が返されないという問題に遭遇しました。初期化をに変更しNSBundle.mainBundle()、期待される言語コードを返しました。
パルミ

明確化:とのバンドルを初期化するmainBundle()ためのヘッダで提案されているように、アップルが推奨する一つであることが表示されNSLocale// 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
パルミ2016年

@Pouria NSBundle.mainBundle()はアプリバンドルをNSBundle(forClass: UIView.self)返し、システムのUIKitバンドルを返します。説明されているメソッドは、バンドル内のディレクトリを探します。App Bundleには、ローカライズする予定の言語のもののみが含まれます。デバイスの言語を判別するには、システムバンドルを確認する必要があります。
dreamlab 2016年

1
@Pouria問題は、iOS 9がからの戻り値を変更したことである可能性がありますNSLocale.preferredLanguages()。私はiOSの9をサポートするための答えを更新しました
ドリームラボ2016年

@dreamlab残念ながら、この設定では、プロジェクト設定でサポートされていないローカリゼーションを含むポッドなどのサードパーティコンポーネントを含めると、誤検知の結果が生じます。
kokoko

12

私はこれを使います

    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

好奇心のために、ここでメモリリークはどこにありますか?
缶Poyrazoğlu

リーク-[[[NSLocale alloc] initWithLocaleIdentifier:lan]。
Pavel

1
ただし、非ARCプロジェクトのみ。
Josh Hinman、2015年

12

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

版画:英語、ドイツ語、スウェーデン語


1
実際には、[NSLocale autoupdatingCurrentLocale]を使用してロケールインスタンスを初期化する必要があります。これにより、言語名がユーザーの母国語で表示されます。たとえば、スウェーデン語はスベンスカになります。
Maciej Swic 2014年

8

現在のデバイス言語を取得するより良い方法があります。以下のコードで試してみましょう-

NSLog(@"Current Language - %@", [[NSLocale preferredLanguages] firstObject]);

ここでAbizernが提案


7

次の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だけを使用するfren、表示名から国も省略されることを発見しました(少なくともMac OS Xでは、iOSについては不明です)。


6

迅速

デバイスの現在の言語を取得するには

NSLocale.preferredLanguages()[0] as String

アプリケーション言語を取得するには

NSBundle.mainBundle().preferredLocalizations[0] as NSString

注意:

CFBundleDevelopmentRegionで指定した言語を取得しますinfo.plistのでます

場合CFBundleAllowMixedLocalizationsは Info.plistの中に真である、その後の最初の項目CFBundleLocalizationsするinfo.plistでは、返されます


6

私は自分に合った解決策を見つけようとしました。私が使用すると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
    }
}

あなたはドン;あなたはこのBundle.main.preferredLocalizationsを使用した場合、tはアンラップに持っている[0]文字列として
μολὼν.λαβέ

5

ユーザーデバイスの現在の言語を取得するには、次のitコードを使用します。

NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];

4

iOS13、Swift 5以降、WWDC2019 https://developer.apple.com/videos/play/wwdc2019/403/

ユーザーは、OSの言語とは別に、アプリの優先言語を選択できます。

これらを使用できます。

    // Returns a list of the user's preferred languages.
    // Maybe more than (or none of) your app supports!
    Locale.preferredLanguages

    // a subset of this bundle's localizations, re-ordered into the preferred order
    // for this process's current execution environment; the main bundle's preferred localizations
    // indicate the language (of text) the user is most likely seeing in the UI
    Bundle.main.preferredLocalizations



    // The current running app language
    Bundle.main.preferredLocalizations.first

    // list of language names this bundle appears to be localized to
    Bundle.main.localizations

3

MonoTouch C#開発者は以下を使用します。

NSLocale.PreferredLanguages.FirstOrDefault() ?? "en"

注:私はこれがiOSの質問だったことを知っていますが、私はMonoTouch開発者なので、このページの答えが正しい方向に導いてくれ、結果を共有したいと思いました。


現在NSLocale.PreferredLanguagesを使用していて、空の配列を取得しています。私はあなたがそれを空にすることはできないかもしれないが、私はどこにもこれを見ることができないとドキュメントで読んだと思いますか?
JFoulkes 2012

いいえ、正直なところ、それは私自身の仮定でした。
チャックサベージ

@LarryFこのビデオを見る:jonas.follesoe.no/2011/07/22/cross-platform-mobile-ndc-2011 これは、コード/マルチプラットフォームアプリの構成方法について非常に有益です。
チャックサベージ

3

Swift

let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String

3

スウィフト3

let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)

Stack Overflowへようこそ!このコードは質問に答えることがありますが、問題が何であったか、およびコードが特定の問題にどのように取り組むかについての説明を含めることをお勧めします。今後のために、Stack Overflowで素晴らしい答えを解く方法をいくつか紹介します。
dirtydanee 2017年

3

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
  }

3

優先言語コード( "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)!
}

}


2
-(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;

}

2

ここで言語のみを取得したい場合は、私が提案する答えです。

NSString *langplusreg = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString * langonly = [[langplusreg componentsSeparatedByString:@"-"] 
objectAtIndex:0];

私の場合、ロケールの地域ではなく、ロケールの言語のみが必要でした。

出力:ロケール言語が日本語で、ロケール地域が日本の場合:

langplusreg = ja-JP

langonly = ja


1

Swiftでの@amir応答:

// Get language prefered by user
    let langageRegion = NSLocale.preferredLanguages().first!
    let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
    let language = languageDic[NSLocaleLanguageCode]

1

明らかに、例えば、

[[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]が正しい値を返すようになりました。

この助けを願っています。


1

Swift 4の回答を更新

let language = Bundle.main.preferredLocalizations.first

これは、利用可能な(バンドルによってサポートされている、つまりあなた)および優先される(ユーザーによって)ローカリゼーションの集約リストをフェッチすることに注意してください。 NSLocale.preferredLanguagesバンドルでサポートされているものを考慮せずに、ユーザーの優先するものを返す必要があります。
ジョニー2018

1

以下のSwift 3.0の場合、コードを使用して質問に答えることができます。

 let language = Bundle.main.preferredLocalizations.first! as NSString

1

Swift 4.2およびXcode 10.1

let language = NSLocale.preferredLanguages[0]
print(language)//en




0

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

0

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)

これは、利用可能な(バンドルによってサポートされている、つまりあなた)および優先される(ユーザーによって)ローカリゼーションの集約リストをフェッチすることに注意してください。 NSLocale.preferredLanguagesバンドルでサポートされているものを考慮せずに、ユーザーの優先するものを返す必要があります。
ジョニー2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.