I18n_iOS
示例
要运行示例项目,请先克隆仓库,然后从 Example 目录运行 pod install
。
实现效果
QQ20231031-205710-HD.mp4
需求: 在 app 内提供更换语言功能,在 app 内更改语言后,已经创建的页面及时刷新,不能销毁根控制器重新创建。
存在以下难题
1. 跟app关联的语言国际化,只能通过代码控制,xib怎么国际化?
2. 不销毁根控制器重新创建,已经创建的页面怎么刷新?如果是每个页面加通知,那每个页面需要刷新的部分怎么抽取?对业务代码逻辑影响多大?是否有明确规范,新人接替是否好维护?
3. 跟语言关联的有静态页面控件刷新,业务逻辑刷新(如banner图上有文字,语言改变后banner图也需要刷新)
4. 怎么控制刷新粒度,如果栈里的静态控件太多,业务逻辑刷新太多,一次性全部刷新是否会影响性能?还是分批刷新?
常见方案:
-
切换根控制器方案: 切换语言直接重新创建根控制器
- 优点:
- 逻辑简单,代码无侵入
- 缺点:
- 必须返回根控制器重新加载,无法在当前页面实时刷新
- 优点:
-
通知方案:每个页面监听语言改变来刷新需要刷新的控件和逻辑
- 优点:
- 已创建的页面能实时刷新
- 缺点:
- 每个页面都需要监听通知
- 语言改变时所有创建的页面控件和逻辑都同时刷新,会影响性能
- 编写业务代码时需要关注哪些控件需要刷新,分离出来刷新,不是很友好
- 优点:
-
触发生命周期函数:语言改变时销毁当前栈中的控制器,并用新的控制器替换,让控制器重新走生命周期函数
- 优点:
- 已创建的页面能实时刷新
- 逻辑简单,代码无侵入
- 缺点:
- 需要明确当前栈结构,遍历移除旧的,创建新的替换,需要明确创建新控制器依赖的参数,绝对不能更改栈层级结构和控制器类型,
- 如果每个控制器的子控制器很多,怎么办?如果子控制器也重新创建,那么子控制器布局怎么办?
- 没有好的思路来解决上述依赖问题
- 优点:
鉴于以上方案的各个缺点,实现一套自定义页面及时刷新的方案
- i18n自定义方案:向每个控件注入一段代码块,语言改变时调用,也可以在改变时做标记,在页面将要出现时刷新
- 优点:
- 已创建的页面能实时刷新
- 编写业务代码时不需要关心哪些控件需要刷新
- 静态控件统一规范,统一写法,业务逻辑刷新单独控制
- 缺点:
- 代码中设置text,title,attributedText等文本的地方都需要加前缀.i18n.text来设置,侵入性较大
- 优点:
用法:
- UILabel
label.i18nText = "key" 或
label.i18n.text = .i18n("key", args)
- UIButton
button.i18nTitleNormal = "key" 或
button.i18n.setTitle(.i18n("key", args), forState: .normal)
- UITextField
textField.i18nTitleNormal = "key" 或
textField.i18n.text = .i18n("key", args)
- UITextView
textView.i18nTitleNormal = "key" 或
textView.i18n.text = .i18n("key", args)
- UIBarItem
barItem.i18nTitle = "key" 或
barItem.i18n.title = .i18n("key", args)
需求
安装
I18n_iOS可以通过CocoaPods获取。要安装,只需将以下行添加到Podfile文件中
- 目标项目添加源
pod 'I18n_iOS', :git => "https://github.com/galenu/I18n_iOS.git"
- 执行
pod repo update
作者
galen, [email protected]
许可协议
I18n_iOS在MIT许可协议下可用。有关更多信息,请参阅LICENSE文件。