[译] 软件本地化中的 10 个常见错误

简介: [译] 软件本地化中的 10 个常见错误

原文链接: mp.weixin.qq.com

原文:https://phrase.com/blog/posts/10-common-mistakes-in-software-localization/

国际化、本地化的概念在 马什么梅?I什么N?浅谈 web 前端开发中的国际化 一文中做过详细的介绍。如何避免误用本地化,可以注意以下 10 点:

1. 直接硬编码文字

将文字直接嵌入代码将极大地拖慢软件本地化的进度,翻译者不得不阅读代码以决定哪些段落需要翻译。同时,这将使得本地化代价高昂且翻译的一致性难以保证。

  • 使用分离的资源文件
  • 应该谨慎地选择字段的 key,该键名总是应该描述字段在接口中的角色(标题、按钮文字,等等)
  • 同时应该确保在增加新字段时不要和既有的字段重名。

以 Python 为例,在 .po 资源文件中保存了每种 locale 的翻译:


# ./locales/en_US/LC_MESSAGES/messages.pomsgid "button_order"msgstr "Order Now" msgid "login_message"msgstr "Welcome back!"


# ./locales/de_DE/LC_MESSAGES/messages.pomsgid "button_order"msgstr "Jetzt bestellen" msgid "login_message"msgstr "Willkommen zurück!""

使用 gettext 函数完成翻译:


import gettextde_DE = gettext.translation('messages', localedir='locales', languages=['de_DE'])de_DE.install()print(gettext("login_message"))# Willkommen zurück!print(gettext("button_order"))# Jetzt bestellen

2. 基于特定语言的像素尺寸 UI 布局

不同的语言文字有着迥异的长度和密度。

如果对此一无所知,就可能在本地化过程中造成没有足够的布局空间,文字可能会超出控件,从而不得不在翻译后重新调整设计。

  • 通常在设计时可以流出 50% 的余量以供不同 locale 的字符串伸缩
  • 也可以使用布局管理器,根据 runtime 动态调整布局
  • 还可以在不同 locale 的资源文件中储存指定语言对应的尺寸

3. 仅指定了语言而忽略了国家

各个国家有各个国家的国歌,而各个国家的国歌可能是由同一种语言演唱的。

有时同一种语言会根据使用它的国家不同而有所区别,因为不同的地域会造成口语和拼写的微妙差别(如 en-GB 和 en-US)。仅指定了语言,而不指定国家代码,会让本地化变得困难。

所以总是应该使用完整的 locale,比如:


# ./locales/en_US/LC_MESSAGES/messages.pomsgid "login_message"msgstr "Hi there!"
# ./locales/en_AU/LC_MESSAGES/messages.pomsgid "login_message"msgstr "G'Day Mate!"

4. 拼接字符串

有些开发者喜欢将字符串拼接,虽然字段的常量部分是从资源文件取出的,但整个句子的单词顺序和措辞结构还是被按某种特定语言硬编码了。

在这个反面例子中,仅仅是在一个固定的结构中将句子打散为小块:


msgid "welcome_back_msg_start"msgstr "Hey " msgid "welcome_back_msg_end"msgstr ", welcome back!"
print(gettext('welcome_back_msg_start') + username + gettext('welcome_back_msg_end'))# Hey John, welcome back!
))# Hey John, welcome back!

一方面,这种文字游戏有时很难甚至无法被翻译,也会让翻译者对你的胡闹心怀怨恨,因为没有人喜欢因为拼接过多带来的猜字游戏;另一方面,同一句话的前后结构可能完全不同,这使得翻译完全无法进行。

合理的做法是对整句进行本地化,并使用占位符传入变量:


msgid "welcome_back_msg"msgstr "Hey %(username)s, welcome back!"


print(gettext('welcome_back_msg', username="John"))# Hey John, welcome back!

5. 错误的编码和缺少 Unicode 支持

当你使用了一个错误的或无法处理 Unicode 的字符编码时,翻译工作也将失败。

编程语言经常使用系统默认的编码存储文件,当你的服务器是英文环境而你的用户以中文浏览器访问时,显示的字符可能就会出错。

总是应该使用 UTF-8

因此,另一个本地化的最佳实践就是一直用 UTF-8。这几乎总是最佳选择,因为它通过使用跨浏览器和服务器的标准化编码解决了问题。所以,理想情况下,你的技术栈中间的每一层都应该使用 UTF-8:无论是 HTML、HTTP 服务器、数据库以及你的应用本身莫不如此。例如:

<meta http-equiv="content-type" content="text/html; charset=utf-8">


Content-Type: text/html; charset=utf-8


# MySQLCREATE DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;

6. 硬编码数字、单位、日期和时间

软件国际化并不是仅仅翻译单词 -- 这关乎整个文化的适配。

