2012-01-08 24 views
6

Trong giao diện của tôi, tôi đang thấy tên hiển thị của một miền địa phương với điều này:NSLocale của ngôn ngữ được nạp trong ứng dụng

[[NSLocale currentLocale] displayNameForKey: NSLocaleIdentifier value: identifier] 

Nhưng điều này mang lại tên hiển thị bằng cách sử dụng bản địa của hệ thống mà không phải lúc nào cũng giống nhau làm ngôn ngữ của ứng dụng. Ví dụ: nếu tôi đặt hệ thống của mình bằng tiếng Pháp và ứng dụng của tôi không có bản địa hóa tiếng Pháp, nó sẽ đặt tên hiển thị bằng tiếng Pháp trong giao diện tiếng Anh. Thay vào đó tôi muốn có một tên hiển thị tiếng Anh trong một giao diện tiếng Anh vì vậy tôi không trộn lẫn các ngôn ngữ.

+0

không [câu hỏi có khả năng liên quan này] (http://stackoverflow.com/questions/1522210/always-returns-en-us-not-users-current-language) giúp bạn ra ở tất cả? –

+0

tốt, tôi có thể nhận được các ngôn ngữ ưa thích nhất ứng dụng của tôi hỗ trợ của '[NSLocale preferredLanguages]' để xác định được sử dụng nhưng đó không phải là giải pháp lý tưởng Tôi nghĩ ... – Jef

Trả lời

3

Tôi không chắc chắn nếu điều này là những gì bạn muốn ... Nhưng đây là một cách tuyệt vời để xem những gì ngôn ngữ/địa phương hóa ứng dụng của bạn đang chạy trong:

[[NSBundle mainBundle] preferredLocalizations] 

Nếu bạn ứng dụng hỗ trợ cả tiếng Anh và tiếng Pháp ngôn ngữ, nó sẽ trả về một mảng của cả hai theo thứ tự ưa thích. Khi thử nghiệm, một tại 0 có vẻ là xib được tải và chạy.

3

Bạn nên tạo tệp plist mà bạn bản địa hóa, trong kho lưu trữ định danh địa phương chính xác cho nội địa hóa tương ứng, khi bạn sử dụng đoạn mã của mình, bạn nên tải ngôn ngữ từ tệp plist được bản địa hóa đó và sử dụng tên hiển thị.

Bằng cách đó, ngôn ngữ của bạn sẽ luôn tương ứng với ngôn ngữ giao diện trên màn hình. Tôi cần phải làm điều này cho một số ngày tôi muốn định dạng, và không phụ thuộc vào hệ thống như là định dạng lịch có thể được thiết lập trong một ngôn ngữ khác vào hệ thống ...

hy vọng rằng sẽ giúp ...

enter image description here

- (NSDictionary*)getLocalizedCalendarStrings{ 
    NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"calendar" ofType:@"plist"]; // will return the path of the plist in the right language-specific .lproj directory) 
    NSDictionary* calendar = [NSDictionary dictionaryWithContentsOfFile:plistPath]; 
    return calendar;  
} 

Và sử dụng nó như vậy:

NSDictionary * calendar = [self getLocalizedCalendarStrings]; 
NSString * localeIdentifier = [calendar objectForKey:@"locale_identifier"]; 
[[NSLocale currentLocale] displayNameForKey: NSLocaleIdentifier value: localeIdentifier] 

Để tránh rủi ro của những chuỗi locale được nhập bị viết sai thành vv, hoặc nếu bạn muốn có một tốt hơn hướng đang giải pháp, bạn có thể sử dụng tất nhiên một tài sản có tên là "default_language" như một BOOL trong plist và đặt nó là YES chỉ dành cho tiếng Anh, trong mã của bạn chỉ cần kiểm tra giá trị này và nếu nó là NO, sau đó nhận được các thiết bị địa phương, nên nó là YES, sau đó bạn biết rằng ứng dụng bằng tiếng Anh vì đó là cài đặt thiết bị hoặc bằng tiếng Anh vì nó không hỗ trợ ngôn ngữ hiện tại của thiết bị và do đó đã giảm trở lại tiếng Anh theo mặc định ... vì vậy nên "default_language" là YES, mã hóa cứng miền địa phương thành en_US, hoặc en_UK nếu bạn là người yêu nước ...

Ví dụ này có thể giải quyết vấn đề của bạn, một danh mục cho NSLocale, nhưng tất nhiên điều này sẽ làm cho bạn cần phải có một plist bản địa hóa cho từng ngôn ngữ bạn hỗ trợ ...

@implementation NSLocale (AppLocale) 

+(NSString*)applicationCurrentLocale{ 
    NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"currentLocale" ofType:@"plist"]; 
    NSDictionary* currentLocaleData = [NSDictionary dictionaryWithContentsOfFile:plistPath]; 

    if([[currentLocaleData objectForKey:@"english_default"] boolValue] == YES){ 
     return @"en_US"; 
    }else{ 
     NSString * deviceLocaleIdentifier = [[NSLocale currentLocale] localeIdentifier]; 
     return [[NSLocale currentLocale] displayNameForKey:NSLocaleIdentifier value:deviceLocaleIdentifier]; 
    } 
} 

@end 
+0

Đây là một khả năng, tuy nhiên trong mắt tôi khá là một xấu xí . Đó là tốt hơn so với đặt tất cả các ngôn ngữ trong Localizable.strings nhưng không tốt như một giải pháp mã-only. Nếu không có câu trả lời nào khác sẽ được đưa ra thì tôi sẽ chấp nhận câu trả lời này. – Jef

+0

Đã hiểu, thách thức thực sự ở đây là bạn cần phải biết địa phương của ứng dụng, không phải thiết bị, vì nếu bạn truy cập ứng dụng bằng thiết bị được đặt sang tiếng Pháp, nhưng ứng dụng của bạn chỉ hỗ trợ tiếng Anh và tiếng Tây Ban Nha , ngôn ngữ ứng dụng để nói sẽ mặc định là tiếng Anh, nhưng thiết bị là tiếng Pháp. Vì vậy, tôi tin rằng nên một lựa chọn như vậy không có sẵn trong API Cocoa, bạn sẽ không có bất kỳ tùy chọn nào khác ngoài việc đi qua các tệp được bản địa hóa cho việc này. – Daniel

+0

Tất nhiên, bạn có thể sử dụng một thuộc tính có tên là "default_language" như là một BOOL trong plist và đặt nó thành YES chỉ cho tiếng Anh, trong mã của bạn chỉ cần kiểm tra giá trị này và nếu nó là NO, sau đó lấy miền địa phương thiết bị, thì bạn biết rằng ứng dụng bằng tiếng Anh vì đó là cài đặt thiết bị hoặc bằng tiếng Anh vì nó không hỗ trợ ngôn ngữ hiện tại của thiết bị và do đó đã giảm trở lại tiếng Anh theo mặc định ... vì vậy nên "default_language" CÓ, mã hóa cứng miền địa phương với en_, hoặc en_UK nếu bạn là người yêu nước ... hy vọng góc suy nghĩ đó sẽ giúp – Daniel

Các vấn đề liên quan