2008-08-16 88 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設計師隨地吐痰的牙齒。

相關問題