2012-03-29 3 views
0

LocBaml 메서드를 사용하여 WPF 앱을 지역화하고 있습니다. 모든 것은 .xaml 파일에 정의 된 UI에 적합합니다. 그러나 나는 codebehind에서 생성 된 몇 개의 문자열을 현지화해야합니다. 그래서 나는 this 기사에서 Microsoft가 권장하는 접근 방식을 취하려고했습니다.XAML ResourceDictionary를 사용하여 WPF 코드 숨김에서 문자열 지역화

<ResourceDictionary x:Uid="ResourceDictionary_1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:system="clr-namespace:System;assembly=mscorlib"> 

    <!-- String resource that can be localized --> 
    <system:String x:Uid="system:String_1" x:Key="localizedMessage">en-US Message</system:String> 
</ResourceDictionary> 

내가 다음 리소스 사전의 스페인어 버전을 포함하는 지역화 resources.dll를 생성하는 타사 도구를 사용 : 나는 같은 XAML 리소스 사전 파일이 있습니다. 내가

string localizedMessage = (string)Application.Current.Resources["localizedMessage"]; 

localizedMessage 전화 그러나

항상 DLL의 EN-US 버전에 정의 된 값을 반환합니다. 나는 오해를해야만한다. 문자열의 지역화 된 버전을 얻으려면 어떻게해야합니까?

+0

어셈블리 문화를 정의 했습니까? (중립적이어야합니다.) 스레드의 문화는 en-US입니까? 아니면 지역화 된 언어입니까? 일부 XAML의 리소스를 참조하면 어떻게됩니까? ('') – Vlad

+0

그건 그렇고, 매개 변수'x : Uid = "system : String_1"x : Key = "localizedMessage"는 AFAIK와 동일해야합니다. (즉,'x : Uid = "localizedMessage"x : Key = "localizedMessage"'.) – Vlad

+0

내 AssemblyInfo.cs에는'[assembly : NeutralResourcesLanguageAttribute ("en-US", UltimateResourceFallbackLocation.Satellite)]'및 자원을 끌어 오기 위해 중단 점을 설정하면 스레드 문화와 창작물이 모두 "es" –

답변

0

OP와의 토론 후 문제는 언어를 너무 늦게 설정하는 것입니다 (AppOnStartup).

실제로 현지화 된 리소스 사전은 스레드의 현재 언어를 사용하여 한 번로드됩니다. 스레드 언어가 너무 늦게 변경되면 리소스가 이미로드되고 다시로드가 트리거되지 않습니다.

이 특별한 경우의 해결책은 가능한 한 빨리 UI 스레드의 로케일을 변경하는 것입니다. 즉, App의 생성자에 있습니다.

+0

App 생성자에서 InitializeComponent()를 호출하기 전에 스레드의 로케일을 설정해야한다는 것을 알았습니다. 희망이 사람을 도움이됩니다. –

+0

@ 토마스 콜 : 정말로! 'InitializeComponent'는 XAML을로드하고 해석하므로 이미 리소스 사전을로드 할 수 있습니다. – Vlad

관련 문제