「中文翻译」 Netflix App 的伪本地化

原文来源:Pseudo Localization @ Netflix
作者: Tim Brandall

译者前言:如果你的应用需要适配国际化,特别是在多个国家和地区进行发售的应用,可以参考一下 Netflix 国际化开发小组是如何发现并解决其中的一些问题的。不过解决问题并不意味着工作的结束,有一些任务可能需要更多的时间和精力来应对。阅读时间:大约 6 分钟

在过去的 8 年里,Netflix 已经从单语言应用(仅提供英文)转变为现支持多达 26 种语言且语言数量还在不断增多的产品。随着我们团队为 190 个不同国家和地区的用户添加了本地化语言支持,国际化这一需求在 Netflix 上也变得越来越重要。在这个阶段中,团队使用了无数的方案去解决一些困难,并取得了一些成果。这篇文章中,我们将关注我们团队一直在进行的一项工作:伪本地化。

问题根源

我们要着手解决的问题很简单:我们在进行本地化测试时发现了一个由于译文长度膨胀,最终导致许多 UI 布局出现错误的问题。

翻译成其他语言时,译文的长度有可能会比英文长 40%。这种情况在德语、希伯来语、波兰语、芬兰语和葡萄牙语中比较普遍。来看看德语环境的 UI 下真实存在的一个样例(为了更好地展示例子,以下样例中的文本皆为原文):

Don’t miss out.

翻译成德语,他就变得更长了:

Lassen Sie sich nichts entgehen!

然后将文本放在当前的 UI 环境中,我们可以发现问题所在了:

德语环境下文本的布局问题

这只是诸多问题中的一个例子而已。问题的根源在于我们起初设计 UI 时,只应用在英文环境下,字符长短、行高和字形的布局都是根据英文来设定的。所以常常当这些字符被翻译成其他语言时,我们就会看到文本扩张造成的布局问题了。当产品支持 26 中语言时——就像我们的产品一样,你可能需要应对、记录、管理并解决 26 个缺陷。其实早在国际化开始前,我们在设计英文界面的阶段就一直有机会去修复这些潜在的问题。

解决方案

我们采用了伪本地化。伪本地化是一种在英文 UI 环境下,使用英文的字符来模拟翻译的一种方式,它无须等待或是耗费时间去执行真正的翻译。可以将其视为一个假的翻译,但是对于讲英语的开发人员来说仍然具有良好的可读性,并允许他们测试翻译相关的文本扩张,以及其他重要的事情。以下是我们 Netflix 伪本地化在 iOS 中实际应用的一个例子:

Netflix iOS 伪本地化

它有助于区分我们正在做的事,不再特地去为了适配国际化文本的布局做一些额外的事。我用下面的字符来展示一个例子:

Find Help Online

通过我们的伪本地化算法后,这段文字变成了:

[ƒîกี้ð Ĥéļþ Öกี้ļîกี้é one two]

以下是文字转换的几个要点:

  • 起始和结尾的标记物:字符都被包裹于 [] 之中。如果开发者没有看见这两个括号,他们就会知道字符被非动态的 UI 布局截断了。
  • 将 ASCII 码转换为相对应的扩展码:将用于测试及编码支持的字符根据它的垂直线高度加以着重符,并移除未正确外表化的字符(它们没有相应的扩展码来支持伪本地化)。
  • 填充文本:模拟的翻译文本会缩短长度。我们的处理办法是在模拟文本后添加 “one two three four”…等等这些字符,以模拟基于原文本的 40% 扩展长度。需要注意的是,我们不会将 UI 的区域弄成跟文本扩张一样,对 UI 进行 40% 的扩张,因为其中的文本长度在显示之前已经被其他系统限制,如果 UI 也一样扩张的话会引起一些问题(例如在故事梗概、标题部分的 UI)。

我们 TV 平台上的伪本地化实践

TV 平台上的伪本地化实践

底层实现

