web-dev-qa-db-ja.com

iOSで現在のデバイス言語を取得する

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

これを完全なスペル形式のNSStringとして欲しいのです。 (@ "en_US"ではありません)

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

411
Moshe

提供されているソリューションは、実際には現在選択されている言語ではなく、デバイスの現在の地域を返します。これらはしばしば全く同じものです。しかし、私が北米にいて、私の言語を日本語に設定した場合、私の地域は依然として英語(アメリカ)です。現在選択されている言語を取得するには、次のようにします。

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's answer を見てください。

783
Dubron

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

ローカライズ内で選択されている現在の言語を見つけるには

[[NSBundle mainBundle] preferredLocalizations];

例:

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

迅速:

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

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"

83
amir

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

NSLocale *locale = [NSLocale currentLocale];

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

それは言語自体の中に、その言語の名前を表示します。例えば:

Français (France)
English (United States)
64

warning 承認された、そして他の答えはすべて 優先言語はデバイス言語以外の言語でも構いません を考慮に入れていません。

デバイス言語 は、オペレーティングシステムの要素とアップルのアプリが表示される言語です。

優先言語 ユーザーがアプリケーションをローカライズする場合に使用する言語です。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)
    }
} 
33
dreamlab

en_USなどの言語コードを英語(アメリカ)に変換すると、 NSLocaleNSLocaleの組み込み機能は、どこから言語コードを取得しても構いません。それで、受け入れられた答えが示唆するようにあなた自身の翻訳を実行する理由は本当にありません。

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

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

12
Erik B

私はこれを使う

    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
12
enzoyang

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

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

ここで Abizern から が示唆している

8
Praveenkumar

NSLocaledisplayNameForKey: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:メソッドに同じロケール識別子を指定した場合は、その言語のネイティブ名が表示されます。国コードを削除してfrenだけを使用すると、表示名から国も除外されることがわかりました(少なくともMac OS Xでは、iOSについては不明です)。

7
dreamlax

ユーザーのデバイスの現在の言語を取得するには、それが私のために働いた以下のitコードを使用してください。

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

私は自分のために正しい解決策を見つけようとしました。私が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
    }
}
5
Roman Romanenko

スウィフト

現在の端末の言語を取得する

NSLocale.preferredLanguages()[0] as String

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

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

注:

Info.plistのCFBundleDevelopmentRegionで与えた言語を取得します

info.plistでCFBundleAllowMixedLocalizationsがtrueの場合、CFBundleLocalizationsの最初の項目info.plistが返される

5
Durai Amuthan.H

Swift内:

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

シンプルな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

MonoTouch C#開発者のために使用する:

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

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

3
Chuck Savage

Swift 3

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

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

}

3
Jovan Stankovic
-(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
Johnny Rockex

あなたがここで唯一の言語を手に入れたいのであれば、私の提案した答えは:

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

私の場合、私はただロケール言語ではなく、ロケール地域だけを望んでいました。

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

langplusreg = ja-JP

langonly = ja

2
Danboz

Swift 4の回答を更新しました

let language = Bundle.main.preferredLocalizations.first
1

Swift 4.2とXcode 10.1では

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

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

 let language = Bundle.main.preferredLocalizations.first! as NSString
1
Apurv Soni

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
jjxtra

2文字フォーマットAppleは ISO標準ISO-3166 を使います。

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
0
Jakub Truhlář

アップル のドキュメントによると

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];
0
Max Tymchii

Swift 3の場合:

文字列としてのNSLocale.preferredLanguages [0]

0
Bill Chan

明らかに、例えばに頼る解決策は

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

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

0
Chrysotribax

スイフト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)
0

Swiftでの@amirレスポンス:

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