Как настроить пакет ресурсов "On-The-Fly"? - PullRequest
2 голосов
/ 15 марта 2012

У меня есть поле со списком, где пользователи могут выбрать доступный язык. Приложение содержит файлы свойств для каждого языка. В разделе ресурсов страницы пакет ресурсов рассчитывается в соответствии с языковым тегом (DE, EN ...) в документе конфигурации пользователя.

Есть ли какой-нибудь простой способ изменить язык в событии onChange в соответствии со значением выпадающего списка? Я думал о context.setProperty(???). Любое предложение?

Ответы [ 2 ]

5 голосов
/ 15 марта 2012

Для реализации этого приложения в целом вы можете использовать фазовый слушатель. В этом примере используемый языковой стандарт хранится в переменной sessionScope с именем «Language».

Просто добавьте комбинированный список в ваш XPage (ы), содержащий все разрешенные локали.

<xp:comboBox id="comboBox1" value="#{sessionScope.Language}">
    <xp:selectItem itemLabel="Chinese" itemValue="zh"></xp:selectItem>
    <xp:selectItem itemLabel="German" itemValue="de"></xp:selectItem>
    <xp:selectItem itemLabel="Turkish" itemValue="tr"></xp:selectItem>
    <xp:eventHandler event="onchange" submit="true" refreshMode="complete" />
</xp:comboBox>

Тогда вы должны использовать фазовый слушатель, как этот:

package ch.hasselba.xpages.jsf.core;

import javax.faces.context.FacesContext;
import javax.faces.application.Application;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.faces.component.UIViewRoot;
import java.util.Locale;
import java.util.Map;

public class LocalizationSetter implements PhaseListener {

    private static final long serialVersionUID = -1L;
    private static final String scopeVarName = "Language";
    private static final String scopeName = "sessionScope"; 

    public void afterPhase(PhaseEvent event) {}

    public void beforePhase(PhaseEvent event) {
        FacesContext facesContext = event.getFacesContext();
        UIViewRoot view = facesContext.getViewRoot();
        view.setLocale( getLanguage(facesContext) ) ;
    }

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

    private Locale getLanguage( FacesContext facesContext ){
        try{
            Application app = facesContext.getApplication();
            Object obj = app.getVariableResolver().resolveVariable(facesContext, scopeName );
            Object lang = ((Map) obj).get( scopeVarName );
            if( lang != null ){
                return new Locale((String) lang);
            }
        }catch(Exception e){}

        return Locale.getDefault();
    }
}

Вы можете добавить поиски и т. Д. Для доступа к профилям пользователей в методе "getLanguag ()".

Надеюсь, это поможет Свен

1 голос
/ 15 марта 2012

В прошлом я боролся с этим и до сих пор не решил правильно. Вы можете установить язык, используя

context.setLocaleString ( "ан"); context.reloadPage ();

но если вы хотите, чтобы язык менялся в зависимости от пользовательского документа, я думаю, вам нужно добавить код к каждому вашему событию beforePageLoad. потому что браузер всегда будет использовать настройку, указанную в html lang = ".." Пакет ресурсов также будет использовать язык в этой настройке

У меня есть некоторые проблемы с тем, чтобы заставить его работать без ручной перезагрузки или перезагрузки дважды. Вы также можете попытаться изменить атрибут lang с помощью phaselistener

...