2012-03-29 6 views
0

LocBamlメソッドを使用してWPFアプリケーションをローカライズしています。 .xamlファイルで定義されているUIはすべてうまく動作します。しかし、ローカライズする必要があるコードビハインドで生成されるいくつかの文字列があります。だから私はthisの記事でMicrosoftが推奨するアプローチを取ろうとしました。私は、次のようなXAMLリソースディクショナリファイルを持っている: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を生成するために、サードパーティ製のツールを使用します。私は

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

localizedMessage呼び出すしかし

は、常にDLLのEN-USバージョンで定義された値を返します。私は何かを誤解しているに違いない。文字列のローカライズ版を返すためには何が必要ですか?

+0

アセンブリカルチャを定義しましたか? (中立のままでなければなりません)あなたのスレッドの文化はen-USか、またはローカライズされたものか(後者でなければなりません)? XAMLのリソースを参照するとどうなりますか? ( '

+0

ところで、パラメータ 'x:Uid =" system:String_1 "x:Key =" localizedMessage "はAFAIKと同じでなければなりません。 – Vlad

+0

私のAssemblyInfo.csには、[assembly:NeutralResourcesLanguageAttribute( "en-US"、UltimateResourceFallbackLocation.Satellite)]という名前があります。また、 "x:Uid =" localizedMessage "x:Key =" localizedMessage "リソースをプルするための呼び出しでブレークポイントを設定すると、スレッドの文化と養殖が両方とも "es" –

答えて

0

OPとの議論の後、言語を設定するのが遅すぎる(AppOnStartup)。

実際、ローカライズされたリソースディクショナリは、スレッドの現在の言語を使用して1回読み込まれます。スレッド言語の変更が遅すぎる場合、リソースはすでにロードされており、リロードはトリガーされません。

この特定の場合の解決方法は、UIスレッドのロケールを可能な限り早く、つまりAppのコンストラクタで変更することです。

+0

私は、アプリケーションのコンストラクタでInitializeComponent()を呼び出す前にスレッドのロケールを設定しなければならないことがわかりました。これが誰かを助けることを望みます。 –

+0

@TomasKohl:確かに! 'InitializeComponent'はXAMLをロードして解釈するので、既にリソースディクショナリがロードされている可能性があります。 – Vlad

関連する問題