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

iOS 本地化 国际化 相关的工具,命令,和可能遇到的问题

2015-09-08 18:56 591 查看
今天有个同事问了我一个关于IOS应用程序国际化的问题,当我准备给他讲解的时候,突然发现现在的Xcode做国际化跟以前的Xcode做国际化有点区别。所以自己再仔细研究了一下,写下来并将以前的日志更新,供大家一起学习。如有任何意见或建议请留言。

根据Xcode的版本,IOS程序的国际化分两种。

一:Xcode 4.5之后的版本

一般要对程序进行国际化,主要有三部分需要国际化。

使用Base Internationalization来对用storyboard或xib创建的UI界面布局进行国际化。
使用InfoPlist.strings文件来对应用程序的名称国际化。
使用Localizable.strings文件来对应用程序中Code创建会使用的字符串进行国际化。

用Base Internationalization国际化

"Base
Internationalization"是 Xcode 4.5 推出的一项功能,使用该功能,我们就不再需要为应用程序支持的每种语言修改我们的storyboard或xib文件了。而是在一个应用程序中,只有一组storyboard或xib文件会被本地化为默认语言,这些storyoard跟xib文件就称为Base Internationalization。当我们将本地化语言添加到某个应用程序中时,Xcode会生成一个包含所有文本的字符串文件,这些文件里面包含每个storyboard或xib文件中的空间显示的文本,或者辅助功能标签或提示信息。Xcode会以这个storyboard或xib的名称命名此文件,扩展名为strings。因此,MyStoryboard,storyboard生成的国际化文件为MyStoryboard.strings。

注意:我们使用这个应该要Use AutoLayout。

其实当我们创建一个project后,默认我们就使用的English语言,这个是Xcode创建时的默认语言。并且
MainStoryboard_iPhone.storyboard, MainStoryboard_iPad.storyboard这个两个已经被localized成了English。



在 Xcode 中,选择 HelloWorld 项目,并显示“Info”面板。



选择“Localizations”表格下方的“Use Base Internationalization”选项。

Xcode 显示一张表单,要求您选择要用于“Base Internationalization”的storyboard。(在选择这个选项之前你可以先将storyboard都先点击打开看看,有的时候表单中没有列出他们,只要点击打开过就会列出来了。这可能是xcode的bug吧;如果创建失败就重启下xcode然后再试试吧。)



当您请求某个“Base Internationalization”时,Xcode 会将另一个文件夹添加到项目。如果在 Finder 中查看项目文件,您将看到一个名
为 Base.lprojde 的文件夹和另一个名为
en.lprojde 的文件夹(用于英文本地化)。第一个文件夹中的是串联图文件;第二个文件夹中的是InfoPlist.strings 文件。





在完成此项任务后,Xcode 会更新左边的列表,以显示新的本地化语言。点击 MainStoryboard.storyboard 旁边的展示三角形,以显示这些文件的基本(英文)和简体中文本地化。



上面你可以看到变成每一种语言都有一套Storyboard。其实,我们也可以将这些Storyboard改成.strings文件。







更改之后就会变成是文件形式的,这两种都是可以直接互相转换的。



我们可以看到MainStoryboard.strings文件里面的内容。对于Storyboard中的每一个字符串,Xcode将文件显示对象标识符的键、句点(.)和指定给改字符串的属性连接起来。
/* Class = "IBUITextField"; accessibilityHint = "Type your name"; ObjectID = "PzI-FE-QQF"; */
"PzI-FE-QQF.accessibilityHint" = "Type your name";

/* Class = "IBUITextField"; placeholder = "Your Name"; ObjectID = "PzI-FE-QQF"; */
"PzI-FE-QQF.placeholder" = "Your Name";

/* Class = "IBUIButton"; normalTitle = "Hello"; ObjectID = "fYK-eX-amY"; */
"fYK-eX-amY.normalTitle" = "Hello";

当我们在对MainStoryboard.strings文件做国际化的时候,有可能Storyboard中有很多个IBUIButton,这样我们是通过ObjectID来识别每一个button的。



2. InfoPlist.strings文件来对应用程序的名称国际化
当我们需要对应用程序的名称及其他外在表现进行国际化时,我们一般使用InfoPlist.strings文件。Xcode在默认情况下会创建一个InfoPlist.strings。
一般Info.plist里面的名称只是对外显示的display key,如果要在InfoPlist.strings里面对它进行设置时,需要使用它们的原始key。当我们需要查看原始的名称时,使用如下操作:



我们先选中InfoPlist.strings文件,此时它是一个空的单个文件,然后对它进行Localization。







然后,我们在InfoPlist.strings(Chinese)里面添加配置。

/* The name of the app displayed on the device*/
CFBundleDisplayName = "您好,世界";
3.用Localizable.strings文件来对应用程序中Code创建会使用的字符串进行国际化
当我们需要在Code中使用字符串显示时,我们也需要国际化显示的内容,如:alert。,此时我们就可以使用Localizable.strings文件来实现。
首先我们new一个strings文件,并命名为Localizable.strings, 然后我们对此文件进行Localization。







然后,在Localizable.strings (Chinese) 文件中添加配置。
/* The string displayed */
"HELLO" = "您好,%@";
在程序中使用宏定义NSLocalizedString来从Localizable.strings文件获取当前本地化语言的本地化字符串。

NSString *greeting = [[NSString alloc] initWithFormat:NSLocalizedString(@"HELLO", @"The string displayed"), nameString];

