我读过乔尔关于Unicode的文章,我觉得我至少从字符集的角度对国际化有了基本的把握。除了阅读this question之外,我还在设计考虑方面做了一些关于国际化的研究,但是我不禁怀疑还有很多我不做的事情。知道或不知道要问。
我学到的一些东西:
我在哪里:
我想了解更多信息:
编辑:我添加了赏金,因为我希望从经验中获得更多真实的例子。
答案 0 :(得分:56)
答案 1 :(得分:11)
当我们处理Dreamfall和柯南时代的i18n / l10n问题时,我们遇到了一些值得记住的问题。其中一些我们解决了,一些是为我们解决的,一些我们解决了。有些我们从未解决过......
确保所有工具和所有代码都支持您要使用的所有字符集,并在项目过程中再次检查该假设两次,并确保更多次。
< / LI>确保使用支持您要使用的所有语言的字体。声称为unicode的大多数字体只是unicode,因为它拥有的字符位于正确的代码点。这并不意味着它对所有代码点都有可用的字符。
文本换行不仅仅是在空格处完成,因为有些语言不会使用空间来分隔单词(中文会浮现在脑海中)。确保文本换行例程处理文本时没有任何空格。
在容易的情况下正确处理复数是很棘手的,并且在困难的情况下很难处理。确保您对将要使用的语言有足够的了解,以便能够编写代码来正确处理复数问题。请记住,英语(和其他“西方”语言是容易的。
永远不要破坏句子并使用它们构建字符串以适应变量,因为变量可能以不同的语言放在句子的其他位置。使用占位符。
请记住,对于某些语言,占位符的值可能会更改如何编写句子。语法很难。确保你有一个处理它的计划。 (具体来说,请确保您有办法根据性别,时间等对您在占位符中使用的值进行分类。)
答案 2 :(得分:10)
- 我的菜单和各种列表 应用程序按字母顺序排序 为每种语言更容易阅读。
列表应该排序,菜单不应该排序。请记住,给定用户可能希望以多种语言使用您的应用程序,他仍然应该在同一个地方的任何地方找到它。
与快捷方式相同,如果您有,不翻译。
另外,请记住,国际化和翻译是两个截然不同的事情,分别管理它们。
答案 3 :(得分:8)
我想发表以下评论 - 这些评论来自一些公司指南,其中第1类产品在 31 不同的语言环境中进行翻译。遵循这些指导方针为我们(我们的开发团队而不是整个公司)提供了最高的翻译效率。
不要尝试重用错误消息的片段。例如,不要认为这是因为您有两个错误"You selected the wrong menu item"
和"That menu item is not yet available"
,您可以将"menu item"
提取到一个单独的项目中并在两个地方使用它。 所有消息应该是自包含的,因为它们的翻译可能会根据上下文而改变。
使用专业翻译了解技术。如果你去接近像BabelFish这样的服务,你将得到你应得的一切。例如,"Microsoft Windows"
在地球上的任何地方都是"Microsoft Windows"
,在德国不会变为"Microsoft Fenster"
。
尽量不要在 中嵌入变量(例如"The %1 has failed"
其中%1
动态更改),因为职位和性别可能会发生变化:{{ 1}}与"La table est rubbish"
或"L'Homme est drunk"
vs "The red table"
。最好使用附加参数的通用名词:"La table rouge"
。
只翻译用户期望看到的内容。日志文件中的日志消息(只有您将使用)应该是英文(或您的母语),而不是翻译对于像斯瓦希里语那样你无法读懂的东西。
菜单应按功能排序,而不是按整理顺序排序。
可翻译单元应 external 存储到代码中并在运行时加载。这使得翻译成为一个只关闭外部文件的问题,而不是试图将更改转变为代码中间。这也使得将来更容易添加其他语言。
现在已经够了。最好在你们都入睡之前停下来: - )
答案 4 :(得分:6)
关于数字的事情:在英语中,据我所知,你只使用1和1的复数和2或更多的复数。喜欢:“你有1条消息”; “2条消息”; “3 ...消息”。在俄语中,这些事情变得更加复杂。你使用单数为1,21,31,41 ... 101,121(因此,对于以1结尾的所有内容,除非它以11结尾)。然后你使用奇异的格式为2,3,4; 22,23,24; 32,33,34 ...... 102,103,104; 122,123,124。在所有其他情况下,你使用复数格式。
实施起来并不难。 很难实现的是实现一些知道如何处理任何先验未知语言的东西: - )
这只是数字: - )
答案 5 :(得分:6)
到目前为止,我还没有很多内容可以添加到最佳答案中,但这里有一些需要考虑和检查的事情。
好的,我还有更多的话要说...
答案 6 :(得分:5)
我学到了很多东西:如果你有几个需要翻译的文件,请在名称中加一个额外的标签,以便以后你可以在整个文件夹中搜索该标签。
e.g。而不是命名文件'sample-database.txt'命名英文版'sample-database-loc-en.txt',意大利语版本'sample-database-loc-it.txt
答案 7 :(得分:4)
我在StackOverflow中的第一个答案,如果说有些愚蠢,请原谅。
根据我的经验:
答案 8 :(得分:3)
答案 9 :(得分:1)
是的,这是大量主题。正确的做法是非常多的工作。
在我的程序中,我为每段文本使用一个整数键,并根据语言根据需要在文件中查找。代码中的任何地方都没有文字字符串,只有键。我用C ++中的“枚举”来定义它们,所以我实际上并没有输入数字。当我添加更多枚举时,我编写了一个实用程序来同步各种语言文件,并且翻译人员填写了空白。
每个键还有一个相关的工具提示,图像,键盘快捷键等。
至于时间和日期......再次,这比你想象的要复杂得多,但PHP不会为你处理这个问题吗? (我不知道,我是C ++家伙......)
答案 10 :(得分:1)
PHP在内部将字符串表示为字节流,并假设iso-8859-1,对于编码很重要的情况。在大多数情况下,你可以在整个地方使用UTF-8,你会没事的。一个问题是,如果您的网站从其用户那里获得输入,那么您永远无法100%确定他们是否以正确的编码提交内容。您可能希望使用mb_detect_encoding
来验证输入,或使用带有“异国情调”字符的隐藏字段进行验证。
请注意,PHP中与字符串相关的所有函数都以字符为基础,假设character = byte。这意味着您通常不能信任字符串函数。有关详细信息,请查看this page。
PHP的另一个好资源是Nick Nettleton's cheatsheet。
与字符集/编码密切相关的主题是collation。您需要使用排序规则来匹配您正在使用的语言/文化。至少在MySql中(可能在其他RDBMS中),您可以在不同级别指定排序规则,例如每个数据库,每个表,每列甚至在查询本身。