盒子
导航
文章目录
  1. 一、应用本地化设置
  2. 二、故事板本地化
  3. 三、应用名称本地化
  4. 四、代码中的本地化
  5. 五、参考资料

iOS开发基础:应用开发本地化

  1. 自2015.09开始接触Python,10.10开始学iOS;
  2. 2016.01又操起旧业(Oracle ERP)体验了一把独立顾问;
  3. 2016.03开始找工作,海投iOS,无望,转操Python,后端;
  4. 期间学了一部分的iOS内容,也发上来不少笔记,后经筛选,只留此一篇。

开发中通常会基于Xcode的项目模板来创建程序框架(如果闲的蛋疼也可以自己从零开始的,但实在没有必要),在创建完成框架之后即可开始本地化的设置工作,然后在后面的开发中基于Base来开发,默认的Base的语言与系统语言有关,例如我的系统为英文环境,Xcode也是英文环境,所以创建的项目在Info.plist中,Localization native development region的值为en。默认地,项目目录下有个Base.lproj文件夹,里面存放了一部分可被本地化的资源,例如storyboard。IDE: Xcode 7。

一、应用本地化设置

添加本地化之后,在项目文件夹下会自动创建<语言缩写>.lproj文件夹,里面包含本地化相关的文件。按照下图的操作顺序,对相应文件进行本地化:
应用本地化

点击+号,在弹出的列表中选择Chinese (Simplified)(zh-Hans)来创建中文本地化,接着会弹出如下窗口:
应用本地化

可以看到向导中并没有包含Info.plist文件,这个后面单独处理。

选择Finish这样就为Main.storyboard和LaunchScreen.storyboard创建了中文本地化文件。此时查看项目导航的右边,发现Main.storyboard下面多了两个文件,一个是Main.storyboard(Base),后续的开发应该在这个上面进行,一个是Main.strings(Chinese(Simplified)),这个是中文本地化文件。然后查看右边的文件指示器,看到Localization部分变成了列表,包含了三个文件,English本地化是默认的,但是没有默认勾选,将其勾选上
应用本地化

此时查看项目目录,应该多了两个文件夹:en.lproj 和 zh-Hans.lproj。

二、故事板本地化

Storyboard中控件的本地化与代码中不大相同。选中Storyboard文件,打开右边的文件检查器查看Localization部分,可以发现本地化文件有两种类型可供选择:

  1. Localizable String
  2. Interface Builder Storyboard

默认是 Localizable String ,这是一个普通的文本文件,如果实在拉好界面布局再点击本地化生成该文件的话,它会自动加入Storyboard中的控件供你进行本地化,例如在Storyboard中有个Label控件,重新勾选本地化(如果之前已勾选,可选择去掉勾选再勾选,这过程中选择Remove File、Replace File),发现新的本地化文件里面多了如下内容:

/ Class = “UILabel”; text = “Label”; ObjectID = “5Qm-Q3-ETm”; /
“5Qm-Q3-ETm.text” = “Label”;

其中 5Qm-Q3-ETm 是控件的ID,这个ID可在Storyboard中相应控件的属性检查器中看得到。这样就可以在这里进行本地化的修改。

也可以选择本地化文件的类型为 Interface Builder Storyboard ,这个时候XCode会提示你是否选择转换,点击选择转换就可以了。但要注意,如果之前已经使用 Interface Builder Storyboard 并在上面做了设计(例如为控件添加约束),在转换为 Localizable String 时将会丢失这些设计。

三、应用名称本地化

Info.plist文件并没有出现在本地化资源文件列表中,所以我们要手工对应用名称进行本地化。在右边的项目导航中选中info.plist文件,然后在列表中新增一项Application has localized display name,值为YES(默认没有该项,不新增好像也能实现应用名称本地化):
应用本地化

然后在项目目录的 Base.lproj、en.lproj 和 zh-Hans.lproj 文件夹下分别新建文本文件并命名为InfoPlist.strings,内容如下:

1
2
3
4
5
6
7
8
//在没有被本地化的环境中将以该名字显示
CFBundleDisplayName = "BaseName"; //Base.lproj

//在英文环境中将以这个名字显示
CFBundleDisplayName = "EnglishName"; //en.lproj

//在简体中文环境中将以这个名字显示
CFBundleDisplayName = "中文本地化名字"; //zh-Hans.lproj

然后分别将这三个文件夹中的InfoPlist.strings文件拖入项目当中,如图:
应用本地化

四、代码中的本地化

代码中的本地化借助于Xcode本身提供的一个宏,这个宏名称叫做NSLocalizedString(key, comment),在Base中开发时要为需要显示的文本选择一个Key,在本地化之后系统会根据这个Key到相应的本地化文件中查找本地化字符串来在界面显示。例如在代码中创建了一个Label,在考虑本地化的应用当中我们可以这么写代码:

UILabel *label = [[UILabel alloc] init];
label.text = NSLocalizedString(@”LABEL_TEXT”, @”ViewController.m/viewDidLoad中Label的显示名称”);

在应用没有实现本地化或者找不到本地化文件的时候,跑起来的应用将会显示key值,例如这里是LABEL_TEXT。这里的KEY使用了全部大写的英文字符,这样有一个好处就是在测试的时候就能够立马发现还没有进行本地化或者本地化不成功。所有在代码中创建的视图组件的显示名称都应该这样进行书写。之后我们便可以通过一个称之为genstrings的程序(随Xcode而安装)来 提取 出所有代码中使用了NSLocalizedString(key, comment)宏的KEY,生成一个本地化字符列表文本文件,然后我们就可以在这个文件中进行本地化名称的修改。在有条件的项目当中,可以把这个文件交给翻译部门来做专门翻译。

genstrings的使用也非常简单,打开Terminal,将路径定位到项目文件夹,这里有个Mac操作技巧,打开Terminal之后输入cd命令然后空格,将项目文件夹直接拖入Terminal当中回车,就能够定位到项目文件夹下了(我不会告诉你我的Mac可以选中文件然后在右键中选择在Terminal中打开),然后我们使用如下命令来 提取 所有.m文件中的NSLocalizedString(key, comment)宏到本地化文件当中,如:

$ genstrings .//*.m

这样会创建一个Localizable.strings的新文件,里面的内容在这个例子当中将是:

/ ViewController.m/viewDidLoad中Label的名字 /
“LABEL_TEXT” = “LABEL_TEXT”;

将这这个文件拖入XCode来导入项目。然后在项目导航中选择该文件,在右边的文件检查器中选择本地化并勾选Base、English和Chinese (Simplified)(zh-Hans),这样这个Localizable.strings下面就会出现三个副本,在Localizable.strings(English)中将

“LABEL_TEXT” = “LABEL_TEXT”;

的右边部分改为英文名字,在Localizable.strings(Chinese (Simplified)(zh-Hans))中将右边部分改为中文名字,这样就完成了对这个Label的本地化了。注意: 重新运行genstrings会生成同名文件并覆盖原目录下的该文件,所以注意好备份,不要被覆盖之后导致之前的翻译工作白忙活。

到这里,对该Label的本地化完成。

五、参考资料