I18n_iOS 0.0.5

I18n_iOS 0.0.5

galenu 维护。



I18n_iOS 0.0.5

  • galenu

I18n_iOS

CI Status Version License Platform

示例

要运行示例项目,请先克隆仓库,然后从 Example 目录运行 pod install

实现效果

QQ20231031-205710-HD.mp4

需求: 在 app 内提供更换语言功能,在 app 内更改语言后,已经创建的页面及时刷新,不能销毁根控制器重新创建。

存在以下难题

1. 跟app关联的语言国际化,只能通过代码控制,xib怎么国际化?
2. 不销毁根控制器重新创建,已经创建的页面怎么刷新?如果是每个页面加通知,那每个页面需要刷新的部分怎么抽取?对业务代码逻辑影响多大?是否有明确规范,新人接替是否好维护?
3. 跟语言关联的有静态页面控件刷新,业务逻辑刷新(如banner图上有文字,语言改变后banner图也需要刷新)
4. 怎么控制刷新粒度,如果栈里的静态控件太多,业务逻辑刷新太多,一次性全部刷新是否会影响性能?还是分批刷新?

常见方案:

  1. 切换根控制器方案: 切换语言直接重新创建根控制器

    • 优点:
      • 逻辑简单,代码无侵入
    • 缺点:
      • 必须返回根控制器重新加载,无法在当前页面实时刷新
  2. 通知方案:每个页面监听语言改变来刷新需要刷新的控件和逻辑

    • 优点:
      • 已创建的页面能实时刷新
    • 缺点:
      • 每个页面都需要监听通知
      • 语言改变时所有创建的页面控件和逻辑都同时刷新,会影响性能
      • 编写业务代码时需要关注哪些控件需要刷新,分离出来刷新,不是很友好
  3. 触发生命周期函数:语言改变时销毁当前栈中的控制器,并用新的控制器替换,让控制器重新走生命周期函数

    • 优点:
      • 已创建的页面能实时刷新
      • 逻辑简单,代码无侵入
    • 缺点:
      • 需要明确当前栈结构,遍历移除旧的,创建新的替换,需要明确创建新控制器依赖的参数,绝对不能更改栈层级结构和控制器类型,
      • 如果每个控制器的子控制器很多,怎么办?如果子控制器也重新创建,那么子控制器布局怎么办?
      • 没有好的思路来解决上述依赖问题

鉴于以上方案的各个缺点,实现一套自定义页面及时刷新的方案

  • 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文件。