ユーザーがドロップダウンから言語を選択すると、アプリケーションのロケールがそれに応じて変更されます。ロケールをキャプチャするのは難しくありませんが、後ですべてのページのロケールを設定する方法です。JSFロケールの問題
私はリソースバンドルに設定された構成を有し、
ユーザーがドロップダウンから言語を選択すると、アプリケーションのロケールがそれに応じて変更されます。ロケールをキャプチャするのは難しくありませんが、後ですべてのページのロケールを設定する方法です。JSFロケールの問題
私はリソースバンドルに設定された構成を有し、
独自01を登録し、そのcalculateLocale()方法が行くための一つの方法だろうオーバーライド-config.xmlが直面しています。
faces-config.xml
ファイル、例えばに示される必要があるViewHandler
カスタム:私はこれがあると信じて
public class CustomLocaleViewHandler extends ViewHandler {
private final ViewHandler base;
public CustomLocaleViewHandler(ViewHandler base) {
this.base = base;
}
@Override
public Locale calculateLocale(FacesContext context) {
//... your logic goes here
return locale;
}
@Override
public String calculateRenderKitId(FacesContext context) {
return base.calculateRenderKitId(context);
}
@Override
public UIViewRoot createView(FacesContext context, String viewId) {
return base.createView(context, viewId);
}
... other proxied methods
}
時間のおかげで....何か私はこの段階でやってみようとは思わないでしょう(いくつかの制限は言及されません..)。 –
docs from calculateLocale "これに使用する適切なロケールを返します。現在のクライアントに対する後続の要求です。これは、ビューのロケールが計算され、ユーザーがロケールを変更する場合、このビューのロケールはすでに計算されているため、事前計算が使用され、ロケールが変更される前と同じビューが表示されるためです。私はこのシナリオをテストしました。計算済みの場合、calculateLocaleはビューに対して呼び出されないことがありました。アプリケーションです。そのようなシナリオでの使用のsetDefaultLocale –
:
<faces-config version="2.0" xmlns...>
<application>
...
<view-handler>your.package.CustomLocaleViewHandler</view-handler> ...
と実装だけcalculateLocale()
をオーバーライドしViewHandler
をプロキシするために他の方法を委任しますあなたが探しているもの:
FacesContext context = FacesContext.getCurrentInstance();
context.getViewRoot().setLocale(locale);
私はちょうどこれを通過しました。コード化するのは難しくありませんが、将来的に証明され自動化された方法で効果的に行う方法を理解するのに少し時間がかかります。私は、 JSFで設定され、メニュー項目を現在のロケールに自動的にローカライズします。
まず、ある種のfaceletsテンプレートを使用していることを確認するか、使用するすべてのページでこの最初の部分を複製する必要があります。あなたは、Fを使用してロケールを設定します。ビューのロケール=パラメータ
あなたのページ(s)は次のようになります。
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<f:view locale="#{LocaleBean.currentLocale}">
<h:head>
...
</h:head>
<h:body>
...
<!-- Put this somewhere convenient on your page -->
<h:form>
<h:selectOneMenu value="#{Locale.currentLocale}" onchange="this.form.submit();" immediate="true" >
<f:selectItems value="#{Locale.supportedLocales}" var="loc" itemLabel="#{loc.getDisplayName(Locale.currentLocale)}" itemValue="#{loc}"/>
<f:converter converterId="LocaleConverter"/>
</h:selectOneMenu>
</h:form>
...
</h:body>
</f:view>
</html>
はここに私のLocaleBeanです:(@ManagedBean、またはfaces-経由のいずれかでそれを登録しますセッションスコープ付きのconfig.xml)
public class LocaleBean {
protected List<Locale> supportedLocales = new ArrayList<Locale>();
protected Locale currentLocale;
/**
* Get the value of currentLocale
*
* @return the value of currentLocale
*/
public Locale getCurrentLocale() {
if (currentLocale == null && FacesContext.getCurrentInstance() != null) {
currentLocale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
}
return currentLocale;
}
/**
* Set the value of currentLocale
*
* @param currentLocale new value of currentLocale
*/
public void setCurrentLocale(Locale currentLocale) {
this.currentLocale = currentLocale;
FacesContext.getCurrentInstance().getViewRoot().setLocale(currentLocale);
}
public List<Locale> getSupportedLocales() {
if (supportedLocales.isEmpty() && FacesContext.getCurrentInstance() != null) {
Iterator<Locale> facesLocales = FacesContext.getCurrentInstance().getApplication().getSupportedLocales();
while (facesLocales.hasNext()) {
supportedLocales.add(facesLocales.next());
}
}
return supportedLocales;
}
public void setSupportedLocaleStrings(Collection<String> localeStrings) {
supportedLocales.clear();
for (String checkLocale : localeStrings) {
for (Locale locale : Locale.getAvailableLocales()) {
if (locale.toString().equals(checkLocale)) {
supportedLocales.add(locale);
break;
}
}
}
}
}
そしてLocaleConverter(再び、注釈を介してレジスタまたは-config.xmlが対向)
public class LocaleConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
for (Locale locale : Locale.getAvailableLocales()) {
if (locale.toString().equals(value)) {
return locale;
}
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return value.toString();
}
}
JSFコンバーターを使用して現在のロケールで言語選択を表示する代わりに、そのように見えると思われる理由について詳しく説明しますか?これは、そうでなければ、非常に低い品質のコメントであるようです。 – SplinterReality
calculateLocaleのドキュメントから "現在のクライアントのこの要求と後続の要求に使用する適切なロケールを返します。"これは、ビューのロケールが計算され、ユーザーがロケールを変更する場合、このビューのロケールはすでに計算されているため、事前計算が使用され、ロケールが変更される前と同じビューが表示されるためです。私はこのシナリオをテストしました。計算済みの場合、calculateLocaleはビューに対して呼び出されないことがありました。このようなシナリオでは、Application.setDefaultLocaleは使用されます。 –
Application.setDefaultLocale()は、アプリケーション全体、つまりすべてのユーザーのデフォルトロケールを設定します。私はこれが良い考えだとは思わない。 –