Xcode版本相关

从Xcode 4.4开始,添加本地化支持的步骤稍有变化,参考Localization(本地化) in Xcode 4.4。我用的是最新的Xcode 4.5,自然也是这样操作。

我现在只需要本地化一些字符串,nib/storyboard以及infoPlist之类的不需要本地化。选择Supporting Files,然后在它里面添加新文件,选择iOS下Resource里的Strings File,不要选择成OS X下的哦,我开头就没看清楚,Xcode也不知为何优先打开了OS X地选项。

OS X与iOS不一致

在我傻傻地从OS X菜单下添加了Localizable.strings,并且添加了两种本地化语言支持:英文和中文,我开始测试用NSLocalizedString(@"key",nil);设置某个Label地字符串,奇怪地是,在模拟器里工作正常(那个Label在中文环境显示中文字符串,英文环境显示英文字符串);我再换成真机,在中文环境里它却死活得不到字符串,只显示为"key"

之后是各种搜索,然后根据得到地零星信息,删除、重建Localizable.strings文件,重启Xcode之类的,但真机里就是不对。

后来不甘心,重新新建了一个项目,在添加Localizable.strings时,我终于注意到Xcode默认选到OS X的Strings File上了。

.app里的遗留文件

然后是换成正确的iOS版的strings之后,添加了两种语言:英文和中文。虽然我的真机和模拟器都改成了中文,但是就是读取不到中文Localizable.strings里的字符串,总是读取到英文版的。

搜索无果,各种清空,删除,偶然看到Products有个.app,就在Finder里打开(Show in Finder),然后查看(显示包内容),里面有些历史遗留的东西,Localizable.strings在en.lproj和zh-Hans.lproj外也有一个,应该是原来胡乱测试时弄错后留下来的,虽然项目里和项目文件夹里都已经删除,但这个.app并不在项目文件夹里,所以悲剧。

最后,终于搞定了,要将Products下的app在Finder里打开,删除里面的 .app 和 .app.dSYM 后,再从模拟器或者真机里删除应用,并重启Xcode。再次测试,本地化字符串总算可以从中文版的Localizable.strings读取了。

总之怪Xcode不智能,生成这个.app时只知道添加文件进去,却不懂删除项目里没有的文件,坑爹呀。

总结

Xcode很好用,但要建立在你熟悉它的情况下,有时候它也不是那么智能。因为Xcode可以同时用于开发iOS和OS X应用,都集成在一起,所以添加新文件时要看清楚,别选错了。