Ray Wenderlich (原作者)


本篇教程是由Sean Berry发布的,他是一位电脑达人,在Algebra Touch做开发工作。

Me Gusta Localization!


虽说目前以英语为主的App的市场是最大的,但是世界上还是有很多非英语的用户,可以通过提供本地语言的支持来极大地提升他们的用户体验。

好消息是Apple已经为我们提供了一套简单易用的,Xcode集成的API方法,来为App增加多语言支持。这个过程称为本地化,这就是本期教程我想要教给大家的!

在本篇教学中,你将要本地化一款我准备好的示例app,我受到Ray的这篇in-app purchases中的暴走漫画的启发制作的这个app。这个app非常简单 – 当你点击‘You Like?’时,一个笑脸出现并缩放,最终渐隐消失。

但是目前它只支持英语,所以 vamos a traducir!(西班牙语,意思为“我们要翻译了!”)

本教程使用Xcode 4,所以如果你还没升级它,为什么不借此机会升级呢?

准备开始

第一步请先下载iLikeIt初始工程,我们将要在之后的教程中将它本地化。

编译并运行,你将会看到如下所示:

我们有3个需要本地化的项目,它们是:

  • 标题文字: ‘Hello!’
  • UI元素:’You like?’按钮
  • 最后是那个图片(它上边有文字!)

将文字从代码中剥离

和大多数项目一样,本项目也将字符串写死在代码中。我们需要将这些写死的字符串从代码中剥离出来,这样才能本地化它们。

在Xcode中实现此功能是通过新建一个后缀为“.strings”的文件,让其包含项目需要的字符串。然后把之前写死的字符串,使用适当的函数调用,替换为“.strings”文件中相应的字符串。

我们这就试试看。在Xcode中选择iLikeIt group,然后选择FileNewNew File。选择iOSResourceStrings File,点击Next,如下图所示。将其命名为Localizable.strings,点击Save。

注意Localizable.strings是iOS寻找本地字符串默认的文件名。如果你不使用此名字,那么你在还需要额外指定.strings文件的名字。/p>

strings文件的格式是:


"KEY" = "CONTENT";


对于我们的“Hello!”字符串,则需要添加:


"TITLE" = "Hello!";


现在切换到iLikeItViewController.m,找到viewDidLoad方法。目前此处设置字符串的方式为:


self.titleLabel.text = @"Hello!";


我们想要从.strings文件读出我们的字符串。为了完成它,改变上行内容使用NSLocalizedString调用,如下所示:


self.titleLabel.text = NSLocalizedString(@"TITLE", nil);


如果你对NSLocalizedString有好奇的话,control单击NSLocalizedString并选择Jump to Definition。你会发现它是如下定义的:


#define NSLocalizedString(key, comment) 
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]


本质上地,它是调用了localizedStringForKey方法根据给定的key查找当前语言对应的字符串。它的table参数为nil,所以它会使用默认的strings文件名(Localizable.strings)。想获得更多的内容,请参考Apple的NSBundle Class Reference

还有一个值得注意的事。这个宏使用了一个叫做comment的参数,但是看起来它并没有做任何事儿!这是因为除了在Localizable.strings手动输入key/pair的方法外,还有一种通过使用iPhone SDK提供的工具自动生成字符串的方法,对于大项目来说,这种方法非常方便。

如果你使用了此方法,你可以为每一个字符串添加一个comment作为翻译者的辅助参考说明。例如,你可以注明这个字符串是在什么上下文位置使用的。

背景知识已经介绍足够多了,我们这就试试看!编译并运行项目,它会像往常一样在主屏幕显示“Hello!”。但是西班牙语版的在哪儿呢?我们已经把准备工作做的很充足了,这一步会很容易。

添加西班牙语本地化支持

首先选择Localizable.strings,然后打开Info面板。完成这一步你需要点击Xcode界面顶部的工具栏的第三项打开属性界面,然后选择顶部的第一个tab页,如下所示:

添加另一种语言支持的步骤为,首先点击右侧的‘Localization’面板中的‘+’按钮。第一次会创一个英语的localization。注意再你执行完此步骤后有可能失去对Localizable.strings的选择,再次选择它,再次点击‘+’按钮,从下拉列表中选择‘Spanish(es)’

