2012-01-08 24 views
6

在我的界面我展示一個區域的顯示名稱與此:NSLocale

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

但這使用該系統並不總是相同的語言環境給人的顯示名稱作爲應用程序的語言環境。例如,如果我使用法語設置我的系統,並且我的應用程序沒有法語本地化,則它會在英文界面顯示法語顯示名稱。相反,我想在英文界面有英文顯示名稱,所以我不會混合使用各種語言。

+0

確實[此潛在的相關問題](http://stackoverflow.com/questions/1522210/always-returns-en-us-not-users-current-language)幫助你了嗎? – 2012-01-08 19:57:08

+0

好吧,我可以得到我的應用程序支持'[NSLocale preferredLanguages]'最喜歡的語言',以確定哪些被使用,但這不是我想的理想解決方案... – Jef 2012-01-08 20:12:02

回答

3

我不知道這是否是你想要的...但是,這是看什麼語言/本地化您的應用程序在運行的好方法:

[[NSBundle mainBundle] preferredLocalizations] 

如果您的應用程序同時支持英語和法語語言,它將以首選順序返回一個數組。在測試中,0處的那個似乎是加載並運行的xib。

3

您應該創建一個plist文件,您可以在plist存儲中本地化相應本地化的正確區域標識符,當您使用代碼段時,應該從該本地化plist文件加載區域設置並使用該文件獲取顯示名稱。

這樣,您的語言環境將始終與屏幕界面語言相對應。我需要一些日期我想要的格式做到這一點,而不是靠制度作爲日曆格式可以用另一種語言系統中設置...

希望幫助...

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;  
} 

並使用它像這樣:

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

爲了避免這些區域設置字符串中的風險正在進入被拼錯等,或者如果你想更好的面向代碼的解決方案,當然你可以在plist中使用一個名爲「default_language」的屬性作爲BOOL,並將其設置爲YES,僅在英文中,在代碼中檢查該值,如果是NO,則獲取設備語言環境它是YES,那麼你知道該應用程序是英文的,因爲這是設備設置,或者是英文,因爲它不支持設備的當前區域設置,因此默認情況下已經回到英文版了......所以應該「default_language」爲YES,將語言環境硬編碼爲en_US,或者en_UK,如果你愛國brit ...

沿着這個例子的行可能會解決你的問題,NSLocale類,但當然這會讓您需要針對您支持的每種語言進行本地化plist ...

@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

這是一種可能性,然而在我眼中相當醜陋的。這比在Localizable.strings中放置所有語言要好,但不如代碼解決方案好。如果沒有其他答案會被給予,那麼我會接受這一個。 – Jef 2012-01-08 20:25:06

+0

瞭解到,真正的挑戰在於,您需要了解應用程序的區域設置,而不是設備,因爲如果您使用設備設置爲法語的設備進入應用程序,但是您的應用程序僅支持英語和西班牙語,應用程序語言環境可以說默認爲英語,但該設備是法語。因此,我相信如果Cocoa API中沒有這樣的選項,您將不會有任何其他選擇,只能通過本地化文件進行此操作。 – Daniel 2012-01-08 20:50:15

+0

您當然可以在plist中使用名爲「default_language」的屬性作爲BOOL,並將其設置爲YES僅適用於英語,在您的代碼中只檢查該值,如果它是NO,則獲取設備語言環境,如果是YES ,那麼你知道應用程序是英文的,因爲那是設備設置,或者是英文,因爲它不支持設備的當前語言環境,因此默認情況下已經回到英語......所以應該「default_language」是YES,將語言環境硬編碼爲en_US,或者en_UK,如果您是愛國brit ...希望角度的思想可以幫助 – Daniel 2012-01-08 20:55:35

相關問題