메뉴 건너뛰기

조회 수 2225 추천 수 15 댓글 6
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
Extra Form

1편 : http://itcm.co.kr/index.php?&mid=g_board&document_srl=7571389

 

이전편에서는 파일을 언팩하고 대사를 찾아 수정하는 부분을 다뤘습니다. 이번 부분에서는 폰트파일을 수정하여 이를 최종적으로 한글출력하는 부분을 다루겠습니다.

1편과 같이 어느정도 프로그래밍 지식에 이해가 있다고 가정하고 설명을 드립니다.

 

한글화에 관심이 있던 분이라면 폰트 테이블이라는 말을 많이 들어보셨을 겁니다.

무슨 말이냐면 게임 내장폰트 한자영역의 "丁"의 비트맵을 수정해서 "丁"을 호출하면 "가"가 출력되도록 하는겁니다.

(가 = 丁 와 같이 대응되는 표를 만들어주는 걸 말합니다)

 

ex) E4 B8 81 로 글자 호출 -> 해당 글자를 화면에 출력 -> 원래는 丁가 출력되야하나 수정된 비트맵 '가'가 출력


프로그램은 E4 B8 81이 丁이라고 알고있지만 해당 주소에 있는 실제 이미지는 '가' 인것입니다.

물론 폰트에 대한 분석을 한 후 1:1 대응이 되도록 할 수도 있지만 그 부분은 쉽지 않으니 쓰는 방법입니다.

 

아무튼 한글화를 할 떄의 어려움이 한글은 조합에 의해 엄청난 수의 글자가 만들어진다는 겁니다.

보통 2350자를 완성형 글자의 기본으로 보고 있습니다.

2350자를 다 준비하면 좋겠지만 폰트에 할당할 수 있는 공간이 부족하다면 최저한의 글자로 테이블을 만들 필요가 있습니다.

 

저 같은 경우는 시나리오 파일의 텍스트를 모두 추출해서 파파고 API를 통해 기계번역을 뽑아낸 다음, 한식구에서 배포하는 통합유틸리티(MES)를 사용해 한글테이블을 만들었습니다.
이 프로그램은 텍스트파일에서 사용된 글자만 뽑아내는 기능이 있습니다. 다운로드 및 자세한 설명은 아래 링크를 참고해주시기 바랍니다.

 

             https://cafe.naver.com/hansicgu/796

 

그리고 게임마다 다르지만 대개는 게임이 유니코드 미지원이거나 내장폰트에 한글이 빠진 경우가 다수입니다.

그래서 내장폰트 같은 경우에는 CrystalTile이란 툴을 통해 폰트를 읽고 수정하게 됩니다.물론 이 프로그램이 짜잔-하고 한번에 사람이 인식가능한 모습으로 글자를 보여주진 않습니다.

 

사용자가 offset값, 한글자가 차지하는 타일의 폭,너비를 지정해줘야만 합니다.폰트 분석같은 경우는 한번에 되는 것이 아니라 경험 +이것저것 시도해보며 찾는 과정이 필요합니다.
BlueReflection 같은 경우는 *.g1n 확장자의 폰트를 쓰고 있으며 CrystalTile에서 offset : 8EA67, 크기 : 48x48, 타일셋은 N64 라는 걸 확인했습니다. CrystalTile의 자세한 설명이나 단축키 등은 검색을 통해 알아보시길 바랍니다.

 

아무튼 한글 테이블이 준비되었다면 이에 대응하는 사용자 테이블이 필요합니다.
중요한 건 폰트파일에서 한자영역이 있는 걸 발견했다면 이 한자영역이 어느 순으로 배열된건지를 알아야합니다.

한글자씩 사전 검색해가며 찾을 순 없으니깐요. 
물론 게임에 따라 필요한 한자만 쓴 경우고 규칙성이 없다면 답이 없습니다.한글자씩 알아내며 테이틀을 만들거나 OCR기능을 이용할 수 도 있습니다. (OCR기능으로 완벽히 뽑아내긴 힘듭니다) 게임에 따라 중국어폰트가 있고 CJK 폰트를 가감없이 쓴 경우라면 아주 쉽습니다. 한자영역이 아주 크고 단순히 1씩 증가하는 유니코드값을 입력하면 되거든요. 이런 표준 테이블은 인터넷 검색을 하면 쉽게 찾을 수 있습니다.

 

