Swiftで現在の言語コードを取得する方法は?


131

Swiftで記述したアプリでデバイスの言語コード(en、es ...)を取得したい。どうすれば入手できますか?

私はこれを試しています:

var preferredLanguages : NSLocale!
let pre = preferredLanguages.displayNameForKey(NSLocaleIdentifier, value: preferredLanguages)

しかし、これはnilを返します。

回答:


185

Swift 3で

let langStr = Locale.current.languageCode

13
Locale.current.identifierですが、中国語の場合はLocale.current.languageCodeです。常に 'zh'を返しますが、zh-HKなどを区別する必要があります
iXcoder

2
@ User9527プロジェクト設定でその言語のローカライズを有効にしていない可能性が高いためです。
Kirill Kudaev

タイプ「文字列」の値をタイプ「ロケール」に割り当てることはできませんか?
Puji Wahono

1
私が気づく限り、プロジェクトで設定されたこの言語のローカリゼーション->ローカリゼーションの場合のみ、設定->一般->言語と地域-> iPhone言語で設定された実際の言語を返します。それ以外の場合は、開発言語です。
Huralnyk、

85

アプリの言語デバイスのロケール言語を区別することが重要です(以下のコードはSwift 3にあります

デバイスの言語を返します:

let locale = NSLocale.current.languageCode

アプリの言語を返します:

let pre = Locale.preferredLanguages[0]

4
端末の言語とアプリの言語の違いがわかりません。違いについてのドキュメントはありますか?
エレミヤ

1
@Jeremiahロケールにはデバイス言語が含まれます。たとえば、デバイス言語はフランス語に設定されています。Preには、ユーザー(またはアプリ)の優先言語が含まれます。例:アプリは中国語のみをサポートするため、フランス語のデバイスに中国語アプリをインストールできます。希望私は明らかにし、この4 U
ラエド

デバイスがフランス語に設定されていると言うとき、どういう意味ですか?設定で言語を英語以外に変更すると、preferredLanguagesで表現されますが、languageCodeでは表現されないようです。languageCodeはどのように変更されますか?
エレミヤ

in設定を英語以外の何かに変更すると、NSLocale.current.languageCodeでその値が取得されます
raed

9
それは逆ではないですか?私のアプリの開発言語はENであると私は結果があるアプリをローカライズされているためDE設定されたデバイス上で実行すると:Locale.current.languageCode: de Locale.current.identifier: de_DE Locale.preferredLanguages[0]: de 私のアプリの開発言語はENであるとき、私は私がしているそのため、FR設定されたデバイス上で実行していないローカライズアプリの結果は次のとおりです。 Locale.current.languageCode: en Locale.current.identifier: en_FR Locale.preferredLanguages[0]: fr
アリエンHiemstra

55

Swift 4および5:

Locale.current.languageCode

タイプ「文字列」の値をタイプ「ロケール」に割り当てることはできませんか?
Puji Wahono

2
試してみてくださいLocale(identifier: Locale.current.identifier)
公園

Locale.autoupdatingCurrent.languageCodeも利用可能
C.ベス


35

アプリで使用されている現在の言語を取得するには(優先言語とは異なる)

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!

29

Swift 3&4&4.2&5

Locale.current.languageCode定期的にコンパイルされません。プロジェクトのローカリゼーションを実装しなかったため。

あなたは2つの可能な解決策を持っています

1)String(Locale.preferredLanguages[0].prefix(2)) 電話の言語を適切に返します。

タイプを取得したい場合はen-EnLocale.preferredLanguages[0]

2)Project(MyApp)-> Project (not Target)->を選択しLocalizations、に+ボタンを押して、必要な言語を追加します。


これは本当に面白いです!ソリューション1はどこで読みましたか?
Appleの

16

迅速3

let preferredLanguage = Locale.preferredLanguages[0] as String
print (preferredLanguage) //en-US

let arr = preferredLanguage.components(separatedBy: "-")
let deviceLanguage = arr.first
print (deviceLanguage) //en

1
言語コードと国コードを「-」で区切るとバグが発生します。あなたのコードは 'zh-Hans-US'のようないくつかのケースで壊れます。
Evilisn Jiang

let langStr = Locale.preferredLanguages.first!これは私がこの投稿をレビューしたことです。それは機能していますlangStr.lowercased().contains("es")。たとえば、スペイン語のすべての言語バリエーションと自分の言語を比較しています。
Ian Ortega

8

あなたはそれがSwift 3でうまく機能する以下のコードを使用できます

var preferredLanguage : String = Bundle.main.preferredLocalizations.first!

1
これは実際にまだSwift 4で動作するものです!ありがとう!
Alex Wally

7

ユーザーが自分のアプリを起動するたびに、設定アプリでユーザーが選択した言語を追跡したい-それはまだローカライズされていません(私のアプリは英語のみです)。私はこの論理を採用しました:

  1. 配列の言語を扱いやすくするための列挙型を作成する

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
  2. ロケール拡張をいくつか作成します

    extension Locale {
    
        static var enLocale: Locale {
    
            return Locale(identifier: "en-EN")
        } // to use in **currentLanguage** to get the localizedString in English
    
        static var currentLanguage: Language? {
    
            guard let code = preferredLanguages.first?.components(separatedBy: "-").last else {
    
                print("could not detect language code")
    
                return nil
            }
    
            guard let rawValue = enLocale.localizedString(forLanguageCode: code) else {
    
                print("could not localize language code")
    
                return nil
            }
    
            guard let language = Language(rawValue: rawValue) else {
    
                print("could not init language from raw value")
    
                return nil
            }
            print("language: \(code)-\(rawValue)")
    
            return language
        }
    }
  3. 必要なときは、拡張機能を使用するだけです

    if let currentLanguage = Locale.currentLanguage {
        print(currentLanguage.rawValue)
        // Your code here.
    }

ありがとう@Syscall :)
ミニアプリ2018

拡張機能が大好きです:) なんらかの方法で読み取れない場合は、何も返さないほうが理にかなっています。その方法は、その値を使用して何らかの値を作成できるためです。
Alix、

5

Swiftでは、ロケールを使用して取得できます。

let locale = Locale.current.identifier

2

Locale.current.languageCode 私は間違ったコードを返すので、私はこれらの拡張機能を使用します:

extension Locale {
    static var preferredLanguageCode: String {
        let defaultLanguage = "en"
        let preferredLanguage = preferredLanguages.first ?? defaultLanguage
        return Locale(identifier: preferredLanguage).languageCode ?? defaultLanguage
    }

    static var preferredLanguageCodes: [String] {
        return Locale.preferredLanguages.compactMap({Locale(identifier: $0).languageCode})
    }
}

0

これは私がSwift 5 Xcode 11で使用するものです。

クラス変数の内部:

let languagePrefix = Bundle.main.preferredLocalizations.first?.prefix(2)

これはひもとして来ます。「en」、「es」、「de」などの2文字を返します...

これから、表示する言語を簡単に決定できます。

 if languagePrefix == "es" { self.flipCard.setTitle("última carta", for: .normal) }
 if languagePrefix == "en" { self.flipCard.setTitle("Last Card", for: .normal) }

言語の完全な情報が必要な場合は、?。prefex(2)を削除してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.