美文网首页
关于 iOS 项目语言国际化的一些效率提升

关于 iOS 项目语言国际化的一些效率提升

作者: 092d567e5c1c | 来源:发表于2019-08-03 12:46 被阅读0次

    关于 iOS App 语言本地化的基本配置和用法,网上有很多详细的教程, 这里就不再赘述。

    先举个例子说明一下这篇文章要干嘛。

    Localizable.strings(English) 中内容:
    "Home" = "Home";
    
    Localizable.strings(Chinese) 中内容:
    "Home" = "主页";
    
    项目中使用时:
    homeLabel.text = NSLocalizedString("home", comment: "")
    
    网上大部分教程到这里就结束了。但是这样在代码中使用非常的麻烦。
    NSLocalizedString 的第一个参数必须与国际化文件中的字符串一模一样。每次写都要去文件里查找复制。
    
    如果可以像其它代码一样,输入时能有代码自动补全那多 happy
    

    就像这样,不但有自动补全,还有注释

    0.gif 原理很简单,其实就是使用脚本根据 Localizable.strings 的生成 String 的一个扩展(脚本会在文末附上,也可以到示例项目中获取)。

    生成的 Swift 文件中的内容:

    import Foundation
    extension String {
        var localized: String { return NSLocalizedString(self, comment: self) }
    /// "Home";*
        static var home: String { return "home".localized }
    }
    

    简单说下步骤 以下内容的前提是你的项目关于本地化的基本配置都 OK 了。

    1. 添加脚本到项目
    选中Targets->Build Phases 然后点击 『 + 』选择 『 New Run Script Phase 』

    2. 复制脚本到 Run Script 下面的编辑框内

    1.png

    3. 点击 Build,第一次编译成功后需要到 Finder 中找到生成的代码文件(示例项目是 LocalizedUtils.swift ),添加到工程目录中。然后就可以愉快的 ppp 了

    注意事项

    1. 脚本中文件目录一定要正确;
    2. Localizable.strings 有内容要纯粹,不要有任何与语言无关的东西,注释也不要有,这个可以通过优化脚本避免
    3. Localizable.strings 中 『 = 』前面的文字就是代码中的为 String 扩展的变量名,所以 key 的命名要注意符合 Swift 变量命名的规则,比如:不要有空格。示例项目中 『 "home" = "Home"; 』改为 『 "ho me" = "Home"; 』生成的代码就会编译失败。
    脚本:
    # -*- coding: utf-8 -*
    # Localizable.strings文件路径
    localizableFile="${SRCROOT}/${PROJECT_NAME}/en.lproj/Localizable.strings"
    #  生成的swift文件路径
    localizedFile="${SRCROOT}/${PROJECT_NAME}/LocalizedUtils.swift"
    # 把等号后面的值替换成等号前的值, 为代码添加注释
    awk '{print "/// "$3"*" "\n" $1,$2,$1";"}' "${localizableFile}" > "${localizableFile}.tmp"
    # 将localizable.strings中的文本转为swift格式的常量,存入一个临时文件
    sed "s/^\"/    static var /g" "${localizableFile}.tmp" | sed "s/\" = \"/: String { return \"/g" | sed "s/;$/.localized }/g" > "${localizedFile}.tmp"
    # 先将localized作为计算属性输出到目标文件
    echo "import Foundation\n\nextension String {\n    var localized: String { return NSLocalizedString(self, comment: self) }" > "${localizedFile}"
    # 再将临时文件中的常量增量输出到目标文件
    cat "${localizedFile}.tmp" >> "${localizedFile}"
    # 最后添加输出一个"}"到目标文件,完成输出
    echo "\n}" >> "${localizedFile}"
    # 删除临时文件
    rm "${localizableFile}.tmp"
    rm "${localizedFile}.tmp"
    

    参考:
    http://www.cocoachina.com/articles/20190

    相关文章

      网友评论

          本文标题:关于 iOS 项目语言国际化的一些效率提升

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