现在越来越多的“螺丝”厂商加入了地球村,走上了国际大舞台,国际化的道路是越走越宽、越走越远,App也要国际化以避免不必要的使用障碍,方能更好地服务于地球村,所以我们就先来说一说如何国际化(本地化)App。
在App开发过程中可Localize...
本地化的文件很多,其中包括.string
、.xib(.nib)
、.plist
、.json
、.storyboard(故事板)
、.bundle
、.xcassets(Image/Color Set)
等等都是可以做本地化配置。
Localize...
按钮或者文件下拉列表区能看到xx.lproj
文件夹,不同的是在多语言本地配置的方式上有所区别。下面我们就以.json
文件为例,来实操一下如何将.json
本地化(国际化),在不同的系统语言与地区
下,展现不同的json
数据。第一步:创建一个
Localizable.json
文件,并将文件添加进项目中。Xcode没有直接Command+N
创建.json
文件的选项,我们可以使用终端
命令行touch Localizable.json
创建一个.json
文件内容如下:
[
{
"country":"中国",
"telCode":"+86"
},
{
"country":"俄罗斯",
"telCode":"+7"
},
{
"country":"朝鲜",
"telCode":"+850"
},
{
"country":"巴基斯坦",
"telCode":"+92"
},
{
"country":"塞尔维亚",
"telCode":"+381"
}
]
第二步:开启Localizable.json
文件本地化能力,新增需要支持的国家语言配置。在App开发过程中默认的开发语言是English - Development Localization
,根据第一步
创建的文件内容,我们需要新增中国
、俄罗斯
、朝鲜、巴基斯坦、塞尔维亚五国语言。
Localizable.json
是这样的:
Localizable.json
第三步:分别将本地化后生成的
Localizable.json
文件内容进行相应翻译,这里使用的百度在线翻译和有道在线翻译。
中文(简体)
[
{
"country":"中国",
"telCode":"+86"
},
{
"country":"俄罗斯",
"telCode":"+7"
},
{
"country":"朝鲜",
"telCode":"+850"
},
{
"country":"巴基斯坦",
"telCode":"+92"
},
{
"country":"塞尔维亚",
"telCode":"+381"
}
]
俄语
[
{
"country":"Китай",
"telCode":"+86"
},
{
"country":"Россия",
"telCode":"+7"
},
{
"country":"Северн кор",
"telCode":"+850"
},
{
"country":"Пакистан",
"telCode":"+92"
},
{
"country":"сербия",
"telCode":"+381"
}
]
朝鲜语
[
{
"country":"중국",
"telCode":"+86"
},
{
"country":"러시아",
"telCode":"+7"
},
{
"country":"조선",
"telCode":"+850"
},
{
"country":"파키스탄",
"telCode":"+92"
},
{
"country":"세르비아",
"telCode":"+381"
}
]
乌尔都语(巴基斯坦)
[
{
"country":"چین",
"telCode":"+86"
},
{
"country":"روس",
"telCode":"+7"
},
{
"country":"شمال کوریا",
"telCode":"+850"
},
{
"country":"پاکستان",
"telCode":"+92"
},
{
"country":"سربی",
"telCode":"+381"
}
]
塞尔维亚语
[
{
"country":"Кина",
"telCode":"+86"
},
{
"country":"Русија",
"telCode":"+7"
},
{
"country":"Северна Кореја",
"telCode":"+850"
},
{
"country":"Пакистан",
"telCode":"+92"
},
{
"country":"Србија",
"telCode":"+381"
}
]
英语
[
{
"country":"China",
"telCode":"+86"
},
{
"country":"Russia",
"telCode":"+7"
},
{
"country":"North Korea",
"telCode":"+850"
},
{
"country":"Pakistan",
"telCode":"+92"
},
{
"country":"Serbia",
"telCode":"+381"
}
]
第四步:编译运行App,修改手机系统设置语言与地区
项,切换以上五国官方语言(不含英语)分别查看App内展示内容。
坑!!!
当你觉得应该、已经没有坑的时候,我们应该千方百计去制造可能的坑。正如上述过于简单的过程和轻易得到的结果,后面一定隐藏着出人意料的大坑,所以我们的项目(实操)还没有结束,下面我们将手机系统设置语言与地区
项设置成五国语言以外的语言比如日语
,再来看看App内会展示什么内容。
日语
,但App内却显示的是中文
,你肯定又开始疑惑了为什么不是English
,毕竟上述我们提到默认语言是English
,所以你依旧很是不甘,觉得至少应该也要显示的是English
内容,如果是这样,那这个坑你是踩定了!
修改App默认语言
由这个坑引出本篇文章的主题《修改App默认语言》,上段我们说到日语
环境下App内显示的是中文
内容,很显然此时的App默认语言应该还是中文(简体)
,那么如何修改App默认语言呢?比如我想把默认语言设置成English
,在五国以外的语言统统显示为English
,那肯定有人支招了:
第一招:修改Info.plist
属性配置,添加Localization native development region
或者Development localization
属性值为en
或者English
。
Localized resources can be mixed
属性配置,值设置为YES
。
属性3
本以为可以出现奇迹,结果又很意外,可能真的是因为大中国的月亮没外国的圆、美、亮还大,最终还是宣告失败。第二招:打开Xcode导航栏菜单
Product
>Scheme
>Edit Scheme
>App Language
选择要设置的默认语言。
设置默认语言
设置默认语言
这一招操作起来简单,而且暂时可以满足预期的效果,而且无论App Language
设置成五国以外的其他什么语言,App内这回都会显示English
内容,但是,问题来了,比如下图的操作:
当Localizable.json
勾掉Base
和English
本地配置时[[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"json"]
会找不到Localizable.json
的文件路径,说白点以下调用会直接导致App报错退出
NSString *filePath =[[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
因为filePath
没有值,进而data
也为nil
,最后导致Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'
,结果就是App闪退,只有勾上Base
和English
其中任一项,App会以其作为默认语言并做对应的内容展示,当两项同时勾上时,会优先选择English
作为App的默认语言,所以在使用第二招
时,要确保Base
和English
至少有一项是勾选上的,否则就有可能出现上述的情况。
第三招:使用KVC机制修改App默认语言,但是这种方式,只有在App再次启动时才会生效,也就是说,一旦采用KVC去修改App语言环境,就应该给用户附加一个弹窗交互,提示用户完全关闭kill
掉整个App的进程,重新启动App。
[[NSUserDefaults standardUserDefaults] setValue:@[@"语言代号"] forKey:@"AppleLanguages"];
其中语言代号
可以在首选语言列表中去选择:[NSLocale preferredLanguages];
当你随意填写一个语言代号
去KVC一个默认App语言,那么恭喜你[NSLocale preferredLanguages]
后面会以这个随意的语言代号
为唯一元素的NSarray
作为返回值,即使是重启App,但App会以English
作为默认语言展示内容。
最后总结一下,以上三个办法,第二招
是最方便、最简单、最实用的,其次是第二招
,而第一招
是徒劳,所以你以为这样就完了吗,13不答应!
13重磅出击,支持App独立语言设置
在说13支持App独立语言设置之前,先来温故下App同步系统语言之首选语言顺序
的那些事。还是以上述实操例子中的五国语言为例,首先我们在设置iPhone语言
时,当所选择的语言为五国语言之一时,App会按照所选的语言做对应的内容展示,就像这样
iPhone语言
设置为五国语言之外时,App会按照首选语言顺序
从上往下的顺序查找所支持的语言,当查到所支持的语言时,App会以此语言作为App语言来做对应的内容展示
优先选择支持语言
优先选择支持语言
优先选择支持语言
再来说13支持App独立语言设置:打开
设置
>LocalizationsDemo(App名称)
>语言
,选择语言。
设置App独立语言
不难最开始的时候,App首选语言(建议语言
)列表和手机系统的首选语言顺序
列表并不是一致的
首选语言
一旦App设置了独立语言,无论手机系统语言切换成什么语言,App内部均会以设置的独立语言来展示App内的内容。
设置App独立语言
最后说一个很奇怪的现象,当将手机
设置
>语言与地区
>首选语言
列表中的语言删减至只有一条时,在手机设置
主页会发现我们的App
会从底部的应用列表中移除,但当你重新添加一条首选语言
后,手机设置
主页底部的应用列表中又会出现我们的App
。
网友评论