将您的应用程序国际化
App Store 中很多流行的应用程序有多种语言版本。虽然这些应用程序可能因为很多因素而变得流行,但是具有多种本地化版本,肯定是其中一个因素。越多的人可以理解并使用您的应用程序,潜在的买家也就越多。
若要让您的应用程序拥有多个语言版本,必须先将它国际化,然后将它本地化。国际化是整理本地化资源的一种技巧,以便应用程序在运行时,可以选择用户首选的资源集。本地化就是翻译应用程序所显示或读出(例如 VoiceOver)的文本。它还可以包括某个区域专用的额外图像和其他资源。(本地化也可以指将一组资源本地化为某个特定语言和区域设置——例如简体中文本地化。)
应用程序选择用户界面本地化语言的方法:在“设置”应用程序(“通用”>“多语言环境”>“语言”)中,iOS 设备用户选取想在应用程序用户界面和系统本身所显示的语言。应用程序将此偏好设置作为钥匙,来访问所请求的语言本地化资源。
若要了解国际化的所有方面,请参阅国际化编程主题。
本教程将教您进行的操作
在本教程中,您将会使 HelloWorld 应用程序国际化,以便其支持两种本地化语言:英文和简体中文。接下来您会将以下文本本地化:
-
xib的国际化
-
用户点按“Hello”按钮后,应用程序所构建和显示的字符串
-
显示给用户的应用程序名称
在本教程中,您还将修改用户界面并配置国际化的布局约束。
本教程不会教您如何将本地化资源(例如图像文件或声音文件)添加到项目。若要了解如何将本地化资源添加到项目,请阅读国际化编程主题中的相应章节。
当您选择简体中文作为首选语言,然后启动国际化的 HelloWorld 后,该应用程序外观应该是这样的:
![图像: ../Art/helloworld_chinese_2x.png](http://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOSCh/chapters/InternationalizeYourApp/Art/helloworld_chinese_2x.png)
使用 Base Internationalization
“Base Internationalization”是 Xcode 4.5 推出的一项功能,使用该功能,本地化工程师(即翻译人员)不再需要为应用程序支持的每种语言修改串联图和 nib 文件。相反,一个应用程序只有一组串联图或 nib 文件会本地化为默认语言,这些串联图和 nib 文件称为Base Internationalization。当您将本地化语言添加到某个应用程序时,Xcode 会生成一个包含所有文本的字符串文件,这些文本包含每个串联图或 nib 文件显示的文本,或者作为辅助功能标签或提示的文本。Xcode 会以串联图的名称命名该文件,文件的扩展名为strings
。因此,如果串联图的名称为 MyStoryboard.storyboard
,所生成的字符串文件的名称就是 MyStoryboard.strings
。
正如您将看到的,字符串文件将应用程序中的文本(值)与其他字符串(键)相关联。本地化工程师使用该键以帮助识别用户界面中的文本,然后翻译该文本。在“Base Internationalization”中构建应用程序的用户界面时,必须使用“Auto Layout”功能,以确保显示翻译字符串的对象,在其相邻视图更改时,适当地调整其相对位置和大小。
注:在 Xcode 4.5 以前的版本中,开发者和本地化工程师必须为应用程序支持的每种语言修改串联图和 nib 文件。这项任务需要他们不仅要翻译串联图或 nib 文件中的可见或可听文本,还要在翻译完成后,调整视图的大小和位置。
添加本地化语言
创建 HelloWorld 时,Xcode 已自动将一个文件夹添加到了 Xcode 项目。此文件夹用于存放英文本地化的资源。稍后,当您请求某个“Base Internationalization”时,Xcode 会将另一个文件夹添加到项目。如果在 Finder 中查看项目文件,您将看到一个名为Base.lproj
的文件夹和另一个名为 en.lproj
的文件夹(用于英文本地化)。第一个文件夹中的是串联图文件;第二个文件夹中的是InfoPlist.strings
文件。(您将在“将应用程序名称本地化”中了解有关 InfoPlist.strings
文件的更多信息。)英语是项目的默认语言。如果想要添加其他的本地化语言,您必须在 Xcode 中添加它们。
在完成此项任务后,Xcode 会更新该项目导航器,以显示新的本地化语言。点按 MainStoryboard.storyboard
旁边的展示三角形,以显示这些文件的基本(英文)和简体中文本地化。
![图像: ../Art/internat_inProjNavigator_2x.png](http://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOSCh/chapters/InternationalizeYourApp/Art/internat_inProjNavigator_2x.png)
在项目导航器中,您可能注意到有两种类型的字符串文件。当您添加一种本地化语言时,Xcode 生成两种字符串文件。第一种是来自“Base Internationalization”的字符串文件 (MainStoryboard.strings
)。该字符串文件包含一个或多个键-值对,它们由 Xcode 从串联图文件找到的文本自动生成。第二种字符串文件,是 InfoPlist.strings
,您使用该文件将用户可见的应用程序属性(例如其名称)本地化。该文件开始内容为空。您将在接下来的部分了解有关这两种字符串文件的更多信息。
应用程序捆绑包中的本地化文件夹:应用程序就是捆绑包,而捆绑包即是结构化目录,内有可执行代码及其使用的资源。这些资源可以本地化或不加以本地化(所有语言都如此)。本地化的资源,放在名为 code.lproj
的捆绑包的文件夹中,而 code 可由以下组成:
-
语言 ID。语言的 ISO 639-1(两个字母)或 ISO 639-2(三个字母)标识符。(ISO 代表“国际标准化组织”。)通过添加带有连字符的后缀,您可以指定某种语言的方言,例如简体中文 (
-Hans
) 和繁体中文 (-Hant
)。 -
区域 ID。一个区域或地区的可选 ISO 3166-1 标识符。区域 ID 是一个由两个字母组成的大写代码,该代码使用下划线字符连结语言指示符。例如,ID
en_GB.lproj
指的是英文–英国。
Base.lproj
,它标识串联图或 nib 文件的 Base Internationalization。
关于字符串文件
字符串文件包含文本项,这些文本项已本地化为特定语言,并与用作键的任何字符串相匹配。该文件的扩展名为 strings
。当应用程序在设备上运行时,它会从用户首选语言所属的字符串文件中,找出并显示这些字符串。(当然,该应用程序必须支持该语言的本地化。)在 iOS 中,国际化使用三种不同类型的字符串文件:
-
Xcode 从“Base-internationalization”串联图或 nib 文件自动生成的字符串文件
-
用于本地化用户可见属性的字符串文件,这些属性存在于应用程序的信息属性列表,如应用程序的显示名称
-
由应用程序代码所创建和显示的字符串的文件
以下部分描述了,将应用程序国际化时如何配置各种类型的字符串文件。
所有字符串文件中的条目,具有以下基本格式:
/* Comment to localizers */ |
"Key" = "Value"; |
该注释旨在通过澄清已本地化字符串的上下文,来帮助本地化工程师。注释(位于单独一行)之后是一个键、一个等号、一个值和一个表示终止的分号。值是一个总被引号括起来的字符串。键是通常被引号括起来的字符串,但也可以是声明为全局字符串的符号。
将串联图文本本地化
对于每种添加到应用程序项目的本地化语言,Xcode 从“Base-internationalization”串联图生成名为 StoryboardName.strings
的字符串文件,并将该文件写入该项目本地化语言(例如 zh-Hans.lproj)
的文件夹。
就 HelloWorld 应用程序而言,Xcode 从“Base Internationalization”生成以下字符串文件:
/* Class = "IBUITextField"; accessibilityHint = "Type your name"; ObjectID = "PzI-FE-QQF"; */ "PzI-FE-QQF.accessibilityHint" = "Type your name"; /* Class = "IBUITextField"; placeholder = "Your Name"; ObjectID = "PzI-FE-QQF"; */ "PzI-FE-QQF.placeholder" = "Your Name"; /* Class = "IBUIButton"; normalTitle = "Hello"; ObjectID = "fYK-eX-amY"; */ "fYK-eX-amY.normalTitle" = "Hello"; |
对于串联图中的每个字符串,Xcode 将文本显示对象标识符的键、句点 (.
) 和指定给该字符串的属性连接起来。值(等号后面的字符串)是“Base-internationalization”串联图中的可见或可听字符串。本地化工程师会翻译这些字符串。(每个条目的注释,会重复此信息,但会添加 Xcode 已知的对象类。)如果用户的首选语言与“Base Internationalization”的语言不同,应用程序在运行时会将“Base-internationalization”串联图中的每个字符串,动态替换为当前本地化语言的 StoryboardName.strings
文件中相匹配的字符串。图 1-1 说明了此流程。
![](http://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOSCh/chapters/InternationalizeYourApp/Art/storyboard_strings_2x.png)
HelloWorld 用户界面十分简单,仅有一个串联图、一个场景和三个字符串。用户界面更为复杂的应用程序,含有许多带文本的视图,因此有许多字符串需要本地化。Xcode 使用嵌入键中的对象 ID,帮助您识别显示文本的视图。选择串联图中的视图(例如,“Hello”按钮),然后打开“Identity”检查器。在此检查器的“Document”部分,查找对象 ID,并将其与字符串文件中的对象 ID 相匹配。
![图像: ../Art/internat_objectID_2x.png](http://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOSCh/chapters/InternationalizeYourApp/Art/internat_objectID_2x.png)
MainStoryboard.strings
文件的中文本地化内容,现在看起来应该是这样的:
/* Class = "IBUITextField"; accessibilityHint = "Type your name"; ObjectID = "PzI-FE-QQF"; */ "PzI-FE-QQF.accessibilityHint" = "键入您的姓名"; /* Class = "IBUITextField"; placeholder = "Your Name"; ObjectID = "PzI-FE-QQF"; */ "PzI-FE-QQF.placeholder" = "您的姓名"; /* Class = "IBUIButton"; normalTitle = "Hello"; ObjectID = "fYK-eX-amY"; */ "fYK-eX-amY.normalTitle" = "您好"; |
将应用程序的名称本地化
将本地化语言添加到某个应用程序项目时,Xcode 在默认情况下,会创建一个名称为 InfoPlist.strings
的文件,并将其写入该文件系统的本地化文件夹(例如,zh-Hans.lproj
)中。该文件(最开始内容为空)应该包含信息属性列表中用户可见的本地化字符串的键-值对;就 HelloWorld 应用程序而言,该属性列表在 HelloWorld-Info.plist
文件中。
最重要的用户可见属性,是应用程序的显示名称,现在您会将其本地化。InfoPlist.strings
文件中的键,是由框架声明的符号,可在信息属性列表中找到。
不需要为原始的英文本地化编辑 InfoPlist.strings
文件,因为信息属性列表中用户可见的属性已经是英文的。
将代码显示的字符串本地化
应用程序的代码,经常在运行时创建和显示文本字符串。HelloWorld 项目的 changeGreeting:
方法,就是一个以编程方式生成文本的例子。
- (IBAction)changeGreeting:(id)sender { |
self.userName = self.textField.text; |
|
NSString *nameString = self.userName; |
if ([nameString length] == 0) { |
nameString = @"World"; |
} |
NSString *greeting = [[NSString alloc] initWithFormat:@"Hello, %@", nameString]; // programmatically created |
self.label.text = greeting; |
} |
该方法从文本栏获取要显示的姓名,然后使用 NSString
类的 initWithFormat:
方法,将字符串“Hello, ”与该姓名连接起来。为了显示此文本,该方法将标签的 text
属性设定为构建的字符串。这里国际化的问题,在于必须将单词“Hello”翻译为该应用程序支持的每种本地化语言。为了将代码生成的字符串本地化,iOS 的国际化功能提供了字符串文件和 NSLocalizedString
宏。以下部分描述如何使用该文件和宏。
配置 Localizable.strings 文件
包含以编程方式显示的文本,其本地化字符串文件的惯用名称是 Localizable.strings
。您将创建两个此类文件,一个用于英文,一个用于简体中文,然后将合适的键-值对添加到其中。
现在,有了两种本地化语言的 Localizable.strings
文件,是时候将键-值对添加到其中了。
调用 NSLocalizedString 宏
NSLocalizedString
宏从 Localizable.strings
文件获取当前本地化语言的本地化字符串。在 HelloWorld 应用程序中,您要以此宏替换文本 @"Hello, %@"
。
该宏中的第一个参数,采用字符串文件中的一个键,第二个参数采用给本地化工程师的注释。该宏会返回与用户首选语言相对应的本地化语言中键的值。您可能想知道此示例将给本地化工程师的注释作为该宏的参数的原因;毕竟,您已经在 Localizable.strings
文件中,为英文和中文写了一则注释。
大型应用程序项目,通常使用名称为 genstrings
的命令行程序,从该程序在代码中找到的信息生成一个字符串文件(默认情况下,该文件名称为 Localizable.strings
)。该实用工具查找 NSLocalizedString
宏的每次调用,提取键(也是初始值)和注释,并将这些项目写入字符串文件。然后,您可以将该字符串文件,添加到项目中的每种本地化语言中,并翻译这些值。