IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Traduction d'une application (XAML)


Sujet :

Windows Presentation Foundation

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 60
    Points : 33
    Points
    33
    Par défaut Traduction d'une application (XAML)
    Bonjour,

    Dans le cadre d'un traduction de mon application, je me suis créé un classe "Langue" static comportant une méthode "getText(String key)" qui me retourne le texte correspondant à la clé, en fonction du langage sélectionné dans l'appli.
    Ça fonctionne très bien dans mon code C#, par exemple pour le texte d'un messageBox.
    J'aimerai maintenant faire pareil dans mon code XAML. C'est a dire que j'aimerai traduire le texte d'un bouton par exemple. Pou ce faire, je voudrais savoir s'il est possible d'accéder a ma fonction getText de ma classe Langue depuis mon XAML, et donc pouvoir lui passer un paramètre.
    Du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button><Langue.GetText(maClé) /></Button>
    Es-ce que ceci est possible?

    Autre question: pour une petite appli, la méthode de traduction que j'utilise est-elle correcte? Avez vous une meilleur idée?

  2. #2
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    Salut,

    Perso j'utilise un dictionnaire de ressource référence dans le App.xaml (pour être global).
    Tu y stockes tes traductions sous forme de clé/valeur

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <system:String x:Key="cle">valeur</system:String>

    Utilisable à la fois dans le code-behind (avec un FindResource) et en xaml avec Text="{DynamicResource cle}"

    Intérêt : tu peux créer un fichier par langue et en le changeant dans le App.xaml, toute ton appli est traduite d'un coup.

    C'est une autre solution.

    Pour la tienne, tu peux utiliser un IValueConverter dans ton xaml qui va te convertir une clé en valeur en utilisant ta classe.
    Par contre, j'espère que tu ne veux pas faire de changement de langue dynamique en live(sans redémarrer l'appli)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Du coup je pense que je vais plutôt utiliser ta méthode, parce que c'est vrai que c'est embêtant de devoir redémarrer l'appli après un changement de langue.

    Quand tu parle de dictionnaire de ressource, tu entends quoi exactement ? Comment sont organisés tes textes de traduction? Utilises-tu des fichiers externes ?

    Merci d'avoir répondu !

  4. #4
    Membre éprouvé Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Points : 947
    Points
    947
    Par défaut
    Salut,

    Pour ma part, je préfère utiliser les markup extensions (comme l'article de Thomas Levesque).

  5. #5
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    Re,

    En gros je crée un ResourceDictionary par langue (par exemple fr-FR.xaml pour le français). Dedans tu mets en premier la culture concernée par le fichier puis toutes tes valeurs

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <system:String x:Key="Culture">fr-FR</system:String>     
    <!--Ensemble des valeurs-->
    <system:String x:Key="Welcome">coucou</system:String>
    ....

    ensuite tu le références dans ton App.xaml pour qu'il soit accessible de partout

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <Application.Resources>
    <ResourceDictionary>
    	<ResourceDictionary.MergedDictionaries>               		
    		<ResourceDictionary Source="Traduction\fr-FR.xaml" x:Name="DefaultLang" />

    Et ensuite ya plus qu'à l'utiliser...
    Si tu veux changer de langue en cours d'utilisation, il te faut une méthode pour remplacer fr-FR.xaml par en-EN.xaml par exemple dans tes ressources globales..

    Pour te donner une idée, voici un squelette de méthode qui le fait (c'est optimisable et sécurisable )

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public static void TranslateApplication(string language)//je passe le nom de la culture 
    {    
    //test si nouvelle culture <> actuelle
    if (Thread.CurrentThread.CurrentCulture.Name == language)
    	return;
     
    language = language + ".xaml";
     
    //on récupère les anciennes versions
    _CurrentLangDictionnary = (from r in Application.Current.Resources.MergedDictionaries where r.Source != null && r.Source.OriginalString.Contains(@"Traduction\") select r).FirstOrDefault();
     
    //création des paths vers les nouvelles ressources
    Uri langUri = new Uri(path + "\\" + language, UriKind.Relative);
     
    if (string.IsNullOrEmpty(langUri.OriginalString) == false)
    {
    	//chargement des nouvelles ressources
    	ResourceDictionary objNewLanguage = (ResourceDictionary)Application.LoadComponent(langUri);
    	objNewLanguage.Source = langUri;	
     
    	if (objNewLanguage != null )
    	{
                    //on supprime les anciennes et on ajoute les nouvelles
                    Application.Current.Resources.MergedDictionaries.Remove(_CurrentLangDictionnary);               
                    Application.Current.Resources.MergedDictionaries.Add(objNewLanguage);                                   
     
                    //changement de la culture de l'application
                    CultureInfo culture = new CultureInfo((string)Application.Current.Resources["Culture"]);
                    Thread.CurrentThread.CurrentCulture = culture;
                    Thread.CurrentThread.CurrentUICulture = culture;        
            }
    }
    }

    Et voilà, c'est tout ^^

    @+

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    J'ai donc créé mon dictionnaire de ressources, j'ai ajouter son chargement dans App.xaml comme ça:
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <Application.Resources>
            <SampleData:modules x:Key="modules" d:IsDataSource="True"/>
                <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="lang\fr-FR.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>

    Mais quand je compile j'ai cette erreur:
    Erreur 1 Le programme 'c:\Users\Administrateur\BennuGD\BennuPRGMaker\BennuPrgMaker\BennuPrgMaker\obj\x86\Debug\BennuHelper.exe' ne contient pas une méthode 'Main' statique appropriée pour un point d'entrée C:\Users\Administrateur\BennuGD\BennuPRGMaker\BennuPrgMaker\BennuPrgMaker\CSC BennuHelper
    Une idée?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    C'est bon j'ai viré cette ligne:
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    <SampleData:modules x:Key="modules" d:IsDataSource="True"/>
    Et ça marche. (Cette ligne était un test pour autre chose).

    Merci pour votre aide!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Traduction d'une application en Arabe
    Par clementcohen dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 02/01/2008, 11h53
  2. [Fortran 90] Traduction des messages d'une application
    Par yogitetradim dans le forum Fortran
    Réponses: 3
    Dernier message: 31/10/2007, 16h25
  3. [3.0][C#][XAML] lancement d'une application flash
    Par Gaaaga dans le forum Windows Forms
    Réponses: 10
    Dernier message: 20/12/2006, 14h42
  4. Traduction en plusieurs langues d'une application
    Par Furlaz dans le forum C++Builder
    Réponses: 5
    Dernier message: 08/06/2006, 10h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo