Lấy ngôn ngữ thiết bị hiện tại trong iOS?


430

Tôi muốn hiển thị ngôn ngữ hiện tại mà giao diện người dùng thiết bị đang sử dụng. Tôi sẽ sử dụng mã nào?

Tôi muốn điều này như là một NSStringđịnh dạng chính tả đầy đủ. (Không phải @ "en_US")

EDIT: Đối với những người lái xe trên, có rất nhiều bình luận hữu ích ở đây, vì câu trả lời đã phát triển với các bản phát hành iOS mới.


1
Điều này được tích hợp vào NSLocale. Xem câu trả lời của tôi.
Erik B

15
Nhận xét iOS9: chú ý đến thực tế là vì một số lý do kỳ lạ, Apple đã thay đổi định dạng được trả về [NSLocale preferredLanguages]. nó từng được phân tách bằng dấu gạch dưới (ví dụ en_US), nhưng bây giờ nó đã được thay đổi thành dấu gạch ngang:en-US
ishahak

7
Thông tin thêm về iOS9: Nhận [NSLocale ưa thích Ngôn ngữ] trên trình giả lập iOS 8.4 so với trình giả lập 9.0 cũng có sự khác biệt. Trên iOS 8.4, nó là "en" và iOS 9.0 là "en-US"
Kris Subramanian

Nhận xét này đã giúp tôi rất nhiều! Chúng tôi đã bị mắc kẹt với một vấn đề đơn giản tự hỏi điều gì đã xảy ra trong khoảng 1 giờ cho đến khi tôi thấy bình luận của bạn.
thandasoru

3
NSLocalecó các phương thức componentsFromLocaleIdentifier:localeIdentifierFromComponents:có lẽ là cách đúng để xử lý định dạng (có khả năng thay đổi).
Stewohn 9/2/2016

Câu trả lời:


807

Các giải pháp được cung cấp sẽ thực sự trả về khu vực hiện tại của thiết bị - không phải là ngôn ngữ hiện được chọn. Đây thường là một và giống nhau. Tuy nhiên, nếu tôi ở Bắc Mỹ và tôi đặt ngôn ngữ của mình thành tiếng Nhật, khu vực của tôi vẫn sẽ là tiếng Anh (Hoa Kỳ). Để truy xuất ngôn ngữ hiện được chọn, bạn có thể thực hiện:

NSString * language = [[NSLocale preferredLanguages] firstObject];

Điều này sẽ trả về mã hai chữ cái cho ngôn ngữ hiện được chọn. "En" cho tiếng Anh, "es" cho tiếng Tây Ban Nha, "de" cho tiếng Đức, v.v. Để biết thêm ví dụ, vui lòng xem mục Wikipedia này (cụ thể là cột 639-1):

Danh sách mã ISO 639-1

Sau đó, việc chuyển đổi hai mã chữ cái thành chuỗi bạn muốn hiển thị là một vấn đề đơn giản. Vì vậy, nếu đó là "en", hiển thị "Tiếng Anh".

Hy vọng điều này sẽ giúp ai đó đang tìm cách phân biệt giữa khu vực và ngôn ngữ hiện được chọn.

BIÊN TẬP

Đáng để trích dẫn thông tin tiêu đề từ NSLocale.h:

+ (NSArray *)preferredLanguages NS_AVAILABLE(10_5, 2_0); // note that this list does not indicate what language the app is actually running in; the [NSBundle mainBundle] object determines that at launch and knows that information

Những người quan tâm đến ngôn ngữ ứng dụng hãy xem câu trả lời của @ mindvision


2
Chính xác những gì tôi đang tìm kiếm. Tôi đã có cùng một vấn đề trong đó khu vực không giống như ngôn ngữ.
Jasarien

12
câu trả lời xấu: trả về zh-Hans cho tiếng Trung, không phải là mã iso.
cyrilchampier

