Hits


Localization Manager (StringManager)

Localization 을 좀 더 편리하고 유틸화 시켜서 사용해보자

  • 로컬라이제이션에 관한 글 여기서 설명했던 방법은 UGUI 상에 StringEvent 컴포넌트에 직접 할당하거나
  • StringEvent 그 자체를 받아와서 세팅하는 방법이 주 였다.
  • 하지만, 이 방법은 좀 더 복잡하고 유연성있게 string 을 조합할 수 없었다.
  • 따라서 로컬라이즈의 smart 기능을 사용하여 StringManager라는 유틸리티 매니저를 통해 모두가 공통적으로 로컬라이제이션을 사용할 수 있게 시도했다.
  • 사실 StringManager 내부에서는 string을 조합함으로 발생하는 박싱/언박싱 혹은 할당을 방지하기 위해 Cysharp 의 Zstring 기능과 비속어 필터를 처리하는 NGWord 등의 기능이 함께 내포되어있다.
  • 즉, string 전용 Util 클래스인 셈


Unity Localize Table : Smart 옵션

  • 우선 코드를 보기에 앞서 유니티 로컬라이제이션 테이블과 실제로 구글 스프레드 시트의 테이블을 짚고 넘어가자.

Desktop View

  • 사진을 보면 각 데이터들에 Smart 옵션이 체크되어 있는것을 확인할 수 있다.
  • 테이블 데이터 내에 ‘{}’ 로 표시하면 이 데이터에 각 작업자가 원하는 데이터를 할당할 수 있다. 예를 들어 시간,금액,날짜 등 과 같은 int값을 넣을 수도 있고 유저 네임과 같은 string 도 자유자재로 넣을 수 있다.


Desktop View

  • 실제 구글 스프레드 시트 내부의 모습

  • 이 smart 기능을 사용하면 기존의 방법처럼 로컬라이즈된 텍스트를 받아와서 원하는 정보값을 더해 새로운 string 을 조합하거나 하는 수고를 덜 수 있다.


  • 다음 코드는 로컬라이즈 키 값과 smart 데이터 값을 세팅하여 결과 값으로 로컬라이제이션이 된 텍스트를 받아오는 유틸 함수이다.
  • values 배열 파라미터 내부에 테이블을 참조하여 어떤 데이터가 들어가는지 순서를 확인하고 넘겨주면 된다.
  • 참고로 GetLZString 은 오버로딩된 실제로 기능을 수행하는 메인 함수임
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/// <summary>
/// the given values replace indexed placeholders in the string.
/// e.g.) {0} is {1} old. -> He is 13 old.
/// </summary>
/// <param name="key">Key.</param>
/// <param name="values">Values for the replacing</param>
public static string GetLZString(string key, params object[] values)
{
	try
	{
		string txt = key;
		
		if (LocalizationSettings.StringDatabase.GetTable(LOCALIZE_TABLE_NAME).GetEntry(key).IsSmart)
		{
			txt = GetLZString(key, LOCALIZE_TABLE_NAME, values);
			return txt;
		}
		else
		{
			txt = GetLZString(key);
			if (txt != null)
			    return Smart.Format(txt, values);
			else
			    return txt;
		}
	}
	catch (Exception e)
	{
		Debug.LogError("The count of prameters is wrong!!!!! [" + key + "][" + e.ToString() + "]");
		return key;
	}
}


  • 실제로 테이블 레퍼런스와 키를 참조하여 로컬라이즈 값을 가져오고 세팅하는 메인 함수
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    // main Localize string function
    public static string GetLZString(string key, string table, params object[] values_)
    {
      LocalizedString lzString = new LocalizedString() { TableReference = table, TableEntryReference = key };
      var stringOperation = values_ != null ? lzString.GetLocalizedStringAsync(values_) : lzString.GetLocalizedStringAsync();
      if (stringOperation.IsDone && stringOperation.Status == AsyncOperationStatus.Succeeded)
      {
          return stringOperation.Result;
      }
      else
      {
          Debug.LogError("GetLZString|stringOperation fail...key:" + key);
          return key;
      }
    }
    


  • 실사용 예시이다.
  • TMP_Text 컴포넌트의 text 에 직접 string 값을 할당하는 모습이다. 두 번째 파라미터에 데이터를 세팅하는 부분을 확인하면 좋을거같다.
  • 박싱/언박싱 그리고 동적할당으로 발생하는 GC가 걱정된다면 분명 다른 효율적인 방법도 있을 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 public async void Renew()
    {
		// ...

        switch (_data.RecentMessage.MessageType)
        {
			// ...
			case MsgType.MsgLoginbonusDaily:

                _recentMsgText.text = StringManager.GetLZString("LZ_LB_011", new { nn = _data.RecentMessage.Text });
                break;
			// ...
		}
		// ...
	}