2009년 12월 16일 수요일

리소스 해커로 언어 정보 편집

영어나 외국어로 된 프로그램의 메시지을 한글로 바꾼 뒤에 그 언어 정보는 원래대로 두는 실수를 하는 때가 있다. 보통 때는 전혀 문제가 없으나, 간혹 문제가 생기는 경우도 있습니다. 이렇게 언어 정보가 틀려 있는 프로그램의 언어 정보를 리소스 해커(Resource HackerTM)를 이용하여 고쳐보도록 하겠습니다.

먼저 Total Commander Korean Forum :: XPG Community 사이트에서 NFO Viewer 플러그인을 다운로드합니다.

언어 정보 편집 순서

프로그램 리소스에서 언어 정보를 고치는 작업의 순서는 다음과 같습니다.

  1. 프로그램의 언어 정보 고치기
  2. 메뉴의 언어 정보 고치기
  3. 대화상자의 언어 정보 고치기
  4. 대화상자의 글꼴 정보 고치기

프로그램의 언어 정보 고치기

리소스 해커에서 파일을 열어서 가장 먼저 할 일은 프로그램 전체에 적용되는 언어 정보를 고치는 작업입니다. 프로그램 전체에 적용되는 언어정보는 아래 자료 화면에서, 주로 왼쪽 창에서 Version Info라는 항목을 살펴보면 찾을 수 있습니다.

버전 정보(Version Info)와 언어 정보

버전 정보(Version Info)와 언어 정보

다음과 같은 순서로 작업을 합니다.

  1. nfoviewer_kor.wlx 파일을 리소스 해커에서 엽니다.
  2. Version Info를 클릭하고, 1을 클릭하고, 2052를 클릭하면 위와 같은 화면을 볼 수 있습니다.
  3. 오른쪽 창에서 BLOCK "StringFileInfo" 부분과 BLOCK "VarFileInfo" 부분을 찾습니다. "Translation", 0x0804 0x04B0 부분에서 앞의 십육진수는 언어 정보이고, 뒤의 십육진수는 코드페이지 정보입니다.
  4. MSDN :: List of Localized MS Operating Systems 문서를 참조하여 언어 정보(LCID)와 코드페이지 정보를 알아둡니다.
    • 참고로 한국어의 LCID는 십육진수로 0x0412, 십진수로는 1042입니다. 그리고 코드페이지는 십진수로 949, 십육진수로는 0x03B5입니다. 다만 이번 경우에는 0x04B0(utf-16, 유니코드)을 그대로 유지합니다.
  5. "Translation", 0x0804 0x04B0 부분을 "Translation", 0x0412 0x04B0라고 고칩니다.
  6. BLOCK "080404b0" 부분을 BLOCK "041204b0"라고 고칩니다.
  7. 왼쪽 창에서 언어 정보(LCID)를 2052(중국어 간자체)에서 1042(한국어 통합완성형)로 고칩니다.

    언어 변경

    언어 변경


    새 리소스 언어 입력

    새 리소스 언어 입력

  8. 스크립트 컴파일을 클릭한다. 이 작업을 하면 지금까지 했던 작업 결과가 적용된다.
    스크립트 컴파일
  9. 저장한다.
    저장

메뉴의 언어 정보 고치기

메뉴는 대부분 글꼴 정보를 포함하고 있지 않습니다. 그 까닭은 메뉴는 대부분 비주얼스튜디오와 같은 IDE(개발 환경)에서 자동으로 만들어주기 때문이며, 또한 그 과정에서 시스템에서 기본으로 정해준 글꼴을 사용하도록 설정되어 있기 때문입니다. 물론 프로그램을 짤 때 사용자가 수동으로 바꿀 수는 있으며, 또한 메뉴 글꼴 전체를 사용자 시스템에서 고칠 수도 있습니다.

[디스플레이지 등록 정보]의 [고급 화면 배색]에서 [메뉴] 항목을 수정하는 화면

[디스플레이지 등록 정보]의 [고급 화면 배색]에서 [메뉴] 항목을 수정하는 화면

이 글에서는 그런 시스템 정보는 전혀 다루지 않지만, 참고 삼아 알려드렸습니다.

메뉴 항목과 언어 정보

메뉴 항목과 언어 정보

