스카이림 번역보관소


TesVTranslator에서 번역해도 되는 부분과 안되는 부분을 정확히 구분하는 방법입니다.

스크립트 소스 (scripts/source/.psc 확장자 파일)이 필요합니다.


모더가 스크립트 소스 (source/.psc)를 함께 배포한 경우에는 바로 psc를 열어보시면 되고,

pex만 배포한 경우에는 스크립트 디컴파일러로 psc를 만든 다음 열어보시면 됩니다.


스크립트 디컴파일러 (Champollion) : http://www.nexusmods.com/skyrim/mods/35307/



[ 1. psc가 없을 때 Champollion 사용법 ]



Champollion을 아무데나 설치한 뒤, pex를 드래그해서 exe 위에 놓으면 pex와 같은 폴더에 psc가 생성됩니다.

이렇게 만들어진 psc를 바로 pex로 컴파일해도 될 만큼 정확성이 높습니다.




[ 2. psc에서 번역해도 되는 코드 ]


큰따옴표("") 안의 녹색 표시된 부분(출력 스트링)은 번역해도 안전합니다.


string X

X = "XXX"  (참고: string Property = "XXX"는 번역이 반영되지 않음)

Pages[] = "XXX"  (참고: 출력 스트링 맨 앞에 $가 없으면 이미 저장된 세이브에는 번역이 반영되지 않음)

AddHeaderOption("XXX")

AddTextOption("XXX", "텍스트")

AddSliderOption("XXX", 슬라이더 값, "슬라이더 단위")

AddMenuOption("XXX", 메뉴 옵션 스트링[번호])

메뉴 옵션 스트링[번호] = "XXX"  (참고: 출력 스트링 맨 앞에 $가 없으면 이미 저장된 세이브에는 번역이 반영되지 않음)

ShowMessage("XXX")

SetInfoText("XXX")

Debug.MessageBox("XXX")

Debug.Notification("XXX")



[ 3. psc 소스 코드 설명 ]


아래 이미지들에서 큰따옴표("") 안의 회색 처리된 부분이 스트링(string)입니다.

이중에서 실제로 게임에 글자로 출력될 부분만 구분해서 번역해야 합니다.


※ 출력될 스트링 중 큰따옴표 맨 앞에 $가 붙어 있으면 (예: "$menu") 외부 MCM 텍스트 파일로 번역할 수 있습니다.

(MCM 텍스트 위치: interface/translations/모드 esp 이름_english.txt)

$가 없는 경우에는 스크립트를 직접 번역해야 합니다. (예: "menu")




(예시: Less Intrusive HUD II 모드)


Pages 스트링은 MCM 메뉴의 왼쪽에 있는 페이지 제목입니다.

Pages[0]은 첫번째 제목, Pages[1]은 두번째 제목 이런 순으로 정의됩니다.


스트링 중에 세이브에 직접 저장되는 것들이 있는데, 이 Pages 출력 스트링과 (MCM 페이지의 표시 옵션 항목 중) 메뉴 옵션(MenuOption) 출력 스트링이 그렇습니다.

이 두가지는 영문 상태에서 저장한 뒤 한글화된 것을 덮어씌우면 MCM에 번역이 반영되지 않고, 반대도 마찬가지입니다.

이것들을 제대로 번역하려면 외부 MCM 텍스트 파일에서 번역 가능하게끔 $를 붙여서 다시 컴파일한 뒤 번역하면 됩니다.


위 이미지처럼 Pages 스트링 자체가 변수로 사용될 때는 TesVTranslator에서 MCM 메뉴 제목이 노란색 전구로 표시되어 번역할 수 없습니다.

이런 경우에는 if a_page == "General Settings" 부분을 출력 스트링이 아닌 상태로 바꿔서 if a_page == Pages[0] 으로 만들면 번역할 수 있게 됩니다.


노란색 전구가 아니더라도 실질적으로 스트링이 변수로 사용되어 번역하면 안되는 것들이 있습니다. 대개 Actor Value, HUD 값들이 그러한데 이런 부분을 번역하면 모드가 제대로 작동하지 않게 됩니다. (번역해도 안전한 코드는 2번 항목을 참고하세요)


결론적으로 회색표시된 위의 스트링들 중에서 번역해도 되는 부분은 AddHeaderOption("Mod Configuration")뿐입니다.

AddHeaderOption은 MCM 페이지 오른쪽 화면에서 굵은 글자로 표시되는 타이틀입니다. 모두 번역해도 됩니다.




(예시: AFT MCM)


위 경우처럼 Pages 스트링에 $를 붙여주면 외부 MCM 텍스트 파일로 번역할 수 있습니다.


ModName 은 MCM에 표시되는 모드의 이름입니다. (스크립트나 esp 아무 쪽에서든 정의하면 되기 때문에 스크립트에서는 없을 수도 있습니다) ModName 출력 스트링은 번역해도 무방하지만 대개 번역 안해둡니다. 또한 FISS 기능이 지원될 경우에는 대개 ModName 출력 스트링을 FISS 이름으로 활용하는 경우가 많기 때문에 이런 경우에는 번역하면 안됩니다. 만약 번역하면 저장된 FISS 설정을 불러올 수 없습니다.


