2011-12-15 1 views
1

コントロールのカルチャを明示的に制御して、リソース(.resx)/カルチャの値を取得するように設定できますか?WPFリソース:個々のコントロールの明示的なローカライゼーション

「en-US」となるグローバルアプリケーションカルチャが、「sv-SE」にいくつかのコントロールを追加したいとします。私のプロジェクトでは、resource.resxresource.sv-se.resxというファイルがあります。アプリケーション全体の文化/言語を切り替えるのにうまくいきますが、コントロールレベルでコントロールする方法を理解することはできません。私は、Language="sv-SE"を設定することは十分であるが、TextBlockはまだ英語resoursesファイルからその価値を引き取っていることを期待していただろう。

<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)の値コンバーターを使用して、上の多あなたはこのようなあなたのコードでそれを使用することができます

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); } } 

:しかし、あなたは、あなたが文化を指定することができるマークアップ拡張機能を作成することができます言語とテキスト。 2)、言語プロパティを無視し、言語とテキストまたはロケIDの添付プロパティを作成します。これにより、変更をリッスンし、それに従ってテキスト(または別のプロパティ)を更新します。しかし、私はこれを解決するより良い方法があると思います。 – dowhilefor

+0

@dowhilefor:ありがとうございました。私は実際には価値交換機で始まったが、私はそれを最後に好まなかった。それは少し乱雑になった。 2番目のアイデアは興味深いように聞こえますが、コードを完全に理解するためにはコードを見る必要があると思います。乾杯! –

答えて

3

ResourceManagerクラスはLanguageプロパティを考慮しません。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