메뉴에 대한 언어 정보를 고치는 과정은 다음과 같습니다.

  1. nfoviewer_kor.wlx 파일을 리소스 해커에서 엽니다.
  2. Version Info를 클릭하고, 101을 클릭하고, 2052를 클릭하면 위와 같은 화면을 볼 수 있습니다.
  3. MSDN :: List of Localized MS Operating Systems 문서를 참조하여 언어 정보(LCID)와 코드페이지 정보를 알아둡니다.
  4. 왼쪽 창에서 언어 정보(LCID)를 2052(중국어 간자체)에서 1042(한국어 통합완성형)로 고칩니다.
  5. 오른쪽 창에서 LANGUAGE LANG_CHINESE, 0x2 부분을 찾습니다. 이것을 LANGUAGE LANG_KOREAN, 0x1라고 고칩니다. 이때 마지막 0x2SUBLANG_KOREAN 또는 0x01로 고쳐도 됩니다.
  6. 스크립트를 컴파일한 뒤에 저장합니다. 이때 스크립트를 컴파일하면 LANGUAGE LANG_KOREAN, SUBLANG_KOREAN 이라고 바뀐 부분이 LANGUAGE LANG_KOREAN, 0x1로 바뀝니다. 이것은 정상이므로 걱정하지 않아도 됩니다.

이 프로그램(nfoviewer_kor.wlx)에는 메뉴가 하나뿐이지만, 대부분의 프로그램은 메뉴가 여러 개로 되어 있다.

대화상자의 언어 정보 고치기

프로그램을 만들게 되면 현재 화면에 보이는 창으로 작업을 할 수 없는 때가 생기거나 메시지를 사용자에게 전달해야 하는 때가 있다. 이때 생성하는 것이 바로 대화상자이다. 대화상자에는 언어 정보와 함께 글꼴 정보가 함께 포함되는 때가 많다.

이 프로그램(nfoviewer_kor.wlx)에는 대화상자가 하나뿐이지만, 대부분의 프로그램은 대화상자가 여러 개로 되어 있다.

대화상자 항목과 언어 정보

대화상자 항목과 언어 정보

작업하는 순서는 다음과 같습니다.

  1. 앞서 작업한 메뉴를 참조하여 대화상자언어 정보(LCID)와 코드페이지 정보를 고칩니다.
  2. 글꼴 정보에서 FONT 9, "宋?"FONT 9, "굴림" 또는 FONT 10, "굴림"으로 고칩니다.
  3. 스크립트를 컴파일한 뒤에 저장합니다.

완료

그밖에 살펴야 할 사항

일단 이렇게 바꾸었으면, 메시지가 정상적으로 출력되는지를 확인해야 합니다. 이 작업에 앞서 반드시 원본을 백업해 두기 바랍니다. 백업은 선택이 아닌 필수입니다.

관련 문서

내부 문서

외부 문서

이 글은 스프링노트에서 작성되었습니다.


