Internationalisation d'une application VB.NET

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 - 13 avril 2011 à 16:27
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 - 8 juil. 2011 à 21:52
Bonjour,

Dans le cadre de mon travail, je me renseigne sur les méthodes (possibles et conseillées) pour internationaliser une application en VB.NET.
Ce sujet concerne les fonction intégrées à .NET, mais aussi aux limitations de VB.

Actuellement, on utilise pour des programmes rédigés en C un outil ligne, GNU GetText.
L'idéal serait de pouvoir l'utiliser, sinon, voir pour utiliser d'autres outils.

J'ai déjà cherché sur le net et j'ai trouvé ces quelques liens :
[url]http://www.codeproject.com/KB/books/CustomCultures.aspx/url
[url]http://www.gnu.org/software/hello/manual/gettext/C_0023.html/url
[url]http://morpheus.developpez.com/localisationdotnet//url
[url]http://msdn.microsoft.com/fr-fr/library/h6270d0z%28v=VS.100%29.aspx/url

De ce que j'ai lu, l'internationalisation des éléments statiques des Forms est facilement faisable, mais concernant les chaines dans le code ?
- Comment les lister ?
- Comment les marquer ?

Et plus largement comment permettre à un traducteur non développeur d'internationaliser mon application sans avoir à utiliser le code source, juste comme le permet le GetText avec un fichier PO (ou similaire) listant l'ensemble des chaines à traduire.

Mes questions peuvent sembler confuses, mais je n'ai (il me semble) pas tout compris de ces liens.
Si une (ou plusieurs) personne(s) plus avancé que moi sur ce sujet pouvait me répondre, cela m'aiderait beaucoup.

Merci d'avance.

6 réponses

radcur Messages postés 282 Date d'inscription lundi 29 septembre 2003 Statut Membre Dernière intervention 15 août 2012 2
13 avril 2011 à 18:38
salut

je peux t'expliquer la méthode que j'utilise. Je ne suis pas certain de comprendre exactement ce que tu souhaites mais peut-être que ca donnera une piste.

Je me suis créer une classe de traduction qui permet d'aller chercher dans un fichier XML un "tag". Je me suis créer des fonctions qui permettent de retrouver le tag recherché dans le fichier XML de la culture en cours dans l'application.

Dans ma classe, j'ai une fonction GetMessage qui recoit en parametre le tag recherché. La fonction fait la recherche du tag et retourne ce qu'elle a trouvé comme texte correspondant au tag. Advenant le cas où il ne trouve pas le tag, il va lire le fichier anglais ou francais tout dépendant comment j'ai paramétré la classe lors de son instanciation. J'ai une culture courante et une par défaut en cas de pépin.

Je ne mets aucune chaine de caractères(pour les messages d'erreur ou de validation par exemple). J'utilise un tag avec certains standards. Par exemple, au lieu de mettre "Voulez-vous supprimer ce produit?" c'est "MsgDeleteProduct" que j'écris.

Ma classe est dotée d'une fonction d'exportation du fichier XML à traduire en fichier texte comportant le tag, un TAB, la phrase ou la confirmation. Ensuite ca peut être facilement traduit dans Google ou tout autre service et ma classe reconstruit un fichier XML avec le fichier txt traduit. J'ai aussi un exécutable qui utilise cette classe pour pouvoir faire de l'import/export sans devoir le coder dans mon application.

La tâche la plus "difficile" est de créer le fichier texte par défaut (souvent en français dans mon cas) "en parallèle" au fur et à mesure que je dois avoir des messages à faire afficher mais c'est pas si compliqué.

Le fichier XML est ensuite placé dans le répertoire Lng de mon application et ainsi mon application devient plus "internationale".

C'est pas tellement compliqué à coder comme classe et si ca peut t'avoir donner une piste, tant mieux! :)
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
13 avril 2011 à 18:51
Bonjour,

Je vois bien le mécanisme.
Mais c'est plus la partie marquage de chaine.
Je gardes ta méthode en stock, bien que d'après l'expérience que l'on a au travail, on préfère avoir les chaines en français dans le code et que ce soir elles qui servent de clé de traduction, c'est plus maintenable.

0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
14 avril 2011 à 08:44
Bonjour,

Pour la localisation des chaines de caractères de votre code vous pouvez utiliser les fichiers de ressources :

Voici un exemple partant du principe que le language neutre est le francais et que vous voulez une traduction en anglais.

1) Les chaines du language neutre

Dans le menu Projet -> Propriétés de MonProjet. Dans l'onglet "Ressources" vous créez les variables qui vont êtres utilisées dans le code (Colonne "Nom") ainsi que leurs traductions francaises (Colonne "Valeur")
Exemple :
StrBonjour | Bonjour
StrOui | Oui
StrNon | Non
StrMonNom | Mon nom est {0}

2) Les chaines en anglais

Ajoutez un nouveau fichier de ressources à votre projet nommé "Ressources.en-US.resx".
Créez les mêmes variables que précédement avec, cette fois, leurs traductions anglais.
Exemple :
StrBonjour | Hello
StrOui | Yes
StrNon | No
StrMonNom | My name is {0}

