복붙노트

[SPRING] JSF에서 다중 자원 번들 사용하기

SPRING

JSF에서 다중 자원 번들 사용하기

JSF 페이지에서 여러 자원 번들에 액세스하려고합니다. 두 개의 리소스 번들이 있습니다.

JSF 파일에서이 두 자원 번들에 모두 액세스하려고합니다. 이 작업을 수행하는 한 가지 방법은 각 번들에 대한 특정 속성을 정의하는 것입니다.

<f:loadBundle basename="com.sample.general_messages" var="general"/>
<f:loadBundle basename="com.sample.module_message" var="module"/>

동일한 변수 이름을 사용하여이 두 리소스 번들에 모두 액세스 할 수있는 방법이 있습니까? 같은 것 :

<f:loadBundle basename="com.sample.general_messages, com.sample.module_message" var="general"/>

또는 여러 리소스 번들에 액세스하는 가장 좋은 방법은 무엇입니까?

해결법

  1. ==============================

    1.Spring에서 질문에 태그를 추가 했으므로 Spring MessageSource를 사용하는 것이 좋습니다. Spring MessageSource는 많은 속성 파일을 계층 적으로도 집계 할 수있다. 그것은 당신에게 오래된 Java ResourceBundle보다 많은 장점을 제공합니다.

    Spring에서 질문에 태그를 추가 했으므로 Spring MessageSource를 사용하는 것이 좋습니다. Spring MessageSource는 많은 속성 파일을 계층 적으로도 집계 할 수있다. 그것은 당신에게 오래된 Java ResourceBundle보다 많은 장점을 제공합니다.

    spring-config.xml에서 Spring MessageSource를 다음과 같이 정의 할 수있다.

    <!--
    Application messages configuration.
    -->
    <bean id="messageSource" name="resourceBundle"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
        p:fallbackToSystemLocale="false"
        p:cacheSeconds="0">
        <property name="basenames">
            <list>
                <value>/messages/Messages</value>
    <!--        <value>${application.messages}</value>-->
            </list>
        </property>
    </bean>
    

    다음과 같이 ResourceBundle을 확장 한 클래스를 정의 할 수 있습니다 (클리닝 및 리팩토링이 필요함).

    public class SpringResourceBundle extends ResourceBundle
    {
    
        private MessageSource messages;
        private FacesContext fc;
        private Locale locale = null;
    
        public SpringResourceBundle()
        {
            fc = FacesContext.getCurrentInstance();
            WebApplicationContext webAppCtx = (WebApplicationContext) fc.getExternalContext().getApplicationMap().get(
                    WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
            messages = (MessageSource) webAppCtx.getBean("messageSource");
        }
    
        @Override
        public Locale getLocale()
        {
            Locale loc = fc.getELContext().getLocale();
            if (fc.getExternalContext() != null) {
                loc = fc.getExternalContext().getRequestLocale();
            }
            try {
                UIViewRoot viewRoot = fc.getViewRoot();
                if (viewRoot != null) {
                    loc = viewRoot.getLocale();
                }
                if (loc == null) {
                    loc = fc.getApplication().getDefaultLocale();
                }
    
            } catch (Throwable th) {
                System.out.println(th.getMessage());
                loc = locale;
            }
            locale = loc;
            return loc;
        }
    
        @Override
        protected Object handleGetObject(String key)
        {
            try {
                return messages.getMessage(key, null, getLocale());
            } catch (NoSuchMessageException e) {
                return "???" + key + "???";
            }
        }
    
        @Override
        public Enumeration<String> getKeys()
        {
            return Collections.enumeration(Collections.EMPTY_LIST);
        }
    }
    

    마지막으로 faces-config.xml에서 위의 Class로 리소스 번들을 선언한다. 이 같은:

    <application>
        <locale-config>
           <default-locale>en</default-locale>
           <supported-locale>cs</supported-locale>
           <supported-locale>de</supported-locale>
           <supported-locale>en</supported-locale>
        </locale-config>
        <message-bundle>your.package.SpringResourceBundle</message-bundle>
    </application>
    

    여기 JSF에서 Spring MessageSource가있다. 그것이 이해할 수 있기를 바랍니다.

  2. ==============================

    2.2 개의 자원 번들에 같은 열쇠가 포함되어있는 경우,이 열쇠를 해결하기 위해서 어느 자원 번들을 사용할 필요가 있습니까? 그래서, IMO, 같은 변수 이름을 여러 리소스 번들에 할당 할 수 있다고 생각하지 않습니다.

    2 개의 자원 번들에 같은 열쇠가 포함되어있는 경우,이 열쇠를 해결하기 위해서 어느 자원 번들을 사용할 필요가 있습니까? 그래서, IMO, 같은 변수 이름을 여러 리소스 번들에 할당 할 수 있다고 생각하지 않습니다.

    아마도 모든 .properties를 빌드 프로세스의 단일 .properties로 병합 할 수 있습니다 (예 : 병합 된 특성 파일의 모든 키가 고유한지 확인하십시오. 예 : 각 키에 일부 접두사를 추가하십시오.). 그런 다음 응용 프로그램에서이 단일 병합 된 .properties를 사용합니다.

  3. ==============================

    3.JSF가 동일한 번들에 대해 여러 파일을 검사하는 유일한 상황 (알고있는 것)은 여러 로케일에 번들을 제공하는 경우입니다 (현지화 된 메시지 및 레이블 제공 참조).

    JSF가 동일한 번들에 대해 여러 파일을 검사하는 유일한 상황 (알고있는 것)은 여러 로케일에 번들을 제공하는 경우입니다 (현지화 된 메시지 및 레이블 제공 참조).

    f : loadBundle 태그를 특성 파일 대신 ResourceBundle을 확장하는 클래스로 지정하고 해당 클래스를 사용하여 여러 특성 파일을 참조 할 수 있습니다. 나는 그것을 전에 시도하지 않았다.

    또한 Seam을 사용하는 경우 여러 개의 '전역'번들을 등록 할 수 있으며 하나 이상의보기 (facelets)와 연결할 수있는 번들을 제공합니다.이 번들은 모두 메시지를 사용하여 참조 할 수 있습니다. # {messages.my_message} (여기서는 Seam 2의 경우 Seam 3에서 약간 다를 수 있음). 나는 그것이 당신이 무엇을하고 있는지 생각합니다.

  4. from https://stackoverflow.com/questions/6786618/using-multiple-resource-bundles-in-jsf by cc-by-sa and MIT license