APP本地化笔记

最近项目需要做本地化,简单记录一下,这里的APP本地化特指iOS客户端的本地化.

前言

随着移动互联网的发展,很多APP借着苹果的平台渐渐走向国际,甚至有些国内的公司面向的就是国外用户,我们现在做的产品就有这方面的需求,所以抽时间做了一下APP本地化.
一般来说,APP本地化主要是一些文字和图片,plist资源的本地化.文字一般就是UI控件上展示的文本,控件可能是纯代码创建的,也可能是xib或者storyboard上的控件;而图片则需要准备不同的资源文件.
下面介绍一下常用的本地化方法:

准备工作

以普通的工程为例:

  1. 新建工程,Info.plist中添加Application has localized display name,bool值为YES,CFBundleDisplayNameCFBundleName都设置为$(PROJECT_NAME);
  2. 选择PROJECT->Info->Localizations,点击+,选择需要本地化的语言,我们选择Chinese(Simplified),然后弹出需要本地化的资源文件,需要的打钩,点击确定;
  3. 新建文件.选择iOS->Resource->String File,这里命名为Localizations.string;
  4. 选择新建的.string文件,右边属性栏有Localization,点击,弹出需要本地化的语言,随便选择一个,然后把需要本地化的语言都勾选上,点击文件,可以看到生成了不同语言的.string文件;
  5. 重复步骤3和步骤4,命名必须为InfoPlist.strings.
  6. 打开项目目录,把生成的本地化文件夹拖到项目中.

应用名称本地化

选择InfoPlist.strings,将需要显示的名称写到对应的文件里面即可:

1
2
3
4
// 中文文件
CFBundleDisplayName = "中文名字";
// 英文文件
CFBundleDisplayName = "English name";

文本本地化

以登陆按钮显示的标题为例,需要借助一个本地化方法才可以实现,首先在Localizations.string文件中分别写上对应的key-value:

1
2
3
4
// 中文文件
"Login" = "登陆";
// 英文文件
"Login" = "Login";

调用的地方

1
2
3
// 前面是key,后面是注释,可为nil
NSString *loginString = NSLocalizedString(@"Login", @"login button title");
[loginButton setTitle:loginString forState:UIControlStateNormal];

图片资源和xib,plist资源的本地化

图片本地化很简单,选中图片资源,点击属性栏的Localization选项,会自动把图片放到对应的语言文件夹下面,调用无需更改.
plist以及xib本地化方式和图片本地化方式大同小异.

简化调用

如果一开始没有做本地化的准备,但是突然要加入这项feature,这就需要快速完成,但是项目中的控件太多了怎么办?

  1. 简单做法,修改继承,如替换UILabel为自定义Label,重写setText:,然后调用NSLocalizedString(key,comment),这么做代价很大;
  2. 查看NSLocalizedString的实现:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #define NSLocalizedString(key, comment) \
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
    #define NSLocalizedStringFromTable(key, tbl, comment) \
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:(tbl)]
    #define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
    [bundle localizedStringForKey:(key) value:@"" table:(tbl)]
    #define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \
    [bundle localizedStringForKey:(key) value:(val) table:(tbl)]

    为了方便调用添加个宏定义:

    1
    2
    3
    4
    #undef L
    #define L(key) \
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

    然后一个一个替换/(ㄒoㄒ)/~~

  3. 替换完之后,用命令自动生成strings文件

    1
    2
    3
    4
    5
    6
    7
    // 打开终端,定位到需要生成stings的文件,比如为LoginViewController.m,要生成DHLocalizations.strings
    // 字符串调用的地方
    NSString *loginString = NSLocalizedStringFromTable(@"Login",@"DHLocalizations", @"login button title");
    [loginButton setTitle:loginString forState:UIControlStateNormal];
    // 执行如下命令
    genstrings LoginViewController.m
    // 查看文件夹,看到已经生成了DHLocalizations.strings文件
  4. 批量生成命令
    上个命令虽然能自动生成本地方资源文件,但是一次只能生成一个文件里面的本地化字符串,借助下面的命令可以进行批量生成

    1
    2
    3
    4
    // 进入终端,使用命令生成文件夹
    mkdir en.lpro
    // 遍历文件夹下.m文件,并执行genstrings命令
    find ./ -name *.m -print0 | xargs -0 genstrings -o en.lproj

参考链接

感谢一下开发者的教程,放上教程链接
https://my.oschina.net/u/1049180/blog/215695
// 下面这篇文章讲述的很详细,图文并茂
http://blog.csdn.net/q199109106q/article/details/8564615