App的国际化和本地化(七) —— 本地化你的App(一)

版本记录

版本号 时间
V1.0 2018.05.12

前言

很多APP都有国际化版本,常见于一些大公司的产品,比如Facebook、Wechat等,那么国际化需要我们APP做哪些更改呢,接下来这几篇就一起来看一下APP的国际化和本地化。感兴趣的可以看上面几篇。
1. App的国际化和本地化(一) —— 简单介绍(一)
2. App的国际化和本地化(二) —— 查看语言和区域设置(一)
3. App的国际化和本地化(三) —— 国际化用户界面(一)
4. App的国际化和本地化(四) —— 国际化代码(一)
5. App的国际化和本地化(五) —— 使用区域设置格式化数据(一)
6. App的国际化和本地化(六) —— 支持从右到左的语言(一)

回顾

上一篇主要介绍支持从右到左的语言,本篇主要介绍本地化你的App。


Localizing Your App - 本地化你的App

当您完成应用程序国际化的用户界面和代码后,开始本地化过程。 将包含面向用户的文本的所有开发语言字符串文件导出为XML Localization Interchange File Format(XLIFF)。 将XLIFF文件提交给本地化团队,以翻译成多种语言。 在等待翻译的同时继续开发您的应用。 将XLIFF翻译导入到项目中并使用您添加的每种语言测试应用程序。 根据需要重复该过程,仅翻译每个应用修订版之间的更改。 根据需要,自己执行其他本地化步骤。


Choosing Languages - 选择语言

您可以选择超过100种不同的语言和地区指定的方言来本地化您的应用。但是,您使本地化资源越通用,您使用一组资源支持的区域越多。这可以节省应用程序包中的大量空间,并有助于降低本地化成本。例如,如果您不需要区分使用英语的不同地区,则可以添加英语来支持美国,英国和澳大利亚的用户。即使您提供特定于地区的资源,也要始终为您支持的所有语言提供一套完整的特定于语言的资源。

在搜索资源时,bundle API尝试查找应用程序支持的语言与用户的语言和区域设置之间的最佳匹配。在特定于语言的资源文件夹之前搜索特定于区域的资源文件夹。例如,如果您将英语(美国),英语(英国)和英语(澳大利亚)添加到您的项目中,那么包API将首先搜索相应的特定于区域的文件夹,然后搜索英文语言文件夹。有关bundle API如何查找本地化资源的更多信息,请参阅Bundle Programming Guide中的The Bundle Search Pattern

如果您不确定要添加什么语言,请考虑您在iTunes Connect中选择的App Store区域中使用的主要语言,以推广您的应用。 App Store TerritoriesiTunes Connect Developer Guide的App Store区域中列出。


Locking Views - 锁定视图

Interface Builder中,锁定您在等待翻译时不希望意外更改的视图。 当视图被锁定时,不能在检查器或项目编辑器中更改其某些或全部属性。 您可以通过选择锁定级别来指定要锁定的属性集(请参阅表6-1)。

Table 6-1 Locking levels

您可以为单个视图或整个nib文件设置锁定属性。 默认情况下,视图从它们的父视图继承它们的锁定属性,并且顶级视图从.storyboard.xib文件继承它们的锁定属性。 如果您设置视图的锁定属性,它将为其所有子视图设置锁定属性。

To change the locking level of a view - 要更改视图的锁定级别

  • Interface Builder中,选择您要锁定的视图。
  • Identity inspector(位于Document部分中)中,从Lock弹出式菜单中选择锁定级别。

有关该菜单中锁定选项的说明,请参阅表6-1。要从其父视图获取锁定值,请选择“继承”。

例如,选择Localizable Properties以继续开发您的应用程序,同时等待nib或字符串文件进行本地化。如果您将翻译合并到nib文件中,并且不想无意中进行其他更改,请选择Non-localizable Properties

To change the locking level of the nib file - 要更改nib文件的锁定级别

  • 在项目导航器中,选择一个.storyboard.xib文件。
  • Editor > Localization Locking菜单中选择一个锁定级别。

