大量标记文本的国际化最佳实践是什么?

5
我正在开发一个网络项目,希望有一天能够提供多种语言版本(我说“希望”是因为虽然我们今天只计划了英文网站,但我的公司的其他产品都是多语言的,我希望我们足够成功需要这个功能)。
我了解到最佳实践(我使用的是Java、Spring MVC和Velocity),是将用户所见到的所有文本放在外部文件中,并通过名称在UI文件中引用,例如:
#in messages_en.properties:
welcome.header = Welcome to AppName!

#in the markup
<title>#springMessage("welcome.header")</title>

但是,由于我以前从未在项目中经历过这个过程,我很好奇当您有一些 UI 段落需要大量标记时,最好的处理方式是什么,例如:
<p>We are excited to announce that Company1 has been acquired by
<a href="http://www.companydivisionx.com" class="boldLink">Division X</a>,
a fast-growing division of <a href="http://www.company2.com" class="boldLink">Company 2</a>, Inc. 
(Nasdaq: <a href="http://finance.google.com/finance?q=blah" class="boldLink">BLAH</a>), based in...

我能想到的一个选项是将此“低级”标记存储在 messages.properties 中的消息本身中,但这似乎是最糟糕的选择。
我能想到的其他选项包括:
- 将每个非标记内部片段存储在 messages.properties 中,例如 acquisitionAnnounce1、acquisitionAnnounce2、acquisitionAnnounce3。不过这似乎非常费力。 - 将此消息分解为更多可重用组件,例如 Company1.name、Company2.name、Company2.ticker 等,因为每个组件可能在许多其他消息中被重复使用。这可能占据了特定消息中 80% 的单词。
处理包含此类标记的国际化文本的最佳实践是什么?你是否必须咬紧牙关,忍受分解每个文本块的痛苦?从你个人处理过的任何项目中,哪种方法是最好的解决方案?
4个回答

7
正如其他人所说,请勿将字符串拆分为片段。这样做会给翻译带来麻烦,因为他们必须迫使自己的语言语法符合您无意中创建的特定规则。通常,如果在不同上下文中重复使用某些片段,可能无法提供语法正确的翻译。
请勿删除标记。
请不要假设专业翻译人员使用记事本 :) 计算机辅助翻译(CAT)工具,例如Trados套件,非常了解标记。如果标记是HTML而不是某种自定义XML格式,则无需进行任何特殊准备。 Trados将保护标记免受意外修改,同时仍然允许必要的更改。请注意,标记的某些元素通常需要本地化,例如alt文本或某些查询字符串,因此仅剥离所有标记是行不通的。
最好的选择是,除非您正在从零开始设计个人项目,否则请考虑联系本地化供应商。本地化就像网页设计一样是一项服务。一个称职的供应商将帮助您选择适合您的项目的最佳解决方案/格式,并指导您准备源材料并整合本地化结果。当然,他们和他们的翻译人员将拥有所有必要的工具。 (完全揭露:我是一名翻译/本地化专家。不要分割字符串 :)

在这种策略中,当您需要更改重复出现在数十个语言文件中的标记时,您会怎么做?逐个进行编辑吗?听起来您在混淆问题 - 国际化消息和 UI 中的 HTML/标记选择。 - matt b
根据我的实际经验,标记的更改通常会导致本地化文本的更改。由于标记的微小更改,我无法计算需要发送翻译的项目数量。标记中的语义更改可能需要更新翻译;(续) - Marek Jedliński
通常情况下,翻译本身不会改变。请注意,如果您与专业的本地化供应商合作,使用适当的工具,这些更新的费用将是最小的,因为计算机辅助翻译工具将在此处完成大部分工作,并且可翻译的字数将是最少的。 - Marek Jedliński
任何特定情况下的问题是,标记的更改是否需要更新翻译。 - Marek Jedliński

7
通常,如果您使用诸如SitemeshVelocity等模板引擎,您可以更有效地将这些较小的HTML构建块作为子模板进行管理。
通过这样做,您可以逐步将纯国际化字符串分组,并使它们与那些标记子模板相关联。在使用跨越同一区域设置以及多个区域设置的应用程序的模板进行此类工作时,我们从未在消息包中放置标记。
我建议一个关键的良好实践是不惜一切代价避免在消息属性文件中放置标记(即使是低级别的标记)!这可能会引发灾难,不能忽视。破坏并正确地分解事物比管理许多具有散布的HTML标记的文件要容易得多。重要的是,您可以将标记视为整体块,并且到处散布会使日常开发变得繁琐,因为:
  • 您将失去IDE颜色突出显示和语法验证
  • 当设计/标记过滤下来时,很容易错过一个区域设置文件或另一个区域设置文件
将事物分解(到一个现实的点,例如逻辑句子结构,但没有更细的结构)有些艰苦,但值得努力。
关于字符串分解粒度,这是我们所做的示例:
    comment.atom-details=Subscribe To Comments
    comment.username-mandatory=You must supply your name
    comment.useremail-mandatory=You must supply your email address 
    comment.email.notification=Dear {0}, the comment thread you are watching has been updated.
    comment.feed.title=Comments on {0}
    comment.feed.title.default=Comments
    comment.feed.entry.title=Comment on {0} at {1,date,medium} {2,time,HH:mm} by {3}


    comment.atom-details=Suscribir a Comentarios
    comment.username-mandatory=Debes indicar tu nombre
    comment.useremail-mandatory=Debes indicar tu direcci\u00f3n de correo electr\u00f3nico
    comment.email.notification=La conversaci\u00f3n que estas viendo ha sido actualizada
    comment.feed.title=Comentarios sobre {0}
    comment.feed.title.default=Comentarios
    comment.feed.entry.title=Comentarios sobre {0} a {1,date,medium} {2,time,HH:mm} por {3}

所以,在消息包中进行字符串替换可以做一些有趣的事情,这也可以帮助您保留其逻辑意义,但允许您在句子中间进行操作。


1
我不确定管理这些较小的构建块作为子模板的好处是否完全理解。所有这些来自子模板的字符串不都会进入同一个messages.properties文件吗? - matt b
没错,你仍然会有很多字符串 - 我想我的观点是你无法真正避免它。一个防止高数量消息字符串的策略是在数据库中放置消息包字符串,在合适的地方这样做。 - j pimmel
看一下我们的消息包,我们有1230行字符串。这些都是纯粹的网站文本,无法从数据库中获取。 - j pimmel

3
首先,不要将字符串拆分。这会使本地化人员难以翻译文本,因为他们无法看到整个字符串以进行翻译。
我建议在链接周围使用占位符:
<a href="%link1%" class="%link1class%">Division X</a>
当我将网站本地化成30种语言时,我就是这样做的。虽然不完美,但效果还不错。
我认为从字符串中删除所有标记可能并不容易,你需要一种方法来插入URL和任何额外的标记。

2

避免分割字符串。这不仅会给翻译带来困难,而且可能会在目标语言中犯语法错误。

虽然占位符在许多方面都很有用,但我不建议在URL中使用占位符。这样可以根据不同的区域设置自定义URL。毕竟,当他们的区域设置为阿根廷西班牙语时,没有必要将他们发送到英语页面!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接