美文网首页
优雅的语言国际化方案

优雅的语言国际化方案

作者: 狼性刀锋 | 来源:发表于2020-05-01 16:41 被阅读0次

初衷

公司本地化语言用的比较多,但是对于现有的一些语言本地化方案,不太满意,于是想写一个自动化的脚本,达到优雅的实现本地化语言目的

en.lproj/Home.strings 为例,内容如下

"hello world" = "hello world";

原始的本地化就是这样

bundle.localizedString(forKey: "hello world", value: nil, table: "Home")

丑陋的代码。
于是有了各种本地化开源框架,比如 R.Swift

用了之后代码就是这样了

let string = R.string.localizable.homeWithName("hello world")

优雅了很多,但我还是不太满意,主要是key仍然是硬编码的,key有可能写错,也可能没有更新导致显示错误。于是我们通常用一个枚举来表示key,如下:

struct Strings {
//  Home: table name
    enum Home: String {
        case helloWorld = "hello world"
    }
}
let string = R.string.localizable.homeWithName(Strings.Home.helloWorld.rawValue)

这样避免了硬编码这个key,只需要维护好相应的枚举就好了。但是仍然需要手动维护这个枚举,在添加key和修改key的时候 都需要额外的维护,因此我想写工具自动化生成这个枚举,每次更新strings file 的时候,这个脚本会更新对应的枚举Swift文件,这样的话如果key更新了,就会产生相应的编译错误,避免潜在的bug。

原理很简单读取strings file, 然后生成source code到指定的文件夹

最终效果

struct Strings {
    enum Home: String {
        case helloWorld = "hello world"


        func localized() -> String {
            return bundle().localizedString(forKey: rawValue, value: nil, table: "Home")
        }

        func bundle() -> Bundle {
            return CopyBundleProvider.shared.asBundle()
        }
    }
}

使用

let string = Strings.Home.helloWorld.localized()

git 传送门

相关文章

网友评论

      本文标题:优雅的语言国际化方案

      本文链接:https://www.haomeiwen.com/subject/sijqghtx.html