2009-10-05 60 views
74

我正在對iPhone應用程序進行國際化 - 我需要根據用戶當前的語言環境對某些視圖進行編程更改。我要瘋了,因爲不管是什麼在iPhone模擬器或實際硬件的語言首選項是,locale始終計算爲「en_US」:NSLocale currentLocale總是返回「en_US」而不是用戶當前的語言

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

瘋狂的事情是,應用程序的其餘部分按預期運行。從Localization.strings文件中選擇正確的字符串並在接口中使用,並使用所選語言環境的正確.xib文件。

我也曾嘗試以下,無果而具有相同的結果:

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

有一些簡單的我失蹤?可能有偏好還是導入?

我用來做:

由於達倫的答案表明,我正在尋找的偏好是不是NSLocale,而它是在這裏:

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

彼得的答案似乎是更好的解決方案:

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

回答

33

而不是直接使用未記錄的密鑰查詢默認值,ask the NSLocale class for the array of preferred languages

+0

@PeterHosey我也有類似的問題關於當前的語言,並嘗試了一切,但沒有人工作。所以傷心...你可以看看這個,http://stackoverflow.com/questions/26572115/nslocale-preferredlanguages-objectatindex0-always-return-en/26574075#26574075?謝謝! – S1U 2014-10-26 19:07:00

+0

@ s1u Xcode 6.1中存在一個錯誤。檢查這個答案:http://stackoverflow.com/a/26641497/1085556 – 2014-11-14 12:43:21

+0

@ s1u:幾件事情:(1)可以有多種首選語言;沒有單一的「當前語言」,和(2)關於你的(刪除的)答案,它返回當前語言環境(又名區域)的主要語言,而不是用戶的首選語言。 – 2014-11-16 19:14:48

54

[NSLocale currentLocale]基於設備的區域格式設置,而不是語言。如果該地區設置爲美國,則無論您使用的是哪種語言,都將獲得en_US。

+0

感謝Darren,這讓我開始了,我也想出瞭如何獲得當前的語言設置,這正是我真正想要做的。 – Prairiedogg 2009-10-06 04:06:31

+1

嗨Prairiedogg,你是如何得到當前的語言設置?我也有同樣的問題..所有語言返回EN值。 – Zaldy 2010-08-26 14:22:08

+0

@ZaldzBugz:類似於: NSLocale * locale = [NSLocale currentLocale]; NSString * lang = [locale displayNameForKey:NSLocaleIdentifier value:[[NSLocale preferredLanguages] objectAtIndex:0]]; – powerj1984 2012-10-30 20:14:09

2

我發現如果我離開「en_US」,但有一個「en」本地化是「en_US」副本,模擬器會自動啓動尊重語言設置,但只要「en_US」是一個選項不管設置如何,總是選擇它。

2

我有哪裏格式化月份名稱的英文出來設置爲法語的設備上的問題。

我的解決方案是使用這樣的:

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

的問題是太舊了,但是這個代碼可以幫助很多:

的main.m文件應該是這樣的:

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])); 

這是什麼?如果設備的當前語言是西班牙語,英語或葡萄牙語,則應用程序使用本地化的字符串,反之,如果當前語言不是其中一種,並且應用程序不支持,則設置爲英語。

4

對我來說,無論是

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

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

產生相同的結果,當你在一個模擬器是。

+1

確實,在我的情況下,在iOS 8/Xcode 6上始終是en_US – Adrian 2015-02-23 18:59:02

0

它顯示了真實iPad上的正確語言環境。 但是,模擬器有它自己的iOS,默認情況下它被設置爲en-US。 轉到模擬器iOS首選項並將語言&區域切換到所需的區域。

這樣做。

1

對我們來說,問題是我們在開發方案中忽略了應用程序語言和應用程序區域。確保在方案選項(編輯方案 - >選項)中將應用程序語言設置爲系統語言。

+0

這對我很有用。感謝@西蒙 – Ramakrishna 2017-08-16 07:09:20

相關問題