iOS修改App默认语言

现在越来越多的“螺丝”厂商加入了地球村,走上了国际大舞台,国际化的道路是越走越宽、越走越远,App也要国际化以避免不必要的使用障碍,方能更好地服务于地球村,所以我们就先来说一说如何国际化(本地化)App。
在App开发过程中可Localize...本地化的文件很多,其中包括.string.xib(.nib).plist.json.storyboard(故事板).bundle.xcassets(Image/Color Set)等等都是可以做本地化配置。

.strings
.xib
.plist
.json
.storyboard
.bundle
.xcassets/Image
.xcassets/Color
在实际开发过程中不难发现以上文件会有一些共同之处,一般在文件属性配置区都能看到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内展示内容。

不同语言展示内容
不出意外的话,应该都会得到上述的结果,如果你觉得这样就OK了,甚至脑子里开始浮现老外用户各种开心的样子时,其实隐藏的坑正躺在那里,你的老外用户随时都有可能踩破那个坑。

坑!!!

当你觉得应该、已经没有坑的时候,我们应该千方百计去制造可能的坑。正如上述过于简单的过程和轻易得到的结果,后面一定隐藏着出人意料的大坑,所以我们的项目(实操)还没有结束,下面我们将手机系统设置语言与地区项设置成五国语言以外的语言比如日语,再来看看App内会展示什么内容。

日语下的App
你会发现虽然手机系统语言已切换成日语,但App内却显示的是中文,你肯定又开始疑惑了为什么不是English,毕竟上述我们提到默认语言是English,所以你依旧很是不甘,觉得至少应该也要显示的是English内容,如果是这样,那这个坑你是踩定了!

修改App默认语言

由这个坑引出本篇文章的主题《修改App默认语言》,上段我们说到日语环境下App内显示的是中文内容,很显然此时的App默认语言应该还是中文(简体),那么如何修改App默认语言呢?比如我想把默认语言设置成English,在五国以外的语言统统显示为English,那肯定有人支招了:
第一招:修改Info.plist属性配置,添加Localization native development region或者Development localization属性值为en或者English

属性1
属性2
不知道是不是由于姿势不对,还是因为Xcode照的是大中国的月亮,然并卵,可能还要加一个Localized resources can be mixed属性配置,值设置为YES
属性3
本以为可以出现奇迹,结果又很意外,可能真的是因为大中国的月亮没外国的圆、美、亮还大,最终还是宣告失败。
第二招:打开Xcode导航栏菜单Product>Scheme>Edit Scheme>App Language选择要设置的默认语言。
设置默认语言
设置默认语言
这一招操作起来简单,而且暂时可以满足预期的效果,而且无论App Language设置成五国以外的其他什么语言,App内这回都会显示English内容,但是,问题来了,比如下图的操作:
Localizable.json勾掉BaseEnglish本地配置时[[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闪退,只有勾上BaseEnglish其中任一项,App会以其作为默认语言并做对应的内容展示,当两项同时勾上时,会优先选择English作为App的默认语言,所以在使用第二招时,要确保BaseEnglish至少有一项是勾选上的,否则就有可能出现上述的情况。
第三招:使用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

.END

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容