9

私は最近、国際化されたテキストを多用するStruts1.1Webアプリケーションを継承しました。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違反-1つではなくN個のStrutsアクションURLへの参照があるため、リファクタリングアクション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

One approach that comes to mind is that you could store the translated replacement parameters i.e. "address" and "contact information" in a separate properties file, one per locale. Then have your Action class (or probably some helper class) look up the values from the correct ResourceBundle for the current locale and pass them to the message tag.

于 2008-08-16T17:40:46.880 に答える
0

メッセージメッセージタグAPIは、5つのパラメトリック引数のみを許可します

ああ!私はStrutsAPIを完全に知らなかったと非難します。

マニュアルを引用するには:

このtaglibの機能の一部は、JavaServer Pages標準タグライブラリ(JSTL)でも利用できます。Strutsチームは、可能であれば、Struts固有のタグよりも標準タグの使用を推奨しています。

これは、おそらくhttp://java.sun.com/jsp/jstl/fmttaglibを使用して行うことができます。

<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 に答える
0

多分:

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