国际化(Internationalization)和本地化(Localization)

根据用户的本地语言,处理文本的输入和输出。

处理不同的日期,时间,数字显示格式

利用合适的日历和时区处理日期。

把不同国家的文字放在app的bundle中的分开的不同的文件中

iOS使用 .strings 文件扩展名的文件来存储所有的本地化字符串,每种支持的语言都有一个或多个。使用一个函数调用根据设备上使用的当前语言检索请求的字符串。

选择菜单栏中的 File\New\File ,选择 iOS\Resource\Strings File 并点击 Next

命名为 Localizable 点击CreateLocalizable.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
选择对应的语言进行测试

demo地址

你可能感兴趣的:(国际化(Internationalization)和本地化(Localization))