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

by admin on 2018年9月24日

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

所谓字符串本地化,就是指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

  • 如此一来,切换语言转换得更其简约,无需在模拟器的设置中展开繁琐的言语切换。

古人有无有关于地震详细的记载为?也生,记载就桩事之是个坏出名的人,他即使是蒲松龄,在《聊斋志异》卷二蒙受他记事了同样次好更了之地震,描写的生详细,原文如下:

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

规律:应用启动时,首先会见读取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开发者,或者对本篇文章感兴趣,请关注我,后续会更新更多系文章!敬请期待!

图片 1

方式一

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中,不再赘述。

新生汉朝汉成帝的时刻,冬,十二月生天出现了日食,当天夕即来了地震,地震不正好波及到了未央宫里,皇帝为生恐怖,第二天即立刻召来贤良之人来寻问这究竟怎么回事。被唤起之人受发出位叫杜钦的,他的功名不赛,但连下去他说之当即洋话却破例,他说:“据说地震是为阴阳不联合,对于上和朝来说一切还属阴,而现在国四境都坏太平,诸侯臣服,外戚没有干政,唯一的或者就是后宫紊乱。”这是杜钦借天象来劝谏皇帝不要鬼迷心窍后宫,他的魄力很值得人玩,皇帝对天也非敢来不敬,只能管语不过说。这次地震出现了雨雪等异常天气,关东地区的当地来裂缝现象,较生的地方出同一步多异常,竹子和松柏因为地震的案由出现了枯败现象,想来或许与地壳运动有关。

(四)图片本地化

本地化图片,有点儿栽办法,第一栽艺术和本地化代码中的字符串一样,通过NSLocalizedString(key,comment)来博相应的字符串,然后根据这个字符串再得到图片。

  人眩晕不能立,坐地上,随地转侧。河水倾洒丈余,鸡鸣犬吠满城中。逾一时字,始稍得。视街上,则孩子裸聚,竞相告语,并忘其未衣也。后闻有处井倾仄,不可汲;某下楼贵南北易往;栖霞山裂;沂水陷穴,广数亩。此诚挺的异变吗。

前言

言语本地化,又称之为语言国际化。是依靠根据用户操作系统的语言设置,自动将应用程序的言语设置为与用户操作系统语言同样的言语。往往有应用程序需要提供于多单邦的人群利用,或者一个国家有多种语言,这便要求应用程序所著的仿、图片等信息,能够为讲话不同语言的用户读懂、看懂。进而提出为同一个应用程序适配多种语言,也不怕是国际化。语言国际化之所以又曰语言本地化,这是立在每个用户之角度而言之,是依靠能给用户本地、本土人群会看懂的言语信息,顾名思义,语言本地化。其实语言本地化
== 语言国际化!
本文将分如下7个基本点章节一步一步讲解如何了本地化一个App。

  • 部署需要国际化的语言(国际化的备选干活)
  • App名称本地化
  • 代码中字符串本地化
  • 大多总人口付出状况下的字符串本地化
  • 图表本地化(两种方式简单栽方法)
  • 查/切换本地语言
  • storyboard/xib本地化

立马首文章之所以短短数百许详细描写了一样糟地震发生的经,可见蒲松龄散文写的匪是相似的好。稷下在现行之山东淄博,当时蒲松龄去拜访自己的表兄,晚上一并针对在蜡烛正喝的痛快,突然地震了,墙倾屋倒的,正睡觉的众人衣服都顾不得穿还相互跑了出去,这次地震造成同幢酒楼改变了原先的取向,高山炸,水灌天地,给公民在带来了极大的灾害。蒲松龄之前估计没经验了地震,因此感叹到“此诚要命之异变吗”。

(三)多总人口开状况下之字符串本地化

色开发被,独立开发之尚是少数。经常会面时有发生差不多口付出之动静,这种气象,如果多丁而操作本地化文件,极有或会见是冲突。另一方面,我们还要休期望自己之本地化文件被对方的招,也就是说,我们无期待对方操作我们的本地化文件。但是上面介绍的代码中字符串的本地化是运的凡默认的文本称”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文件,自己另外打炉灶。

