2011-12-15 4 views
1

컨트롤의 culture를 명시 적으로 제어하여 리소스 (.resx)/문화권의 값을 검색 할 수 있도록 설정할 수 있습니까?WPF 리소스 : 개별 컨트롤의 명시적인 지역화

글로벌 응용 프로그램 문화가 "en-US"이지만 일부 컨트롤이 "sv-SE"에 있어야한다고 가정 해 보겠습니다. 내 프로젝트에는 resource.resxresource.sv-se.resx 파일이 있습니다. 전체 응용 프로그램에서 문화/언어를 전환하는 데는 효과적이지만 컨트롤 수준에서이를 제어하는 ​​방법을 알 수는 없습니다. Language="sv-SE"을 설정하면 충분하지만 TextBlock은 여전히 ​​영어 자원 파일에서 가치를 얻고 자합니다.

<Windows 
    xmlns:resx="clr-namespace:MyApplication.Localization" 
    ... 
    > 


    <TextBlock x:Name="TextInEnglish" Text="{x:Static resx:Resources.MyText}" /> 

    <TextBlock x:Name="TextInSwedish" Language="sv-SE" Text="{x:Static resx:Resources.MyText}" /> 
    ... 

어떻게해야합니까?

+0

2 아이디어 :하지만 당신은 당신이 문화를 지정할 수 있습니다 태그 확장을 만들 수 있습니다 1) 값 변환과에 multibinding를 사용 언어 및 텍스트. 2), 언어 속성을 무시하고 변경 내용을 수신하고 이에 따라 텍스트 (또는 다른 속성)를 업데이트하는 언어 및 텍스트 또는 로캘 ID에 대한 연결된 속성을 만듭니다. 하지만이 문제를 해결할 더 좋은 방법이 있다고 생각합니다. – dowhilefor

+0

@dowhilefor : 귀하의 의견을 보내 주셔서 감사합니다. 나는 실제로 가치 변환기로 시작했지만 결국에는 그것을 좋아하지 않았습니다. 좀 지저분 해. 두 번째 아이디어는 흥미로운 것으로 들리지만 코드를 완전히 이해하려면 코드에서 볼 필요가 있다고 생각합니다. 건배! –

답변

3

ResourceManager 클래스는 Language 속성을 고려하지 않으며 CurrentUICulture 만 사용합니다.

public class LocalizedResourceExtension : MarkupExtension 
{ 
    [ConstructorArgument("resourceKey")] 
    public string ResourceKey { get; set; } 

    public CultureInfo Culture { get; set; } 

    public LocalizedResourceExtension() 
    { 
    } 

    public LocalizedResourceExtension(string resourceKey) 
    { 
     this.ResourceKey = resourceKey; 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (string.IsNullOrEmpty(ResourceKey)) 
      throw new InvalidOperationException("ResourceKey must be set"); 

     return Properties.Resources.ResourceManager.GetObject(
      ResourceKey, 
      Culture ?? CultureInfo.CurrentUICulture); 
    } 
} 

당신은 다음과 같은 코드에서 사용할 수 있습니다 :

<TextBlock x:Name="TextInEnglish" Text="{loc:LocalizedResource MyText}" /> 

<TextBlock x:Name="TextInSwedish" Text="{loc:LocalizedResource MyText, Culture=sv-SE}"/> 
+0

+1 뛰어난 답변과 해결책! 고맙습니다! –

+0

@AvadaKedavra, 당신 말이 맞아요. –

+0

+1로 고정 시켰습니다. 나는이 아이디어를 좋아합니다. 맞춤형 마크 업 확장을위한 완벽한 솔루션입니다. – dowhilefor