행복한 아빠

[Grails1.0 사용자 가이드] 10. 국제화 본문

Grails

[Grails1.0 사용자 가이드] 10. 국제화

행복한아빠 2008. 3. 12. 12:56


10. 국제화

Grails는 Spring MVC가 지원하는 국제화를 기반으로 뛰어난 국제화(i18n)을 지원한다. Grails로 어떤 뷰에 나타나는 텍스트든 사용자의 지역을 기반으로 커스터마이즈할 수 있다. 자바의 Local 클래스에 관한 javadoc을 인용한다.

Locale 객체는 특정 지리적, 정치적 또는 문화적 지역을 표현한다. 작업을 수행하기 위해 Locale이 필요한 연산자를 지역에 민감하다(locale sensitive)고 부르고 사용자를 위한 정보를 조정(tailor)하기 위해 Locale을 사용한다. 예를 들어 숫자를 보여주는 것은 지역에 민감한 연산자이다. 숫자는 사용자 원래 나라, 지역 또는 문화의 관습/관례에 따라 양식화(formatted)되어야 한다.

Locale은 언어 코드나라 코드로 이루어진다. 예를 들여 "en_US"는 US 영어이고 "en_GB"는 영국 영어이다.

10.1 메시지 번들의 이해
이제까지 locale에 대해 알아보았다. Grails에서 Locale의 잇점을 얻기 위해서는 메시지 번들을 생성해야 하는데 이것은 표현하고 싶은 서로 다른 언어를 가지고 있는 한다. Grails에서 메시지 번들은 grails-app/i18n 디렉토리 안에 있으며 단순한 자바 프로퍼티 파일이다.

각 번들은 약속에 의해 messages라는 이름으로 시작하고 locale로 끝난다. Grails는 grails-app/i18n 디렉토리 안에 있는 모든 범위의 언어를 위한 메시지 번들을 내장된 묶음들로 취급한다. 예를 들면

messages.properties
messages_de.properties
messages_es.properties
기타.

사용자가 특정 로케일을 지정하지 않는한 기본으로 메시지를 messages.properties에서 찾을 것이다. 추가하고자 하는 locale로 끝나는 새로운 프로퍼티 파일을 생성함으로써 간단히 고유한 메시지 번들을 생성할 수 있다. 예를 들어 messages_en_GB.properties는 영국 영어를 위한 것이다. (messages_ko_KR 한국.properties)

10.2 로케일 변경
기본으로 사용자 로케일은 들어오는 요청의 Accept-Language 헤더에서 찾는다. 어쨌거나 request 파라메터로 Grails에게 lang이라는 파라메터를 전달함으로써 간단히 로케일을 변경할 수 있다.

/book/list?lang=es

Grails는 자동으로 사용자 로케일을 바꾸고 이것을 쿠키(cookie)에 저장한다. 따라서 다음 request는 새로운 헤더를 갖게 된다.


10.3 메시지 읽기

뷰에서 메시지 읽기
메시지가 필요한 가장 일반적인 장소는 뷰 내부이다. 뷰에서 메시지를 읽기 위해서는 단지 message 태그를 사용한다.

<g:message code="my.localized.content" />

messages.properties(알맞은 로케일 접미어와 함께)안에 다음과 같은 키를 가지고 있으면 Grails는 메시지를 찾을 것이다.

my.localized.content=Hola, Me llamo John. Hoy es domingo.

어떤 경우는 메시지에 아규먼트를 전달할 필요가 있을지도 모른다. 이것도 message 태그로 가능하다.

<g:message code="my.localized.content" args="${ ['Juan', 'lunes'] }" />

그런 후 순서로 구분되는 파라메터(positional parameter)를 메시지 안에서 사용한다.

my.localized.content=Hola, Me llamo {0}. Hoy es {1}


컨트롤러와 태그 라이브러리에서 메시지 읽기
컨트롤러에서 태그를 메소드로 호출할 수 있기에 컨트롤러에서 메시지를 읽는 것은 간단하다.

def show = {
    def msg = message(code:"my.localized.content", args:['Juan', 'lunes'])
}

태그 라이브러리에서도 동일한 기법을 사용할 수 있다. 그러나 태그 라이브러리가 다른 네임스페이스를 가지고 있다면 g. 접두어를 사용할 필요가 있다.

def myTag = { attrs, body ->
    def msg = g.message(code:"my.localized.content", args:['Juan', 'lunes'])
}

---
원문: 10. Internationalization
0 Comments
댓글쓰기 폼