블루리플렉션의 경우에는 감사하게도 스팀포럼에 현지화하라며 누군가 g1n폰트 파싱 결과를 파일로 올려놓았더라구요. 
아래와 같은 형식의 파일입니다. 각줄의 맨앞은 유니코드값으로 저는 이 파일과 추출해놓은 한글목록 파일을 이용해 테이블을 만들었습니다. 보시면 모든 한자를 쓰지않는 걸 알 수 있습니다. 이게 JIS표준인지 뭔지 잘 모르겠더군요.

 

4e01 -  30 30 00 2e 30 e8 00 30 80 a4 05 00 - 0a7638 (24x48)
4e03 -  30 30 00 2f 30 e8 00 30 00 a9 05 00 - 0a7ab8 (24x48)
4e07 -  30 30 00 2d 30 e8 00 30 80 ad 05 00 - 0a7f38 (24x48)
4e08 -  30 30 00 2d 30 e8 00 30 00 b2 05 00 - 0a83b8 (24x48)

(.........)

 

제가 c#으로 제가 짠 코드는 아래에서 간단하게 설명하겠습니다.

우선 파일에서 뽑아낸 결과를 저장하기위한 구조로 딕셔너리 리스트를 사용했으며 key에는 한글, value에는 한자를 저장하기로 했습니다.

private static List<Dictionary<string, string>> ListDic = new List<Dictionary<string, string>>();

 

이상하게 VS Code에서 복사하니 서식이 다 깨져서 탭이 다 사라졌네요; 코드가 짧으니 보기 불편해도 이해해주세요.

먼저 한글 목록(완성형 2350자가 저장된 파일)을 한줄씩 읽어 key값에 먼저 저장합니다.

private static void MakeFontTable()
{
string path = null;
 
path = "../../../../KorFont.tbl";
StreamReader sr = new StreamReader(path, Encoding.GetEncoding("utf-8"));
 
int nCount = 0;
 
while (!sr.EndOfStream)
{
string strHangul = sr.ReadLine();
 
ListDic.Add(new Dictionary<string, string>());
ListDic[nCount].Add(strHangul, null);
nCount++;
}
 
UnicodeToString();
 
WriteFontTable();
}

 

그런다음 g1n폰트의 파싱값에서 필요한 정보인 유니코드만을 분리하여 value에 저장합니다.

private static void UnicodeToString()
{
string path = @"../../../../parse_g1n.en";
 
StreamReader sr = new StreamReader(path, Encoding.GetEncoding("utf-8"));
 
int nCount = 0;
 
while (!sr.EndOfStream)
{
if (ListDic.Count <= nCount)
{
ListDic.Add(new Dictionary<string, string>());
}
 
string s = sr.ReadLine();
string[] temp = s.Split('-');
 
var dictionary = ListDic[nCount];
 
foreach (KeyValuePair<string, string> kvp in dictionary)
{
temp[0] = (temp[0].Replace(" ", ""));
int code = int.Parse(temp[0], System.Globalization.NumberStyles.HexNumber);
string unicodeString = char.ConvertFromUtf32(code);
string convString = System.Uri.UnescapeDataString(unicodeString);
 
ListDic[nCount][kvp.Key] = convString;
break;
}
 
nCount++;
}
sr.Close();
}

 

코드에 상세설명이 없어도 간단하니 쉽게 이해하리라 봅니다.  아무튼 이걸 새로운 파일에 한글=한자 와 같은 식으로 씁니다.

이후에 이 파일을 읽을 땐 = 를 구분자로 하여 파싱하면 되겠죠.

private static void WriteFontTable()
{
bool bIsApend = false;
string destFilePath = @"../../../../FontTable.tbl";
StreamWriter wr = new StreamWriter(destFilePath, bIsApend, Encoding.UTF8);
 
foreach (var dictionary in ListDic)
{
foreach (var keyValue in dictionary)
{
// Key : hangul, Value = Kanji
string output = keyValue.Value + "=" + keyValue.Key;
wr.WriteLine(output);
}
}
 
wr.Close();
}

위 메소드 실행이 끝나면 폰트테이블 파일이 만들어집니다.

 

그리고 번역문을 한자로 변환하는 로직을 작성후에 원래 구조에서 length와 text만 교체해주면 됩니다.

