2015-06-04 5 views
2

Я пытаюсь изменить локализацию своего 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)

+1

Вы должны использовать ''. Какая ошибка была именно у вас при попытке? Ошибки в основном представляют собой весь ответ на проблему. Вы не должны игнорировать их, когда не можете их интерпретировать, но вместо этого вы должны делиться ими с такими экспертами, как мы, чтобы мы могли перевести ошибку в условия неспециалиста для вас (и, следовательно, сделать причину и решение гораздо более очевидными). Возможно, это связано с исчезновением ошибки '', с которой вы столкнулись в [предыдущем вопросе] (http://stackoverflow.com/questions/30646177/setting-dir-rtl-in-html-tag-doesnt-seem-to -Работа-работа-в-hbody). – BalusC

+0

Я обновил свой вопрос, сообщив, что это за ошибка. – jose

+1

так ... вы получаете ошибку в строке 56 класса, который имеет менее 30 строк? И хотя вы получаете сообщение об ошибке, которое вы нам не говорите, что находится в очереди?О, ну ... я буду стрелять в темноте: я думаю, вы пытаетесь получить доступ к языку (возможно, log langiuage) в своем конструкторе, прежде чем он будет инициализирован методом @PostConstruct? – fdreger

ответ

6

I воспроизведена ваша проблема. Это является следствием issue 3021, который применялся с Mojarra 2.2.5. Теперь локаль определяется во время времени построения. Ранее, во время написания найденного ответа, локаль определялась во время просмотра рендеринга, что позволяло коду находить локали по умолчанию для этого вида. Однако во время создания времени это невозможно, поскольку представление еще не существует. Понимаете, getViewRoot() вернулся null.

Вместо этого вам необходимо получить локализацию запроса из внешнего контекста.

@PostConstruct 
public void init() { 
    locale = FacesContext.getCurrentInstance().getExternalContext().getRequestLocale(); 
} 

Ответ, который вы нашли, также был изменен.

+0

Теперь проблема решена, потому что она не возвращает NPE, но у меня есть новая проблема. В настройках моего браузера указано, что я предпочитаю получать страницы на испанском, а не на английском, но когда я запускаю приложение, я получаю страницы на английском языке (это мой стандарт по умолчанию в файле конфигурации xml). Не могли бы вы рассказать мне, как получить страницы на испанском языке, будучи английским языком по умолчанию? – jose

+0

О, я отвечу на мой вопрос. Я должен был прочитать больше, прежде чем спрашивать об этом. Сожалею. Ответ: locale = FacesContext.getCurrentInstance(). GetExternalContext(). GetRequestLocale(); – jose

+0

Это ведь действительно лучше. – BalusC