Swift로 현재 언어 코드를 얻는 방법?


131

Swift로 작성된 앱에서 장치의 언어 코드 (en, es ...)를 가져오고 싶습니다. 이것을 어떻게 얻을 수 있습니까?

나는 이것을 시도하고있다 :

var preferredLanguages : NSLocale!
let pre = preferredLanguages.displayNameForKey(NSLocaleIdentifier, value: preferredLanguages)

그러나 이것은 nil을 반환합니다.

답변:


185

스위프트 3에서

let langStr = Locale.current.languageCode

13
해야합니다 : Locale.current.identifier하지만 Locale.current.languageCode 중국어, 항상 'zh'반환하지만 zh-HK 등을 구분해야합니다
iXcoder

2
@ User9527 귀하의 프로젝트 설정에서 해당 언어의 현지화를 활성화하지 않았을 가능성이 높습니다.
Kirill Kudaev

'Locale'유형에 'String'유형의 값을 지정할 수 없습니까?
푸지 와호 노

1
내가 아는 한, 설정-> 일반-> 언어 및 지역-> iPhone 언어에서만 설정된 언어가 프로젝트-> 현지화의 프로젝트 에서이 언어에 대해 현지화 된 경우 반환됩니다. 그렇지 않으면 개발 언어입니다.
Huralnyk

85

앱 언어장치 로캘 언어를 구별하는 것이 중요합니다 (아래 코드는 Swift 3에 있습니다 )

장치 언어를 반환합니다 :

let locale = NSLocale.current.languageCode

언어를 반환합니다 :

let pre = Locale.preferredLanguages[0]

4
장치 언어와 앱 언어의 차이점을 이해하지 못합니다. 차이점에 대한 문서가 있습니까?
예레미야

1
@Jeremiah locale에는 장치 언어가 포함됩니다 (예 : 장치 언어가 프랑스어로 구성되어 있음). Pre에는 사용자 (또는 앱) 선호 언어가 포함됩니다 (예 : 앱은 중국어 만 지원하므로 프랑스어 앱에 중국어 앱을 설치할 수 있음). 희망 나는 명확하게이 4 U
에드

장치가 프랑스어로 구성되었다고 말하면 무슨 뜻입니까? 설정의 언어를 영어 이외의 언어로 변경하면 preferredLanguages로 표시되지만 languageCode에는 표시되지 않는 것 같습니다. languageCode는 어떻게 변경됩니까?
예레미아

당신은 당신이 NSLocale.current.languageCode에 그 값을 얻을 것이다 영어 것을 다른 것으로 설정에서 변경하면
에드

9
다른 방법이 아닙니까? 내 앱 개발 언어가 EN이고 앱을 현지화 한 DE 구성 기기에서 실행할 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
Arjen Hiemstra



35

앱에서 현재 사용되는 언어를 사용하려면 (기본 언어와 다름)

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!

29

스위프트 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원하는 언어를 추가하십시오.


정말 흥미 롭습니다! 해결책 1을 어디에서 읽었습니까? 사과 문서에서이 정보를 찾을 수 없습니다
kuzdu

16

스위프트 3

let preferredLanguage = Locale.preferredLanguages[0] as String
print (preferredLanguage) //en-US

let arr = preferredLanguage.components(separatedBy: "-")
let deviceLanguage = arr.first
print (deviceLanguage) //en

1
"-"로 분리 된 언어 코드와 국가 코드는 버그가 있습니다. 'zh-Hans-US'와 같은 경우 코드가 손상됩니다.
Evilisn Jiang

let langStr = Locale.preferredLanguages.first!이것이 내가이 게시물을 검토 한 것입니다. 작동하고 있으며 langStr.lowercased().contains("es")예를 들어 모든 스페인어 변형에 대해 내 언어와 비교 합니다.
이안 오르테가

8

아래 코드를 사용하면 신속한 3에서 잘 작동합니다.

var preferredLanguage : String = Bundle.main.preferredLocalizations.first!

1
이것은 실제로 Swift 4에서 실제로 작동하는 것입니다! 감사!
Alex Wally

7

사용자가 내 앱을 시작할 때마다 설정 앱에서 사용자가 선택한 언어를 추적하려고합니다. 아직 현지화되지 않았습니다 (내 앱은 영어로만 제공됨). 이 논리를 채택했습니다.

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

감사합니다 @Syscall :
Miniapps

확장을 사랑하십시오 :). 어떻게 든 읽을 수 없다면 아무것도 반환하지 않는 것이 더 합리적입니까? 그렇게하면 그 가치는 어떤 가치를 만드는 데 사용될 수 있기 때문입니다.
Alix

5

Swift에서는 로케일을 사용하여 얻을 수 있습니다.

let locale = Locale.current.identifier

2

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

0

이것이 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)를 제거하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.