应用程序本地化:我们如何交友翻译和开发


哈Ha! 我是Badoo的领先本地化开发人员。 我们与多个大型项目合作:Badoo,Bumble,Lumen和Chappy。 现在,在本地化系统中,我们已将150,000个短语和文本翻译成52种语言。 此外,我们的每个应用程序都有自己的受众群体,市场,与用户的沟通方式,网络版本和移动平台版本。


在本文中,我将告诉您我们如何建立本地化流程,如何进行质量控制,如何根据平台发布翻译,最重要的是,我们如何确保开发人员对我们的翻译系统说得很好。 这是非常重要的一点:300多个开发人员从事项目,其工作应该很舒适。 开发人员不是翻译人员,不应该考虑翻译。


本文是根据在11月的Highload ++大会上的报告撰写的。


内容:


整个负责人职权范围!
翻译过程的特点
我们要求用户提供帮助
发展组织
本地化质量控制
发行版本
最主要的 总结
附加材料


首先,让我们看一下我们公司中的本地化流程。



在此图中,我没有反映所有的细微差别-全面了解并不需要它们。 底线是我们从职权范围(TOR)开始。 接下来是客户端和服务器开发,与之并行的是翻译过程。


TK和最终发布阶段并非徒劳地用一种颜色突出显示。 这暗示该发行版应符合ToR。 没有别的办法了。 如果TK不够完整,那么开发人员将不清楚负责什么的开发人员,哪些人应该集成文本:``手机''应将其``缝制''到移动应用程序中,或者服务器开发人员应根据请求从服务器发送它。


让我们处理所有这一切。 但是首先,我想介绍和解释一个术语。


令牌是需要翻译的任何不可分割的文本。 它可以是按钮标题,标题或整个段落。

现在我们准备继续学习主要材料!


职权范围


我们过程的第一步是准备正确的技术规格。 与本地化相关的主要元素是令牌表。 实际上,这是应在应用程序或网站上使用的文本列表。



令牌表指示文本是由服务器提供还是集成到应用程序中。 必须指出密钥:如果以前使用过文本,该密钥将出现在此表中; 如果未在任何地方使用该文本,则将指示该文本的序列号,并且开发人员将能够设置方便的键。


重用文本是一个非常阴险的时刻。 一方面,本地化过程得到了加速,另一方面,您可能会遇到一个有趣的情况。


我将举例说明。 一旦我们有一个问题“你抽烟吗?”,答案选项为“是”和“否”。 在这里,我们看到了三个标记:两个代表答案,一个代表问题。 该问题被翻译成俄文“你吸烟吗?”,答案是“我吸烟”和“我不吸烟”。 然后,我们决定进行另一项调查,并重复使用答案选项。 用英语,一切看起来都正确:“想参加聚会吗?”-“是” /“否”。 在俄语中,由于令牌的重用,结果出现了以下“对话”:“您去参加聚会吗?”-“我吸烟” /“我不吸烟”。


现在,当我们编译ToR并决定文本的重用时,我们会考虑到先前使用的上下文。 我们还会指出令牌是由服务器提供还是由客户端集成并通过App Store或Google Play交付给客户。


这些技术可以节省时间,因为它们排除了以后的讨论。


翻译


下一步是翻译。 最主要的是不要失去最初的想法。 这种情况经常发生,因为所有语言都不同,具有不同的阴影和转折。 有时,最准确的翻译根本无法在屏幕上显示,翻译人员必须妥协。


我将告诉您有关如何开始翻译,如何将上下文带给翻译人员,保持通用样式并检查结果的要点。


翻译顺序


有规则就有规则(所有规则都遵循)。 因此,我们对翻译顺序有规定。


