앱내에서 다국어를 지원하기 위해 Unity에서 제공하는 Localization Packag를 사용했습니다.

 

포스팅 순서는 1. 설치 순서 -> 2. Localization 생성 -> 3. Localization 셋팅 -> 4. Localization 적용 순으로 진행하겠습니다.

 

1. 설치 순서

1. [Window] -> [PackageManagement] -> [PackageManager] 를 선택합니다.

2-1 좌측에 [Unity Registry] 를 선택 후 검새창에 Localization을 검색해서 Install 합니다.

2-2. 만약에 없는 경우 왼쪽 상단에 [+] 버튼을 클릭후 [Install package from git URL] 을 선택합니다.

3. 입력창에 [ com.unity.localization ] 입력후 Install 버튼을 누릅니다.

NOTE) 해당 유니티 버전은 6000.3.2f1인데 이 버전에서 git URL에 pakcage 설치했을 때 실제 설치가 완료되도 설치되지 않았다는 경고가 뜨는 오류가 있다고 들었어서 해당 부분은 무시했습니다.

 

2. Localization 파일 생성

1. 왼쪽 상단에 [Edit] -> [Project Settings] 를 선택합니다.

2. 좌측에 [Localization] 선택 후 [Create] 버튼을 클릭하여 원하는 위치에 Localization Settings 파일을 생성합니다.

3. [Add Locale] 버튼을 선택한 뒤 추가할 언어들을 선택하고 [Add Locales] 버튼을 클릭하여 원하는 위치에 언어 파일을 저장합니다.

이때 하단에 [Specific Locale Selector] 를 선택하게되면 Locale Id에 설정된 언어 파일이 있는데 에디터에서 사용할 프로젝트 기본 언어를 설정할 수 입습니다.

 

3. Localization 셋팅

1. [Window] -> [AssetManagement] -> [Localization Tables] 를 선택합니다.

2. 좌측 상단에 [+ New Table Collection] 버튼을 클릭하면 이미지 오른쪽 창이 뜨게 되는데 여기서 설정한 언어들을 선택한 이후 [Create] 버튼을 클릭하여 원하는 위치에 Table 파일을 생성합니다.

3. [New Entry] 버튼을 클릭하여 각 Localize별 문자열을 설정합니다.

3-1. Localization Tables에 값을 넣을 때 CSV 파일을 활용하면 보다 편하게 사용할 수 있습니다.

NOTE) 주의할 사항은 CSV 파일 상단에 Column 명을 Localization Tables에 Column명과 일치해야 데이터값이 정확하게 들어갑니다.

 

4. Localization 적용

1. [TextMeshPro에서 마우스 오른쪽 키] -> [Localize] 선택합니다.

2. [String Refernce] 오른쪽 None부분 선택 후 만들어뒀던 Tables에 Key들 중 하나 선택하면 오른쪽 이미지 처럼 적용됩니다.

 

이렇게 적용해서 아래의 간단한 언어 변경 Script를 버튼에 적용해보면 아래의 Glf처럼 작동됩니다.

// 언어 변경용 Script 예시
public class ChangeLanguage : MonoBehaviour
{
    // 전달받은 Locale Code를 기준으로 언어를 변경하는 공통 함수
    public void change(string localeCode)
    {
        // 프로젝트에 등록된 모든 Locale 목록을 가져옴
        var locales = LocalizationSettings.AvailableLocales.Locales;

        // 등록된 Locale들을 하나씩 검사
        foreach (Locale locale in locales)
        {
            // 현재 Locale의 코드가 전달받은 코드와 같으면
            if (locale.Identifier.Code == localeCode)
            {
                // 해당 Locale을 현재 선택된 언어로 적용
                LocalizationSettings.SelectedLocale = locale;
                return;
            }
        }
    }

    // 한국어 버튼에서 호출할 함수
    public void ChangeKo() => change("ko");
    // 영어 버튼에서 호출할 함수
    public void ChangeEn() => change("en");
}

 

추가로 만약에라도 Script에서 TextMeshPro의 text를 바꾸게 되는 경우에는 언어 설정을 어떻게 할지가 고민이였습니다.

그래서 찾아보던중 아래의 스크립트로 TableName과 key를 입력해서 데이터를 가지고 올 수 있다는 것을 알게되어 Cash해두는 Manager를 따로 둔 뒤 초기 Start일 때 필요한 String들을 저장해두고 이후에 언어 변경이 일어날 때 다시 호출하여 Refresh 해주는 식으로 사용했습니다.

public async UniTask<string> GetTextAsync(string tableName, string key)
{
    return await LocalizationSettings.StringDatabase
        .GetLocalizedStringAsync(tableName, key)
        .Task
        .AsUniTask();
}