一、国际化(本地化)

国际化又称本地化,一句话解释也就是说:用户设置不同的手机系统语言,您的APP也分别适配不同的语言。

二、本地化类型

1、首先创建项目工程(大家都懂跳过)

2、你需要告诉我您需要做哪些国家(语言)的国际化 —— 添加本地化语言

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

备注“zh-Hans”和“zh-Hant”是简体中文和繁体中文的缩写。这是标准的缩写。H可大写也可小写。"en"是英语的缩写。ko是韩语的缩写,fr是法语的缩写。其他语言请百度或Google各国语言缩写即可查询。

(一)、应用名称本地化

应用名称本地化—— 同一个APP应用不同的语言环境对应不同的名称。例如:微信(中文)—— weChat(英文)。

1、找到项目中Supporting Files文件,选中Info.plist,右键添加新文件(或按下键盘上的command + N),选择Strings File(iOS->Resource->Strings File)新建一个infoPlist.strings文件

2、选中InfoPlist.strings,在Xcode的File inspection(Xcode右侧文件检查器)中点击Localize,目的是选择我们需要本地化的语言,如下图:

注意:在点击Localize之前,一定要保证我们已经添加了需要本地化的语言

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

4、Xcode左侧的InfoPlist.stirings左侧多了一个箭头,点击箭头可以展开,InfoPlist.strings文件下包含了English、French、Chinese(Simplified)、Chinese(Traditional)、Korean这五种语言的文件。

在程序启动时,会根据操作系统设置的语言,自动加载InfoPlist.strings文件下对应的语言文件,然后显示应用程序的名字。

5、在不同的strings文件中设置不同的APP名称即可,格式为key = value(CFBundleDisplayName = "App名称";)

例如在InfoPlist.strings(English)中加入如下代码:

CFBundleDisplayName = “weChat”;

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

CFBundleDisplayName = “Lettre datée du”;

例如在InfoPlist.strings(Simplified)中加入如下代码:

CFBundleDisplayName = “微信”;

例如在InfoPlist.strings(Traditional)中加入如下代码:

CFBundleDisplayName = “微信”;

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

CFBundleDisplayName = “미크롱 편지”;

6、结束了你懂得,是不是很简单。

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

字符串本地化——APP里面不同的语言环境显示不同的语言。例如:个人中心(中文)——Personal center(英文)

字符串本地化步骤和APP应用名称本地化基本上相同唯一不同的地方在于——文件名称 

文件名必须是Localizable.strings

文件名必须是Localizable.strings

文件名必须是Localizable.strings

重要的事情说三遍

在这里我只说使用方法:利用Foundation框架自带的NSLocalizedString(key, comment)这个宏根据Key获取对应的字符串,然后赋值给代码中的字符串。

// NSLocalizedString(key,comment) 本质

// NSlocalizeString 第一个参数是内容,根据第一个参数去对应语言的文件中取对应的字符串,第二个参数将会转化为字符串文件里的注释,可以传nil,也可以传空字符串@""。#defineNSLocalizedString(key,comment) [[NSBundle mainBundle] localizedStringForKey:(key)value:@""table:nil]

(三)、APP中图片本地化(俩种方式)

方式一:和本地化代码中的字符串一样,通过NSLocalizedString(key,comment)来获取相应的字符串,然后根据这个字符串再获取图片。

方式二

1、导入图片(这个很简单吧,不用我说了哦亲)。

2、同样点击Localize如下图:

3、在en.Iproj文件和zh-Hans.Iproj文件中分别添加一个名字为icon.png的图片然后加载到项目中。

4、利用NSLocalizedString调用图片,系统会根据语言自动加载对应的图片的。

(四)、storyBoard/Xib文件本地化(不建议使用)

首先我们需要创建一个英文的storyBoard/xib文件,在 en.lproj 文件下。然后,需要使用命令行来操作:

1. 将.storyBoard/ .xib文件 中的文字提取,另存为 .strings文件。

ibtool --generate-strings-file MainViewController.strings MainViewController.xib

2. 将 MainViewController.strings 拷贝到 zh-Hans.lproj 目录下,然后汉化该文件中的文字

3. 执行命令,根据英文的 .storyBoard/ .xib文件 和 .strings汉化文件 生成一个汉化后的 .storyBoard/ .xib 文件