到王莽时,他篡夺了汉室的中外,但是也得不交旧臣的拥护,有相同年啊地震了,大司空王邑借此机会“乞骸骨”,也即是怀念退居二线,主要是休思辅佐王莽。王莽说:震和动辄不同等,震有贬损而动无害,这次是地震你不用担心,这次你的报名就不许可了。王莽此人就非信教这些,却经常下这些天象去愚弄百姓,他上位以前发为数不少奇怪的天象,每次他都见面动用这些会暗示属下自己该称帝,连扬雄这样的文学家都下也他达到书求进。

布需要国际化的言语

布局需要国际化的语言,这也是国际化之前的备工作,无论我们是国际化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的称号。

设说记载地震太多的史书非《资治通鉴》莫属,司马光描述地震按月度及时令来记载地震发生的时光,有时候地震比较小,简简单单的一样词“春,一月,地震。”这就做到了,如果地震稍深,便记载地震造成了何等的灾,稍微详细一点。他在《资治通鉴》上记载了千篇一律项比较好玩之从事,历史上率先只叫震吓死的帝王是东晋十六皇家之慕容备德,这人按理来说应该是慕容复的上代。慕容备德五十几近夏才继位,从未出了败绩,却因为相同摆地震要病亡。《资治通鉴》记载“戊午,备德介绍群臣于东阳殿,……俄要地震,百僚惊恐,备德也弗自安,还宫。是夜,疾笃,瞑不能言。……寻卒”。这种记载有自然的传奇色彩,也许是为慕容德年纪最老了,或者来好几突发病导致了他直死亡,后人将他的十分和地震联系起来但大凡游戏耳!

不管怎样,古人关于地震的记叙为咱们理解地震其实是健康的地质灾害,然而有些人以这些自然现象欺君罔上,还有的人口借这个散播谣言,古人有之,今人亦发之。自昨日九寨沟地段发生地震,今早新疆出地震,网上沸沸扬扬传播有关这些地震的不实信息,实是可恶的举!此举容易招公众恐慌,让有在该地区的人们进一步恐慌,让她们远在他乡的亲人只有添担忧,为了抓住人们眼球而散布此类消息,天下人应该共击!

实际上这可是大凡只偶发性事件,地震隔几年就会生出同样软,有时一年还有数,而西周在今底西北地区,属于甘肃、青海、天山南麓齐地震活动带来的范围,因此产生地震的几引领大高。不过西周这次地震确实厉害,据《竹书纪年》这仍古书记载:“幽王二年,泾、渭、洛竭,岐山崩。”《史记》记载的三川啊就是是泾水、洛水、渭水,这次地震为江湖紧张,现代科学解释吗地震能改变地质状况,导致本和地形的变型,因此三江湖很有或就此而紧张。《诗经.小雅.十月之至》貌似也记载了这次地震,诗被写到:“烨烨震电,不宁不令;百水沸腾,山豖卒崩;高岸为谷,深谷为陵。”这即越验证了此次地震非同小然。至于周幽王亡国的原因,有中的眼花缭乱不体恤民情,还有外部西戎的外患。

地震在古凡同等栽常见的地质灾害,由于古人不能够分解为何会油然而生这种景象,因此他们大多过凿附会,假借天象之称为,用以劝诫帝王,以这也胡像表明以于有灾或上行为未轨,有易代之先兆。而当世人看来,地震不过是板块移动,古人都是谣传。

《史记.周本纪》记载,周幽王二年,西周面世地震,三江河皆震,这是历史上记载的率先不成地震。有各项受伯阳甫的大臣看到此种植现象说道:周将亡矣。他以为世界之间的气是来一定顺序的,如果这种气乱了,人民社稷也拿生乱,阳气伏而不闹,阴气被刮不能够跑,于是才发生地震,如今老三江皆震是阳气不足而阴气迅猛的案由,由此平原为卡住,国家以发生危险。幽王三年,宠爱褒姒,为博美人一乐,烽火戏诸侯,西周亡。在古人看来,伯阳甫的预言特别确切,褒姒为晴到多云,阴扰阳,于是国亡。

唯独地动仪这东西到底存在无设有,未尝可知。如果地动仪那么神奇,中国太古底科技估计会重决心,可是正史上却说“自书典所记,未之有也。”在古籍上连没详尽记载地动仪的业务,如果地动仪真的在可能还能够垂后世,随着王朝更迭,这个地下变得更加隐秘。

图片 2

祝两所在的众人会正常平安,祈愿九寨沟,祈愿新疆!❤

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图