국제화와 지역화
위키백과 내용 - https://ko.wikipedia.org/wiki/%EA%B5%AD%EC%A0%9C%ED%99%94%EC%99%80_%EC%A7%80%EC%97%AD%ED%99%94
국제화와 현지화는 출판물이나 하드웨어 또는 소프트웨어 등의 제품을 언어 및 문화권 등이 다른 여러 환경에 대해 사용할 수 있도록 지원하는 것을 의미한다. 이때 국제화는 제품 자체가 여러 환경을 지원할 수 있도록 제품을 설계하는 것을 의미하며, 현지화는 제품을 각 환경에 대해 지원하는 것을 의미한다.
최자의 보물창고 블로그 내용(신빙성은 적을 수 있음) - https://jwchoi85.tistory.com/tag/internationalization
컴퓨터에서 국제화와 현지화 라는것은, 다른 언어와 지역적인 차이들을 소프트웨어에 적용시킨다는 것을 말합니다. 국제화라는 것은 여러가지 다른 언어와 지역적 차이들을 기술적인 변경 없이 소프트웨어에 적용할 수 있도록 설계하는 과정을 말합니다. 현지화 라는 것은 국제화가 된 소프트웨어에 특정 지역이나 언어에 대해서 지역특색의 컴포넌트를 추가한다거나 번역을해서 적용시키는 것을 말합니다
LocaleResolver 종류
- AceeptHeaderLocaleResolver (default)
- 브라우저의 언어값으로 사용하는 것
- HTTP 'Accept-Language' header값을 사용하는것
- setLocale()메소르드를 지원하지 않음 사용하면 UnsupportedOperationException 발생함.
-
Locale aceeptHeaderLocale = new HttpServletRequest().getLocale();
- CookieLocaleResolver
- 쿠키 기반의 로케일 정도를 사용하는 것
-
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver" >
<property name="cookieName" value="clientlanguage"/>
<property name="cookieMaxAge" value="100000"/>
<property name="cookiePath" value="web/cookie"/>
</bean> -
속성 설명
프로퍼티
설 명
cookieName
사용할 쿠키 이름
cookieDomain
쿠키 도메인
cookiePath
쿠키 경로, 기본값은 "/"이다.
cookieMaxAge
쿠키 유효 시간 (second), -1로 지정하면 브라우저를 닫을 때 쿠키를 지우겠다는 것
cookieSecure
보안 쿠키 여부, 기본값은 false 이다.
-
만약 저장된 쿠키값이 없어서 특정값으로 세팅하고자 한다면 defaultLocale 파라미터값을 세팅하면 된다.
- SessionLocaleResolver나 CookieLocaleResolver에 defaultLocale이 없다면 브라우저의 언어설정(AceeptHeaderLocaleResolver)을 따르게 된다.
- CookieLocaleResolver에 보면 몇가지 추가 세팅할 수 있는 값이 있음
- languageTagCompliant - Specify whether this resolver's cookies should be compliant with BCP 47 language tags instead of Java's legacy locale specification format. The default is false. Note: This mode requires JDK 7 or higher. Set this flag to true for BCP 47 compliance on JDK 7+ only.
- 위키백과의 내용과 같이 ko-KR과 같이 '_'가 아닌 '-'를 붙여서 표현하는 방식으로 쿠키값을 심을지 여부값 이다. true값이 되면 'ko-KR', 'en-US'와 같이 '-'가 들어간 형태로 cookieValue값이 세팅된다. springframework 내부적으로는 'ko_KR' 형식으로 사용하고 쿠키값(cookieValue)만 변경됨.
- languageTagCompliant 값에 따른 parsing하는 코드
- (isLanguageTagCompliant() ? Locale.forLanguageTag(locale) : StringUtils.parseLocaleString(locale))
- languageTagCompliant 값에 따른 parsing하는 코드
- Cookie 관련 정보(CookieGenerator class를 상속받아 cookie관련 설정값을 추가로 세팅 할 수 있음)
- HttpOnly (CookieGenerator.cookieHttpOnly에 있는 값을 상속받음.) - javascript에서 document.cookie로 cookie값을 조작할 수 없도록 하고 웹서버에서만 cookie값을 조작할 수 있도록 할지 여부 값, 참고 링크 https://nsinc.tistory.com/121
- secure (CookieGenerator.cookieSecure 에 있는 값을 상속받음) - HTTPS가 아닌 통신에서는 쿠키를 전송하지 않을지 여부 값. 참고 링크 https://nsinc.tistory.com/121
- 쿠키 기반의 로케일 정도를 사용하는 것
- SessionLocaleResolver
- 세션 기반의 로케일 정보를 사용하는 것
-
request가 가지고 있는 session에 있는 값을 가지고 오는 것
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" /> -
설정 예
-
<beans:bean id="localeResolver"
class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<beans:property name="defaultLocale" value="ko" />
</beans:bean>
-
SessionLocaleResolver나 CookieLocaleResolver에 defaultLocale이 없다면 브라우저의 언어설정을 따르게 된다.
- FixedLocaleResolver
- 웹 요청과 상관없이 defaultLocale 속성값을 사용는 것
-
FixedLocaleResolver는 setLocale() 메소드를 지원하지 않음 호출하면 UnsupportedOperationException이 발생함.
Locale 변경시
- LocaleResolver를 이용한 Locale 변경
-
LocaleResolver를 빈으로 등록했다면, 컨트롤러에서 LocaleResolver를 이용해서 Locale을 변경할 수 있게 된다. 예를 들어 다음과 같이 LocaleResolver를 설정했다고 하자.
-
<bean class="com.xxx.test.controller.LocaleChangeController">
<property name="localeResolver" ref="localeResolver" />
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
이 경우, 컨트롤러 클래스는 다음과 같이 LocaleResolver의 setLocale() 메서드를 호출해서 클라이언트의 웹 요청을 위한 Locale을 변경할 수 있다.
-
import org.springframework.web.servlet.LocaleResolver;
@Controller
public class LocaleChangeController {
private LocaleResolver localeResolver;
@Inject
public void setLocaleResolver(LocaleResolver localeResolver) {
this.localeResolver = localeResolver;
}
@RequestMapping("/changeLocale")
public String change(@RequestParam("language") String language, HttpServletRequest request, HttpServletResponse response) {
// Locale locale = (isLanguageTagCompliant() ? Locale.forLanguageTag(locale) : StringUtils.parseLocaleString(locale)) // <-- CookieLocaleResolver를 사용 하는 경우
Locale locale = new Locale(language); // <-- cookie가 아닌 다른 LocaleResolver를 사용하는 경우
// LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request); // <-- DI를 받지 않고 현재 request에서 LocaleResolver를 가져올 수 도 있음.
localeResolver.setLocale(request, response, locale);
return "redirect:/index.jsp";
}
}
LocaleResolver를 이용해서 Locale을 변경하면, 이후 요청에 대해서는 지정한 Locale을 이용해서 메시지 등을 로딩하게 된다.
ResolverContextUtils는 현재 request에서 LocaleResolver를 가져올 수 있음.
-
- LocaleChangeInterceptor를 사용하는 경우
- org.springframework.web.servlet.i18n.LocaleChangeInterceptor는 url를 통해서 언어를 변경할 경우 사용 아래와 같은 설정 상태면
-
<mvc:interceptors>
<beans:bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<beans:property name="paramName" value="lang" />
</beans:bean>
</mvc:interceptors>