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을 반환합니다.
답변:
스위프트 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
스위프트 4 & 5 :
Locale.current.languageCode
Locale(identifier: Locale.current.identifier)
;
Locale.autoupdatingCurrent.languageCode
도 사용할 수 있습니다
스위프트 3 & 4 & 4.2 & 5
Locale.current.languageCode
정기적으로 컴파일하지 않습니다. 프로젝트의 현지화를 구현하지 않았기 때문입니다.
두 가지 가능한 솔루션이 있습니다
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")
예를 들어 모든 스페인어 변형에 대해 내 언어와 비교 합니다.
아래 코드를 사용하면 신속한 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)를 제거하십시오.