ibtool --strings-file zh-Hans.lproj/MainViewController.strings --write zh-Hans.lproj/MainViewController.xib en.lproj/MainViewController.xib

4. 将生成的这个.storyBoard/ .xib 文件添加到项目中的 zh-Hans.lproj 分组下,注意要选择 Add to targets

5. 选择 File -> Info -> Localization 为对应的语言

至此,storyBoard/ xibxib文件的汉化已经完成。

三、本地化中的坑——您跳过了吗?

(一)、iOS8之后国际化语言混乱

iOS8以后,有些国际化的app,界面也突然变成了中文,但他们系统语言不是中文,是法文俄文日文等,伊书只支持中文跟英文,在不支持系统所用语言的时候,理应会自动选用英文,不知为什么会选成了中文,经过艰难困苦的重重排查,终于找到原因,知道了iOS多语言备选的规则。

主要有两个影响因素,一是CFBundleDevelopmentRegion(Info.plist的一个字段),二是iOS8新增的系统首选语言列表:

在iOS7及之前版本,系统只能设置一种语言,如果APP不支持系统设置的语言,选用备选语言的规则是:

1.如果APP支持英文,直接选择英文。

2.如果APP不支持英文,随机挑选一个。

举个例子,APP支持中文跟英文,当系统语言是不是中文或英文时,都会选择英文。若APP支持中文跟法文,系统语言不是中文或法文,将会随机挑选一个。

从iOS8开始,系统语言可以设置一个语言列表,会根据这个语言列表的排序选用备选语言,规则就变了:

1.如果APP支持的语言在系统语言列表里有,优先选择列表上排序靠前的语言。

2.如果APP支持的语言没在系统语言列表上,按CFBundleDevelopmentRegion的值选择,无论APP是否支持英文,英文不再是默认的备选语言。

举个例子,APP支持中文跟英文,CFBundleDevelopmentRegion的值是中文,当系统语言列表是[法文]或[法文,中文]时,会选择中文,系统语言列表是[法文,英文]时,会选择英文。

苹果在语言方面似乎有不少bug,调试过程中出现不少坑爹的事,例如改变增删语言文件一定要clean工程否则不生效,iOS8模拟器不认CFBundleDevelopmentRegion的值,真机才认,再加上一开始不知道iOS8系统语言变成列表这事,把我迷惑得费了大量时间。总而言之,若要国际化,让APP支持英文,CFBundleDevelopmentRegion填英文,应该万无一失。

(二)、多语言环境下格式化时间字符串,阿拉伯等部分国家无法正确显示阿拉伯数字。

首先给你普及一个常识:阿拉伯语不用阿拉伯数字显示时间  —— 这就是造成问题的原因

解决办法:NSLocale

NSLocale 类返回本地化信息,主要体现在"语言"和"格式"这两个设置上面

1、NSLocale 本地化信息的创建

NSLocale*localeOne = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];——用标示符创建

NSLocale*localeTwo = [NSLocale systemLocale];——返回系统初始本地化信息

NSLocale*localeThree = [NSLocale currentLocale];——保持在 cache 中,用此方法实例化对象后,即使修改了本地化设定,也不会改变

NSLocale*localeFour = [NSLocale autoupdatingCurrentLocale];——每次修改本地化设定,其实例化的对象也会随之改变

2、NSLocale 本地化信息的设置

NSCalendar*calendar = [NSCalendar currentCalendar];

[calendar setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];

3、NSLocale 本地化信息的获取

NSString*strSymbol = [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol];

NSCalendar*calendar = [[NSLocalecurrentLocale] objectForKey:NSLocaleCalendar];

——根据不同的 key 返回各种本地化信息

4、显示特定地区代号下相应键的显示名称

NSLocale*locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];

NSString*str = [locale displayNameForKey:NSLocaleIdentifiervalue:@"en_US"];

当NSDate *dateNow = [NSDate date]显示为:٢٠١٥٢٠١٥٢٠١٥的时候只需要在设置时间格式的时候加上上面设置就可以正确显示为:2015-09-18 07:10:45 如下图方法:

