哈Ha! 我向您介绍Netflix团队撰写的材料“ Netflix本地化技术”的翻译,内容涉及专门为此设计的内部本地化流程和程序。

Netflix的本地化计划基于三个原则:无可挑剔的语言学,团队中的和谐氛围以及先进的技术。
我们不惧怕尝试并尝试新的流程和工具,以反对本地化普遍接受的规范-到目前为止,我们已经做到了! 在Netflix工作意味着成为先锋。
在本文中,我们讨论了两种技术,这些技术将引领我们在世界范围内占据统治地位。
Netflix全球字符串存储库
Netflix之所以没有成功,是因为我们制作了高质量的内容,而是因为我们提供了这些内容。 成功的大部分是直观,易于使用的本地化用户界面(UI)。 Netflix可在不同平台上使用:网络版本,Apple iOS,Google Android,Sony PlayStation,Microsoft Xbox,Sony TVs,Panasonic等。 这些平台中的每一个都有自己的内部化要求,这对我们的团队是一个严峻的挑战。
以下是一些需要UI本地化的示例:
UI的文本翻译不是一个自动过程。 在翻译过程中,本地化经理与开发团队一起工作,以便清楚地了解此行或该行所属的内容,需要将其翻译成哪种语言以及何时提供本地化文件。 当并行开发多个功能并在不同的Git分支中运行时,它将变得更加复杂。
翻译完成后,将对应用程序进行组装,测试并将其放置在平台上。 某些设备需要第三方确认(例如,来自Apple)。 所有这些都导致了截止日期的不希望有的延迟。 紧急情况特别令人不快。
但是,如果我们使本地化过程对所有利益相关者开放-无论是对开发团队还是本地化人员,该怎么办? 如果我们不再需要在每次更改文本时都重建构建,该怎么办?
为了解决这些问题,我们开发了一个全局UI字符串存储库,称为Global String Repository。 本地化的字符串存储在这里,它们被替换到环境中以执行代码。 我们将全局字符串存储库集成到了本地化过程中,因此它们可以相互补充。
全局字符串存储库将本地化包和名称空间(占位符)分开。 本地化包以所有语言逐行存储所有数据。 占位符是团队正在处理的程序包的占位符。 在开发过程中,使用标准占位符。 工作流程如下所示:
- 开发人员更改了包中字符串的英文版(在占位符名称空间中)
- 翻译过程自动开始
- 语言学家完成翻译
- 翻译人员提供占位符套件
与全局字符串存储库进行集成时,有两种类型的应用程序行为:
- 在运行时:允许您快速更改UI
- 组装期间:单独使用全局字符串存储库进行本地化,并在组装时使用数据包(内部版本)
全局字符串存储库通过在REST API中提供对本地化数据的访问,可以在构建阶段进行集成。
我们通过Netflix API打开全局字符串存储库,因此对它的缩放和要求与其他API的元数据相同。 对于在运行时集成的应用程序,这是至关重要的部分。 我们有6000万在不同设备上运行Netflix的用户,因此优先考虑使用Global String Repository。
像Netflix一样,全局字符串存储库具有微服务架构。 微服务是Java Web应用程序(在Apache Cassandra和ElasticSearch中执行),托管在三个AWS区域中。 我们收集每个API请求的统计信息。
Global String Repository接口是在Node.js,Bootstrap和Backbone上开发的,并托管在AWS中。
在用户方面,全局字符串存储库使用REST API检索数据,并为Java客户端提供内置缓存。
尽管我们已经走了很长一段路,并且正在积极开发Global String Repository,但我们仍需努力。 这是我们现在正在做的事情:
- 我们支持带数字变量的字符串和带性别标识符的字符串
- 我们开发技术解决方案的可靠性
- 改善扩展流程
- 我们支持导出为不同格式(Android XML,Microsoft .Resx等)
全局字符串存储库不与Netflix业务领域绑定,因此我们计划将其作为开源软件发布。
九头蛇
Netflix-一种全球服务,在不同的设备/ UI上以多种不同的组合支持许多语言环境; 在这种情况下,手动测试是不合适的。 以前,本地化人员和UI开发人员团队在不同的设备上手动测试了所有内容-从控制台到iOS和Android; 这就是我们检查所有行是否与上下文和UI兼容的方式(例如,文本是否有“修饰”)。
但是Netflix的理念是我们追求卓越。 这种方法使我们可以重新考虑我们在做什么。 九头蛇诞生了。
Hydra的任务是为一个唯一的屏幕创建所有可能选项的目录,该屏幕将准确显示所需的屏幕(通过过滤器执行搜索,例如,您可以选择设备和语言环境)。 例如,作为德语本地化专家,您可以配置过滤,以便查看PS3,网站和Android上未注册用户所经过的整个路径。 可以按照用户在其设备上打开它们的速度查看相同的屏幕。
在Hydra中使用屏幕
Hydra不能直接与屏幕一起使用; 它用于分类和显示它们。 为了从Hydra目录中显示屏幕,我们使用了UI自动化模型。 使用Jenkins CI,数据驱动的测试在所有受支持的语言环境中并行运行:这将创建屏幕截图,并使用适当的元数据(页面名称,功能区域,UI平台和一个关键的元数据-唯一的屏幕定义)发布到Hydra。
为了编译没有错误匹配的完整屏幕目录,必须使用唯一的屏幕定义。 从长远来看,由于每个屏幕的图像都与其自身进行比较,因此您可以比较大量的屏幕。 唯一屏幕的定义因UI而异; 对于浏览器,这是页面名称,浏览器,分辨率,本地环境和开发环境的组合。
技术领域
Hydra是一个AWS全栈Web应用程序。 Java后端具有两个主要功能:它处理传入的屏幕截图,并通过REST API为后端提供数据。

当UI自动化将屏幕发送到Hydra时,图像文件本身将写入S3,从而确保其无限存储(正负),并且将较小的元数据写入RDS数据库,以便以后可以通过REST API进行请求。 REST端点(REST端点)显示MySQL查询的查询字符串参数。
例如:
REST/v1/lists/distinctList?item=feature&selectors=uigroup,TVUI;area,signupwizard;locale,da-DK
该请求包含用于从数据库中选择必要数据的参数:
select distinct feature where uigroup = 'TVUI' AND area = 'signupwizard' AND locale = 'da-DK'
使用knockout.js的JavaScript前端允许用户选择过滤器并查看与那些过滤器匹配的屏幕。 过滤器的内容以及与所选过滤器相对应的屏幕由上述REST端点的调用提供。
应用扩展
安装Hydra并开始自动化后,添加新的语言环境就像向现有属性文件添加一行一样简单,该属性文件发送到testNG框架的数据提供程序。 具有新语言环境的屏幕将显示以下Jenkins可用的内部版本。
接下来是什么?
我们需要实现一个功能,该功能将通知屏幕已更改。 目前,如果生产线发生变化,则没有任何东西会自动通知您。 Hydra可能会变成或多或少的工作队列,然后本地化专家将能够登录系统并仅查看一组已更改的特定屏幕。
另一个功能是能够将各行按键映射到要显示的屏幕。 这将使翻译人员可以更改行,然后执行关键搜索并查看受此更改影响的屏幕。 因此翻译人员会提前了解这条线在上下文中的变化。
我们不怕解决复杂的问题。 Netflix将成为一项全球服务,而我们的本地化团队将扩大。 这些挑战使我们能够吸引最有才华的人才,并且我们创建了一支能够做到不可能的事情的团队。