java - 国际化带有大量标记的文本的最佳实践?

标签 java templates internationalization markup

我正在开发一个 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 中,例如acquisitionAnnounce1acquisitionAnnounce2acquisitionAnnounce3。不过,这似乎非常乏味。
  • 将此消息分解为更多可重用的组件,例如 Company1.nameCompany2.nameCompany2.ticker 等,作为这些中的每一个都可能在许多其他消息中重复使用。这可能占该特定消息中 80% 的单词。

是否有任何最佳实践来处理像这样带有大量标记的国际化文本?难道你就只能一口咬下去,承受拆散每一条文字的痛苦吗?从您亲自处理的任何项目中,最好的解决方案是什么?

最佳答案

通常,如果您使用模板引擎,例如 SitemeshVelocity您可以更有效地将这些较小的 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/

相关文章:

javascript - 如何找到 document.DocumentElement.Client 的坐标

java - 如何将 POJO 转换为保留类型的映射?

java - 如何从命令行调用嵌入式 jre 以运行 java 应用程序

python - jinja2 模板中的路径解析

javascript - JS 替换对象中的占位符值

ruby-on-rails - rails : Setting locale appropriately to IP address

java - 如何在不使用 hasNextInt() Java 的情况下从文本文件读取整数

c++ - 如何改进c风格的函数回调系统?

scala - 如何在不重新启动的情况下重新加载 messages.en?

javascript - 如何在 prime ui 或 jquery datatable "columns"选项的 headerText 中包含 HTML 代码?