จะรับรหัสภาษาปัจจุบันด้วย Swift ได้อย่างไร


132

ฉันต้องการรับรหัสภาษาของอุปกรณ์ (en, es ... ) ในแอพของฉันที่เขียนด้วย Swift ได้อย่างไร?

ฉันกำลังลองสิ่งนี้:

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

แต่สิ่งนี้กลับเป็นศูนย์

คำตอบ:


185

ใน Swift 3

let langStr = Locale.current.languageCode

14
ควรเป็น: Locale.current.identifier แต่ Locale.current.languageCode สำหรับภาษาจีนจะส่งคืน 'zh' เสมอ แต่ต้องแยกแยะ zh-HK เป็นต้น
iXcoder

2
@ User9527 เนื่องจากคุณมักไม่ได้เปิดใช้งานการแปลภาษาสำหรับภาษานั้นในการตั้งค่าโครงการของคุณ
Kirill Kudaev

ไม่สามารถกำหนดค่าของประเภท 'String' เพื่อพิมพ์ 'Locale?'
Puji Wahono

1
เท่าที่ฉันสังเกตเห็นมันจะส่งคืนภาษาจริงที่ตั้งไว้ในการตั้งค่า -> ทั่วไป -> ภาษาและภูมิภาค -> ภาษาของ iPhone เท่านั้นหากเปิดใช้งานการแปลภาษาสำหรับภาษานี้ในโครงการของคุณภายใต้โครงการ -> การแปล ไม่งั้นก็พัฒนาภาษา
Huralnyk

87

สิ่งสำคัญคือต้องสร้างความแตกต่างระหว่างภาษาของแอปและภาษาของอุปกรณ์ (รหัสด้านล่างอยู่ในSwift 3 )

จะส่งคืนภาษาของอุปกรณ์ :

let locale = NSLocale.current.languageCode

จะส่งคืนภาษาของแอป :

let pre = Locale.preferredLanguages[0]

4
ฉันไม่เข้าใจความแตกต่างระหว่างภาษาของอุปกรณ์หรือภาษาของแอป คุณมีเอกสารเกี่ยวกับความแตกต่างหรือไม่?
เยเรมีย์

1
ภาษา @Jeremiah จะมีภาษาของอุปกรณ์เช่นภาษาอุปกรณ์ของคุณถูกกำหนดค่าเป็นภาษาฝรั่งเศส Pre จะมีภาษาที่ต้องการของผู้ใช้ (หรือแอป) ตัวอย่างเช่นแอปของคุณรองรับเฉพาะภาษาจีนดังนั้นคุณจึงสามารถติดตั้งแอปภาษาจีนบนอุปกรณ์ภาษาฝรั่งเศสได้ หวังว่าฉันจะชี้แจง 4 u นี้
raed

เมื่อคุณบอกว่าอุปกรณ์ถูกกำหนดค่าเป็นภาษาฝรั่งเศสคุณหมายถึงอะไร? ดูเหมือนว่าถ้าฉันเปลี่ยนภาษาในการตั้งค่าเป็นภาษาอื่นที่ไม่ใช่ภาษาอังกฤษจะแสดงเป็นภาษาที่ต้องการ แต่ไม่ใช่ใน LanguageCode LanguageCode มีการเปลี่ยนแปลงอย่างไร
เยเรมีย์

หากคุณเปลี่ยนการตั้งค่าในเป็นภาษาอื่นที่เป็นภาษาอังกฤษคุณจะได้รับค่าใน NSLocale.current.languageCode
raed

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

30

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แล้วเพิ่มภาษาที่คุณต้องการ


นี่มันน่าสนใจจริงๆ! คุณอ่านวิธีแก้ปัญหาที่ไหน ไม่พบข้อมูลนี้ในเอกสารของ Apple
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")รูปแบบภาษาสเปนทั้งหมดเช่น
Ian Ortega

8

คุณสามารถใช้รหัสด้านล่างซึ่งใช้งานได้ดีกับ swift 3

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

1
นี่คือรุ่นที่ยังใช้งานได้จริงกับ Swift 4! ขอบคุณ!
Alex Wally

7

ฉันต้องการติดตามภาษาที่ผู้ใช้เลือกในแอปการตั้งค่าทุกครั้งที่ผู้ใช้เปิดแอปของฉันซึ่งยังไม่ได้แปลเป็นภาษาท้องถิ่น (แอปของฉันเป็นภาษาอังกฤษเท่านั้น) ฉันใช้ตรรกะนี้:

  1. สร้างenumเพื่อให้จัดการภาษาในอาร์เรย์ได้ง่ายขึ้น

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
    
  2. สร้างส่วนขยายสองสามอย่างไปยัง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
        }
    }
    
  3. เมื่อคุณต้องการคุณสามารถใช้ส่วนขยายได้

    if let currentLanguage = Locale.currentLanguage {
        print(currentLanguage.rawValue)
        // Your code here.
    }
    

ขอบคุณ @Syscall :)
Miniapps

รักนามสกุล :). มันจะไม่สมเหตุสมผลมากกว่าที่จะไม่กลับมาถ้ามันไม่สามารถอ่านได้ เพราะวิธีนั้นสามารถใช้เพื่อสร้างมูลค่าได้
Alix


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)

สิ่งนี้มาเป็นสตริง มันจะส่งคืนอักขระ 2 ตัวคือ "en", "es", "de" ...

จากสิ่งนี้ฉันสามารถกำหนดภาษาที่จะแสดงได้อย่างง่ายดาย:

 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.