该宏中的第一个参数,采用字符串文件中的一个键,第二个参数采用给本地化人员的注释。该宏会返回与用户首选语言相对应的本地化语言中键的值。您可能想知道此示例将给本地化人员的注释作为该宏的参数的原因;毕竟,您已经在
Localizable.strings 文件中,为英文和中文写了一则注释。

大型应用程序项目,通常使用名称为 genstringsde 的命令行程序,从该程序在代码中找到的信息生成一个字符串文件(默认情况下,该文件名称为 Localizable.strings)。该实用工具查找 NSLocalizedStringde 宏的每次调用,提取键(也是初始值)和注释,并将这些项目写入字符串文件。然后,您可以将该字符串文件,添加到项目中的每种本地化语言中,并翻译这些值。

有一种情况是当我们已经对Storyboard进行了国际化。此时如果我们又修改了此Storyboard,比如添加了其他的控件,此时MainStoryboard.strings文件与"Base
Internationalization"文件的 MainStoryboard.strings就不同步了,我们同样需要对这些新添加的控件进行国际化。我们可以使用命令行工具ibtool,从"Base
Internationalization"文件的 MainStoryboard.strings 生成新字符串文件,然后将该新字符串文件条目添加到现有的MainStoryboard.strings文件中。

启动“终端”应用程序。

此应用程序位于“/应用程序/实用工具”中。

在“终端”的“Shell”中,连接到项目文件夹的 "Base.lprojde" 目录。

例如:

cd /Users/UserName/Projects/HelloWorld/HelloWorld/Base.lproj

在提示符后输入以下命令:

ibtool MainStoryboard.storyboard --generate-strings-file NewStuff.strings

可以给输出文件命名随您选取的任何名称(本示例是用 "NewStuff.strings")。

在 Xcode 中,打开生成的输出文件,并将新字符串文件条目(即“Your Name:”标签的注释和键-值对)拷贝到中文 "MainStoryboard.strings" 文件。

翻译新字符串值。

二:Xcode 4.5之前的版本(不变)

例如:依系统设定的语言自动奇幻适合的显示字符串



在Interface Builder设计时的界面



若系统设定为English则显示英文界面



若系统设定为繁体中文则显示为繁体中文界面

如何建立自定义的语系文件:

1.在Resources分类下新增文件 [右键/Add/New File...]

2.在分类中选择Other后再选择 Strings File



3.将文件名设定为 Localizable.strings



4.在 Localizable.strings 檔案上按右鍵並選擇 Get Info



5.选择左下方的 Make File Localizable



6.将分页标签换至General



7.选择左下方的 Add Localization



8.输入新的语系名称 zh_TW 然后 Add



9.您会看到目前您设定了English及zh_TW两种语系



10.在文件清单中您将看到 Localizable Strings (English) 及 Localizable String (zh_TW)



11.开启后编辑预言字符串就可以啦,如下:

Localizable.strings (English)

/*

Localizable.strings

MultiLanguageDemo

Created by babyfish0226 on 2009/3/6.

Copyright 2009 __MyCompanyName__. All rights reserved.

*/

"DemoTitle"="This is English Version";

"String1"="Apple";

"String2"="BAnana";

"String3"="Orange";

"String4"="Watermelon";

"String5"="Strawberry";

Localizable.strings (zh_TW)

/*

Localizable.strings

MultiLanguageDemo

Created by babyfish0226 on 2009/3/6.

Copyright 2009 __MyCompanyName__. All rights reserved.

*/

"DemoTitle"="這是繁體中文的版本";

"String1"="蘋果";

"String2"="香蕉";

"String3"="橘子";

"String4"="西瓜";

"String5"="草莓";

MultiLanguageDemoViewController.h

//

// MultiLanguageDemoViewController.h

// MultiLanguageDemo

//

// Created by babyfish0226 on 2009/3/6.

// Copyright __MyCompanyName__ 2009. All rights reserved.

//

#import <UIKit/UIKit.h>

@interface MultiLanguageDemoViewController : UIViewController {

IBOutlet UILabel *lbldemotitle;

IBOutlet UILabel *lblstr1;

IBOutlet UILabel *lblstr2;

IBOutlet UILabel *lblstr3;

IBOutlet UILabel *lblstr4;

IBOutlet UILabel *lblstr5;

}

@property (nonatomic,retain) UILabel *lbldemotitle;

@property (nonatomic,retain) UILabel *lblstr1;

@property (nonatomic,retain) UILabel *lblstr2;

@property (nonatomic,retain) UILabel *lblstr3;

@property (nonatomic,retain) UILabel *lblstr4;

@property (nonatomic,retain) UILabel *lblstr5;

@end

MultiLanguageDemoViewController.m

#import "MultiLanguageDemoViewController.h"

@implementation MultiLanguageDemoViewController

@synthesize lbldemotitle,lblstr1,lblstr2,lblstr3,lblstr4,lblstr5;

- (void)viewDidLoad {

[super viewDidLoad];

//系統設定取得適合的多國語言字串

lbldemotitle.text=NSLocalizedString(@"DemoTitle",nil);

lblstr1.text= NSLocalizedString(@"String1",nil);

lblstr2.text=NSLocalizedString(@"String2",nil);

lblstr3.text=NSLocalizedString(@"String3",nil);

lblstr4.text=NSLocalizedString(@"String4",nil);

lblstr5.text=NSLocalizedString(@"String5",nil);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: