2008-08-16 93 views
8

我最近继承了一个国际化和文本沉重的Struts 1.1 Web应用程序。许多JSP文件的样子:我如何重构我的属性文件中的HTML标记?

<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动作的网址,而不是1,这使得重构操作URL出错ñ引​​用。
  2. 混合关注 - 我的应用程序的标记现在不仅仅是我的JSP文件,使Web专家很难调整标记(使用CSS等)。
  3. 翻译后标记 - 每当我收到新翻译后的文本,我必须决定如何处理<a>...</a>标记包围。易于使用英语,但对于不熟悉的语言则不那么容易。

我已经考虑将占位符中的邮件文件,如:

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

但随后的话“地址”和“联系人信息”会以某种方式需要进行本地化,包裹着标记,传递给我的消息标记 - 我看不到一个简单的方法来做到这一点。

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

回答

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设计师。

0

也许:

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

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

0

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

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

引述manual

一些功能在这个标签库 也都在的JavaServer Pages标准标记库(JSTL)可用。在可能的情况下,Struts团队鼓励在Struts专用 标记上使用标准标记 。

你也许可以用http://java.sun.com/jsp/jstl/fmt的taglib做到这一点。

<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设计师随地吐痰的牙齿。