您项目的国际化

时间:2008-08-04 00:08:51

标签: language-agnostic unicode localization internationalization

您是如何在已经参与的实际项目中实施国际化(i18n)的?

在我阅读Joel的着名帖子The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)之后,我对制作软件跨文化感兴趣。但是,除了确保我尽可能使用Unicode字符串之外,我还没有能够在一个真实的项目中利用它。但是将所有字符串设置为Unicode并确保您了解所使用的所有内容的编码只是i18n冰山的一角。

迄今为止我所做的一切都是由一群受控制的美国英语人士使用,或者在推动项目实施之前我们没有时间去做。因此,我正在寻找人们在实际项目中使软件更加本地化的任何提示或战争故事。

11 个答案:

答案 0 :(得分:47)

已经有一段时间了,所以这并不全面。

字符集

Unicode很棒,但你无法忽略其他字符集。 Windows XP(英语)上的默认字符集是Cp1252。在网络上,你不知道浏览器会发送给你什么(虽然希望你的容器能够处理大部分内容)。当您使用的任何实现中存在错误时,不要感到惊讶。当字符集移动到机器之间时,它们可以与文件名进行有趣的交互。

翻译字符串

一般来说,译者不是编码员。如果您将源文件发送给翻译者,他们将破坏它。应将字符串提取到资源文件(例如Java中的属性文件或Visual C ++中的资源DLL)。译者应该获得难以打破的文件和不会让他们破坏的工具。

翻译人员不知道产品中字符串的来源。没有上下文很难翻译字符串。如果您不提供指导,翻译质量将受到影响。

在上下文的主题中,您可能会多次出现相同的字符串“foo”,并认为让UI中的所有实例指向同一资源会更有效。这是一个坏主意。在某些语言中,单词可能对语境非常敏感。

翻译字符串需要花钱。如果您发布新版本的产品,则恢复旧版本是有意义的。有工具从旧资源文件中恢复字符串。

字符串连接和字符串的手动操作应该最小化。使用适用的格式函数。

翻译人员需要能够修改热键。 Ctrl + P 以英文打印;德国人使用 Ctrl + D

如果您的翻译过程需要有人随时手动剪切和粘贴字符串,那么您就会遇到麻烦。

日期,时间,日历,货币,数字格式,时区

这些都可能因国家/地区而异。逗号可用于表示小数位。时间可能是24小时的表示法。不是每个人都使用格里高利历。你也需要明确无误。如果您注意在您的网站上显示美国的MM / DD / YYYY日期和英国的DD / MM / YYYY日期,除非用户知道您已完成日期,否则日期不明确。

特别是货币

类库中提供的Locale函数将为您提供本地货币符号,但您不能只在一个以美元计算价格的值前面加上一英镑(英镑)或欧元符号。

用户界面

布局应该是动态的。不仅字符串在翻译时可能会翻倍,整个UI可能需要反转(希伯来语;阿拉伯语),以便控件从右向左运行。那是在我们到达亚洲之前。

翻译前的测试

  • 使用代码的静态分析来查找问题。至少,利用IDE中内置的工具。 (Eclipse用户可以转到Window> Preferences> Java> Compiler> Errors / Warnings并检查非外化字符串。)
  • 通过模拟翻译进行烟雾测试。解析资源文件并使用伪翻译版本替换字符串并加上长度并插入时髦字符并不困难。您不必说一种语言来使用外国操作系统。现代系统应该允许您以具有翻译字符串和外部语言环境的外国用户身份登录。如果您熟悉您的操作系统,您可以在不知道该语言的单个单词的情况下弄清楚什么是什么。
  • 键盘地图和字符集引用非常有用。
  • 虚拟化在这里非常有用。

非技术问题

有时你必须对文化差异敏感(可能导致进攻或不理解)。您经常看到的一个错误是使用标志作为选择网站语言或地理位置的视觉提示。除非你希望你的软件在全球政治中宣布方面,否则这是一个坏主意。如果你是法国人并且提供英国圣乔治国旗的选项(英国国旗是白色领域的红十字会),这可能会导致许多英语使用者感到困惑 - 假设外语和国家会出现类似的问题。图标需要经过审查才能具有文化相关性。竖起大拇指或绿色勾号是什么意思?语言应该是相对中立的 - 在一个地区以特定的方式对待用户可能是可以接受的,但在另一个地区则被认为是粗鲁的。

<强>资源

C ++和Java程序员可能会发现ICU网站很有用:http://www.icu-project.org/

答案 1 :(得分:15)