private static string ReplaceStringTextData(string strText)
{
string strResult = "";
 
for (int i = 0; i < strText.Length; i++)
{
string ch = strText[i].ToString();
string convTemp = SearchList(ListDic, ch);
 
strResult += convTemp;
}
return strResult;
}
 
public static string SearchList(List<Dictionary<string, string>> ListDic, string strKey)
{
string strText = null;
 
for (int i = 0; ListDic.Count > i; i++)
{
if (ListDic[i].TryGetValue(strKey, out strText))
return strText;
}
 
if (str == null)
return strKey;
 
return strText;
}

 

새로운 스크립트를 쓰는 부분은 1편을 응용하시면 될겁니다.

이제 거의 다 되었습니다. 아직 폰트를 수정하진 않았으므로 게임에서는 한자만 나올뿐일겁니다.

 

크리스탈 타일을 통해 폰트를 수정해야합니다.

cry1.png

 

우선 타일영역에서 우클릭-폰트설정에서 나눔고딕에 28 정도의 크기를 설정해봅니다. 어떤 글자체와 크기가 어울릴지는 이것저것 바꿔보시길 바랍니다. 이대로 한글 타이핑을 하면 원본글자가 이상하게 바뀌는걸 볼 수 있습니다. 

 

다음은 팔렛트 설정이 필요합니다. 팔렛트를 조합으로 두고 글자색과 배경색을 지정해줍니다.

저 같은 경우 3번째 팔렛트 줄을 선택 후 문자는 맨 오른쪽 검은색, 배경과 음영은 맨 왼쪽색을 지정했습니다.

그런 다음 다시 한글타이핑을 하시면 깔끔하게 글자가 바뀌는걸 볼 수 있습니다.

 

다만 이렇게 한글자씩 쳐서 몇천자를 입력할 수는 없겠지요... 

CTRL + T를 눌러 폰트삽입을 한번에 하도록 하겠습니다.

 

cry3.png

위에서 만든 폰트테이블 파일을 불러옵니다. 위 그림에 나온건 아란드 아틀리에를 위해 만든 CJK폰트테이블이지만 만든 테이블에 따라 입력은 다를 수 있습니다. 아무튼 열기를 하면 짠-한번에 한글 수천자가 입력이 되는걸 보실 수 있습니다.


이제 폰트 저장을 하고 게임에시 확인하면 한글출력이 되는 모습을 볼 수 있습니다!

 

가능한 스압을 피하려고했는데 많이 길어졌네요. 설명이 부족하면 후에 보충하도록 하겠습니다.

글쓴이 님의 최신글
  1. 2020-06-30 22:17 요청게시판 > 문의
  2. 2020-06-30 20:44 이야기 > ITCM 떠나기 전 인사드립니다. *68
  3. 2020-06-30 04:47 이야기 > 스압)아이마스 원포올 오늘 플레이 *2
  4. 2020-06-30 02:23 이야기 > 콘솔겜 가격정보 사이트 (PS,스위치,엑박 등) *11
  5. 2020-06-30 00:36 이야기 > 아; 출석 하루 빠졌었네요. *9

Who's RuTel

imrutel.png

 

[시스템정보]

Samsung Odyssey Gaming Laptop NT800G5S-XD71A

I7-7700HQ, 16G RAM, GTX 1060

Intel E3-1230 V2, ZOTAC GTX 1070 Mini

ASRock Z77 Extreme4Memory 8G (4G X 2)

 

64-bit Windows 8.1, Antec VP650P V2
Samuel 17 @ COUGAR DUAL-X 120mm White LED FAN


SSD Crucial MX100 256GB @ SanDisk X110 128GB @ SanDisk U110 32GB

Corsair Carbide Series Air 540, Samsung U32h850 , Razer Marauder, XENICS STORMX M2