我们很幸运能够利用我们基于云端的全局字符存储仓库(Global String Repository来完成这项工作。来自存储仓库请求的任何字符都会应用伪本地化转换,然后我们再将转换后的文本传递给客户端。转换逻辑位于我们的 Netflix 国际化库 NFi18n 中,并可通过 API 提供给所有其他 Netflix 的服务。此解决方案的优势在于它可以被使用在所有我们能够支持的 UI 上。

我们所面临的另外一个最大的挑战是未经全局字符存储仓库转换的、显示在我们界面上的文本。这些文本类型可能涵盖电影/电视节目标题、节目概要、演员名字、评分等。这些“电影的元数据”存放于涉及 Netflix 内部的多个不同的系统中,所以我们需要一些搜寻的时间去掌握它们所在的具体位置,以及确定何时和何处将这些执行过伪本地化的元数据展示出来。将这些文本内容伪本地化操作是很重要的,因为如果不将这些元数据处理,体验上来讲就会显得不完整,半边英语,半边扩展码,就像下面的图展示的那样:

未将元数据伪本地化

实现功能并不意味着工作的结束

深入去了解这个项目(伪本地化)时,我们发现推动此项功能实现至关重要的团队是分布在 Netflix 中的不同的设计开发小组。在完成之后,如果没有人去使用这项工具,那无论我们的解决方案有多么优秀都没有作用。所以以下的几个方面我们投入了许多精力:

  • 培训和指导:团队中的任何人都需要弄明白这个工具是什么,我们为什么需要使用它。我们要表明这个工具的作用和影响。
  • 简单易上手:我们需要让开发团队尽量简单地将我们的解决方案集成入他们的项目中。任何会产生麻烦的操作都不会考虑在内。
  • 选择排除:我们希望将 Netflix 的伪本地化服务「排除在外」。这里说的「排除在外」的意思是,让它成为 UI 开发者默认的语言开发配置,当他们调试程序时,他们会直接享用伪本地化带来的好处。我们要求每个 UI 开发者从根本上改变他们的工作方式。

学习这项工具

我们一向认为架构和实施具体的解决方案并不能算整个工作内容的一半,我敢打赌它们甚至连一半都不到。真正的工作始于推广、影响、指导这个项目的使用和实施并且实实在在地改变了开发者的工作方式。我们利用伪本地化带来的影响力,和它能从根源上杜绝相当数量问题的发生——开发者修改一次问题实际上会修改 26 次,这些层面上来开展以上的工作。我们已经看到了 UI 工程师发现并修复之前我们在多语言翻译之后产生的一些问题。现在的话,他们只需仅仅发现并纠正一次就够了。

接下来需要做的事

从最初向开发团队推广这个工具到六周以后,我们调查了所有开发人员。以下是我们所探讨的一些关键领域的问题:

  • 你觉得这个工具的优化点是什么?
  • 开发阶段你是否会停止使用它,为什么?
  • 你是否明白伪本地化工具的意义和重要性?
  • 工具的易用性如何,你觉得需要怎么改进你才会用的顺手?
  • 在使用工具时,还有没有过遇到布局的问题?

根据调查,反响热烈的主题是使用工具后的可读性。虽然我们保证了大体上的可读性,不过还是在理解屏幕上的文本时引入了额外的阅读成本。正因为如此,我们将把我们的转换过程简化,将一些转换过头的字符修正,同时仍旧会保留伪本地化中有用的元素信息。我们也收到了一些关于为扩展文本添加 “one two three four…” 的反馈,他们觉得文本看上去不自然,而且这文本如果是扩展文本,或者如果是 UI 当中的占位符/变量名,会容易引起混淆。所以,我们未来会继续研究扩展文本的其他方式,其中一种方式是将文本中的元音字母多写几次来取得相同的结果,例如:

前: [ƒîกี้ð Ĥéļþ Öกี้ļîกี้é one two]

后: [ƒîîîกี้ð Ĥéééļþ ÖÖกี้ļîîîกี้ééé]

加入我们吧!

如果你对我们在这篇文章中谈过的充满挑战的项目感兴趣,我的国际化团队欢迎你的到来。可以了解一下我们发布的岗位信息,并随时在领英上跟我取得联系