根据用户的本地语言,处理文本的输入和输出。
处理不同的日期,时间,数字显示格式
利用合适的日历和时区处理日期。
把不同国家的文字放在app的bundle中的分开的不同的文件中
iOS使用 .strings
文件扩展名的文件来存储所有的本地化字符串,每种支持的语言都有一个或多个。使用一个函数调用根据设备上使用的当前语言检索请求的字符串。
选择菜单栏中的 File\New\File
,选择 iOS\Resource\Strings File
并点击 Next
。
命名为 Localizable
点击Create
,Localizable.strings 是iOS默认的用作本地化文字的文件名称。除非在引入时每次输入.strings
文件,否则不要命名成其他名字。
.strings 文件中包含键值对的文本内容,像字典一样。
"KEY" = "Content";
在 Localizable.strings
文件中添加以下内容
"工作时长" = "work hours";
"你已经工作了 %.1f 小时" = "You have been working for %.1f hours";
NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment)
是访问这些本地化字符串的主要工具。其中tbl
, bundle
等参数有默认值,所以只需要指定 key 和 comment 就可以了。 comment 参数是用来提示翻译者这个字符串在APP中哪个地方使用的。
最长使用的是 NSLocalizedString(@"KEY", @"comment")
方法。
self.workTimeLabel.text = [NSString stringWithFormat: NSLocalizedString(@"你已经工作了 %.1f 小时", nil), self.duration];
添加其他语言
点击 project 找到 Info 标签, 在 Localizations 处点击左下角的+
按钮,添加在中文语言,下一步选中要国际化的文件,点击确定。
在Xcode的右侧面板中点击 Localize... 。此时 Xcode 会生成一些文件,lproj 结尾的文件夹,每一种语言对应一个文件夹。App在寻找对应的语言文件夹中的资源时,如果没找到,或者资源不存在,iOS会从 Base.lproj 中获取资源。
在 Localizable.strings(Simplified) 文件中,添加中文
"工作时长" = "工作时长";
"你已经工作了 %.1f 小时" = "你已经工作了 %.1f 小时";
"过了半小时" = "过了半小时";
在Edit scheme… 中选择中文语言,运行。
国际化 Storyboards
可以把 Storyboards 中的所有UI控件通过IBOut连线到对应的控制器中,在控制器中使用NSLocalizedString(_:tableName:bundle:value:comment:)
方法对属性赋值,可以达到国际化Storyboards的目的。
这种方法比较麻烦,因为有些UI控件的文字是不变的,不需要连线到控制器中。有一种简便的方式,点击Xocde左边的Main.storyboard左侧的三角符号并展开折叠,在 Main.strings(Simplified)
中替换要国际化的文字。
/* Class = "UIButton"; normalTitle = "过了半小时"; ObjectID = "MJk-Y7-jXL"; */
"MJk-Y7-jXL.normalTitle" = "过了半小时";
/* Class = "UILabel"; text = "你已经工作了5小时"; ObjectID = "dLk-5u-xPE"; */
"dLk-5u-xPE.text" = "你已经工作了5小时";
/* Class = "UILabel"; text = "工作时长"; ObjectID = "m31-Xi-Gp2"; */
"m31-Xi-Gp2.text" = "工作时长";
Demo
要实现的效果如下
点击下方的按钮,第二行的文字会动态变化
添加要国际化的语言
确保要国际化的文件都选中,点击 Finish
展开Main.storyboard文件,配置storyboard文字信息
新建Localizable.strings文件,并点击右侧的Localize...
在右侧的Localize...区域,选中对应的语言
编写对应的代码
#import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *workTimeLabel;
@property (nonatomic, assign) CGFloat duration;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.duration = 5.0;
}
- (IBAction)timeButton:(UIButton *)sender {
self.duration += 0.5;
self.workTimeLabel.text = [NSString stringWithFormat: NSLocalizedString(@"你已经工作了 %.1f 小时", nil), self.duration];
[self.workTimeLabel setHidden:NO];
}
@end