App国际化
跟着我,一起创建一个国际化的App
过程
-
创建工程:ZXQBKAppLocalizationTest
-
在ViewController.m写几行需要国际的Macro(NSLocalizedString等)
NSString *name = NSLocalizedString(@"name", @"名字");
NSString *country = NSLocalizedString(@"country", @"国家");
- 修改ZXQBKAppLocalizationTest的development language,
- info.plist -> Localization native development region : zh-Hans;
- open ZXQBKAppLocalizationTest.xcodeproj,修改developmentRegion = zh-Hans;
-
重新启动xcode会发现zh-Hans成为了development language
图片4-1
- 在工程目录下genstrings导出development language的strings file。
find . -name \*.m | xargs genstrings -o .
ls 多了一个文件Localizable.strings,文件内容:
comment
key = value的形式。
这里会发现我们的main.storybord和launchScreen.storybord多出一个.strings文件。
-
将4步中的Localizable.strings导入工程。
5-1
你会发现value就是key,原因:development language默认会把key作为user-face text。可我们希望value是中文。
-
我们需要将strings文件导出为zh-Hans.xliff,如果我们用editor -> export Localizations会发现export的.xliff的target为空,那么这个.xliff就无法import到工程里。解决的方法是:用命令行。
xcodebuild -exportLocalizations -localizationPath <dirpath> -project <projectname> [[-exportLanguage <targetlanguage>]]
例如:xcodebuild -exportLocalizations -localizationPath ~/desktop -project ZXQBKAppLocalizationTest.xcodeproj -exportLanguage zh-Hans
我们会发现./desktop里多了一个zh-Hans.xliff文件。(我用的支持xliff格式的第三方免费工具:XLIFFTool,appstore有)
我们可以看到source=zh-Hans,target=zh-Hans,倘若你的target=?,那么.xliff是无法import工程里的。
-
我们需要把Localizable.strings的target用中文替换。
-
import zh-Hans.xliff到工程里
8-1
我们会发现strings文件已经改变了
我的运行结果
8-2 -
添加另一种语言:英语
图9-3
Resource选择zh-Hans:
9-1
工程文件:
9-2
查看:Localzable.strings(English)
9-4
发现:文件里面的内容和zh-Hans一模一样。
思考:因为我们Resource选择的是zh-Hans,所以这个文件和zh-Hans一样。不妨我们修改Localzable.strings(English)的内容,再导入一个日文,以en为Resource。
修改en的value为英文
9-6
Resource选为en
9-5
Localzable.strings(japanese)的value为英文。果然添加一个新语言时,value由Resource决定。
9-7 -
使用 editor export en.xliff
10-2
打开文件:
10-3
发现:Source为中文,而不是key。
思考:我们思维定式会认为key,value,comment这样,但是这里发现是这个source感觉是zh-Hans的value。那么到底是不是呢,不妨修改Localzable.strings(chinese(simplified))的国家->国家哈哈。
10-4
export en.xliff看看
发现:source变成“国家哈哈”了。
思考:如果这个source就是我们zh-Hans的value的话,那么我们就好理解了。项目组的translator不应该是根据key(程序员定的),而是应该根据value(user-text的实际内容)来翻译的。
- 测试一下我们的英文。
12-1
12-2
网友评论