3) Dans le code source

'Messages dans le language neutre
Console.WriteLine("StrBonjour 1 = " & My.Resources.StrBonjour)
Console.WriteLine("StrOui 2 = " & My.Resources.StrOui)
Console.WriteLine("StrNon 3 = " & My.Resources.StrNon)
Console.WriteLine("StrMonNom 4 = " & String.Format(My.Resources.StrMonNom, "Toto"))

'Changement de la langue en anglais
Dim enCult As New System.Globalization.CultureInfo("en-US")
Threading.Thread.CurrentThread.CurrentCulture = enCult
Threading.Thread.CurrentThread.CurrentUICulture = enCult

'Messages en anglais
Console.WriteLine("StrBonjour 1 = " & My.Resources.StrBonjour)
Console.WriteLine("StrOui 2 = " & My.Resources.StrOui)
Console.WriteLine("StrNon 3 = " & My.Resources.StrNon)
Console.WriteLine("StrMonNom 4 = " & String.Format(My.Resources.StrMonNom, "Toto"))


On remarque donc qu'il suffit de changer la langue, la classe My.Ressources fait le reste

Il vous suffit de faire traduire les fichiers .resx (éditablent en dehors de visual studio avec des outils simples à trouver).

D'ailleur, pour l'interface aussi il existe des outils permettant au traducteur de faire sont travail sans passer par le projet. Il suffira de lui fournir les différents fichier .resx des forms (ex : Form1.resx; Form1.en-US.resx)
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
14 avril 2011 à 09:43
Bonjour,

Merci de ta réponse foliv57, je pense que ça se rapproche de ce que je recherche, mais le but n'est pas atteint, donc je vais essayer de reformuler.

Dans les programmes en C que l'on fait, on utilise le GetText, cet outils permet en parcourant l'intégralité du code source de lister les chaines à traduire, ces chaines sont ensuite mit dans un fichier regroupant toutes les instances uniques des chaines.

Par exemple la ligne C :
printf( _("Ma chaine a traduire") );
printf("Chaine non traduite");

Dans ce cas, seule la chaine "Ma chaine a traduire" est "marquée" (le petit _ avant la chaine), ce marqueur est défini en macro instruction (#define) pour faire appel aux routines de traductions souhaitées.
Quand le GetText relit le code source, il récupère toutes les chaines marquées.
(Je n'ai pas précisé, mais pour les constantes et autres spécificités, le système est similaire)

Cette technique a l'avantage que lors de l'ajout ou du retrait d'une chaine, la mise à jour soit complète et automatisée.
Car dans vos 2 propositions, si une chaine n'est plus utilisée, on ne le voit pas forcément, et pour les nouvelles chaines, il faut penser à les ajouter dans les différents fichiers.
De plus, le fait d'avoir la chaine en français (et pas juste un identifiant vers la chaine) permet une meilleure maintenabilité de l'application (ce que notre expérience nous a déjà prouvé).

Je pense que ce problème a déjà été rencontré par les développeurs .NET depuis quelques temps, et je pense qu'il y a une solution facilement utilisable et maintenable qui existe, mais je n'ai pas réussi à trouver les informations qui me permettront d'avoir des pistes de recherches.

Je gardes vos propositions en mémoire, car je pense qu'un mix est possible entre ce que je connais et vos propositions, mais si une personne connais LA solution miracle, je suis preneur.

Merci :)

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
14 avril 2011 à 11:50
Bonjour,

Dans la continuités de mes recherches, je pense avoir trouvé presque tout ce que je cherches :
Pour l'édition des fichiers Ressources des forms : http://msdn.microsoft.com/en-us/library/8bxdx003%28v=VS.100%29.aspx
Et pour récupérer les chaines (en lien avec le message de foliv57) : http://forum.hardware.fr/hfr/Programmation/CNET-managed/internationalisation-visual-studio-sujet_67795_1.htm

Il ne me reste plus que le dernier maillon qui manque (les autres peuvent peut être être améliorés), c'est la récupérations des chaines directement dans le code source afin de faire un fichier consolidé de toutes les traductions à l'image du Gettext.
Sans plus d'information, je pense qu'un outil fait maison devrait répondre au besoin.

Si vous avez plus d'informations à ce sujet, je suis preneur.

Je validerais les réponses une fois que le système aura été testé (et posterais une réponse explicative au moins).

0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
8 juil. 2011 à 21:52
Bonjour,

J'ai commencer le premier projet qui aura besoin de cet élément, donc j'ai opté pour une solution (non finalisée) :
Les chaines que l'on a besoin dans le code sont parquées :
T_("MaChaine")

Et pour les formulaires :
Liste des chaines à traduire ainsi que le contrôle/propriété modifié.

Pour l'instant, je n'ai fait que la partie extraction des chaines, il reste la partie récupération dans l'exécutable final qui doit être fait.

0
Rejoignez-nous