国际化和本地化应用程序,第3部分:技术挑战

图片由迈克尔DziedzicUnsplash

在这四个部分的三个部分教程,了解如何解决的各种因素和语言的细微差别。这包括多元化、可访问性、格式化日期和数字,和更多!

查看本系列的第2部分在这里

让Unicode带路

2003年,Unicode协会发布了第一个版本的项目称为常见的语言环境数据存储库,缩短系统的大量XML数据集,很多国际化、本地化和翻译特定数据和规则。自从,存储库已经现在达到主要版本39在写作的时候。的一些事情编码的系统包括:

  • 翻译语言的名字
  • 翻译为领土和国家名称
  • 货币名称的翻译,包括单数/复数的修改
  • 的翻译工作日,,时代期天,完全和缩写形式
  • 翻译为时区和城市(或相似的)例子时区
  • 翻译为日历字段
  • 模式格式化/解析日期或时间
  • 用于写作的语言范例的字符
  • 模式格式化/解析数字
  • 规则language-adapted单数、复数和序数措辞
  • language-adapted规则排序
  • 格式化数字规则(就像在传统的数字系统罗马数字,亚美尼亚的数字等)。
  • 规则拼写出数字单词
  • 规则音译之间的脚本。它是基于BGN / PCGN皈依天主教

利用这些数据可以很简单,比如下载并解析XML,然而,通常是有用的依靠标准化,CLDR-backed库或api,如Intl api提供的大多数现代浏览器和最新版本的节点(或类似的语言/特定于平台的实现系统的数据)。

另一个Unicode协会考虑考虑的是如何正确处理删除或者把单词分解利用字形集群,以确定合适的地方的一组字符的分割,同时仍然保留有意义的文本块。这就可以是一个整篇文章,但它是安全的String.slice (…)将不能满足如果你需要手动操纵字符串不管出于什么原因。

地区特定的格式

当然,每一个地区都有独特的方式处理某些数据的格式。最常见的例子,和一个你以前遇到的最有可能货币每个货币使用一些特定的符号,这样的美元。最重要的是,它是常见的货币的格式也是各地区根据不同的每个区域代表数字。例如,让我们使用Intl.NumberFormatAPI检查几个数字:

不同的货币格式

当然,这不仅仅适用于货币,但也类似百分比,用于OkCupid表示两个用户之间的匹配百分比。188bet金宝搏官网这里有一个例子如何本地化的百分比:

差异百分比格式化

这些api是令人难以置信的强大的和最近的浏览器(和最近节点本地版本)。他们还提供格式数据的方法,例如使用不同的数字集对于某些地区,本地化的距离/速度/公制测量,等等。

还有其他事情,我们还应该确保正确定位在我们的应用程序,如日期,时间,相对时间,甚至列表:

利用Intl api的例子

同样值得一提的是,另一件事常常被忽视这样的本地化值时是“按字母顺序排序”的概念将会改变给定的语言使用中,符号的使用在一个给定的语言将会改变,而简单.sort (…)默认情况下当然不会考虑语言环境。幸运的是,这个系统我们再一次被覆盖提供规则排序这样排序可能是局部的。的Intlapi还公开排序器为这个目的。

当然,真相的最佳来源为所有这些信息永远是最新版本的公共场所数据存储库,并利用任何API实现的数据源(如Intlapi)是一个伟大的方式,以确保提供正确的数据对于一个给定的语言环境。

可访问性

也许软件更重要的主题之一,尤其是在过去的几年中,易访问性是一个很多应用程序的核心功能。Mozilla将易访问性定义为:

可访问性的练习是让你的网站使用了尽可能多的人。我们传统上认为这是残疾人,但网站访问的惯例也有利于其他组织如使用移动设备,或那些缓慢的网络连接。

如果我们把这个定义在它的脸上,然后我认为这里是一个扩展,,可访问性的国际化应该考虑一个宗旨。我们正在努力打开软件整个人此前有限或没有意义的访问,并使其访问和与这些人有关。

对于开发人员来说,这意味着我们还应该确保我们所做的所有的工作,以确保我们的应用程序都可以访问应该将直接与我们国际化应用程序工作。如果我们提供易访问性标签通过意义altaria - *属性之类的,我们还应该确保他们正确翻译,很容易忽略的东西。

同时,我们应该关注解析文档的可访问性工具和用户的手势,确保这些是正确的本地化。重要的是要确保我们的文件是正确(例如,使用HTML标记属性),这样等软件的辅助可以意识到文档的问题是在一定的语言。至于手势,想象习惯于从右到左的语言像阿拉伯语和希伯来语:如何提供一个正确定位在“刷”和“刷”?自然,这些特性源于西方的经验和有趣的是考虑如何在布局和他们不最初设计的脚本。

API设计,重新设计?

定位应该发生在哪里?

当工作在您的应用程序,可以定位的内容内容协商,特别是接收语言头的作用将派拉蒙在什么地方获得阅读用户将期待收到请求时,您的web服务器或服务。尽管这是一个HTTP内容协商的具体特性,拥有一个统一的概念,用户的区域代码(s)可以传播整个系统可以应用抽象和跨各种协议。当然,还有其他的方式表示偏好的语言,最常见的,否则可能会使用一个URL查询参数,如www.somesite.com/home?lang=en。当然更隐式基于头的方法之间的权衡和更明确的参数方法,和应该重等因素在您的应用程序请求/响应缓存机制。

也许一个陷阱常见许多api的设计没有国际化,这是至关重要的,以确保每个数据点(或至少部分表示)的一种方式唯一标识。使用字符串直接很少比个人id在国际化服务或API,它允许客户机和服务器代码删除依赖变量数据。例如,让我们抽象地勾勒出一个做作的请求,我们希望得到一些数据,可以用于后续的切向请求:

获得“api /菜单/ pizza_toppings”——>[“奶酪”,“意大利辣香肠”,“素食”)
文章“api / my_pizza / add_topping”——>(“意大利辣香肠”)——>{成功:真}

考虑到如果我们想要支持这些返回的数据点的翻译/ pizza_toppings所以我们的用户可以看到的本地化版本文本、端点/ add_topping可能不具备理解价值观以外["奶酪”、“意大利辣香肠”、“素食”),如果我们将这些值转化为等效在另一种语言,我们的客户将发送虚假请求。对比之下,像下面这样:

获得“api /菜单/ pizza_toppings”——> (
{id: 1220,名字:“奶酪”},
{id: 1234,名字:“意大利辣香肠”},
{id: 1002,名字:“素食”}
]
文章“api / my_pizza / add_topping”——>(1234) - - >{成功:真}

通过构建api和服务的输入和输出在一个更标准化的格式,我们现在可以很简单翻译的名字的字段/ pizza_toppings负载和不需要担心打破我们的软件通过添加对其他语言的支持。这似乎是显而易见的,但我强调这一事实在高速情况下很容易忽略的东西你不是目前设计(事后是二十20),这是可以理解的,对软件这不是预期支持功能定位,一个工程师可以很容易地选择了前者的例子为了简单性。

最后,值得花一点时间来分析当前应用程序的体系结构和问题是否有必要(并随后,可能)支持各种语言和地区。如果你有一个服务将需要适应给定的语言,文化,或法律的要求一个给定的地区,这种可变性如何融入当前的api和服务的体系结构。这是可能的,可能需要服务,专门的任务确定的映射功能区域或地区。

风格、主题化、资产

就像我前面提到的,资本化是一个非常重要的一些语言的句法特征。出于这个原因,我觉得这是最好避免使用像CSS代码首字母或Javascript的String.toUpperCase执行显式的改变消息的情况下,将显示给用户。你几乎可以保证,这将无意中腐败消息的翻译。让我们来看一个例子,例如,我们要利用用户和他们的位置的名称:

天真case-transformations导致误译

好,现在我们刚刚在土耳其实际上翻译两个消息,我的名字不是NİCK城市的名称并不是CİNCİNATTİ这一事实,无论字形应该成为İ当大写在土耳其。

另一个重要部分时要记住我们的软件的样式是可以确保我们的组件考虑到他们的内容容易规模和成长。认为这句话只是几句话或英文字母很容易两倍或三倍的长度当翻译成其他语言(反之亦然)。当然一个设计问题的一部分,但这也是我们的责任,以确保我们在我们的设计中可变长度的字符串,这样翻译不会引起我们的组件来剪辑或以任何方式。

随着设计不同的预期长度的内容,我们也应该记住,我们的组件应该建立在某种程度上他们能够被用于多种语言的脚本,不管方向所选的脚本。把这个做作的CSS作为一个例子:

让你的风格类型为多个文档工作方向

小心使用开始结束值而不是正确的值将允许我们的规模毫不费力地跨越语言的样式表从左到右脚本和从右到左脚本!整洁!

也许真的让你的本地化工作的另一个领域是使用脱颖而出不同地区的自定义主题。就像我前面提到的,颜色和象征意义都受到文化和语言他们了,所以使用类似ThemeProvider从风格的组件管理一个基于应用程序的主题活动场所可能是一个非常有趣的方式让你的产品感觉更自然,突出更多的在不同地区和语言。例如,我们的错误消息可能是红色为西方地区的颜色通常与错误有关,而不是一些东亚地区,颜色不常与错误。这是一个小例子,但地区特定主题的可能性几乎是无止境的,。

一个有趣的讨论将OkCupid的当前态度本地化的资产。188bet金宝搏官网也许你的应用程序使用大量的静态图像。通常,共同找到文本直接烤成这些图像,这允许我们开发人员不需要担心这些资产的样式,我们只是把它们,它们看起来正确。然而,现在意味着这些资产需要本地化,甚至如果你计划扩展到几个(更别说十)的语言,创建/出口/进口这些资产的单调基于特定的语言环境为设计人员和开发人员将线性增加。出于这个原因,我们决定尝试删除嵌入语言在我们的资产,并使用更多的中性资产可以工作在不同的语言和文化。这是一个极其简单的例子说明:

基于文本的资产与illustration-based资产和本地文本

左边的元素用红色标出资产实际上是图像,文本,从CDN加载。绿色在右边,图像已经脱离文本,所以,文本内容和图像资产可以在反应/ CSS呈现独立于不需要部署大量图像每个语言的CDN。

我们还创建了一些很酷的定制文本渲染类localizble的方式来处理我们的风格。看看这个职位在这里

这真的是一个常数?

我想总结一下更具体的技术问题,提供一个小的轶事我遇到一个问题,和哲学/建筑点长大对我的代码在我的脑海里。在某些时候,我有一个消息准备翻译,不明白为什么这个消息不正确翻译回来。

它最后变成了翻译应用文件导入时,因为它被定义为一个常数,所以它从来没有重新评估后的最初评估(在这种情况下,它还没有最新的数据进行正确的评价)。

通常我们把块代码库,并经常涉及到把原始数据类型字符串和宣布他们一旦常量和整个代码库中的文件和模块重用他们。然而,当您使用类似反应提供者和上下文应用地区跨组件或应用程序,你的“常量”现在改变基于应用程序的状态。这些真的是不变了吗?这当然是一个小差异,但强调了这样一个事实,琐事的声明常量需要重新考虑下国际化的光。

也是个好小练习编写软件!分解你的工作,问自己是否你正在做的事情是有意义的上下文是一个很难掌握的技巧,但肯定有价值的在避免这种情况下(一般只需构建软件)。

查看本系列的第4部分在这里

188bet金宝搏官网OkCupid科技博客

读故事OkCupid工程团队每天连接数以百万188bet金宝搏官网计的人

尼克·布兰德

写的

软件工程师·纽约·https://nickbrandt.dev

188bet金宝搏官网OkCupid科技博客

188bet金宝搏官网OkCupid的工程团队负责匹配每天数以百万计的人。OkCupid科技博客上读到他们的故事188bet金宝搏官网

尼克·布兰德

写的

软件工程师·纽约·https://nickbrandt.dev

188bet金宝搏官网OkCupid科技博客

188bet金宝搏官网OkCupid的工程团队负责匹配每天数以百万计的人。OkCupid科技博客上读到他们的故事188bet金宝搏官网