Swiftで記述されたアプリでデバイスの言語コード(en、es ...)を取得したい。これをどうやって手に入れることができますか?
私はこれを試しています:
var preferredLanguages : NSLocale!
let pre = preferredLanguages.displayNameForKey(NSLocaleIdentifier, value: preferredLanguages)
しかし、これはnilを返します。
ありがとう!
Swift 3
let langStr = Locale.current.languageCode
アプリの言語とデバイスのロケール言語を区別することが重要です(以下のコードはSwiftにあります)
デバイス言語を返します:
let locale = NSLocale.current.languageCode
App言語を返します:
let pre = Locale.preferredLanguages[0]
Swift 3:
NSLocale.current.languageCode
アプリで使用されている現在の言語を取得するには(優先言語とは異なる)
NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!
In Swift 4:
Locale.current.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
に入れ、必要な言語を追加します。
Swift
let preferredLanguage = Locale.preferredLanguages[0] as String
print (preferredLanguage) //en-US
let arr = preferredLanguage.components(separatedBy: "-")
let deviceLanguage = arr.first
print (deviceLanguage) //en
以下のコードを使用すると、Swift 3で正常に動作します。
var preferredLanguage : String = Bundle.main.preferredLocalizations.first!
Swiftでは、を使用してロケールを取得できます。
let locale = Locale.current.identifier
ユーザーがアプリを起動するたびに、設定アプリでユーザーが選択した言語を追跡します-これはまだローカライズされていません(アプリは英語のみです)。私はこのロジックを採用しました:
配列の言語を扱いやすくするためにenumを作成します
enum Language: String {
case none = ""
case en = "English"
case fr = "French"
case it = "Italian"
} // add as many languages you want
いくつかのextensionからLocaleを作成します
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.
}