狠狠撸

狠狠撸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
? 进?行翻译
? 运?行程序

More Related Content

17 Localization