Debug.MessageBox는 메뉴모드 외의 게임상에서 뜨는 (확인 버튼이 있는) 메시지창입니다. 모두 번역해도 됩니다.
Debug.Notification은 메뉴모드 외의 게임상에서 뜨는 알림 메시지입니다. 모두 번역해도 됩니다.
Debug.Trace는 파피루스 로그 파일에 기록되는 로그입니다. 굳이 번역하지 않아도 됩니다.



(예시: iNeed 모드)


스크립트를 번역했는데 번역이 적용 안되고 영문으로 나올 때는 이런 경우일 수 있습니다.

string이 Property로 걸려 있으면서 출력 스트링이 바로 정의된 경우에는 번역해도 게임상에 반영되지 않기 때문에 이런 모드는 원래대로라면 100% 온전히 번역되지 않습니다. (iNeed, Apocalypse 등) 이런 부분은 Property에서 출력 스트링을 직접 정의하지 않고 스크립트 내에서 따로 정의하거나, 아예 스크립트에서는 정의된 출력 스트링을 지워버린 뒤 esp에서 $를 붙여 정의해주어야 번역이 적용됩니다. 이 부분은 설명하기 복잡하니까 생략하겠습니다.





(예시: SkyTweak 모드)


Actor Value, GameSettings 등 스트링으로 값이 정의되는 변수들이 있습니다. 위 예시에서는 슬라이더 옵션(AddSliderOption) 제목 출력 스트링이 Actor Value 스트링 값 그대로 사용되었기 때문에, TesVTranslator에서 노란색 전구로 표시되어 번역이 불가능한 상태입니다. 이런 것들은 아래 이미지처럼 출력 스트링을 변수 스트링과 구분되게 바꾼 뒤 컴파일하면 번역할 수 있게 됩니다.



(출력 스트링을 Actor Value 값과 구분되게끔 "Health"가 아닌 "Health  "로 정의해줌)





ShowMessage는 MCM 표시 항목을 클릭하면 나오는 메시지창입니다. 모두 번역해도 됩니다.

중간중간 Property에서 바로 정의되지 않은 string들도 모두 번역해도 됩니다.




event OnOptionHighlight 에서 정의된 출력 스트링들은 MCM 옵션 항목에 마우스를 올리면 하단에 뜨는 설명입니다. 모두 번역해도 됩니다.




  • 파이어 2015.11.07 11:42 신고

    좋은 팁글 감사드립니다. 궁금한 점이 있습니다.
    Debug.Trace는 번역해도 되는 것인지요? 예를 들어..

    debug.trace("Frequency to A" + newFreq + ", was initialized " + bWasInitialized);

    뭐 이런 구문이 있다면
    "Frequency to A"와 "was initialized"는 번역해도 될 것 같은데요. 언급이 없으셔서.. 혹시 번역해도 무방하지만 게임상에서 출력되는 메시지가 아니니까 굳이 번역할 필요가 없는 건가요?

    1. BlogIcon renn 2015.11.07 11:43 신고

      Trace는 파피루스 로그에 기록되는 메시지니까 번역 안하셔도 됩니다.

    2. 파이어 2015.11.07 13:36 신고

      감사합니다.

    3. BlogIcon renn 2015.11.09 22:24 신고

      넵 도움되시면 좋겠네요.

  • 파이어 2015.11.12 00:05 신고

    존경하는 렌누님 질문이 하나 더 있사옵니다.
    libs.notify("It seems you are an idiot!", messagebox = true)
    위 구문도 번역해야 되지 않을까요? messagebox.nofitication하고 비슷한 선언으로 보이는데요.
    메시지박스 = true가 없는 줄도 있던데 그건 또 어찌해얄지.. 가르침을 청하옵니다!! 꾸벅.

    1. BlogIcon renn 2015.11.12 00:11 신고

      그건 skse 기본 명령은 아니고 독자적인 명령 같은데 스크립트를 뜯어봐야 알겠네요. 어떤 모드의 스크립트인지 알려주세요.

  • SiRan 2016.07.14 15:35 신고

    렌님 혹시 Notepad++의 스타일설정을 어떻게 하신건지 여쭤봐도 될까요?
    렌님의 설정이 상당히 보는것이 편해서 부탁드립니다

    1. BlogIcon renn 2016.07.14 19:39 신고

      설정 -> 스타일 설정에 들어가셔서 언어 C++ 항목에 사용자 확장자 psc를 등록시켜보세요.
      그리고 스타일에 사용자정의 키워드를 추가 등록하세요.

      제 경우는 INSTRUCTION WORD에 [IF If elseif ElseIf elseIf ELSEIF endif endIf EndIf ENDIF While endWhile EndWhile]
      TYPE WORD에 [string String STRING form Form FORM Int INT Float FLOAT Bool BOOL]
      이렇게 등록해서 쓰고 있어요. 모더마다 대소문자 쓰는 스타일이 달라서 여러가지 등록해줘야 하더군요.

    2. SiRan 2016.07.14 20:50 신고

      감사합니다!