댓글 15개:

  1. 한글화를 몇 번 해본 적이 있는데, 전혀 몰랐던 내용이네요.

    그냥 화면에 잘 보이니까 잘됐나 보다 했는데 아니었어요.

    잘 보고 갑니다.

    답글삭제
  2. @개뿔 - 2009/12/28 16:32
    저 역시 그렇게 생각했으니까요. 그런데 일본어 윈도를 쓰는 컴퓨터에서 보니까, 이상하게 보일 뿐만 아니라, 아무도 알아볼 수 없는 메시지로 바뀐 경우가 있어서 알게 되었습니다. ^^a

    본문 내용처럼 처리해 주면 일본어 윈도나 중국어 윈도에서도 정확하게 보여줍니다.

    답글삭제
  3. 잘봤습니다. 그런데요 제가 영어를 한국화 하는작업중인데....

    메뉴를 한글로 바꿨습니다. 위에 작업도 하였구요.

    그런데 중국어로 나오네요... 왜그런거죠?

    답글삭제
  4. @잘봤습니다 - 2010/01/10 23:38
    해당 프로그램에서 강제로 중국어로만 출력하는 경우가 있습니다.

    저도 예전에 한글화를 시도한 적이 있는데, 언어 파일의 설정을 아예 무시하고 영어로만 나온 프로그램이 있습니다. 이처럼 파일에 따로 언어 정보를 저장하는 프로그램은 한글화를 하더라도 메시지가 바뀌지 않을 수 있습니다.



    덧// 어떤 프로그램인지를 모르니 답변하기가 좀 곤란하네요.

    답글삭제
  5. 그렇군요 ....

    그리구 비표준 레이아웃이라고 뜨면서 변경할수 없는 프로그램이 있던데 이런건 아예하지못하나요?

    답글삭제
  6. @잘봤습니다 - 2010/01/11 01:21
    예. 리소스 해커에서 다룰 수 있는 것은 "표준 레이아웃"뿐입니다. 비표준 방식은 헥스 에디터 등을 사용해야 합니다. 아니면 전문적으로 리소스를 다루는 상용 프로그램을 써야 하죠.

    물론 리소스 해커도 잘 다루지만, 어디까지나 표준 방식만을 대상으로 하고 있습니다.

    답글삭제
  7. @잘봤습니다 - 2010/01/10 23:38
    혹시... 한국어 설정으로 바꾸어야 할 부분을 중국어 설정으로 바꾸지 않았나 살펴보시기 바랍니다.

    그 글에서 중국어를 한국어로 바꾸는 설정이라서 둘을 헷갈릴 경우 중국어로 출력하게 됩니다.

    답글삭제
  8. @Anonymous - 2010/01/29 21:17
    폰트를 한국어 폰트로 지정해 주거나 유니코드 폰트로 지정해 주면 됩니다.

    답글삭제
  9. 비밀 댓글 입니다.

    답글삭제
  10. 비밀 댓글 입니다.

    답글삭제
  11. @Anonymous - 2010/01/29 21:28
    폰트 수정하는 방법은 간단합니다.

    일단 본문처럼 FONT 부분이 있다면, 그곳에 한글 폰트, 예컨대 "굴림"을 넣어주면 됩니다.

    FONT 부분이 없다면, 일단 LANGUAGE LANG_KOREAN, 0x1 라는 부분을 찾습니다.

    그리고 그 아랫줄에 폰트 정보를 넣어주면 됩니다.

    답글삭제
  12. 비밀 댓글 입니다.

    답글삭제
  13. 메일 보내드렷습니다. 확인요^^

    답글삭제
  14. 비밀 댓글 입니다.

    답글삭제
  15. @Anonymous - 2010/03/14 11:20
    ======================================

    101 DIALOGEX 0, 0, 441, 274

    STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU

    CAPTION "SC2Launcher v1.33 한글판 "

    LANGUAGE LANG_KOREAN, 0x1

    FONT 8, "Tahoma"

    {

    CONTROL "", 1001, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 262, 26, 175, 200

    CONTROL "게임설정", -1, BUTTON, BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 5, 4, 251, 240

    CONTROL "플레이어", -1, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 22, 16, 47, 8

    CONTROL "종족", -1, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 75, 16, 42, 8

    CONTROL "동맹", -1, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 128, 16, 46, 8

    CONTROL "색상", -1, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 185, 16, 46, 8

    CONTROL "", 1005, COMBOBOX, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 21, 26, 51, 80

    CONTROL "", 1008, COMBOBOX, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 74, 26, 51, 48

    CONTROL "", 1009, COMBOBOX, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 127, 26, 55, 80

    CONTROL "", 1030, COMBOBOX, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 184, 26, 68, 200

    CONTROL "", 1011, COMBOBOX, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 21, 40, 51, 80

    CONTROL "", 1012, COMBOBOX, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 74, 40, 51, 48

    CONTROL "", 1013, COMBOBOX, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 127, 40, 55, 80

    CONTROL "", 1031, COMBOBOX, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 184, 40, 68, 199

    CONTROL "", 1014, COMBOBOX, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 21, 54, 51, 80

    CONTROL "", 1015, COMBOBOX, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 74, 54, 51, 48

    CONTROL "", 1016, COMBOBOX, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 127, 54, 55, 80

    CONTROL "", 1032, COMBOBOX, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 184, 54, 68, 200

    CONTROL "", 1017, COMBOBOX, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 21, 68, 51, 66

    CONTROL "", 1018, COMBOBOX, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 74, 68, 51, 48

    CONTROL "", 1019, COMBOBOX, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 127, 68, 55, 79

    CONTROL "", 1033, COMBOBOX, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 184, 68, 68, 205

    CONTROL "", 1020, COMBOBOX, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_VSCROLL | WS_TABSTOP, 21, 82, 51, 79

    CONTROL "", 1021, COMBOBOX, CBS_DROPDOWNLIST |..

    답글삭제