狠狠撸

狠狠撸Share a Scribd company logo
Localization




范圣刚,princetoad@gmail.com,www.tfan.org
国际化和本地化
? ?首先我们来理解?一下国际化和本地化的概念
? 所谓国际化,是指我们要确保我们的应?用中没有
本地?文化相关的信息被硬编码在?里?面。
? 所谓的本地?文化相关的信息,我们指的是语?言,
货币,?日期格式,数字格式等。
? ?而本地化,是指在我们的应?用程序要中基于?用户
的“语?言”和“区域格式”的设置提供恰当的数据。
多语?言环境
$ 和 区域:中国
? 我们现在的区域设置
是“中国”,应?用?里?面有
关货币符号的显?示却
是$

? 这是因为我们把 $ 符
号硬编码到我们的程
序中了
硬编码的?一个例?子


[[cell valueLabel] setText:
[NSString
stringWithFormat:@"$%d", [p
valueInDollars]]];
使?用 NSLocale 进?行国际化
? 在 ItemsViewController.m 中,定位到
  tableView:cellForRowAtIndexPath: ?方法

? 当我们设置单元格的 valueLabel 的?文本时,我们
  使?用了字符串 “$%d”,这就使当前的货币符号永
  远是?一个美元符号。

? ?用下?面的代码把它替换掉我们就可以显?示针对?用
  户区域的正确的货币符号了
//    [[cell valueLabel] setText:[NSString
stringWithFormat:@"$%d", [p valueInDollars]]];
    // 对货币符号进?行那个国际化
    NSString *currentSymbol = [[NSLocale currentLocale]
objectForKey:NSLocaleCurrencySymbol];
    [[cell valueLabel] setText:[NSString
stringWithFormat:@"%@%d",
                               currentSymbol,
                               [p valueInDollars]]];
使?用 NSLocale 之后
? 然后我们来看?一下 NSLocale 的使?用
 ? 当我们发送?一个 currentLocale 消息给 NSLocale
   时,表?示?用户区域设置的?一个NSLocale 的实例就
   被返回。

 ? 拿到 NSLocale 的实例以后,我们就可以向它请求
   我们感兴趣的本地化信息,例如货币符号等

 ? 向 NSLocale 请求信息我们通过向它发送
   objectForKey: 消息,参数就是?一个 NSLocale 常量
    NSString *currentSymbol = [[NSLocale currentLocale]
objectForKey:NSLocaleCurrencySymbol];

    [[cell valueLabel] setText:[NSString
stringWithFormat:@"%@%d",
                               currentSymbol,
                               [p valueInDollars]]];
17 Localization
? DetailViewController 中的?日期标签能够?自动根据
    区域设置进?行正确显?示

 ? 这是因为我们在给这个标签设置?文本的时候使?用
    的是 NSDateFormatter 实例

 ? NSDateFormater 有?一个 locale 属性,它被设置成
    设备当前的 locale。

 ? 任何时候我们使?用 NSDateFormatter 来?生成?日
    期,它会检查它的 locale 属性,然后对应的设置
    格式。
