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

时间:2008-08-16 16:42:50

标签: java jsp internationalization struts

我最近继承了一个国际化且文本密集的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等)进行适当的翻译。

问题:

  1. DRY违规行为 - 我对我的Struts操作网址有N个引用而不是1,这使得重构操作网址容易出错。
  2. 混合关注 - 我的应用程序的标记现在不仅仅是我的JSP文件,这使得网络专家很难调整标记(使用CSS等)
  3. 翻译后标记 - 无论何时收到新翻译的文字,我都必须决定<a>...</a>标记的内容。容易学习英语,但对于不熟悉的语言则不那么容易。
  4. 我考虑在消息文件中添加占位符,例如:

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

    然后单词“地址”和“联系信息”会以某种方式进行本地化,包含标记,并传递给我的消息标记 - 我看不到一种简单的方法。

    我可以做些什么来改善这个?

4 个答案:

答案 0 :(得分:2)

  

避免在长时间内创建链接   文本块。喜欢较短的文字   这可以充当逻辑完整的   和独立的链接。

一般来说,它会减少问题。有时您必须妥协您的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设计师。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

  

消息消息标记API允许   只有5个参数参数

啊!我责备我完全不了解Struts API。

引用manual

  

此taglib中的一些功能   也可以在JavaServer中使用   页面标准标记库(JSTL)。该   Struts团队鼓励使用   特定于Struts的标准标签   标签尽可能。

您可以使用 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(同一架构师)那样,那么可能支持配置替换控件。我会用更灵活的控件替换现有控件或添加新控件。

  

我收到新翻译的任何时候   文字,我必须决定要包围什么   使用<a>...</a>标记。

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

您可以在返回时以编程方式验证属性包。字符串特定的正则表达式可能会成功。在翻译过程中,“地址”和“联系信息”会交换顺序,这超出了可能性的范围。

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

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

我接受这可能不是所有情况下的解决方案,并且可能让您的UI设计师唾手可得。

答案 3 :(得分:0)

也许:

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