[iOS 한글화]plist 파일과 수정방법에 대해[iOS 한글화]plist 파일과 수정방법에 대해

Posted at 2012. 1. 29. 20:11 | Posted in 유용한 팁/정보/스마트시대

 강좌 개요

plist(Apple Property List) 파일을 수정하는 방법에 대해 알아보겠습니다.

 본 강좌

이전 강좌에서는 외부 언어 파일을 찾는 방법에 대해 알아보았습니다~
그렇다면 이제 수정을 해보아야겠지요?

이전 강좌에서 바이너리 plist에 대해 설명을 드렸는데. 바이너리 plist는 xml 파일로 되어있는 plist를 2진수 형태로 변경해둔 파일입니다.
xml 파일은 메모장 등에서 바로 편집이 가능하지만 바이너리 plist는 바로 수정할 수 없으며 바이너리 plist를 xml로 변환하고 수정을 한 뒤 다시 바이너리 plist로 변환을 해야만합니다.

이 변환을 위한 툴을 제작하였으며 아래에서 받으실 수 있습니다.

2012/01/29 - [한글화 강좌/Season 2] - [iOS 한글화]pList Converter

만약 Localizable.strings가 바이너리 plist가 아니라면 바로 텍스트 편집기로 수정해서 넣으시면 됩니다. 수정 방법은 아래를 참고하세요.


위 주소에서 프로그램을 받아주시고 찾아보기 버튼을 눌러 Localizable.Strings 파일을 지정하고 변환하기를 누른 뒤 저장합시다.

변환에 성공하면 위처럼 변환 완료라는 메시지가 뜨며 지정한 경로에 변환된 파일이 생성됩니다.
그럼 생성된 파일을 텍스트 편집기로 열어봅시다.

<key>~~~</key>와 바로 아래 <string>~~~</string> 라는 값이 연속적으로 보입니다.
key 값은 어플리케이션에서 불러올때 사용되는 값이므로 건드리시면 안되고 string 안의 텍스트가 실제로 출력되는 텍스트입니다.

일단 Login의 string 값을 로그인, Logout의 string 값을 로그아웃으로 바꾼 뒤 저장합니다.


그다음 pList Converter을 이용해서 방금 저장한 파일을 지정하고 다시 바이너리 pList 파일로 변환하여 Localizable.strings에 저장합니다.
(사실 바이너리 pList로 다시 변환을 하지 않아도 정상적으로 동작은 합니다.. 하지만 보다 안정적인 한글화를 위해서 바이너리 pList로 변환해주시는 것이 좋습니다.)


마지막으로 아이펀 박스를 이용해서 AppZapp의 경로에 ko.lproj 폴더를 생성하고 안에 Localizable.strings 파일을 넣습니다.

자 이제.. 마지막으로 변경이 되었는지 확인을 해봅시다.


영어로 Login이라고 되어있던 부분이 로그인이라고 나오는 것을 확인할 수 있습니다.



 강좌를 마치며

드디어 plist를 사용하는 iOS 어플의 한글화 강좌가 끝났습니다.
외부 언어 파일을 이용할 경우 쉽게 한글화가 가능하다는 점을 알 수 있었으며 바이너리 plist 파일을 수정하는 툴을 제작하게 되어 보다 손쉽게 한글화가 가능해졌습니다. 

다음 강좌에서는 외부 언어 바이너리 파일을 사용하는 어플의 한글화에 대해 알아보겠습니다.

궁금한 점이 있으시다면 언제나 메일 주시면 답변해드리도록 하겠습니다.
감사합니다. 

//

[한글화 강좌] 제 5장 - 포인터의 개념[한글화 강좌] 제 5장 - 포인터의 개념

Posted at 2011. 8. 29. 16:30 | Posted in 이전 카테고리/한글화 강좌 시즌 2
안녕하세요.
Hangeru 한글화 강좌 Season 2의 첫번째 강좌 게시물이군요 ^^;

이번 강좌에서는 포인터(pointer) 에 대해서 알아보겠습니다.








목차

포인터의 개념
게임 한글화에서의 포인터
포인터 찾기
    GBA(게임보이 어드밴스)
    PSP(플레이스테이션 포터블)
    GB(게임보이)

포인터의 개념

