본문 바로가기

유니티

[ 유니티 ]Localization 구현하기

[ Localization 사용을 위한 초기 세팅 ]

1 . 설치하기

[ 설치하기 ]

- PackageManager - Localization 패키지를 설치한다 .

- 패키지의 효과적인 관리를 위해 Addressable도 같이 설치가 될 것이다 .

 


2 . 설정 세팅하기

 

[ 세팅 생성하기 ]

- Project Setting - Localization - Create 로 세팅을 생성해준다 .


[ 언어 추가하기 ]

  • Command Line Locale Selector : 커멘드 라인에서 변경시 사용
  • System Locale Selector : OS에 세팅된 기본언어를 가져올때 사용
  • Specific Locale Selector :  컨텐츠 내부 임의적 선택시 사용 . 우리는 이걸 만들어준다 .

- Add Locale로 언어를 추가해주자 .

- 원하는 언어를 선택하자 . Ko와 En을 선택하였다 .

- 하단 +를 눌러 Specific Locale Selector 를 추가하고 방금 만든 언어를 넣어준다 

- Project Locale Identifier는 프로젝트에서 기본이 될 언어를 말한다 . 


3 . 테이블 추가하기

 

Window - Asset Management - Localization Tables 선택

- New Table Collection - String Table Collection을 선택한다 . 이후 Create 로 생성한다 .

- 위와 같이 테이블이 생성된다 .


[ 테이블 채우기 ]

- 다음과 같이 내용을 채워준다 .

- Edit Table는 테이블에 대한 정보를 넣을수 있는 부가정보이다 . 


[ Localization 사용하기 ]

1 . Text에 적용하기

[ TMP에 적용하기 ]

- 로컬라이징 대상 텍스트 옆 점 3개를 누르고 Localize를 선택

- string Reference를 눌러준다 . 여기서 1번 테이블을 눌러 적용 .

- Editor String 하단 Editor And Runtime으로 바꿔주어 에디터에서도 볼 수 있게 한다 .


[ 테이블 바로 생성하기 ]

- Table Collection이 선택된 상황에서 Add Table Entry를 눌러 바로 추가가 가능하다 

- 다음과 같이 Entry Name - English - Korea를 채워주고 Add Table Entry를 해주면 완료 .

- 실행해보면 이렇게 바뀜을 볼 수 있다 .

- 우측 상단 언어의 변경으로 즉석에서 바뀌는걸 볼 수 있다 . 


2 . Smart 사용하기

[ 변수 그룹 생성 ]

- Create - Localization - Variable Group을 눌러 변수 그룹을 생성

- 변수를 만든다 .


[ Smart 텍스트 사용 ]

- Smart 체크후 {}안에 방금 생성한 Variables의 Name을 넣는다 .

- Preview를 통해 다음과 같이 보인다면 성공 .


[ 스크립트에서 사용하기 ]

1 . 언어 설정 변경하기

[ 언어 변경 ]

	async UniTask SetUp()
    {
        await LocalizationSettings.InitializationOperation;
    }
    void ChangeLocalization(int index)
    {
        LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales[0];
    }

- 먼저 로컬라이제이션 세팅이 준비될때까지 대기가 필요하다 . InitializationOperation을 통해 대기한다 .

- 이후 Selected Locale을 통해 언어 설정 변경이 가능하다 .


2 . 문자열 가져오기

[ 동기 ]

    void GetLocal()
    {      
        Locale currentLanguage = LocalizationSettings.SelectedLocale;
        var a = LocalizationSettings.StringDatabase.GetLocalizedString("MyTable", "Cry", currentLanguage);
        //만약 currentLanguage가 없다면 현재 언어를 기준으로 가져온다 . 즉 , 선택사항
        var a2 = LocalizationSettings.StringDatabase.GetLocalizedString("MyTable", "Cry");
    }

- 위와 같이 동기 방식으로 가져 올 수 있다 .

[ 동기 ]

