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();
}
}
컨버터를 통해 국제화를 적용할 수 있습니다.