국제화와 지역화
(internationalization and localization)
국제화 : internationalization – I18N (‘I’ + 18글자 + ‘N’)
현지화 : localization – L10N
[ 사전적 의미 ]
국제화와 현지화는 동일 문화권이 아닌 환경(특히 다른 국가나 문화)에서 만들어진 출판물이나 하드웨어 또는 소프트웨어를 특정 환경에 맞춰 적용하는 것을 의미한다. 두 낱말은 비슷한 주제를 다루지만 약간의 차이가 있는데, 국제화가 앞으로 가능성 있는 다른 환경을 지원할 수 있도록 하는 것이라면 현지화는 이미 존재하는 환경에 맞춘 기능을 지원하는 것이다.
[ 구현 ]
기술적으로는 어떻게 개발하느냐에 따라 미세한 부분들이 다르지만 공통분모는 지원하고자 하는 각 언어의 파일 번들/패키지를 생성하고 언어 선택하는 메서드를 구현하는 것이다.
일반적으로 속성파일을 구분하는 키는 언어의 경우 언어부호 ISO 639(kor/ko)에 의해 구분하며 국가는 ISO 3166-1(410/KOR/KR)에 의거하여 정하는 것이 일반적인 규범이다.(언어는 관례적으로 lowercase, 국가는 uppercase로 한다.)
자바의 경우 . properties 에 키와 값을 설정하고 필요한 때에
메서드에서 호출하여 println()하거나 JSTL을 사용하여 HTML에서 화면에 출력한다.
JSTL(JSP Standard Tag Library)을 이용한 예제를 가져와 봤다.
아래는 출력할 언어 번들(단지 영문/한글) properties파일이다
MessageResources_en_US.properties
com.rappstarr.board.title=Title
com.rappstarr.board.content=Content
com.rappstarr.board.titleNotValidate=Title is NOT validate.
com.rappstarr.board.contentNotValidate=Content is NOT validate.
MessageResources_ko_KR.properties
com.rappstarr.board.title=제목
com.rappstarr.board.content=내용
com.rappstarr.board.titleNotValidate=제목이 잘못 되었습니다.
com.rappstarr.board.contentNotValidate=내용이 잘못되었습니다.
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<c:if test="${MessageResources==null}">
<fmt:setBundle basename="MessageResources" var="messageResources"/>
</c:if>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>I18N</title>
</head>
<body>
<table>
<tr>
<td>
<fmt:message key="com.rappstarr.board.title" bundle="${messageResources}"/>
</td>
<td>
<input type="text"></input>
</td>
</tr>
<tr>
<td>
<fmt:message key="com.rappstarr.board.content" bundle="${messageResources}"/>
</td>
<td>
<input type="text"></input>
</td>
</tr>
</table>
<br/>
</body>
</html>
다음은 해피타운에서 사용한 액션스크립트에서 구현한 것이다.
아래는 언어 설정 파일이다.
package config.locale
{
import com.ahnlab.as3.utils.PO;
public class Message_ko_KR
{
public function Message_ko_KR ()
{
super();
}
public static function setMsgs():void
{
PO.initMsg("{1}coin","{1}코인");
PO.initMsg("Hello","안녕하세요");
PO.initMsg("Bye" , "가버려” );
}
}//end of class
}//end of package
영문(미국) 언어 설정
package config.locale
{
import com.ahnlab.as3.utils.PO;
public class Message_en_US
{
public function Message_en_US ()
{
super();
}
public static function setMsgs():void
{
PO.initMsg("{1}coin","you have {1}coin");
PO.initMsg("Hello","Hello~");
PO.initMsg("Bye" , "fuck out!” );
}
}//end of class
}//end of package
언어 번들에서 설정된 내용을 담아서 전역 접근하는 PO클래스
(관례적으로 키-벨류가 있는 파일(editable language packs)을 .PO 컴파일 되어서 사용이 빠른 번역문서가 담긴 파일을 MO(compiled versions)라고 한다고 한다.)
package com.ahnlab.as3.utils
{
public class PO
{
public function PO()
{
}
/***** msg po map *****/
private static var msg_map:HashMap = null;
public static function __(msg_id:String = "", ...args):String{
if(null == msg_map){
return msg_id;
}
var msg:String = msg_map.getValue(msg_id);
msg = (null == msg)?msg_id:msg;
if(null != args){
for(var i:int = 0; i< args.length; i++){
msg = msg.replace('{'+(i+1).toString()+'}',args[i]);
}
}
return msg;
}
public static function initMsg( key:*, value:* ):void
{
if( msg_map == null ){
msg_map = new HashMap();
}
msg_map.put( key, value );
}
}//class
}//package
아래는 메시지 ko_KR번역문을 출력하는 예이다.
trace( PO.__(“{1}coin” , 20 ) ) “20코인”
trace( PO.__(“Hello” ) ) “안녕하세요”
아이폰은 장치에서 국가를 지원하는데 genstrings를 이용하면 손쉽게 내용을 번역할 수 있다.
우선 지원할 언어를 정하면 프로젝트에서 Resources폴더에서 새로운 파일을 생성하되 반드시
Localizable.strings 이름으로 생성한다. 그룹관리는 저장위치에서 결정되는데 ISO 639에 의거한 언어코드.lproj(ko.lproj/ja.lproj)이라는 폴더를 만들어 저장한다. 이 과정을 반복하여 여러 언어 파일을 만들면 Resources에 Localizable.strings라는 그룹이 만들어지고 그 그룹안에 만든 언어의 ISO 639코드가 나타난다. 해당 언어파일을 열어 “키”=”값”으로 설정한다.
아래는 한글 번역 파일이다.
"WelcomeKey" = "안녕!!";
"ConfirmKey" = "확인";
"RegionKey" = "한국";
"ImageKey" = "kr.png";
이 과정을 마치고 번역이 필요한 곳에 NSLocalizedString(@"RegionKey", @"");와 같이 코딩하면
번역 문서의 내용이 입력되게 된다. 위의 경우 “한국”이라는 값을 출력하게 된다.
이러한 과정을 마치거나 키와 값이 추가되는 경우 genstrings을 이용하여 업데이트해야한다.
genstrings은 콘솔에서 해당 lproj의 하위에서 실행하거나 그 상위에서 적절한 경로를 이용하여 genstrings -o ./en.lproj/ *.m 을 실행시킨다. 그러면 사용된 .m파일에 해당되는 .o파일이 프로젝트 폴더 깊숙한 곳에 생성된다.
다음은 버튼과 라벨 이미지를 변경하는 코드이다
//라벨에 글자 설정
regionLabel.text = NSLocalizedString(@"RegionKey", @"");
//버튼 글자 설정
[confirmButton setTitle:[NSString stringWithFormat:@"%@",NSLocalizedString(@"ConfirmKey", @"")] forState:UIControlStateNormal];
//이미지 설정
UIImage *regionImage = [UIImage imageNamed:[NSString stringWithFormat:@"%@", NSLocalizedString(@"ImageKey", @"") ] ];
[imageView setImage: regionImage];