初衷
公司本地化语言用的比较多,但是对于现有的一些语言本地化方案,不太满意,于是想写一个自动化的脚本,达到优雅的实现本地化语言目的
以 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()
网友评论