Swift로 현재 언어 코드를 얻는 방법은 무엇입니까?
Swift로 작성한 앱의 언어 코드(en, es...)를 알고 싶습니다.이거 어떻게 구하지?
난 이걸 시도하고 있어.
var preferredLanguages : NSLocale!
let pre = preferredLanguages.displayNameForKey(NSLocaleIdentifier, value: preferredLanguages)
하지만 이 값은 0으로 반환됩니다.
Swift 3의 경우
let langStr = Locale.current.languageCode
앱 언어와 디바이스 로케일 언어를 구별하는 것이 중요합니다(아래 코드는 Swift 3에 있습니다).
디바이스 언어를 반환합니다.
let locale = NSLocale.current.languageCode
앱 언어를 반환합니다.
let pre = Locale.preferredLanguages[0]
Swift 4 및 5:
Locale.current.languageCode
Swift 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
원하는 언어를 추가합니다.
Swift 3의 경우:
NSLocale.current.languageCode
TL;DR:
Bundle.main.preferredLocalizations[0]
앱의 UI가 현재 표시되어 있는 언어를 가져옵니다. 마세요Locale.current
지역 형식(시간, 통화, 거리 등)을 기술하고 언어와는 무관하기 때문입니다.
자세한 답변:
앱 UI가 표시되는 언어의 언어(!) 코드를 얻는 방법에 대한 명확한 답변은 Apple의 엔지니어 Quinn "The Eskimo"에서 나왔습니다. Swift의 인용/패러레이스는 다음과 같습니다.
Locale.current
는 현재 로케일, 즉 [설정(Settings)]> [일반(General)]> [언어 및 지역(Language & Region)]> [지역형식(Region Formats)]앱이 실행되고 있는 언어와는 관계가 없습니다.필드 내 사용자가 자신의 로케일과 언어를 '충돌' 값으로 설정하는 것은 지극히 합리적이며, 실제로 매우 일반적입니다.예를 들어 프랑스에 거주하는 원어민 영어 사용자는 언어를 영어로 설정하지만 로케일을 프랑스어로 설정할 수 있습니다(그래서 메트릭 가중치 및 측정치, 24시간 등).
사용하시는 앱의 언어는 언어 설정, 즉 [설정]> [일반]> [언어 & 지역]> [우선 언어 순서]에 따라 결정됩니다.시스템에서 앱을 실행할 때 이 언어 목록(기본 설정 목록)을 가져와 앱이 현지화된 언어 목록(앱 목록)과 비교합니다.앱 목록에 있는 선호 목록의 첫 번째 언어는 앱에 대해 선택된 언어입니다.이는 메인 번들의 첫 번째 엔트리에서 확인할 수 있습니다.
preferredLocalizations
어레이를 설정합니다.
코드의 언어 이름
코드에서 사람이 읽을 수 있는 언어의 이름을 가져오려면 다음을 사용합니다.
let langCode = Bundle.main.preferredLocalizations[0]
let usLocale = Locale(identifier: "en-US")
var langName = ""
if let languageName = usLocale.localizedString(forLanguageCode: langCode) {
langName = languageName
}
현재 UI 언어의 영어 이름이 표시됩니다.
앱에서 현재 사용되는 언어를 가져오려면(기본 언어가 아님)
NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!
스위프트 3
let preferredLanguage = Locale.preferredLanguages[0] as String
print (preferredLanguage) //en-US
let arr = preferredLanguage.components(separatedBy: "-")
let deviceLanguage = arr.first
print (deviceLanguage) //en
Locale.current.languageCode
잘못된 코드를 반환하기 위해 다음 확장자를 사용합니다.
extension Locale {
static var preferredLanguageCode: String {
guard let preferredLanguage = preferredLanguages.first,
let code = Locale(identifier: preferredLanguage).languageCode else {
return "en"
}
return code
}
static var preferredLanguageCodes: [String] {
return Locale.preferredLanguages.compactMap({Locale(identifier: $0).languageCode})
}
}
Swift 5.4:
let languagePrefix = Locale.preferredLanguages[0]
print(languagePrefix)
아래 코드를 사용하셔도 됩니다.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. }
Swift에서는 로케일을 다음과 같이 얻을 수 있습니다.
let locale = Locale.current.identifier
Swift 5 Xcode 11에서 사용하는 것은 다음과 같습니다.
클래스 변수 내부:
let languagePrefix = Bundle.main.preferredLocalizations.first?.prefix(2)
이것은 끈으로 되어 있습니다."en", "es", "de"와 같은 두 문자를 반환합니다.
이를 통해 표시할 언어를 쉽게 결정할 수 있습니다.
if languagePrefix == "es" { self.flipCard.setTitle("última carta", for: .normal) }
if languagePrefix == "en" { self.flipCard.setTitle("Last Card", for: .normal) }
언어에 대한 완전한 정보를 원하시면 삭제하시겠습니까?프리펙스 (2)
대부분의 경우 현재 앱 UI의 언어 코드를 얻으려면 API를 통해 현지화된 응답을 얻어야 합니다.
extension Bundle {
var currentLocalizedUILanguageCode: String {
guard let code = Bundle.main.preferredLocalizations.first?.components(separatedBy: "-").first else {
return Locale.current.languageCode ?? "en"
}
return code
}
}
처럼 사용하다.
headers["X-Language"] = Bundle.main.currentLocalizedUILanguageCode
var languageCode = ""
if #available(iOS 16.0, *) {
if let language = NSLocale.current.language.languageCode {
languageCode = language.identifier
}
} else {
if let language = NSLocale.current.languageCode {
languageCode = language
}
}
이 기능을 사용하여 iOS 기기에서 시스템의 현재 언어 코드를 가져옵니다.
func getSystemLanguageCode() -> String {
UserDefaults.standard.removeObject(forKey: "AppleLanguages")
let pref_Language = NSLocale.preferredLanguages[0] as String //"fr-IN"
let language = pref_Language.components(separatedBy: "-") //["fr","IN"]
let lang_Code = language.first?.lowercased() ?? "" //"fr"
UserDefaults.standard.set([lang_Code], forKey: "AppleLanguages")
return lang_Code
}
정답은 거의 없습니다.이것은 동작하는 Swift 5.7 솔루션입니다.""
extension Locale {
// Gets the language of the device, had to remove the content of AppleLanguages since `preferredLanguages`
// is combining the result from multiple APIs. AppleLanguage is then set to the old value
static var preferredLanguageCode: String {
let appleLanguages = UserDefaults.standard.stringArray(forKey: "AppleLanguages")
UserDefaults.standard.removeObject(forKey: "AppleLanguages")
guard let preferredLanguage = preferredLanguages.first,
let code = Locale(identifier: preferredLanguage).languageCode else {
UserDefaults.standard.set(appleLanguages, forKey: "AppleLanguages")
return "en"
}
UserDefaults.standard.set(appleLanguages, forKey: "AppleLanguages")
return code
}
}
언급URL : https://stackoverflow.com/questions/24591167/how-to-get-current-language-code-with-swift
'programing' 카테고리의 다른 글
Swift에서 일련의 취약한 참조를 선언하려면 어떻게 해야 합니까? (0) | 2023.04.17 |
---|---|
WPF 목록 뷰에서 부드러운 스크롤을 구현할 수 있습니까? (0) | 2023.04.17 |
Bash에 TRY CATCH 명령어가 있습니까? (0) | 2023.04.17 |
SQL Management Studio의 시작/끝 블록에서 "스키마 생성"을 사용할 수 없는 이유는 무엇입니까? (0) | 2023.04.17 |
Oracle에 의한 페이징 (0) | 2023.04.02 |