2
Hai ký tự đầu tiên cung cấp cho quốc gia, nội dung sau dấu gạch ngang cung cấp cho khu vực, phần còn lại chỉ để thu hẹp phạm vi hơn nữa (chẳng hạn như phương ngữ địa phương). zh được liệt kê là mã iso cho tiếng Trung. Đối với những người tìm kiếm một ngôn ngữ cụ thể như tôi, hãy thử đăng ký IANA
Xono

3
zh-Hans là ngoại lệ duy nhất hoặc có các mã ngôn ngữ khác khác với tiêu chuẩn ISO 639-1?
MPaulo

57
Cảnh báo: trong iOS 9 , giá trị trả về củaNSLocale preferredLanguagesthay đổi. Nếu trước khi bạn chỉ nhận được "en", trong iOS 9, bạn sẽ nhận được "en-US" hoặc "en-JP", v.v. Tham khảo: happyteamlabs.com/blog/ Lỗi
Dj S

281

Câu trả lời được chọn trả về ngôn ngữ thiết bị hiện tại, nhưng không phải là ngôn ngữ thực tế được sử dụng trong ứng dụng. Nếu bạn không cung cấp bản địa hóa trong ứng dụng của mình cho ngôn ngữ ưa thích của người dùng, thì bản địa hóa đầu tiên có sẵn, được đặt hàng theo thứ tự ưu tiên của người dùng, sẽ được sử dụng.

Để khám phá ngôn ngữ hiện tại được chọn trong nội địa hóa của bạn, hãy sử dụng

[[NSBundle mainBundle] preferredLocalizations];

Thí dụ:

NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];

Nhanh:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString

Tuyệt vời, đây là những gì tôi đã quan tâm là tốt. Đã thử nghiệm và nó hoạt động chính xác!
smileyborg

5
hoàn hảo! nó cho phép tôi xây dựng các đường dẫn tài nguyên từ xa được bản địa hóa chỉ với các ngôn ngữ mà ứng dụng của tôi hỗ trợ theo thứ tự thích hợp hơn.
Yevhen Dubinin

Điều gì xảy ra nếu chúng ta muốn có được toàn bộ tên ngôn ngữ sau này?
Shabarinath Pabba

Nếu bạn muốn lấy toàn bộ tên ngôn ngữ từ ưu tiên Định vị, bạn có thể sử dụng [[NSLocale alloc] initWithLocaleIdentifier: ngôn ngữ] (từ phía trên). Sau đó, bạn có miền địa phương và có thể gọi displayNameForKey.
Vanessa Forney

87

Giải pháp cho iOS 9:

NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];

ngôn ngữ = "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

LanguageDic sẽ có các thành phần cần thiết

NSString *countryCode = [languageDic objectForKey:@"kCFLocaleCountryCodeKey"];

countryCode = "US"

NSString *languageCode = [languageDic objectForKey:@"kCFLocaleLanguageCodeKey"];

ngôn ngữCode = "vi"


5
kCFLocaleL LanguageCodeKey là hằng số xác định bạn có thể sử dụng thay vì tạo chuỗi của riêng mình.
SNyamathi

1
NSLocaleL LanguageCode = @ "kCFLocaleCountryCodeKey"
quạ

sử dụng NSLocaleCountryCode và NSLocaleL LanguageCode cho @ "kCFLocaleCountryCodeKey", @ "kCFLocaleL LanguageCodeKey", lặp đi lặp lại
quạ

65

Điều này có thể sẽ cung cấp cho bạn những gì bạn muốn:

NSLocale *locale = [NSLocale currentLocale];

NSString *language = [locale displayNameForKey:NSLocaleIdentifier 
                                         value:[locale localeIdentifier]];

Nó sẽ hiển thị tên của ngôn ngữ, trong chính ngôn ngữ. Ví dụ:

Français (France)
English (United States)

31
câu trả lời sai: điều này trả về ngôn ngữ, không phải ngôn ngữ, có thể khác ...
cyrilchampier

4
Điều này chắc chắn là sai, ví dụ nếu bạn đặt ngôn ngữ trong cài đặt điện thoại thành định dạng tiếng Anh và khu vực để cho phép nói tiếng Đức, tiếng Đức, ví dụ trên trả về "tiếng Đức". Ngôn ngữ điện thoại vẫn được đặt thành tiếng Anh.
jake_hetfield

