美学原理3分钟实现iOS语言本地化/国际化(图文详解)

前言

言语本地化,又称之为语言国际化。是凭因用户操作系统的言语设置,自动将应用程序的语言设置也同用户操作系统语言一样的语言。往往有应用程序需要提供被多个国家的人群利用,或者一个国度产生多种语言,这虽要求应用程序所著的字、图片等信息,能够吃谈话不同语言的用户读懂、看懂。进而提出为同一个应用程序适配多种语言,也便凡国际化。语言国际化之所以又称为语言本地化,这是立于每个用户之角度而言的,是赖能被用户本地、本土人群会看懂的语言信息,顾名思义,语言本地化。其实语言本地化
== 语言国际化!
正文将分如下7个关键章节一步一步讲解如何了本地化一个App。

  • 配备需要国际化的言语(国际化的准备工作)
  • App名称本地化
  • 代码中字符串本地化
  • 大抵人出状况下之字符串本地化
  • 图本地化(两种办法简单栽办法)
  • 查阅/切换本地语言
  • storyboard/xib本地化

安排需要国际化的言语

布置需要国际化的言语,这也是国际化之前的准备工作,无论我们是国际化App名称、代码中的字符串、图片、还是storyboard和xib,都用进行即时无异步的准备干活(一个品类遭到要还只用配置一蹩脚)。

  • 入选project->Info->Localizations,然后点击”+”,添加需要国际化/本地化的言语,如下图(默认需要勾选Use
    Base Internationalization):

Snip20160616_15.png

  • 这里为填补加法语为例,如下图:
Snip20160616\_18.png
  • 弹来如下对话框,直接点击finish,如下图:

Snip20160616_21.png

  • 同理,添加简体中文、繁体中文、韩语,最终结出如下图:
Snip20160616\_22.png

备注:
“zh-Hans”和“zh-Hant”是简体中文和繁体中文的缩写。这是专业的缩写。H可大写吧可是有些写。”en”是英语的缩写。ko是韩语的缩写,fr是法语的缩写。其他语言请百度各国语言缩写即可查询。

(一)应用名称本地化/国际化

以名称本地化,是赖和一个App的号,在不同之言语环境下(也就是手机配备的言语设置)显示不同的名号。比如,微信在简体中文环境下App名称显示为“微信”,在英语环境下显得也“weChat”。下面就是开始开展应用名称本地化。

  1. 入选Info.plist,按下键盘上之command + N,选择Strings
    File
    (iOS->Resource->Strings File)

Snip20160616_10.png

  • 文件名字命名也InfoPlist,且不能不是此名字(因每个人电脑安装差异,此处本人电脑没有展示strings后缀名):

Snip20160616_11.png

  • 点击create后,Xcode左侧导航列表就会产出名为也InfoPlist.strings的文本,如下图:

Snip20160616_13.png

  • 入选InfoPlist.strings,在Xcode的File
    inspection(Xcode右侧文件检查器)中点击Localize,目的是选我们用本地化的言语,如下图:
    注意:当点击Localize之前,一定要确保我们都上加了用本地化的言语,也即是端布需要国际化的言语那么无异步(步骤:project->Info->Localizations,然后点击”+”,添加需要国际化/本地化的言语)。

Snip20160616_14.png

  • 点击Localize后,会弹来一个对话框,展开对话框列表,发现下拉列表所著的言语正是我们以方配置的用国际化的言语,选择我们要本地化的语言,然后点击对话框的Localize按钮,如下图:

Snip20160617_10.png

Snip20160617_12.png

注意:倘我们无以 PROJECT
中布局需要国际化的语言(project->Info->Localizations,然后点击”+”),上图下拉列表中将只见面油然而生”Base”和”English”选项,English语言是系默认的语言,其他急需国际化的言语(例如中文简体、法语)必须经上面的配备本地化语言这就是说同样步手动添加。

  • 下一场我们发现Xcode右侧的File inspection变成了下图的体制:

