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

C# Discussion :

Gestion des langues, fichier resource (resx) et modification dynamique


Sujet :

C#

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Gestion des langues, fichier resource (resx) et modification dynamique
    Bonjour tout le monde,

    Objectif :
    J'ai une solution WPF en C# .NET 4.5 avec deux projets :
    - Application
    - Configuration

    Dans mon projet Application j'utilise des fichiers resource pour la gestion de langue :
    - ResTypeFigure.resx
    - ResTypeFigure.fr.resx
    - ResTypeFigure.en.resx
    - ResTypeFigure.de.resx

    J'aimerais avec mon projet Configuration modifier ces fichiers de langue, et ainsi permettre de modifier la traduction d'Application.

    Problème :
    Lors de la compilation de ma solution j'ai 3 fichiers qui sont crées automatiquement dans mon projet Application et Configuration:
    - fr/Application.resources.dll
    - en/Application.resources.dll
    - de/Application.resources.dll

    Dans mon projet Configuration j'arrive bien à relire mes fichiers de langue, MAIS le problème est pour les modifier.

    J'arrive à modifier les fichiers .resx grâce à ResXResourceWriter, mais cela ne me sert à rien, car pour générer les fichiers resources.dll (utilisés pour l'affichage des langues) il faut recompiler (d'après ce que j'ai pu lire).

    Est il possible de modifier depuis une application des fichiers resource, si oui comment ?

    Merci pour votre aide.

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    bonjour

    Perso (mais ça reste perso), j'aime autant mettre les traductions dans un fichier XML et utilisé ce fichier XML pour mes traductions.

    Grosso modo, mon fichier xml, c'est "une clé Identifiant" + la traduction...

    Comme ça, vu que c'est de l'XML, ça s'éditer ultra facilement, pas de compile, etc...

    Faut juste se faire une petite librairie pour mettre à jour les controles quand on change de fichier de langue.

    En cherchant sur le net, tu trouveras ce genre de librairie
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta solution "parallèle", c'est vrai que ça m’embête un peu car j'ai déjà d'autres fichiers de traductions (qui ne seront pas modifiable) et j'aurai aimé avoir un ensemble uni (et pas une partie dans des fichiers XML et l'autre dans des fichiers resources).

    Est ce que quelqu'un à une autre solution ?

    Encore merci theMonz31.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Points : 4
    Points
    4
    Par défaut une autre piste ?
    Peut être existe t'il une autre piste.

    J'ai remarqué qu'il est possible de choisir l'Action de génération "Contenu" pour les fichiers de ressource.

    Cela permet de ne pas compiler ces ressources, et donc de pouvoir les modifier dynamiquement depuis une autre application.

    Mais question est :
    - Comment utiliser (lecture, écriture) les fichiers de ressources (.resx) quand ils sont générés en tant que Contenu ?

    Si vous avez des exemples je suis preneur.

    Merci beaucoup de votre aide.

  5. #5
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    La solution du XML ou d'une base de données externe est clairement la voie à suivre. En effet le RESX fait partie d'une DLL, et il n'est pas possible de "décharger" une DLL une fois qu'elle a été chargée dans un AppDomain, à moins de supprimer le-dit AppDomain.

    Peut-être qu'en créant un AppDomain spécifique pour les traductions, y charger les ressources, puis lors d'une mise à jour supprimer l'AppDomain et recommencer, peut-être que ca pourrait marcher. Mais ca me semble bien compliqué et je ne suis même pas sûr que ca fonctionne...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    La solution du XML ou d'une base de données externe est clairement la voie à suivre. En effet le RESX fait partie d'une DLL, et il n'est pas possible de "décharger" une DLL une fois qu'elle a été chargée dans un AppDomain, à moins de supprimer le-dit AppDomain.

    Peut-être qu'en créant un AppDomain spécifique pour les traductions, y charger les ressources, puis lors d'une mise à jour supprimer l'AppDomain et recommencer, peut-être que ca pourrait marcher. Mais ca me semble bien compliqué et je ne suis même pas sûr que ca fonctionne...
    "Le fichier RESX fait partie d'une DLL", même si il est générés en tant que Contenu ?

  7. #7
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Ah au temps pour moi je n'avais pas porté attention à ce détail

    Quand tu utilises "Contenu" il me semble que le fichier est déposé dans le même répertoire que le bin. Et il est possible d'y accéder en utilisant un Stream (Application.GetContentStream(uri)). Donc dans ce cas, peut-être que tu pourras mettre à jour, à condition de bien libérer le Stream avant de vouloir enregistrer la nouvelle version. Après je n'ai jamais testé donc à voir, il y a peut-être d'autres choses qui rentrent en jeu... Essaie et tiens nous au courant si ca marche
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Le grand test, problème de chemin
    Je reviens vers vous, car j'ai fait le test avec des fichiers de ressource (avec l'Action de génération "Contenu").

    Voici mon code (qui fonctionne) qui permet de lire ce fichier de ressource :
    Code : 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
     
                    Dictionary<string, string> TabTraduction = new Dictionary<string, string>();
     
                    PathTraduction = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName + @"\Projet3\Resources\ResTypeFigure.resx";
     
                    if (File.Exists(PathTraduction))
                    {
                        ResXResourceReader resourceReader = new ResXResourceReader(PathTraduction);
     
                        if (resourceReader != null)
                        {
                            foreach (DictionaryEntry d in resourceReader)
                            {
                                if (d.Value == null)
                                    TabTraduction.Add(d.Key.ToString(), "");
                                else
                                    TabTraduction.Add(d.Key.ToString(), d.Value.ToString());
                            }
                            resourceReader.Close();
                        }
                    }
    J'ai un problème assez simple mais je ne trouve pas la solution

    Ma solution est organisation ainsi :

    MaSolution :
    ->Projet1
    ->Projet2
    ->Projet3

    Les fichiers de ressources (en tant que CONTENU) sont dans mon projet3, et mon projet1 et projet2 vont lire et écrire dans ces fichiers.

    En Debug qd j'exécute mon projet1 je suis dans le dossier bin/debug donc pour accéder à mes ressources je passe par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PathTraduction = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName + @"\Projet3\Resources\ResTypeFigure.resx";
    Mais une fois mon application installé sur le pc de l'utilisateur je n'ai plus ce bin/debug et donc m'ont chemin n'est plus bon.

    Avez vous une solution ?

Discussions similaires

  1. gestion des langues (fichier ressource)
    Par droopy1080 dans le forum BIRT
    Réponses: 1
    Dernier message: 28/02/2011, 16h54
  2. [C#] Gestion des langues d'une application
    Par therock dans le forum Windows Forms
    Réponses: 4
    Dernier message: 15/05/2006, 08h47
  3. Réponses: 7
    Dernier message: 05/08/2005, 16h32
  4. [Plugin]Eclipse et la gestion des langues
    Par Gougou dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 26/07/2005, 12h51
  5. [C#] Multi langue - fichier resource.resx
    Par dacamp dans le forum ASP.NET
    Réponses: 5
    Dernier message: 03/06/2004, 16h25

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