Minecraft는 처음부터 다국어를 지원하도록 설계되었습니다. 아이템 이름, 블록 이름, GUI 텍스트, 사망 메시지까지 모두 lang 파일 하나로 관리합니다. 모드도 같은 방식을 따릅니다. 이 챕터에서는 lang 파일의 구조와 위치, Component.translatable()로 텍스트를 참조하는 방법을 배웁니다.
💡 사이트 i18n vs 모드 i18n
사이트 i18n (messages/{ko,en}.json + next-intl): 이 학습 문서 자체의 UI 번역
모드 i18n (assets/examplemod/lang/*.json + Minecraft): 모드 안의 게임 텍스트 번역
Java 코드에서 번역 키를 참조할 때는 Component.translatable()을 씁니다.
// 번역 키로 Component 생성Component name = Component.translatable("item.examplemod.example_item");// 게임이 현재 언어에 맞는 lang 파일에서 값을 조회합니다.// 한국어 설정이면 ko_kr.json, 영어 설정이면 en_us.json을 읽습니다.// 키가 없으면 raw 키 그대로 표시 — 크래시는 발생하지 않습니다.
아이템·블록 등록 시 getDescriptionId()가 자동으로 번역 키를 반환하므로, 대부분의 경우 직접 호출할 필요는 없습니다. 직접 쓰는 경우는 주로 명령어 피드백이나 GUI 텍스트입니다.
// 명령어 실행 결과 메시지context.getSource().sendSuccess( () -> Component.translatable("commands.examplemod.hello"), false);// 포맷 인수 전달 (사망 메시지 등)Component death = Component.translatable( "death.attack.example", player.getDisplayName());// lang: "death.attack.example": "%1$s이(가) 예시로 사망했습니다"// 결과: "플레이어이(가) 예시로 사망했습니다"
// 하드코딩 — 다국어 안 됨player.sendSystemMessage(Component.literal("Hello"));// translatable — 자동 다국어player.sendSystemMessage(Component.translatable("commands.examplemod.hello"));
Component.literal()은 lang 파일을 전혀 참조하지 않습니다. 항상 그 문자열 그대로 표시됩니다. 플레이어에게 보이는 텍스트는 반드시 Component.translatable()을 쓰세요.
키 누락 시: 게임이 raw 키를 표시합니다 ("commands.examplemod.hello" 그대로). 크래시는 발생하지 않으므로, 빌드 후 인게임에서 raw 키가 보이면 lang 파일에 해당 키가 빠진 것입니다.