Frage

Können Sie empfehlen eine gute Möglichkeit zur Umsetzung einer Mehrsprachigen system für eine WPF-app?Die Methode, die ich verwende jetzt beinhaltet die XML-Klassen und ein xaml-Erweiterung.Es Funktioniert gut in den meisten Fällen, aber wenn ich zu deal mit dynamische Etiketten oder dynamischen text in Allgemeinen, es erfordert einige zusätzliche Anstrengungen.Ich möchte die Programmierer arbeiten nur in den Haupt-problem und vergaß die lang Probleme.

War es hilfreich?

Lösung

Ich bin mit dem WPF-Lokalisierung Erweiterung.Es ist eine wirklich einfache Weise zu lokalisieren, jede Art von DependencyProperty auf DependencyObjecten.

  • ist in einem wirklich stabilen Zustand
  • unterstützt die Bindung-wie Schreibstil, wie Text = {LocText ResAssembly:ResFile:ResKey}
  • funktioniert mit die .resx-fallback-Mechanismus (z.B.en-us -> de -> unabhängige Kultur)
  • fördert die Kultur erzwingen (z.B."das Englisch der Zeit")
  • funktioniert mit normalen Abhängigkeiten Eigenschaften
  • funktioniert mit control-Vorlagen
  • kann verwendet werden in XAML (wirklich :P) ohne zusätzliche namespaces
  • kann verwendet werden, im code dahinter zu binden lokalisierte Werte dynamisch generiert controls
  • implementiert INotifyPropertyChanged für den fortgeschrittenen Gebrauch
  • unterstützt die Formatierung von Zeichenfolgen, z.B. "this is the '{0}' value"
  • unterstützt Präfix-und suffix-Werte (aktuell mit LocText Erweiterung)
  • im Einsatz ist in produktive Systeme (wie meine PR-Produkt)
  • Umstellung der Sprache zur Laufzeit betrifft KEINE Zeitscheibe
  • kann verwendet werden mit jede Ressourcendatei (.resx über alle Versammlungen (auch die dynamisch geladene Laufzeit)
  • benötigt keine Initialisierung Prozess (wie "Anruf von xyz zu registrieren, eine spezielle lokalisieren dictionary")
  • ist verfügbar an design-time (MS Expression Blend, Microsoft Visual Studio 2008 (Normal-und SP1)
  • ändern der Sprache möglich ist, zur design-Zeit
  • können lokalisieren jede Art von Daten, die Art, wie lange ein Konverter (TypeConverter) für Sie vorhanden ist (Sie erstreckt sich LocalizeExtension)
  • hat eingebaute Unterstützung für Text, Obere Text, niedrigere Text, Images, Brushes Double und Thickness
  • nicht auf alle Speicher-Lecks
  • die Blätter UID Eigenschaft unberührt
  • bietet eine SpecificCulture zu verwenden als IFormatProvider (z.B. (123.20).ToString(LocalizeDictionary.SpecificCulture) = "123.20" oder "123,20")
  • bietet einige Funktionen zum prüfen und erhalten Werte, die im code hinter
  • nicht verändern, die Kultur, die auf Thread.CurrentCulture oder Thread.CurrentUICulture (kann problemlos geändert werden)

Andere Tipps

Folgen Sie diesen Schritten:

1) Ort alle String Fragmente in einer separaten Ressource-Datei.

Beispiel: StringResources.xaml:

<ResourceDictionary 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:Key="All_Vehicles">All Vehicles</system:String>

</ResourceDictionary>

2) Machen Sie Kopien für jede Sprache, und fügen Sie Sie (übersetzt), um die zusammengeführten Wörterbücher.Vergessen Sie nicht, fügen Sie das Land ISO-code Dinge einfacher zu machen.

Beispiel App.xaml:

<Application x:Class="WpfStringTables.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml">
    <Application.Resources>
        <ResourceDictionary >
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="StringResources.de-DE.xaml" />
                <ResourceDictionary Source="StringResources.nl-NL.xaml" />
                <ResourceDictionary Source="StringResources.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

Die Letzte Ressource Datei mit Zeichenfolgen benutzt werden, ersetzen, text-Teile im code.

3a) Verwenden Sie die text-Teile aus dem String Tabelle:

Beispiel Window1.xaml:

<Window x:Class="WpfStringTables.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
    <Grid>
        <Button Margin="51,82,108,129" Name="AllVehiclesButton" 
                Content="{StaticResource All_Vehicles}"/>
    </Grid>
</Window>

3b) Laden Sie die Ressource aus-code (Nur diesen code verwenden, wenn Sie nicht wollen, zu über XAML):

void PageLoad()
{
  string str = FindResource("All_Vehicles").ToString();
}

4) Wechseln Sie auf die neue Kultur am Anfang der Anwendung:

Codesnippet aus App.xaml.cs:

public static void SelectCulture(string culture)    
{      
    if (String.IsNullOrEmpty(culture))
        return;

    //Copy all MergedDictionarys into a auxiliar list.
    var dictionaryList = Application.Current.Resources.MergedDictionaries.ToList();

    //Search for the specified culture.     
    string requestedCulture = string.Format("StringResources.{0}.xaml", culture);
    var resourceDictionary = dictionaryList.
        FirstOrDefault(d => d.Source.OriginalString == requestedCulture);

    if (resourceDictionary == null)
    {
        //If not found, select our default language.             
        requestedCulture = "StringResources.xaml";
        resourceDictionary = dictionaryList.
            FirstOrDefault(d => d.Source.OriginalString == requestedCulture);
    }

    //If we have the requested resource, remove it from the list and place at the end.     
    //Then this language will be our string table to use.      
    if (resourceDictionary != null)
    {
        Application.Current.Resources.MergedDictionaries.Remove(resourceDictionary);
        Application.Current.Resources.MergedDictionaries.Add(resourceDictionary);
    }

    //Inform the threads of the new culture.     
    Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);

}

Josh Smith schrieb eine eingehende Tutorial über seine bevorzugte Methode dafür: anlegen Internationalized Wizard in WPF .

Es könnte zu einem großen Redesign Punkt (es ist eine MVVM Lösung ), aber MVVM mit scheint es wert aus anderen Gründen als auch.

diesen Artikel Mit Ich habe es geschaffen, leicht Ressource-Dateien zu verwenden, mehrsprachige WPF-Fenster zu behandeln. http://www.codeproject.com/KB/WPF/WPF_Resx_Localization.aspx Sie sollten ihm einen Scheck geben, weil es wirklich einfach ist und effektiv.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top