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

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

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

Localizable.strings(English) 中内容:
"Home" = "Home";

Localizable.strings(Chinese) 中内容:
"Home" = "主页";

项目中使用时:
homeLabel.text = NSLocalizedString("home", comment: "")

网上大部分教程到这里就结束了。但是这样在代码中使用非常的麻烦。
NSLocalizedString 的第一个参数必须与国际化文件中的字符串一模一样。每次写都要去文件里查找复制。

如果可以像其它代码一样,输入时能有代码自动补全那多 happy

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

关于 iOS 项目语言国际化的一些效率提升_第1张图片
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 下面的编辑框内

关于 iOS 项目语言国际化的一些效率提升_第2张图片
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 项目语言国际化的一些效率提升)