正当公司远赴拉斯维加斯去参加CES展会的前夕,我们的产品总监屁颠屁颠地跑过来对我说:“这两天帮我多做一个功能吧, 用户可以设置各国各种语言的, 还要带蓝牙绑定功能的,用我们的手机app去控制我们的硬件设备,毕竟咱们也要去参加international的会展了,要做的高端大气上档次一点” 我当时听完后是一脸懵逼, 然后说:“好。” 接着就开始加班加点的赶工了。
因为之前并没有做过可以设置多国语言的这个功能的经验, 所以我第一个想到的方法是新建一个.plist文件, 在文件中存储各国所需的语言文本,并且编号。然而这个方案并不能实现在桌面改变app的名称,使名称也国际化。好在网上能搜到很多关于国际化设置语言的博客和教程,感谢网络上各种开发工程师大牛的无私奉献,接下来我的国际语言设置功能才一步步地完善。
第一步,我们需要新建一个.strings文件,在Xcode6之前,每个工程都会自带一个Infoplist.strings文件,Xcode6开始以后,就需要我们手动去建了。在菜单栏打开File>New>File,选择Recource中的Strings File,点击Next. 此时这个文件名字可以自己取,我命名为LanguageSet.strings. 这个文件是用来设置app内部的文字的。然后再用同样的方法新建一个InfoPlist.strings文件,这个名字是固定的,不能自己随便定义。这个文件将会用来设置app在桌面上显示的名字。
第二步,点击工程,进入到PROJECT,然后在Info的Localizations栏点击加号,添加想要的国家语种,比如我添加了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中展示出来的文字。那么该如何去使用这个key和value呢?我们可以先在viewController中添加一个UILabel对象,命名就为label吧,设置好这个label的大小及位置参数后,我们再设置这个label的文字。一般我们会是这样设置 label.text = @“测试文字”;那么控制器上就会展示出测试文字这四个字,接着我们把 label 的文字设置为 label.text = NSLocalizedString(<#key#>, <#comment#>);参数key填我们之前的@“text”(前面需要加@),参数comment可以为nil,这样如果系统为中文环境那么就会展示“你好,蜗牛睡眠”,如果改为英文环境就会显示”hello snail sleep”。到此为止,我们的app国际化语言功能基本就完成了。然而我还是太天真了……
在以上都做完之后,产品总监又屁颠屁颠地跑过来对我说:“怎么在英文环境下不能设置成中文呀?我需要在英文环境下也能设置中文,快,再改改(微笑脸)。”听完后,我又是一脸懵逼,然后也就是我们接下来的第四步了……
第四步,如何在英文环境下也能把展示的文字变成我们中文设置的那些key和value呢?其实也不难,我们刚刚是使用 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”];这样即使在中文语言环境,也会从我们的英文语言包地址去获取key和value,所以会展示出英文。注意table后面的参数,一定要和我们的LanguageSet.strings文件名对应,否则将无法获取。
文末我要提一下,其实可以建一个语言管理类专门去管理语言设置,当然怎么去写这个语言管理类,各人有各人的洗好,我也就不赘述了。此外,我在GitHub上放了语言设置的开源Demo,里面的代码都是参考网络上各种大神的文献后去写的,可惜我没有一一记录那些文献的地址,非常感谢也非常抱歉。
Github:https://github.com/WayHouse/international-language-localsetting.
2021-12-06 蜗牛睡眠发布了 《错过了这次15号线借梦告白,但我不想错过你》的文章
2021-11-29 蜗牛睡眠发布了 《高嵩:做一家以科技改善睡眠的健康创新企业》的文章
2020-02-25 蜗牛睡眠获得了抖音快手蓝V认证&帮开5G直播带货的关注