2
Điều này không sai chút nào. Bản địa chứa cả thông tin ngôn ngữ và khu vực. Vì vậy, trong ví dụ của @ jake_hetfield, nó sẽ không trả về "Tiếng Đức", nó sẽ trả về "Tiếng Anh (Đức)". Điều này kết hợp với câu trả lời của dreamlab sẽ là câu trả lời chính xác.
SeanR

36

cảnh báoTất cả các câu trả lời được chấp nhận và các câu trả lời khác đều không tính đến việc ngôn ngữ ưa thích có thể là ngôn ngữ khác ngoài ngôn ngữ thiết bị .

Các ngôn ngữ điện thoại là ngôn ngữ, trong đó yếu tố hệ điều hành và các ứng dụng của Apple được trình bày.

Các ngôn ngữ ưa thích là ngôn ngữ người dùng muốn có các ứng dụng cục bộ tại. Apple chỉ cung cấp một bộ hạn chế về bản dịch. Nếu ngôn ngữ ưa thích là một ngôn ngữ mà Apple đã dịch ứng dụng của họ sang ngôn ngữ đó, thì đó cũng sẽ là ngôn ngữ thiết bị. Tuy nhiên, nếu người dùng thích ngôn ngữ mà Apple không cung cấp bản dịch thì thiết bị và ngôn ngữ ưa thích sẽ không phù hợp . Ngôn ngữ thiết bị sẽ không ở vị trí đầu tiên trong danh sách ngôn ngữ ưa thích.

Các chức năng sau đây sẽ đi qua danh sách ngôn ngữ ưa thích và kiểm tra xem có bản dịch nào trong các khung của Apple không. Ngôn ngữ đầu tiên có bản dịch là ngôn ngữ thiết bị. Hàm sẽ trả về mã ngôn ngữ của nó.

func deviceLanguage() -> String? {
    let systemBundle: NSBundle = NSBundle(forClass: UIView.self)
    let englishLocale: NSLocale = NSLocale(localeIdentifier: "en")

    let preferredLanguages: [String] = NSLocale.preferredLanguages()

    for language: String in preferredLanguages {
        let languageComponents: [String : String] = NSLocale.componentsFromLocaleIdentifier(language)

        guard let languageCode: String = languageComponents[NSLocaleLanguageCode] else {
            continue
        }

        // ex: es_MX.lproj, zh_CN.lproj
        if let countryCode: String = languageComponents[NSLocaleCountryCode] {
            if systemBundle.pathForResource("\(languageCode)_\(countryCode)", ofType: "lproj") != nil {
                // returns language and country code because it appears that the actual language is coded within the country code aswell
                // for example: zh_CN probably mandarin, zh_HK probably cantonese
                return language
            }
        }

        // ex: English.lproj, German.lproj
        if let languageName: String = englishLocale.displayNameForKey(NSLocaleIdentifier, value: languageCode) {
            if systemBundle.pathForResource(languageName, ofType: "lproj") != nil {
                return languageCode
            }
        }

        // ex: pt.lproj, hu.lproj
        if systemBundle.pathForResource(languageCode, ofType: "lproj") != nil {
            return languageCode
        }
    }

    return nil
}

Điều này hoạt động nếu danh sách ngôn ngữ ưa thích là:

  1. Tiếng Nam Phi (iOS không được dịch sang tiếng Nam Phi)
  2. Tiếng Tây Ban Nha (Ngôn ngữ thiết bị)

Các danh sách ngôn ngữ ưa thích có thể chỉnh sửa trong : Settings.app -> General -> Language & Region -> Preferred Language thứ tự


Bạn có thể sử dụng mã ngôn ngữ thiết bị và dịch nó thành tên ngôn ngữ. Các dòng sau sẽ in ngôn ngữ thiết bị bằng ngôn ngữ thiết bị. Ví dụ: "Español" nếu thiết bị được đặt thành tiếng Tây Ban Nha.