一些有趣的事情:

  1. 拥有适用于德语和法语的PHP和MySQL应用程序,但现在需要支持俄语和中文。我认为我将其移至.net,因为PHP的Unicode支持是 - 在我看来 - 并不是很好。当然,使用utf8_de / encode或mbstring-functions来玩杂耍很有趣。几乎和FreddyKrüger晚上拜访你一样有趣......

  2. 意识到某些语言比其他语言更加冗长。德语通常比英语更冗长,并且看到德语版本如何破坏用户界面,因为分配的空间太少并不好玩。有些产品凭借Oblivion的“Schw.Tr.d.Le.En.W”以其创造性的方式获得了一些成名。令人难忘: - )

  3. 玩弄日期格式,哇哦!是的,世界上实际上有些人使用日期格式,其中一天在中间。尝试找出07/02/2008应该是什么意思,因为有些用户可能认为它可能是7月2日,所以很有趣...但话说回过头来,你们在池塘里的人们可能会相信那些放置了中间的一个月:-P,特别是因为在英语中,7月2日听起来比7月2日好很多,有些东西不一定适用于其他语言(例如德语,你永远不会说Juli 2但总是Zweiter Juli)。尽可能使用2008-02-07。很明显,它意味着2月7日它正确排序,但是dd / mm与mm / dd相比可能是一个非常棘手的问题。

  4. Anoter有趣的事,Number formats! 10.000,50 vs 10,000.50 vs. 10 000,50 vs. 10'000,50 ......这是我现在最大的噩梦,不得不支持多元文化的环境但没有任何方法可靠地知道用户的数字格式将使用。

  5. 正式或非正式。在某种语言中,有两种方式可以解决人,一种是正式的方式,一种是非正式的方式。在英语中,你只说“你”,但在德语中你必须在正式的“Sie”和非正式的“Du”之间做出决定,对于法语Tu / Vous来说也是如此。选择正式方式通常是一个安全的选择,但这很容易被忽视。

  6. 日历。在欧洲,本周的第一天是星期一,而在美国则是星期天。日历小部件很不错。在欧洲用户的左侧和周六右侧显示星期日的日历并不是很好,它会让他们感到困惑。

答案 2 :(得分:8)

我为前一个使用.NET的雇主开发了一个项目,我们使用了内置的.resx格式。我们基本上有一个文件,其中包含.resx文件中的所有翻译,然后是具有不同翻译的多个文件。这样做的结果是,您必须非常勤奋地确保应用程序中可见的所有字符串都存储在.resx中,并且无论何时更改,您都必须更新所支持的所有语言。

如果你变得懒惰并且没有通知负责翻译的人,或者你没有通过你的本地化系统嵌入字符串,那么稍后尝试修复它将是一场噩梦。同样,如果本地化是事后的想法,那么就很难实施。最重要的是,如果您没有将所有可见字符串存储在标准位置的外部,则很难找到所有需要本地化的字符串。

另一个注意事项,非常严格地避免直接连接可见字符串,例如

String message = "The " + item + " is on sale!";

相反,你必须使用像

这样的东西
String message = String.Format("The {0} is on sale!", item);

原因是不同的语言经常以不同的方式对单词进行排序,并且直接连接字符串将需要一个新的构建来修复,但是如果您使用了某种类型的字符串替换机制,则可以修改.resx文件(或者您使用的任何本地化文件)用于需要重新排序单词的特定语言。

答案 3 :(得分:5)

今天早上我只是在听Podcast from Scott Hanselman,谈论国际化,特别是真正棘手的事情,比如土耳其语(有四个我的)和泰语。此外,杰夫阿特伍德有一个post

答案 4 :(得分:3)

除了之前的所有提示之外,请记住,这不仅仅是为了改变其他语言中的等价词,特别是对于从右到左书写的非拉丁语字母(韩语,阿拉伯语),因此整个用户界面必须符合,如

  • 第1项
  • 第2项
  • 第3项

必须是

阿拉伯语文本1 -

阿拉伯语文本2 -

阿拉伯文3 -

(反向子弹列表似乎不起作用:P)

如果您的系统必须在用户更改正在使用的语言后以动态方式应用更改,那么这可能是UI噩梦。

另一个非常困难的事情是测试不同的语言,而不仅仅是为了正确的单词,但由于像韩语这样的语言通常会为其字符设置更大的字体类型,这可能会导致语言特定的错误(如按钮上的“保存”文本)比某些语言的按钮本身大。)

答案 5 :(得分:2)

有趣的发现之一:斜体和粗体文字makrup不适用于CJK(中文/日文/韩文)字符。它们变得难以理解。 (好吧,我之前无法真正阅读它们,但特别是粗体只会创建墨迹)

答案 6 :(得分:1)

我认为从事国际化工作的每个人都应该熟悉Common Locale Data Repository,它现在是Unicode的子项目:

Common Locale Data Repository

那些人正在努力为各种i18n问题建立标准资源:货币,地理名称,大量的东西。任何维持自己的核心本地数据的项目,只要这个项目存在,都是非常疯狂的,恕我直言。

答案 7 :(得分:1)

另一个挑战是接受用户的意见。在许多情况下,这可以通过操作系统提供的输入处理来缓解,例如Windows中的IME,它与普通文本小部件透明地工作,但是这种工具不能满足所有可能的需要。

答案 8 :(得分:1)

我建议使用类似99translations.com的内容来维护您的翻译。否则,您将无法用各种语言告诉您哪些翻译是最新的。

答案 9 :(得分:0)

没有人提到过的一件事就是字符串中有一些警告部分,如“单位将在5天内到达”或“周一有事情发生”。其中5和星期一将根据州改变。将它们分成两部分并将它们连接起来并不是一个好主意。只有一个不同的部分和良好的文档,你可以使用它,有两个不同的部分,将有一些语言,优先改变它们的顺序。

答案 10 :(得分:0)

我使用的一个网站有一个所有者称之为“维基+机器翻译”的翻译方法。这是一个基于社区的网站,因此显然不同于公司的需求。

http://blog.bookmooch.com/2007/09/23/how-bookmooch-does-its-translations/