因为不同语言和不同国家的差异,硬编码日期、时间或货币格式会在翻译过程中带来麻烦。26.04.2015 或  04.26.201414:00 或是  2 p.m.1,000 英里 还是  1,609 公里

使用专业的工具库来处理国际化中的数字、货币、单位、日期和时间

比如使用了 Python babel 库的一个例子:



from babel.dates import format_datetimefrom babel.numbers import format_currencyprint(format_datetime(locale='ru_RU'))# 26 июля 2013 г., 15:48:18print(format_currency(10.50, 'EUR', locale='de_DE'))# 10,50 €print(format_currency(10.50, 'USD', locale='en_AU'))# US$10.50

7. 忽略竖版和从右到左阅读

阿拉伯文、希伯来文和一些其他语言是从右到左书写的;一些东亚语言比如某些中文文本,或传统蒙古文,也会让你大开眼界 -- 它们有着竖版书写的悠长历史。如果有必要服务于足够多的地区,就要准备好应对上述这些排版方式。

从右到左可能还能通过反向字符串解决;但当字符串竖版排练时,并非简单地旋转 90 度。比较正确的方式是基于 locale 在资源文件中包含一个指示方向的字符串,并根据其调用不同的 CSS 样式。例如:


h1 {    direction: rtl;}


<h1>  Read me from right-to-left.</h1>

8. 缺少上下文造成的困惑和歧义

当字符串包含变量,且被用在一个特定上下文或使用了有歧义的措辞时,你的翻译团队就不好过了。翻译者通常基于无上下文格式的文件和字符串工作。所以,他们难以感知单个术语“联系”是个动词还是个按钮名称。

  • 尽可能在资源文件中使用可读性强的 key,比如 toContact 或 contactButton
  • 通过 key 还难以说明的,应该在本地化文件中添加注释和说明
  • 如果基于 Excel 工作表管理翻译字段,甚至可以添加屏幕截图以帮助理解

9. 图片中包含文字

合理运用图片可以有效降低本地化成本,因为易于理解的图片减少了描述清楚一件事所需的文本数量。但有时候包含文字的图片会让翻译者抓狂,甚至会让你为翻译付出的金钱成本倍增。

  • 尽可能分离图片和文字,用独立的文本组件去实现效果
  • 也要注意跨文化的区别,不是所有图像和符号在每种文化中表达的意思都相同

10. 事到临头才不得不本地化

还有一种小的错误可能会妨碍软件在其他语言下正常工作。如果源内容本身存在错误,可能会导致翻译后的其他若干种语言连带出现同样或更严重的错误,而修复这些不同的语言则会花费数倍时间。

  • 尽早地、频繁地测试本地化工作,防止错误越积越多
  • 作为开发者,可以引入自动化测试工具并针对本地化和编码进行测试

总结

总之,基于源语言开发软件时,就应该时刻保持本地化意识。如果你能有效避免上述 10 种常见陷阱并遵守文中提到的最佳实践,你的应用就能顺利本地化并能随时拥抱国际市场。

扩展阅读:马什么梅?I什么N?浅谈 web 前端开发中的国际化

相关文章
|
开发者
【软件开发规范三】【软件版本命名规范】
软件版本号有四部分组成,第一部分为主版本号,第二部分为次版本号,第三部分为修订版,第四部分为日期版本号加希腊字母版本号,希腊字母版本号共有五种,分别为base、alpha、beta、RC、release
【软件开发规范三】【软件版本命名规范】
|
4月前
|
移动开发 缓存 开发框架
ReactNative 常见问题及处理办法(加固混淆)
ReactNative 常见问题及处理办法(加固混淆)
54 0
|
IDE 区块链 开发工具
【Remix】本地化部署流程
【Remix】本地化部署流程
272 0
|
Python
常见错误解决方案汇总
常见错误解决方案汇总
80 0
|
安全 数据安全/隐私保护
定制开发混币器软件需要注意事项
定制开发混币器软件需要注意事项
|
安全 前端开发 Shell
MobSF移动安全扫描平台本地化部署与简单汉化
MobSF移动安全扫描平台本地化部署与简单汉化
MobSF移动安全扫描平台本地化部署与简单汉化
|
安全 Docker Windows
5个要点,告诉您为何要将旧版 Windows 应用程序进行现代化改造
在短短一年多的时间里,Microsoft 对 Windows Server 2008 的支持即将结束。如果没有做出适当的规划,连锁反应可能会影响您的业务。维护成本将急剧上升,而安全性和合规性风险将在没有定期补丁的情况下增加。
2566 0
|
存储 安全 Android开发
安卓应用安全指南 4.6.2 处理文件 规则书
安卓应用安全指南 4.6.2 处理文件 规则书 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 遵循以下规则: 4.6.2.1 文件原则上必须创建为私有(必需) 如“4.6 处理文件”和“4.6.1.3 使用公共读/写文件”所述,无论要存储的信息的内容如何,原则上都应该将文件设置为私有。
1204 0