iOS模拟器中的本地化

您关心自己的应用程序已本地化,对吗? 万岁,你! 但是,仅靠照护还不够,尤其是当您不是唯一正在使用某个应用程序的人时。 让我们通过一些简单的步骤,使在iOS Simulator中查看本地化变得更加容易。

在我说“第一要务”之前,让我们先解决一下:希望您已经在所有地方都使用了自动版式。 如果您不在,没有比现在更好的时间开始过渡了。 标签中的变长文本意味着在某些时候它们会四处移动。 也让其余布局也相应地移动。 回到表演!

一幅图片价值一千个字

第一件事:确保您的UI可以处理翻译文本比预期长得多的情况。 当然,您可以尝试一堆不同的翻译,但是一个快速的近似值是假设所有内容都是当前长度的两倍。 等待。 不,不要开始两次粘贴您的翻译。

当然,您的运行方案中有非常方便的“双倍长度伪语言”,但这不能让您用另一种语言测试双倍长度。 你为什么想这么做? 也许您的系统语言不是您应用的主要语言。 我们将以老式的方式进行处理,并带有启动参数。

  1. 编辑方案(“⌘+⇧+ <”或单击“产品,方案,编辑方案”)
  2. 选择“运行”操作,然后单击“参数”选项卡
  3. 将“ -NSDoubleLocalizedStrings YES”添加为新参数
  4. 运行该应用程序,然后点按Tappa

现在,您可以将任何一种语言加倍运行,以真正对您的UI进行压力测试。 👊

您获得了本地化,您得到了本地化,然后…

好的,您的UI可以使用样式和宽限期处理不同长度的翻译。 现在,确保您不会错过任何这些翻译。 回到计划!

  1. 编辑方案
  2. 选择“运行”操作,然后单击“选项”选项卡
  3. 选中“显示非本地化的字符串”选项

当字符串没有翻译可用时,这会将文本变成大写。 您会看到“ USERNAME”跳出来,而不是缺少诸如“ username”之类的占位符短语。 没什么吸引人的UI。

其他名字的玫瑰

所有这些模板讨论,我们甚至都没有尝试在应用程序中查看本地化的文本。 让我们修复它。

进行方案设置! 您可以始终尝试“选项”>“应用程序语言”,但这需要单击,单击,单击。 相反,让我们使用另一个方便的启动参数来指定要使用的语言。

  1. 编辑方案
  2. 选择“运行”操作,然后单击“参数”选项卡
  3. 将“ -AppleLanguages(de)”添加为新参数

要使用德语以外的其他语言,只需将“ de”替换为您选择的语言代码即可。 您可以设置一堆这样的参数并根据需要启用它们,但请记住,您不能同时使用多种语言运行应用程序。

太多的用户界面,很少的代码

您可能已经通过Interface Builder编辑了本地化,但是在某些时候您将拥有一些条件文本,这意味着跳入代码。

如果您尚未对代码进行任何本地化并且没有使用genstrings,则应先设置好字符串文件,然后再进行进一步的阅读。 这很简单,但不直观。

我敢打赌,您熟悉NSLocalizedString,但是NSLocalizedStringFromTable呢? 没有? 向组织中的新朋友问好。 就像使用NSLocalizedString一样,但是它允许您选择自己的本地化表(即文件)。 更好的是,它可以为您的本地化构建特定于上下文的帮助程序。 这样,您在阅读别人的代码时就不必猜测本地化应该存放在哪里。

这是之前:

 类DetailViewController:UIViewController { 
覆盖func viewDidLoad(){
super.viewDidLoad()
title = NSLocalizedString(“ DetailGreeting”,“”)
}
}

请查看以下内容:

 协议可本地化{ 
func localized(tableName:String ?,注释:String)->字符串
}
 扩展可本地化,其中Self:String { 
func localized(tableName:String ?,注释:String =“”)->字符串{
返回NSLocalizedString(self,tableName:tableName,comment:comment)
}
  } 
 扩展字符串:可本地化{ 
func detailLocalized(comment:String =“”)->字符串{
返回self.localized(“首页”,评论:评论)
}
}
 类DetailViewController:UIViewController { 
覆盖func viewDidLoad(){
super.viewDidLoad()
title =“问候” .detailLocalized()
}
}

当然,第二个示例中有更多代码,但请看一下该代码为您提供了多少上下文! 您确切知道为什么要扩展String,了解本地化的来龙去脉,并且可以将值读取为字符串,而无需通过宏进行解析。 这些肯定是我书中的胜利。

Tribbles的麻烦

您对“ [单个文件下载]”和“ [更多文件下载]”进行了几次本地化? 我敢打赌,您在每个字符串文件中创建了一个不同条目的多个模板,希望输入到模板中的“更多”数字在本地化中有意义。

不要那样做

您正在寻找的是一个stringdict文件。 它是一个plist,可让您为每种语言定义正确的复数形式。 苹果公司有一些不错的实现文档和大量的代码示例。

分享是关怀

我一直在寻找从UI抽象所有方案设置的方法。 我真的希望能够使用xcconfig文件来执行此操作,这可能是我的新Xcode项目引导过程的一部分。 我发现最接近的是创建一个脚本,该脚本使用plistbuddy将条目注入到主xcscheme中。 它也可以是Podfile post_install挂钩脚本。 或者它可能在Fastlane车道上。 您的读者怎么看?

结束是开始就是结束

到目前为止,您已经有了一种方法来测试您的UI是否正在本地化所有内容,这些本地化适合的位置以及在模拟器中运行时不同的本地化文本的外观。 🎉太好了! 🎉

接下来,我将讨论如何自动化所有这些测试,尤其是针对您的应用支持的每种语言。 敬请关注!

资源:

测试您的国际化应用
在开发的不同阶段,甚至在本地化应用程序之前,都要测试您的国际化应用程序。 预览您的… developer.apple.com 启动参数和环境变量
走进任何一家美国快餐店,都会看到色彩艳丽的背光特色菜…… nshipster.com 字符串本地化·objc.io
objc.io出版有关iOS和OS X开发的高级技术和实践的书籍 www.objc.io