if let deviceLanguageCode: String = deviceLanguage() {
    let printOutputLanguageCode: String = deviceLanguageCode
    let printOutputLocale: NSLocale = NSLocale(localeIdentifier: printOutputLanguageCode)

    if let deviceLanguageName: String = printOutputLocale.displayNameForKey(NSLocaleIdentifier, value: deviceLanguageCode) {
        // keep in mind that for some localizations this will print a language and a country
        // see deviceLanguage() implementation above
        print(deviceLanguageName)
    }
} 

Tôi hiểu rằng bằng cách khởi tạo thể hiện gói của bạn với việc NSBundle(forClass: UIView.self)bạn đang cố gắng cung cấp ngôn ngữ cụ thể nhất cho một chế độ xem cụ thể. Tuy nhiên, bằng cách sử dụng này, tôi gặp phải một vấn đề trong đó đối với lớp đã cho, một ngôn ngữ không được trả về. Tôi đã thay đổi việc khởi tạo thành NSBundle.mainBundle()và được trả lại mã ngôn ngữ dự kiến.
palmi

Làm rõ: Khởi bó với mainBundle()dường như là một trong những khuyến cáo của Apple như đề nghị trong tiêu đề cho NSLocale, // note that this list does not indicate what language the app is actually running in; the [NSBundle mainBundle] object determines that at launch and knows that information.
palmi

@Pouria NSBundle.mainBundle()trả về gói ứng dụng của bạn, trong khi NSBundle(forClass: UIView.self)trả về gói UIKit của hệ thống. phương pháp được mô tả tìm kiếm các thư mục trong gói. gói ứng dụng của bạn sẽ chỉ chứa những ngôn ngữ cho ngôn ngữ bạn định địa phương hóa. để xác định ngôn ngữ thiết bị, bạn sẽ cần kiểm tra gói hệ thống.
dreamlab

1
@Pouria vấn đề có thể là iOS 9 đã thay đổi giá trị trả về từ đó NSLocale.preferredLanguages(). tôi đã cập nhật câu trả lời để hỗ trợ iOS 9 .
dreamlab

@dreamlab không may, cách tiếp cận này cho kết quả dương tính giả khi bạn bao gồm các thành phần của bên thứ 3, chẳng hạn như nhóm, với các bản địa hóa mà bạn không hỗ trợ trong cài đặt dự án.
kokoko

12

tôi dùng cái này

    NSArray *arr = [NSLocale preferredLanguages];
for (NSString *lan in arr) {
    NSLog(@"%@: %@ %@",lan, [NSLocale canonicalLanguageIdentifierFromString:lan], [[[NSLocale alloc] initWithLocaleIdentifier:lan] displayNameForKey:NSLocaleIdentifier value:lan]);
}

bỏ qua rò rỉ bộ nhớ ..

và kết quả là

2013-03-02 20:01:57.457 xx[12334:907] zh-Hans: zh-Hans 中文(简体中文)
2013-03-02 20:01:57.460 xx[12334:907] en: en English
2013-03-02 20:01:57.462 xx[12334:907] ja: ja 日本語
2013-03-02 20:01:57.465 xx[12334:907] fr: fr français
2013-03-02 20:01:57.468 xx[12334:907] de: de Deutsch
2013-03-02 20:01:57.472 xx[12334:907] nl: nl Nederlands
2013-03-02 20:01:57.477 xx[12334:907] it: it italiano
2013-03-02 20:01:57.481 xx[12334:907] es: es español

chỉ vì tò mò, bộ nhớ bị rò rỉ ở đâu đây?
Có thể Poyrazoğlu

