Как получить UIViewRoot из xhtml внутри другого xhtml [duplicate]

Поскольку, если вы не переопределяете их, вы будете использовать стандартную имплантацию в Object.

Учитывая, что для значений экземпляра и значений hascode обычно требуется знание того, что составляет объект, они, как правило, должны быть переопределены в вашем классе иметь какой-либо ощутимый смысл.

38
задан BalusC 10 June 2015 в 18:47
поделиться

5 ответов

Вам нужно сохранить выбранную локаль в области сеанса и установить ее в viewroot в двух местах: один раз UIViewRoot#setLocale() сразу после изменения языкового стандарта (который изменяет локаль текущего режима просмотра и таким образом получить отражение в обратной передаче, эта часть не нужна, когда вы выполняете перенаправление впоследствии) и один раз в атрибуте locale в <f:view> (который устанавливает / сохраняет языковой стандарт в следующем запросы / представления).

Вот пример того, как должен выглядеть такой LocaleBean:

package com.example.faces;

import java.util.Locale;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

@ManagedBean
@SessionScoped
public class LocaleBean {

    private Locale locale;

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

    public Locale getLocale() {
        return locale;
    }

    public String getLanguage() {
        return locale.getLanguage();
    }

    public void setLanguage(String language) {
        locale = new Locale(language);
        FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
    }

}

И вот пример представления должен выглядеть так:

<!DOCTYPE html>
<html lang="#{localeBean.language}"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html">
<f:view locale="#{localeBean.locale}">
    <h:head>
        <title>JSF/Facelets i18n example</title>
    </h:head>
    <h:body>
        <h:form>
            <h:selectOneMenu value="#{localeBean.language}" onchange="submit()">
                <f:selectItem itemValue="en" itemLabel="English" />
                <f:selectItem itemValue="nl" itemLabel="Nederlands" />
                <f:selectItem itemValue="es" itemLabel="Español" />
            </h:selectOneMenu>
        </h:form>
        <p><h:outputText value="#{text['some.text']}" /></p>
    </h:body>
</f:view>
</html>

Обратите внимание, что <html lang> не требуется для функционирования JSF, но обязательно, как поисковые роботы интерпретируют вашу страницу. В противном случае это может быть отмечено как дублирующее содержимое, которое плохо для SEO.

Связано:

75
ответ дан BalusC 26 August 2018 в 06:58
поделиться
2
ответ дан GIRI KUMAR PANEM 26 August 2018 в 06:58
поделиться

Я вижу, что проблема также в имени файла .properties. Java Locale us code (нижний регистр), например: en_gb Но автоматически созданная локаль (по Netbeans) имеет нижний регистр_подпрограммы, то есть сообщения: message_en_GB.properties Измените имя на: messages_en_gb.properties, и оно должно работать - если вы пробовали все

3
ответ дан Sebastian 26 August 2018 в 06:58
поделиться

Если вы можете использовать CDI и deltaspike ( JSF module ) в своей среде, вы можете добавить следующее к своему LocaleBean, чтобы автоматически сбросить языковой стандарт в текущем виде:

@javax.enterprise.context.SessionScoped
public class LocaleBean implements Serializable {

    ...

    public void resetLocale(@Observes @BeforePhase(JsfPhaseId.RENDER_RESPONSE) PhaseEvent event) {
        event.getFacesContext().getViewRoot().setLocale(this.locale);
    }
}
0
ответ дан Xavier Dury 26 August 2018 в 06:58
поделиться

Одно небольшое замечание к большому решению @BalusC. Если у нас есть <f:viewAction>, который выполняет какой-либо метод в бэк-компоненте. Локаль, доступный из вызова FacesContext.getCurrentInstance().getViewRoot().getLocale() внутри этого метода, был бы локалирован, который задается браузером пользователя или стандартным языковым стандартом приложения, а не той локалью, которая установлена ​​на сеансовом компоненте по выбору пользователя (конечно, они могут совпадать, если язык браузера равен этой локали, пользователь выбран).

Я могу выдержать исправление, потому что, возможно, я сделал что-то неправильно при реализации решения, предоставленного @BalusC.

EDIT. После игры с жизненным циклом JSF это поведение с локалью не связано с <f:viewAction>, поскольку аналогичное поведение наблюдается и с @PostContruct. <f:view locale="#{localeBean.locale}"> в запросе (после выбранного пользователем локали) выполняется в фазе ответа рендера. <f:viewAction> и @PostContruct методы выполняются при вызове фазы приложения. Вот почему логика, которая выполняется в этом методе, не имеет доступа к выбранному пользователем языку.

Решение, которое мы используем, когда мы нуждаемся в правильной локали, заключается в том, чтобы вводить (CDI) localeBean в другой бэк-компонент, содержащий <f:viewAction> и @PostContruct, а затем установить locale с UIViewRoot#setLocale() из localeBean в начале этих методов.

1
ответ дан Znas Me 26 August 2018 в 06:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: