Authors
Olivier GREGOIRE
Versions
|
Version |
Date |
Object |
|
1 |
12/12/2006 |
Document original |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ajouter des données aux ressources
Comprendre le nom des assemblies satellites
Manipuler les ressources dans le code
Ajouter des cultures en dehors de l’IDE
Création d’un fichier ressources
Création d’un assembly satellite
Le Framework.NET utilise principalement deux processus pour implémenter plusieurs langues dans une application : la globalisation et la localisation.
La
globalisation permet de gérer le format monétaire, le format d’horodatage,
etc.… en fonction de la langue courante du système. La localisation permet au
programmeur d’implémenter plusieurs langues dans une application.
La localisation qui nous intéresse ici permet de manipuler des données personnalisées et des ressources pour une culture et un langage spécifique.
Ce document développe la marche à suivre pour créer des assemblies satellites et comment les utiliser dans un assembly principal (exécutable ou librairie). Cette création d’assemblies satellites peut être gérée depuis l’interface Visual Studio mais également séparément du processus de compilation. L’intérêt est de pouvoir dans un premier temps créer facilement des données associées à une culture puis importer de nouvelles langues sans recompiler le projet.
Les fichiers resources peuvent être manipulés sous trois formes différentes :
Sous visual studio il est très facile d’incorporer un fichier Xml (.resx) à son projet, nous verrons par la suite l’utilitaire dédié à la manipulation de ces fichiers.
Création de l’exemple :
Pour comprendre la manipulation de ces données nous allons créer une solution exemple. Nous partirons d’une solution « ExempleLocalisation » comprenant un projet de type libraire de classes et un projet qui va utiliser cette libraire, un projet de type console. Dans cette solution, la librairie sera localisée, et le projet console permettra de jongler entre les cultures pour manipuler la librairie.

Pour inclure un fichier ressource dans l’IDE, il faut cliquer-droit sur le projet librairie, sélectionner « Ajouter » puis « Ajouter un nouvel élément », la fenêtre suivante apparaît :

Sélectionner
en bas de la liste « Fichier de ressources », et le nommer
« Resource.resx ». Le fichier créé est inclus dans le projet, il sera
la première étape de
Création d’une culture spécifique
Pour ajouter de nouvelles cultures, par exemple la culture française et anglaise, il suffit de répéter l’opération en nommant les fichiers de la façon suivante :
Les fichiers de chaque culture doivent respecter la nomenclature suivante :
Pour plus d’informations sur la nomenclature des cultures, consulter les annexes.
Attention ! La localisation d’une application est basée sur le nom des ressources, il est donc nécessaire de respecter la casse, la nomenclature et le nom des ressources pour pouvoir utiliser les assemblies satellites.
Il est intéressant de remarquer que même sans intégrer une seule donnée dans les fichiers ressources, la compilation provoque la création de dossiers nommés comme la culture dans le répertoire de destination comme le montre la structure suivante :

Dans chaque répertoire destination, l’IDE crée des dossiers nommés comme la culture qui contiennent les assemblies satellites. Cette structure sera toujours respectée.
Lors de l’ajout d’un fichier ressource l’IDE présente une interface suivante pour ajouter des données :

La façon la plus simple de rajouter des données est donc d’écrire ligne par ligne une paire name-value (dans notre cas d’utilisation nous n’avons pas besoin de définir des commentaires ou un type).
Dans notre cas, et pour toutes les ressources nous nous bornerons à ajouter deux lignes associant un chiffre à un libellé faisant référence à la culture comme suit :