Rò rỉ - [[[NSLocale alloc] initWithLocaleIdentifier: lan].
Pavel

1
Chỉ dành cho các dự án không ARC.
Josh Hinman

12

Dịch mã ngôn ngữ như en_US sang tiếng Anh (Hoa Kỳ) là một tính năng được tích hợp sẵn NSLocaleNSLocalekhông quan tâm bạn lấy mã ngôn ngữ từ đâu. Vì vậy, thực sự không có lý do để thực hiện bản dịch của riêng bạn như câu trả lời được chấp nhận cho thấy.

// Example code - try changing the language codes and see what happens
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"];
NSString *l1 = [locale displayNameForKey:NSLocaleIdentifier value:@"en"];
NSString *l2 = [locale displayNameForKey:NSLocaleIdentifier value:@"de"];
NSString *l3 = [locale displayNameForKey:NSLocaleIdentifier value:@"sv"];
NSLog(@"%@, %@, %@", l1, l2, l3);

Bản in: tiếng Anh, tiếng Đức, tiếng Thụy Điển


1
Trên thực tế, bạn nên sử dụng [NSLocale autoupdatingCiverseLocale] để khởi tạo thể hiện ngôn ngữ của bạn. Bằng cách đó, tên ngôn ngữ sẽ được hiển thị bằng ngôn ngữ bản địa của người dùng. Ví dụ, tiếng Thụy Điển sẽ trở thành Svenska.
Maciej Swic

8

Thậm chí có một cách tốt hơn để có được ngôn ngữ thiết bị hiện tại. Hãy thử mã bên dưới -

NSLog(@"Current Language - %@", [[NSLocale preferredLanguages] firstObject]);

Được đề xuất bởi Abizern trên đây


7

Bạn có thể sử dụng displayNameForKey:value:phương pháp NSLocale:

// get a French locale instance
NSLocale *frLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"] autorelease];

// use it to get translated display names of fr_FR and en_US
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"]);
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"]);

Điều này sẽ in ra:

français (France)
anglais tats-Unis)

Nếu bạn chỉ định cùng một mã định danh miền cho phương thức initWithLocaleIdentifier:và cũng là displayNameForKey:value:phương thức, thì nó sẽ cung cấp cho bạn tên gốc của ngôn ngữ. Tôi đã phát hiện ra rằng nếu bạn xóa mã quốc gia và chỉ sử dụng fren, nó cũng sẽ bỏ qua quốc gia khỏi tên hiển thị (ít nhất là trên Mac OS X, không chắc chắn về iOS).


6

Nhanh

Để có được ngôn ngữ hiện tại của thiết bị

NSLocale.preferredLanguages()[0] as String

Để có được ngôn ngữ ứng dụng

NSBundle.mainBundle().preferredLocalizations[0] as NSString

Ghi chú:

Nó tìm nạp ngôn ngữ mà bạn đã đưa ra trong CFBundleDevelopmentRegion của info.plist

nếu CFBundle ALLowMixedLocalizes là đúng trong info.plist thì mục đầu tiên của CFBundleLocalifying trong info.plist được trả về


6

Tôi đã cố gắng tìm ra giải pháp phù hợp cho bản thân mình. Khi tôi sử dụngLocale.preferredLanguages.first đã được trả lại ngôn ngữ ưa thích từ cài đặt ứng dụng của bạn.

Nếu bạn muốn biết ngôn ngữ từ cài đặt thiết bị người dùng, bạn nên sử dụng chuỗi bên dưới:

Swift 3

let currentDeviceLanguage = Locale.current.languageCode
// Will return the optional String

Để mở khóa và sử dụng nhìn vào dòng dưới đây:

if let currentDeviceLanguage = Locale.current.languageCode {
    print("currentLanguage", currentDeviceLanguage)

    // For example
    if currentDeviceLanguage == "he" {
        UIView.appearance().semanticContentAttribute = .forceRightToLeft
    } else {
        UIView.appearance().semanticContentAttribute = .forceLeftToRight
    }
}

bạn don; t phải Unwrap nếu bạn sử dụng Bundle.main.preferredLocalizations này [0] như String
μολὼν.λαβέ

5

Để có được ngôn ngữ hiện tại của thiết bị người dùng, hãy sử dụng mã sau đây, nó hoạt động với tôi.

NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];

4

iOS13, Swift 5+, WWDC2019 https://developer.apple.com/ideo/play/wwdc2019/403/

Người dùng có thể chọn ngôn ngữ ưa thích của ứng dụng một cách độc lập với ngôn ngữ HĐH.

