17 Localization

316 views

Published on

国际化和本地化

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
316
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

17 Localization

  1. 1. Localization范圣刚,princetoad@gmail.com,www.tfan.org
  2. 2. 国际化和本地化• ⾸首先我们来理解⼀一下国际化和本地化的概念• 所谓国际化,是指我们要确保我们的应⽤用中没有本地⽂文化相关的信息被硬编码在⾥里⾯面。• 所谓的本地⽂文化相关的信息,我们指的是语⾔言,货币,⽇日期格式,数字格式等。• ⽽而本地化,是指在我们的应⽤用程序要中基于⽤用户的“语⾔言”和“区域格式”的设置提供恰当的数据。
  3. 3. 多语⾔言环境
  4. 4. $ 和 区域:中国• 我们现在的区域设置是“中国”,应⽤用⾥里⾯面有关货币符号的显⽰示却是$• 这是因为我们把 $ 符号硬编码到我们的程序中了
  5. 5. 硬编码的⼀一个例⼦子[[cell valueLabel] setText:[NSStringstringWithFormat:@"$%d", [pvalueInDollars]]];
  6. 6. 使⽤用 NSLocale 进⾏行国际化
  7. 7. • 在 ItemsViewController.m 中,定位到 tableView:cellForRowAtIndexPath: ⽅方法• 当我们设置单元格的 valueLabel 的⽂文本时,我们 使⽤用了字符串 “$%d”,这就使当前的货币符号永 远是⼀一个美元符号。• ⽤用下⾯面的代码把它替换掉我们就可以显⽰示针对⽤用 户区域的正确的货币符号了// [[cell valueLabel] setText:[NSStringstringWithFormat:@"$%d", [p valueInDollars]]]; // 对货币符号进⾏行那个国际化 NSString *currentSymbol = [[NSLocale currentLocale]objectForKey:NSLocaleCurrencySymbol]; [[cell valueLabel] setText:[NSStringstringWithFormat:@"%@%d", currentSymbol, [p valueInDollars]]];
  8. 8. 使⽤用 NSLocale 之后
  9. 9. • 然后我们来看⼀一下 NSLocale 的使⽤用 • 当我们发送⼀一个 currentLocale 消息给 NSLocale 时,表⽰示⽤用户区域设置的⼀一个NSLocale 的实例就 被返回。 • 拿到 NSLocale 的实例以后,我们就可以向它请求 我们感兴趣的本地化信息,例如货币符号等 • 向 NSLocale 请求信息我们通过向它发送 objectForKey: 消息,参数就是⼀一个 NSLocale 常量 NSString *currentSymbol = [[NSLocale currentLocale]objectForKey:NSLocaleCurrencySymbol]; [[cell valueLabel] setText:[NSStringstringWithFormat:@"%@%d", currentSymbol, [p valueInDollars]]];
  10. 10. • 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]]];
  11. 11. 资源的本地化
  12. 12. • 应⽤用程序资源本地化的过程:• ⽣生成资源的多份拷⻉贝,像图⽚片,声⾳音,以及为不同的 地域和语⾔言设置的界⾯面• 创建和访问 strings table 把⽂文本翻译成不同的语⾔言• 只要是资源都可以被本地化,本地化以后的资源再放⼀一份到 application bundle 中
  13. 13. • 这些资源被组织到特定语⾔言相关的⺫⽬目录⾥里⾯面,也就是 lproj ⺫⽬目录• 这些⺫⽬目录的名字加上特定语⾔言的后缀• 这⼀一章节我们来本地化 Homepwner 的界⾯面:DetailViewController.xib ⽂文件• 我们将⽣生成英⽂文和中⽂文的本地化,也就是说⽣生成两个 lproj ⺫⽬目录,每个⺫⽬目录包含⼀一个版本的DetailViewController.xib 的版本
  14. 14. • 第⼀一步,启⽤用本地化。选中DetailViewController.xib ⽂文件,在 File inspector 中点击“Localization” 后⾯面的 “Make localized...”按钮• 在弹出的对话框中确认要“Localize”
  15. 15. • 第⼆二步,增加本地化。选中 project, 在右边的 info 下⾯面,点击 localization下⾯面的 + 号,选择中⽂文• 这将会在左边 project navigator 中再⽣生成⼀一个 DetailViewController.xib ⽂文件
  16. 16. • 第三步,导出 string。• 打开 Terminal,进⼊入项⺫⽬目的en.lproj⺫⽬目录• 运⾏行: ibtool --export-strings-file ~/Desktop/ DetailViewController.strings DetailViewController.xib• 忽略命令⾏行提⽰示的警告
  17. 17. • 第四步,翻译。• 打开导出的 string ⽂文件
  18. 18. • 第五步,把新的 string ⽂文件写⼊入到中⽂文 XIB ⽂文件中• 打开 Terminal,输⼊入后⾯面的内容但不要回⻋车: ibtool --import-strings-file ~/Desktop/ DetailViewController.strings --write• 把zh-Hans.lproj ⺫⽬目录下的 DetailViewController.xib ⽂文件拖到 Terminal 窗⼝口中,再把 en.lproj 下⾯面的 DetailViewController.xib ⽂文件拖进terminal 窗⼝口 (后⾯面拖⼊入的两个⽂文件的路径会被附加到前⾯面输 ⼊入的命令后⾯面)• 回⻋车
  19. 19. • 第六步,打开中⽂文的 xib ⽂文件确认⼀一下。
  20. 20. • 第七步,运⾏行看⼀一下
  21. 21. NSLocalizedString 和 Strings Table
  22. 22. • 本地化程序⾥里⾯面的字符串,对 ItemViewController 的标题进⾏行本地化 • ⾸首先定位到 ItemViewController.m 的 init 函数中, 修改设置 title 的代码 // 本地化 Homepwner 的标题// [n setTitle:@"Homepwner"]; [n setTitle:NSLocalizedString(@"Homepwner",@"Name of application")];
  23. 23. • ⽣生成 string table• 打开 Terminal 窗⼝口,定位ItemsViewController 所 在⺫⽬目录,输⼊入: genstrings ItemsViewController.m• 将会在同⼀一⺫⽬目录⽣生成名为 Localizable.strings 的⽂文 件• 拖到我们的项⺫⽬目⺫⽬目录中
  24. 24. • 像前⾯面⼀一样对它进⾏行 make localization• 选中⽂文件,在右边属性⾯面板的 localization 区域勾 选上,Chinese• 这样会⽣生成⼀一个中⽂文版的 string table• 进⾏行翻译• 运⾏行程序

×