Я пытаюсь изменить локализацию своего JSF-приложения на одной странице и это должно изменить все локали моих страниц. Я следовал этой ссылке, и она хорошо работает Localization in JSF, how to remember selected locale per session instead of per request/viewFacesContext # getViewRoot() возвращает null при установке <f: view locale> в первый раз
При запуске приложения я могу изменить локаль в моем index.xhtml и региональные установки на сессии, так что, если я перейти на страницу INDEX_1. xhtml Я увижу, что локаль изменена.
Моя проблема заключается в том, что при запуске приложения и я пишу URL: http://localhost:8080/Myapp-war/faces/index_.xhtml, чтобы перейти к index_1.xhtml страницу и изменить локаль, язык не изменилось в index.xhtml.
Это мой код:
Managed Bean
package controllers;
import java.io.Serializable;
import java.util.Locale;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
@ManagedBean
@SessionScoped
public class LanguageSwitcher implements Serializable{
private Locale locale;
@PostConstruct
public void init()
{
locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
}
public Locale getLocale() {
return locale;
}
public String getLanguage() {
return locale.getLanguage();
}
//Change locale
public void changeLanguage(String language) {
locale = new Locale(language);
FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
}
}
index.xhtml Файл:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="#{languageSwitcher.language}"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<h3>Language switcher:</h3>
<h:form id="language_form">
<h:commandLink action="#{languageSwitcher.changeLanguage('es')}" value="Español" rendered="#{languageSwitcher.language != 'es'}"/> |
<h:commandLink action="#{languageSwitcher.changeLanguage('en')}" value="English" rendered="#{languageSwitcher.language != 'en'}"/>
</h:form>
<h:outputText value="#{msg['greeting']}" />
</h:body>
</html>
index_1.xhtml Файл:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="#{languageSwitcher.language}"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<f:view locale="#{languageSwitcher.locale}">
<h:head>
</h:head>
<h:body>
<h3>Language switcher:</h3>
<h:form id="language_form">
<h:commandLink action="#{languageSwitcher.changeLanguage('es')}" value="Español" rendered="#{languageSwitcher.language != 'es'}"/> |
<h:commandLink action="#{languageSwitcher.changeLanguage('en')}" value="English" rendered="#{languageSwitcher.language != 'en'}"/>
</h:form>
<h:outputText value="#{msg['greeting']}" />
</h:body>
</f:view>
</html>
Если я пишу <f:view locale="#{languageSwitcher.locale}">
в моем index.xhtml, когда я запускаю приложение, я получаю сообщение об ошибке.
Как я могу его решить?
UPDATE:
Я получаю ошибку при запуске приложения является:
java.lang.NullPointerException в controllers.LanguageSwitcher.init (LanguageSwitcher.java:56)
Вы должны использовать ''. Какая ошибка была именно у вас при попытке? Ошибки в основном представляют собой весь ответ на проблему. Вы не должны игнорировать их, когда не можете их интерпретировать, но вместо этого вы должны делиться ими с такими экспертами, как мы, чтобы мы могли перевести ошибку в условия неспециалиста для вас (и, следовательно, сделать причину и решение гораздо более очевидными). Возможно, это связано с исчезновением ошибки '', с которой вы столкнулись в [предыдущем вопросе] (http://stackoverflow.com/questions/30646177/setting-dir-rtl-in-html-tag-doesnt-seem-to -Работа-работа-в-hbody). –
BalusC
Я обновил свой вопрос, сообщив, что это за ошибка. – jose
так ... вы получаете ошибку в строке 56 класса, который имеет менее 30 строк? И хотя вы получаете сообщение об ошибке, которое вы нам не говорите, что находится в очереди?О, ну ... я буду стрелять в темноте: я думаю, вы пытаетесь получить доступ к языку (возможно, log langiuage) в своем конструкторе, прежде чем он будет инициализирован методом @PostConstruct? – fdreger