기존 작성했던 유니티 Application.systemLanguage로 초기 언어를 설정하는 방법에 추가로 .Net에서 제공하는 CultureInfo를 통해 언어를 설정하는 방법을 작성해보겠습니다. 저의 경우 현지화해야 되는 언어가 유니티에서 제공하는 SystemLanguage에 없어서 이 방법으로 초기화 한 경험이 있습니다.
1. CultureInfo의 정보 속성 확인하기
해당되는 클래스를 사용하기 위해 System.Globalization, System.Threading 네임스페이스를 추가했습니다. 어떤 내용을 보여주는지 간단하게 확인하기 위해 일부 정보를 출력해 보았습니다. 아래는 초기 확인을 위한 스크립트 내용입니다.
using System.Globalization;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;
public class ShowCultureInfo : MonoBehaviour
{
public Text langTestText;
void Start() => ShowInfoMation();
void ShowInfoMation()
{
CultureInfo langInfo = Thread.CurrentThread.CurrentCulture;
langTestText.text =
"System Language: " + Application.systemLanguage.ToString() + "\n"
+ "Name: " + langInfo.Name + "\n"
+ "DisplayName: " + langInfo.DisplayName + "\n"
+ "EnglishName: " + langInfo.EnglishName + "\n"
+ "TwoLetter: " + langInfo.TwoLetterISOLanguageName + "\n"
+ "ThreeLetter: " + langInfo.ThreeLetterISOLanguageName;
}
}
2. CultureInfo 출력 결과
출력 결과입니다. 에디터에서 테스트했기 때문에 설정된 시스템 언어는 한국어입니다.
여러 가지 정보가 있지만 저의 경우 두 글자 정보만 확인하여 사용했습니다. 전체 속성 정보는 dotnet공식 페이지에서 확인 가능했고 나라별 코드는 "CultureInfo country code"로 인터넷 검색으로 쉽게 얻을 수 있었습니다.
3. 사용 예시
기존 작성했던 GUI Text 다국어 번역하기의 DisplayUI.cs에 코드 수정 및 추가한 예시입니다. 변경된 코드로 실행하면 버튼 필요 없이 콘텐츠가 변역 됩니다.
using System.Globalization;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;
public enum Language {ENGLISH, KOREAN, JAPANESE} // 언어별 enum
public class DisplayUI : MonoBehaviour
{
public static Language language; // 다른 클래스의 접근을 위한 static 선언
TranslationManager translationManager; // TranslationManager 클래스 주소를 담기 위한 변수
public Text titleText; // 타이틀에 사용중인 텍스트 컨포넌트를 참조할 변수
void Awake()
{
// 게임 씬내 TranslationManager를 찾아서 할당합니다.
translationManager = FindObjectOfType<TranslationManager>();
InitLanguage(); // 추가된 초기언어 설정 함수
DisplayTitle();
}
// CultureInfo의 정보를 읽어 초기 언어를 설정
void InitLanguage()
{
CultureInfo langInfo = Thread.CurrentThread.CurrentCulture;
switch(langInfo.TwoLetterISOLanguageName)
{
case "en":
language = Language.ENGLISH;
break;
case "ko":
language = Language.KOREAN;
break;
case "ja":
language = Language.JAPANESE;
break;
default :
language = Language.ENGLISH;
break;
}
}
void DisplayTitle()... // 생략
// 버튼별 언어를 변경하고 UI를 갱신
public void EnglishButton()... // 생략
public void KoreanButton()... // 생략
public void JapaneseButton()... // 생략
}
4. 추가 필요한 부분
작성된 코드로는 게임이 실행될 때마다 언어가 초기화되는 문제가 있습니다. 해결법은 언어 값을 저장해놓고 값에 따라 다르게 작동하게 하면 되는데 InitLanguage 함수 마지막 부분에 값을 저장하고, 실행 전에는 검증하는 코드를 추가하였습니다.
void InitLanguage()
{
// "Language" 키로 저장된 값이 있으면 해당 언어로 설정 하고
// return으로 초기화를 중지
// 키에 저장된 값이 없을때는 9가 리턴
if(PlayerPrefs.GetInt("Language", 9) != 9)
{
language = (Language) PlayerPrefs.GetInt("Language");
return;
}
CultureInfo langInfo = Thread.CurrentThread.CurrentCulture;
switch(langInfo.TwoLetterISOLanguageName)
{
case "en":
language = Language.ENGLISH;
break;
case "ko":
language = Language.KOREAN;
break;
case "ja":
language = Language.JAPANESE;
break;
default :
language = Language.ENGLISH;
break;
}
PlayerPrefs.SetInt("Language",(int)language); // 초기화 완료 후 최초 언어값 저장
}
저장할 때는 language에 저장된 enum값을 int로 형 변환하여 정수로 저장해둔다. 정수 값은 enum에 선언된 콘텐츠의 순번입니다. (ENGLISH = 0, KOREAN = 1, JAPANESE = 2)
읽을 때는 int값을 Language로 형 변환하여 language값에 할당했습니다.
'유니티 이야기' 카테고리의 다른 글
[Unity] 대량의 엑셀데이터 유니티 인스턴스로 밀어넣기 (0) | 2022.08.28 |
---|---|
[Unity] json 직렬화 저장 및 읽어오기 + 암호화 (utf8) (1) | 2022.08.27 |
[Unity] 게임 데이터 바이너리 파일로 저장하기 (0) | 2022.08.25 |
[Unity] 현지화를 위한 게임 구동 시 언어를 자동으로 설정하는 방법 (0) | 2022.08.24 |
[Unity] GUI Text 다국어 번역 하기 (0) | 2022.08.23 |
댓글