IOS多语言切换4-framework中的语言切换和资源使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS多语言切换4-framework中的语言切换和资源使用相关的知识,希望对你有一定的参考价值。
参考技术A 开发语言:Swift 5.0开发环境:Xcode 11.5
发布平台:ios 13
在IOS多语言切换3文章中,我们已经实现了用户通过App手动设置语言,来设置程序文字和图片的多语言化,但随着App开发的需求,一旦引入了Framework,按照上一章实现的功能,所有在Framework中使用的文字和图片资源,无法随着用户设置的语言进行切换,原因在于每个Framework或者项目都有自己的独立Bundle,上一章中,我们只对Bundle.main包进行了处理,所以接下来,我们要对每个Framework的Bundle都进行多语言的处理。
以以下demo为例,建立一个包含2个framework的项目。
在Main.Storyboard和SubRes.Storyboard中,已经设置好文字的中文与英文,此时运行程序可以通过切换IOS设备的语言来实现App的语言切换
在SubRes.Storyboard中,使用MainRes中一张图片arrowblue。
但运行程序后,图片无法显示,原因是ios中,每个不同的framework有着自己默认的bundle,而加载SubRes.Storyboard时,使用的是SubRes的bundle,但是arrowblue存在于MainRes的bundle中,SubRes.Storyboard无法找到这个图片。
此问题的解决办法是在Target->SubRes->BuildPhases->CopyBundleResources中,点击+号,添加MainRes的Assets.xcassets。
这样程序在编译时,会把MainRes的bundle中的资源,复制到SubRes的bundle内,这样程序运行就正常了
我们期待程序使用用户指定的语言而非系统指定的语言,和前几章相同,我们通过实现MyLanguage类来完成此功能,MyLanguage类中,维护了一个bundleDir,保存当前所有framework的bundle,每次用户切换语言,我们更新bundleDir,构造并且记录用户指定语言的bundle。
同时我们必须重定义Bundle类。
最后,我们需要扩展Bundle类,记录当前Bundle的名字,方便通过字典查找。
在AppDelegate中使用MyLanguage
此时,运行程序,可以看到模拟器的语言是英文,但APP中的文字已经成功设置为中文了。
在SubRes实现MyResource类,用于获取此framework中的多语言文字和图片,具体内容前几章有提到,就不多做介绍了
IOS多语言切换2-storyboard
参考技术A 开发语言:Swift 4.2开发环境:Xcode 10.1
storyboard的配置多语言的方式与配置文字和图片类似,首先选中storyboard,然后在右侧选择Localize,再把所有的语言全部钩上。
在我们第一次配置storyboard后,生成的多语言strings文件就不会更新了,但是往往在开发中,我们会不停的修改storyboard。每次都重新配置storyboard显得相当繁琐。所以我们使用脚本来自动更新storyboard。具体操作请参考以上文章中的第2部分。
但在笔者的使用过程中,上诉文章中使用的脚本并不能在笔者使用的环境运行,所以笔者对此脚本文件进行了修改。以下是修改后的脚本文件。
以上是关于IOS多语言切换4-framework中的语言切换和资源使用的主要内容,如果未能解决你的问题,请参考以下文章