2012-03-29 12 views
0

Ich lokalisiere eine WPF-App mit der LocBaml-Methode. Alles funktioniert großartig für UI, das in .xaml-Dateien definiert ist. Allerdings habe ich ein paar Strings, die im Codebehind generiert werden, die auch lokalisiert werden müssen. Also habe ich versucht, den von Microsoft empfohlenen Ansatz in this Artikel zu nehmen. Ich habe eine XAML-Ressource Wörterbuch-Datei als solche:Lokalisieren von Zeichenfolgen in WPF-Codebehind mithilfe von XAML ResourceDictionary

<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> 

ich dann ein Drittanbieter-Tool verwenden, um die lokalisierte resources.dll, die eine spanische Version des Ressourcenverzeichnis zu generieren.

jedoch, wenn ich rufe zurück

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

localizedMessage immer den Wert definiert in der en-US-Version der DLL. Ich muss etwas falsch verstehen. Was muss ich tun, damit die lokalisierte Version der Zeichenfolge zurückgegeben wird?

+0

Haben Sie die Montagekultur definiert? (Es sollte neutral bleiben.) Ist die Kultur Ihres Threads en-US oder die erwartete lokalisierte (sollte die letztere sein)? Was passiert, wenn Sie von einem XAML auf die Ressource verweisen? ('

+0

Übrigens, die Parameter 'x: Uid =" system: String_1 "x: Schlüssel =" localizedMessage "' sollte gleich sein, AFAIK. (Das heißt, x: Uid = "lokalisierteMessage" x: Key = "lokalisierteMessage".) – Vlad

+0

In meiner AssemblyInfo.cs habe ich '[assembly: NeutralResourcesFallbackLocation.Satellite)], und Setzen eines Haltepunkts beim Aufruf, um die Ressourcen zu ziehen zeigt meine Thread-Kultur und Uiculture sind beide auf "es" –

Antwort

0

Nach Diskussion mit dem OP besteht das Problem darin, die Sprache zu spät einzustellen (in App 's OnStartup).

Tatsächlich werden die lokalisierten Ressourcenwörterbücher einmal geladen, wobei die aktuelle Sprache des Threads verwendet wird. Wenn sich die Threadsprache zu spät ändert, sind die Ressourcen bereits geladen und es wird kein Neuladen ausgelöst.

Eine Lösung in diesem speziellen Fall wäre, das Gebietsschema des UI-Threads so früh wie möglich zu ändern - also im Konstruktor App.

+0

Ich fand heraus, dass ich das Gebietsschema des Gewindes sogar vor dem Aufrufen von InitializeComponent() im App-Konstruktor setzen musste. Hoffe, das hilft jemandem. –

+0

@TomasKohl: In der Tat! 'InitializeComponent' lädt und interpretiert XAML, sodass die Ressourcenwörterbücher möglicherweise bereits geladen werden. – Vlad

Verwandte Themen