您的位置:首页 > 移动开发 > IOS开发

iOS本地化总结

2013-10-30 14:05 120 查看
/article/9090059.html

OS应用的国际化,主要分为3个部分:

Info.plist 文件的国际化
.xib文件的国际化
.m文件的国际化

下面我就来一一说明。

Info.plist 文件的国际化

我们使用Xcode 4.5 创建一个新项目,会自动创建一个 en.lproj 目录,这个目录下存放的就是需要国际化的文件(默认为英文)。下面,我们还需要创建中文国际化支持。

1. 创建名为 zh-Hans.lproj 的目录

2. 在项目的 Info.plist 文件中增加配置 Localizations, 添加英文和中文的支持:English, Chinese(simplified)

3. 将 en.lproj/InfoPlist.strings 文件拷贝到 zh-Hans.lproj/InfoPlist.strings 文件中。

4. 将 zh-Hans.lproj 目录添加到项目。注意要选择 Add to targets

5. 选择 File -> Info -> Localization 为对应的语言

在 InfoPlist.strings 文件中,我们可以国际化一些应用信息,例如:

CFBundleDisplayName 应用显示名称。这样我们就可以根据不同的语言,显示不同语言的应用名。

更多字段信息,请参考
http://developer.apple.com/library/ios/#documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
的 Key Summary 部分。

.xib 文件的国际化

我们已经创建了一个英文的xib文件,在 en.lproj 文件下。然后,需要使用命令行来操作:

1. 将 .xib文件 中的文字提取,另存为 .strings文件。

ibtool --generate-strings-file MainViewController.strings MainViewController.xib

2. 将 MainViewController.strings 拷贝到 zh-Hans.lproj 目录下,然后汉化该文件中的文字

3. 执行命令,根据英文的 .xib文件 和 .strings汉化文件 生成一个汉化后的 .xib 文件

ibtool --strings-file zh-Hans.lproj/MainViewController.strings --write zh-Hans.lproj/MainViewController.xib en.lproj/MainViewController.xib

4. 将生成的这个 .xib 文件添加到项目中的 zh-Hans.lproj 分组下,注意要选择 Add to targets

5. 选择 File -> Info -> Localization 为对应的语言

至此,xib文件的汉化已经完成。

.m 文件的国际化

1. 代码中,凡是需要国际化的文字,都使用 NSLocalizedString 函数,例如

NSLocalizedString(@"hello_world", @"Hello world!");

2. 执行命令,将所有 .m 文件中需要汉化的文字都提取出来,并放入 en.lproj 文件夹下

genstrings -o en.lproj *.m

此时,会自动生成 Localizable.strings 文件。接着将该文件也拷贝到 zh-Hans.lproj 文件夹下去。这个文件就是需要汉化的内容

3. 将 .strings 文件添加到项目中相应的汉化目录下,注意要选择 Add to targets

4. 选择 File -> Info -> Localization 为对应的语言

然后,我们运行程序,通过修改系统语言发现,文件显示名称、.xib文件 和 .m文件 都可以自动切换显示语言了。

附上示例:
http://download.csdn.net/detail/midfar/4749454

http://www.worlduc.com/blog2012.aspx?bid=13531870


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应用,都集成在一起,所以添加新文件时要看清楚,别选错了。


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应用,都集成在一起,所以添加新文件时要看清楚,别选错了。

http://chenjohney.iteye.com/blog/1303723


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应用,都集成在一起,所以添加新文件时要看清楚,别选错了。

最近要做一个应用要实现本地化,因为使用的是xcode4,应用程序本地化的问题跟以前的版本还是有些不同,在网上找了些资料对于xcode4以上的版本资料还是相对较少,有些最后要通过手动创建文件,这样操作实在是太麻烦,所以经过一个下午的研究,总算是成功了一点点,还是庆幸一下。先给出结果。

英语: 中文:





具体实现如下:

静态本地化 : 加载的文件,如xib文件,图像文件,还有实现应用程序名本地化

动态本地化: 显示的字符串本地化

一。先做准备:设置程序本地化

在xcode点击程序图标:点击Info选项->Localizationn,点击“+”,选择要添加的语言,简体中文选择Chinese(zh-Hans)

你会在你工程目录下发现多了个文件夹,“zh-Hans.lproj",x-code使用.lproj作为其本地化文件夹的扩展名。



二。设置xib文件本地化, 图像本地化的方法是一样道理的,可以根据用户的显示语言加载不同的xib文件

操作:点击xib文件,在IB窗口中选择选项选择“File Inspecter",也就是第一个选项,选择“Localization->"+"选择添加的语言,

效果如下,原来的xib文件就会出现三角形,其下有两个文件,因为我的为storyboard,但效果是一样的。就可以实现将其本地化了,非常简单吧



三。设置应用程序名本地化,

设置应用程序名存储在应用程序的Info.plist文件中,我们例子实际上为Localize-Info.plist,选择文件,并不需要对文件进行本地化,而是使"Info.strings"本地化就可以了,在Localize.Info.plist,空白处右键,选择Show Raw Keys/Values,就会看到应用程序名实际为CFBundleDisplayName,我们只需要在对应的 Info.plist中添加以下代码就可以了

英文版:

C代码


CFBundleDisplayName = "Localization";

中文版:

C代码


CFBundleDisplayName = "本地化";



效果图:





四、加载的字符串本地化,

原理:在代码中将加入的字符串加入NSLocalizeString宏中,启动程序时,系统将根据语言加载相应的文件得到其对应的字符串文件,这个字符串可以通过系统将NSLocalizedString中的宏生成名为“Localizable.strings”的文件,当然你可以自己去创建这个文件,然后手动是添加对应的字符串。,

C代码


labelName.text = NSLocalizedString(@"Name", @"The name is ");

labelPassword.text = NSLocalizedString(@"Password:",@"The password is");

NSlocalizeString 第一个参数是内容,第二个参数将会转化为字符串文件里的注释。

转化方法如下 :先关闭项目,打开终端,进入到项目的目录,输入genStrings 文件名.m就可以将该文件中的宏转化为相应的字符串文件,





效果如下:会看到生成"Localizable.strings",

打开文件,就可以交给翻译人员去翻译了



最后附上例子,这是必须的

总算把截图搞上去了,分享一下。

Localize.zip (37.8 KB)
下载次数: 124


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应用,都集成在一起,所以添加新文件时要看清楚,别选错了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: