有关本地化应用程序的一些技巧

在这篇文章中,我将描述一些陷阱并提示本地化应用程序时应考虑的事项。 并不是要深入了解本地化的不同部分,而是要深入了解要寻找的内容。

什么是语言环境?

通常,语言环境由定义为两个ISO代码的两个组件组成。

  • ISO 639-1描述了一种语言
  • ISO 3166-1 alpha-2描述了一个地区,通常是一个国家,但也可以是其他非主权国家的领土,例如南极洲( aq )或奥兰群岛( ax )。

这两个组件通常像这样的en-GB ,并且是一个区域设置。 有时您会从语言中获得本地化规则,有时是从地区中获得,有时是从组合中获得。

这是我们将在本文中讨论的一些语言环境

某些语言根据地区而有所不同。 例如巴西葡萄牙语pt_BR或美国英语en_US ,其中某些单词的拼写与基本语言不同,或芬兰瑞典语sv_FI ,其中某些单词不同,但基本上是同一语言。 还有诸如瑞士德语gsw-CH之类的语言,其中书面语言与基本语言相同,但口语不同。

API

使用API​​发送数据时,最好保持语言环境中立。 选择一种国际标准并坚持下去。 这样,您就不必一直在不同格式之间来回转换。 我推荐的一些标准是:

  • 对于语言环境,请使用ISO 639-1 + ISO 3166-1 alpha-2
  • 对于单位,请使用Système international d'unitésSI )衍生的单位
  • 对于电话号码,请使用The international public telecommunication numbering plan,E.164
  • 对于时间戳记,请在末尾使用ISO 8601UTC时区)
  • 对于货币,请使用ISO 4217
  • 对于使用Unicode编码的自由文本字符串

如果您感到有些疯狂和疯狂,还可以使用SI derived units ,那么您将获得更多的人类可读单位,例如以watts表示功率量,而不是SI基本单位的组合: kg·m²·s⁻³

陷阱

当您开始本地化应用程序时,您很快就会意识到,您对应用程序了解的越多,获得的难度就越大。 通常,您不必从一开始就本地化您的应用程序,但您可能应该对其进行国际化,即使其与语言环境无关。 由于需要做很多事情才能完全本地化应用程序,因此从一开始就可以为它做好充分的准备。

翻译

如果您有某种类型的系统,在该系统中您有绑定到字段的转换键,我强烈建议您不要将这些键用于不同的上下文。 英语中的某些单词可以用作动词和名词,但其他语言可能并非如此。 与要查找某个单词是否要在不同的上下文中使用的单词相比,重新翻译一个键并不昂贵。 最好将OK翻译50次,因为在不同的语言中可能会有不同的OK风格,根据上下文的不同,它们的效果更好。

在不同的语言中,单词的顺序可能不同。 French potato salad翻译为法式French potato salad法国Salade française de pommes de terre 。 不要指望单词在句子中排在第一或最后。 代替串联字符串,您应该使用占位符。 也不要期望一个句子包含相同数量的单词。 甚至不要期望一个段落具有相同数量的句子。

有时翻译取决于语法性别,因此可能很难使用在运行时用值替换的占位符。 Give me the ${thing}在西班牙语中不起作用,因为${thing}可能在语法上是女性的或男性的,并且会修改(导致lael )。 因此,通常您会发现没有一对一的地图。

单位

第一个显而易见的是,并非每个人都使用公制单位。 最显着的例外是美国使用的是US Customary Units ,它是旧的英制Imperial Units System (或称Exchequer Standards )的一种变体。 如果您想变得非常严格,则需要区分例如美国英里和英国英里。 它们的英里数相差几毫米,但并不是所有美国州都做到这一点,在某些州,并未定义他们使用的英里数。

关于单位,如果您打算支持美国,则准备在各处准备好例外情况。

这里有些例子:

有时某些地区正式使用另一单位,而不是人们实际使用的单位。 例如,在英格兰,即使他们正式使用公制,也很难用石头来衡量您的体重或以英里为单位来测量距离。 在瑞典,通常使用mil (10公里)单位代替kilometers

一个棘手的事情是,一个系统中的测量值并不总是与另一个系统中的测量值相当。 如果您在一种系统中使用英寸,则在另一种系统中并不总是适合使用厘米。 通常有一个用于测量不同事物的首选单位。 您不会以千米为单位测量身高。 有时在特殊情况下会使用一个奇怪的单元,而在其他情况下则不会使用。 例如,即使在公制区域中,船只也以英尺为单位。

有时,使用的单位无法轻松转换为其他单位。 例如,美国miles per gallon用于测量燃油消耗,但在欧洲, liters per 100 km 。 您可能会注意到,欧洲衡量的是一段特定距离内消耗的燃油量,而美国衡量的是您获取一定量的燃油所消耗的燃油量。

数字,逗号和分组分隔符

数字在语言环境之间存在很大差异。 通常不同的是将数字的整数部分和小数部分分开的符号。 通常是一个时期. 或逗号。 分组分隔符也不同。 分组分隔符通常分隔成千上万。 分隔符通常是逗号,空格或句点. 。 以下是一些常见示例:

小心! 分组分隔符并不总是千分隔符。 在孟加拉国和巴基斯坦,他们将其写成这样的12,34,567.89 。 确保始终使用格式化程序格式化数字。

这里可能还有些棘手的事情是,有时显示小数点有时是有意义的。 当以米为单位测量自己的长度时,您可能需要小数点,但如果以厘米为单位,则可能会跳过。 即使您要测量同一件东西,也不总是在不同的单位系统之间映射。 如果在一个语言环境中使用厘米,在另一种语言环境中使用英寸,则可能需要小数点而不是另一位。 另外,请记住,某些语言环境使用小数(再次以美国为单位看)而不是小数,例如英寸2英寸。

普通人

序数通常用于描述排名或排名,例如1st2nd 。 当然这是本地化的。 英文使用-st-st-rd之类的后缀,但后缀并不总是三个,也不总是与数字的最后一位联系在一起。 例如,法语使用语法性别来确定要使用的后缀。 芬兰语非常复杂,取决于具体情况。

红衣主教

基数就是您拼写数字的时候。 像“一百五十五” /“一百五十五”。 一件好事可能不是一件事情,那就是en_GB发言者有时将其称为“十亿”“毫”,而en_US发言者则将其称为“十亿”。

多元化课程

复数化是一种棘手的野兽,因为它非常微妙,通常您不必关心它,直到您真的必须关心它,然后才感到痛苦。 在英语中,您说“零日s ”,“一天”,“两天s ”,“三天s ”等。 请注意,如果仅谈论一件事,则缺少。 根据谈论的事物数量,一个或多个单词会发生变化。

英语使用两类,通常称为one类。 另一方面,许多斯拉夫语言使用两种以上的类别。 例如俄语有onefewmany 。 不同的语言在决定使用哪种类时使用不同的规则,并且这些规则可能非常复杂。

日期和时间

在使用API​​交流时间时,远离时区,格式和其他特性总是很明智的。 始终将ISO-8601与协调世界时(UTC)时区一起使用。 看起来像这样2017-06-27T00:25:56Z 。 您还可以使用Unix Epoch ,它是自1970-01-01T00:00:00Z以来的秒数。这样,​​您就不必担心本地的夏时制,已翻译的月份名称,有争议的地区的时区,年/月/日等

看看这些例子:

尽管它们都是欧洲国家,但几乎没有一个采用相同的格式。 实际使用和正式使用之间也有区别,因此您必须选择自己喜欢的一种。 通常也针对区域而不是语言进行格式化。 瑞士法语将像瑞士人一样格式化日期,但法语法语将像法语一样格式化日期。

如果您将名称拼写清楚,则某些语言环境会将月份名称大写,而其他语言环境则不会。

在这里,您还需要从不同格式的负载中选择一个。 长,短,中,缩写,仅数字,以上所有的组合等。

另一个棘手的事情是确定要格式化的时区。如果显示另一个时区中发生的事件,那么您要格式化该时区中的时间还是将其格式化为用户当前时区中的时间? 有时最好混在一起。 有时不是。

百分号

某些语言环境会格式化百分号,并在数字前显示符号。 有些国家的数字和百分号之间有不同类型的空格,有些则没有。

例如, fi_FI始终在符号和数字10 %之间有一个空格。 fr_FR使用不间断空格10 %it_IT10%之间没有任何东西。 tr_TRtr_TR放在数字%10之前。

因此,请始终使用格式化程序格式化百分比,以便您可以控制格式化。

问号

例如,在es_ES包含一个问题的句子以一个开始的问号¿开始,以一个结束的问号?结尾?

尽量避免在代码中添加问号,而不必确保其已正确定位。

货币

关于货币的一些注意事项是,有时货币符号应该在数字前面,有时是相反的。 有时在本地会使用特殊符号,例如kr代表Swedish Krona ,瑞典人使用SEK ,其他人则使用SEK

值得一提的另一件事是,有时语言环境对货币不使用其常规的十进制和分组分隔符规则。 所以要当心。 是否在货币符号之间使用空格也存在局部差异。

以下是在瑞典和英国设置货币格式的一些方法。

在API中交流货币时,您应该尝试遵循一些标准,例如ISO。 ISO对所有货币(以及实际上可以用来购买黄金的其他商品)使用三个字母代码,称为ISO 4217 。 用那个

电话号码

一个很好的默认设置是使用看起来像+19995550123 E.164 。 您可能希望在某些组之间添加空格,这是本地特定的。 您显示的位数也取决于您拨打电话的地方。 往返于同一国家/地区的电话无需添加国家前缀,例如+45 。 在本地通话时,您有时甚至会丢掉更多的数字,而仍然可以拨打正确的电话。

地址格式

地址格式因国家/地区而异。 即使地址通常以街道名称开头,以国家/地区结尾也并非总是如此。 根据您要格式化地址的上下文,可能很难知道地址的哪些部分是相关的。

我真的没有任何关于如何格式化地址的指针,只是要指出它可能比预期的难。

行事历

如果您要在非西方国家生活,最好记住,即使它是简化的国际日历,并不是每个人都使用公历。 在伊朗,阿富汗和埃塞俄比亚的某些地区有自己的当地日历。

性格

显而易见的是,并非所有人都使用拉丁字母( ISO 8859-1 )。 希腊人使用希腊字母( ISO 8859-7 ),斯拉夫人使用西里尔字母( ISO 8859-5 )等。无论您做什么,请确保开箱即用地支持Unicode。 这样,您不必担心不同的字符集。 在支持unicode时可能要注意的一点是,可以用多种方式编写unicode字符串,因此,根据字符串的标准化方式,比较两个unicode字符串可能会有些棘手。 同样,大写和小写的Unicode字符可能会产生意外的结果。

另请注意,对字符串排序可能已本地化。 ö可能会在英语中排在o后面,但这是瑞典语中字母的最后一个字母,因此应以这种方式进行排序。

左/右/左

例如,如果您使用阿拉伯语或希伯来语,则文字从右向左书写,而不是从左至右书写。 这也意味着通常左对齐的文本应右对齐。 水平对齐的其他内容也应沿相反的方向对齐。 在英语右边有一个按钮,应该将其放在阿拉伯语的左边。