Làm cách nào để lấy mã ngôn ngữ hiện tại với Swift?


131

Tôi muốn lấy mã ngôn ngữ của thiết bị (en, es ...) trong ứng dụng của mình được viết bằng Swift. Làm thế nào có thể có được điều này?

Tôi đang thử cái này:

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

Nhưng điều này trả về con số không.

Câu trả lời:


185

Trong Swift 3

let langStr = Locale.current.languageCode

13
nên là: Locale.civerse.identifier nhưng Locale.civerse.l LanguageCode cho tiếng Trung, nó luôn trả về 'zh', nhưng phải phân biệt zh-HK, v.v.
iXcoder

2
@ User9527 Do bạn rất có thể đã không kích hoạt bản địa hóa cho ngôn ngữ đó trong cài đặt dự án của bạn.
Kirill Kudaev

Không thể gán giá trị của loại 'Chuỗi' để nhập 'Địa điểm?'
Puji Wahono

1
Theo như tôi nhận thấy, nó sẽ trả về ngôn ngữ thực tế được đặt trong Cài đặt -> Chung -> Ngôn ngữ & Vùng -> CHỈ Ngôn ngữ iPhone NẾU bản địa hóa cho ngôn ngữ này được bật trong dự án của bạn trong Dự án -> Bản địa hóa. Nếu không thì đó là ngôn ngữ phát triển.
Huralnyk

85

Điều quan trọng là tạo sự khác biệt giữa ngôn ngữ Ứng dụngngôn ngữ ngôn ngữ thiết bị (Mã bên dưới là trong Swift 3 )

Sẽ trả về ngôn ngữ Thiết bị :

let locale = NSLocale.current.languageCode

Sẽ trả lại ngôn ngữ Ứng dụng :

let pre = Locale.preferredLanguages[0]

4
Tôi không hiểu sự khác biệt giữa Ngôn ngữ thiết bị hoặc Ngôn ngữ ứng dụng. Bạn có bất kỳ tài liệu về sự khác biệt?
Giê-rê-mi

1
Địa phương @Jeremiah sẽ chứa ngôn ngữ thiết bị, ví dụ ngôn ngữ thiết bị của bạn được định cấu hình sang tiếng Pháp. Pre sẽ chứa ngôn ngữ ưa thích của người dùng (Hoặc Ứng dụng), ví dụ: Ứng dụng của bạn chỉ hỗ trợ tiếng Trung Quốc, do đó bạn có thể cài đặt ứng dụng tiếng Trung trên thiết bị của Pháp. Hy vọng tôi đã làm rõ 4 u này
ra

Khi bạn nói thiết bị được cấu hình sang tiếng Pháp, bạn có ý gì? Có vẻ như nếu tôi thay đổi ngôn ngữ trong cài đặt thành một thứ khác ngoài tiếng Anh thì nó được thể hiện bằng ngôn ngữ ưa thích nhưng không phải bằng ngôn ngữ. Ngôn ngữ được thay đổi như thế nào?
Giê-rê-mi

Nếu bạn thay đổi cài đặt thành tiếng Anh khác, bạn sẽ nhận được giá trị của nó trong NSLocale.c hiện.l LanguageCode
mắt vào

9
Không phải nó là cách khác sao? Khi ngôn ngữ phát triển ứng dụng của tôi là EN và tôi chạy trên thiết bị được định cấu hình DE, tôi đã bản địa hóa ứng dụng, kết quả là: Locale.current.languageCode: de Locale.current.identifier: de_DE Locale.preferredLanguages[0]: de Khi ngôn ngữ phát triển ứng dụng của tôi là EN và tôi chạy trên thiết bị được định cấu hình FR mà tôi chưa bản địa hóa ứng dụng kết quả là: Locale.current.languageCode: en Locale.current.identifier: en_FR Locale.preferredLanguages[0]: fr
Arjen Hiemstra

55

Swift 4 & 5:

Locale.current.languageCode

Không thể gán giá trị của loại 'Chuỗi' để nhập 'Địa điểm?'
Puji Wahono

2
Hãy thử Locale(identifier: Locale.current.identifier);
koen

Locale.autoupdatingCurrent.languageCodecũng có sẵn
C. Bess


35

Để có được ngôn ngữ hiện tại được sử dụng trong ứng dụng của bạn (khác với ngôn ngữ ưa thích)

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!

29

Swift 3 & 4 & 4.2 & 5

Locale.current.languageCodekhông biên dịch thường xuyên. Bởi vì bạn đã không thực hiện nội địa hóa cho dự án của bạn.

Bạn có hai giải pháp khả thi

1) String(Locale.preferredLanguages[0].prefix(2)) Nó trả về điện thoại lang đúng cách.

Nếu bạn muốn có được loại en-En, bạn có thể sử dụngLocale.preferredLanguages[0]

2) Chọn Project(MyApp)-> Project (not Target)-> nhấn + nút vào Localizations, sau đó thêm ngôn ngữ bạn muốn.


Điều này thực sự thú vị! Bạn đã đọc giải pháp ở đâu? Không thể tìm thấy thông tin này trong tài liệu về táo
kuzdu

16

nhanh 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
Mã ngôn ngữ và mã quốc gia riêng biệt bằng "-" là lỗi. Mã của bạn sẽ bị hỏng trong một số trường hợp như 'zh-Hans-US'.
Evilisn Jiang

let langStr = Locale.preferredLanguages.first!đây là những gì tôi đã thực hiện đánh giá bài viết này. Nó hoạt động và tôi so sánh với các ngôn ngữ của tôi với langStr.lowercased().contains("es")tất cả các biến thể ngôn ngữ Tây Ban Nha chẳng hạn.
Ian Ortega

8

bạn có thể sử dụng đoạn mã dưới đây để nó hoạt động tốt với swift 3

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

1
Đây là một trong những thực sự vẫn hoạt động với Swift 4! Cảm ơn!
Alex Wally

7

Tôi muốn theo dõi ngôn ngữ do người dùng chọn trong ứng dụng Cài đặt mỗi khi người dùng khởi chạy ứng dụng của tôi - chưa được bản địa hóa (ứng dụng của tôi chỉ bằng tiếng Anh). Tôi chấp nhận logic này:

  1. tạo một enum để giúp xử lý các ngôn ngữ trong mảng dễ dàng hơn

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
  2. tạo một vài phần mở rộng cho 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. Khi bạn cần, bạn chỉ cần sử dụng tiện ích mở rộng

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

Cảm ơn @Syscall :)
Miniapps

Yêu phần mở rộng :). Nó sẽ không có ý nghĩa hơn khi không trả lại nếu nó không thể đọc được bằng cách nào đó. bởi vì cách đó giá trị đó có thể được sử dụng để tạo ra một số giá trị.
Alix

5

Trong Swift, bạn có thể lấy miền địa phương bằng cách sử dụng.

let locale = Locale.current.identifier

2

Locale.current.languageCode trả về cho tôi mã sai, vì vậy tôi sử dụng các tiện ích mở rộng này:

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

Đây là những gì tôi sử dụng trong Swift 5 Xcode 11:

Bên trong các biến lớp:

let languagePrefix = Bundle.main.preferredLocalizations.first?.prefix(2)

Đây là một chuỗi. Nó trả về 2 ký tự, tức là "en", "es", "de" ...

Từ đây tôi có thể dễ dàng xác định ngôn ngữ nào sẽ hiển thị:

 if languagePrefix == "es" { self.flipCard.setTitle("última carta", for: .normal) }
 if languagePrefix == "en" { self.flipCard.setTitle("Last Card", for: .normal) }

Nếu bạn muốn thông tin đầy đủ của ngôn ngữ, sau đó xóa? .Prefex (2)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.