我正在开发一个 Web 项目,该项目(希望)有一天会以多种语言提供(我说“希望”是因为虽然我们今天只计划了一个英语网站,但我公司的其他产品是多语言的,而且我我希望我们足够成功,也需要它)。
我知道最佳实践(我在这里使用 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% 的单词。
是否有任何最佳实践来处理像这样带有大量标记的国际化文本?难道你就只能一口咬下去,承受拆散每一条文字的痛苦吗?从您亲自处理的任何项目中,最好的解决方案是什么?
最佳答案
通常,如果您使用模板引擎,例如 Sitemesh或 Velocity您可以更有效地将这些较小的 HTML 构建 block 作为子模板进行管理。
通过这样做,您可以逐渐将纯国际化的字符串归结为组,并使它们与那些标记子模板相关。在使用跨越同一语言环境和多个语言环境的应用程序模板完成此类工作后,我们从未在我们的消息包中放置标记。
我建议一个关键的好做法是避免在消息属性文件中放置标记(即使是在您放置的低级别)不惜一切代价! 这释放 hell 的潜力不容忽视 - 咬紧牙关并正确分解,比必须管理许多带有分散 HTML 标记的文件要轻松得多。重要的是,您可以将标记可视化为整体 block 并散布在各处,这会使日常开发成为一件苦差事,因为:
- 您将失去 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}
因此,您可以通过如何在消息包中进行字符串替换来做一些有趣的事情,这也可以帮助您保留其逻辑含义,但允许您在句子中间对其进行操作。
关于java - 国际化带有大量标记的文本的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/516453/