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 :

Traduction Exception win32


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 90
    Par défaut Traduction Exception win32
    Bonjour,


    Lors d'une opération sur les fichiers je génère une exception de type Win32Exception errorCode: 1326 (Echec d'ouverture de session).
    Dans mon cas, cette erreur est normale.
    Mon problème est que je n'arrive pas à faire traduire cette exception par le système en anglais même si CultureInfo est ("en-US")!!
    D'autre part j'ai aussi essayé de traduire le message en important la fonction "FormatMessage" de l'api win32 mais ce n'est pas mieux!! (voir code si-dessous).
    J'utilise un windows vista en français, et peut-être que ces ressources ne sont pas traduites en anglais??? Avez vous une idée? Une explication??
    Y a-t-il des packs de langue??

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
     private void btnGetMessage_Click(object sender, EventArgs e)
            {
                string strMessage;
                strMessage = GetErrorMessage(1326);
                MessageBox.Show(strMessage);
     
            }
     
     
            [DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
            private unsafe static extern int FormatMessage(int dwFlags, ref IntPtr pMessageSource, int dwMessageID, int dwLanguageID, ref string lpBuffer, int nSize, IntPtr* pArg);
            private unsafe static string GetErrorMessage(int errorCode)
            {
                int FMT_ALLOCATE_BUFFER = 0x00000100;
                int FMT_IGNORE_INSERTS = 0x00000200;
                int FMT_FROM_SYSTEM = 0x00001000;
                int minBufferSize = 0;
                string messageBuffer = String.Empty;
                string message = String.Empty;
                int dwFlags = FMT_FROM_SYSTEM | FMT_ALLOCATE_BUFFER | FMT_IGNORE_INSERTS;
                // Initialize pointers.    
                IntPtr pMessageSource = new IntPtr();
                IntPtr pArgs = new IntPtr();
                CultureInfo currentCulture = CultureInfo.CurrentCulture;
                currentCulture = new CultureInfo("en-US");
                int pid = PRIMARYLANGID(currentCulture.LCID);
                int sid = SUBLANGID(currentCulture.LCID);
     
                int langID = MAKELANGID(pid, sid);
                int messageSize = 0;
                messageSize = FormatMessage(dwFlags, ref pMessageSource, errorCode, langID, ref messageBuffer, minBufferSize, &pArgs);
                if (messageSize == 0)
                {
                    string messages = new Win32Exception(Marshal.GetLastWin32Error()).Message;
                    MessageBox.Show(messages);
                }
                message = String.Format("{0}", messageBuffer);
                return message;
            }
     
            public static int MAKELANGID(int primary, int sub)
            {
     
                return (((ushort)sub) << 10) | ((ushort)primary);
     
            }
     
     
     
            public static int PRIMARYLANGID(int lcid)
            {
     
                return ((ushort)lcid) & 0x3ff;
     
            }
     
     
     
            public static int SUBLANGID(int lcid)
            {
     
                return ((ushort)lcid) >> 10;
     
            }

    Remarque: Le code ci-dessus retourne une chaine vide avec (en-US) et la bonne chaine avec (fr-FR)

    PS: Je sais que je peux traduire ces exceptions moi même en fonction du code d'erreur. Cependant je ne souhaite pas le faire, car je ne connais pas toutes les exceptions que peut retourné win32 dans ce cas précis.

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Hello,

    je doute fort qu'un windows dans une langue X contienne toutes les ressources d'une autre langue Y. Il y a bien les langages packs ça s'appelle MUI, Multilingual User Interface), mais encore faudrait-il qu'ils soient installés, et je ne suis pas sûr qu'ils soient requêtables à tout moment.

    Mais la question est : pourquoi vouloir traduire ? Ces messages d'erreur sont localisés dans la langue courante de windows, pour être affichable à l'utilisateur. Pourquoi vouloir les remettre en anglais ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 90
    Par défaut
    Merci pour votre réponse.
    Mon application est internationnalisé (français / anglais). De plus mon application est lancé au démarrrage de windows. L'utilisateur n'a donc jamais affaire directement à windows.

    De plus certains message win32 sont remontés directement à l'utilisateur en cas d'erreur (par exemple mauvais mot de passe lors de l'accès à un répertoire partagé). Dans ce cas, l'utilisateur n'est pas toujours heureux d'avoir un message dans une langue qu'il ne comprend peut être pas!!

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Cyrilh7 Voir le message
    Dans ce cas, l'utilisateur n'est pas toujours heureux d'avoir un message dans une langue qu'il ne comprend peut être pas!!
    Bah s'il utilise un OS en français, j'espère pour lui qu'il comprend le français... (idem pour l'anglais). Il n'y a pas vraiment de solution à moins d'installer les packs de langue de l'OS.

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 90
    Par défaut
    Pour tomlev, je me site (même si mon français n'était pas térrible).
    L'utilisateur n'a donc jamais affaire directement à windows.
    Merci pour vos réponses même si je n'attendait pas de miracle. Mais qui ne tente rien n'a rien.
    Dans le cas des pack de langue il semble que l'on ne puisse pas les intaller sur toutes les versions de Windows (il faut la version ultimate ou celle juste en dessous). Ce qui n'est pas mon cas (j'ai une version pro).
    Je vais donc me contenter de redéfinir les messages qui m'intérressent...
    Mais avouez que celà parait un peu stupide dans le cas d'une application dite "professionnel" !!! Car l'on ne redéfini jamais tous les messsages correspondant à toutes exceptions qui peuvent surgire.....

  6. #6
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par Cyrilh7 Voir le message
    Mais avouez que celà parait un peu stupide dans le cas d'une application dite "professionnel" !!! Car l'on ne redéfini jamais tous les messsages correspondant à toutes exceptions qui peuvent surgire.....
    Ben si tu utilises des messages natifs de windows, c'est que tu veux que le message apparaisse tel que s'il avait été émis par windows. Et si par défaut windows avait les ressources de toutes les langues, je te laisse pas imaginer les pleureuses qui iraient dire à quel point c'est du bloatware...

    Après, ce qui me semble louche, c'est que dans ton cas, tu ne te contentes pas de laisser remonter les messages de l'OS, mais tu les balances toi-même, cest ça ? Ton appli lève elle-même des win32exceptions ? Je suis pas persuadé que ce soit une bonne pratique.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Ton appli lève elle-même des win32exceptions ? Je suis pas persuadé que ce soit une bonne pratique.
    C'est utile quand tu fais un wrapper .NET pour des API Windows... Mais effectivement c'est pas quelque chose à faire quand on veut signaler un problème à l'utilisateur.

    De toutes façons, les messages d'erreur des API Windows ne sont généralement pas destinés aux utilisateurs finaux, car trop techniques. Ils sont plutôt destinés au développeur. Malheureusement, on ne peut pas prévoir tous les cas d'erreur, donc parfois on est obligé soit d'afficher le message d'erreur "tel quel", soit d'afficher un truc du genre "une erreur inconnue s'est produite"... Il n'y a pas de solution miracle, sauf à écrire un message spécifique pour chaque code d'erreur possible

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 90
    Par défaut
    Pour répondre à Guulh:
    Je ne lève pas ces exceptions moi-même, mais j'utilise des fonctions de l'api wrapé en .NET qui elles, lèvent des exception dans certains cas.



    De toutes façons, les messages d'erreur des API Windows ne sont généralement pas destinés aux utilisateurs finaux, car trop techniques. Ils sont plutôt destinés au développeur. Malheureusement, on ne peut pas prévoir tous les cas d'erreur, donc parfois on est obligé soit d'afficher le message d'erreur "tel quel", soit d'afficher un truc du genre "une erreur inconnue s'est produite"... Il n'y a pas de solution miracle, sauf à écrire un message spécifique pour chaque code d'erreur possible
    Je suis tout à fait d'accord. Je me demandais juste si je n'étais pas passé à côté de la "solution miracle" .
    D'autre part il est dommage de devoir retraduire tous ces messages en cas d'Internationalisation s'achant que microsoft à pour une fois déjà fait le travail.
    Je suppose qu'avec une version ultimate et les bons pack de langue ça doit marcher car après tout la fonction "FormatMessage" de l'api win32 prend un argument langue!

Discussions similaires

  1. Gestion des erreurs et des exceptions en programmation Win32
    Par masterx_goldman dans le forum Windows
    Réponses: 1
    Dernier message: 05/05/2010, 20h35
  2. an unhandled win32 exception occurred in explorer.exe
    Par perloutta dans le forum Forms
    Réponses: 0
    Dernier message: 13/05/2009, 18h16
  3. An unhandled win32 exception occured in explorer.exe
    Par tamiii dans le forum Windows XP
    Réponses: 5
    Dernier message: 03/06/2008, 22h38
  4. [D7/Win32] Problème de traduction avec dxGetText
    Par _Alain_ dans le forum Débuter
    Réponses: 3
    Dernier message: 30/03/2008, 22h03
  5. Unhandled Win32 Exception en mode Release
    Par HarKoT dans le forum C++
    Réponses: 5
    Dernier message: 05/12/2007, 15h08

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