- (void)viewWillAppear:(BOOL)animated
{
...
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
    [dateFormatter setTimeStyle:NSDateFormatterNoStyle];

    [dateLabel setText:[dateFormatter stringFromDate:[item dateCreated]]];
资源的本地化
? 应?用程序资源本地化的过程:
? ?生成资源的多份拷?贝,像图?片,声?音,以及为不同的
 地域和语?言设置的界?面

? 创建和访问 strings table 把?文本翻译成不同的语?言
? 只要是资源都可以被本地化,本地化以后的资源
再放?一份到 application bundle 中
? 这些资源被组织到特定语?言相关的??目录?里?面,也
就是 lproj ??目录

? 这些??目录的名字加上特定语?言的后缀
? 这?一章节我们来本地化 Homepwner 的界?面:
DetailViewController.xib ?文件

? 我们将?生成英?文和中?文的本地化,也就是说?生成
两个 lproj ??目录,每个??目录包含?一个版本的
DetailViewController.xib 的版本
? 第?一步,启?用本地化。选中
DetailViewController.xib ?文件,在 File inspector 中
点击“Localization” 后?面的 “Make localized...”按钮

? 在弹出的对话框中确认要“Localize”
? 第?二步,增加本地化。选中 project, 在右边的 info
 下?面,点击 localization下?面的 + 号,选择中?文

? 这将会在左边 project navigator 中再?生成?一个
 DetailViewController.xib ?文件
? 第三步,导出 string。
? 打开 Terminal,进?入项??目的en.lproj??目录
? 运?行: ibtool --export-strings-file ~/Desktop/
 DetailViewController.strings
 DetailViewController.xib

? 忽略命令?行提?示的警告
? 第四步,翻译。
? 打开导出的 string ?文件
? 第五步,把新的 string ?文件写?入到中?文 XIB ?文件中
? 打开 Terminal,输?入后?面的内容但不要回?车:
 ibtool --import-strings-file ~/Desktop/
 DetailViewController.strings --write

? 把zh-Hans.lproj ??目录下的 DetailViewController.xib
 ?文件拖到 Terminal 窗?口中,再把 en.lproj 下?面的
 DetailViewController.xib ?文件拖进terminal 窗?口
 (后?面拖?入的两个?文件的路径会被附加到前?面输
 ?入的命令后?面)

? 回?车
? 第六步,打开中?文的 xib ?文件确认?一下。
? 第七步,运?行看?一下
NSLocalizedString 和 Strings
           Table
? 本地化程序?里?面的字符串,对 ItemViewController
  的标题进?行本地化

 ? ?首先定位到 ItemViewController.m 的 init 函数中,
  修改设置 title 的代码

        // 本地化 Homepwner 的标题
//        [n setTitle:@"Homepwner"];
        [n setTitle:NSLocalizedString(@"Homepwner",
@"Name of application")];
? ?生成 string table
? 打开 Terminal 窗?口,定位ItemsViewController 所
 在??目录,输?入: genstrings
 ItemsViewController.m

? 将会在同?一??目录?生成名为 Localizable.strings 的?文
 件

? 拖到我们的项??目??目录中
? 像前?面?一样对它进?行 make localization
? 选中?文件,在右边属性?面板的 localization 区域勾
 选上,Chinese

? 这样会?生成?一个中?文版的 string table
? 进?行翻译
? 运?行程序
Ad

Recommended

14 Saving Loading and Application States
14 Saving Loading and Application States
Tom Fan
?
02 Objective-C
02 Objective-C
Tom Fan
?
05 MapKit and Text Input
05 MapKit and Text Input
Tom Fan
?
16 CoreData
16 CoreData
Tom Fan
?
07 View Controllers
07 View Controllers
Tom Fan
?
03 Managing Memory with ARC
03 Managing Memory with ARC
Tom Fan
?
Network and Multitasking
Network and Multitasking
yarshure Kong
?
J Query Learn
J Query Learn
guestfb42fc
?
颈翱厂程序设计-数据持久化
颈翱厂程序设计-数据持久化
qiyutan
?
顿辞肠办别谤进阶探讨
顿辞肠办别谤进阶探讨
國昭 張
?
颁贬04:认识物件
颁贬04:认识物件
Justin Lin
?
冲浪 Object-c
冲浪 Object-c
jeff kit
?
Ch07 使用 JSTL
Ch07 使用 JSTL
Justin Lin
?
10. 資料永續與交換
10. 資料永續與交換
Justin Lin
?
迟飞惭痴颁#36颁#的美丽与哀愁
迟飞惭痴颁#36颁#的美丽与哀愁
twMVC
?
狈辞厂蚕尝-惭辞苍驳辞顿叠介绍
狈辞厂蚕尝-惭辞苍驳辞顿叠介绍
國昭 張
?
AJAX Basic
AJAX Basic
Ryan Chung
?
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
?
合久必分,分久必合
合久必分,分久必合
Qiangning Hong
?
Script with engine
Script with engine
Webrebuild
?
04 Delegation and Core Location
04 Delegation and Core Location
Tom Fan
?
颁贬09:颁辞濒濒别肠迟颈辞苍与惭补辫
颁贬09:颁辞濒濒别肠迟颈辞苍与惭补辫
Justin Lin
?
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Justin Lin
?
KISSY for starter
KISSY for starter
yiming he
?
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
?
Servlet & JSP 教學手冊第二版 - 課後練習解答
Servlet & JSP 教學手冊第二版 - 課後練習解答
Justin Lin
?
Ch03 請求與回應
Ch03 請求與回應
Justin Lin
?
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Justin Lin
?
[LaravelConf Taiwan 2018] 跨境電商的眉眉角角
[LaravelConf Taiwan 2018] 跨境電商的眉眉角角
LaravelConfTaiwan
?
设计师转型培训-工具篇
设计师转型培训-工具篇
Robert Luo
?

More Related Content

What's hot (20)

颈翱厂程序设计-数据持久化
颈翱厂程序设计-数据持久化
qiyutan
?
顿辞肠办别谤进阶探讨
顿辞肠办别谤进阶探讨
國昭 張
?
颁贬04:认识物件
颁贬04:认识物件
Justin Lin
?
冲浪 Object-c
冲浪 Object-c
jeff kit
?
Ch07 使用 JSTL
Ch07 使用 JSTL
Justin Lin
?
10. 資料永續與交換
10. 資料永續與交換
Justin Lin
?
迟飞惭痴颁#36颁#的美丽与哀愁
迟飞惭痴颁#36颁#的美丽与哀愁
twMVC
?
狈辞厂蚕尝-惭辞苍驳辞顿叠介绍
狈辞厂蚕尝-惭辞苍驳辞顿叠介绍
國昭 張
?
AJAX Basic
AJAX Basic
Ryan Chung
?
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
?
合久必分,分久必合
合久必分,分久必合
Qiangning Hong
?
Script with engine
Script with engine
Webrebuild
?
04 Delegation and Core Location
04 Delegation and Core Location
Tom Fan
?
颁贬09:颁辞濒濒别肠迟颈辞苍与惭补辫
颁贬09:颁辞濒濒别肠迟颈辞苍与惭补辫
Justin Lin
?
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Justin Lin
?
KISSY for starter
KISSY for starter
yiming he
?
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
?
Servlet & JSP 教學手冊第二版 - 課後練習解答
Servlet & JSP 教學手冊第二版 - 課後練習解答
Justin Lin
?
Ch03 請求與回應
Ch03 請求與回應
Justin Lin
?
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Justin Lin
?
颈翱厂程序设计-数据持久化
颈翱厂程序设计-数据持久化
qiyutan
?
顿辞肠办别谤进阶探讨
顿辞肠办别谤进阶探讨
國昭 張
?
颁贬04:认识物件
颁贬04:认识物件
Justin Lin
?
冲浪 Object-c
冲浪 Object-c
jeff kit
?
10. 資料永續與交換
10. 資料永續與交換
Justin Lin
?
迟飞惭痴颁#36颁#的美丽与哀愁
迟飞惭痴颁#36颁#的美丽与哀愁
twMVC
?
狈辞厂蚕尝-惭辞苍驳辞顿叠介绍
狈辞厂蚕尝-惭辞苍驳辞顿叠介绍
國昭 張
?
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
?
合久必分,分久必合
合久必分,分久必合
Qiangning Hong
?
Script with engine
Script with engine
Webrebuild
?
04 Delegation and Core Location
04 Delegation and Core Location
Tom Fan
?
颁贬09:颁辞濒濒别肠迟颈辞苍与惭补辫
颁贬09:颁辞濒濒别肠迟颈辞苍与惭补辫
Justin Lin
?
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Justin Lin
?
KISSY for starter
KISSY for starter
yiming he
?
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
?
Servlet & JSP 教學手冊第二版 - 課後練習解答
Servlet & JSP 教學手冊第二版 - 課後練習解答
Justin Lin
?
Ch03 請求與回應
Ch03 請求與回應
Justin Lin
?
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Justin Lin
?

Similar to 17 Localization (9)

[LaravelConf Taiwan 2018] 跨境電商的眉眉角角
[LaravelConf Taiwan 2018] 跨境電商的眉眉角角
LaravelConfTaiwan
?
设计师转型培训-工具篇
设计师转型培训-工具篇
Robert Luo
?
使用顿蝉濒改善软件设计
使用顿蝉濒改善软件设计
mingjin
?
领域驱动设计实践
领域驱动设计实践
Jacky Chi
?
Map&Location-Swift
Map&Location-Swift
Ryan Chung
?
Artifacts management with CI and CD
Artifacts management with CI and CD
Chen-Tien Tsai
?
模块一-骋辞语言特性.辫诲蹿
模块一-骋辞语言特性.辫诲蹿
czzz1
?
iOS平台应用详解:《Siri:I,robot! Siri语音识别系统详解》| 新浪 张俊林
iOS平台应用详解:《Siri:I,robot! Siri语音识别系统详解》| 新浪 张俊林
imShining @DevCamp
?
打造国际化产物:厂迟谤颈办颈苍驳濒测的滨18苍实践
打造国际化产物:厂迟谤颈办颈苍驳濒测的滨18苍实践
Daniel Gong
?
[LaravelConf Taiwan 2018] 跨境電商的眉眉角角
[LaravelConf Taiwan 2018] 跨境電商的眉眉角角
LaravelConfTaiwan
?
设计师转型培训-工具篇
设计师转型培训-工具篇
Robert Luo
?
使用顿蝉濒改善软件设计
使用顿蝉濒改善软件设计
mingjin
?
领域驱动设计实践
领域驱动设计实践
Jacky Chi
?
Map&Location-Swift
Map&Location-Swift
Ryan Chung
?
Artifacts management with CI and CD
Artifacts management with CI and CD
Chen-Tien Tsai
?
模块一-骋辞语言特性.辫诲蹿
模块一-骋辞语言特性.辫诲蹿
czzz1
?
iOS平台应用详解:《Siri:I,robot! Siri语音识别系统详解》| 新浪 张俊林
iOS平台应用详解:《Siri:I,robot! Siri语音识别系统详解》| 新浪 张俊林
imShining @DevCamp
?
打造国际化产物:厂迟谤颈办颈苍驳濒测的滨18苍实践
打造国际化产物:厂迟谤颈办颈苍驳濒测的滨18苍实践
Daniel Gong
?
Ad

More from Tom Fan (20)

PhoneGap 通信原理和插件系统
PhoneGap 通信原理和插件系统
Tom Fan
?
HTML5 Web workers
HTML5 Web workers
Tom Fan
?
Web sockets
Web sockets
Tom Fan
?
Storage
Storage
Tom Fan
?
Semantics
Semantics
Tom Fan
?
Multimedia
Multimedia
Tom Fan
?
Intro to-html5
Intro to-html5
Tom Fan
?
Html5 history
Html5 history
Tom Fan
?
Geolocation
Geolocation
Tom Fan
?
File api
File api
Tom Fan
?
Deviceaccess
Deviceaccess
Tom Fan
?
Css3
Css3
Tom Fan
?
Webstorage
Webstorage
Tom Fan
?
Html5 最重要的部分
Html5 最重要的部分
Tom Fan
?
AT&T 的 HTML5 策略和应用现状
AT&T 的 HTML5 策略和应用现状
Tom Fan
?
PhoneGap 2.0 开发
PhoneGap 2.0 开发
Tom Fan
?
Android 平台 HTML5 应用开发
Android 平台 HTML5 应用开发
Tom Fan
?
HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型
Tom Fan
?
18 NSUserDefaults
18 NSUserDefaults
Tom Fan
?
15 Subclassing UITableViewCell
15 Subclassing UITableViewCell
Tom Fan
?
PhoneGap 通信原理和插件系统
PhoneGap 通信原理和插件系统
Tom Fan
?
HTML5 Web workers
HTML5 Web workers
Tom Fan
?
Web sockets
Web sockets
Tom Fan
?
Intro to-html5
Intro to-html5
Tom Fan
?
Html5 history
Html5 history
Tom Fan
?
Geolocation
Geolocation
Tom Fan
?
Deviceaccess
Deviceaccess
Tom Fan
?
Html5 最重要的部分
Html5 最重要的部分
Tom Fan
?
AT&T 的 HTML5 策略和应用现状
AT&T 的 HTML5 策略和应用现状
Tom Fan
?
PhoneGap 2.0 开发
PhoneGap 2.0 开发
Tom Fan
?
Android 平台 HTML5 应用开发
Android 平台 HTML5 应用开发
Tom Fan
?
HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型
Tom Fan
?
18 NSUserDefaults
18 NSUserDefaults
Tom Fan
?
15 Subclassing UITableViewCell
15 Subclassing UITableViewCell
Tom Fan
?
Ad

17 Localization