3

国際化の可用性を設定しようとしている魔女にアプリケーションがあります。

これは私のfaces-config.xmlです:

<application>
    <locale-config>
        <default-locale>lt</default-locale>
        <supported-locale>en</supported-locale>
        <supported-locale>de</supported-locale>
    </locale-config>
    <resource-bundle>
        <base-name>application</base-name>
        <var>msg</var>
    </resource-bundle>
</application>

3 つのプロパティ ファイルがあります。

application_lt.properties
application_en.properties
application_de.properties

Bean クラス:

@ManagedBean(name = Beans.LOCALE_BEAN)
@SessionScoped
public class LocaleBean extends BaseBean implements Serializable {

    private String lang;

    public String getLang() {
        return lang;
    }

    public void setLang(String lang) {
        this.lang = lang;
    }
}

アクションクラス:

@ManagedBean(name = "localeAction")
@SessionScoped
public class LocaleAction extends BaseAction implements Serializable {

    public void changeLocale() {
        LocaleBean localeBean = getBean(Beans.LOCALE_BEAN);
        String language = localeBean.getLang();
        FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale(language));
    }

}

ロケールを変更するには、commandLink を使用しています。

<h:commandLink action="#{localeAction.changeLocale}">
    <f:setPropertyActionListener target="#{localeBean.lang}" value="en"/>
    English
</h:commandLink>

<h:commandLink action="#{localeAction.changeLocale}">
    <f:setPropertyActionListener target="#{localeBean.lang}" value="lt"/>
    Lithuanian
</h:commandLink>

最初の問題:

デフォルトのロケールを「lt」: lt と定義しました。アプリケーションの起動時に、アプリケーションのテキスト値が application_lt.properties ではなく application_en.properties から読み込まれるのはなぜですか?

2番目の問題:

commandLink アクションを実行すると、選択したロケールに応じてロケールが変わります。ただし、アクションの実行はワンクリックで、アプリケーションの他のリンクを 2 回クリックしても問題ありません。アプリケーションのリンクを 3 回クリックすると、テキスト値が application_en.properties から検索されます。どうやらロケールが変わるようです...

何か案は?

4

2 に答える 2

4

デフォルトのロケールを「lt」: lt と定義しました。アプリケーションの起動時に、アプリケーションのテキスト値が application_lt.properties ではなく application_en.properties から読み込まれるのはなぜですか?

どうやら、ブラウザがリクエストヘッダーenによって優先ロケールとしてロケールを識別しているためです。Accept-Languageサポートされている言語に含まれているため、JSF は自動的にそれを使用します。ブラウザの設定で優先言語を変更する必要があります。


commandLink アクションを実行すると、選択したロケールに応じてロケールが変わります。ただし、アクションの実行はワンクリックで、アプリケーションの他のリンクを 2 回クリックしても問題ありません。アプリケーションのリンクを 3 回クリックすると、テキスト値が application_en.properties から検索されます。どうやらロケールが変わるようです。

どうやら見方を変えたようです。アクション メソッドは、現在のビューのロケールのみを変更します。マスター テンプレートまたは少なくともすべてのビューでLocaleBeanロケールフォームを設定していることを確認する必要があります。<f:view>

<f:view locale="#{localeBean.lang}">

以下も参照してください。

于 2012-05-03T20:50:59.200 に答える
1

最初の問題 ロケールに関して言えば、JSF はクライアント ブラウザの HTTP Accept-Language ヘッダーを読み取り、最も優先されるロケールを使用します。アプリケーション (faces-config 設定) でサポートされていない場合は、HTTP ヘッダーなどから 2 番目に優先されるロケールが使用されます。アプリケーションでクライアントの優先ロケールがサポートされていない場合は、faces-config.xml のデフォルト ロケールが使用されます。使用されている。その結果、faces-config.xml のデフォルト ロケールが単純に無視される場合があります。

そのため、クライアント ブラウザは HTTP Accept-Language ヘッダーで英語ロケールを送信するようです。

2番目の問題。 これは、デフォルトでロケールがユーザー セッションごとではなく、リクエストごとに設定されるために発生します。 これを克服する方法については、この質問をご覧ください。

于 2012-05-03T20:54:38.187 に答える