NSLocale currentLocale luôn trả về “en_US” không phải ngôn ngữ hiện tại của người dùng


82

Tôi đang trong quá trình quốc tế hóa một ứng dụng iPhone - tôi cần thực hiện các thay đổi có lập trình đối với các chế độ xem nhất định dựa trên ngôn ngữ hiện tại của người dùng. Tôi đang phát điên lên vì bất kể tùy chọn ngôn ngữ trên trình mô phỏng iPhone hoặc phần cứng thực tế là gì, localeluôn được đánh giá là "en_US":

NSString *locale = [[NSLocale currentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);

Điều điên rồ là phần còn lại của ứng dụng hoạt động như mong đợi. Các chuỗi chính xác được chọn từ tệp Localization.strings và được sử dụng trong giao diện và các tệp .xib chính xác cho ngôn ngữ đã chọn được sử dụng.

Tôi cũng đã thử những cách sau, nhưng không có kết quả và cùng một kết quả:

NSString *locale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);

Có điều gì đơn giản mà tôi đang thiếu không? Có thể là một sở thích hay một nhập khẩu?

Những gì tôi đã từng làm:

Như câu trả lời của Darren gợi ý, sở thích mà tôi đang tìm kiếm không nằm ở đó NSLocale, thay vào đó là ở đây:

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSArray* languages = [userDefaults objectForKey:@"AppleLanguages"];
NSString* preferredLanguage = [languages objectAtIndex:0];
NSLog(@"preferredLanguage: %@", preferredLang);

Câu trả lời của Peter dường như là một giải pháp tốt hơn:

NSArray* preferredLanguages = [NSLocale preferredLanguages];
NSLog(@"preferredLanguages: %@", preferredLanguages);

Câu trả lời:


36

Thay vì truy vấn trực tiếp các giá trị mặc định bằng cách sử dụng khóa không có tài liệu, hãy hỏi lớp NSLocale về mảng các ngôn ngữ ưu tiên .


@PeterHosey Tôi cũng gặp sự cố tương tự về ngôn ngữ hiện tại và đã thử mọi thứ, nhưng không có cách nào trong số đó hoạt động. Thật buồn ... Bạn có thể xem cái này không, stackoverflow.com/questions/26572115/… ? Cảm ơn!
S1U

@ s1u Có một lỗi trong Xcode 6.1. Kiểm tra câu trả lời này: stackoverflow.com/a/26641497/1085556
Bart van Kuik

@ s1u: Vài điều: (1) Có thể có nhiều ngôn ngữ ưu tiên; không có “ngôn ngữ hiện tại” duy nhất và (2) liên quan đến câu trả lời (đã xóa) của bạn, trả về ngôn ngữ chính của ngôn ngữ hiện tại (hay còn gọi là khu vực), không phải ngôn ngữ ưa thích của người dùng.
Peter Hosey

2
Các AppleLanguageschìa khóa không được cung cấp tài liệu, đó là cách duy nhất để có được tài liệu ngôn ngữ ưa thích của người dùng trên hệ thống trước khi OS X 10.5 (trong đó, những ngày này là rất hiếm, nhưng vẫn còn, được ghi nhận ).
dreamlax

58

[NSLocale currentLocale]dựa trên cài đặt Định dạng khu vực của thiết bị, không phải ngôn ngữ. Nếu khu vực được đặt thành United States, bạn sẽ nhận được en_US bất kể bạn đang sử dụng ngôn ngữ nào.


Cảm ơn Darren, điều đó đã giúp tôi bắt đầu, tôi cũng đã tìm ra cách để có được cài đặt ngôn ngữ hiện tại, đó là điều tôi thực sự đang cố gắng làm.
prairiedogg

2
Xin chào Prairiedogg, làm cách nào bạn có được cài đặt ngôn ngữ hiện tại? tôi cũng gặp vấn đề tương tự..tất cả đều trả về giá trị EN cho ngôn ngữ.
Zaldy

@ZaldzBugz: đại loại như: NSLocale * locale = [NSLocale currentLocale]; NSString * lang = [locale displayNameForKey: NSLocaleIdentifier value: [[NSLocale preferLanguages] objectAtIndex: 0]];
powerj1984

3
đây không phải là trường hợp trên iOS 8. iOS 8 sẽ trả về "de_US" nếu ngôn ngữ của bạn là tiếng Đức và khu vực của bạn là Hoa Kỳ. đó là những gì nó phải làm.
odyth

