본문 바로가기

Dev/Framework

다국어 Message Resource 브라우져 언어 / 파라미터 처리 설정 #2

728x90

지난번 설정(하단에 다시 표기 되어 있음)으로 다국어 Resource 적용은 완벽하게 되었다고 생각했다.

ㅇ ㅏ...그런데 이게 웬일인가요. 요청 언어 코드, 반환 언어 코드, 화면 표시 언어 모두 따로 놀고 있었다.


EL 태그를 사용해서 다음을 출력 해 보았다.


#1. 첫번째 테스트

${pageContext.request.locale} = en_GB

${pageContext.request.locale.language} = en

${pageContext.response.locale} = en

${pageContext.response.locale.language} = en

화면 표시 언어 = en


#2. 두번째 테스트

- 파라미터로 ?langCode=ko를 넘긴 경우

${pageContext.request.locale} = en_GB

${pageContext.request.locale.language} = en

${pageContext.response.locale} = ko

${pageContext.response.locale.language} = ko

화면 표시 언어 = ko


#3. 세번째 테스트 

- 파라미터로 ?langCode=de를 넘긴 경우

${pageContext.request.locale} = en_GB

${pageContext.request.locale.language} = en

${pageContext.response.locale} = de

${pageContext.response.locale.language} = de

화면 표시 언어 = ko


이게 어찌된 일인가?

파라미터로 넘긴 언어는 독일어,

http 요청 언어는 영어,

http 반환 언어는 독일어,

정작 화면 표시에 쓰여진 리소스를 읽어 올때는 한국어가 사용 된 시츄에이션.


테스트 진행 상, 

pageContext.request.locale 관련 내용은 브라우저 설정 언어에 따른다. 

현재, 내 브라우저 언어는 영국 영어로 설정되어 있기 때문에 locale= en_GB, 언어는 en으로 출력되는 것이다.


pageContext.response.locale 관련 내용은 스프링 기본 설정 언어나 파라미터로 넘긴 언어 설정에 따른다.


화면 표시 언어 화면 표시 언어는 도대체 왜 한국어로 나오는 거지?

별다른 파라미터가 없을 경우 영어를 기본 언어로 해 주기 위해서 설정 내용에

<!-- localeResolver 설정 -->

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">

<property name="defaultLocale" value="en" />

</bean>

를 표함 시켰는데 전혀 동작에 영향을 주지 못했다.


검색 결과, 

서버 시스템 로케일 설정에 영향을 받지 않도록 추가 설정이 필요하다는 것을 알았다.

화면 최 하단 아래 설정 내용 중, 다음 아래 붉은 색 부분을 추가 해 주면,

화면을 표시할 때 파라미터 언어 설정 리소스 파일이 존재 할 경우 해당 언어로 화면을 표시하며,

설정 언어 리소스가 없을 경우, 서버 로케일에 영향을 받지 않고

상단에 설정 한 것과 같이, 기본 설정 언어 리소스로 화면을 표시해 준다.


<!-- 언어 Message 파일 설정 -->

<bean id="messageSource"  

    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">   

<property name="basename" value="classpath:messages/messages" />   

<property name="defaultEncoding" value="UTF-8"/>   

        <property name="fallbackToSystemLocale" value="false"/>                                                </bean>   


 

※ 참고 설명

org.springframework.context.support.RealoadableResourceBundleMessageSource class contains a property called fallbackToSystemLocale, which can be used to override the default behavior ofjava.util.ResourceBundle. When the value of this property is set to false, the default resource file is used, when the resource file for the asked locale is not found.





#. Spring 3.0.7.RELEASE mvc-config.xml 파일 설정

.....

<context:component-scan base-package="com.prompt.serviceportal.sp" use-default-filters="false">

<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />

<context:include-filter type="annotation" expression="org.springframework.stereotype.Component" />

</context:component-scan>

<!-- Annotation기반 핸들러맵핑/어뎁터 설정 -->

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">

<property name="interceptors">

   <list>

<ref bean="localeChangeInterceptor" />

   </list>

</property>

<property name="order" value="0" />

</bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">

<property name="cacheSeconds" value="0" /><!-- @RequestMapping 메서드에 대해서 Cache를 제거한다. -->

<property name="messageConverters" ref="messageConverters" />

</bean>

<!-- Annotation기반 ExceptionResolver 설정 -->

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver">

<property name="messageConverters" ref="messageConverters" />

<property name="order" value="0" />

</bean>

<!-- ViewResolver 설정 -->

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/views/" />

<property name="suffix" value=".jsp" />

<property name="order" value="0" />

</bean>

<!-- 언어 Message 파일 설정 -->

<bean id="messageSource"  

    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">   

    <property name="basename" value="classpath:messages/messages" />   

    <property name="defaultEncoding" value="UTF-8"/>   

</bean>   

<!-- localeResolver 설정 -->

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">

<property name="defaultLocale" value="en" />

</bean>

<!--bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver" /-->

<!--bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" /-->


<!-- 언어 정보 파라미터로 받기 설정 -->

  <bean id="localeChangeInterceptor"

class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">

<property name="paramName" value="langCode" />

</bean>