scaleform.minarto.com

TranslateManager 본문

Utils & Liblary

TranslateManager

미나토 2012. 7. 30. 17:22


요즘 게임 중에 특정국가에서만 유통시키는 게임이 있을까요?


뭐 굳이 찾아보면 그런 게임이 있을 수도 있겠지만 거의 없다고 봐야죠...



게임에 있어서 다양한 언어를 지원하는건 당연한 일입니다...





1. 단순 단어번역




스케일폼도 로컬라제이션을 간편하게 구현하기 위한 방법을 지원합니다.



https://gameware.autodesk.com/developer/documents/sf_4.1_font_kr.pdf


이 문서에 보면 잘 나와있습니다.



간단하게 설명하자면 텍스트 필드에 특정한 id 값을 써놓으면 그 id 값과 바인딩된 문자열이 실제 렌더링 되는겁니다.



플래시


textField.text = "@@inventory";




fontconfig.txt


[FontConfig "English"]

tr  "@@inventory" = "Inventory"


[FontConfig "Korean"]

tr  "@@inventory" = "가방"



뭐 이런식으로 만들어놓으면 영문버전에는 textField 에 자동으로 "Inventory" 라고 렌더링 되고, 한국버전에는 "가방"이라고 렌더링 되는거죠





2. 번역 유무 설정



여기까지는 문서대로만 작업하면 딱히 문제가 없습니다만...


만약 어떤 친구가 저에게 게임상으로 메일을 보냈다고 치죠...


내용에 "@@inventory" 라고 썼다면 어떻게 될까요... 


그냥 번역되어 "가방" 이라고 나옵니다... 유저가 무슨 글을 입력할 지는 아무도 모르는거죠...



이게 원하던 결과였을 수도 있겠으나, 번역이 안되길 바랄 수도 있겠죠... 그럴 경우에는 as2의 경우에는 textField.noTranslate = true 라고 값을 주면 해당 텍스트 필드는 자동 번역 바인딩이 동작하지 않습니다.


단, 아직 as3 용으로는 해당기능이 구현되지 않은 것 같습니다.

아마 곧 구현될 것으로 보입니다.





3. 너무 빈번하게 일어나는 스케일폼과 클라이언트 간의 통신



2번의 문제 말고도, 두가지 이상의 단어는 번역이 안되는 일이 있습니다. 뭐, 이러다 보니 결국 클라이언트에게 번역값을 받아오거나 해야합니다.


그거야 뭐 ExternalInterface.call("translate", $msg) 뭐 이런식으로 간단하게 구현할 수 있다고 하죠... 클라이언트는 당연히 로컬라이징 기능을 만들어놨을 테니깐요...



하지만 특정 단어가 한군데만 들어가는게 아닙니다. 적게는 두세군데에서 많게는 수십군데에도 들어갈 수 있습니다.



그럴 때마다 클라이언트와 통신을 하는 것은 미련한 짓이죠...



그래서 간단한 캐시 기능이 포함된 TranslateManager 클래스를 만들어보도록 하죠





4. 간단하게 캐시 기능을 만들자



역시 그냥 코드 보여드리는게 낫겠죠?



public class TranslateManager {

private static var _dic:* = { };

public static function translate($msg:String):String{

var r:String = _dic[$msg];

if(!r){

r = ExternalInterface.call("translate", $msg);

_dic[$msg] = r;

}

return r;

}

}



더 이상 간단할 수가 없네요...



var r:String = _dic[$msg];

UI 개발자가 translate 함수를 호출하면 _dic 라는 해시맵에서 해당 인자(단어나 문장)를 키로 된 키값을 찾습니다


if(!r){

r = ExternalInterface.call("translate", $msg);

만약 값이 없다면 클라이언트에게 요청하여 번역된 값을 리턴받습니다.


_dic[$msg] = r;

그리고 그 값을 해당 인자로 키를 만들어 값으로 넣죠


return r;

그리고 리턴



그 다음부터 같은 단어나 문장을 호출한다면 통신을 하지 않고도 바로 해시맵에서 찾아서 리턴해주게 되는 겁니다.



실제 제가 회사에서 사용하는 코드도 동일합니다.

다른게 있다면 번역값을 없을 경우를 대비한 디버깅용 코드가 포함되어 있을 뿐입니다.









5. Season7 Complete


아무도 모르겠지만 이로서 시즌 7을 마칩니다!!!


몇몇 포스팅을 플생사모 (http://cafe.naver.com/ArticleList.nhn?search.clubid=10019103&search.menuid=200&search.boardtype=L) 에 올렸었는데 이번글까지 딱 70개가 되더군요...


Season 에 무슨 의미가 있다기 보다는 그냥 10개씩 묶다보니...


하지만 다음 Season8 부터는 의미를 두려고 합니다.



그래서 Season8 부터는 본격적으로 UI 개발 따라하기 강좌가 시작됩니다...




Comming Soon...