programing

Swift로 현재 언어 코드를 얻는 방법은 무엇입니까?

lastmoon 2023. 4. 17. 22:14
반응형

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!

아직 현지화되지 않은 설정 앱에서 사용자가 선택한 언어를 추적하고 싶습니다(내 앱은 영어만 해당).저는 다음과 같은 논리를 채택했습니다.

  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.
    }
    

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

반응형