有关该菜单中锁定选项的说明,请参阅表6-1。要解锁文件中的所有视图,请选择Reset Locking Controls

例如,要防止对影响本地化字符串文件的nib文件进行任何编辑,请选择Reset Locking Controls,然后选择Localizable Properties


Exporting Localizations - 导出本地化

将开发语言资源导出为XLIFF文件,并将其提交给本地化团队以翻译成多种语言。

第一次导出本地化时,项目文件夹中只存在base internationalization - .storyboard.xib资源文件。 Xcode从您的项目文件生成字符串文件,并将其包含在导出的.xliff文件中。直到稍后导入本地化之后,Xcode才会将字符串文件添加到项目中。导出的[Language ID].xliff文件以XML Localization Interchange File Format(XLIFF)对字符串文件进行编码。 (大多数第三方本地化工具都支持XLIFF文件格式。)例如,如果开发语言是英语,则en.xliff文件包含base internationalization字符串文件(每个.storyboard.xib文件一个文件),一个Localizable.strings文件和InfoPlist.strings文件。字符串文件中的源文本是英文的。

译员应该为每种语言返回一个单独的.xliff文件。这些文件应该使用语言ID作为前缀。例如,如果您要求将en.xliff的英文翻译成德语和俄语,则返回的文件应该命名为德语为de.xliff,俄语为ru.xliff。单个.xliff文件包含实际的翻译。

本地化您的应用的第一步是导出开发语言或基本本地化翻译。在此之前,请验证Info.plist文件中的开发语言版权声明是否正确。 Xcode在XLIFF文件中包含人类可读的版权声明。有关可本地化Info.plist键的完整列表,请参阅Locking Views

To export the development language translation - 导出开发语言翻译

  • 在Xcode项目编辑器中,选择项目或目标。
  • 选择Editor > Export为本地化。
  • 在出现的工作表中,在Save As field中输入一个位置并单击保存。

Xcode将文件保存到您用.xliff扩展名指定的位置。 Xcode创建文件夹(如果它不存在),并在Language ID是开发语言标识符的文件夹中放置名为[Language ID] .xliff的文件。例如,如果开发语言是英语,则文件名为en.xliff

如果您从未在您的项目中添加过语言,则导出对话框与此截图类似:

下次您导出本地化时,可选择导出开发语言资源,特定语言资源或所有语言资源。

To export multiple localizations for translation - 导出多个本地化进行翻译

  • 在Xcode项目编辑器中,选择项目或目标。
  • 选择Editor > Export为本地化。
  • 在出现的工作表中,在另存为字段中输入一个位置。

如果您在项目中添加了语言,则导出对话框与此屏幕截图类似:

  • Include弹出菜单中,选择Existing TranslationsDevelopment Language Only

要导出全部或特定语言资源,请选择Existing Translations,然后在下面的Languages部分中取消选择不想包含在导出中的语言。 要导出开发语言资源,请选择Development Language Only

  • 点击保存。

对于您选择的每种语言,Xcode将XLIFF文件(具有language ID前缀和.xliff扩展名的文件)保存到您在另存为字段中指定的位置。 例如,如果从语言列表中选择德语和法语,则Xcode会将一个de.xlifffr.xliff文件添加到该文件夹中。


Importing Localizations - 导入本地化

当您导入本地化时,Xcode会将该语言的语言和一组本地化字符串文件添加到项目中。 例如,如果您在包含目标语言属性的标准XML Localization Interchange File Format (XLIFF)中导入ru.xliff,则俄语将添加到项目中。 第一次导入本地化时,base internationalization文件将更改为项目导航器中包含字符串文件的组。 Xcode将语言特定的字符串文件存储在语言文件夹中。 例如,Xcode在项目文件夹中创建一个ru.lproj文件夹,并将Localizable.stringsInfoPlist.strings文件的本地化副本添加到ru.lproj文件夹。 本地化的字符串文件是从相应的[Language ID] .xliff文件中提取的。 下次您导入本地化时,字符串文件将与您现有的项目文件合并。

