一、简介

* 使用本地化功能,可以轻松地将应用程序翻译成多种语言,甚至可以翻译成同一语言的多种方言

* 如果要添加本地化功能,需要为每种支持的语言创建一个子目录,称为”本地化文件夹”,通常使用.lproj作为拓展名

* 当本地化的应用程序需要载入某一资源时,如图像、属性列表、nib文件,应用程序会检查用户的语言和地区,并查找相匹配的本地化文件夹。如果找到了相应的文件夹,就会载入这个文件夹中的资源

二、默认的效果图

工程目录结构

运行效果图(因为没有使用本地化功能,所以不管用户选择什么语言环境,运行的效果都是一样的)

  

现在想在中文语言环境下,换另一套实现,其中包括:

* 更改nib文件中的文字(nib本地化)

* 更改登录按钮下面的图片(图片本地化)

* 更改对话框中的文字(Tip和Ok)(字符串本地化)

* 更改应用名称(应用名称本地化,即本地化Info.plist文件)

三、本地化前的准备

其实就是先创建好中文的本地化文件夹(zh-Hans.lproj),让应用程序支持中文语言环境

选择当前需要本地化的资源

选择Finish后,会发现硬盘上多了一个中文的本地化文件夹zh-Hans.lproj,至于en.lproj文件夹是英文的本地化文件夹,创建项目时默认就有的

项目中的MJViewController.xib、InfoPlist.strings文件左边也多了个可以展开的三角形,展开可以发现分别都有2个版本的文件

MJViewController.xib(English)对应en.lproj文件夹中的MJViewController.xib文件

InfoPlist.strings(English)对应en.lproj文件夹中的InfoPlist.strings文件

MJViewController.xib(Chinese)对应zh-Hans.lproj文件夹中的MJViewController.xib文件

InfoPlist.strings(Chinese)对应zh-Hans.lproj文件夹中的InfoPlist.strings文件

准备工作做完后,就可以开始展开本地化工作了

四、nib文件的本地化

打开MJViewController.xib(Chinese)文件,修改里面的文字信息(这里不修改图片)

 

五、应用程序名称本地化(Info.plist本地化)

知识背景:Info.plist中有个叫CFBundleDisplayName的key决定了应用程序的名称

1.为Info.plist添加一个key-value,让应用程序支持名称本地化,Info.plist就会去InfoPlist.strings加载CFBundleDisplayName对应的字符串

2.在InfoPlist.strings(English)文件中加入:

  1. CFBundleDisplayName="Localization";

3.在InfoPlist.strings(Chinese)文件中加入:

  1. CFBundleDisplayName="本地化";

六、图片本地化

(这里演示本地化home.png,nib文件中登录按钮下面的房子图片)

1.单击选中home.png,然后查看右上角的视图

2.选了Localize代表会将home.png加入到英语的本地化文件夹en.lproj中去

3.添加图片支持中文语言

4.查看下硬盘中home.png的情况

5.而且项目中的home.png左边也多了个可以展开的三角形,展开可以发现有2个版本的文件

home.png(English)对应en.lproj文件夹中的home.png文件

home.png(Chinese)对应zh-Hans.lproj文件夹中的home.png文件

6.用预先准备好的另外一张图片替换zh-Hans.lproj文件夹中的home.png

7.替换后查看项目中home.png的情况

8.在代码中照常使用图片即可

  1. [UIImage imageNamed:@"home.png"];

注意:本地化完图片文件,记得Clean一下项目,而且最好先删除应用程序,再重新安装

七、字符串的本地化

1.创建一个字符串资源文件

2.文件名最好是Localizable.strings,如果使用其他文件名,使用字符串时的调用会有些区别

3.为Localizable.strings添加多语言支持(跟上面图片本地化类似),选中Localizable.strings文件,查看右上角的视图

4.选了Localize代表会将Localizable.strings加入到英语的本地化文件夹en.lproj中去

5.添加支持中文语言

6.查看下硬盘中Localizable.strings的情况

7.而且项目中的Localizable.strings左边也多了个可以展开的三角形,展开可以发现有2个版本的文件

Localizable.strings(English)对应en.lproj文件夹中的Localizable.strings文件

Localizable.strings(Chinese)对应zh-Hans.lproj文件夹中的Localizable.strings文件

8.在Localizable.strings(English)文件加入:

  1. Tip="Tip";
  2. Ok="Ok";

9.在Localizable.strings(Chinese)文件加入:

  1. Tip="提示";
  2. Ok="好的";

10.在代码中使用NSLocalizedString(key, comment)来读取本地化字符串,key是Localizable.strings文件中等号左边的字符串,comment纯粹是注释

  1. NSString *tip = NSLocalizedString(@"Tip", nil);
  2. NSString *ok = NSLocalizedString(@"Ok", nil);

如果没有对字符串进行本地化 或者 找不到key对应的值,NSLocalizedString将直接返回key这个字符串

注意:如果你的字符串资源文件名不是Localizable.strings,如mj.strings,那么你就得使用NSLocalizedStringFromTable()来读取本地化字符串:

  1. NSLocalizedStringFromTable(@"Tip", @"mj", nil);

补充:生成字符串资源文件的另一种方式(通过终端命令)

1.首先添加获取字符串的代码,比如在MJViewController.m

  1. NSString *tip = NSLocalizedString(@"Tip", @"dialog title");
  2. NSString *ok = NSLocalizedString(@"Ok", @"dialog button");

2.打开终端,定位到MJViewController.m所在的文件夹,输入genstrings命令,生成字符串资源文件