▼ 펼쳐 보기
Atachment
첨부 '3'
  • profile
    흘러간옛게임 2019.04.03 16:06

    한글화도 정말 아무나 하는 것이 아니군요. 비주얼 노블은 영문 스크립트만 뜯어고쳐서 할수라도 있지만 이런 작업은 정말 기술이 필요한 능력자의 영역인 것 같네요.

  • ?
    RuTel 2019.04.03 19:01
    뭔가 복잡해보이지만 사실 능력보다는 관심과 열정이 필요한게 한글화같습니다. 물론 게임에 따라 상당한 리버스엔지니어링 지식을 요구하는것도 있지만 아직 그 정도 수준은 못되네요.
    틈틈히 공부해서 나중엔 좀 더 어려운 것에 도전하려합니다.
  • profile
    Medusa 2019.04.03 17:48
    검수... 도와드려야하는데 죄송합니다
  • ?
    RuTel 2019.04.03 18:58
    저야말로 번역 늦어서 죄송합니다.
    어차피 즐기라고있는겜인데 여유되고 하고싶을때하셔야지요
    혼자 다 검수못할거같아서 (도입부를 못해도 서른번은 봤습니다) 베타판 배포라도 할까 싶습니다.
  • profile
    JunkLife 2019.04.03 18:04

    MES 프로그램 덕분에 처음 알았네요.

    감사합니다.

  • ?
    RuTel 2019.04.03 18:55
    참 유용하고 잘 만들어진 프로그램입니당

List of Articles
분류 제목 게임 글쓴이 날짜 조회 추천
공지 ITCM <스팀그룹> 비공개 전환 안내 및 초대요청 2334 ITCM 08.24 112518 47
꿀팁 [운영자 인증] ITCM 꿀팁정보 모음 (2017/3/16) 33 코코넛먹자 08.05 115492 68
공지 ITCM 내부 규정 안내 71 file ZardLuck 02.05 94687 89
질문 이번 스팀 겨울 세일 협동 게임 카테고리 2 file 기모 12.25 717 0
잡담 섬궤랑.. 엘든링 YS9 다 샀습니다. 6 GREENLIGHT 12.24 795 3
소개 올해 크리스마스에도 오퍼를 주네요 2 file 찌부리짜부리 12.24 909 5
잡담 메타크리틱 선정, 2021년 최악의 비디오 게임 10선 9 file 이부프로펜 12.24 1322 9
질문 에픽 스타워즈 오더의 몰락 질문이 있습니다. 2 rusiyan 12.23 647 1
잡담 혜자같긴하지만 구조적으로 답답한 게임패스.. 6 촉수금지 12.23 1358 3
잡담 세일은 시작했는데 2 백도진 12.23 155 0
잡담 다들 건강하세요 아프니 슬픕니다. 19 file rusiyan 12.23 739 21
잡담 레데리2 만원 핫딜 패치되서 실행문제 없습니다. 9 Rs 12.23 298 3
잡담 잇셈 포인트로 nas 팬 바꿨습니다. file myco 12.22 374 3
질문 고음질 최신곡 mp3 다운로드 사이트 추천 가능한가요? 5 75729917 12.22 1195 1
잡담 깔맞춤 완성했습니다.. 7 file RizeWave 12.22 557 4
질문 스팀이 왜 겨울 세일을 안 할까요? 4 Vertigo 12.22 1339 0
모집 어몽어스 '멀티 도전과제' 같이 하실 분들을 찾습니다. 준이 12.21 401 2
잡담 히트맨3의 미스테리 6 촉수금지 12.21 788 2
잡담 와치독스 리전의 경우 블러드라인만 구입하면 될까요 2 YS 12.21 927 1
잡담 레데리2 만원 핫딜이 떴네요,일부 유저는 5천원(에픽... 12 hongE 12.21 7758 9
질문 리모트 플레이 음성이 안들리는 문제 해결법 있을까요... 도끼 12.21 1099 0
잡담 it takes two 후기 12 file 메타몽 12.20 1106 4
잡담 소니와 스쿠애니 파판7R 플스판 화끈한 뒤통수 시전 -0- 4 촉수금지 12.20 780 4
잡담 강렬한 벨트스크롤 액션 게임 후기 - Mother Russia B... 6 file 이부프로펜 12.20 679 11
잡담 XBOX 20주년 기념 6부작 다큐멘터리 시리즈 4 RizeWave 12.19 613 9
잡담 FF7R 스팀판 확인 되었네요. 1 GREENLIGHT 12.19 814 2
잡담 엘든링 예구를 할지 섬궤4를 살지 고민되네요. 4 GREENLIGHT 12.19 424 1
잡담 GTA 온라인 신규 업데이트 체험 외 이런저런 겨울행사... file greenhuman 12.18 958 14
Board Pagination Prev 1 ... 51 52 53 54 55 56 57 58 59 60 ... 2765 Next
/ 2765
CLOSE

SEARCH

CLOSE