Une fois cette opération effectuée votre application est localisée. Il ne reste plus qu’à manipuler le code pour tirer parti de ces données. Mais il convient de comprendre le mécanisme des noms d’assemblies avant cette étape.
Comme nous l’avons vu précédemment, les noms des ressources et des assemblies satellites est très important.
Pour mieux comprendre, nous avons crée par l’IDE trois fichiers ressources :
En sortie, nous avons l’assembly principal et deux assemblies satellites situés dans des sous-dossiers. L’assembly correspondant à la culture neutre est inclus dans l’assembly principal.
En utilisant en ligne de commande l’utilitaire « ildasm.exe » (décompilateur) , on peut voir que ces fichiers ressources ont été renommés de la façon suivante :
La nomenclature est donc :
[Nom de l’application].[Nom de la ressource].[Nom de la culture].resources
Cette nomenclature permet d’accéder aux données dans le code. Comme vous pouvez le voir la seule exception est la culture neutre qui n’a pas de nom de culture, assez logiquement.
La première étape pour manipuler les ressources est d’ajouter les références suivantes dans le code de la librairie de classe :
using System.Resources;
using System.Reflection;
Notre classe va uniquement comprendre un constructeur vide et une méthode publique qui va prendre en argument une chaîne et retourner une chaîne correspondante. On comprend que l’intérêt de cette méthode est de retourner un libellé localisé correspondant à un code, comme dans les fichiers ressources.
Pour poursuivre sur notre exemple votre code doit donc ressembler au suivant :
Pour
lire la ressource, nous devons créer une instance de
Le nom de base correspond à : [Nom de l’application].[Nom de la ressource], ici TestLibrary.Resource.
Et on récupère simplement l’assembly en cours d’exécution par l’instruction Assembly.GetExecutingAssembly().
Le code de votre classe doit donc ressembler à ceci :

Il faut remarquer en premier lieu les référence suivantes :
using System.Threading;
using System.Globalization;
Ces deux namespaces permettent respectivement de manipuler le thread courant et les cultures. Pour changer la culture du thread courant il suffit alors de la ligne suivante :
Thread.CurrentThread.CurrentUICulture = new CultureInfo(sCulture);
La structure de dossier de sortie du projet console créé par Visual studio est la suivante :

Le framework fournit un utilitaire en ligne de commande qui s’appelle resgen.exe
L'outil Resource File Generator Tool (Générateur de fichiers de ressources) convertit les fichiers .txt et .resx (format de ressource XML) en fichiers .resources binaires CLR pouvant être incorporés à un exécutable binaire runtime ou compilés dans des assemblys satellites. Pour obtenir plus d’informations consulter les liens en annexes.
Resgen.exe effectue les conversions suivantes :
Dans notre cas, imaginons que nous avons en source un fichier RessourcesRusses.txt contenant les informations relatives à la culture ru-RU (russe)
Le contenu du fichier doit être formaté de la façon suivante :
# Utilisez # au début d'une ligne pour un caractère de commentaire.
[clé1]=[valeur1]
[clé2]=[valeur2]
La ligne de commande s’utilise de la façon suivante :
ResGen RessourcesRusses.txt Resource.ru-RU.resources
Notre fichier binaire .resources existe maintenant. Il faut l’intégrer à un assembly satellite.
L’outil fournit par le framework pour créer des assembly s’appelle « Assembly Linker » : al.exe.
Assembly Linker génère un fichier avec un manifeste de l'assembly à partir d'un ou de plusieurs fichiers qui sont soit des modules, soit des fichiers de ressources. Dans notre exemple nous allons donc l’utiliser avec un fichier .resources. La commande ressemble à la suivante :
Al.exe /t:lib /embed:Resource.ru-Ru.resources,TestLibrary.Resource.ru-RU.resources /culture:ru-RU /out:TestLibrary.resources.dll
L’explication de cette ligne est la suivante
Le fichier TestLibrary.resources.dll est maintenant créé. Il reste la dernière étape pour le déployer.
Déployer un assembly satellite
Cette étape est la plus simple. Il suffit de copier le satellite précedemment créé dans le dossier ou se situe l’exécutable, dans un dossier portant exactement le même nom que la culture.
Dans notre cas le dossier aurait cette allure :

la console est maintenant prête à focntionner avec trois cultures spécifiques :
Pour ajouter différentes cultures, le process peut se dérouler en dehors de tout environnement de développement. Il suffira d’automatiser dans un batch le traitement des fichiers textes.
Le projet exemple que nous avons développé tout au long de ce document est disponible dans le zip Exemple.zip, il contient la solution et le fichier texte de ressource.
Le nom
des cultures respecte
http://msdn.microsoft.com/library/FRE/cpguide/html/cpconcreatingusingresources.asp