从iOS 9开始,`NSLocale preferredLanguages`包含“-US”

时间:2015-10-06 17:57:43

标签: ios ios9

我们有以下代码来检索用户语言首选项:

language

在iOS 8.4之前,language是“zh-Hans”,“de”,“ru”,“ja”等等。但是从iOS 9开始,我注意到还有三个字符“-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]; } 。例如,“zh-Hans”变成“zh-Hans-US”

我可以找到有关此更改的任何文档。我假设我可以执行以下操作来解决此问题。

matrix1 = LOAD 'mat1' AS (row,col,value);
matrix2 = LOAD 'mat2' AS (row,col,value);

mult_mat = COGROUP matrix1 BY row, matrix2 BY col;
mult_mat = FOREACH mult_mat {
    A = COGROUP matrix1 BY col, matrix2 BY row;
    B = FOREACH A GENERATE group AS col, matrix1.value*matrix2.value AS prod;
    GENERATE group AS row, B.col AS col, SUM(B.prod) AS value;}

但是,我不确定这样做是否安全。似乎“-US”是用户使用该应用程序的位置?但这并不合理,因为我们在加拿大。来自世界其他地方的任何人都试过这个吗?

3 个答案:

答案 0 :(得分:4)

Apple已经开始在iOS 9中的语言区域设置中添加区域。根据Apple的文档,如果没有指定区域,它现在具有回退机制。如果你只需要支持一些语言,按照Apple的文档建议,我就是这样解决的:

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

这将根据用户的语言设置自动分配阵列中的一种语言,而不必担心区域。

来源:Technical Note TN2418

答案 1 :(得分: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:@"-"];

答案 2 :(得分:0)

快捷键5:从首选语言中删除区域

使用Locale.preferredLanguages.first为您提供了首选的应用程序语言(可以与用户的设备语言不同)。

为了支持脚本代码和语言代码(但要删除区域代码),我认为最好在给定首选语言的情况下创建语言环境,然后从那里获取我们所需的信息。

if  let pref = Locale.preferredLanguages.first {
    
    let locale = Locale(identifier: pref)
    let code = [locale.languageCode, locale.scriptCode].compactMap{$0}.joined(separator: "-")
    print(code)
}

因此,首先我们获得了首选的应用程序语言,然后从该语言创建语言环境。

要获取语言代码,我们使用locale.languageCodelocale.scriptCode(可能为nil)创建一个数组,使用compactMap删除所有nil值,然后将这些值与“-”连接。 / p>

这应该允许支持简体中文和繁体中文,并让Apple处理该地区,而不是假定它将一直存在。