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中的语言切换和资源使用的主要内容,如果未能解决你的问题,请参考以下文章

iOS-多语言版本开发(转载)

IOS多语言切换2-storyboard

iOS多语言-跟随系统/应用内切换

iOS多语言本地化(国际化)设置

iOS多语言本地化(国际化)设置

QML程序实现动态切换多语言(ListModel/ListElement中的文本的多语言处理)