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
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).
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, ^^
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
?
Yeah sure, could be really interesting ! we should get in touch by mail, here is mine : mathrb@gmail.com
Bye
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
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
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.
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
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
J’ai rajouté dans l’article le liens vers le projet de test de l’auteur.
Oups, je ne l’avais pas vu quand je le cherchais. Merci bien.
Non mais je viens de le rajouter, c’est normal que tu ne l’avais pas vu ^^
Je ne l’avais pas vu sur Codeplex quand j’ai téléchargé la dll.
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
Tu pourras trouver un screen de ce dont je parle ici :
http://tuttu.free.fr/erreur_localisation.png
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
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.
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.