同学面试时遇到一个问题,面试官问他,有一个现成的APP马上要上线了,怎么在不改原来代码,也不改xib、storyboard里的文字的情况下快速实现国际化。这里应同学请求写下此教程。反正国际化的步骤都要搞一遍,干脆写一个详细、全面的教程。

一、配置国际化语言

点击progect->info->localizations下的‘+’,选择你要支持的语言,默认支持英文,如下图

二、应用名称国际化

  新建一个Strings File类型的文件,且名称必须为InfoPlist。

  选中刚刚新建的文件,在Xcode的右侧文件检查器中点击Localize,点击Localize后,会弹出一个对话框,展开对话框列表,选择我们需要本地化的语言如English,然后点击对话框的Localize按钮。

  再看Xcode右侧的File inspection变成了下图的样式,勾选需要支持的中文、英文,如下图

  你刚刚新建的InfoPlist.stirings左侧多了一个箭头,点击箭头可以展开,可以看到中文、英文两个文件。在英文文件中加一句代码

CFBundleDisplayName = "LFInternationalizationDemo";

  在中文文件中加一句代码

CFBundleDisplayName = "峰哥国际化示例";

  运行你的APP,查看APP名称,切换手机语言,再运行你的APP,查看APP名称。

三、APP中文字国际化

  和应用名称国际化一样,新建一个Strings File类型的文件,不一样的是名称必须为Localizable。在Xcode的右侧文件检查器中点击Localize,然后跟上面步骤一样直到可以展开中、英文两个Localizable.strings。

  英文文件中加代码

"账号" = "Account";
"登录" = "Login";

  中文文件中加代码

"账号" = "账号";
"登录" = "登录";

  解释一下:冒号左边是key,右边是value,使用时我们用的是key,然后NSLocalizedString方法会翻译成对应的语言。由于进行国际化之前,APP是中文版,所以用中文作为key,为快速国际化打基础,否则做不了快速国际化。

  然后给label、button设置文字代码如下

self.lbAccount.text = NSLocalizedString(@"账号", nil);
[self.btLogin setTitle:NSLocalizedString(@"登录", nil) forState:UIControlStateNormal];

四、Storyboard或XIB国际化

先将中文版或英文版中一个开发完整后,再进行国际化,这样会省事很多,否则你要在多份storyboard或xib上开发。我这里先做好了中文版。

选中storyboard,跟上面步骤一样,在Xcode的右侧文件检查器中勾选支持的语言,如下图

展开storyboard文件如下图

打开Main.strings(English),或Main.strings(Chiness),发现都是中文的。这时候你需要将Main.strings(English)中的中文改成英文。

如果你觉得密密麻麻都是文字,分不清对应哪个控件上的文字。你可以将.strings文件变成.storyboard文件,像下图这样(不推荐)

这时候你就可以生成多个语言版本的.storyboard文件,可以直观的改你需要改的语言。不过我不推荐这样搞,因为一旦布局有改动,你要改多个.storyboard文件的布局,用Main.strings方便点,只需要关心文字,不需要关心布局。

五、图片、声音文件国际化

1.方式1

  搞两套图片,一套英文命名,一套中文命名。然后跟文字国际化一样获取当前语言图片名字

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

2.方式2

  两套图片一样的名字,将其中一套图片拖到工程。选中一张图片,跟前面InfoPlist.stirings文件一样,在Xcode的右侧文件检查器中点击Localize,勾选需要支持的语言。然后,右击1@2x.png->show in Finder,我们发现在en.Iproj和zh-Hans.lproj文件中多了一个名为1@2x.png的图片。将这个图片换成对应语言的图片即可。

  声音文件跟图片一样、不说了。

六、应用内切换语言

  到手机设置里切换语言太麻烦,我们可以做成应用内切换语言。

//自动跟随系统
- (IBAction)autoLanguage:(id)sender {
  //获取手机语言
NSString *phoneLanguage = [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode];
[self changeLanguage:phoneLanguage];
}
- (IBAction)chiness:(id)sender {
[self changeLanguage:@"zh-Hans"];
}
- (IBAction)english:(id)sender {
[self changeLanguage:@"en"];
} - (void)changeLanguage:(NSString *)language {
   //设置本app语言,注意key一定是@"AppleLanguages",即使下次启动APP,也是现在设置的这个语言。
[[NSUserDefaults standardUserDefaults] setObject:@[language] forKey:@"AppleLanguages"];
[NSBundle setMainBundelLanguage:language];   //如果你的storyboard生成的多个语言的.storyboard文件,则获取当前storyboard的bundel如下
NSBundle * currentMainBundel = [NSBundle getCurrentMainBundel];
  //如果你的storyboard 生成的多个语言的Main.strings文件,则获取当前storyboard的bundel如下
  NSBundle * currentMainBundel = [NSBundle mainBundle];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:currentMainBundel];
MainTabBarController *tabbar = [storyboard instantiateViewControllerWithIdentifier:@"MainTabBarController"];
[UIApplication sharedApplication].keyWindow.rootViewController = tabbar;
[[UIApplication sharedApplication].keyWindow makeKeyAndVisible];
}

  这里setMainBundelLanguage和getCurrentMainBundel两个方法是封装在 NSBundle 的 category中,这里不贴出代码了,后面会给出demo

七、如何快速国际化一个现成APP

  篇幅太长就不贴代码了,这里讲下思路,具体代码后面会给出demo。

1.代码中设置文字、设置图片的快速国际化

  前提条件:本教程第一步、第二步走完,本教程第三步生成了各语言版本的Localizable.strings后,按产品要求将需要翻译的文字按键值对格式写进各语言的Localizable.strings中。注意:如果现成的app是中文版,则key要是中文。

  思路就是利用runtime的交换方法,将label的 setText方法换成你的设置文字方法,在你的方法里先获取对应语言的文字,再赋值给label。你可以写一个UILabel的category,在category将系统的setText和你的设置文字方法交换。你原项目代码不需要做任何处理,连import这个category都不需要,即可快速国际化。图片快速国际化同理。

2.storyboard或xib中设置文字、图片的快速国际化

  文字的国际化见第四步,只是有一点要注意,不要生成多个语言的.storyboard文件,应该生成Main.strings文件,如下图。打开Main.strings(English),或Main.strings(Chiness),发现都是中文的。这时候你需要将Main.strings(English)中的中文改成英文。

  图片的国际化见第五步的方式2。

demo地址https://github.com/zhanglinfeng/LFInternationalizationDemo

iOS 国际化最新最全教程+如何快速国际化一个现成APP的更多相关文章

  1. 用Python快速实现一个垃圾分类APP|附带微信小程序

    最近北京开始实行垃圾分类,导致大家对垃圾的研究热度突然涨高,垃圾们也纷纷表示从来没有获得过这么高的关注度.其实,上海市去年已经开始实行,网上已经有不少成熟的教程了,像什么<垃圾分类从入门到精通& ...

  2. 最新 uni-app 免费教程

    最新 uni-app 免费教程 uni-app 快速入门 steps 建议第一步,看完uni-app官网的首页介绍. 建议第二步,通过快速上手,亲身体验下uni-app. 建议第三步,看完<un ...

  3. Docker最全教程——从理论到实战(六)

    托管到腾讯云容器服务 托管到腾讯云容器服务,我们的公众号“magiccodes”已经发布了相关的录屏教程,大家可以结合本篇教程一起查阅.   自建还是托管? 在开始之前,我们先来讨论一个问题——是自建 ...

  4. OpenCV On Android环境配置最新&最全指南(Android Studio篇)

    本文是从本人简书上搬运而来,属本人原创,如有转载,请注明出处:http://www.jianshu.com/p/6e16c0429044 简介 本文是<OpenCV On Android环境配置 ...

  5. OpenCV On Android环境配置最新&最全指南(Eclipse篇)

    简介 本教程是经过本人多次踩坑,并参考网上众多OpenCV On Android的配置教程总结而来,尽希望能帮助学习移动图像处理的朋友们少走弯路.这也是本人第一次在简书上发布文章,如有不足,希望各位d ...

  6. (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例)

    (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例) https://pan.baidu.com/s/1L54VuFwCdKVnQGVc8vD1TQnwmj java手册 Ja ...

  7. Spring_MVC_教程_快速入门_深入分析

    Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门  资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf Spring ...

  8. iOS 面试常见问题最全梳理

    序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态 ...

  9. iOS面试题最全梳理

    OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装.继承.多态.它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定.动态加载等).总体来讲,OC确实是一门不错 ...

随机推荐

  1. js 扒一扒这些题目都考了哪些知识点

    1.空数组是true还是false 题目: <script> var tmp = 'a'; if([]==false) tmp+='b'; if(![]) tmp +='c'; alert ...

  2. (转)如何用python抓取网页并提取数据

    最近一直在学这部分,今日发现一篇好文,虽然不详细,但是轮廓是出来了: 来自crifan:http://www.crifan.com/crawl_website_html_and_extract_inf ...

  3. Spring学习--实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean

    Spring 中有两种类型的 bean , 一种是普通的 bean , 另一种是工厂 bean , 即 FactroyBean. 工厂 bean 跟普通 bean 不同 , 其返回的对象不是指定类的一 ...

  4. Jquery Ajax异步上传

    <script> $(function(){ $('#filephoto').change(function(imgFile){ console.log(imgFile) var file ...

  5. IDEA的常用快捷键

    --------------在日常写代码的过程中自行整理出来----------------- *Alt+Enter 导入包 Ctrl+Alt+L 自动格式化代码 *Alt+Enter 自我修复 Sh ...

  6. 「6月雅礼集训 2017 Day2」B

    [题目大意] 求n*n的棋盘,每行每列都有2个黑格子的方案数. n<=10^7 [题解] zzq的做法好神奇啊 行列建点,二分图 左边有i个点,右边有j个点的方案数 f[i,j] 左边有i个点, ...

  7. 【Mysql优化】聚簇索引与非聚簇索引概念

    必须为主键字段创建一个索引,这个索引就是所谓的"主索引".主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE.  首先明白两句话: innod ...

  8. C++ 异常~一 转

    C++ 异常机制分析   阅读目录 C++异常机制概述 throw 关键字 异常对象 catch 关键字 栈展开.RAII 异常机制与构造函数 异常机制与析构函数 noexcept修饰符与noexce ...

  9. 使用Redirector插件解决googleapis公共库加载的问题

    最近访问一些面向国外的网站总是会出现ajax.googleaips.com无法加载的情况.以下为加载stackoverflow时的情境: 图1 -无法加载的google公共库 问题的原因是谷歌没有在国 ...

  10. 【 Zabbix 】nginx监控及故障重启服务

    zabbix agentd 端配置: nginx.conf 配置: location /ngx_status { stub_status on; access_log off; allow 10.0. ...