446

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

私はこれをNSString完全に綴られたフォーマットとして欲しい。(@ "en_US"ではありません)

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

4

32 に答える 32

821

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

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

これにより、現在選択されている言語の 2 文字のコードが返されます。英語の場合は「en」、スペイン語の場合は「es」、ドイツ語の場合は「de」などです。その他の例については、このウィキペディアのエントリ (特に、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 の回答をご覧ください

于 2010-11-19T01:41:14.150 に答える
287

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

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

[[NSBundle mainBundle] preferredLocalizations];

例:

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

迅速:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
于 2012-05-08T11:02:46.603 に答える
88

iOS 9 のソリューション:

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

言語 = "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

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

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

countryCode = "米国"

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

languageCode = "en"

于 2015-11-02T10:45:49.107 に答える
65

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

NSLocale *locale = [NSLocale currentLocale];

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

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

Français (France)
English (United States)
于 2010-10-11T22:04:52.050 に答える
37

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

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

優先言語は、ユーザーがアプリのローカライズを希望する言語です。Apple が提供する翻訳のセットは限られています。優先言語が Apple がアプリを翻訳した言語である場合、それはデバイスの言語にもなります。ただし、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 -> Language & Region -> Preferred Language Orderで編集できます。


デバイスの言語コードを使用して、それを言語名に翻訳することができます。次の行は、デバイス言語をデバイス言語で出力します。たとえば、デバイスがスペイン語に設定されている場合は「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)
    }
} 
于 2015-05-18T01:29:48.440 に答える
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
于 2013-03-02T12:39:41.643 に答える
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);

プリント:英語、ドイツ語、スウェーデン語

于 2013-07-24T14:14:26.530 に答える
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についてはわかりません)。

于 2010-10-11T22:05:41.153 に答える
6

迅速

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

NSLocale.preferredLanguages()[0] as String

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

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

ノート:

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

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

于 2016-02-01T06:05:40.813 に答える
3

スイフト3

let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)
于 2017-01-05T00:06:39.200 に答える
3

MonoTouch C# 開発者の場合は、次を使用します。

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

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

于 2012-04-10T19:51:50.683 に答える
2

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

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

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

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

langplusreg = ja-JP

langonly = 日

于 2015-10-08T05:45:44.930 に答える
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;

}
于 2013-10-08T13:39:28.097 に答える
1

Swift での @amir 応答:

// Get language prefered by user
let langageRegion = NSLocale.preferredLanguages().first!
let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
let language = languageDic[NSLocaleLanguageCode]
于 2016-07-18T10:33:09.440 に答える
1

私は実際に元の質問を読み違え、「デバイスUI」ではなく「アプリUI」言語(それは私がグーグルで検索したものです)を求めていると思いましたpreferredLocalizations。コードを作成する場合は、表示する適切な文字列を取得するための手順がもう 1 つあります。したがって、「デバイス UI」言語は既に回答されていますが、サポートしている UI 言語のうち現在使用されている適切な文字列を表示したい場合、明らかに最も簡単な解決策は次のとおりです。

NSLocalizedString(@"currentLanguage", @"")

UI ローカリゼーションのすべての場所で、表示したい方法で正確に指定しました。たとえば、ファイルのenバージョンでは次のよう.stringsになります。

"currentLanguage"="English";

あなたが持っているファイルのあなたのfrバージョンでは:.strings

"currentLanguage"="Francais";

コードなどをいじる必要はありません。独自の文字列を作成して、UI にうまく一致させます。

于 2020-10-24T14:48:56.740 に答える
0

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

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];
于 2013-06-16T11:32:44.523 に答える
0

スウィフト 3 の場合:

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

于 2016-11-04T16:31:35.387 に答える
0

2 文字形式。Apple は、ISO 標準 ISO-3166を使用しています。

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
于 2016-01-31T08:51:44.007 に答える
-1

Swiftでは、現在のアプリ言語を取得するためのより簡単な方法があります。

Locale(identifier: Bundle.main.preferredLocalizations[0]).languageCode!

たとえば、次のように切り替えることができます。

let supportUrl: URL = {
    switch Locale(identifier: Bundle.main.preferredLocalizations[0]).languageCode {
    case "de":
        return Constants.supportUrlGerman

    default:
        return Constants.supportUrlEnglish
    }
}

これが役立つことを願っています!

于 2019-12-06T11:44:58.120 に答える