2010-10-04 7 views
8

J'ai une question très commune. Quelle est la meilleure façon de faire la localisation dans une application WPF? Eh bien, j'ai cherché beaucoup dans SO et Binged aussi. Mais je ne pouvais pas trouver de pointeurs qui soit vraiment simple et élégant.WPF Localisation en XAML, quelle est la manière simple, facile et élégante de le faire?

Supposons que je dois afficher dans l'interface utilisateur quelque chose comme:

En anglais: Orgnanization - Beoing

En français: Organizzazione - Beoing

<StackPanel Orientation="Horizontal"> 
     <TextBlock Text="Organization -"></TextBlock> 
     <TextBlock Text="{Binding Path=OrganizationName}"> 
     </TextBlock> 
    </StackPanel> 

Fondamentalement, je dois attribuer le localisé texte à l'étiquette d'organisation TextBlock. Dois-je séparer le trait d'union de "Organisation -" et le mettre dans une étiquette séparée?

Comment faire cela?

+5

'Organizzazione' est pas français! -> 'organization' –

Répondre

0

Nous avons une application qui peut changer les langues de l'interface utilisateur à l'exécution et a la possibilité d'utiliser de nouvelles langues de l'interface utilisateur en copiant les ressources appropriées dans un répertoire spécifique. Utiliser une sorte de ressources compilées pour cela est trop rigide en termes de distribution, etc. Nous avons donc nos ressources linguistiques dans un ResourceDictionary sous la forme System: Strings - un ResourceDictionary dans un fichier XAML séparé pour chaque langue. Les fichiers XAML sont marqués Contenu dans VS et copiés. Vous pouvez les utiliser en tant que DynamicResources dans XAML ou via une instance de Localizer en C#. Ce concept a fait ses preuves très utile dans notre application.

1

Jetez un oeil à ce livre blanc, si je me souviens bien, il explique comment utiliser le dictionnaire des ressources en XAML pour la localisation -

Ce projet comprend un livre blanc avec des exemples de code pour aider de Windows Presentation Foundation (WPF) les développeurs localisent leurs applications . Le livre blanc compare LocBaml et classique Resx approches avec les avantages et les inconvénients.

http://wpflocalization.codeplex.com/

2

Je lie toutes les étiquettes, etc. dans mon application à un objet que j'utilise pour afficher les différentes langues. Je stocke toutes les chaînes dans une base de données et récupère juste les chaînes appropriées basées sur la langue que l'utilisateur a choisie. Cela a l'avantage de se mettre à jour instantanément pendant l'exécution. De cette façon, l'utilisateur n'a pas besoin de redémarrer l'application comme vous le feriez si vous choisissiez de rendre les fenêtres 'Localizable'.

+0

Pour changer à l'exécution, consultez [LocalizationExtension] (https://wpflocalizeextension.codeplex.com/). – Peter

6

Créer un projet WpfApplication1

Créer un dossier « Localisation »

Ajouter un fichier de ressources (Strings.resx) dans la « localisation \ » et ajoutez la chaîne « OrganizationText » et la valeur « Organisation »

Lors de la compilation, un fichier designer.cs est généré. Malheureusement, toutes les méthodes de ce fichier sont internes et nous avons besoin d'un accès public pour activer les références de chaîne à partir de wpf. Pour ce faire, remplacez l''outil personnalisé' .resx par 'PublicResXFileCodeGenerator' (> = vs2008) et reconstruisez-le. Utilisez ce xaml dans MainWindow.XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:localization="clr-namespace:WpfApplication1.Localization" 
     Title="MainWindow" Height="350" Width="525"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{x:Static localization:Strings.OrganizationText}"/> 
     </StackPanel> 
</Window> 

Pour ajouter le « - », vous devez utiliser multiliaison (voir here)

+0

Eh bien Votre approche ne fonctionne pas. Je suis confronté à cette erreur Une exception de première instance de type «System.Windows.Markup.XamlParseException» s'est produite dans PresentationFramework.dll Informations supplémentaires: 'Provide value' sur System.Windows.Markup.StaticExtension 'a généré une exception.' Numéro de ligne '30' et position de ligne '26'. –

+1

Je viens de créer ce projet et ça fonctionne comme un charme (vs 2013, net 4.5 et net 4 aussi). Avez-vous ajouté le nom et la valeur 'OrganizationText' dans string.resx? (réponse éditée avec plus de détails) –

+2

Très bien. J'ai trouvé que cette ressource devrait être publique. Il est interne par défaut. –

0

J'ai fait une solution de localisation complète qui prend en charge également la traduction de XAML par un certain nombre de MarkupExtensions (y compris l'éditeur de traduction.) . Il utilise un dictionnaire avec tous les textes traduits (y compris les formes au singulier/pluriel) qui peuvent être accédés par MarkupExtensions à partir de XAML ou des méthodes régulières à partir d'autres codes. Les MarkupExtensions prennent également en charge la modification de la langue lors de l'exécution et même la mise à jour lorsque le fichier de dictionnaire sous-jacent est modifié.

Les autres caractéristiques sont la mise en page et l'aide à la mise en forme et à la numérotation des dates et heures. J'utilise cette bibliothèque avec succès dans quelques applications et je prévois de l'utiliser dans plus d'applications à l'avenir.

http://dev.unclassified.de/source/txlib

Questions connexes