Snip20160617_13.png

  • 接下来,勾选French、Chinese(zh-Hans)、Chinese(zh-Hant)、Korean,如下图:

Snip20160617_14.png

  • 这,Xcode左侧的InfoPlist.stirings左侧多矣一个箭头,点击箭头可以展开,如下图所示:

Snip20160617_15.png

自上图可以望,InfoPlist.strings文件下涵了English、French、Chinese(Simplified)、Chinese(Traditional)、Korean这五种植语言的公文。
原理:程序启动时,会因操作系统设置的语言,自动加载InfoPlist.strings文件下相应之言语文件,然后显示应用程序的名字。

  • 对接下,我们分别用不同的言语为InfoPlist.strings下之公文设置相应的名。

(1)在InfoPlist.strings(english)中在如下代码:

// Localizable App Name是App在英语环境环境下显示的名称
CFBundleDisplayName = "Localizable App Name";

备注:CFBundleDisplayName可以用对引号,也得以免下对引号!

Snip20160617_21.png

(2)在InfoPlist.strings(French)中入如下代码:

CFBundleDisplayName = "Le nom de la localisation de l'App";

Snip20160617_27.png

(3)在InfoPlist.strings(Chinese(Simplified))中参加如下代码:

CFBundleDisplayName = "国际化App名称";

Snip20160617_32.png

(4)在InfoPlist.strings(Chinese(Traditional))中进入如下代码:

CFBundleDisplayName = "國際化App名稱";

Snip20160617_30.png

(5)在InfoPlist.strings(Korean)中入如下代码:

CFBundleDisplayName = "현지화 앱 명칭";

Snip20160617_31.png

改模拟器语言环境呢English。App名称如下图:

Snip20160617_33.png

改模拟器语言环境也Chinese(Simplified)。App名称如下图:

Snip20160618_4.png

修改模拟器语言环境为Chinese(Traditional)。App名称如下图:

Snip20160618_5.png

修改模拟器语言环境为Franch。App名称如下图:

Snip20160618_6.png

修改模拟器语言环境呢Korean。App名称如下图:

Snip20160618_7.png

备注:千古本地化App名称,需要在Info.plist文件中多一个名为也“Application
has localized display
name”的BOOL类型的Key,并且用以那价设置也YES(如下图)。目的是让App支持地方化App名称。然现在可以忽略这同样步

Snip20160618_8.png

由来,本地化App名称已经演示了,其步骤就是是:

  • 于Project的装置中经点击”+”添加要本地化的言语。
  • 然后以Xcode右侧的File
    inspection中点击Localize,选中需要当地化App名称的语言。
  • 最后以每个语言对应的文件被因key = value(CFBundleDisplayName =
    “App名称”;);的样式设置App的称谓。

(二)代码中字符串的本地化

所谓字符串本地化,就是指App内之字符串在不同的语言环境下显得不同之情节。比如,”主页”这个字符串在中文语言环境下显得“主页”,在英语环境下显得“home”。下面就起来开展字符串本地化。
实际上字符本地化和App名称本地化过程要产生一致智,只是创建的文本名成不均等(连同后缀一起,文件称必须是Localizable.strings),其他步骤完全相同。为了能给大家根本了解,此处或会管步子一一贴出来。

  • 与应用名称本地化一样,首先用command + N,选择iOS -> Resource
    -> Strings File

  • 文件称必须命名吧Localizable
    备注:因我电脑取消隐藏文件后缀名,所以会见自动补全.strings后缀名。

Snip20160619_8.png

  • 文件创建成功,查看Xcode左侧导航列表,发现差不多矣一个誉为也Localizable.strings的文书,如下图:

Snip20160619_4.png

  • 入选Localizable.strings文件,在Xcode的File
    inspection中点击Localize,目的是选我们要本地化的语言(和本土化App名称同理),如下图:

  • 逐选择English->Localize,如下图:

  • 下一场我们发现Xcode右侧的File inspection变成了下图的体制:

  • 然后勾选French、Chinese(zh-Hans)、Chinese(zh-Hant)、Korean,如下图:

  • 此刻,Xcode左侧的Localizable.stirings左侧多矣一个箭头,展开后,如下图所示:

Snip20160619_6.png

  • 下一场我们才待以Localizable.strings下相应的文件被,分别坐Key-Value的形式,为代码中列一个用本地化的字符串赋值,如下图:

Snip20160619_9.png

Snip20160619_10.png

Snip20160619_12.png

Snip20160619_13.png

Snip20160619_14.png

  • 本地化代码中的字符串,如下图:

Snip20160619_15.png

  • 咱们惟有待采取Foundation框架自带的NSLocalizedString(key,
    comment)这个宏根据Key获取相应之字符串,然后赋值给代码中的字符串。

// NSLocalizedString(key, comment) 本质
// NSlocalizeString 第一个参数是内容,根据第一个参数去对应语言的文件中取对应的字符串,第二个参数将会转化为字符串文件里的注释,可以传nil,也可以传空字符串@""。
#define NSLocalizedString(key, comment) [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
  • 今非昔比语言环境下运行效果,如下图:
  • 英语环境下:

Snip20160619_17.png

  • 法语环境下:

Snip20160619_18.png

  • 简体中文环境下:

Snip20160619_19.png

  • 繁体中文环境下:

Snip20160619_20.png

  • 韩语环境下:

Snip20160619_23.png

如此一来,我们就是贯彻了代码中字符串的本地化。

技巧

  • 骨子里,我们不欲为Localizable.strings(English)文件上加Key-Value。原因如下:系统根据某key去取相应之字符串时,如果没找到,那么即使见面因为key作为value返回。所以要是我们以Localizable.strings(English)文件被从来不添加
    click = “hit”;那么在english环境下btn最终显示的title会是click.
  • 切换语言无需以模拟器中设置,只待以Xcode中开展如下设置:
    Edit->Scheme->Run->Arguments Passed On Launch
    ->-AppleLanguages
    (语言代码)。例如,我们模拟器此时尽管是韩语,如果经过上述手续设置为zh-Hans,那么语言环境将会见变成汉语,如下图:

Snip20160619_26.png

Snip20160619_28.png

  • 运行效果:

Snip20160619_29.png

  • 如此一来,切换语言转换得进一步简明,无需当模拟器的装置中展开繁琐的言语切换。

(三)多丁支付情况下之字符串本地化

