konto usunięte

Temat: JSF + i18n - jak ugryźć?

Witam :)

mam pytanie odnośnie stworzenia wielojęzycznej aplikacji.
Tzn chodzi mi o samo ustawienie języka. Informację przechowuję w cookie, i teraz przy każdym wywołaniu trzeba sprawdzać jego wartość.

Stworzyłem sobie filtr, funkcja doFilter wygląda mniej więcej tak


public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {

HttpServletRequest httpServletRequest = (HttpServletRequest) request;

Cookie[] cookies = httpServletRequest.getCookies();
String culture = getCookieValue(cookies, "culture");
Locale newLocale = getCulture(culture, response.getLocale().getLanguage());
response.setLocale(newLocale);
System.out.println(newLocale.getLanguage());

chain.doFilter(request, response);
}


jednak coś nie tak zrobiłem skoro, cały czas widzę stronę w języku polskim zamiast angielskim. Wartość wypisana na konsolę jest poprawna, więc pewnie coś dalej popsułem.

Proszę o pomoc, i ewentualnie wskazówkę jak to można zrobić lepiej jeśli źle do tego podszedłem.
Piotr Stawiński

Piotr Stawiński
projektant/programis
ta, Narodowy Bank
Polski

Temat: JSF + i18n - jak ugryźć?

Cześć
Generalnie kwestię internacjonalizacji można rozwiązać na przykłąd tak, jak opisano tutaj:
http://www.javabeat.net/tips/102-implement-internation...

konto usunięte

Temat: JSF + i18n - jak ugryźć?

od tej strony to ja wiem. mam już pliki properties z tłumaczeniami. mam funkcje zapisującą odpowiednie ciastko w zależności którą flagę użytkownik kliknie na stronie. teraz potrzebuję przy każdym odświeżeniu sprawdzić co jest w ciastku i dynamicznie ustawić język.

W sieci znalazłem tylko to

FacesContext context = FacesContext.getCurrentInstance();

Locale currentLocale = context.getViewRoot().getLocale();

Locale nl = new Locale("nl");
if(currentLocale.equals(nl)) {
context.getViewRoot().setLocale(Locale.ENGLISH);
} else {
context.getViewRoot().setLocale(nl);
}


ale chyba zadziała tylko w ziarnie zarządzanym? no a taką funkcjonalność to powinienem raczej umieścić w filtrze? Przynajmniej w frameworku dla PHP tak robiłem.

----------------------
znalazłem jeszcze przykład gdzie można to zrobić rozszerzając ViewHandler, w moim przypadku FaceletsViewHandler.

Także mam dylemat. Jak jak to najlepiej robić filtr czy view handler?Paweł Ryznar edytował(a) ten post dnia 08.11.09 o godzinie 12:02
Damian P.

Damian P. Starszy Programista
Java / JEE

Temat: JSF + i18n - jak ugryźć?

Więc może jednak PhaseListener:

public class LocalePhaseListener implements PhaseListener {


public void afterPhase(PhaseEvent event) {
return;
}

public void beforePhase(PhaseEvent event) {
FacesContext context = event.getFacesContext();
Locale currentLocale = getLocaleFromCookie(context);
context.getViewRoot().setLocale(currentLocale);
return;
}

public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}

public Locale getLocaleFromCookie(FacesContext context) {
...
}

}

konto usunięte

Temat: JSF + i18n - jak ugryźć?

no to jeszcze lepiej :) na 3 sposoby można :) dziękuję za odpowiedź

ja na razie zrobiłem tak:

public class CustomViewHandler extends FaceletViewHandler {

public CustomViewHandler(ViewHandler parent) {
super(parent);
}

@Override
public Locale calculateLocale(FacesContext context) {
return I18N.getLocaleFromCookie(context);
}
}


Tylko który sposób wybrać? Są jakieś przesłanki, że lepiej ten niż tamten?
Damian P.

Damian P. Starszy Programista
Java / JEE

Temat: JSF + i18n - jak ugryźć?

Różnica jest choćby taka, że wykorzystanie PhaseListener'a nie uzależnia Twojego kodu od użycia w projekcie Facelet'ów... no i jest bardziej "wzorcowe"... ale jeżeli oba rozwiązania działają to wybór należy do Ciebie :)

konto usunięte

Temat: JSF + i18n - jak ugryźć?

A o tym nie pomyślałem. Dziękuję za wskazówkę :)

Następna dyskusja:

Jak powiazac radiobutton z ...




Wyślij zaproszenie do