Menus multilingues dynamiques

Soyez le premier à donner votre avis sur cette source.

Vue 8 566 fois - Téléchargée 1 041 fois

Description

Menus multilingues dynamiques
(Multilingual dynamic menus; Mehrsprachige dynamische Menus)

Mots-clés: c#, menu, multilingue, dynamique, instantané.

Keywords: c#, menu, multilingual, dynamic, instantaneous.

Schlagworte: c#, menu, mehrsprachig, dynamisch, augenblicklich.

Pour la plupart des logiciels, il faut choisir la langue lors de son installation.
Dans certains programmes, comme par exemple les convertisseurs de devises (Currency Converter), il peut être intéressant de passer instantanément d'une langue à une autre, y compris dans les menus.

Dans le fichier source "MenuLang.cs" sont définis les classes nécessaires:
- MainMenuLang, dérivée de MainMenu
- MenuItemLang, dérivée de MenuItem

La construction d'un menu multilingue est similaire à la construction classique.
- "MainMono.cs" montre une construction classique.
- "MainLang.cs" montre une extension aux menus multilingues.

Procédé:

1) Remplacer la classe MainMenu du menu principal par
MainMenuLang (dérivée de MainMenu).
Le constructeur définit les langues (et leur nombre);

2) Remplacer la classe MenuItem des éléments de menu sensibles
aux changements de langue par MenuItemLang (dérivée de
MenuItem). Les menus (et sous-menus) peuvent être composés
indifféremment d'éléments MenuItem ou MenuItemLang.

3) A l'aide de la méthode "MainMenuLang.AddLangItemsTo",
ajoutez au menu la liste des langues à séléctionner.
Cette liste peut être ajoutée à n'importe quel endroit du
menu (et même à plusieurs endroits !).

4) A la fin de la construction de menu, il faut déterminer la
langue initiale (MainMenuLang.SelLang = ...).

5) Adaptez la méthode "Form1.Lang_Click" pour effectuer les
changements instantanés du programme.

Conclusion :


Le zip comporte:

L'article complet (avec sources): "Article_MenuLang.rtf"

Microsoft Visual C# 2008 Express: dossier "MenuLang"
Solution "MenuLang" avec les projets:
MenuMono: Méthode habituelle: menus à une seule langue
MenuLang: Avec menus multilingues

------

Solution simple et élégante de créer des programmes vraiment multilingues.

W. Voirol, Switzerland

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
bonjour,
c'est très long tout ça.
je suis occupé à étudier le problème actuellement
et ma réflexion m'a amené à penser qu'il serait judicieux de dériver tous les contrôles .Net
en y ajoutant une propriété lang
+ une classe commune avec un tableau de langue as string
et un fichier csv contenant les traductions, mais c'est beaucoup de boulot pour un seul homme :)
Messages postés
4
Date d'inscription
mardi 17 octobre 2006
Statut
Membre
Dernière intervention
5 février 2009

J'ai oublié dans le constructeur :
MyManagerImage = new ResourceManager("Masolution.MesImages", MyAssembly);
Messages postés
4
Date d'inscription
mardi 17 octobre 2006
Statut
Membre
Dernière intervention
5 février 2009

Il est plus général d'utiliser ResourceManager qui permet d'utiliser un fichier externe contenant tout les Textes que vous êtes amené à utiliser traduit dans toutes les langues utilisées.
Dans une class "Langue" :
- dans le constructeur de la Class vous rajoutez :
public Assembly MyAssembly;
public ResourceManager MyManager;
public ResourceManager MyManagerImage;
MyAssembly = Assembly.GetExecutingAssembly();
MyManager = new ResourceManager("Masolution.MesTextes", MyAssembly);
InitializeComponent();

- Dans cette classe vous rajoutez une fonction (exemple):
public String MMGS(String NumMsg)
{
.
.
return MyManager.GetString("M" + CodeLangue + NumMsg)
.
.
}

CodeLang doit être une variable public initialisée au code langue en cours comme par exemple "FR" pour le français, "EN" pour l'anglais, "DE" etc...
Dans ce cas il faut créer un fichier (MesTextes.txt) des Textes à utiliser comme par exemple
MFR001= texte 1 en Français
MEN001= texte 1 en anglais
MDE001= texte 1 en allemand
etc...
Ensuite dans le projet il faut rajouter une resource par exemple :
MesTextes.resx
Ensuite il faut génrer le fichier resource en utilisant l'utilitaire resgen qui
se trouve dans ....\SDK\V2.0\bin
commande : resgen MesTextes.txt MesTextes.resx

Enfin dans votre programme quand vous souhaitez initialiser un Menu, un label.Text, un TextBox.Text, un GroupBox.Text etc... bref tout ce que vous afficher, vous appelez la routine MMGS.
Dernier pb que vous aurez à résoudre la MessageBox.Show qui elle n'utilise pas la langue de CultureInfo etc.. mais dépend tout simplement de la langue du système d'exploitation et qui par conséquent si vous avez installer Windows en français les boutons de vos message seront toujours OUI, NON etc..
Une seule solution si vous voulez que votre applicatif parle totalement la langue choisie, faire votre propre Class MessageBOx et gérer les textes des boutons dans les langues que vous voulez en utilisant la routine MMGS.
Vous pouvez aussi utiliser cette méthode pour récupérer les Drapeaux de votre langue en créer une resource MesImages.resx et un appel à Resource Manager comme
par exemple :
pictureBoxDrapeu.Image = (Bitmap) MyManagerImage.GetObject("Nom de l'image");

Bon courage
Messages postés
149
Date d'inscription
mercredi 23 juillet 2003
Statut
Membre
Dernière intervention
30 janvier 2009

Salut,
Quelques points ou tu pourrais peut être m'éclairer :
- On ne peut plus ouvrir la fenêtre en designer (dans ton projet d'exemple).
- On est obligé de construire son menu dynamiquement (enfin j'ai pas réussi à le faire toujours par le designer de visual) ça va pour les menus simples, mais quand on commence avoir un menu avec images et sous menus c'est un peu plus long en code ...
- Avoir les traductions dans un(des) fichier(s) plutôt qu'au fin fond du code en dur.
- Ça traduit uniquement les menus ... c'est pas plus simple de faire une classe de traduction qui va s'adapter au type du contrôle, plutôt qu'adapter tous les contrôles ?
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
14 février 2014
38
Merci de ne pas mettre de commentaire dans zone "Code"

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.