XamPropertyGrid에 대한 속성 이름, 설명 및 범주 지역화
WPF에서 Enum 설명을 지역화하여 xamPropertyGrid를 수용하는 방법에 대한 블로그 게시물을 조정할 수 있는지 확인하고 싶었지만 DisplayName 및 Category도 지역화하여 조금 더 나아갈 수 있는지 확인하고 싶었습니다.
다른 날 Infragistics WPF 포럼을 탐색하고 xamPropertyGrid 컨트롤의 속성 설명을 지역화하는 방법을 묻는 이 질문에 부딪혔습니다.
원래 포스터는 속성 사용을 포함한 다른 솔루션을 살펴보았지만 이러한 솔루션이 지나치게 복잡하고 간단하지 않다고 생각했습니다. 물론 내 첫 번째 생각은 "그렇다면 잘못하고 있는 것이 있다"였습니다. 그래서 WPF에서 Enum 설명을 지역화 하는 방법에 대한 블로그 게시물을 xamPropertyGrid를 수용하도록 조정할 수 있는지 확인하고 싶었지만 DisplayName 및 Category도 지역화하여 조금 더 나아갈 수 있는지 확인하고 싶었습니다. 내 말은, 우리는 많은 부동산 정보가 있는 부동산 그리드에 있는데, 왜 설명만 현지화합니까? 젠장, 모두 현지화합시다!
현지화 지원 추가
첫 번째 단계는 다른 게시물에서 LocalizedDescriptionAttribute "as-is"를 사용하여 작동하는지 확인하는 것이 었습니다. 그래서 나는이 클래스를 복사하여 내 프로젝트에 붙여 넣었습니다.
public class LocalizedDescriptionAttribute : DescriptionAttribute
{
readonly ResourceManager _resourceManager;
readonly string _resourceKey;
public LocalizedDescriptionAttribute(string resourceKey, Type resourceType)
{
_resourceManager = new ResourceManager(resourceType);
_resourceKey = resourceKey;
}
public override string Description
{
get
{
string description = _resourceManager.GetString(_resourceKey);
return string.IsNullOrWhiteSpace(description) ? string.Format("[[{0}]]", _resourceKey) : description;
}
}
}
이제 DisplayName 및 속성 범주에 대한 지원을 추가하려고 합니다. 그래서 LocalizedDescriptionAttribute에 사용한 것과 매우 유사한 접근 방식을 사용하는 두 개의 다른 클래스를 만들었습니다.
LocalizedDisplayNameAttribute는 거의 동일하게 보입니다.
public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
readonly ResourceManager _resourceManager;
readonly string _resourceKey;
public LocalizedDisplayNameAttribute(string resourceKey, Type resourceType)
{
_resourceManager = new ResourceManager(resourceType);
_resourceKey = resourceKey;
}
public override string DisplayName
{
get
{
string displayName = _resourceManager.GetString(_resourceKey);
return string.IsNullOrWhiteSpace(displayName) ? string.Format("[[{0}]]", _resourceKey) : displayName;
}
}
}
그러나 LocalizedCategoryAttribute 에는 약간의 수정이 있습니다. GetLocalizedString 메서드를 재정의해야 했습니다. 그 외에는 논리가 동일합니다.
public class LocalizedCategoryAttribute : CategoryAttribute
{
readonly ResourceManager _resourceManager;
readonly string _resourceKey;
public LocalizedCategoryAttribute(string resourceKey, Type resourceType)
{
_resourceManager = new ResourceManager(resourceType);
_resourceKey = resourceKey;
}
protected override string GetLocalizedString(string value)
{
string category = _resourceManager.GetString(_resourceKey);
return string.IsNullOrWhiteSpace(category) ? string.Format("[[{0}]]", _resourceKey) : category;
}
}
이제 프로젝트에 몇 개의 Resource.resx 파일을 추가하고 원하는 문화권을 대상으로 지정할 수 있습니다. 영어와 일본어(일본어)에 대응하고 있습니다.

PersonResources.resx(영어)

PersonResources.ja-JP.resx (Japanese)

리소스가 있으므로 지역화를 시작하기 위해 몇 가지 속성이 필요합니다. 나는 그것을 간단하게 유지하고 단일 속성이있는 Person 클래스를 사용할 것입니다.
public class Person
{
[LocalizedDisplayName("NameDisplayName", typeof(PersonResources))]
[LocalizedDescription("NameDescription", typeof(PersonResources))]
[LocalizedCategory("PersonCategory", typeof(PersonResources))]
public string Name { get; set; }
}
앱을 실행하고 우리가 가지고 있는 것을 봅시다. 기본값은 영어 리소스입니다. 즉, 표시되는 모든 값이 PersonResources.resx 파일에서 검색되고 있습니다.

일본의 현지화된 가치관을 사용하기 위해 바꾸고 싶을 때는 어떻게 해야 할까요? 글쎄, 알아 보자. App.xaml.cs 열고 시작 메서드를 재정의하고 문화권을 변경합니다.
protected override void OnStartup(StartupEventArgs e)
{
CultureInfo info = new CultureInfo("ja-JP");
Thread.CurrentThread.CurrentCulture = info;
Thread.CurrentThread.CurrentUICulture = info;
}
Now, run the applications again.

매력처럼 작동합니다! PersonResources.ja-JA.resx 파일에 저장된 일본어 리소스에서 값이 검색되고 있음이 분명합니다.
꽤 매끄럽죠? 나는 이것이 너무 복잡하거나 따르기 어렵다고 생각하지 않습니다. 내가 보기에는 꽤 간단해 보입니다. 어떻게 생각하세요? 바라건대 이것이 유용하다는 것을 알게 될 것이고 WPF 응용 프로그램에서이 방법을 사용할 수도 있습니다. 소스 코드를 확인하고 게임을 시작하십시오. 항상 그렇듯이 제 블로그로 저에게 연락하거나, Twitter(@brianlagunas)에서 저에게 연결하거나, 질문이나 의견이 있는 경우 아래에 의견을 남겨주세요.