种类支出被,独立开发之尚是个别。经常会面出多人出之景,这种状态,如果多丁同时操作本地化文件,极有或会见在冲突。另一方面,我们又无期自己之本地化文件中对方的传染,也就是说,我们不期望对方操作我们的本地化文件。但是上面介绍的代码中字符串的本地化是运的凡默认的文书称”Localizable”,因为启动程序时,系统以基于语言加载相应的公文得到其相应的字符串文件,这个字符串可以透过网将NSLocalizedString中之宏生成名也“Localizable.strings”的文本。那么什么样被系统加载我们好取名的本地化文件要无系统默认的Localizable.strings呢?这便是
NSLocalizedStringFromTable(<#key#>, <#tbl#>,
<#comment#>)的用处。
也就是说,如果你的strings文件名字不是Localizable而是自定义的话,如VVS.strings,那么你就是得使NSLocalizedStringFromTable这个宏来读取本地化字符串。

// key:系统根据key取字符串
// tbl:自定义strings文件的名字
// comment:可以不传
    NSLocalizedStringFromTable(<#key#>, <#tbl#>, <#comment#>)

Snip20160619_32.png

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIButton *btn;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *title = NSLocalizedStringFromTable(@"click", @"VVS", nil);
    [self.btn setTitle:title forState:UIControlStateNormal];
}

@end
  • 运行效果,如下图:

Snip20160619_33.png

如此一来,我们虽得挣脱别人的strings文件和系统默认的Localizable.strings文件,自己另外打炉灶。

(四)图片本地化

本地化图片,有点儿种办法,第一栽艺术与本地化代码中之字符串一样,通过NSLocalizedString(key,comment)来收获相应的字符串,然后因这字符串再得到图片。

方式一

NSString *imageName = NSLocalizedString(@"icon", nil);
UIImage *image = [UIImage imageNamed:imageName];
self.imageView.image = image;

方式二

第一得加上需要本地化的语言,具体步骤参考第一回布需要国际化的言语。因为自现身说法的demo中在本土化App名称时都补给加了索要国际化的语言。所以未待再次安装。

  • 用图纸拖入工程中,例如“icon.png”,然后选中icon.png,展开Xcode右侧的file
    Inspection,点击Localize,如下图:

Snip20160619_36.png

  • 下一场,右击icon.png->show in
    Finder,我们发现于en.Iproj文件中几近矣一个叫作也icon.png的图形,如下图:

Snip20160619_38.png

  • 当然,zh-Hans.Iproj文件夹下连不曾图,如下图:

Snip20160619_39.png

  • 我们特待于zh-Hans.Iproj添加一个名吧也icon.png的图样。如下图:

Snip20160619_40.png

  • 然后把zh-Hans.Iproj中的icon.png拖到Xcode中,如下图:

Snip20160619_43.png

  • 接下来发现,icon.png左边出现了一个可开展的三角。如下图:

Snip20160619_44.png

  • 开展后意识里头富含两张图,如下图:

Snip20160619_45.png

接下来控制器中补充加如下代码:

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *imageName = NSLocalizedString(@"icon", nil);
    UIImage *image = [UIImage imageNamed:imageName];
    self.imageView.image = image;
}

@end
  • english环境下运作效果如下:

Snip20160620_46.png

  • 华语环境改变下运作效果如下:

Snip20160620_47.png

  • 其它语言环境,例如法语、中文繁体、韩语,操作步骤完全和地方一样。都是当相应的.Iproj文件夹下增长同名的图纸,然后把图片拖放到Xcode中,不再赘述。

(五)查看/切换本地语言

规律:应用启动时,首先会读取NSUserDefaults中之key为AppleLanguages对应的value,该value是一个String数组,也就是说,我们访问这名为AppleLanguages的key可以返回一个string数组,该数组存储着APP支持的语言列表,数组的率先码也APP当前默认的语言。

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *languages = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"];
    NSString *currentLanguage = languages.firstObject;
    NSLog(@"模拟器当前语言:%@",currentLanguage);
}
@end

-控制台打印结果:

Snip20160620_1.png

同理,既然我们好透过AppleLanguages这个key从NSUserDefaults中取出语言往往组,那么我们呢足以让AppleLanguages这个key赋值来达成切换本地语言的功力,从此后,我们尽管凭需数的错过模拟器的装->通用->语言与地方
中切换语言。

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 切换语言前
    NSArray *langArr1 = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"];
    NSString *language1 = langArr1.firstObject;
    NSLog(@"模拟器语言切换之前:%@",language1);

    // 切换语言
    NSArray *lans = @[@"en"];
    [[NSUserDefaults standardUserDefaults] setObject:lans forKey:@"AppleLanguages"];

    // 切换语言后
    NSArray *langArr2 = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"];
    NSString *language2 = langArr2.firstObject;
    NSLog(@"模拟器语言切换之后:%@",language2);
}
@end

Snip20160620_2.png

  • 回首一下,我以方的技巧一样节被领取了:切换语言无需以模拟器中安装,只待以Xcode中进行如下设置:
    Edit->Scheme->Run->Arguments Passed On Launch
    ->-AppleLanguages
    (语言代码)。其实本质上即为NSUserDefaults中名为AppleLanguages的key赋值。

未完待续…

文/VV木公子(简书作者)
PS:如不特别说明,所有文章都为原创作品,著作权归作者所有,转载转载请联系作者获得授权,并注明出处,所有打赏均归我持有!

使您是iOS开发者,或者对本篇文章感兴趣,请关注我,后续会更新更多系文章!敬请期待!