WinUI 3에서 국제화 지원 활용

WinUI 3에서는 쉽게 국제화를 사용할 수 있습니다.

...
<TextBlock x:Uid="hellomessage" />
...

Strings/ko-KR/Resources.resw

...
<data name="hellomessage.Text" xml:space="preserve">
   <value>안녕하세요!</value>
</data>

Strings/en-US/Resources.resw

...
<data name="hellomessage.Text" xml:space="preserve">
   <value>Hello!</value>
</data>

이렇게 하면 한국어일 경우 "안녕하세요!"가, 영어일 경우 "Hello!"가 표시 됩니다.

코드에서는, ResourceLoader를 통해 언어 별 자원에 접근할 수 있습니다.

ResourceLoader resourceLoader = new();
resourceLoader.GetString("hellomessage");

확장 메소드를 사용하면 좀 더 사용이 편하겠죠.

    internal static class ResourceExtensions
    {
        private static ResourceLoader _resLoader = new();

        public static string GetLocalized(this string resourceKey)
        {
            return _resLoader.GetString(resourceKey);
        }
    }
"hellomessage".GetLocalized();

그런데 XAML에서 x:Uid를 통해 해당 언어를 찾아 가는건 좋으나 동적 데이터에 적용하는 것은 안됩니다. 이럴 경우 컨버터를 적절히 만들어서,

    /// <summary>
    /// 현지화 컨버터
    /// </summary>
    public class LocalizationConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            if (value is null)
                return null!;

            var localizedValue = value.ToString()!.GetLocalized();
            return localizedValue;
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            throw new NotImplementedException();
        }
    }

컨버터를 통해 국제화를 적용할 수 있습니다.

4 Likes