iOS国际化(本地化)详解相关推荐

  1. springboot+jsp中文乱码_【spring 国际化】springMVC、springboot国际化处理详解

    在web开发中我们常常会遇到国际化语言处理问题,那么如何来做到国际化呢? 你能get的知识点? 使用springgmvc与thymeleaf进行国际化处理. 使用springgmvc与jsp进行国际化 ...

  2. iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)

    前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...

  3. IOS 多线程04-GCD详解 底层并发 API

    IOS 多线程04-GCD详解 底层并发 API 注:本人是翻译过来,并且加上本人的一点见解. 前言 想要揭示出表面之下深层次的一些可利用的方面.这些底层的 API 提供了大量的灵活性,随之而来的是大 ...

  4. iOS核心动画详解swift版----基础动画

    2019独角兽企业重金招聘Python工程师标准>>> iOS核心动画详解swift版---基础动画 创建工程,添加2个ViewController,通过rootViewContro ...

  5. iOS教程:详解iOS多图下载的缓存机制

    ios教程,ios的干货一直来不及给大家分享,小编也是一直在忙啊!今天给大家献上ios:详解iOS多图下载的缓存机制 1. 需求点是什么? 这里所说的多图下载,就是要在tableview的每一个cel ...

  6. iOS TableView 使用详解

     IOS TableView 详解 一.建立 UITableView DataTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, ...

  7. iOS 内购详解-代码篇

    内购项目-代码篇 一.分步骤说明 1.获取商品列表 2.苹果服务器返回的可购买商品 3.下单购买商品 4.购买队列状态变化,判断购买状态是否成功 5.交易验证 6.拿到的收据信息是,此App所有购买的 ...

  8. ios NSFileManager 用法详解

    2019独角兽企业重金招聘Python工程师标准>>> iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileMana ...

  9. iOS runtime 底层详解、内部原理、场景应用

    前言学:位域和共用体 一:isa指针--runtime之前的学习 1.1:苹果应用的按位或.按位与 二:类对象信息 2.1:类对象信息:rw_t 2.2:类对象信息:方法缓存(很关键) 2.2:类对象 ...

  10. java bundle_java.util.ResourceBundle国际化用法详解

    初识国际化和ResourceBundle 这个类主要用来解决国际化和本地化问题.国际化和本地化可不是两个概念,两者都是一起出现的.可以说,国际化的目的就是为了实现本地化,详细的介绍可以看本文的最后.比 ...

最新文章

  1. 【Three.js】关于Three.js的辅助库ststs.js报错的解决方案
  2. windows下卸载oracle11g
  3. ABBYY PDF Transformer+支持的格式
  4. 计算机考研专业课资料,计算机考研专业课资料.doc
  5. Autocad下载 安装 和谐 与 卸载
  6. api 文件夹index.js 集合写法
  7. dismiss和remove_remove的近义词辨析
  8. 程序员的量化交易之路(17)--Cointrader之Temporal实体(5)
  9. 51NOD-1027 大数乘法【大数】
  10. 华为metebook电脑如何修改应用商店中新应用的默认安装路径
  11. EndNote导出毕业论文格式的参考文献
  12. 方锥体积的计算公式以及定义 初中高中数学
  13. 【C++】STL学习小总结
  14. 【深入理解多线程】 Moniter的实现原理(四)
  15. 北京四十岁男人的生活帐单
  16. 定格动画android,定格动画安卓版下载-定格动画最新版下载v2.2.2-一听下载站
  17. [Pandas技巧] 多列值合并成一列
  18. 程序物语(七):项目经理预成长
  19. 文件传输协议的五种安全文件传输替代方案
  20. ORB-SLAM2多线程用法总结

热门文章

  1. opencv warp(扭曲)球面投影的原理
  2. 深度学习:GCN图分类案例
  3. webpack之HTML、css和js代码压缩
  4. 计算机基础---01入门篇(标点符号,快捷键,文件删除与恢复,软件安装与卸载,截图,电脑隐私,文件隐藏与搜索,文件压缩解压,qq邮箱格式)
  5. Acwing:星空之夜(图的哈希 Python)
  6. 隐藏IP地址的方法利弊
  7. Splitter和Joiner使用手册
  8. STM32开发环境配置
  9. uniapp 表格组件,冻结首行首列
  10. abap中方法file_open_dialog的使用