Multilangues in WPF [fermé]
pouvez-vous recommander un bon moyen de mettre en œuvre un système multilingue pour une application WPF? La méthode que j'utilise actuellement implique XML, classes et une extension xaml. Cela fonctionne très bien dans la plupart des cas, mais lorsque je dois traiter avec des étiquettes dynamiques ou du texte dynamique en général, cela demande un effort supplémentaire. Je voudrais laisser le programmeur travaillant seulement dans le problème principal et oublié les questions de lang.
4 réponses
j'utilise le WPF localisation Extension . C'est vraiment un moyen facile de localiser n'importe quel type de DependencyProperty
sur DependencyObject
.
- est dans un état stable réel
- supporte un style d'écriture semblable à une reliure comme
Text = {LocText ResAssembly:ResFile:ResKey}
- travaille avec l' .mécanisme de repli resx (p.ex. en-us -> en -> culture indépendante)
- soutient le forçage de la culture (par ex. doit être anglais tout le temps")
- fonctionne avec la normale des propriétés de dépendance
- fonctionne avec les gabarits de contrôle
- peut être utilisé dans XAML (vraiment :P) sans espaces de noms supplémentaires
- peut être utilisé dans le code behind pour lier des valeurs localisées aux commandes générées dynamiquement
- met en œuvre
INotifyPropertyChanged
pour une utilisation avancée - supporte le formatage de chaîne de caractères, p.ex.
"this is the '{0}' value"
- supporte les valeurs de préfixe et de suffixe (actuellement avec
LocText
extension) - est utilisé dans les systèmes de production (comme mon produit de relations publiques)
- commutation de la langue à l'exécution affecte NON timeslice
- peut être utilisé avec n'importe quel fichier de ressources (
.resx
) dans tous les assemblages (y compris le dynamique chargé à l'exécution) - n'a pas besoin de processus d'initialisation (comme "appeler xyz pour enregistrer un dictionnaire de localisation spécial")
- est disponible au moment de la conception (ms Expression Blend, MS Visual Studio 2008 (Normal et SP1))
- la modification de la langue choisie est possible au moment de la conception
- peut localiser n'importe quel type de type de données, aussi longtemps qu'un convertisseur (
TypeConverter
) existe (s'étendLocalizeExtension
) - a construit en support pour
Text
, le hautText
, la baisseText
,Image
s,Brush
es", 1519140920" etThickness
- n'affecte aucune fuite de mémoire
- laisse la
UID
propriété intacte - offre un
SpecificCulture
à utiliser commeIFormatProvider
(par exemple(123.20).ToString(LocalizeDictionary.SpecificCulture) = "123.20"
ou"123,20"
) - offre certaines fonctionnalités pour vérifier et obtenir des valeurs de ressources dans le code derrière
- ne modifie pas la culture sur
Thread.CurrentCulture
ouThread.CurrentUICulture
(peut être changé facilement)
suivez ces étapes:
1) placez tous les fragments String
dans un fichier de ressources séparé.
exemple: 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) faites des copies pour chaque langue et ajoutez-les (traduites) aux dictionnaires fusionnés. N'oubliez pas d'ajouter le code ISO du pays pour faciliter les choses.
exemple 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>
le dernier fichier de ressources avec des chaînes de caractères sera utilisé pour remplacer les parties de texte dans le code.
3a) utiliser les parties de texte de la String
table:
exemple 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) chargez la ressource à partir du code (n'utilisez ce code que si vous ne voulez pas le définir via XAML
):
void PageLoad()
{
string str = FindResource("All_Vehicles").ToString();
}
4) passer à une nouvelle culture au début de l'application:
Codesnippet de 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 a écrit un tutoriel en profondeur sur sa méthode préférée pour ceci: création D'un assistant internationalisé dans WPF .
il pourrait vous orienter vers une grande refonte (c'est une solution MVVM ), mais l'utilisation de MVVM semble en vaut la peine pour d'autres raisons aussi bien.
en utilisant cet article, j'ai réussi à utiliser facilement des fichiers de ressources pour manipuler des fenêtres WPF multilingues. http://www.codeproject.com/KB/WPF/WPF_Resx_Localization.aspx Vous devriez lui donner un contrôle parce que c'est vraiment simple et efficace.