关于代码的干货 | APP中加入语言设置并不简单

周伟豪 2016-04-22 11:00 工具软件 来源:思达派 查看原文

    正当公司远赴拉斯维加斯去参加CES展会的前夕,我们的产品总监屁颠屁颠地跑过来对我说:“这两天帮我多做一个功能吧, 用户可以设置各国各种语言的, 还要带蓝牙绑定功能的,用我们的手机app去控制我们的硬件设备,毕竟咱们也要去参加international的会展了,要做的高端大气上档次一点”  我当时听完后是一脸懵逼, 然后说:“好。接着就开始加班加点的赶工了。

 

    因为之前并没有做过可以设置多国语言的这个功能的经验, 所以我第一个想到的方法是新建一个.plist文件, 在文件中存储各国所需的语言文本,并且编号。然而这个方案并不能实现在桌面改变app的名称,使名称也国际化。好在网上能搜到很多关于国际化设置语言的博客和教程,感谢网络上各种开发工程师大牛的无私奉献,接下来我的国际语言设置功能才一步步地完善。

 

    第一步,我们需要新建一个.strings文件,在Xcode6之前,每个工程都会自带一个Infoplist.strings文件,Xcode6开始以后,就需要我们手动去建了。在菜单栏打开File>New>File,选择Recource中的Strings File,点击Next. 此时这个文件名字可以自己取,我命名为LanguageSet.strings. 这个文件是用来设置app内部的文字的。然后再用同样的方法新建一个InfoPlist.strings文件,这个名字是固定的,不能自己随便定义。这个文件将会用来设置app在桌面上显示的名字。

 

    第二步,点击工程,进入到PROJECT,然后在InfoLocalizations栏点击加号,添加想要的国家语种,比如我添加了English,那么现在我有了基本语言Chinese,和一个添加的语言English。然后回到我们的InfoPlist.strings文件,这个时候发现,在它的左边多了个小箭头,点击一下,展开后会有它的子文件,分别是InfoPlist.strings(Base)(即我们的基本语言Chinese)InfoPlist.strings(English)。接着在InfoPlist.strings(Base)中,添加 CFBundleDisplayName你要的app中文名;在InfoPlist.strings(English)中添加CFBundleDisplayName“English name for your app”;这些字段都添加完后,我们发现现在我们切换手机的系统语言后,app的名称也会自动变为我们想要的语种。那么为什么是CFBundleDisplayName而不是别的字段呢?如果你在Info.plist点击鼠标右键,选择Show Raw Keys/Values,然后所有的Key值都变成了它底层显示的Key值了。

 

    第三步,现在我们开始设置app内部的国际化语言了。第二步中设置app国际化名称原理相同,也是一个key对应一个value的格式。在我们的LanguageSet.strings的文件左侧,单机箭头打开它的字文件,在LanguageSet.strings(Base)中添加 “text”“你好,蜗牛睡眠”; LanguageSet.strings(English)中添加 “text”“hello snail sleep”;其中”text”是我们所取的key = 号后面对应的文字,就是我们在app中展示出来的文字。那么该如何去使用这个keyvalue呢?我们可以先在viewController中添加一个UILabel对象,命名就为label吧,设置好这个label的大小及位置参数后,我们再设置这个label的文字。一般我们会是这样设置 label.text = @“测试文字”;那么控制器上就会展示出测试文字这四个字,接着我们把 label 的文字设置为 label.text =  NSLocalizedString(<#key#>, <#comment#>);参数key填我们之前的@“text”(前面需要加@),参数comment可以为nil,这样如果系统为中文环境那么就会展示“你好,蜗牛睡眠”,如果改为英文环境就会显示”hello snail sleep”。到此为止,我们的app国际化语言功能基本就完成了。然而我还是太天真了……

 

    在以上都做完之后,产品总监又屁颠屁颠地跑过来对我说:“怎么在英文环境下不能设置成中文呀?我需要在英文环境下也能设置中文,快,再改改(微笑脸)。”听完后,我又是一脸懵逼,然后也就是我们接下来的第四步了……

 

    第四步,如何在英文环境下也能把展示的文字变成我们中文设置的那些keyvalue呢?其实也不难,我们刚刚是使用 NSLocalizedString方法来获取文字的。接下来,我们先创建一个 NSBundle 对象,命名为bundle。然后我们每次设置语言的时候,先把bundle的地址改换掉,bundle = [NSBundle bundleWithPath:path]; 变量path就是我们国际化语言包的地址,比如 path = [[NSBundle mainBundle] pathForResource:@“en” ofType:@“lproj”];这样就获得了英文的语言包地址,然后我们的label.text = [bundle localizedStringForKey:@“text” value:nil table:@“LanguageSet”];这样即使在中文语言环境,也会从我们的英文语言包地址去获取keyvalue,所以会展示出英文。注意table后面的参数,一定要和我们的LanguageSet.strings文件名对应,否则将无法获取。

 

文末我要提一下,其实可以建一个语言管理类专门去管理语言设置,当然怎么去写这个语言管理类,各人有各人的洗好,我也就不赘述了。此外,我在GitHub上放了语言设置的开源Demo,里面的代码都是参考网络上各种大神的文献后去写的,可惜我没有一一记录那些文献的地址,非常感谢也非常抱歉。

Github:https://github.com/WayHouse/international-language-localsetting.


为您推荐: