WPF C# : Applications multilingues, WPF Localization Extension

1 03 2010

Voilà une problématique à laquelle j’ai du me frotter dernièrement.

J’ai fais quelques recherches afin de voir ce qui existait pour ce faire. Et je suis tomber sur une dll réalisée par un membre de Code Project, WPF Localization Extension.

Seule chose à déplorer, le fait qu’il n’y est qu’un projet démo pour se faire la main. Donc pour faire rapide je vais résumer en quelques points le fonctionnement de cette dll tel que je l’ai comprise

  • Référencer la dll (normale ^^)
  • Créer une ressource (resx) avec le nom de votre choix
  • Ajouter deux autres ressources, en mettant comme nom, nom_ressource1-fr par exemple. et -en pour anglais.

Ensuite, c’est la que toute la magie opère ^^. Dans vos fichier XAML, vous allez tout d’abords ajouter le namespace lex. xmlns:lex=”http://schemas.root-project.org/xaml/presentation”

Prenons l’exemple du label basique :

<Label Content=”{lex:LocText nomAssembly:nom_ressource1:lblMonLabel}” />

{lex: <== ok pour la compréhension

LocText <== Vous spécifiez que vous voulez “localiser” un texte, car oui, vous verrez que vous pouvez localiser pas mal de choses (images par exemple).

nomAssembly<== le nom de votre assembly, couramment le nom du projet.

nom_resource1 <== le nom de la première ressource que vous avez créé

lblMonLabel <== le nom de la clé du fichier ressource sous lequel vous retrouverez la valeur.

Jusque là, vous allez me dire, ça sert à rien, pas de localisation, et en effet, pas de localisation, on y vient.

Revenons à nos fichier de ressources, normalement, vous devriez retrouver dans le premier fichier de ressource : lblMonLabel avec comme valeur la chaîne de caractère. Maintenant, à la place de cette chaine de caractère, écrivez @lblMonLabel. et maintenant, dans vos autres fichiers de ressources localisables (fr et en), vous allez mettre en clé lblMonLabel et en valeur la chaine de caractère traduite. Comme ça, au moment de chercher la valeur dans le premier fichier de ressource, il sera redirigé vers le fichier localisé pour extraire la valeur.

Oui c’est bien beau, mais comme fait-on pour lui dire tel fichier de ressource?

LocalizeDictionary.Instance.Culture = CultureInfo.GetCultureInfo(“fr”); // fr car j’ai choisi de mettre juste -fr à la fin de mon fichier de ressource localisable.

Mais le plus fun est que dès que cette culture est modifiée, toute notre interface passe dans la langue souhaitée. Pas besoin de relancer l’application. C’est très bien géré.

Ça me semble bon pour cet article.

Voici le projet de test fournit par l’auteur : XamlLocalizationTest Source

Tchuss


Actions

Information

18 réponses

22 03 2010
SeriousM

Hello Tchuss,

thanks for your post, i was very happy to see other people they like my wpf localization extension!

thank you very much :)

best wishes,
Bernhard

(creator of the wpf localization extension).

22 03 2010
herbaux mathias

Actually, thank YOU. It was really helpfull for me. I’m currently using it in a personal project, and it works really good. Just a point you should work on it, a doc or an how to, coz it was a little bit difficult to start with only a sample project.

Cordialement, ^^

23 03 2010
SeriousM

yes, this is a point i want to do since a year.
also i want to post on code project, because the community is larger than on codeplex.

do you wanna help me :) ?

24 03 2010
herbaux mathias

Yeah sure, could be really interesting ! we should get in touch by mail, here is mine : mathrb@gmail.com
Bye

16 04 2010
Michaël

Bonjour,

Ce système peut-il être utilisé facilement pour simplement externaliser tout le texte de son code et le mettre dans un fichier de ressource afin de rendre ledit code plus lisible ?

Cela reviendrai à localiser l’application uniquement en français.

Cordialement,
Tuttu

16 04 2010
herbaux mathias

Je ne comprends pas ta question? Es-tu entrain de dire que ça ne sert qu’à localiser l’application en français????
Si tel est le cas, c’est que mon article est mal présenté, mais clairement je m’en sers dans une application pour de l’anglais/français, et ça marche super :)

16 04 2010
Michaël

Bien sûr que non, j’ai très bien compris ton article et le fait que cette dll permette une localisation facile de son application.

