iOS 应用的本地化

文案的本地化

  • 项目设置中开启需要支持的本地化语言。项目导航中点击项目名,PROJECT 中定位到到 Localizations。点击 "+" 添加想要支持的语言。

选择需要本地化的语言

选择需要本地化的语言

首次创建,会将项目中已经存在的 Storyboard,xib 等文件列出来,为其创建相应的本地化文件,如果你项目中不使用 IB 进行界面开发,可忽略。

选择现有的文件

选择现有的文件

  • 创建 strings 文件,命名为 Localizable.strings,系统默认会从该文件读取多语。

创建 strings 文件

创建 strings 文件

  • 为 strings 文件创建本地化版本的副本。在项目导航中选中刚刚创建的 Localizable.strings 然后在 Inspector 面板的 Localization 中点击 Localize...

为 strings 文件创建本地化副本

为 strings 文件创建本地化副本

添加相应文件。比如选择英文,然后再将需要本地化的语言都勾选上。此时刚刚的 Localizable.strings 文件变成了一个组,下面包含了每种语言对应的副本。

strings 文件及其本地化副本

strings 文件及其本地化副本

  • 接下来就是添加多语本身了,编辑每种语言的文件,写上对应的文案 key 及翻译。譬如:

简单中文

"hello" = "Hello";
"my_name_is" = "My name is %@";

英文

"hello" = "你好";
"my_name_is" = "我叫 %@";

这里左边是文案对应的 key,在代码中使用,右边则是展示到界面的文案。

编写多语文案

编写多语文案

  • 最后便是使用。以下是代码中使用的简单示例:

使用


@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(10, 50, 200, 20)];
    label1.text  = NSLocalizedString(@"hello", @"");
    
    UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectMake(10, 70, 200, 20)];
    NSString *name = @"niuwayong";
    NSString *localizedStr = NSLocalizedString(@"my_name_is", @"");
    label2.text  = [NSString stringWithFormat:localizedStr,name];
    
    [self.view addSubview:label1];
    [self.view addSubview:label2];
}

@end

运行效果:

运行效果

运行效果

前面提到创建 strings 文件时需要命名成 Localizable.strings,如果是其他名称,则不能使用 NSLocalizedString 来进行本地化,而需要使用 NSLocalizedStringFromTable 来指定多语文件名。

假如我们保存成了 MyI18n.strings,则可以这样来获取和使用:

[label setText:NSLocalizedStringFromTable(@"key", @"MyI18n", @"comment")];

测试其他语言

默认应用会跟随系统语言,但也可通过配置来测试指定语言。

  • 选择顶部项目目标点击 "Edit Scheme..."

Edit Scheme...

Edit Scheme...

  • Run 面板的 "Options" 中找到 "Application Language" 造成想要测试的语言即可

设置程序应用的语言

设置程序应用的语言

以下是选择简体中文的运行效果:

简体中文运行效果

简体中文运行效果

Info.plist 的本地化

应用中除了界面上有文案,像应用名称,权限描述等文本则不在代码范围内,这需要本地化项目的 info.plist 来完成。

  • 创建 strings 文件,命名为 InfoPlist.strings。这里的名称很重要,不能是其他名称,且大小写敏感。

  • 然后在其中添加需要本地化的字段,这些字段便是 info.plist 里对应的字段。

"CFBundleDisplayName" = "我的应用名";
"CFBundleName" = "我的应用名";
"NSLocationWhenInUseUsageDescription" = "开启定位以搜索附近的餐馆";