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将文件显示对象标识符的键、句点(.)和指定给改字符串的属性连接起来。
当我们在对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)里面添加配置。
3.用Localizable.strings文件来对应用程序中Code创建会使用的字符串进行国际化
当我们需要在Code中使用字符串显示时,我们也需要国际化显示的内容,如:alert。,此时我们就可以使用Localizable.strings文件来实现。
首先我们new一个strings文件,并命名为Localizable.strings, 然后我们对此文件进行Localization。
然后,在Localizable.strings (Chinese) 文件中添加配置。
在程序中使用宏定义NSLocalizedString来从Localizable.strings文件获取当前本地化语言的本地化字符串。
该宏中的第一个参数,采用字符串文件中的一个键,第二个参数采用给本地化人员的注释。该宏会返回与用户首选语言相对应的本地化语言中键的值。您可能想知道此示例将给本地化人员的注释作为该宏的参数的原因;毕竟,您已经在
Localizable.strings 文件中,为英文和中文写了一则注释。
大型应用程序项目,通常使用名称为 genstringsde 的命令行程序,从该程序在代码中找到的信息生成一个字符串文件(默认情况下,该文件名称为 Localizable.strings)。该实用工具查找 NSLocalizedStringde 宏的每次调用,提取键(也是初始值)和注释,并将这些项目写入字符串文件。然后,您可以将该字符串文件,添加到项目中的每种本地化语言中,并翻译这些值。
有一种情况是当我们已经对Storyboard进行了国际化。此时如果我们又修改了此Storyboard,比如添加了其他的控件,此时MainStoryboard.strings文件与"Base
Internationalization"文件的 MainStoryboard.strings就不同步了,我们同样需要对这些新添加的控件进行国际化。我们可以使用命令行工具ibtool,从"Base
Internationalization"文件的 MainStoryboard.strings 生成新字符串文件,然后将该新字符串文件条目添加到现有的MainStoryboard.strings文件中。
启动“终端”应用程序。
此应用程序位于“/应用程序/实用工具”中。
在“终端”的“Shell”中,连接到项目文件夹的 "Base.lprojde" 目录。
例如:
在提示符后输入以下命令:
可以给输出文件命名随您选取的任何名称(本示例是用 "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);
}
根据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 = "您好,世界"; |
当我们需要在Code中使用字符串显示时,我们也需要国际化显示的内容,如:alert。,此时我们就可以使用Localizable.strings文件来实现。
首先我们new一个strings文件,并命名为Localizable.strings, 然后我们对此文件进行Localization。
然后,在Localizable.strings (Chinese) 文件中添加配置。
/* The string displayed */ |
"HELLO" = "您好,%@"; |
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 |
在 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);
}
相关文章推荐
- iOS -- 断点续传之 NSURLSession
- iOS学习篇章5--GCD
- xcode6 iOS8 本地化 国际化 的一点经验分享
- IOS - 应用本地化
- IOS第一天多线程-05GCD队列的使用
- iOS 播放器 或直播添加 弹幕
- IOS第一天多线程-04GCD通信
- IOS第一天多线程-03线程间通信
- IOS第一天多线程-02NSThread基本使用
- IOS第一天多线程-01pthread
- iOS在地图上WGS84、GCJ-02、BD-09互转解决方案
- iOS使用代码调整约束做动画效果时出现Unable to simultaneously satisfy constraints.
- iOS中文网址路径转换URLEncode
- iOS--触摸事件、手势识别、摇晃事件、耳机线控
- iOS开发--图片美化
- iOS触摸事件学习
- 通过iOS 9 SFSafariViewController提供完整的Web浏览体验
- iOS sizeClasses
- ios8.3 iphone6-plus box-shadow 不兼容
- iOS XMPP 注册用户失败 error:403 解决办法