Paweł Ryznar programista
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
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...
Paweł Ryznar programista
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.
Programista Java
(J2EE)
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) {
...
}
}
Paweł Ryznar programista
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.
Programista Java
(J2EE)
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 :)
Paweł Ryznar programista