首先,我们选择一种大多数译者都能理解的语言。 我们将在此基础上准备源文本,以便以后可以轻松将其翻译成其他语言。 我们翻译成的所有语言(共有52种)分为主语言(方言)和方言。 编写文本所用的语言是英语(我们称其为Master)。 此外,我们将英语翻译成其他语言:西班牙语,法语,俄语和其他语言。 有时,其中一种方言的翻译需要弄清楚-然后我们将其翻译成墨西哥西班牙语或澳大利亚英语。 但是,如果我们不需要这样做,我们将使用翻译成母语:基本的西班牙语或基本的英语。


一个例子。 假设我们需要使问候语更加正式。 最初,英语为“ Hey”,西班牙语为“ Hola”,法语为“ Salut”,俄语为“ Hello”,澳大利亚语为“ G'day mate”,而墨西哥语为“ Que onda”(“喜欢波浪” ?”;墨西哥人很棒!)。 如果我们想更改文本,使其更加正式,那么我们将不得不更改英语的原始文本。 在这一点上,翻译成其他语言变得不正确:需要对其进行检查和澄清。 我们提请翻译人员注意这一点。


上下文影响


重要的一点是翻译存在的上下文。


我将举例说明。


立即,我注意到一些示例是已知资源的屏幕截图,但是它们的名称对我们而言并不重要,我们只看一下本地化中最常见的错误类型。

这是带有加油站的标志:“开始运动之前,请确保油箱中没有枪。” “ gun”一词从字面上翻译成英语:“ gun”。 但是美国人的枪支是武器。 在这种情况下,“把枪从坦克中取出”的请求听起来很奇怪。


在下面的示例中,应用程序的创建者决定为男性和女性创建通用文本版本-显然,这样做对他们有好处。 感觉是文本和图片仅收集在一个屏幕上:危在旦夕。



下一个示例是关于文本的原始思想是如何由于翻译而丢失的。 看看右边的俄语版本:我们可以开始与自己沟通。 尽管据了解,它们使我们有机会链接我们的Instagram帐户。



当翻译发生在上下文之外时,会发生此类错误。 因此,对于我们的本地化系统中的每个令牌,指示如下:


  • 文字说明;
  • 显示屏幕上文本旁边的元素的图片;
  • 关于将文本显示给男性还是女性的注释-以便翻译人员可以确定是需要两种不同的翻译还是一种翻译;
  • 变量的类型(这是非常重要的一点,当我们分析开发过程时,我将告诉您更多信息);
  • 最大文字长度:对于推送通知非常重要,因为移动设备的屏幕宽度不是无限的。
    另外,我们一定会将大文本分成几部分。 如果您随后需要搜索或进行更改,这将非常方便。

让我们更详细地分析这一刻。 当我们破坏文本时,我们失去了单个短语和句子之间的联系。 因此,我们必须向译者展示本文前后的情况。 例如,对于法律文件,这是相关的,以便正确翻译。


我们还将突出显示本地术语,即标记中的语。 例如,在句子“解锁您的喜欢列表以立即查看所有感兴趣的人”的情况下,翻译人员需要知道在这种情况下,喜欢是一个特殊的应用程序目录,其中包含喜欢该个人资料的用户的联系人。 另一个类似的例子是“故事”一词。 十年前,还没有人想到“故事”这个词。 现在,它主要与他有关。


因此,我们确保翻译选项高度依赖于上下文,即以下因素:


  • 用户性别
  • 文本中出现的数字变量:“您只有一个朋友”和“您已经有十个朋友”;
  • 平台:Web,Android,iOS;
  • 正在为其执行翻译的项目。

让我们关注最后一点-翻译对项目的依赖性。 这很重要,因为每个项目都有自己的风格。

这些是在用户帐户被阻止时发送给用户的信件头。


对于Badoo:“您的帐户已被锁定。”
对于流明:“您的帐户已被锁定。”
对于大黄蜂:“您被封锁了。”
对于Chappy-“噢!”


为了在每个项目中保持统一的风格,您需要向翻译人员提供翻译历史记录的访问权限。 我们有一个称为翻译记忆库(TM)的工具。 翻译人员始终可以访问有关匹配项和相似性百分比的信息:他可以使用旧翻译,也可以输入新的翻译。 我们向译者展示的不仅是100%的匹配,而且还包括不太相似的选项,我们一定会重点介绍差异。

