메뉴 건너뛰기

조회 수 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 112536 47
꿀팁 [운영자 인증] ITCM 꿀팁정보 모음 (2017/3/16) 33 코코넛먹자 08.05 115506 68
공지 ITCM 내부 규정 안내 71 file ZardLuck 02.05 94701 89
소개 블루리플렉션 한글화 과정 [ 2 ] 6 file RuTel 04.03 2225 15
잡담 보드랜드3 출시일및 에픽스토어 독점 확정. 22 file 촉수금지 04.03 1116 14
일상 제로페이 쓰는 사람 있어요? 3 MachinaX(Machina) 04.03 448 1
스샷 캐서린 풀 보디 file Altiplano 04.03 694 3
잡담 [험블/지역제한]Bandai Namco Bundle 3 6 file 늑대와향신료 04.03 1835 9
꿀팁 유비스토어 구입시 안한글 게임. 4 왜냥 04.03 947 5
모집 스나이퍼 엘리트 4 멀티플레이 업적 도와주실분을 구... 3 루비틱 04.03 568 0
잡담 용과같이 극2 PC발매결정 소식!!! 4 file 엔틱군 04.03 1611 5
잡담 어렵긴 하군요...ㅋㅋㅋ file 준이베어 04.03 372 4
질문 이거 혹시 문제가 생길까요? 6 짱군이 04.02 551 0
잡담 (10mb, gif) 사슴 시뮬레이터 6 file RuTel 04.02 993 10
잡담 fanatical 수동승인 떠보신분 계신가요 5 file levi 04.02 926 0
잡담 닌텐도 스위치용 Satisfye ultimate gaming grip 사용... 7 file 촉수금지 04.02 785 2
질문 퍼즐요소가 적거나 없는 공포겜 있나요?? 2 댈러스규철 04.02 311 0
질문 스팀링크로 스팀에 없는 외부게임도 실행이 되나요??(... 7 ZONEKR 04.02 1592 0
잡담 리사수가 경력이 대단한 사람이네요 4 RuTel 04.02 843 5
잡담 보더랜드3도 에픽스토어 독점 루머가 있네요. 13 file 촉수금지 04.02 1057 8
잡담 루스벨트 아일랜드 맵 디자인 사람은 정말... 10 file Medusa 04.02 461 2
스샷 13기병 방위권 프롤로그 - 클리어 5 file Altiplano 04.02 738 3
소개 던전 헌터 5, 4월 스팀 입점 예정. file kerakera 04.02 846 6
잡담 먼슬리 노스가드. 7 Raingray 04.01 1188 14
잡담 어크3 리마스터 간단 소감. 6 촉수금지 04.01 1422 9
질문 번들스타에 페어리펜서 번들이 있는데요. 1 엘니뇨 04.01 349 0
잡담 저도 구입했습니다 ㅎㅎ 11 file 준이베어 04.01 611 8
잡담 월드 5가 기다려지네요 6 file Medusa 04.01 424 4
Board Pagination Prev 1 ... 354 355 356 357 358 359 360 361 362 363 ... 2765 Next
/ 2765
CLOSE

SEARCH

CLOSE