Khu vực có được tự động cập nhật khi người dùng, chẳng hạn, đến Úc không?
Nagendra Rao


9

Đối với chúng tôi, vấn đề là chúng tôi đã ghi đè ngôn ngữ ứng dụng và vùng ứng dụng trong chương trình phát triển của chúng tôi. Đảm bảo rằng Ngôn ngữ ứng dụng được đặt thành Ngôn ngữ hệ thống trong tùy chọn lược đồ (Chỉnh sửa lược đồ -> Tùy chọn).


Cảm ơn Simon đã chỉ ra khía cạnh này ... Để thử nghiệm, tôi đã đặt nó thành ngôn ngữ địa phương và tôi đã quên thay đổi nó sau đó.
Ameer

Điều đó là vậy đó! Không thể tin rằng đó là một cài đặt Xcode đã làm rối tung nó.
Pedro

Điều này đã cứu thịt xông khói của tôi! Cảm ơn.
Kirby Todd

4

đối với tôi, cả hai

NSString *localeString = [[NSLocale currentLocale] localeIdentifier];

NSArray *array = [NSLocale preferredLanguages];
self.label.text = array[0];

mang lại kết quả tương tự khi bạn ở trong trình mô phỏng.


2
Thật vậy, trong trường hợp của tôi, trên iOS 8 / Xcode 6 luôn luôn là en_US
Adrian

3

Tôi đã gặp sự cố khi định dạng tên tháng xuất hiện bằng tiếng Anh trên một thiết bị được đặt thành ngôn ngữ Pháp.

Giải pháp của tôi là sử dụng cái này:

    NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ];
    [self.monthNameFormatter setLocale:locale];
    [self.monthNameFormatter setDateFormat:@"MMMM"];
    [self.monthNameFormatter stringFromDate:myDate];

Tôi thấy rằng [NSLocale currentLocale] đang dịch tên tháng sang tiếng Pháp đúng cách trong iOS10 nhưng không phải trong iOS11. Sử dụng: NSLocale * locale = [NSLocale localeWithLocaleIdentifier: [[NSLocale preferLanguages] objectAtIndex: 0]]; đã khắc phục sự cố. Cảm ơn Ben +1
birdman

2

tôi thấy rằng nếu tôi bỏ "en_US" nhưng có bản địa hóa "en" là bản sao của "en_US" thì trình mô phỏng sẽ tự động bắt đầu tôn trọng cài đặt ngôn ngữ, nhưng ngay khi "en_US" là một tùy chọn, nó sẽ luôn chọn nó bất kể của cài đặt.


1

Câu hỏi đã quá cũ, nhưng mã này có thể giúp ích cho nhiều người:

Main.m sẽ trông như thế này:

    NSString *localecode=[[NSLocale currentLocale] localeIdentifier];
    localecode=[localecode substringToIndex:2]; //en_GB -> en
    NSArray *arr = [NSLocale preferredLanguages];
    NSMutableArray * mutable = [arr mutableCopy];
    NSString *prefered = [mutable firstObject];
    if(![localecode isEqualToString:prefered]){
        if(![prefered isEqualToString:@"es"] && ![prefered isEqualToString:@"en"] && ![prefered isEqualToString:@"pt"]){
            int index = [mutable indexOfObject:@"en"];
            [mutable replaceObjectAtIndex:0 withObject:@"en"];
            [mutable replaceObjectAtIndex:index withObject:prefered];
            [[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"];

        }
        else{
            int index = [mutable indexOfObject:localecode];
            [mutable replaceObjectAtIndex:0 withObject:localecode];
            [mutable replaceObjectAtIndex:index withObject:prefered];
            [[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"];
        }
    }
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

Làm gì đây? Nếu ngôn ngữ hiện tại của thiết bị là tiếng Tây Ban Nha, tiếng Anh hoặc tiếng Bồ Đào Nha, ứng dụng sẽ sử dụng các chuỗi được bản địa hóa, ngược lại nếu ngôn ngữ hiện tại không phải là một trong những ngôn ngữ đó và không được ứng dụng hỗ trợ thì được đặt thành tiếng Anh.


0

Nó hiển thị ngôn ngữ chính xác khi ở trên iPad thực. Tuy nhiên, trình mô phỏng có iOS của riêng nó, theo mặc định được đặt thành en-US. Đi tới tùy chọn iOS giả lập và chuyển ngôn ngữ và khu vực sang ngôn ngữ và khu vực bạn muốn.

Đó là thủ thuật.

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.