除了“翻译记忆库”使您可以在项目框架内保留样式外,它还有助于加快流程,因为翻译人员无需两次输入相同的内容。


案例和数字


我们有一个称为案例矩阵的工具。 这就像一个乘法表,只适用于大小写和数字。


译者根据需要为每种语言中的不同单词填写此矩阵。 一步完成它是不现实的,所以这是逐渐发生的:花了一个词-造。


结果,该矩阵有助于避免这些错误:



该工具的优势在于,在呈现给用户之前,即将在渲染之前选择了所需的形状。 这是怎么回事:



例如,我们已经翻译成俄语。 中间的“贷方”是一个标识符,是指向案件矩阵的链接。 左侧的“贷方金额”是来自开发人员的金额。 @ 3是翻译器指示的情况(在这种情况下为宾格)。


“您需要10个学分”:短语“ 10个学分”将被自动替换。


翻译检查


如果将150,000个短语和文本乘以52种语言,我们得到的数字约为750万,当然,手动检查所有这些都是不现实的。 因此,我们在保存时自动检查了翻译。


我们会自动检查诸如缺少表情符号或变量之类的功能。 如果翻译人员意外删除了一个变量,则该短语会失去其结构和含义。 比较:“您需要10个学分”和“您需要学分” –第二句话被宠坏了,思想消失了。


我们还将检查缺少的HTML,否则布局将消失。


而且我们总是警告翻译者,他的译本比原著要长。 此时,他必须检查他是否合适,文本是否适合屏幕。


我们重点介绍以下几点:


  • 译者需要对上下文的理解;
  • 翻译系统应该灵活,可以为每种语言进行适当的翻译,以免翻译人员选择通用的表述; 需要支持变形和案例;
  • 确保自动检查翻译。

用户帮助


除了专业翻译人员的工作之外,我们还利用用户的帮助。 这里有两种方法:A / B测试和联合翻译。


A / B测试


因此,您需要翻译,例如,俄语。 译者以两种不同的方式翻译了一个短语,您不知道该选择哪个选项。 在这种情况下,您可以进行A / B测试:向用户显示不同的选项,并根据他们的反应选择一个。


我们可以在以下两个选项之间进行选择:“准备好结识新朋友吗? 加入!“然后,再执行几步,您将成为Badoo的一部分。” 经过测试,我们发现有更多用户在看到推送通知的第二个选项时完成了注册。 我们离开了他。


以下是翻译选项所依赖的因素的完整概述。 第五个元素只是一个A / B测试:如果用户属于某个组,则将向他显示文本的相应版本。



联合翻译


一旦我们从墨西哥向用户发送了通知,要求他们以小笔费用(以应用程序的内部货币)的形式将一些文本翻译成他们的语言。 他们同意:在短短两天内,为我们翻译了5,000个令牌。 这是巨大的帮助,墨西哥人很棒!


有趣的是什么,为什么这种方法很重要? 如果您没有本地方言翻译器,请允许用户执行此工作。 事实证明,他们确实准备好参与自己喜欢的项目的开发。


我们有一个协作翻译平台 。 您可以使用您的Badoo帐户登录。 并为最佳翻译投票。



这是德语翻译窗口的屏幕截图。 用户可以添加自己的版本。 当其中一个选项获得投票的阈值数量时,我们会将其显示给我们的全职翻译,并且可以将其用作主要选项(前提是它与样式,项目规则相匹配,并且不会冒犯任何人,依此类推)。


不要害怕向用户寻求帮助。 他们会提示并提供帮助。


发展历程


我们传递给最有趣的-开发过程。 我首先特别谈到翻译过程,描述常见问题,然后介绍开发人员如何解决这些问题。


主要困难有两个:如何组织并行开发以及在使用令牌时如何跟踪错误,以便在正确的时间出现正确的翻译。