async UniTask<string> GetLocalAsync()
    {
       return await LocalizationSettings.StringDatabase.GetLocalizedStringAsync("MyTable", "Cry");
    }
  • GetLocalizedString: 성능과 차단이 큰 문제가 아닌 간단하고 즉각적인 요구에 가장 적합합니다. 빠르고 간단한 현지화 작업에 이상적입니다.
  • GetLocalizedStringAsync: 성능이 중요하고 대규모 지역화 데이터 세트를 로드하거나 비동기 초기화를 처리해야 하는 시나리오에 가장 적합합니다. 강력하고 확장 가능한 현지화 솔루션에 이상적입니다.

3 . String.Format을 통해 문자열 대체하기

[ 대체 ]

public async UniTask<string> GetLocalizedStringAsync(string key, params string[] replacements)
    {
        var localizedString = await LocalizationSettings.StringDatabase.GetLocalizedStringAsync(key);

        if (replacements != null && replacements.Length > 0)
        {
            localizedString = string.Format(localizedString, replacements);
        }

        return localizedString;
    }

4 . SetReference로 변경하기

[ 대체 ]

void SetReference()
    {
        localizedString.SetReference("LocalizationTable", "1");

        // 로컬라이즈된 문자열이 변경될 때 UI를 업데이트하도록 StringChanged 이벤트 구독
        localizedString.StringChanged += UpdateUIText;

        //// 현재 로컬라이즈된 문자열을 즉시 표시하도록 강제로 업데이트
        UpdateUIText(localizedString.GetLocalizedString());
    }
    void UpdateUIText(string value)
    {
        uiText.text = value;
    }

    // 런타임에 로컬라이제이션 참조를 동적으로 변경하는 예제 메서드
    public void ChangeLocalizationReference(string newTable, string newKey)
    {
        localizedString.SetReference(newTable, newKey);
        UpdateUIText(localizedString.GetLocalizedString());
    }

5 . smart 사용

[ 대체 ]

using UnityEngine;
using UnityEngine.UI;
using TMPro;
using UnityEngine.Localization;
using Cysharp.Threading.Tasks;
using System;

public class Test : MonoBehaviour
{

        public LocalizedString localizedTimeString;
        public TextMeshProUGUI timeText;

        private void Start()
        {
        // Optionally, you can set up a repeating function to update the time every minute.
        UpdateTime().Forget();
        }


        async UniTask UpdateTime()
        {
        while(true)
        {

            await UniTask.Delay(TimeSpan.FromSeconds(1f));
            string currentTime = System.DateTime.Now.ToString("HH:mm::ss");
            localizedTimeString.Arguments = new string[] { currentTime };
            localizedTimeString.StringChanged += OnLocalizedStringChanged;
            localizedTimeString.RefreshString();
        }
    }

        private void OnLocalizedStringChanged(string localizedString)
        {
            timeText.text = localizedString;
        }

        private void OnDestroy()
        {
            // Clean up the event subscription.
            localizedTimeString.StringChanged -= OnLocalizedStringChanged;
        }
    



}

[ CSV로 사용하기 ]

1 . CSV 파일로 내보내기

[ Extension 생성하기 ]

- 생성한 Table을 선택하면 Extensions를 볼 수 있다 .

- CSV Extension을 눌러 생성한다 .

- Include ID / Include Comments가 필요없다면 체크 해제한다 .

- Save를 눌러 저장 .


2 . 스프레드 시트에 추가하기

[ 시트 추가 ]

- 해당 기능은 따로 Extension이 있지만 복잡해 일단 이렇게 사용해보려 한다 .

- 빈 스프레드 시트를 생성 , 가져오기를 눌러준다 .

- 업로드를 눌러 가져온다 .

- 다음과 같이 스프레드 시트에 추가됨을 볼 수 있다 .


3 . 스프레드 시트에서 가져오기

[ 다운로드 ]

- 파일 - 다운로드 - CSV를 눌러 다운

- Import - CSV로 가져온다 .