Computing2010. 7. 18. 12:13

국제화와 지역화

(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>

[출처] I18N 다국어 처리|작성자 띠용희


다음은 해피타운에서 사용한 액션스크립트에서 구현한 것이다.


아래는 언어 설정 파일이다.

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)이라는 폴더를 만들어 저장한다. 이 과정을 반복하여 여러 언어 파일을 만들면 ResourcesLocalizable.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];




Posted by 버터백통