并行开发


我将从故事开始。 以前,我们的开发方案看起来有所不同。 源代码存储在存储库中的文件中。 两个开发人员可以并行更改某些内容,然后需要将这些更改组合在一起。 问题虽小,但不方便。

必须结合变更的旧方案


现在,我们在本地化系统中集中更改和添加令牌。 开发人员只需要下载一组令牌即可开始执行任务并使用它们。 指出了密码,您编写了代码,使用了它-所有您想到的事情。


使用令牌时的错误


翻译中有很多变量。

如果您着急的话,可以轻松地混淆“ credit_amount”和“ credit”。 为避免这种情况,我们引入了控件-文本容器,一种对翻译的抽象,它知道在此翻译中使用什么类型的变量。 它执行替换并验证所传递的替换值类型是否符合预期。 如果完成所有替换,则它将返回已经显示给用户的行。 如果不是,则返回相同的容器。 如果我们在完成所有替换之前尝试向用户显示翻译,则我们将在日志中看到警告,并且知道要去哪里以及如何纠正这种情况。


发展亮点:


  • 开发人员应该只处理他们的工作-他们不应该考虑本地化,更改文本等;
  • 您需要检查开发人员所做的事情,并且此检查也更易于自动化-这将保留该过程中所有参与者的神经细胞。

质量控制


因此,我们已经有一个经过翻译的开发产品。 有待检查我们做得如何。


让我们从示例开始。 此屏幕截图中有几个门框?



我强调了两个。 上面-翻译者显然不知道在他的短语前面会显示一个距离。 底部-不考虑显示译文的屏幕宽度。


第二个示例还涉及翻译太长而与屏幕宽度不符的翻译-此处所有内容都被裁剪掉了,铭文不适合按钮。



在下面的示例中,除了向我们展示不同语言的文本外,我们还被告知要了解痛苦。



为了防止此类错误在产品上发生,仅需进行质量控制。


控制选项


让我们看看存在哪些控制选项。


首先想到的是在网站或应用程序的测试版本上检查翻译。 也就是说,只需开始查看发生的情况是否与设计,想法,技术规范等相一致。 使用此方法,我们在推送通知中捕获了此错误:



应用程序截图


质量控制的下一种方法是根据应用程序的屏幕快照。


我们开发了一种特殊的工具,可以在测试环境中以所有语言拍摄移动应用程序所有屏幕的屏幕截图。 您可以通过浏览器查看它们的外观。 还有一种特殊的模式,切换到该模式,我们可以看到显示的文本的标识符。 这在调试时有很大帮助:您可以快速找出它是哪个令牌以及它为什么到达它的位置(也许我们继承了替换该令牌的代码)。


如果您使用的是网络版本,则只需要从某处获取图片,就可以将标记标记集成到源文本中,为Google Chrome编写一个插件-并从测试人员的机器上,从他们的浏览器中,该插件会将页面的屏幕截图发送到本地化系统他在上面发现了代币。


<ul> <li>...</li> <li> <!--lexeme_12345-->  <!--lexeme_12345_end--> </li> <li>...</li> </ul> 

我们使用这种方法已经有一段时间了。 他允许在短短两周内收集大量图片。 但是我们拒绝了,因为使用它只能获取已经发布的版本的图像,并且我们学习了如何在形成传统知识的阶段获取图像和进行设计。


翻译过程中的控制


就像我在上面说过的那样,当已经有现成的应用程序时,对我们来说拍照是不够的。 我们决定在应用程序尚未准备就绪,什么都没有并且需要以某种方式控制质量以了解一切是否按预期进行时,截取屏幕截图。


因此,我们在翻译过程中获得了控制工具。

我将解释其工作原理。 我们的设计师使用Sketch,这是他们在其中创建界面(包括移动应用程序界面)的应用程序。 我们学习了如何使用Sketch软件界面替换Sketch文件中的文本并生成所需屏幕的屏幕截图。 现在,在翻译人员的工作过程中,我们可以立即以他的语言向他显示屏幕截图。 并且甚至在开发人员开始创建新功能的第一个版本之前就执行此操作。