포인터는 사전적 의미로 무엇인가를 가리키는 것을 뜻하며 컴퓨터에서 사용하는 마우스 포인터, 프레젠테이션에서 사용하는 레이저 포인터도 화면의 무엇인가를 가리킬때 사용합니다.

이 포인터는 프로그램이나 게임에서도 같은 의미로 사용되는데 바로 데이터를 가리키는 주소값(번지)이라고 할 수 있습니다.
여기에서의 데이터는 대사, 그래픽, 프로그램 코드, 사운드 등 여러가지가 될 수 있겠지요.

포인터의 개념은 C언어 등에서도 필수적으로 배우는 부분이며 포인터에 대해 알면 게임 한글화에도 많은 도움이 됩니다.

그럼 포인터 값이 어떻게 저장되는가 알아보면...
컴퓨터나 게임기 등에서는 메모리나 저장장치에 주소를 부여하고 그 주소를 통해서 데이터를 불러옵니다.


위 그림을 보시면 안녕하세요 라는 대사는 0x100 번지에 저장되어 있습니다.(앞에 0x가 붙으면 16진수 라는 의미) 따라서 안녕하세요 라는 대사의 포인터 값은 0x100이 됩니다.(게임에 따라 포인터를 저장하는 방식이 다릅니다. 게임 별 포인터 구조는 하단에서 다룹니다.)

게임 한글화에서의 포인터

그럼 게임 한글화에서는 포인터가 어떻게 사용될까요?
게임 한글화를 도전해보신 분들이라면 대사 공간이 부족해서 대사 줄이기가 필요한 경우가 있으셨을 겁니다.
이는 포인터에 있는 번지의 저장 공간이 제한되어 있거나 뒤쪽에 데이터가 있어서 넘어가면 안되기 때문인데 이럴 때 포인터를 변경하면 쉽게 한글화를 할 수 있습니다.

100평짜리 창고가 있다고 예를 들어봅시다.
이 100평 짜리 창고에는 17인치 모니터가 50개, 21인치 모니터가 50개 들어있습니다.
그리고 이번에 17인치 모니터를 모두 빼내고 27인치 모니터를 50개 넣으려고 합니다.
하지만 이 창고에는 17인치 모니터가 50개 들어갈 공간밖에는 남아있지 않습니다.
이럴 때는 다른 창고에 모니터를 넣어야겠지요?

한글화에서도 마찬가지입니다.
히라가나/가타카나를 1바이트로 사용하는 게임에서  "ありがとう"라는 대사가 있다면 한글로 "고마워"라고 입력해야하는데 일본어는 총 5바이트이고 한글은 각각2바이트 총 6바이트가 되어 1바이트 공간이 부족하군요. 이럴 때에 대사 위치를 다른 곳으로 옮기고 포인터 값을 수정해주면 대사를 줄일 필요 없이 한글화가 가능하게 됩니다.

포인터 찾기

게임에서 실제로 대사, 폰트, 포인터를 찾는 건 구조가 게임마다 다르므로 강좌만 보고는 알 수 없는 부분입니다. 하지만 하드웨어 특성에 따라 게임기 별로 자주 사용되는 포인터 방식이 있습니다.
이번 강좌에서는 이 자주 사용되는 포인터 방식 몇가지를 소개해드리겠습니다.

GBA(게임보이 어드밴스)
게임보이 어드밴스는 포인터 찾기 쉬운 게임 기기 중 하나입니다.
게임보이 어드밴스에서는 카트리지에서 데이터를 불러올때 카트리지 주소값에 [0x8000000]을 더해서 불러옵니다.
즉 롬파일의 0x100 번지의 값을 불러올때 실제로는 0x8000100 의 값을 불러오는 것이지요.
따라서 GBA의 포인터 값에는 실제 주소값에 [0x8000000]이 더해져 있습니다.
그리고 데이터는 모두 바이트 플립되어 있으므로 [0x100]의 포인터 값을 찾으려면 [0x00010008] 으로 검색하면 됩니다.

그럼 실제 게임에서 찾아 보겠습니다.
예제는 포켓몬스터 에메랄드 일본어판 입니다.
(모든 GBA 게임이 아래와 같은 포인터 구조를 사용하는 것은 아니며 게임 내에서도 여러가지 포인터 구조를 사용하기도 합니다.)



대사 いや- おまたせ おまたせ!를 롬 파일을 열어 찾습니다.
 

대사의 주소값은 0x277095 이군요.
그렇다면 이 값에 0x8000000 을 더하고 바이트 플립시키면 포인터 값은 0x95702708 이 됩니다.

95702708으로 검색하면 포인터가 나옵니다.

대사 공간이 부족해서 다른 곳으로 옮기려면 새로운 공간에 대사를 입력하고..

새로운 주소값인 0x08915900을 바이트 플립해서 입력한 뒤..

게임을 시작하면 짜잔! 대사가 바뀐 것을 보실 수 있습니다.

PSP(플레이스테이션 포터블)
강좌 준비중입니다...

GB(게임보이)
강좌 준비중입니다...
//

[게임 한글화 특별 강좌]NFTR 폰트에 대해 알아보기! 제 1편[게임 한글화 특별 강좌]NFTR 폰트에 대해 알아보기! 제 1편

Posted at 2011. 5. 18. 01:27 | Posted in 이전 카테고리/한글화 강좌 시즌 1
오랜만에 쓰는 한글화 강좌입니다~

NFTR 폰트에 대해 궁금해 하시는 분들이 많아서 특별 강좌를 작성합니다.


추천은 블로깅에 큰 도움이 됩니다!
손가락 한번 꽉 눌러주세요!


본편에서도 말씀드렸듯이 NFTR 폰트는 Nitro FonT Resource의 약자로 닌텐도 DS SDK(닌텐도 DS 게임 개발 키트)에서 제공하는 표준 폰트 방식입니다.

따라서 개발자가 닌텐도 DS SDK 표준을 따른다면 NFTR 폰트를 사용할 것이고 그렇지 않다면 다른 폰트를 사용하게 됩니다.

그렇다면 NFTR 폰트는 어떻게 이루어져 있는가 알아봅시다.

NFTR은 폰트 헤더, 파일 정보 헤더, 폰트 이미지, 폰트 너비, 폰트 맵(테이블) 총 5가지 영역으로 구성되어 있습니다.
(다만 같은 영역이 여러개 존재합니다.)
폰트 헤더 영역에는 각 영역의 위치 정보와 파일 크기, 헤더 크기, 파일 갯수등의 정보가 들어있습니다.

NFTR 폰트의 헤더 영역입니다.

NFTR 파일임을 알려주는 RTFN 매직스탬프(바이트 플립이므로 거꾸로하면 NFTR)와 코드가 들어있고 파일의 크기와 헤더 크기, 포함된 파일 갯수 등의 정보가 들어있습니다.

NFTR 폰트는 단순 파일이 아니라 여러가지 파일이 패키징 되어있는 형태입니다.
즉 파일 정보 헤더, 폰트 이미지, 폰트 너비, 폰트 테이블등이 모두 별개의 파일이지만 패키징 되어 하나처럼 보이는 것입니다.

또한 모든 값인 바이트 플립(Byte Flip)화 되어있는데 바이트 플립이란 데이터를 거꾸로 배열하는 것을 말합니다.
즉 0x00 0x30 0x25 0x10 이라는 값이 있다면 0x10 0x25 0x30 0x00 이렇게 바이트 단위로 잘라 거꾸로 저장하게 됩니다.
이유는 컴퓨터가 데이터를 읽을 때의 방식 때문이지만 자세히 설명하지는 않겠습니다.

다음은 파일 정보 헤더를 보겠습니다.

정보 파일은 FNIF(바이트 플립이므로 실제로는 FINF, File Information)로 시작하며, 각 데이터 영역의 위치와 기본적인 폰트 정보가 들어있습니다.
(0x1E-0x1F는 출력시 실제 폭과 색상에 관한 데이터 같으나 확실하지는 않습니다.)
폰트 이미지 데이터의 값이 0x34, 0x00 , 0x00, 0x00 이므로 거꾸로하면 0x00000034(0x34)가 됩니다.
단 실제 위치는 각 데이터 값에서 0x08 만큼을 빼주어야합니다.
0x34 - 0x08을 하면 0x2C가 되고 0x2C의 데이터를 보시면 PLGC라는 값이 보이는데 이것이 바로 이미지 데이터의 헤더입니다.

물어보신 분들이 정확히 어느 부분이 궁금하신지 몰라서 우선 1편은 여기에서 끊도록 하겠습니다.
이 부분까지 이해하셨다면 뒤부터는 이해하기 쉬운 편이므로 추가로 궁금하신 사항이 있으신 분들은 댓글 남겨주시기 바랍니다.

뒤 강좌는 이후 남기도록 하겠습니다.

//

[게임 한글화 강좌]제 4장 - 게임 분석하기 3편[게임 한글화 강좌]제 4장 - 게임 분석하기 3편

Posted at 2011. 4. 9. 19:30 | Posted in 이전 카테고리/한글화 강좌 시즌 1


본 강좌의 무단 스크랩을 금지합니다.
문의사항은 댓글 또는 mingi2007@gmail.com 으로 메일 주십시오.


4장, 실전 강좌 2편에서는 실제로 게임의 대사를 바꾸는 방법을 알아보겠습니다.
실전 강좌 1편과 연결되는 내용이므로 읽지 않으신 분들은 반드시 1편을 읽어보시기 바랍니다.

 

우선 크리스탈 타일2로 롬파일을 열고 이전 강좌에서 보쿠관DS는 Shift-JIS 인코딩을 사용한다는 점을 알았으므로 인코딩을 일본어(Shift-JIS)로 설정합니다.

한국어[GulimChe]라고 되어있는 부분을 클릭하면 윈도우에서 지원하는 기본 인코딩들의 목록이 나타납니다.
(한글 윈도우에서는 기본적으로 한국어라고 설정 되어있으며, 한글화 하려는 롬파일이 한국어 인코딩으로 되어있는 경우는 없습니다 ^^;)

에뮬레이터로 원본 롬파일을 열고 수정하려는 대사를 찾습니다. 

그 다음 크리스탈 타일에서 Ctrl+F를 누르고 수정하려는 대사를 입력합니다. 


위 이미지처럼 수정하려는 대사가 검색됩니다.
만약 검색되지 않는다면 인코딩이 맞지 않거나 대사 파일이 압축되어 있는 경우입니다. 

그럼 이제 대사를 수정해보겠습니다

대사를 수정하려면 한글 테이블을 불러와야합니다.
한글 테이블을 불러오기위해 TBL -> TBL 사용을 누르고 불러올 테이블 파일을 선택합니다.

 
보쿠관DS에 사용할 한글 테이블 파일을 첨부합니다.

이전 강좌에서 받은 테이블과는 다르게 띄어쓰기나 문장부호등의 코드가 추가되어 있으므로 새로 받으시기 바랍니다.

한글 테이블을 불러온 뒤 해당 대사 위치에 한글을 입력하고 저장합니다.
대사를 입력할때 주의할점은 대사 길이가 원본보다 늘어나면 안된다는 점입니다.

만약 대사 길이를 원본보다 더 길게 입력해야할때는 포인터라는 것을 수정해야합니다.
이 포인터에 대해서는 이후 강좌에서 알아보겠습니다.

또 주의점은 대사의 끝에는 항상 대사의 끝을 알려주는 종료 코드가 들어가야합니다.
일부 게임의 경우 대사 길이값이 따로 주어지는 경우도 있지만 종료 코드가 존재하는 게임이 많습니다.

일반적인 S-JIS인코딩을 사용하는 게임에서는 대부분 [0x00]이 종료코드로 사용됩니다.
대사가 끝나는 부분에 헥스코드로 00을 입력합시다.

한글 입력 성공!

대사를 수정하고 에뮬레이터로 불러오면 아까 입력했던 대사가 나오는걸 보실 수 있습니다!
수정하고 대사가 바뀌지 않는다면 다른 곳에도 같은 대사가 존재하는 경우입니다.(흔히 낚시 대사라고 하는 경우이거나 중복된 대사가 있는 경우입니다. ^^;)

이번 실전 강좌에서는 실제로 한글화 하는 과정에 대해 소개해드리기 위해 간략하게 설명하였습니다.
보쿠관DS를 강좌에 선택한 이유는 우선 폰트와 대사가 압축되어 있지 않고, 파일 구조가 표준 타입이며 비교적 간단하기 때문입니다.
모든 게임이 이렇게 간단하면 좋겠지만 실제로 게임중에는 표준 타입을 사용하지 않는 게임이 훨씬 많습니다.
따라서 많은 게임을 뜯어보고 여러가지 파일 구조를 많이 접하게 되면 노하우 등이 생기게 되므로 많이 시도해보시면 좋습니다~

그럼 이 다음 강좌에서는 위에서 말씀드린 포인터에 대해 알아보겠습니다.
이 포인터라는 것은 C언어를 배우실때 배우는 포인터와 같은 개념으로 대사의 위치를 저장하고 있는 주소값입니다.

다음 강좌도 기대해주시기 바랍니다~

//

[게임 한글화 강좌]제 3장 - 게임 분석하기 2편[게임 한글화 강좌]제 3장 - 게임 분석하기 2편

Posted at 2011. 4. 1. 14:30 | Posted in 이전 카테고리/한글화 강좌 시즌 1


본 강좌의 무단 스크랩을 금지합니다.
문의사항은 댓글 또는 mingi2007@gmail.com 으로 메일 주십시오.


3장은 드디어 실전 강좌입니다.

우선 필요한 준비물은 아래와 같습니다.

한글화 프로그램 CrystalTile 2
테스트를 위한 게임기 또는 에뮬레이터
한글화 하려는 게임의 롬 파일
가장 중요한 끈기와 열정

이외에도 필요한 것은 많지만 분석시에는 기본적으로 위에 4가지가 필요합니다.

준비물을 준비하셨다면 일단 크리스탈 타일 2를 실행해봅시다.
 

크리스탈 타일 2 실행 화면


크리스탈 타일은 중국에서 중문화를 위해 만들어진 프로그램으로 롬 파일의 분석에 아주 유용합니다.
크리스탈 타일 2에서는 여러가지 표준 파일 타입 자동읽기, 에뮬레이터와의 연동기능 , ASM 뷰어, LZ77압축 등의 다양한 기능을 지원하고 있습니다.

우선 데이터를 여러가지 모드로 볼 수 있는데 헥스 모드와 그래픽 모드가 있습니다.

크리스탈 타일 2의 헥스 모드


헥스 모드는 주로 데이터를 분석할때 사용되며 게임 데이터를 16진수(헥스)와 인코딩으로 변환해서 보여줍니다. 인코딩은 기본 인코딩사용자 정의 테이블 파일(tbl)를 지원하기 때문에 고유번호만 알면 헥스 코드를 일일히 수정하지 않아도 텍스트를 입력하면서 수정할 수 있습니다.

크리스탈 타일 2의 그래픽 모드


그래픽 모드는 롬 파일 내에 저장된 폰트나 그래픽을 찾을때 사용하며 크리스탈 타일 이전에는 yy-chr이라는 프로그램도 사용되었지만 최근에는 크리스탈 타일로 쉽게 볼 수 있고 추출/수정도 간편합니다.
또한 팔레트는 pal 파일 형식을 지원하며 롬 파일내의 팔레트 데이터를 읽는 기능도 지원합니다.
또한 폰트 삽입 기능도 지원합니다.

그럼 이제 파일 -> 열기로 닌텐도 DS 게임의 롬파일을 열어봅시다.
이 강좌에서는 폰트와 대사를 바로 찾을 수 있는 보쿠관DS(항공관제관DS)를 열어보았습니다.

NDS 파일시스템 정보 창


크리스탈 타일2는 닌텐도 DS의 파일시스템을 인식하여 자동으로 정보를 보여줍니다.
위 이미지처럼 파일시스템 정보 창이 뜨면 어떤 파일이 들어있는지를 알 수 있습니다
게임에 따라 파일 하나에 뭉쳐있는 경우도 있고, 가상 DS롬이 하나 더 들어가있는 경우도 있습니다.
 
만약 파일시스템 정보 창이 뜨지 않는다면 CTRL+N을 누르거나 도구 -> NDS 파일시스템 정보로 띄울 수 있습니다. 도구 - > NDS 파일시스템 정보가 비활성화 되어 있다면 정상적인 닌텐도 DS롬이 아니므로 롬 파일이 올바른지 확인해보시기 바랍니다.

파일 시스템 정보 창이 떴다면 목록보기에서 디렉토리를 눌러봅시다.


파일시스템 정보 - 디렉토리 보기 모드



