강좌/Minecraft Mod 제작2015. 11. 4. 16:02

강의 환경 : 마인크래프트 1.7 이상

강의 목표 :

1. 모드를 언어로 현지화할 있다.

 

이 강좌에서는 모드를 영문, 한글과 같은 언어로 현지화하는 방법을 알아보도록 합시다.

 

이 강좌는 기본적으로 자신이 새로 만든 모드에 적용되며,

 

이미 있던 모드를 현지화하는 경우에도 적용할 수 있습니다.

 

1. Lang 파일 만들기

 

현지화를 위해서는 우선 lang 파일을 만드셔야 합니다.

 

새로 만드신 모드에 적용하는 경우에는 프로젝트 폴더에서src\main\resources\assets\(모드 아이디) 폴더로 이동하신 후,

 

여기에 lang 폴더를 만드시면 됩니다.

 

이미 있는 모드를 현지화하고 싶으신 경우에는resources\assets\(모드 아이디)\lang폴더로 이동하세요.

 

이제 lang 파일을 이용해 한국어와 국제 표준어인 영어로 각각 현지화를 해 보기로 합시다.

 

저 위치에 en_US.lang 파일과 ko_KR.lang 파일을 만들어 주세요.

(이미 있는 모드를 현지화할 경우에는 이미 있는 en_US.lang 파일을 복사하여 ko_KR.lang 파일을 만드시면 됩니다)

 

 

저렇게 말입니다.

 

영어부터 우선 작업해 봅시다. en_US.lang을 메모장으로 열어주세요.

(이미 있던 모드의 경우, en_US.lang 파일은 이미 작성이 되어 있을 테니 한국어 현지화 부분까지 넘어가세요)

 

블럭과 아이템을 현지화하려면, tile.tutorial.name, item.tutorialtem.name 같은 것 대신 현지화된 이름을 주어야 하겠죠?

 

그러니까 다음과 같이, 마치 대입하듯이 = 앞에 현지화 전 이름을, 뒤에 현지화한 후의 이름을 적으시면 됩니다.

 

 

여기서 비현지화 이름을 구하는 방법은 몇 가지가 있습니다.

1. 현지화 전에 eclipse에서 마인크래프트를 실행하신 후 블록/아이템에 대해 뜨는 이름을 찾습니다.

2. 그냥 블록은 tile.(블록 비현지화 이름).name, 아이템은 item.(아이템 비현지화 이름).name입니다. (…)

이때 비현지화 이름은setBlockName/setItemName 혹은 setUnlocalizedName으로 설정했던 이름입니다.

 

이제 ko_KR.lang파일도 작성해 주어야겠죠?

 

역시 = 앞에는 현지화 전 이름, = 뒤에는 한글로 현지화한 후의 이름을 써주세요.

(이미 있던 모드의 경우에는 영어로 현지화된 이름을 한글로 번역하시면 됩니다.

또 블록/아이템만 현지화된 건 아닐 테니. 알아서 잘 번역하세요;)

 

저의 경우 다음과 같이 작성했습니다.

 

 

이때, 제일 처음 줄은 빈칸으로 놓아야 제대로 해석이 될 겁니다.

 

마지막으로 저장할 때 주의점이 있습니다.

 

인코딩을 UTF-8로 변환해 주어야 한다는 것이죠. (한글에만 해당합니다)

 

어떻게 UTF-8로 저장하냐고요? 우선 다른 이름으로 저장으로 가주세요.

 

 

여기서 인코딩이 아마 ANSI일 텐데, UTF-8로 바꾸시면 됩니다.

 

한번만 이렇게 인코딩을 바꿔놓으면 계속 유지되기 때문에 다시 하실 필요는 없습니다.

 

그렇게 저장을 하면, 현지화가 끝났습니다! 한번 영어부터 확인해 볼까요?

 

 

 

제대로 되었군요!

 

이제 한국어로 확인해 봅시다.

 

 

그럼 이렇게 되었다는 것을 확인하실 수 있습니다!

 

 

 

이제 드디어 예쁜 현지화된 블럭, 아이템 이름을 보실 수 있는 겁니다!

(있는 모드를 현지화하는 경우 여기부터 읽지 않으셔도 됩니다.)

 

 

2. 커스텀 문자열 현지화하기

(선행강좌: 아직 작성되지 않음(…))

 

실제로 현지화가 필요한 것은 블럭, 아이템 이름 뿐만이 아니죠. 알림 메시지 등도 현지화가 필요합니다.

 

여기서는 이러한 커스텀 문자열을 현지화하는 방법을 알아보도록 하겠습니다.

 

튜토리얼 블럭을 우클릭했을 때, 현지화된 문자열이 뜨도록 하는 예제를 통해 알아보도록 합시다.

 

우클릭했을 때는 onBlockActivated 메서드가 호출되니까, 이 메서드를 상속받고 다음과 같이 작성해주면 됩니다.

 

(잘린 줄은 다음과 같은 내용입니다:

player.addChatMessage(new ChatComponentText(StatCollector.translateToLocal("command.activate")));

)

 

여기서, 1개의 조건문과 3개의 메서드를 호출했음을 알 수 있습니다. 각각에 대해 설명하자면,

 

0. world.isRemote: 클라이언트 월드에 대해 true, 서버 월드에 대해 false 값을 갖고 있습니다.

onBlockActivated는 CLIENT side, SERVER side 양쪽 모두에서 호출되기 때문에,

메시지를 1번만 보내기 위해 체크를 하였습니다.

1. player.addChatMessage(IChatComponent comp) : 플레이어에게 알림 메시지를 보냅니다.

2. new ChatComponentText(String text) : String 텍스트로 구성된 채팅 메시지 컴포넌트를 만듭니다.

3. StatCollector.translateToLocal(String unloctext) : 해당 문자열을 현지화시킵니다!

 

그러니까, 간단히 StatCollector.translateToLocal을 통해 현지화를 해주면 되는 겁니다.

 

물론 lang 파일에 command.activate를 현지화하는 줄을 넣어야겠죠?

 

 

 

이런 식으로 작성한 다음 저장해 주시면..!

 

영어로 설정한 경우,

 

 

저렇게 뜨고요.

 

한국어로 설정하면

 

 

이렇게 뜨게 됩니다!

 

여기까지 간단하게 커스텀 문자열을 현지화하는 방법을 알아보았습니다.

 

정리하자면,

 

StatCollector.translateToLocal(String unloctext)

 

를 사용하면 된다는 겁니다. 물론 unloctext는 command.activate나 abs.tutorial.call 같은 형식으로 해놓고,

 

lang 파일에서 command.activate=(현지화된 문자열) 으로 하면 되는 겁니다.

 

그런데 만약 %s, %d 같은 것으로 문자열이나 수를 입력하고 싶다면 어떻게 해야 할까요?

 

이때는 대신 StatCollector.translateToLocalFormatted(String unloctext, Object... obj)

 

를 사용하시면 됩니다! 여기서, unloctext는 command.activate 같은 형식으로 하시고,

 

lang 파일에서 현지화된 문자열을 넣는 위치에 적당히 %s, %d를 배치해 주시면 되는 거죠.

 

예를 들자면 lang 파일에 abs.tutorial.call=Calling %s...

 

이런 식으로 해 놓고 translateToLocalFormatted의 2번째 인자에 String을 넣어도 되는 것이죠.

 

 

여기까지 lang 파일을 이용한 모드 현지화 강좌였습니다!

Posted by Abastro