Nous enregistrons toutes les exceptions qui se produisent dans notre système en écrivant Exception.Message dans un fichier. Cependant, ils sont écrits dans la culture du client. Et les erreurs turques ne signifient pas grand-chose pour moi.
Alors, comment pouvons-nous enregistrer des messages d'erreur en anglais sans changer la culture des utilisateurs?
c#
.net
exception
localization
Carra
la source
la source
Réponses:
Ce problème peut être partiellement résolu. Le code d'exception Framework charge les messages d'erreur à partir de ses ressources, en fonction des paramètres régionaux du thread actuel. Dans le cas de certaines exceptions, cela se produit au moment de l'accès à la propriété Message.
Pour ces exceptions, vous pouvez obtenir la version complète en anglais américain du message en basculant brièvement les paramètres régionaux du thread sur en-US pendant la journalisation (en enregistrant les paramètres régionaux de l'utilisateur d'origine au préalable et en les restaurant immédiatement après).
Faire cela sur un thread séparé est encore mieux: cela garantit qu'il n'y aura pas d'effets secondaires. Par exemple:
Où la classe ExceptionLogger ressemble à quelque chose:
Cependant, comme Joe le souligne correctement dans un commentaire sur une révision antérieure de cette réponse, certains messages sont déjà (partiellement) chargés à partir des ressources linguistiques au moment où l'exception est levée.
Cela s'applique à la partie 'le paramètre ne peut pas être nul' du message généré lorsqu'une exception ArgumentNullException ("foo") est levée, par exemple. Dans ces cas, le message apparaîtra (partiellement) localisé, même lorsque vous utilisez le code ci-dessus.
En dehors de l'utilisation de hacks impraticables, tels que l'exécution de tout votre code non UI sur un thread avec des paramètres régionaux en-US pour commencer, il ne semble pas que vous puissiez faire grand-chose à ce sujet: le code d'exception .NET Framework n'a pas fonctionnalités pour remplacer les paramètres régionaux du message d'erreur.
la source
t.CurrentUICulture = new System.Globalization.CultureInfo("fr-FR");
ett.CurrentCulture = new System.Globalization.CultureInfo("fr-FR");
pourtant, l'exception résultante était en anglais ...Environment.GetResourceString("...")
afin que votre solution ne fonctionne plus. La meilleure chose est de lever une exception personnalisée avec votre propre texte de message (anglais) et d'utiliser la propriété InnerException pour conserver l'ancienne.Vous pouvez rechercher le message d'exception d'origine sur unlocalize.com
la source
No records found
.Un point litigieux peut-être, mais au lieu de définir la culture
en-US
, vous pouvez le définirInvariant
. Dans laInvariant
culture, les messages d'erreur sont en anglais.Il a l'avantage de ne pas sembler biaisé, en particulier pour les régions anglophones non américaines. (aka évite les remarques sournoises de ses collègues)
la source
catch
.Voici une solution qui ne nécessite aucun codage et fonctionne même pour les textes d'exceptions qui sont chargés trop tôt pour que nous puissions les modifier par code (par exemple, ceux de mscorlib).
Il ne peut pas toujours être applicable dans tous les cas (cela dépend de votre configuration car vous devez pouvoir créer un fichier .config à côté du fichier .exe principal) mais cela fonctionne pour moi. Donc, créez simplement un
app.config
in dev, (ou un[myapp].exe.config
ouweb.config
en production) qui contient les lignes suivantes par exemple:Cela indique au framework de rediriger les liaisons d'assembly pour
mscorlib
les ressources etSystem.Xml
les ressources, pour les versions entre 1 et 999, en français (la culture est définie sur "fr
") vers un assembly qui ... n'existe pas (un arbitraire version 999).Ainsi, lorsque le CLR recherchera des ressources en français pour ces deux assemblys (mscorlib et System.xml), il ne les trouvera pas et se rabattra sur l'anglais avec élégance. Selon votre contexte et vos tests, vous souhaiterez peut-être ajouter d'autres assemblys à ces redirections (assemblys contenant des ressources localisées).
Bien sûr, je ne pense pas que cela soit pris en charge par Microsoft, alors utilisez-le à vos risques et périls. Eh bien, si vous détectez un problème, vous pouvez simplement supprimer cette configuration et vérifier qu'elle n'est pas liée.
la source
Windows doit avoir installé la langue de l'interface utilisateur que vous souhaitez utiliser. Si ce n'est pas le cas, il n'a aucun moyen de savoir par magie quel est le message traduit.
Dans un Windows 7 Ultimate en-US, avec pt-PT installé, le code suivant:
Produit des messages en pt-PT, en-US et en-US. Puisqu'il n'y a pas de fichiers de culture français installés, il s'agit par défaut de la langue par défaut de Windows (installée?).
la source
Je sais que c'est un vieux sujet, mais je pense que ma solution peut être tout à fait pertinente pour quiconque tombe dessus lors d'une recherche sur le Web:
Dans le journal des exceptions, vous pouvez vous connecter ex.GetType.ToString, ce qui enregistrerait le nom de la classe d'exception. Je m'attendrais à ce que le nom d'une classe soit indépendant de la langue et soit donc toujours représenté en anglais (par exemple "System.FileNotFoundException"), bien qu'à l'heure actuelle je n'ai pas accès à un système de langue étrangère pour tester la idée.
Si vous voulez également le texte du message d'erreur, vous pouvez créer un dictionnaire de tous les noms de classe d'exception possibles et de leurs messages équivalents dans la langue que vous préférez, mais pour l'anglais, je pense que le nom de classe est parfaitement approprié.
la source
InvalidOperationException
, jeté parSystem.Xml.XmlWellFormedWriter
. Vous essayez de deviner quelle erreur spécifique s'est produite sans lire le message. Ça pourrait être mille choses différentes.Sans CONTOURNEMENT.
Tks :)
la source
Le paramètre
Thread.CurrentThread.CurrentUICulture
sera utilisé pour localiser les exceptions. Si vous avez besoin de deux types d'exceptions (une pour l'utilisateur, une pour vous), vous pouvez utiliser la fonction suivante pour traduire le message d'exception. Il recherche dans les ressources .NET-Libraries le texte d'origine pour obtenir la clé de ressource, puis renvoie la valeur traduite. Mais il y a une faiblesse pour laquelle je n'ai pas encore trouvé de bonne solution: les messages contenant {0} dans les ressources ne seront pas trouvés. Si quelqu'un a une bonne solution, je vous en serais reconnaissant.la source
Le framework .NET se compose de deux parties:
Tous les textes (ex. Messages d'exception, libellés de boutons sur un MessageBox, etc.) sont en anglais dans le framework .NET lui-même. Les modules linguistiques contiennent les textes localisés.
Selon votre situation exacte, une solution serait de désinstaller les modules linguistiques (c'est-à-dire de dire au client de le faire). Dans ce cas, les textes d'exception seront en anglais. Notez cependant que tous les autres textes fournis par le framework seront également en anglais (par exemple, les étiquettes des boutons sur une MessageBox, les raccourcis clavier pour ApplicationCommands).
la source
J'imagine une de ces approches:
Les exceptions ne sont lues que par vous, c'est-à-dire qu'elles ne sont pas une fonctionnalité client, vous pouvez donc utiliser des chaînes câblées non localisées qui ne changeront pas lorsque vous exécutez en mode turc.
Incluez un code d'erreur, par exemple
0x00000001
avec chaque erreur, afin de pouvoir le rechercher facilement dans un tableau anglais.la source
Basé sur la réponse Undercover1989, mais prend en compte les paramètres et lorsque les messages sont composés de plusieurs chaînes de ressources (comme les exceptions d'argument).
la source
J'ai eu la même situation, et toutes les réponses que j'ai trouvées ici et ailleurs n'ont pas aidé ou n'étaient pas satisfaisantes:
Le
Thread.CurrentUICulture
change la langue des exceptions .net, mais ce n'est pas le casWin32Exception
, qui utilise les ressources Windows dans la langue de l'interface utilisateur Windows elle-même. Je n'ai donc jamais réussi à imprimer les messagesWin32Exception
en anglais au lieu de l'allemand, pas même en utilisantFormatMessage()
comme décrit dansComment obtenir Win32Exception en anglais?
J'ai donc créé ma propre solution, qui stocke la majorité des messages d'exception existants pour différentes langues dans des fichiers externes. Vous n'obtiendrez pas le message très exact dans la langue de votre choix, mais vous obtiendrez un message dans cette langue, ce qui est beaucoup plus que ce que vous obtenez actuellement (qui est un message dans une langue que vous ne comprenez probablement pas).
Les fonctions statiques de cette classe peuvent être exécutées sur des installations Windows avec différentes langues:
CreateMessages()
crée les textes spécifiques à la culture lesSaveMessagesToXML()
enregistre dans autant de fichiers XML que de langues sont créées ou chargéesLoadMessagesFromXML()
charge tous les fichiers XML avec des messages spécifiques à la langueLors de la création des fichiers XML sur différentes installations Windows avec différentes langues, vous aurez bientôt toutes les langues dont vous avez besoin.
Peut-être que vous pouvez créer des textes pour différentes langues sur 1 Windows lorsque plusieurs modules linguistiques MUI sont installés, mais je ne l'ai pas encore testé.
Testé avec VS2008, prêt à l'emploi. Les commentaires et suggestions sont les bienvenus!
la source
Thread.CurrentUICulture
également la langue de l'interface utilisateur, ce qui en fait une option terrible. Un exemple classique sont les boutons Oui / Non / OK / Annuler dans la boîte de message.Messages d'exception en anglais
puis allez dans le dossier Localisation et placez-le dans projectName.xml et ajoutez
la source
Vous devez enregistrer la pile d'appels au lieu de simplement un message d'erreur (IIRC, simple exception.ToString () devrait le faire pour vous). De là, vous pouvez déterminer exactement d'où provient l'exception et généralement déduire de quelle exception il s'agit.
la source
Remplacez le message d'exception dans le bloc catch à l'aide de la méthode d'extension, le message de vérification provient du code ou non, comme mentionné ci-dessous.
la source
InvalidOperationException
. Amusez-vous à comprendre ce que cela signifie sans le message lui-même. Une nouvelle instance ne l'aura pas comme par magie.À des fins de journalisation, certaines applications peuvent avoir besoin de récupérer le message d'exception en anglais (en plus de l'afficher dans l'UICulture du client habituel).
A cet effet, le code suivant
puis change finalement l'UICulture actuelle à l'UICulture précédente.
la source