Bạn có thể sử dụng những thứ này:

    // Returns a list of the user's preferred languages.
    // Maybe more than (or none of) your app supports!
    Locale.preferredLanguages

    // a subset of this bundle's localizations, re-ordered into the preferred order
    // for this process's current execution environment; the main bundle's preferred localizations
    // indicate the language (of text) the user is most likely seeing in the UI
    Bundle.main.preferredLocalizations



    // The current running app language
    Bundle.main.preferredLocalizations.first

    // list of language names this bundle appears to be localized to
    Bundle.main.localizations

3

Đối với các nhà phát triển MonoTouch C # sử dụng:

NSLocale.PreferredLanguages.FirstOrDefault() ?? "en"

Lưu ý: Tôi biết đây là một câu hỏi dành cho iOS, nhưng vì tôi là nhà phát triển MonoTouch, câu trả lời trên trang này đã đưa tôi đi đúng hướng và tôi nghĩ tôi sẽ chia sẻ kết quả.


Tôi hiện đang sử dụng NSLocale.PreferredLacular và tôi đang nhận được một mảng trống. Tôi cho rằng bạn đã đọc trong tài liệu rằng nó có thể không bao giờ trống nhưng tôi không thể thấy điều này ở bất cứ đâu?
JFoulkes

Không, thành thật mà nói đó chỉ là giả định của riêng tôi.
Chuck Savage

@LarryF Xem video này: jonas.follesoe.no/2011/07/22/cross-pl platform-mobile-ndc-2011 Rất nhiều thông tin về cách cấu trúc mã / ứng dụng đa nền tảng của bạn.
Chuck Savage

3

Trong Swift:

let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String

3

Swift 3

let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)

Chào mừng bạn đến với Stack Overflow! Mặc dù đoạn mã này có thể trả lời câu hỏi, tốt hơn là bao gồm một mô tả về vấn đề là gì và cách mã của bạn sẽ giải quyết vấn đề đã cho. Trong tương lai, đây là một số thông tin, làm thế nào để bẻ khóa một câu trả lời tuyệt vời trên Stack Overflow.
Dirtdanee

3

Chức năng Swift 3 đơn giản:

  @discardableResult
  func getLanguageISO() -> String {
    let locale = Locale.current
    guard let languageCode = locale.languageCode,
          let regionCode = locale.regionCode else {
        return "de_DE"
    }
    return languageCode + "_" + regionCode
  }

3

Nếu bạn đang tìm mã ngôn ngữ ưa thích ("en", "de", "es" ...) và tên ngôn ngữ ưa thích được bản địa hóa (cho ngôn ngữ hiện tại), thì đây là một tiện ích mở rộng đơn giản trong Swift:

extension Locale {
static var preferredLanguageIdentifier: String {
    let id = Locale.preferredLanguages.first!
    let comps = Locale.components(fromIdentifier: id)
    return comps.values.first!
}

static var preferredLanguageLocalizedString: String {
    let id = Locale.preferredLanguages.first!
    return Locale.current.localizedString(forLanguageCode: id)!
}

}


2
-(NSString *)returnPreferredLanguage { //as written text

NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
NSArray *preferredLanguages = [defaults objectForKey:@"AppleLanguages"];
NSString *preferredLanguageCode = [preferredLanguages objectAtIndex:0]; //preferred device language code
NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"]; //language name will be in English (or whatever)
NSString *languageName = [enLocale displayNameForKey:NSLocaleIdentifier value:preferredLanguageCode]; //name of language, eg. "French"
return languageName;

}

2

Nếu bạn muốn chỉ có ngôn ngữ ở đây là câu trả lời được đề xuất của tôi:

NSString *langplusreg = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString * langonly = [[langplusreg componentsSeparatedByString:@"-"] 
objectAtIndex:0];

Trong trường hợp của tôi, tôi chỉ muốn ngôn ngữ miền địa phương chứ không phải miền địa phương.

Đầu ra: Nếu ngôn ngữ Địa phương của bạn là tiếng Nhật và khu vực địa phương là Nhật Bản thì:

langplusreg = ja-JP

langonly = ja


1

Phản hồi @amir trong Swift:

// Get language prefered by user
    let langageRegion = NSLocale.preferredLanguages().first!
    let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
    let language = languageDic[NSLocaleLanguageCode]

1

Rõ ràng, các giải pháp dựa vào, ví dụ, trên

[[NSLocale preferredLanguages] objectAtIndex:0]

thường hoạt động tốt và trả lại ngôn ngữ thiết bị hiện tại.

Nhưng nó có thể gây hiểu nhầm trong một số trường hợp:

Nếu ứng dụng mà bạn muốn nhận giá trị này đã thay đổi ngôn ngữ, ví dụ như với loại mã này:

NSString *lg = @"en"; // or anything like @"en", @"fr", etc.
[[NSUserDefaults standardUserDefaults] 
    setObject:[NSArray arrayWithObjects:lg, nil]  
    forKey:@"AppleLanguages"]

Trong trường hợp này, [NSLocale ưa thích Ngôn ngữ ] thực sự trả về bộ ngôn ngữ ưa thích (và được sử dụng) trong ứng dụng cụ thể này, không phải ngôn ngữ thiết bị hiện tại!

Và ... trong trường hợp này, cách duy nhất để có được ngôn ngữ thiết bị hiện tại thực sự (và không phải là ngôn ngữ được thiết lập trước đó trong ứng dụng), trước tiên là xóa khóa @ "appleLacular" trong NSUserDefaults, như thế này:

[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"];

Sau đó, [NSLocale ưa thích Ngôn ngữ] bây giờ trả về giá trị chính xác.

Hy vọng điều này giúp đỡ.


1

Cập nhật câu trả lời cho Swift 4

let language = Bundle.main.preferredLocalizations.first

Lưu ý rằng điều này tìm nạp danh sách tổng hợp có sẵn (được hỗ trợ bởi gói tức là bạn) và địa phương ưa thích (bởi người dùng). NSLocale.preferredLanguagesnên trả lại những cái ưa thích của người dùng mà không phải tôn trọng những gì được gói hỗ trợ.
Jonny

1

Đối với Swift 3.0, mã bên dưới có thể được sử dụng để trả lời câu hỏi của bạn:

 let language = Bundle.main.preferredLocalizations.first! as NSString

1

Trong Swift 4.2 và Xcode 10.1

let language = NSLocale.preferredLanguages[0]
print(language)//en

0

Theo tài liệu của Apple

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];


0

Dành cho Swift 3:

NSLocale.preferredLacular [0] dưới dạng Chuỗi


0

Kể từ iOS 9, nếu bạn chỉ muốn mã ngôn ngữ không có mã quốc gia, bạn sẽ muốn loại chức năng trợ giúp này - vì ngôn ngữ sẽ chứa mã quốc gia.

// gets the language code without country code in uppercase format, i.e. EN or DE
NSString* GetLanguageCode()
{
    static dispatch_once_t onceToken;
    static NSString* lang;
    dispatch_once(&onceToken, ^
    {
        lang = [[[NSLocale preferredLanguages] objectAtIndex:0] uppercaseString];
        NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"^[A-Za-z]+" options:0 error:nil];
        NSTextCheckingResult* match = [regex firstMatchInString:lang options:0 range:NSMakeRange(0, lang.length)];
        if (match.range.location != NSNotFound)
        {
            lang = [lang substringToIndex:match.range.length];
        }
    });
    return lang;
}

0

SW-4

 // To get device default selected language. It will print like short name of zone. For english, en or spain, es.



let language = Bundle.main.preferredLocalizations.first! as NSString
    print("device language",language)

Lưu ý rằng điều này tìm nạp danh sách tổng hợp có sẵn (được hỗ trợ bởi gói tức là bạn) và địa phương ưa thích (bởi người dùng). NSLocale.preferredLanguagesnên trả lại những cái ưa thích của người dùng mà không phải tôn trọng những gì được gói hỗ trợ.
Jonny
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.