To import localizations from translators - 从翻译者导入本地化信息

  • 在Xcode项目编辑器中,选择项目或目标。
  • 选择Editor > Import Localizations
  • 在出现的工作表中,选择一个扩展名为.xliff的文件并单击打开。

出现一张表格,显示导入的XLIFF文件与项目文件夹中现有资源之间的差异。

  • 点击导入。

Xcode从XLIFF文件解码本地化的字符串文件,并将它们添加到项目文件夹中。 Xcode替换现有的字符串文件。

1. Verifying Your Steps - 验证你的步骤

导入本地化后,Xcode会更新项目导航器以显示新的语言特定资源。 本地化.storyboard.xib文件现在在项目导航器中显示为组。 单击.storyboard.xib文件旁边的显示三角形以显示基本资源和特定于语言的字符串文件。

选择一个字符串文件来查看和可选地编辑内容。 字符串文件包含Xcode从它在相应的.storyboard.xib文件中找到的文本自动生成的键值对。 如果您在代码中使用NSLocalizedString宏,如Separating User-Facing Text from Your Code中所述,Localizable.strings组也会出现在项目导航器中。

另一种字符串文件是InfoPlist.strings,它用于本地化用户可见的应用程序属性(例如应用程序的名称)。 对于可以在InfoPlist.strings文件中本地化的键,请阅读Locking Views


Exporting and Importing Localizations Using Command-Line Utilities - 使用命令行实用程序导出和导入本地化

或者,您可以使用xcodebuild命令行实用程序来导出和导入本地化。

要导出本地化,请在终端中输入此命令,替换<dirpath><projectname>参数:

xcodebuild -exportLocalizations -localizationPath <dirpath> -project <projectname> [[-exportLanguage <targetlanguage>]]

导出的XLIFF文件放置在<dirpath>中。 (可选)使用exportLanguage参数来导出其他本地化。

要导入本地化,请在终端中输入此命令,替换<filepath><projectname>参数:

xcodebuild -importLocalizations -localizationPath <filepath> -project <projectname>

这里,<filepath> 指的是单个的XLIFF文件。


Adding Additional Resources You Want to Localize - 添加您想要本地化的其他资源

您可以明确地将语言特定的资源文件添加到您的项目中。 例如,由于文化差异,您可能希望针对不同的语言和方言使用不同的图像和音频文件集。 在运行时,应用程序会base文件夹之前搜索特定于语言的文件夹以查找资源文件,以便您可以根据需要将资源添加到Base.lproj文件夹,然后添加特定的语言文件夹。

注意:如果语言未显示在项目的“信息”窗格的Localizations部分中,请在执行这些步骤之前添加语言,如Using Base Internationalization中所述。

To localize a resource - 定位一个资源

  • 在项目导航器中,选择您想要本地化的资源。
  • 如有必要,请打开File inspector
  • 在本地化部分中,点击本地化按钮。
  • 在出现的对话框中,从弹出式菜单中选择一种语言,然后单击“本地化”按钮。例如,如果要为所有语言使用资源文件,请选择Base

在本地化资源之后,您可以使用文件检查器将其添加到其他语言。

To add localizations to a resource - 将本地化添加到资源

  • 在文件检查器打开的项目导航器中,选择资源。
  • 在本地化部分中,选择您想要添加的其他语言。

Xcode复制相应语言文件夹中的文件,并将其显示在项目导航器中。


Handling Noun Plurals and Units of Measurement - 处理名词复数和测量单位

如果一个字符串包含名词复数或度量单位,则为具有不同复数规则的语言提供备用字符串。要指定不能由字符串文件中的键值对表示的语言复数规则,请使用.stringsdict文件,该文件是具有.stringsdict文件扩展名的XML属性列表。语言在处理复数名词或度量单位方面有所不同。一些语言具有单一形式,一些具有两种类别,而另一些具有三种或更多类别来表示数量。如果显示包含变量数量的格式化字符串,则可以在代码中使用一个字符串,该字符串使用.stringsdict文件中指定的复数规则进行本地化。