后来,我们将此解决方案设计为开源( articlecode )。


翻译审核


如果无法用任何特定语言(例如日语)验证翻译,则可以下令进行选择性审核,即第三方公司可以用图片显示每100个令牌的翻译并询问是否正确。


质量控制的重点:


视觉评估翻译质量是必要的;
在测试过程中,了解您的受众正在使用哪些设备并在所有这些设备上测试应用程序非常重要。


发布日期


因此,我们已经测试了很酷的书面功能。 它仍然可以将其交付给用户。


版本令牌


在我们的Badoo应用程序中,有一个Super Power服务。 在某个时候,我们需要将其名称更改为“ Badoo Premium”,并且在所有版本中一次都使用原子名称,以便用户在一个屏幕上看不到“ Super Strength”,而在另一个屏幕上看不到“ Badoo Premium”。


为此,我们在Jira中的每个任务分支上附加了一个令牌版本。 当我们在项目的新版本中包含分支的更改时,会立即提取新版本的令牌。 如果需要回滚某些内容,我们将从新版本中删除任务分支,并与之一起删除带有翻译成所有语言的令牌版本。


在测试令牌或用户已经看到令牌后,您需要非常小心:最好不要更改令牌中的任何内容,而要创建一个新版本,将其附加到票证上,并在新发行版中部署带有新翻译的令牌新版本。


翻译版本控制


但是,在翻译过程中可能会出错。 在下面的示例中,有两个。


错误:“这是后果”。
正确:“这是重赛。”


用英语,您不能使用直接撇号。 字母“ c”也丢失了。


版本标记和版本转换是两件事。 可以随时固定翻译:在开发任务时,在测试阶段,甚至已经将功能带给用户时(如果用户在新版本的应用程序中看到正确的翻译,则不会发生任何不良情况)。


服务器!=智能手机


将更新交付到不同平台的方式不同。 如果您正在开发移动应用程序,那么请确保您具有服务器和客户端部分。


向用户显示的内容部分来自服务器,或者位于用户的智能手机上(例如,集成翻译)。

从服务器到用户的传输路径通过我们的生产服务器,您可以在其中轻松交付带有翻译的文件的更新版本。


但是集成翻译的路径很长:它位于App Store或Google Play中。 用户下载更新,然后才能看到修复程序。 对于我们来说,此过程似乎太慢,因此我们想出了自己的“热更新”更新机制。 它使您只需单击一个按钮即可生成新版本的翻译,并向全球所有客户明确表明需要下载和使用一些新内容。

在移动设备上启动应用程序时,它将启动通知发送到服务器并报告当前翻译版本。 如果本地化系统已准备好更新,则它将发出通知作为响应。 客户端下载并应用更新。


当用户切换到下一个屏幕时,将看到新的翻译。 我们的两篇文章专门讨论此解决方案的实现:


发布:重点


在发布过程中,必须考虑到应用程序从您到客户的路径。 应用程序的不同部分可能会进行不同的更新。


最终结论


让我们回到本文开头引用的方案。

开发翻译系统时应注意的事项:


  • 撰写详细的职权范围;
  • 考虑上下文并为翻译提供访问权限;
  • 保留翻译历史,以在项目中保持统一的风格;
  • 自动控制(否则,位于您几个时区的任何随机翻译器都可以用自己的方式完成所有工作);
  • 使开发人员免于解决非核心任务。 他们创建了您产品的新版本,它使您的用户感到满意,并使您所创建的项目感到满意。

我想与您分享的材料


在移动应用程序中动态更新字符串:第1部分


在移动应用程序中动态更新字符串:第2部分


如何教Web应用程序说100种语言:本地化功能


我们将界面翻译成五十种语言。 草绘


Github草图修改器

Source: https://habr.com/ru/post/zh-CN485138/


All Articles