2012-12-20 78 views
1

如何檢測當前的應用程序語言?我不是在談論NSLocale用戶偏好。檢測iOS應用程序正在使用的語言

在我的應用程序中,目前有兩種支持的語言。默認的'en'和特定的'it'。

我只是想知道哪一個實際上正在使用。如果它是相關的,作爲進一步的解釋,我只通過Web服務爲兩種支持的語言提供內容。當調用服務時,我需要傳遞一個語言參數。目前,我這樣做,它的工作原理,但我完全不喜歡它:

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

if (![preferredLanguage isEqualToString:@"it"] && ![preferredLanguage isEqualToString:@"en"]) { 
    return @"en"; 
} 
return preferredLanguage; 

我已經看過線槽NSLocaleclassUIApplication,但沒能找到什麼有用的東西。

我還注意到NSBundle有一些本地化方法,但它們似乎都沒有具體說明哪一個正在使用。

+0

Gwendal的建議是好。但是,我看不出你爲什麼不喜歡你所使用的方法。根據[docs] [1],這是一種方法 >以字符串數組形式返回用戶的語言首選項順序 爲什麼要尋找另一個? [1]:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSLocale_Class/Reference/Reference.html –

回答

1

我通常會在Localizable.strings中保留一個特殊的鍵,比如我設置爲「en」,「fr」等的「HTTPAcceptLanguage」。現在告訴服務器應用程序顯示的語言和NSLocalizedString一樣簡單(@「HTTPAcceptLanguage」,零)。

+0

不錯,它的作品。給我更多時間傾聽其他建議,然後我可以將其標記爲已回答。 – Leonardo

+0

因爲你的目標是讓服務器提供其在完全相同的語言,通過你的應用程序中使用的一個響應,並不惜一切代價避免任何本地化不匹配,我認爲解決方案是最佳的,因爲它不正是表達的意圖。但是,把你的時間:-) –

3

[[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0]會更好,因爲它會始終返回您的應用支持的本地化。之後不需要額外的支票。

事實上,你的代碼有一個bug。如果用戶首選項中的第一種語言不是您的應用支持的語言,則iOS將繼續向下,直到找到您的應用支持的語言爲止。因此,如果用戶的偏好爲"fr", "it", "en", ...,則iOS會加載it版本的資源。但是,您的代碼將回退到en

(這也許是在OS X上,它很容易更重要的是,用戶可以更改語言的順序。在iOS上它apparently possible要做到這一點,但它不是那麼明顯它是如何工作的。)

+0

這種方法有一些問題:捆綁可能會返回類似fr_FR,則fr_CA,en_UK等NSLocalizedString技術,相反,清楚地表明,服務器可能沒有相同的語言支持,iOS版,並且還可以輕鬆地爲每個iOS語言環境標識符明確選擇服務器語言。 –

相關問題