iOS本地化(国际化)

本地化.gif

1、介绍

国际化(Internationalization)是指应用程序在运行的时候,可以根据客户端请求来自的国家/地区,语言的不同而显示不同的界面。根据用户的语言设置,展示不同的应用程序名称,不同的图片,应用的描绘语言。

1.1、iOS本地化的思路

把程序的标签,提示信息,图片等(所有的包含文字的内容)放在一个资源文件夹中,程序需要支持哪些国家,语言环境,就提供对应的资源文件。

本地化思路.png

NSLocale:特定的国家区域的语言环境。

NSLocale *local = [NSLocale currentLocale];//获取当前的语言环境  
NSString *string = local.localeIdentifier; // 获取当前的应用程序的语言

NSLocalizedString(<#key#>, <#comment#>):根据key来获取国际化的语言设置信息。
为了实现本地化,必须提供程序所需要的资源文件。资源文件的内容是很多的键值对(key-value),其中key是程序编写时需要使用到的,value是应用程序界面展示时便显出的内容。

资源文件的名称通常是localizable.strings. 

1.2、本地化文件夹

本地化文件夹的命名有着严格的规范,本地化文件夹一般有两种形式。(创建项目之后,打开项目工程在finder中显示,都会有一个Base.lproj文件 里面包含launch 和main的故事板)。在iOS系统中,简体中文的代号是zh-Hans。繁体中文的代号为zh-Hant。英文的代号为en。
1、langauge-country.lproj
2、langauge.lproj
语言和国家/区域都是不可变的,必须是iOS支持的语言。
注意:Base.lproj是一个典型的本地化文件夹,只不过它为所有的语言提供环境提供服务,所以它是所有的语言环境最后的选择。Base.lproj文件夹下默认保存了Main.storyBoard文件。主故事板可以为所有语言环境提供界面。

本地化文件.png

查看国际上不同国家和语言的编码网址

国际上的国家和语言编码.png

获取iOS支持的所有语言和国家,需要通过NSLocale的availableLocaleIdentifiers类方法获取。这个方法返回一个NSArray集合,然后遍历这个集合来获取iOS支持的NSLocale的标识字符串。

//获取所有的本地化标识字符串
NSArray *locale =   [NSLocale availableLocaleIdentifiers];
   for (NSString *locl in locale) {
         NSLog(@"%@",locl);
   }

运行结果(部分打印结果):

部分语言和国家编码.png

2、应用程序的本地化主要包括应程序名称本地化,storyBoard本地化,图片本地化,字符串本地化。

2.1应用程序名称本地化

 Bundle name 简单来说就是 App 安装到 iOS 机子里的 App 文件夹名。
 Executable name  –  执行程序名,默认与 PRODUCT_NAME 一致。
 Bundle display name  –  真正显示到用户屏幕上的 App 名称。
在模拟器/真机上显示的名字是由Bundle Display Name决定的。默认情况下Bundle Display Name就等同于Product Name。

Bundle name – is folder name, where your app (including executable file and all resources) will be stored (Cool Program.app). Executable name – is a program binary name, i.e. Cool Program.app/CoolProgram Bundle display name – is what will be shown on iPhone screen, for example Cool Prog (since Cool Program probably will not fit on Springboard). And, Apple claims, that Bundle Display name must correspond to Bundle name, i.e. you cannot use bundle name TheApplication, and bundle display name Something Other
在部分情况下如果Product Name为中文字符,会导致编译运行在真机时,第一次必报 Could not inspect the application package. 错误,这个可以参考《使用 Xcode6 在 iOS8 设备上调试报错 Could not inspect the application package》。

2.2注意:

遇到了这种情况,将Product Name设置成为了英文名,而将Bundle Display Name设置为中文名。
参考stackOverFlow:Bundle Name, Executable Name, Product Name…anything else?

2.3实现步骤。

2.3.1、打开Xcode, 选中项目文件夹下的project图标,再选中文件Dock目录中的project图标。

操作步骤1.png

2.3.2、选中project面板上的info选项

2.3.3、选择简体中文Chinese(Simplified,China)(zh-Hans-CN)

2.3.4、在Xcode界面上使用快捷键 Command + N 新建文件 Resource中选择 Strings File

2.3.5、命名为 InfoPlist.strings,然后创建。(即为项目添加一份本地化资源文件)

操作步骤2.png

2.3.6、选中InfoPlist.strings文件,打开Xcode家岔气面板,找到其中的Localization选项。

2.3.7、选中Chinese(Simplified,China)添加中文的本地化(选中English添加英文的本地化)

Snip20161229_3.png

2.3.8、选中检查面板的Localization,勾选☑️Base既可以添加Base的本地化文件。(勾选☑️English既可以添加English的本地化文件。)

2.3.9、选择Xcode的info.plist ,显示原始键值对(Show Raw Keys/Values)

获取原始键值对.png

2.3.10、在English的InfoPlist.strings文件中,配置 CFBundleDisplayName

CFBundleDisplayName = "locale"; // 一定要设置分号 并且不要在字符串前面添加@符号

2.3.11、在Chinese(Simplified,China)的InfoPlist.strings中配置CFBundleDisplayName

CFBundleDisplayName = "本地化"; // 一定要设置分号 并且不要在字符串前面添加@符号

如果模拟器的语言设置是英文,将会看到应用的显示名称为“Locale”。语言设置为简体中文是,将会看到应用的显示名称为@"本地化"。【模拟器的Home键--->command + shift + H返回到应用程序列表。设置(Settings)----》通用(Gneral)------》语言和区域(Langauge and Rigion)--------》区域(Rigion) -------》对应的语言------》Done(确定)】。模拟器在运行时可能看不到最新的应用名称,这是因为模拟器有时候会缓存一些信息。这就需要我们把模拟器上已经运行的应用程序卸掉【选中模拟器中应用程序图标,长按,点击应用程序图标左上角的❌】,重新运行一次。

3、图片的本地化

3.1、拖入一张照片到iOS项目中。(需要☑️Copy items if needed 和 Create groups 还有Add To Targets)

Snip20161229_16.png

3.2、在项目中选中图片,打开Xcode右侧的文件检查面板,找到其中的Localization选项。

3.3、在对应的对话框中选择Chinese(Simplified,China),那么图片会被添加到zh-Hans-CN.lproj文件夹中。

3.4、同理把对应的图片(英语语言的图片、基础语言的图片(中文的应用程序就选择中文的图片))添加到对应的本地化文件夹中。(XXXX.lproj文件夹)

需要注意的是图片的名称需要时相同的。

4、文本的本地化(字符串的本地化操作)

4.1、和之前创建InfoPlist.strings文件相同,不同的是文件名称为Localizable.strings。

补充:也可以通过genstrings命令来生成资源文件,这种方式创建的资源文件会自动包含应用程序需要用到的所有的key【启动OS X系统的终端窗口,使用cd命令进入到iOS项目所在目录执行这个命令。】

Objective-C语言使用 genstrings *.m 命令
swift语言使用 genstrings *.swift命令

4.2、分别对应的文件夹中写入对应的文本内容。注意,zh-Hans-CN.lproj和en.lproj两个文件中的key需要保持一致。

/* 
  Localizable.strings
  名称本地化
 Localizable.strings(Chinese(Simplified))
*/
"loacl" = "我们 我们都是好孩子";
/* 
  Localizable.strings
  名称本地化
 Localizable.strings(English)
*/
"loacl" = "Hello! we are good boys";

4.3、获取key所对应的内容。【在这里key最好定义成一个宏,避免在书写的时候出现错误】

self.iconView.image = [UIImage imageNamed:@"1.png"];
self.nameLabel.text = NSLocalizedString(@"loacl", @"这是一个注释的内容");

注意:当故事板是以Main.strings的样式展示的时候需要选择Main.storyBoard的格式才会正常显示。

不正常展示.png

解决办法

IB类型.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容