第一步:准备工作
1. 创建一个String File类型文件,如下。
2.1 点击这个文件,在右侧导航栏点击Localize这个按钮,如下,添加多语言比如:语言和汉语
2.2 添加后,右侧如下
左侧项目文件Localize变成下面这样。
2.3 如果要添加更多语言,打开PROJECT,如下:
第二步:代码工作:
新建一个文件,在代码中加入下面的内容
swift:let testLocalized = NSLocalizedString("test1", comment: "这个是测试")
oc : NSString *testLocalized = NSLocalizedString(@"test1", @"这个是测试");
第三步:逆向工作:
1. 打开终端(Terminal),cd到项目的根目录。
2. 生成最终文件
swift:
find ./ -name "*.swift" | xargs genstrings -o en.lproj
find ./ -name "*.swift" | xargs genstrings -o zh-Hans.lproj
find ./ -name "*.swift" | xargs genstrings -o ja.lproj
oc:
find ./ -name *.m -print0 | xargs -0 genstrings -o en.lproj
find ./ -name *.m -print0 | xargs -0 genstrings -o zh-Hans.lproj
find ./ -name *.m -print0 | xargs -0 genstrings -o ja.lproj
3. 打开项目文件查看
4. 把这个丢给翻译,让他去修改就好,当然注释要明确,不然又产生沟通成本等等问题。
更多:
1. NSLocalizedString(key,comment)的‘comment’是用来生成描述文字,便于查看,不至于一头雾水,因此‘comment’包含的信息需要尽可能准确,可以精确到具体的项目的文件名,比如某个controller、某个view。
例子:
string国际化
NSLocalizedString(@"cancel",@"string::::aController::UILabel:取消");
图片国际化
NSLocalizedString(@"homeBackground",@"picture::::bController::UIImageView:homeBackground_en.png");
说明:1.key最好以英文为主;2.可以直接将英文的string做为key这样英文就不需要改,只需改其它语言;3.如果是图片国际化,最好以图片名字做为key,如果key没有对应值,默认是以key为值,可以正确调用图片;
如下
NSLocalizedString(@"this is a localizable file",@"string::::cController::UILabel:这是国际化文件");
或者下面这样,key使用关键字
NSLocalizedString(@"localizable file",@"string::::cController::UILabel:这是国际化文件~this is a localizable file");
2. 从代码中逆向生成国际化文件。这样就不需要每次加了一个本地化字符串,就得手动去Localizable.strings添加对应的key。方法是先按照上面1.2的方式写好调用,等项目差不多写好了,使用苹果提供的快捷生成本地化key的命令。
需要注意的是,NSLocalizedString(key,comment),用这个函数时,key不能是宏定义或者一些动态字符串,否则用上面的命令会报错。
3.1 到了这里其实关于iOS的国际化已经算是完成了,但你可能也发现一个问题了,上面两种方法全都是一次性生成文件,但我们的项目往往会不断地更新。重新照上面流程跑,生成的string文件会将之前翻译好的文件覆盖掉。
3.2 代码的国际化还好,毕竟一般面对新需求我们都会新建新的类和文件,只要把新代码文件脱到一个文件夹下,执行genstrings便可以得到一份对应的本地化文件,然后拿给翻译人员,最后将翻译好的键值对追加在初始的localizable.string文件尾部即可。
4. 参考:
https://www.bbsmax.com/A/MAzAWM8p59/ 总结,GitHub仓库改写的国际化功能
https://www.jianshu.com/p/6a37f7f8cecd 用偷懒的方式
https://www.cnblogs.com/yanzheng216/p/8674722.html
https://www.cnblogs.com/levilinxi/p/4296712.html 脚本:添加没有的,去掉多于的
5. 下面是打印出当前设备支持的所有语言:(其中zh-Hans是简体中文,zh-Hant是繁体中文;en英文,ja日文)
(
en, "zh-Hans", fr, de, ja, nl, it, es, pt, "pt-PT", da, fi, nb, sv, ko, "zh-Hant", ru, pl,
tr, uk, ar, hr, cs, el, he, ro, sk, th, id, ms, "en-GB", ca, hu, vi
)