1

誰か助けてくれませんか。Spring MVC と Webflow アプリをまとめており、すべての画面テキストなどをデータベースに基づくメッセージ リソース バンドルに入れたいと考えています。私はこれを問題なく簡単に実装しました。ただし、テキストのバージョン管理を含め、アプリケーションのホワイト ラベルをサポートする必要があります。

「ホワイト ラベル」とは、コア アプリケーションをさまざまな商用ブランド向けにブランド化する必要があることを意味します。ブランディングの css 要素は簡単です。Spring テーマを使用します。ただし、ブランディングはさまざまな画面テキストにまで及びます。たとえば、brandX は「What is your name」と尋ね、brandY は「Please enter your name」と尋ねる場合があります。

さらに、ブランドごとに画面テキストのバージョン管理をサポートする必要があります。これにより、一貫したユーザー ジャーニーと顧客へのメッセージが提供されます。たとえば、顧客が 1 日目に所定の画面ラベル セットを表示して見積もりを保存した場合、10 日目に見積もりを取得したときに同じ画面ラベル セットが表示されるはずです。 、その間にそのブランドの画面テキストが 5 回繰り返されたとしても。(実際には、変更の頻度はそれほど頻繁ではありませんが、それでもサポートする必要があります)

私はしばらくこれをいじっていましたが、初期の実験では、リソース バンドル内のメッセージ キーにプレフィックスを付けるだけでよいと考えていました。

brandX.firstName = What is your firstname?
brandY.firstName = Please enter your firstname

しかし、これはいくつかの点で間違っているように感じます。

  1. ブランドごとにビューを持たない限り (そうしなければならない場合があります)、ビューはモデルまたはテーマの何かに基づいて何らかの方法でプレフィックスを適用する必要があります。表示する適切なメッセージを選択するために、ビューがモデルについて知るのは間違っていると感じます
  2. バージョニングの適用方法がわかりません (複合キーに追加する以外は = brandX.firstname.v2 = あなたの名は?)

全体として、これはメッセージ リソース バンドルの目的ではないという結論に達しています。メッセージ リソース バンドルは、ロケール ベースの国際化に最適です (これが目的です!)。彼ら。解決策としてのメッセージ リソース バンドルは、私の要件には適していないように感じます。

他の誰かがこのようなことをしましたか? どのように解決していきましたか?

乾杯

ネイサン

4

1 に答える 1

0

さまざまなテーマやブランディングで展開できるテーマ Web アプリで、これと同様のことを行いました。また、展開する「ブランド」に応じて、わずかに異なるラベルを付ける必要がありました。

私が使用した解決策は、JSP ページで同じ i18n コードを指定することでしたが、特定のデプロイされたインスタンスで使用されている「ブランド」に従って適切なメッセージ バンドルを選択しました。したがって、従来の (言語ベースの) ロケールに従って異なるメッセージ バンドルを選択する代わりに、org.springframework.web.servlet.i18n.CookieLocaleResolver. これは、アプリのメイン プロパティ ファイル内の特定のプロパティによって構成されています。これが私のdispatcher-servlet.xmlファイルの一部です:

<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="lang" />
</bean>

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="defaultLocale" value="${i18n.code}"/><!-- value from app.properties -->
</bean>

<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <ref bean="localeChangeInterceptor" />
    </property>
</bean>

手動操作が必要だったのは、特定のブランド バージョンの展開だけでした。シェル スクリプトが展開を行い、特定のプロパティ ファイルをコピーしましたcp app.properties.BRAND_X app.properties(操作が必要な他のファイルは でしたweb.xml)。

編集:バージョン管理の部分についてはわかりませんが、おそらくそれを app.properties ファイルから引き出すこともできますが、次のように JSP で指定できます。

<!-- custom tag that reads a properties file -->
<c:set var="version"><app:propertyLoader bundle="app" property="site.version"/></c:set>
<fmt:message key="form.firstName.${version}"/>
于 2012-11-11T22:17:05.850 に答える