Swiftで記述したアプリでデバイスの言語コード(en、es ...)を取得したい。どうすれば入手できますか?
私はこれを試しています:
var preferredLanguages : NSLocale!
let pre = preferredLanguages.displayNameForKey(NSLocaleIdentifier, value: preferredLanguages)
しかし、これはnilを返します。
Swiftで記述したアプリでデバイスの言語コード(en、es ...)を取得したい。どうすれば入手できますか?
私はこれを試しています:
var preferredLanguages : NSLocale!
let pre = preferredLanguages.displayNameForKey(NSLocaleIdentifier, value: preferredLanguages)
しかし、これはnilを返します。
回答:
Swift 3で
let langStr = Locale.current.languageCode
アプリの言語とデバイスのロケール言語を区別することが重要です(以下のコードはSwift 3にあります)
デバイスの言語を返します:
let locale = NSLocale.current.languageCode
アプリの言語を返します:
let pre = Locale.preferredLanguages[0]
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
Swift 4および5:
Locale.current.languageCode
Locale(identifier: Locale.current.identifier)
。
Locale.autoupdatingCurrent.languageCode
も利用可能
Swift 3&4&4.2&5
Locale.current.languageCode
定期的にコンパイルされません。プロジェクトのローカリゼーションを実装しなかったため。
あなたは2つの可能な解決策を持っています
1)String(Locale.preferredLanguages[0].prefix(2))
電話の言語を適切に返します。
タイプを取得したい場合はen-En
、Locale.preferredLanguages[0]
2)Project(MyApp)
-> Project (not Target)
->を選択しLocalizations
、に+ボタンを押して、必要な言語を追加します。
迅速3
let preferredLanguage = Locale.preferredLanguages[0] as String
print (preferredLanguage) //en-US
let arr = preferredLanguage.components(separatedBy: "-")
let deviceLanguage = arr.first
print (deviceLanguage) //en
let langStr = Locale.preferredLanguages.first!
これは私がこの投稿をレビューしたことです。それは機能していますlangStr.lowercased().contains("es")
。たとえば、スペイン語のすべての言語バリエーションと自分の言語を比較しています。
あなたはそれがSwift 3でうまく機能する以下のコードを使用できます
var preferredLanguage : String = Bundle.main.preferredLocalizations.first!
ユーザーが自分のアプリを起動するたびに、設定アプリでユーザーが選択した言語を追跡したい-それはまだローカライズされていません(私のアプリは英語のみです)。私はこの論理を採用しました:
配列の言語を扱いやすくするための列挙型を作成する
enum Language: String {
case none = ""
case en = "English"
case fr = "French"
case it = "Italian"
} // add as many languages you want
ロケールの拡張をいくつか作成します
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
}
}
必要なときは、拡張機能を使用するだけです
if let currentLanguage = Locale.currentLanguage {
print(currentLanguage.rawValue)
// Your code here.
}
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})
}
}
これは私が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)を削除してください