与您如何从字符串文件中检索本地化文本类似,使用代码中的NSLocalizedString宏可从.stringsdict文件中检索不同复数形式的格式字符串。接下来,为具有不同复数规则的所有受支持语言提供一个本地化的.stringsdict文件。 NSLocalizedString宏在具有相同文件名前缀的关联字符串文件之前搜索现有的.stringsdict文件。例如,宏将首先搜索Localizable.stringsdict文件中的%d file(s) remaining个key。如果找不到,则宏将在Localizable.strings文件中搜索该键。因此,只能为具有不同复数规则的语言添加.stringsdict文件。

To create language plural rules - 创建语言复数规则

  • 在你的代码中,使用一个NSLocalizedString宏,传递一个格式化的字符串来检索复数短语。例如,要将可变数量的文件显示为文本:
localizedString = [NSString localizedStringWithFormat:NSLocalizedString(@"%d file(s) remaining", @"Message shown for remaining files"), count];

将格式字符串作为key参数传递给NSLocalizedString宏。

Xcode从代码中的NSLocalizedString宏中生成一个Localizable.strings文件。 例如,这个键值对以前面的代码片段的开发语言Localizable.strings出现:

/* Message shown for remaining files */
"%d file(s) remaining" = "%d file(s) remaining";

或者,您可以自己创建开发语言Localizable.strings文件,如 Creating Strings Files for User-Facing Text in Your Code中所述。

  • 创建一个.stringsdict属性列表文件并为具有不同复数规则的每种语言进行本地化。

将一个属性列表文件添加到项目中(选择File> New> File并从表中选择Property List)。 在项目导航器中,将文件名更改为Localizable.stringsdict并以选定语言对其进行本地化,如 Adding Additional Resources You Want to Localize中所述。

  • 为每个.stringsdict文件添加语言特定的复数规则。
    .stringsdict文件包含每个短语的复数规则集合。 顶级密钥与您在代码中传递给NSLocalizedString宏的密钥相同。 此键的值是一个指定复数规则详细信息的字典。 该字典包含用于每个数字类别的文本。 类别和含义的类型因语言而异。

例如,%d file(s) remaining关键字的英文.stringsdict文件是:

<plist version="1.0">
    <dict>
        <key>%d file(s) remaining</key>
        <dict>
            <key>NSStringLocalizedFormatKey</key>
            <string>%#@files@</string>
            <key>files</key>
            <dict>
                <key>NSStringFormatSpecTypeKey</key>
                <string>NSStringPluralRuleType</string>
                <key>NSStringFormatValueTypeKey</key>
                <string>d</string>
                <key>one</key>
                <string>%d file remaining</string>
                <key>other</key>
                <string>%d files remaining</string>
            </dict>
        </dict>
    </dict>
</plist>

在英语中,一个类别用于数字1,而另一个类别用于所有其他英文数字。

%d file(s) remaining的俄文.stringsdict文件是:

<plist version="1.0">
    <dict>
       <key>%d file(s) remaining</key>
         <dict>
            <key>NSStringLocalizedFormatKey</key>
            <string>%#@files@</string>
            <key>files</key>
            <dict>
                <key>NSStringFormatSpecTypeKey</key>
                <string>NSStringPluralRuleType</string>
                <key>NSStringFormatValueTypeKey</key>
                <string>d</string>
                <key>one</key>
                <string>Остался %d файл</string>
                <key>many</key>
                <string>Осталось %d файлов</string>
                <key>other</key>
                <string>Осталось %d файла</string>
            </dict>
        </dict>
    </dict>
</plist>
  • 用多种语言测试复数规则。

按照Testing Specific Languages and Regions中的步骤,使用不同的语言设置在Xcode中运行应用程序。

例如,以上关于%d file(s) remaining关键字的英文复数规则应导致以下本地化字符串:

对于俄语,有三种不同格式的可能类别:

有关.stringsdict文件属性的完整说明,请阅读Stringsdict File Format。 有关每种语言的复数类别和规则,请参阅CLDR Language Plural Rules

视频:WWDC 2013 Making Your App World-Ready: Localization > Using stringsdict


Localizing the Information Property List Files - 本地化信息属性列表文件

当您导出本地化时,Xcode包含一个InfoPlist.strings文件以供翻译。 但是,此文件包含有关您的应用和公司的属性,因此您可能需要自行验证或翻译此文件。 该字符串文件允许您可以选择本地化信息属性列表中的某些属性值,例如应用程序名称(包显示名称)和版权声明。

Xcode自动将这些密钥添加到InfoPlist.strings文件中

有关信息属性列表的完整说明,请阅读Information Property List Key Reference

1. Localizing the App Name and Copyright Notice - 本地化应用程序名称和版权声明

要本地化应用程序名称和版权声明,请将CFBundleDisplayNameNSHumanReadableCopyright键的值添加到InfoPlist.strings文件中。 例如,将这些行添加到项目导航器中的InfoPlist.strings(French)文件中:

2. Getting the Localized App Name - 获取本地化的应用程序名称

如果您本地化应用程序名称,请在菜单项和用户界面中的其他位置使用它。 您可以使用CFBundleDisplayName键以编程方式获取本地化应用程序名称:

NSString *appName = [[[NSBundle mainBundle] localizedInfoDictionary] objectForKey:@"CFBundleDisplayName"];

对于Mac应用程序,用户可以在Finder中重命名应用程序,所以使用NSFileManager类获取应用程序名称:

NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
NSString *appName = [[NSFileManager defaultManager] displayNameAtPath:bundlePath];

Adding Languages - 添加语言

如果要添加特定于语言的资源(如Adding Additional Resources You Want to Localize所述),请在导入本地化之前将语言添加到项目。 (Xcode会在导入本地化时自动为您的项目添加语言。)例如,在开始本地化所有字符串文件之前,将语言特定的图像和音频文件添加到项目或测试特定于语言的复数规则。

当Xcode为您的项目添加一种语言时,它会创建一个单独的语言文件夹来存储特定于语言的资源。 Xcode为Base.lproj文件夹中的每个.storyboard.xib文件添加一个字符串文件到语言文件夹。字符串文件与.storyboard.xib文件具有相同的名称,但带有strings扩展名。例如,如果您有一个名为MyStoryboard.storyboard的故事板,则生成的字符串文件名为MyStoryboard.strings

To add a language to a project - 为项目添加语言

  • 在项目导航器中,选择项目(不是目标)并单击信息。
  • 在本地化版块中,点击语言列下的添加按钮(+),然后从弹出式菜单中选择您想添加的语言。

菜单项包含语言名称,后面跟着括号中的语言ID,如德语(de),日语(ja)和阿拉伯语(ar)。脚本或方言的菜单项包含括号内的区域,如德语(瑞士)。脚本或方言的语言ID使用子标签,如在pt-PT中,其中pt是葡萄牙语的代码,PT是葡萄牙的代码。例如,在葡萄牙使用pt作为葡萄牙语的语言ID,在巴西使用pt作为葡萄牙语使用的pt-PT作为葡萄牙语的语言ID。其他子菜单(位于列表底部)包含更多语言和方言。

这些相同的语言ID用于相应的.lproj语言文件夹的名称中,如Choosing Languages中所述。

  • 在出现的对话框中,取消选择您不想为此语言本地化的资源文件。

对于文件类型Localizable Strings,Xcode为该资源创建一个字符串文件。如果您希望为该语言维护单独的.storyboard或.xib文件,请从File Types弹出式菜单中选择资源文件的类型,例如,为Mac故事板文件选择Interface Builder Cocoa Touch Storyboard

  • 点击完成按钮。

后记

本篇主要讲述了本地化你的App,感兴趣的给个赞或者关注~~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容