Multilanguage in WPF [geschlossen]
-
03-07-2019 - |
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.
Lösung
Ich bin mit dem WPF-Lokalisierung Erweiterung.Es ist eine wirklich einfache Weise zu lokalisieren, jede Art von DependencyProperty
auf DependencyObject
en.
- 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 sichLocalizeExtension
) - hat eingebaute Unterstützung für
Text
, ObereText
, niedrigereText
,Image
s,Brush
esDouble
undThickness
- nicht auf alle Speicher-Lecks
- die Blätter
UID
Eigenschaft unberührt - bietet eine
SpecificCulture
zu verwenden alsIFormatProvider
(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
oderThread.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.