2012-03-15 2 views
2

사용자가 사용할 수있는 언어를 선택할 수있는 콤보 박스가 있습니다. 응용 프로그램에는 각 언어에 대한 등록 정보 파일이 있습니다. 페이지의 리소스 섹션에서 리소스 번들은 사용자 구성 문서의 언어 태그 (DE, EN ...)에 따라 계산됩니다."On-The-Fly"리소스 번들을 설정하는 방법은 무엇입니까?

콤보 상자의 값에 따라 onChange 이벤트에서 언어를 쉽게 변경할 수 있습니까? 나는 context.setProperty(???)을 생각했다. 제안 사항이 있으십니까?

답변

5

이 응용 프로그램을 구현하려면 위상 수신기를 사용할 수 있습니다. 이 예제에서 사용할 로케일은 "Language"라는 sessionScope 변수에 저장됩니다.

허용 된 모든 로케일을 포함하는 XPage에 콤보 상자를 추가하십시오. 당신은 등을 조회 /를 추가 할 수 있습니다

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()"방식으로 사용자 프로파일에 액세스하려면 :

<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> 

그런 다음이 같은 위상 수신기를 사용해야합니다.

희망이 스벤

+0

듯하는 데 도움이됩니다. 고맙습니다. –

1

저는 과거에이 문제로 어려움을 겪었지만 올바르게 해결하지 못했습니다.

을 사용하여 언어를 설정할 수 있습니다. context.setLocaleString ("en"); context.reloadPage();

하지만 언어를 사용자 문서에 따라 변경하려면 각 beforePageLoad 이벤트에 코드를 추가해야한다고 생각합니다. 브라우저가 항상 html lang = ".."에있는 설정을 사용할 것이기 때문에 리소스 번들은이 설정에서 언어를 사용합니다.

수동 재로드 또는 두 번 다시로드하지 않고 작동 시키려면 몇 가지 문제가 있습니다. phaselistener를 사용하여 lang 특성을 변경하려고 할 수도 있습니다.