iOS多语言备选机制
近期伊书突然接到一些外国用户的投诉,说伊书界面变成了中文,但他们系统语言不是中文,是法文俄文日文等,伊书只支持中文跟英文,在不支持系统所用语言的时候,理应会自动选用英文,不知为什么会选成了中文,经过艰难困苦的重重排查,终于找到原因,知道了iOS多语言备选的规则。
主要有两个影响因素,一是CFBundleDevelopmentRegion(Info.plist的一个字段),二是iOS8新增的系统首选语言列表:
在iOS7及之前版本,系统只能设置一种语言,如果APP不支持系统设置的语言,选用备选语言的规则是:
1.如果APP支持英文,直接选择英文
2.如果APP不支持英文,随机挑选一个,不清楚这里挑选的规则。文档上说会选用CFBundleDevelopmentRegion设置的语言,但我测试后发现并没有,系统直接忽略了这个字段。
举个例子,APP支持中文跟英文,当系统语言是不是中文或英文时,都会选择英文。若APP支持中文跟日文,系统语言不是中文或日文,将会随机挑选一个。
从iOS8开始,系统语言可以设置一个语言列表,会根据这个语言列表的排序选用备选语言,规则就变了:
1.如果APP支持的语言在系统语言列表里有,优先选择列表上排序靠前的语言。
2.如果APP支持的语言没在系统语言列表上,按CFBundleDevelopmentRegion的值选择,无论APP是否支持英文,英文不再是默认的备选语言。
举个例子,APP支持中文跟英文,CFBundleDevelopmentRegion的值是中文,当系统语言列表是[日文]或[日文,中文]时,会选择中文,系统语言列表是[日文,英文]时,会选择英文。
苹果在语言方面似乎有不少bug,调试过程中出现不少坑爹的事,例如改变增删语言文件一定要clean工程否则不生效,iOS8模拟器不认CFBundleDevelopmentRegion的值,真机才认,再加上一开始不知道iOS8系统语言变成列表这事,把我迷惑得费了大量时间。总而言之,若要国际化,让APP支持英文,CFBundleDevelopmentRegion填英文,应该万无一失。
转载自:http://blog.cnbang.net/tech/2481/
最新文章
- [转]反向ajax项目
- JWS ,JAX-WS ,JAX-RS,REST,Restlet,SOAP 相关概念
- CCF 最大的矩形
- Objective-C的新特性
- Oracle数据库入门——常用的数据字典
- web前端跨域方案
- HDU 3351
- 无线端通用的reset样式
- HW3.9
- 【HDU3948】 The Number of Palindromes (后缀数组+RMQ)
- 利用readwritelock简单模拟实现多线程下cache的系统
- 字符串的使用(string,StringBuffer,StringBuilder)
- 兼容主流浏览器的js原生函数封装
- linux查看是否安装Apache,mysql,python等
- opencv 小程序170323
- C++11智能指针的深度理解
- ubuntu14.04 网络配置
- Windows下的pydoc
- 机器学习入门07 - 验证 (Validation)
- 【转】linux在shell中获取时间 date巧用