iOS多语言备选机制

近期伊书突然接到一些外国用户的投诉,说伊书界面变成了中文,但他们系统语言不是中文,是法文俄文日文等,伊书只支持中文跟英文,在不支持系统所用语言的时候,理应会自动选用英文,不知为什么会选成了中文,经过艰难困苦的重重排查,终于找到原因,知道了iOS多语言备选的规则。

主要有两个影响因素,一是CFBundleDevelopmentRegion(Info.plist的一个字段),二是iOS8新增的系统首选语言列表:

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/

时间: 2024-10-10 16:51:22

iOS多语言备选机制的相关文章

IOS开发语言Swift入门连载---集合类型

IOS开发语言Swift入门连载-集合类型 Swift语言提供经典的数组和字典两种集合类型来存储集合数据.数组用来按顺序存储相同类型的数据.字典虽然无序存储相同类型数据值但是需要由独有的标识符引用和寻址(就是键值对). Swift语言里的数组和字典中存储的数据值类型必须明确. 这意味着我们不能把不正确的数据类型插入其中. 同时这也说明我们完全可以对获取出的值类型非常自信. Swift 对显式类型集合的使用确保了我们的代码对工作所需要的类型非常清楚,也让我们在开发中可以早早地找到任何的类型不匹配错

IOS开发语言Swift入门连载---自动引用计数

IOS开发语言Swift入门连载-自动引用计数 Swift使用自动引用计数(ARC)这一机制来跟踪和管理你的应用程序的内存.通常情况下,Swift 的内存管理机制会一直起着作用,你无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自动释放其占用的内存. 然而,在少数情况下,ARC 为了能帮助你管理内存,需要更多的关于你的代码之间关系的信息.本章描述了这些情况,并且为你示范怎样启用 ARC 来管理你的应用程序的内存. 注意 引用计数仅仅应用于类的实例.结构体和枚举类型是值类型,不是引用类

IOS-沙盒机制(一 简述)

一 IOS沙盒机制 出于安全的目的,应用程序只能将自己的数据和偏好设置写入到几个特定的位置上.当应用程序被安装到设备上时,系统会为其创建一个家目录,这个家目录就是应用程序的沙盒.所以的文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等.(For security reasons, iOS places each app (including its preferences and data) in a sandbox at install time. A sandbox is a

IOS-沙盒机制(二 文件读写)

一 目录说明 如下图所示,一个沙盒中典型存在下面的目录和文件 各个目录及文件说明: 1.Documents      您应该将所有的应用程序数据文件写入到这个目录下,这个目录用于存储用户数据或其它应该定期备份的信息. 2.AppName.app   这是应用程序的程序包目录,包含应用程序的本身.由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动. 3.Library              这个目录下有两个子目录:Caches 和 Prefer

[转]易语言消息机制分析(消息拦截原理)

标 题: [原创]易语言消息机制分析(消息拦截原理)作 者: 红绡枫叶时 间: 2014-12-17,12:41:44链 接: http://bbs.pediy.com/showthread.php?t=195626 我自己做了个易语言的sig签名,方便分析的时候用.易语言例子是静态编译的.版本 5.11易语言其实是基于mfc的,它依然需要mfc的消息派发机制,只不过,自己当了系统与用户间的代理人.所有的消息都要经它转发而已.我在MFC的消息派发函数_AfxDispatchCmdMsg下断点,总

iOS的沙盒机制

数据持久化:就是把数据从内存中写入到本地(对于iOS开发来说,就是把数据写入到应用的沙盒文件夹在中). 沙盒(SandBox):沙盒的本质就是文件夹,iOS采用沙盒机制来管理每一个安装到手机上的应用,每一个应用都有一个沙盒,而且这个沙盒相对独立,封闭的,安全的,通常情况下只有自己才能访问自己. 沙盒安全机制:沙盒的文件是随机生成的,而且每次都会生成一个沙盒的文件名,且采用十六进制数字命名法. #import "ViewController.h" #define kName @"

ios编程之回调机制

ios编程之回调机制详解:   ———————————————— 函数/方法/block块一系列概念: 函数在大部分高级语言中都是个重要的概念,函数实现就是对一段代码的封装,我们一般会为了完成某一个业务功能或编程逻辑而需要组织数行代码,而这数行代码还有可能被使用多次,所以将它们封装成一个函数,每一次的执行我们称之为调函数或函数调用. 在C程序中,我们知道程序是从main函数开始执行,执行完main函数就退出程序,其实我们程序员很少去跟踪整个程序的执行流,一个程序(一段二进制代码)如何从加载到运行

iOS与Android垃圾处理机制

iOS与Android垃圾处理机制是不同的 iOS:ARC(自动释放):(Automatic Reference Counting)机制,并不需要用户手动去release一个对象,而是在编译期间会自动帮你添加那些以前你经常写的[object release]. Android:垃圾回收机制,垃圾回收是一种动态的存储管理技术,它自动释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能.

iOS学习之iOS沙盒(sandbox)机制和文件操作复习

1.iOS沙盒机制 iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 1.1.每个应用程序都有自己的存储空间 1.2.应用程序不能翻过自己的围墙去访问别的存储空间的内容 1.3.应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行.     通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是