有时候, 我们的一款应用, 要面向各个领域, 各个国度的用户。而这个时候, 就涉及到了应用的国际化开发。
国际化开发, 通俗来讲, 就是应用能根据用户当前设备使用的语言(本地化)来自动调整应用的语言, 使得每个用户都能正常使用应用。
国际化开发的重要性不言而喻。
总的来说, 涉及以下几个部分:
1.应用程序名称
2.字符串
3.图片
4.其他文件
5.StoryBoard
下面逐一进行说明
1、在此之前, 先设置你的工程支持多语言开发。
新建工程
比如我这里建立了名为localTest的工程。
2、添加多语言
localTest ------> PROJECT ------> Localizations ------> + ------> Chinese (Simplified) -------> Finish
如图所示:
完成后可以看到Localizations下有3个项。分别是Base, Chinese(Simplified), English
至此, 多语言环境就设置好了。
下面对各个部分进行说明。
1.应用程序名称
(1)创建InfoPlist.strings
当我们新建工程后, 会自动创建InfoPlist.strings文件, 这个时候的InfoPlist.strings只是一个单一文件。但是当我们完成第0步(设置多语言环境后),会自动的划分为多个子项,你可以看到InfoPlist.strings的左边有个向下的展开箭头。(如果没有多个选项, 选中InfoPlist.strings 点击 XCode-> View-> Utilities -> File Inspector,在Localization中点“+”,添加chinese (zh-Hans)类型的为简体中文,english 应该会自动添加上。然后在InfoPlist.strings 左边会多出一个三角形,点击展开后可以看到InfoPlist.strings(english)和InfoPlist.strings(chinese)两个版本的文件;)
如图所示:
当然, 如果没有自动创建, 我们也可以自己手动创建一个这样的文件。点击“new file”然后在弹出窗口左侧选择IOS的resource项,在右侧就可以看到“String File”的图标。创建这个文件,命名为“InfoPlist”(一定是这个文件名) 就生成一个InfoPlist.strings文件;
(2)添加属性
每一个文件, 对应一种语言环境下的属性内容。 比如InfoPlist.strings(english)文件中设置的属性将在语言为英语的情况下使用, 其他同理。
在InfoPlist.strings(english)文件中加入:
- CFBundleDisplayName ="myProgram";
- CFBundleDisplayName ="我的应用";
注意:CFBundleDisplayName加不加双引号都行
(3)编辑localTest-Info.plist
打开localTest-Info.plist,添加一个新的属性Application has localized display name, 设置其类型为boolean,并将其value设置为YES即可
(4)查看效果
运行程序, 切换语言, 你可以发现程序显示不同的名称。(如果是在模拟器上, 按shift+command+h 模拟按下home键, 便可查看。 另外, 通过Settings -----> General -----> International -----> Language -----> 简体中文 来设置对应的语言)
如图所示:
2、字符串
操作和应用名称涉及的基本一样, 但是这里的.string文件需要我们自己创建。
(1)创建文件
类似“本地化应用程序名称”第一步,点击“new file”然后在弹出窗口左侧选择IOS的resource项,在右侧就可以看到“String File”的图标。创建这个文件,命名为“Localizable”(一定是这个文件名否则后面调用会有一些区别)就生成一个Localizable.strings文件;
(2) 添加语言
选中Localizable.strings 点击 XCode-> View-> Utilities -> File Inspector,在Localization中点“Localize” ------ > 添加Chinese (Simplified)类型的为简体中文 -------> 然后选择Localize。如图:
之后Localization中会出现相应选项, 选中即可。如图:
之后在Localizable.strings 左边会多出一个三角形,点击展开后可以看到Localizable.strings(english)和Localizable.strings(chinese)两个版本的文件;
(3)添加字符串
在Localizable.strings(english)文件中加入:
- "myString" = "this is my test string....";
在Localizable.strings(Chinese)文件中加入:
- "myString" = "这是我的测试字符串....";
(4)使用字符串
在代码中使用NSLocalizedString(<#key#>, <#comment#>)来读取本地化字符串。NSLocalizedString有两个参数, 一个是关键字, 一个是对应的注释。
- NSString *testStr = NSLocalizedString(@"myString", @"myString test_");
- NSLog(@"%@",testStr);
即可针对不同的语言环境显示不同的字符串。
3.图片
这里又分两种方法,第一种和本地化字符串方法类似,把中英文图片的名字分别存到中英文对应的strings文件,然后通过NSLocalizedString)来获取图片名称,如:
Localizable.strings(english)文件中加入:
- "BtnCancel"="BtnCancelEn.png";
Localizable.strings(chinese)文件中加入:
- "BtnCancel"="BtnCancelCn.png";
然后在代码中使用NSLocalizedString)来获取图片名称:
- CCSprite *btnCancel = [CCSprite spriteWithSpriteFrameName:NSLocalizedString(@"BtnCancel", nil)];
- btnCancel.position=ccp(s.width/2,s.height/2-40);
- [self addChild:btnCancel z:2 tag:104];
第二种就比较正规化了:
点中你要本地化的图片,如“icon.png”,然后XCode-> View-> Utilities -> File Inspector,在Localization中点“+”添加chinese (zh-Hans);在图片左边就会出现一个倒三角,点开就会出现(english)和(chinese)的2张图,并且在项目文件夹中会出现en.lproj文件和zh-Hans.lproj文件;en.lproj文件存放的是英文版图片,zh-Hans.lproj存放的是中文版图片,中英文图片名字一样,我们在文件夹中直接替换图片就可以了,最后使用时直接使用正常名字就行了,如:“icon.png”。
4.其他文件
本地化其他文件和本地化图片第二种方法类似,先在Localization中添加语言,然后把对应版本拷贝到en.lproj和zh-Hans.lproj文件夹中,最后引用就行了。
5.StoryBoard
(1)打开你的工程文件,然后点击工程设置的地方如图所示,然后点击加号,然后选择你要添加的语言,然后不用管,提示关联了storyboard,点击finish,所添加的语言就会出现在列表中。这次我添加的是简体中文。
(2)然后你就会发现,你的storyboard多了一个三角的箭头,现在点击,打开他,会看到一个base文件和一个你添加的国际化语言。base就是原来你的storyboard,而下面那个就是对应你的story里面所有控件对应的,国际化语言。
(3)打开你添加的简体中文strings文件,会看到这些东西,就是对应国际化,这下你就知道怎么做了吧,把等号后面的改成你设置的语言,我这里设置的简体中文。
(4)当然你还可以在storyboard和strings文件的设置中点击这个,选择把他变成另一个storyboard,这样就有好几个storyboard了,每个语言一个,我不喜欢这么做,哈哈
(5)问题来了,当你发现,你改变了你的storyboard上面的控件之后,strings国际化文件没有变化,这确实是一个问题,目前有个解决办法是这样的。把你的新界面与现有的 MainStoryboard.strings 合并首先,启动“终端”应用程序。然后cd到项目文件夹的 Base.lproj 目录。例如:cd /Users/UserName/Projects/HelloWorld/HelloWorld/Base.lproj 在提示符后输入以下命令:ibtool MainStoryboard.storyboard --generate-strings-file New.strings (你也可以取别的名字(New.strings))最后在打开你的xcode的strings文件,好了,现在有了新的控件的值,可以翻译了。不过我的建议是,开发到最后在进行国际化设置,如果你觉得上面的方法麻烦,可以把现有的翻译保存下来,然后删除掉现在的,用我上面的方法重新生成一个。