17 localization
DESCRIPTION
国际化和本地化TRANSCRIPT
Localization
范圣刚,[email protected],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]]];
•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-!le ~/Desktop/DetailViewController.strings DetailViewController.xib
•忽略命令⾏行提⽰示的警告
•第四步,翻译。•打开导出的 string ⽂文件
•第五步,把新的 string ⽂文件写⼊入到中⽂文 XIB ⽂文件中
•打开 Terminal,输⼊入后⾯面的内容但不要回⻋车:ibtool --import-strings-!le ~/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
•进⾏行翻译•运⾏行程序