디렉토리를 누르면 위처럼 보기 모드가 트리 형식으로 바뀝니다.

FSI.CT안에는 게임 실행코드와 오버레이, 게임 정보, 게임 이름, 아이콘 등이 들어있습니다.
arm9.bin,arm7.bin은 게임의 실행파일이며 banner.bin에는 게임 이름과 아이콘이, fnt.bin에는 서브 파일 이름, fat.bin에는 서프 파일의 오프셋값이 저장되어 있습니다.
이 파일들은 잘못 건드리면 게임이 구동되지 않을 수도 있지만 보쿠관 DS의 대사는 arm9.bin 파일 안에 들어있으므로 대사 수정시 설명해드리겠습니다.
때때로 arm9.bin에 폰트가 들어있는 경우도 있으나 자세한 내용은 생략합니다.

data 에는 게임 이미지,폰트,대사,사운드 등의 데이터가 들어있습니다.
그럼 data를 더블 클릭해서 열어봅시다. 


data폴더를 더블클릭해서 열면 여러가지 파일이 나타납니다.
그런데 어라? 중간에 보시면 SH_LC_XX.NFTR이라고 써진 파일들이 보입니다.
NFTR은 Nitro FonT Resource 의 약자이며 닌텐도 SDK에서 제공하는 표준 폰트입니다.
NFTR 계열 폰트를 쓰지 않는 게임들도 상당수이지만 만약 롬 파일내에 NFTR이 보인다면 크리스탈 타일 2에서 자동으로 분석해주기때문에 쉽게 한글화가 가능합니다.

폰트를 쉽게 찾는 방법은
파일 이름에 FONT나 10,12등의 게임 폰트의 크기, 확장자에 fnt 등이 있는 경우 폰트로 의심해볼 필요가 있습니다.
그럼 이제 실제 폰트를 봐봅시다.

SH_LC_12.NFTR에서 오른쪽을 누르고 NFTR 폰트 정보 불러오기를 누릅시다.


폰트가 보인다!


정보 불러오기를 누르면 드디어 폰트가 짜잔!하고 나타납니다.
스크롤을 해서 아래로 내려보면 한자 폰트가 보입니다.

한자 폰트를 보면 亜唖娃阿 이런 식으로 되있는걸 보실 수 있습니다.
이 배열은 이론 편에서 설명드렸지만 S-JIS라는 일본 표준 인코딩입니다.

한자 폰트의 갯수를 보면 대략 2500개가 넘는 걸 아실 수 있습니다.(주로 사용하는 한글 완성형 폰트는 2350자입니다.)

그럼 바로 한글 폰트를 넣어봅시다.


첨부파일인 한글 매치 테이블을 받으시고 亜가 있는 곳에 포커스를 맞춰둡시다.


그 다음 편집 - > 폰트 설정으로 들어가서 글꼴을 돋움으로 맞추고 크기는 9로 정합시다.

폰트 설정하기, 다른 폰트도 사용할 수 있지만 이번에는 가독성을 위해 돋움을 사용한다.


확인을 누르고 편집에서 폰트 삽입을 누르고 위에서 받은 kor.tbl을 선택합니다.

한글 폰트가 입력되었다!


드디어 한글 폰트가 입력되었습니다!
CTRL + S나 파일->저장을 누르고 에뮬레이터로 게임을 실행해봅시다.
 


한자 폰트가 한글로 바뀐걸 보실 수 있습니다
씫 자가 짤린 것은 NFTR에는 폰트의 폭 데이터가 있기 때문에 이를 수정해야줘야 완벽하게 폰트가 출력됩니다.
자세한 것은 추후에 NFTR 폰트 구조에 관한 게시물에서 더 자세히 소개하겠습니다.

이번 실전 1편에서는 폰트를 찾고 한글로 바꾸는 과정을 알아보았습니다.
위에서 설명한것처럼 게임중에는 표준 폰트인 NFTR을 사용하지 않는 게임이 더 많으며 다양한 방식의 게임이 존재합니다.
간단한것부터 시도하다보면 점차 게임 분석을 빠르게 할 수 있고 노하우도 생기게 됩니다.

다음 실전 2편에서는 대사를 수정하는 것에 대해 알아보겠습니다.
읽어주셔서 감사합니다.

//