到此为止,Xcode已经为每种语言创建了各自版本的Localizable.strings。如果你想看看它是怎么在幕后工作的,在Finder中打开此项目,你会看到如下内容:

看到‘en.lproj’和‘es.lproj’了吗?它们包含了每种语言特定的版本的文件。

‘en’是English的本地化编码,‘es’是Spanish的本地化编码。如果你对此感到好奇,这是语言编码详细列表

当iOS想要得到英语版本的文件时,它会从en.lproj中寻找,如果它想得到西班牙语版本的文件就会从es.lproj中去找。

就是这么简单!把你的资源放到合适的文件夹中,iOS会替你完成余下的工作。

回到Xcode并点击Localizable.strings的下箭头,让它显示出子项目。你会看到我们正在使用两个版本的文件:

点击‘Localizable.strings (Spanish)’并把文本替换成以下内容:


"TITLE" = "Hola!";


你的app现在更加世界化了!我们这就试试看这个功能是否工作正常…

进入Settings(设置)程序,选择General(通用)-> International(多语言环境) -> Language(语言) -> Espanol,就可以让模拟器显示出西班牙文了。

删除app并选择ProjectClean来执行一次全新的编译和安装。当你编译并运行后你会看到Hola!的字样:

调整UI元素

接下来要本地化的是按钮上的文字。西班牙语对应的内容应该为‘~Es bueno?~’

这个出现了一个问题,我们想让按钮的宽度与按钮上的文字保持一致。对于标题label来说,这并不是问题,因为它没有宽度边界限制。但是对于按钮我们需要调整它的尺寸以让它看起来更好。

如果我们只是修改viewDidLoad中的文字,它会看起来很烂,如下图所示:

完全不可接受!所以我们要添加一个本地化的xib,来让按钮在西班牙语模式下更宽。

选择iLikeItViewController.xib并在右侧的info面板中,点击‘+’按钮添加一个本地化并选择Spanish。注意你可能需要向下滑动Info面板以让其显示,因为它会共享其他的一些Interface Builder的内容。

现在我们在Spanish文件夹(es.lproj)中有了iLikeItViewController.xib的一份copy。选择iLikeItViewController.xib (Spanish),把按钮上的文字改为‘~Es bueno?~’(默认地它会自动调整按钮的大小)。

小技巧:想要在Mac上输入例如朝下的问号这种特殊字符,方法是前往System Preferences(系统偏好设置)Keyboard(键盘),并选择Show Keyboard(显示键盘)& Character Viewer in menu bar(显示字符显示程序)。你会看到一个新的选项出现在你的菜单栏中,如下所示:

你可以使用它来浏览特殊字符,双击来选择它到你的app中,包括Xcode。

当你设置完成你的label后,删除app并再次通过ProjectClean重新编译安装(你也许需要重启Xcode才能让这些新设置生效)。然后编译并运行你会看到如下所示:

图片

我们在图片中也有文字所以我们要本地化它。在一个西班牙语的app中有些英语会先得很外行。

选择‘ilike.jpg’并添加一个Spanish的localization(你应该已经很熟悉这个步骤了!)

检查一下项目文件夹,‘ilike.jpg’已经在English文件夹(en.lproj)中了并且Spanish文件夹(es.lproj)中也有一份拷贝。为了让西班牙版本的图片有所不同,我们只需要简单地把西班牙文件夹中的图片替换掉。

请下载以下图片:

我也在起始工程中保存了一份,名字为megusta.jpg。

将其重命名为ilike.jpg并把它移动到Spanish文件夹(es.lproj)中,覆盖掉原来的文件。

Clean并重新编译就大功告成了!

恭喜!你已经学会了本地化的大部分内容了。

免费额外奖励

如果你想翻译app的名字该怎么办呢?你的Info.plist指定了一个特殊文件,在这里你可以为app指定不同语言的名字。所以我们给他起一个不同的西班牙语名字,对Supporting Files中的InfoPlist.strings文件添加本地化并选择Spanish版本:


"CFBundleDisplayName" = "Me Gusta";


这样就可以改变在Springboard中app的名字了。

…当本地化时这里遇到了一个问题。英文版本的名字有个‘i’前缀(和苹果的命名习惯保持一致的)。

但当翻译为西班牙版本时,这个笑点就不复存在了。其实,这是一个很糟的笑话,西班牙版本的名字必然它更好!