生成指定语言的NSLocale

最近app升级,在注册时要考虑不同地区的区号,就像中国大陆前面的加+86这样的,即电话号码区号的国际化与本地化

我们的另一个技术在实现时简历一个plist文件,内容都是中国+86-China这种格式,然后获取当前的地区名去plist表里查找对对应的区号,因为我们的app只支持中文(港澳台等也用简体中文)和英文,在这些地区没有问题,但是测试人员发现用其他语言时就会出问题,另一位技术不知道怎么解决,我找了一下发现解决方法也挺简单,

首先看问题出在哪,这是我们技术获取地区名的方法

NSLocale *locale = [NSLocale currentLocale];
NSString *nsCount  = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode];
NSString *displayNameString = [locale displayNameForKey:NSLocaleCountryCode value:nsCount];

比如说当前手机语言设置成法语,地区选中国,用上面这个方法中国的法文chinois, plist表里不存在这一项,问题自然也就发生了。

顺着这个思路就想,要是地区名只有中英文就行了,中国只显示中国或者China。析一下代码发现关键点在NSLocale上,然后看文档发现NSLocale有这个方法-(instancetype)initWithLocaleIdentifier:(NSString *)string,试了一下果然OK。

代码如下

NSLocale *customLocal;
if ([currentLanguage rangeOfString:@"zh"].location == 0) {
    customLocal = [[NSLocale alloc]initWithLocaleIdentifier:@"zh"];
} else {
    customLocal = [[NSLocale alloc]initWithLocaleIdentifier:@"en"];
}


NSString *countryCode  = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode];
NSLog(@"CountryCode = %@",countryCode);
NSString *displayNameString = [customLocal displayNameForKey:NSLocaleCountryCode value:countryCode];
NSLog(@"ConturyName = %@",displayNameString);

关键这这一句customLocal = [[NSLocale alloc]initWithLocaleIdentifier:@"zh"];
你想生成什么语言版本的就在后面写对应语言的表示。

以上就解决了电话号码不同地区的国际化与本地化了