La question que je me pose est plutôt la suivante :
Utiliser cette dll n’est-il pas superflu si je souhaite simplement externaliser les textes de mes labels et autres textes(par exemple, les items d’une combobox, un paragraphe de texte dans un textblock…) dans un fichier de ressources plutôt que de les laisser dans le code WPF ou C#. Ca reviendrait donc à centraliser tout le texte de mon application dans un ou plusieurs fichiers ressources pour en faciliter la maintenance (correction par exemple) et éventuellement envisager une traduction de l’application dans le futur.

16 04 2010
herbaux mathias

ok d’accord je n’avais pas compris. Désolé.
Dans ton cas, et dans bien d’autres je pense que cela n’est pas superflu.
D’une part cela va te permettre d’éviter une charge de travail énorme si rien n’a était prévu pour le passage a du Multilingue ( ça a été mon cas ).
D’autres part, depuis que je l’utilise, mon code behind me semble bien plus propre, pas de chaînes de caractère à tout va qui nuit à la lisibilité.
Sache aussi que tu peux t’en servir dans des cas plus complexe, comme un string.Format(“Bonjour {0}, il est actuellement {1}”,name,date)==>string.Format(ResTexts.HelloWorld,name,date) (Bon bien sur il est préférable d,adopter une convention de nommage afin de savoir que ta chaîne dans le fichier de resource prend des paramètres, style : HelloWorld_Format_name_date

16 04 2010
Michaël

Super, merci pour cette réponse.
Je vais pouvoir m’y mettre alors car ça me ralentissait un peu dans mon travail.

Par contre, tu crois qu’il serait possible d’ajouter un projet d’exemple à ton article pour qu’on puisse bien comprendre comment ça marche car j’avoue qu’après mes deux-trois premières lectures, je n’ai pas tout saisi. :p

Cordialement,
Michaël

16 04 2010
herbaux mathias

J’ai rajouté dans l’article le liens vers le projet de test de l’auteur.

16 04 2010
Michaël

Oups, je ne l’avais pas vu quand je le cherchais. Merci bien. :)

16 04 2010
herbaux mathias

Non mais je viens de le rajouter, c’est normal que tu ne l’avais pas vu ^^

17 04 2010
Michaël

Je ne l’avais pas vu sur Codeplex quand j’ai téléchargé la dll. ;)

21 04 2010
Michaël

Bonjour !

J’ai un problème bizarre avec l’extension et je me demandai si tu as le même.

J’ai donc créer deux dictionnaires de ressources, un par défaut qui revoit sur celui en français.
Quand j’utilise dans mon code WPF la syntaxe pour appeler une ressource, celle-ci apparaît correctement dans le designer de Visual Studio. En revanche, quand je lance mon appli, j’obtiens le @Mon_Texte_Demandé à la place de sa valeur dans le second dictionnaire, comme elle apparaît dans le designer.

J’ai essayé d’utiliser la dll compilée et d’ajouter le projet à ma solution mais dans les deux cas, toujours le même soucis.

Tu l’as déjà rencontré ?

Cordialement,
Michaël

21 04 2010
Michaël

Tu pourras trouver un screen de ce dont je parle ici :
http://tuttu.free.fr/erreur_localisation.png

22 04 2010
herbaux mathias

As tu défini dans ton code au démarrage la langue dans laquelle la dll doit travailler?
LocalizeDictionary.Instance.Culture = CultureInfo.GetCultureInfo(« fr ») ou je ne sais qu’elle extension
Sinon, envoie moi ton projet par mail si tu peux, pour que je regarde.
Bye

22 04 2010
Michaël

Bonjour,

Oui, j’ai défini ma langue dans mon fichier xaml. J’ai repris le code présent dans le projet de démo, à savoir : LocalizeDictionary.DesignCulture=”fr”

Ce qui m’étonne le plus, c’est que dans l’éditeur de Visual Studio, je vois bien le texte voulu selon la langue choisie alors qu’une fois l’application, c’est la référence @mon_texte qui apparaît.

Je refais un petit projet dès que j’ai le temps et je t’envoie ça. :)

22 04 2010
Michaël

C’est bon, j’ai trouvé mon problème. En fait, il ne vient pas de moi. C’est la déclaration du langage en XAML qui ne fonctionne pas, ça fait pareil avec le projet d’exemple fournit avec la dll.

J’ai choisi ma langue en code-behind et tout fonctionne maintenant. :)

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Twitter picture

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Connexion à %s




Suivre

Get every new post delivered to your Inbox.