2012-12-20 41 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语言环境标识符明确选择服务器语言。 –

相关问题