私のアプリでは、ユーザーはロケール (ページ上のテキストのレンダリングに使用される言語) を切り替えることができるはずです。多くのチュートリアルで FacesContext.getCurrentInstance().getViewRoot().setLocale() が使用されています。例: http://www.mkyong.com/jsf2/jsf-2-internationalization-example/ . しかし、それは JSF 2.0 では機能しません (1.2 では機能しました)。言語が切り替わることはありません。エラーも何もありません。同じコードが JSF 1.2 で正常に機能しました。
正確で決定的なアプローチは何ですか?解決策をまとめましたが、これが正しいかどうかはわかりません。これはうまくいきます。ユーザーが英語またはフランス語をクリックすると、言語が切り替わります。アイデアを提供するためのコード スニペットを次に示します。
@ManagedBean(name = "switcher")
@SessionScoped
public class LanguageSwitcher {
Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
public String switchLocale(String lang) {
locale = new Locale(lang);
return FacesContext.getCurrentInstance().getViewRoot().getViewId() +
"?faces-redirect=true";
}
//getLocale() etc. omitted for brevity
}
XHTML:
<f:view locale="#{switcher.locale}">
<h:outputText value="#{msg.greeting}" />
<h:commandLink value="English" action="#{switcher.switchLocale('en')}" />
<h:commandLink value="French" action="#{switcher.switchLocale('fr')}" />
</f:view>
詳細情報を提供するために、ここに設定ファイルがあります。
<application>
<locale-config>
<supported-locale>en</supported-locale>
<supported-locale>fr</supported-locale>
</locale-config>
<resource-bundle>
<base-name>com.resources.Messages</base-name>
<var>msg</var>
</resource-bundle>
</application>
繰り返しますが、これは機能します。ただし、API を呼び出して JSF 自体のロケールを変更したことはありません。これは私にいくらか不気味な気持ちを与えます。これはユーザーのロケールを変更する正しい方法ですか?