私はVaadinで国際化I18Nを使用しています。私は、メソッドのgetTextと国際クラスを持っています。
public static String getText(String key) {
String returnValue = "";
String value = "";
String space = " ";
Locale locale = new Locale("de", "DE");
try {
// session specific locale stored in attribute "locale"
// if you want add a new language then add a new else if with the
// new Locale like ("fr", "FR").
if (VaadinServletService.getCurrentRequest() != null) {
if ((Locale) VaadinServletService.getCurrentServletRequest().getSession().getAttribute("locale") != null) {
if (VaadinServletService.getCurrentServletRequest().getSession().getAttribute("locale").toString().equals("en_EN")) {
locale = new Locale("en", "US");
} else if (VaadinServletService.getCurrentServletRequest().getSession().getAttribute("locale").toString().equals("de_DE")) {
locale = new Locale("de", "DE");
}
}
}
ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale);
value = bundle.getString(key);
returnValue = new String(value.getBytes("ISO-8859-1"), "UTF-8");
} catch (MissingResourceException e) {
// Missing key
try {
// return the Key
String keyString = key.replace("_", space);
returnValue = new String(keyString.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return returnValue + space;
}
私はこれを使用してどこからでもこのメソッドを呼び出すことができるgetText()
方法を。私のコンポーネントは、彼らは次のようにコールすることによって、この方法を国際化テキストを取得します:label.setCaption(Internationalization.getText("Willkommen"));
私は今、ドイツ語と英語の言語のための2つのボタン「DE」と「EN」を持っています。このボタンのClickListenerでは私はこのような新しいロケールを設定します。
btnLanguageDE.addClickListener(e -> {
VaadinServletService.getCurrentServletRequest().getSession().setAttribute("locale", new Locale("de", "DE"));
});
btnLanguageEN.addClickListener(e -> {
VaadinServletService.getCurrentServletRequest().getSession().setAttribute("locale", new Locale("en", "EN"));
logger.debug("Internationalization change to: EN");
});
問題は、私はボタンをクリックした場合、彼らは地元の設定が、ページ上のコンポーネントを再ロードしませんでした、です。それは私が手動でページをリロードした場合にのみ変更します。私はこれを呼び出そうとしましたUI.getCurrent().getPage().getLocation();
いいえ効果にすぎません。
どのように私は実際のロケールでコンポーネントをリロードすることができますか?
良いありinternationlization /ローカライズについてのドキュメント vaadinとは。
まずアップ、あなたはあなたの国際クラスに翻訳されたラベルにアクセスする方法を独自のロジックを実装しているように見えます。
Vaadinはすでにこれを実装しています。あなたは国際クラスが実装させることができますI18NProvider
(あなたが春を使用している場合や@Componentと注釈して。いない場合は、私がリンクされ、ドキュメントがどのように説明すると思わ何とかそれを登録する必要があります)から、あなたのmethodNameのを変更getText
しますgetTranslation
。すべてVaadin成分(したがって、すべてのビューで、ビュークラスはコンポーネントを拡張しなければならないので)を呼び出すことができるgetTranslation(keyString);
場合にI18NProvider
フェッチされ使用されます。
すでに同様の実装を自分で作られたので、これはすべてオプションです。しかし、このようにそれを行うとベストプラクティスでしょう。
今、あなたの実際の質問に-あなたはtranslateable文字列を持つすべてのビューを聞かせする必要がありますimplements LocaleChangeObserver
。これは、メソッドを実装するビュー強制的にlocaleChange(LocaleChangeEvent event)
呼ばれて、自動的に UIのロケールが変更されたときに。localeChange
この方法、あなたは翻訳され、新たにすべてのテキストを設定することができます。
ページをリフレッシュする必要はありません!
public void localeChange(LocaleChangeEvent event){
label.setCaption(getTranslation("Willkommen"));
}
あなたは、このようなUIのロケールを変更することができます。
UI.getCurrent().setLocale(myNewLocale);
私は私の中で言語選択のためのコードを共有している別のStackOverflowのポスト私は私のようあなたは、サンプルコードは、関連するでしょうと思います- Select
直接トリガ-コンポーネントが新しいロケールを設定しますvalueChangeListenerのを持っていますlocaleChange
。