2015-10-06 76 views
3

我们有如下所示的代码来获取用户的语言首选项:`NSLocale preferredLanguages`包含 “美”,因为iOS的9

NSString *language = [[NSLocale preferredLanguages] firstObject]; 

的iOS 8.4之前,language是 “ZH-汉斯”, “德” ,“ru”,“ja”等。但是从iOS 9开始,我注意到在language之后还有三个字符“-US”。例如,“zh-Hans”变为“zh-Hans-US”

我可以找到有关此更改的任何文档。我认为我可以做下面的事情来解决这个问题。

NSRange range = [language rangeOfString:@"-US"]; 
if (range.location!=NSNotFound && language.length==range.location+3) { 
    // If the last 3 chars are "-US", remove it 
    language = [language substringToIndex:range.location]; 
} 

但是,我不确定这样做是否安全。看起来“-US”是用户使用应用程序的位置?但是这并没有意义,因为我们在加拿大。来自世界其他地区的任何机构都试过这个吗?

回答

2

Apple已经开始将区域添加到iOS 9的语言环境中。按照Apple的文档,如果没有指定区域,它现在具有回退机制。如果你只需要支持一些语言,这里是我工作围绕它,每个苹果的文档建议:

NSArray<NSString *> *availableLanguages = @[@"en", @"es", @"de", @"ru", @"zh-Hans", @"ja", @"pt"]; 
self.currentLanguage = [[[NSBundle preferredLocalizationsFromArray:availableLanguages] firstObject] mutableCopy]; 

这将自动分配基于关闭用户的语言设置数组中的语言之一,而不必担心关于地区。

来源:Technical Note TN2418

2

要提取区域,我认为这是一个更好的解决方案:

// Format is Lang - Region 
NSString *fullString = [[NSLocale preferredLanguages] firstObject]; 
NSMutableArray *langAndRegion = [NSMutableArray arrayWithArray:[fullString componentsSeparatedByString:@"-"]]; 

// Region is the last item 
NSString *region = [langAndRegion objectAtIndex:langAndRegion.count - 1]; 

// We remove region 
[langAndRegion removeLastObject]; 

// We recreate array with the lang 
NSString *lang = [langAndRegion componentsJoinedByString:@"-"]; 
+0

业,谢谢〜这也能发挥作用。但是,在这种情况下,我倾向于使用@Bill L的方法[自动回退](https://developer.apple.com/library/ios/technotes/tn2418/_index.html)等。而且,自定义代码越少, 更好。我们不能保证Apple会在iOS 10中再次将格式更改为“zh-Hans,US”:P –