質問

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

私はこれをのようにしたいです NSString 完全に綴られた形式で。 ( @"en_us"ではありません)

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

役に立ちましたか?

解決

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

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

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

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

warning 受け入れられた、そして他の答えはすべて、 優先言語はデバイス言語以外の言語になることができます.

デバイス言語 オペレーティングシステムの要素と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-> 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 の中へ 英語(アメリカ) の組み込み機能です 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);

印刷: 英語、ドイツ語、スウェーデン語

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

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

によって提案されました アビツェルン の上 ここ

使用できます 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: メソッド、次に、言語のネイティブ名を与えます。カントリーコードを削除して使用すると、私は発見しました fren, 、それはまた、ディスプレイ名から国を省略します(少なくとも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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top