3.打开文件夹,已经生成了字符串资源文件

如果使用NSLocalizedStringFromTable(key, tbl, comment)来获取字符串,资源文件会以tbl参数作为文件名,比如

  1. NSString *tip = NSLocalizedStringFromTable(@"Tip", @"mj", @"dialog title");
  2. NSString *ok = NSLocalizedStringFromTable(@"Ok", @"mj", @"dialog button");

生成的资源文件为:mj.strings

4.将资源文件导入项目即可,然后打开资源文件,可以发现已经生成了key和comment

  1. /* dialog button */
  2. "Ok" = "Ok";
  3. /* dialog title */
  4. "Tip" = "Tip";

八、其他文件的本地化

跟六中图片本地化的原理是一样的,重复六中的每个步骤即可

九、最终效果演示

1.英文环境下

 

 

2.中文环境下

 

 

iOS开发之本地化的更多相关文章

  1. IOS开发基础知识--碎片19

    1:键盘事件顺序 UIKeyboardWillShowNotification // 键盘显示之前 UIKeyboardDidShowNotification // 键盘显示完成后 UIKeyboar ...

  2. iOS开发路线简述

    1 iOS开发环境1.1 开发环境标准的配置是MacOSX+Xcode.MacOSX的话首选用苹果电脑,Macmini最便宜只要4000多就好了然后自己配一个显示器,MacBookPro 也可以,不推 ...

  3. iOS开发(OC)中的命名规范

    开小差:最近发现自己有一个经验主义的毛病,不太容易接受新的知识,这对从事技术研发的人来说不太合理,需要改之. 正文:通过读写大量代码我有自己的一套编程思路和习惯,自认为自己的编码习惯还是不错的,代码结 ...

  4. iOS开发UI篇—常见的项目文件介绍

    iOS开发UI篇—常见的项目文件介绍 一.项目文件结构示意图 二.文件介绍 1.products文件夹:主要用于mac电脑开发的可执行文件,ios开发用不到这个文件 2.frameworks文件夹主要 ...

  5. iOS开发--应用设置及用户默认设置——转载

    [链接]iOS开发--应用设置及用户默认设置[1.bundlehttp://www.jianshu.com/p/6f2913f6b218 在iphone里面,应用都会在“设置”里面有个专属的应用设置, ...

  6. iOS:iOS开发非常全的三方库、插件等等

    iOS开发非常全的三方库.插件等等 github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章转自git ...

  7. iOS开发--iOS及Mac开源项目和学习资料

    文/零距离仰望星空(简书作者)原文链接:http://www.jianshu.com/p/f6cdbc8192ba著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 原文出处:codecl ...

  8. 《iOS开发指南》正式出版-源码-样章-目录,欢迎大家提出宝贵意见

    智捷iOS课堂-关东升老师最新作品:<iOS开发指南-从0基础到AppStore上线>正式出版了 iOS架构设计.iOS性能优化.iOS测试驱动.iOS调试.iOS团队协作版本控制.... ...

  9. Mac和iOS开发资源汇总

    小引 本文主要汇集一些苹果开发的资源,会经常更新,建议大家把这篇文章单独收藏(在浏览器中按command+D). 今天(2013年7月19日)收录了许多中文网站和博客.大家一定要去感受一下哦. 如果大 ...

随机推荐

  1. setvbuf

    函数名: setvbuf 用 法: int setvbuf(FILE *stream, char *buf, int type, unsigned size); type : 期望缓冲区的类型: _I ...

  2. BigInteger和BigDecimal大数相加问题

    package cn.hncu.big; import java.math.BigDecimal; public class BigDecimalDemo { public static void m ...

  3. Android 开发第二天

    开发入门HelloWorld 首先打开开发工具 第一步 第二步 效果图 以后可以点击一直下去 第三步骤介绍一下里面项目的作用 SRC是用来保存源代码的东西MainAcrivity.java主视图res ...

  4. C# 反射的简单用法

    新建两个项目:类库(Model)和控制台应用程序(ReflectTest). 在[Model]中添加一个类[User]: namespace Model { public class User { p ...

  5. .Net程序员快速学习安卓开发-布局和点击事件的写法

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 本系列课程 致力于老手程序员可以快速入门学习安卓开发.系统全面的从一个.Net程序员的角度一步步学习总结安 ...

  6. 我也来学着写写WINDOWS服务-解析xml抓取数据并插入数据库

    项目告一段落,快到一年时间开发了两个系统,一个客户已经在试用,一个进入客户测试阶段,中间突然被项目经理(更喜欢叫他W工)分派一个每隔两小时用windows服务去抓取客户提供的外网xml,解析该xml, ...

  7. Python入门 学习笔记 (二)

      今天学习了一些简单的语法规则,话不多说,开始了:      二.数据类型                常用数据类型中的整形和浮点型就不多说了.                1.字符串     ...

  8. ios tableview 上加 textfiled

    ios tableview 上加 textfiled 首先附上我项目中用曾经用到的几张图  并说明一下我的用法: 图1: 图2: 图3: 心在你我说一下  我当初的实现 方法 ,希望能给你们一些  启 ...

  9. 10.12_win8风格,把专业书籍当小说看,SQLite

    (1)CSS:Metro UI CSS(Metroui) 是一套实现了 Windows 8 的 Metro 风格界面的 CSS 框架..官网.BootMetro . (2)[开源访谈]CecOS作者 ...

  10. DAG模型——硬币问题

    硬币问题 有n种硬币,面值分别为V1,V2,...,Vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值.1<=n<=100, 0& ...