0

strutsアプリケーションに2つまたは3つのi18nファイルがあります。Global.LOCALE_KEYセッションで変数を設定することで、これらを切り替えることができます。

アプリケーションのデフォルトロケールを設定する方法はありますか(おそらくstruts-config.xmlファイルにあると思います)?セッションはロケールを設定する唯一の場所ですか?

確かに、最初のページへの呼び出しをインターセプトしてセッションで変数を設定することはできますが、それはもっと面倒です。

4

4 に答える 4

3

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 をハックする必要があるかもしれません。

おそらくこれを行うより良い方法があります。これは私が継承したコードです。

于 2008-12-05T12:13:46.497 に答える
1

作成時にセッションをセットアップする場合は、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 によって「プログラムで」追加することもできます

于 2016-04-27T01:34:27.170 に答える
0

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");
    }
} 
于 2008-12-08T12:27:40.537 に答える
0

リソース ファイルをデフォルトとして選択する必要がある場合は、ファイル名の言語コードを省略します。

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>
于 2008-12-14T23:11:19.460 に答える