如何从属性文件中重构HTML标记?

时间:2020-03-05 18:40:04  来源:igfitidea点击:

我最近继承了一个国际化且文本繁重的Struts 1.1 Web应用程序。许多JSP文件如下所示:

<p>
    <bean:message key="alert" />
</p>

属性文件如下所示:

messages.properties
alert=Please update your <a href="/address.do">address</a> and <a href="/contact.do">contact information</a>.

以及其他N种语言(messages_fr.properties等)的适当翻译。

问题:

  • 违反DRY-我对Struts操作URL的引用数为N,而不是1,这使得重构操作URL容易出错。
  • 混杂的担忧-我的应用程序的标记现在不仅仅包含在我的JSP文件中,这使得Web专家很难调整标记(使用CSS等)。
  • 翻译后标记-每当我收到新翻译的文字时,都必须决定使用<a> ... </a>标记括起来的内容。英文很容易,但对于不熟悉的语言则不太容易。

我考虑过在邮件文件中添加占位符,例如:

alert=Please update your {0} and {1}.

但是话说"地址"和"联系信息"一词需要以某种方式进行本地化,用标记包装,然后传递给我的消息标签,而我看不到一种简单的方法。

我该怎么做才能改善这一点?

解决方案

回答

可能:

#
alert=Please update your {0}address{1} and {2}contact information{3}.

回答

我想到的一种方法是,我们可以将转换后的替换参数(即"地址"和"联系信息")存储在单独的属性文件中,每个区域设置一个。然后让Action类(或者可能是一些帮助器类)从正确的ResourceBundle中为当前语言环境查找值,并将其传递给message标记。

回答

The message message tag API allows
  only 5 parametric arguments

啊!我责怪我对Struts API的完全无知。

引用手册:

Some of the features in this taglib
  are also available in the JavaServer
  Pages Standard Tag Library (JSTL). The
  Struts team encourages the use of the
  standard tags over the Struts specific
  tags when possible.

我们可能可以使用http://java.sun.com/jsp/jstl/fmt标签库执行此操作。

<fmt:bundle basename="messages">
    <fmt:message key="alert">
        <fmt:param value='<a href="/">' />
        <fmt:param value="</a>" />
        <fmt:param value='<a href="/">' />
        <fmt:param value="</a>" />
    </fmt:message>
</fmt:bundle>

不利的一面是这不是有效的XML,将值提取为变量会涉及更多的间接,查找和冗长性。这不是一个好的解决方案。

我不了解Struts,但是如果它类似于JavaServer Faces(相同的架构师),那么可能支持配置替换控件。我或者将现有控件替换为更灵活的控件,或者添加一个新控件。

Anytime I receive newly-translated
  text, I must decide what to surround
  with the <a>...</a> markup.

我们绝对不应该这样做,我认为这是我们翻译过程中的错误(我是一名本地化工程师和本地化工具的开发人员)。 " {0}"字符应包含在发送给翻译器的文件中。本地化指南应说明字符串的上下文和任何变量的含义。

我们可以以编程方式验证返回的属性束。特定于字符串的正则表达式可以解决问题。在翻译过程中,"地址"和"联系信息"将交换顺序并非没有可能。

最简单的解决方案是重新设计要呈现的消息:

<a href="/address.do">Please update your address.</a>
<a href="/contact.do">Please update your contact information.</a>

我接受这可能并非在所有情况下都是解决方案,并且可能会让UI设计师不知所措。

回答

Avoid creating links within long
  blocks of text. Prefer shorter text
  that can act as a logically complete
  and independent link.

通常,它将导致较少的问题。有时,我们必须妥协UI设计以适应本地化。有时我们需要妥协本地化流程以适应UI。

开发人员在任何时候手动操作翻译后字符串都是潜在的昂贵错误的来源。剪切/粘贴或者字符串编辑可能会导致字符损坏,字符串放置错误等。翻译缺陷需要外部参与方进行修复,这涉及成本和时间。

考虑一下,这样的事情可能不太难看:

<p>Please update your address and contact information.
<br />
<a href="/address.do">update address</a>
<br />
<a href="/contact.do">update contact information</a></p>

...但是我不是UI设计师。