9

我最近继承了一个国际化和大量文本的 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 违规- 我有 N 个对我的 Struts 操作 URL 的引用而不是 1 个,这使得重构操作 URL 容易出错。
  2. 混合的关注点——我的应用程序的标记现在不仅仅是我的 JSP 文件,这使得 Web 专家很难调整标记(使用 CSS 等)。
  3. 翻译后标记——每当我收到新翻译的文本时,我必须决定用<a>...</a>标记包围什么。英语很容易,但对于不熟悉的语言就不那么容易了。

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

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

但是随后“地址”和“联系信息”这两个词需要以某种方式本地化,用标记包装,并传递给我的消息标签——我看不到一个简单的方法来做到这一点。

我能做些什么来改善这一点?

4

4 回答 4

2

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

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

于 2008-08-16T21:59:07.157 回答
1

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

于 2008-08-16T17:40:46.880 回答
0

也许:

#
alert=Please update your {0}address{1} and {2}contact information{3}.
于 2008-08-16T16:55:36.910 回答
0

消息消息标签 API 只允许 5 个参数参数

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

引用手册

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

于 2008-08-16T20:56:26.517 回答