Abstract
코어의 Localization 은 생각보다 작습니다. "키 → 문자열" 딕셔너리 하나와 "현재 언어"라는 값 하나가 전부입니다. 언어별 파일을 골라 읽는 일도, 언어를 바꿨을 때 화면을 갱신하는 일도 하지 않습니다. 그 사실을 알고 나면 "왜 언어를 바꿨는데 글자가 그대로지?" 같은 의문이 풀립니다. 사전 파일을 만들어 HUD 에 적용하는 과정은 Unity 쪽
로컬라이제이션 시스템 (Localization System) 페이지에 있습니다.
프레임워크가 해 주는 것과 내가 해야 하는 것
프레임워크 | 게임 코드 |
사전 파일을 읽어 딕셔너리에 넣기 (ReadData) | 어느 언어의 파일을 읽을지 정하기 |
키로 문자열 찾기, {0} 자리 채우기 (GetString) | UI 텍스트에 실제로 넣기 — 폼이 열릴 때 GetString 을 불러 대입 |
기기 언어 알려 주기 (SystemLanguage) | 지원하지 않는 언어일 때 대체 언어 고르기 |
현재 언어 값 보관 (Language) | 언어를 바꿨을 때 사전을 다시 읽고 열린 화면을 갱신하기 |
언어에 맞는 폰트 준비하기 |
런타임 언어 전환 — 직접 구현하는 순서
public void ChangeLanguage(Language language)
{
LocalizationComponent localization = GameEntry.GetComponent<LocalizationComponent>();
localization.RemoveAllRawStrings(); // ① 옛 사전을 비운다 (안 하면 중복 키로 파싱이 중단된다)
localization.Language = language; // ② 값을 바꾼다
localization.ReadData(Utility.Text.Format("Dictionary.{0}", language)); // ③ 새 사전을 읽는다 (비동기)
// ④ LoadDictionarySuccess 이벤트를 받으면 "언어가 바뀌었다"는 자체 이벤트를 발행하고,
// 열려 있는 UI 폼들이 그것을 듣고 자기 텍스트를 GetString 으로 다시 채운다
}
C#
복사
④가 핵심입니다. 프레임워크는 어떤 UI 가 어떤 키를 쓰는지 모르기 때문에, 화면 갱신은 이벤트로 알리고 각 폼이 스스로 다시 그리게 합니다. 실무에서는 텍스트 컴포넌트에 붙이는 작은 스크립트(키를 인스펙터에 적어 두고, 켜질 때와 언어 변경 이벤트 때 GetString 을 불러 대입)를 하나 만들어 모든 고정 문구에 붙이는 방식이 일반적입니다.
GetString 의 실패는 조용하다
상황 | 돌아오는 문자열 | 화면에 이것이 보이면 |
키가 사전에 없다 | <NoKey>ui.start_button | 사전에 키를 추가하지 않았거나, 사전 로드가 끝나기 전에 불렀다 |
{1} 이 있는데 인자를 하나만 줬다 | <Error>ui.score,… 로 시작하는 긴 문자열 | 번역문의 자리표시자 개수와 코드의 인자 개수가 다르다 |
예외를 던지지 않으므로 게임은 멈추지 않습니다. 대신 QA 가 화면에서 눈으로 찾아야 합니다. 출시 전에 "모든 키가 모든 언어 사전에 있는가"를 검사하는 에디터 스크립트를 하나 만들어 두는 것이 좋습니다.
이 에디션에서 다른 점 · 본문을 읽을 때 주의할 점
•
본문은 "런타임 중에도 언어를 자유롭게 변경할 수 있습니다"라고 하지만, 위에서 보듯 Language 값만 바꿔서는 아무것도 달라지지 않습니다. 사전 교체와 화면 갱신은 직접 구현합니다.
•
Language 는 문자열이 아니라 열거형입니다. 본문의 Language = "Korean" 은 Language.Korean 으로 고쳐 두었습니다.
•
본문의 SetLocalizationHelper, SetResourceManager 는 LocalizationComponent 가 대신 합니다. 게임 코드는 GameEntry.GetComponent<LocalizationComponent>() 로 ReadData / GetString 만 부릅니다.
•
에디터에서는 BaseComponent 의 Editor Language 로 기기 언어와 무관하게 테스트 언어를 지정할 수 있습니다. 한국어 PC 에서 영어 화면을 확인할 때 씁니다.
•
사전 파일은 Addressables 에 등록한 TextAsset 이고, 기본 형식은 탭 구분 4열(2열 = 키, 4열 = 값)입니다. 빈 줄이나 열 수가 다른 줄을 만나면 그 자리에서 파싱이 중단됩니다.
Localization 시스템 개요
Game Framework의 Localization(다국어 지원) 시스템은 게임 내 텍스트를 다국어로 관리하기 위한 견고한 구조를 제공합니다.
이 시스템은 문자열을 딕셔너리(Dictionary) 형태로 저장하고, 고유 키(Key) 를 통해 조회하며, 문자열 포맷팅과 파라미터 지원이 가능합니다.
또한 Resource Management 시스템과 통합되어 언어 데이터(사전 파일) 를 로드하고, 런타임 중에도 언어를 자유롭게 변경할 수 있습니다.
시스템 구조
1. Dictionary 기반 구조
•
각 문자열은 고유 키(Key) 와 연결되어 저장됩니다.
•
현재 선택된 언어에 따라 해당 키에 맞는 문자열을 반환합니다.
핵심 구성 요소
LocalizationManager
•
ILocalizationManager 인터페이스를 구현하고 GameFrameworkModule을 상속하는 핵심 클래스
•
로컬라이즈된 문자열 딕셔너리를 유지·관리
•
문자열 접근, 추가, 삭제 등의 기능 제공
언어(Language) 관리
속성/메서드 | 설명 |
Language | 현재 게임에서 사용할 언어 설정/조회 |
SystemLanguage | 시스템 언어를 ILocalizationHelper로부터 가져옴 |
SetLocalizationHelper(ILocalizationHelper) | 플랫폼별 언어 기능 지원 헬퍼 설정 |
ILocalizationHelper는 플랫폼별로 시스템 언어 감지, 로컬라이제이션 데이터 로드 로직 등을 구현하는 역할
로컬라이즈 문자열 조회
1. 기본 조회
string text = localizationManager.GetString("ui.start_button");
C#
복사
2. 포맷팅 지원
string text = localizationManager.GetString("ui.score", 100);
// ui.score = "점수: {0}" → "점수: 100"
C#
복사
딕셔너리 관리 기능
메서드 | 설명 |
HasRawString(string key) | 특정 키 존재 여부 확인 |
GetRawString(string key) | 포맷팅 전 원본 문자열 조회 |
AddRawString(string key, string value) | 새로운 문자열 추가 |
RemoveRawString(string key) | 특정 문자열 삭제 |
RemoveAllRawStrings() | 모든 문자열 초기화 |
데이터 로딩
LocalizationManager는 Data Provider를 사용해 사전 파일을 로드·파싱합니다.
메서드 | 설명 |
ReadData(string dictionaryAssetName) | 리소스 시스템에서 언어 사전 파일 로드 |
ParseData(string/byte[]) | 문자열 또는 바이트 배열로 된 사전 데이터 파싱 |
플로우 차트
다른 시스템과 연동
•
Resource Manager
→ 로컬라이제이션 사전 파일을 리소스로 로드
→ SetResourceManager(IResourceManager) 로 연결
•
Data Provider System
→ 사전 데이터 파싱
→ SetDataProviderHelper(IDataProviderHelper<ILocalizationManager>) 로 설정
일반적인 사용 흐름
1.
게임 시작 시 LocalizationManager 초기화
2.
SetLocalizationHelper()로 헬퍼 등록
3.
SetResourceManager()로 리소스 매니저 연결
4.
언어 선택 (예: localizationManager.Language = Language.Korean — 문자열이 아니라 Language 열거형이다)
5.
ReadData()로 해당 언어 사전 로드
6.
GetString()으로 UI나 게임 내 텍스트 출력
다른 데이터 시스템과 비교
시스템 | 목적 | 주요 기능 |
Localization | 다국어 문자열 관리 | 키 기반 조회 + 포맷팅 지원 |
Config | 전역 설정 관리 | 타입별 Getter(GetBool, GetInt 등) |
DataTable | 구조화된 게임 데이터 관리 | 강타입 데이터 행(Row) 관리 |
에러 처리
•
존재하지 않는 키 → <NoKey>{key} 반환
•
문자열 포맷 실패 → 예외 내용을 포함한 에러 문자열 반환
Best Practices
•
게임 초기 단계에서 Localization 시스템 초기화
•
문자열 사용 전에 반드시 언어 설정
•
키는 의미 있고 계층적 구조로 작성 ("ui.main_menu.start_button")
•
UI 컴포넌트에서 누락된 키 처리 로직 구현
•
확장 메서드로 GetString() 호출을 간단히 만드는 것도 추천
결론이 Localization 시스템을 사용하면 다국어 지원이 필요한 게임에서 언어별 문자열 관리, 런타임 언어 변경, 리소스 기반 로드까지 쉽게 구현할 수 있습니다.
특히 UI나 대사량이 많은 게임(스토리형, RPG, 글로벌 출시 예정작)에 매우 유용합니다.









