多语言本地化,是我们在做IOS项目的时候经常用的,下面根据自己的经验和使用场景,来全面的说说多语言本地化的解决方案。本文从提升效率和减少错误两方面对传统的多语言本地化方式进行了优化,虽然标题是IOS,但其实macOS也通用。下面话不多说了,来一起看看详细的介绍吧。
在本地化。字符串中写入多种语言的版本,然后使用NSLocalizedString进行本地化:
# en.lproj/Localizable.strings “登录”=暗锹肌? “注销”=白⑾? # zh-Hans.lproj/Localizable.strings “登录”=暗锹肌? “注销”=巴顺觥? #使用 loginButton。title=NSLocalizedString(“登录”,评论:“登录”) logoutButton。title=NSLocalizedString(“注销”,评论:“注销”)
这有什么问题呢?
繁琐!每次都要写<代码> NSLocalizedString (“xxx”评论:“xxx”)> 代码,虽然有代码补全,但依然很费时。
直接上代码:
扩展字符串{ {var本地化:字符串 返回NSLocalizedString(自我,备注:自我) } }
于是现在的使用方式就变成了:
loginButton。title=暗锹肌?localized logoutButton。title=白⑾?localized
这样代码简洁多了,也保留了代码的自解释。
但,依然还有问题,如果我不小心写成了:
loginButton。title=暗锹肌?localized logoutButton。title=發oguot .localized
编译不会报的错,但logoutButton的标题却出不来(注意<代码>“loguot .localized> 代码),写错一个字母,抓虫抓好长时间的经历相信很多人都遇到过吧。
不要徒手写同一个需要多次使用的字符串,尽量定义成常量进行调用。
还是直接上代码:
扩展字符串{ 静态var localized_login:字符串{返回“登录”。本地化} 静态var localized_logout:字符串{返回“注销”。本地化} }
现在用起来就更爽了:
loginButton。title=.localized_login logoutButton。title=.localized_logout
得益于Xcode代码提示补全的功能,我只需输入”。”“登录”回车,基本就就可以完成输入:localized_login.png
乍一看,已经将写字符串时出错的概率降到最低了,但这样又要多写一堆代码,岂不是把之前好不容易提升起来的效率又降低了,再加上万一,我们在写localized_logout时还是写成了<代码>“loguot”。本地化> 代码,这不是“辛辛苦苦大半年,一朝回到解放前”的节奏?
思路:使用脚本读取<代码>可以定位的。字符串> 代码,然后输出成我们需要的常量格式。
构建阶段中新建一个运行脚本,填入以下脚本:
# Localizable.strings文件路径 localizableFile=" $ {SRCROOT}/$ {PROJECT_NAME}/支持/en.lproj/Localizable.strings” #生成的斯威夫特文件路径(根据个人习惯修改) localizedFile=" $ {SRCROOT}/$ {PROJECT_NAME}//跑龙套/LocalizedUtils.swift源” 触摸localizedFile美元 #将localizable.strings中的文本转为迅速格式的常量,存入一个临时文件 sed“s/\”=\”。*美元/,/g“$ {localizableFile} | sed " s/. */,,“| sed”/^ \ "/静态var localized_/g”| sed“s/;\ "/:字符串{返回\“/g”| sed“s/,/\”。在本地化}/g”;" $ {localizedFile} .tmp " #先将局部作为计算属性输出到目标文件 echo - e \ n \“进口基础nextension字符串{\ n var本地化:字符串{返回NSLocalizedString(自我,评论:自我)}”在" $ {localizedFile} " #再将临时文件中的常量增量输出到目标文件 猫" $ {localizedFile}。tmp”祝辞比;" $ {localizedFile} " #最后增量输出一个“}”到目标文件,完成输出 echo - e " \ n} "祝辞祝辞" $ {localizedFile} " #删除临时文件 rm " $ {localizedFile} .tmp "
以上脚本的作用就是将<代码> localizable.strings> 代码中的内容转换成迅速的常量形式,并作为字符串的扩展存储起来,具体步骤看注释。
-
<李>第一次运行记得将