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

在我阅读了Joel的着名文章之后,我开始兴趣制作软件跨文化, 绝对最低限,每个软件开发人员绝对必须知道Unicode和字符集(没有借口!) 但是,除了确保我尽可能使用Unicode字符串之外,我还没有能够在一个真实的项目中利用它。 但是将所有字符串设置为Unicode并确保您了解所使用的所有内容的编码只是i18n冰山的一角。

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

===============>>#1 票数: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/

===============>>#2 票数:15

一些有趣的事情:

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

  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有趣的东西, 数字格式 10.000,50 vs 10,000.50 vs. 10 000,50 vs. 10'000,50 ......这是我现在最大的噩梦,不得不支持多元文化的环境但没有任何方法可靠地知道用户的数字格式将使用。

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

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

===============>>#3 票数:8

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

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

另外一点,非常严格地避免直接连接可见字符串,例如

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

相反,你必须使用类似的东西

String message = String.Format("The {0} is on sale!", item);

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

===============>>#4 票数:5

我今天早上正在听斯科特汉塞尔曼的一个播客 ,他在那里谈论国际化,尤其是真正棘手的事情,比如土耳其语(有四个我的)和泰语。 此外,杰夫阿特伍德有一个帖子

===============>>#5 票数:3

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

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

必须是

阿拉伯语文本1 -

阿拉伯语文本2 -

阿拉伯文3 -

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

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

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

===============>>#6 票数:2

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

===============>>#7 票数:1

我建议使用像99translations.com这样的东西来维护你的翻译。 否则,您将无法用各种语言告诉您哪些翻译是最新的。

===============>>#8 票数:1

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

===============>>#9 票数:1

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

公共区域设置数据存储库

那些人正在努力为各种i18n问题建立一个标准资源:货币,地理名称,大量的东西。 任何保持自己的核心本地数据的项目,鉴于该项目存在,是相当疯狂的,恕我直言。

===============>>#10 票数:0

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

===============>>#11 票数:0

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

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

  ask by John Downey translate from so

未解决问题?本站智能推荐:

6回复

MFC的国际化

最后(经过多年的推迟)是时候用英语以外的其他几种语言本地化我的应用程序了。 第一个挑战是将集成设计到我的C ++ / MFC应用程序中,该应用程序具有许多对话框和无数字符串。 我遇到了两种可能的替代实现: 将本地化资源文件编译并部署为DLL 使用本地化版本提取并替换所有
2回复

本地化消息的模块化定制方法?

程序的自定义有很多层次。 当然,首先要通过创建i18n消息使它说您的语言 ,其中gettext和xgettext之类的工具可以发挥出色的作用。 当您需要修改某些消息的含义以适合您的项目目的时,就会出现另一个问题。 问题是 :除了样板转换之外,是否还可以将定制消息保留在单独的文件
10回复

本地化应用程序的前5种语言是什么? [关闭]

我想知道,根据经验(和原始人口数据),这是应用程序的5个“最佳”本地化(在这种情况下是iPhone应用程序)。 通过本地化注意我不仅仅指语言,还包括日期和货币格式等其他习惯。 我的猜测列表如下 英语 法国 西班牙语 德语 日本 您的列表如
5回复

包含非ASCII国际语言字符的文件名

有没有人有过生成文件名包含非ascii国际语言字符的文件的经验? 这样做是一件容易的事,还是充满危险? 日语/中文网络用户是否希望使用此功能? 文件扩展名也应该是国际语言字符吗? 信息:我们目前在我们的网站上支持多语言,但是我们的文件名始终为ASCII。 我们在.NET
3回复

多字节语言的网站本地化

我已开始为具有大量硬编码文本的中型网站编写多语言功能。 由于应该将网站翻译成日文和韩文(多字节字符集),因此我正在考虑以下事项: 如果我使用字符串外部化,日语或韩语的字符串是否需要在语言环境文件中采用unicode格式(即台北而不是台北作为
3回复

.NET本地化:日文字符显示为正方形

好的,我没有做太多.Net编程,但我确实有一个我维护的,所以答案可能是显而易见的。 建立: 安装了所有语言包的Windows 7旗舰版 Visual Studio 2008 Winforms VB.Net项目。 我正在本地化这个项目,当我制作日文版的表格时,字符显
1回复

如何使用不属于正式Django项目的语言强制Django国际化?

我正在尝试使用一种不属于Django发行版的语言来激活Django翻译。 从现在起,我很乐意使用该语言进行Django翻译,但是由于我现在需要它,所以我想知道是否有可能激活某种语言,即使管理面板和Django消息尚未发布也是如此。翻译(因为我不需要)。 除非绝对必要,否则我不想摆弄dja
1回复

车把国际化

我正在尝试使使用Express和Handlebars的应用程序国际化。 是否可以获取Handlebars局部片段(片段)来加载和呈现本地化资源文件? 注意我已经读过这个问题: express3-handlebars和18next-node-基于页面的国际化吗? 。 这是我的目录结
1回复

android中的国际化

Android开发人员网站针对android中的国际化提供了完整的文档。 但是直到我对此有疑问。 某些语言从左到右,从上到下从那里开始。 某些语言从右到左,从下到上开始。 一些语言是垂直移动的,即从上到下一行再从上到下第二行,依此类推。 问题:1.如何支持这些语言?
1回复

数据库级国际化

有人能指出一些解决数据库级任务国际化的模式吗? 最简单的方法是为每个文本列添加每种语言的文本列,但这有点臭 - 我真的希望能够动态添加支持的语言。 我要解决的解决方案是保存在模型中的一种主要语言和一个字典实体,可以查询翻译和保存的翻译。 我想要的只是听取其他人的意见。