strutsアプリケーションに2つまたは3つのi18nファイルがあります。Global.LOCALE_KEY
セッションで変数を設定することで、これらを切り替えることができます。
アプリケーションのデフォルトロケールを設定する方法はありますか(おそらくstruts-config.xmlファイルにあると思います)?セッションはロケールを設定する唯一の場所ですか?
確かに、最初のページへの呼び出しをインターセプトしてセッションで変数を設定することはできますが、それはもっと面倒です。
web.xml で context-param を定義できます。
<context-param>
<param-name>LOCALE</param-name>
<param-value>en-GB</param-value>
</context-param>
次に、webapp で前もって:
java.util.Enumeration<String> setout = servletContext.getInitParameterNames();
while (setout.hasMoreElements()) {
String paramName = setout.nextElement();
configProperties.put(paramName, servletContext.getInitParameter(paramName));
}
ただし、代わりにそのプロパティ行をセッションに貼り付けるように変更する必要があります。このように事前初期化を行うバージョンの ActionComponentServlet をハックする必要があるかもしれません。
おそらくこれを行うより良い方法があります。これは私が継承したコードです。
作成時にセッションをセットアップする場合は、HttpSessionListener を使用できます。新しいセッションごとにデフォルトのロケールを設定すると、次のようになります。
package com.mycompany.web.session;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.apache.struts.Globals;
public class LocaleController implements HttpSessionListener {
private static Locale defaultLocale = locale.ENGLISH;
@Override
public void sessionCreated(HttpSessionEvent event) {
event.getSession().setAttribute(Globals.LOCALE_KEY, defaultLocale);
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
}
}
次に、この要素を web.xml ファイルに追加します。
<listener>
<listener-class>com.mycompany.web.session.LocaleController</listener-class>
</listener>
または、メソッド ServletContext.addListener によって「プログラムで」追加することもできます
struts-config.xml を使用する代わりに Java コードを記述して、最終的にこの問題を解決しました。
Struts クラスの静的フィールドの値を設定するコンテキスト リスナーを作成しました。
この質問を参照してください: Tomcat の起動時にのみメソッド/クラスを実行する方法はありますか?
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class AppContextListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent event) { /* empty. */ }
@Override
public void contextInitialized(ServletContextEvent event) {
/*
* Default locale
*/
ServletContext sc = event.getServletContext();
sc.setAttribute(org.apache.struts.Globals.LOCALE_KEY, "pt_BR");
}
}
リソース ファイルをデフォルトとして選択する必要がある場合は、ファイル名の言語コードを省略します。
Texts_en_GB.properties
Texts_pt_BR.properties
Texts.propertiers ( <-- this one will be selected when no resources for requested language could be found)
編集:
Struts 1.x には、メッセージをデフォルト モードで定義した場合のデフォルト メッセージ処理に関するバグがあります (mode
プロパティを省略した場合に選択されます)。
<message-resources key="Texts" parameter="com.mycompany.Texts" null="false"/>
また、デフォルトのロケールは、接尾辞のないプロパティの言語と同じではありません: Texts.properties
。
Texts.properties
ファイルに英語のテキストが含まれるとしましょう。さらに、ドイツ語の翻訳があります: Texts_de.properties
. フランス語のサーバーで実行しているため (明示的に設定していないため)、既定のシステム ロケールはフランス語です。
サーバー起動後の最初のリクエストでページのドイツ語翻訳がリクエストされた場合、リクエストされた言語コードの明示的なプロパティ ファイルがない場合、同じページの後続のリクエストはすべてドイツ語で提供されます。
最初のリクエストが英語のページを要求した場合、同じページの後続のすべてのリクエストは、要求された言語コードの明示的なプロパティ ファイルがない場合 (これが必要です)、英語で提供されます。
この問題の解決策は、すべてのメッセージ リソース宣言に対してモード プロパティを設定することです。
<message-resources key="Texts" parameter="com.mycompany.Texts" null="false">
<set-property key="mode" value="JSTL" />
</message-resources>