Estamos registrando cualquier excepción que ocurra en nuestro sistema escribiendo Exception.Message en un archivo. Sin embargo, están escritos en la cultura del cliente. Y los errores turcos no significan mucho para mí.
Entonces, ¿cómo podemos registrar cualquier mensaje de error en inglés sin cambiar la cultura de los usuarios?
c#
.net
exception
localization
Carra
fuente
fuente
Respuestas:
Este problema puede solucionarse parcialmente. El código de excepción de Framework carga los mensajes de error de sus recursos, en función de la configuración regional de subproceso actual. En el caso de algunas excepciones, esto sucede en el momento en que se accede a la propiedad Mensaje.
Para esas excepciones, puede obtener la versión completa del mensaje en inglés de EE. UU. Cambiando brevemente la configuración regional del hilo a en-US mientras la registra (guardando la configuración regional del usuario original de antemano y restaurándola inmediatamente después).
Hacer esto en un hilo separado es aún mejor: esto asegura que no habrá efectos secundarios. Por ejemplo:
Donde la clase ExceptionLogger se parece a:
Sin embargo, como Joe señala correctamente en un comentario sobre una revisión anterior de esta respuesta, algunos mensajes ya están (parcialmente) cargados de los recursos del idioma en el momento en que se produce la excepción.
Esto se aplica a la parte 'parámetro no puede ser nulo' del mensaje generado cuando se produce una excepción ArgumentNullException ("foo"), por ejemplo. En esos casos, el mensaje seguirá apareciendo (parcialmente) localizado, incluso cuando se use el código anterior.
Aparte de usar hacks poco prácticos, como ejecutar todo su código que no sea de UI en un hilo con configuración regional en EE. UU., No parece haber mucho que pueda hacer al respecto: el código de excepción de .NET Framework no tiene facilidades para anular la configuración regional del mensaje de error.
fuente
t.CurrentUICulture = new System.Globalization.CultureInfo("fr-FR");
yt.CurrentCulture = new System.Globalization.CultureInfo("fr-FR");
, sin embargo, la excepción resultante fue en inglés ...Environment.GetResourceString("...")
para que su solución ya no funcione. Lo mejor es lanzar una excepción personalizada con su propio texto de mensaje (en inglés) y usar la propiedad InnerException para mantener la anterior.Puede buscar el mensaje de excepción original en unlocalize.com
fuente
No records found
.Quizás sea un punto polémico, pero en lugar de establecer la cultura
en-US
, puede configurarloInvariant
. En laInvariant
cultura, los mensajes de error están en inglés.Tiene la ventaja de no parecer sesgada, especialmente para los entornos de habla inglesa no estadounidenses. (también conocido como evita comentarios sarcásticos de colegas)
fuente
catch
.Aquí hay una solución que no requiere ninguna codificación y funciona incluso para textos de excepciones que se cargan demasiado pronto para que podamos cambiar por código (por ejemplo, aquellos en mscorlib).
Es posible que no siempre sea aplicable en todos los casos (depende de su configuración, ya que necesita poder crear un archivo .config aparte del archivo .exe principal), pero eso funciona para mí. Entonces, solo cree un
app.config
in dev (o a[myapp].exe.config
oweb.config
en producción) que contenga las siguientes líneas, por ejemplo:Lo que esto hace es decirle al marco que redirija los enlaces de ensamblaje para
mscorlib
los recursos ySystem.Xml
los recursos de, para las versiones entre 1 y 999, en francés (la cultura se establece en "fr
") a un ensamblaje que ... no existe (un arbitrario versión 999).Entonces, cuando el CLR buscará recursos en francés para estos dos ensamblados (mscorlib y System.xml), no los encontrará y recurrirá al inglés con gracia. Dependiendo de su contexto y pruebas, es posible que desee agregar otros ensamblados a estos redireccionamientos (ensamblajes que contienen recursos localizados).
Por supuesto, no creo que Microsoft lo admita, así que úselo bajo su propio riesgo. Bueno, en caso de que detecte un problema, puede eliminar esta configuración y verificar que no esté relacionada.
fuente
Windows necesita tener instalado el idioma de la interfaz de usuario que desea utilizar. Si no lo hace, no tiene forma de saber mágicamente cuál es el mensaje traducido.
En un Windows 7 ultimate en-US, con pt-PT instalado, el siguiente código:
Produce mensajes en pt-PT, en-US y en-US. Como no hay archivos de cultura francesa instalados, el idioma predeterminado de Windows es (¿instalado?).
fuente
Sé que este es un tema antiguo, pero creo que mi solución puede ser bastante relevante para cualquiera que se encuentre con ella en una búsqueda en la web:
En el registrador de excepciones, puede registrar ex.GetType.ToString, lo que guardaría el nombre de la clase de excepción. Esperaría que el nombre de una clase sea independiente del idioma y, por lo tanto, siempre esté representado en inglés (por ejemplo, "System.FileNotFoundException"), aunque en este momento no tengo acceso a un sistema de idioma extranjero para probar idea.
Si realmente desea también el texto del mensaje de error, puede crear un diccionario de todos los posibles nombres de clase de excepción y sus mensajes equivalentes en el idioma que prefiera, pero para el inglés, creo que el nombre de la clase es perfectamente adecuado.
fuente
InvalidOperationException
, arrojado porSystem.Xml.XmlWellFormedWriter
. Intenta adivinar qué error específico ocurrió sin leer el mensaje. Podrían ser mil cosas diferentes.Sin WORKAROUNDS.
Tks :)
fuente
La configuración
Thread.CurrentThread.CurrentUICulture
se utilizará para localizar las excepciones. Si necesita dos tipos de excepciones (una para el usuario y otra para usted), puede usar la siguiente función para traducir el mensaje de excepción. Está buscando en los recursos de las Bibliotecas .NET el texto original para obtener la clave de recursos y luego devolver el valor traducido. Pero hay una debilidad que aún no encontré una buena solución: los mensajes que contienen {0} en recursos no se encontrarán. Si alguien tiene una buena solución, se lo agradecería.fuente
El marco .NET viene en dos partes:
Todos los textos (por ejemplo, mensajes de excepción, etiquetas de botones en un cuadro de mensaje, etc.) están en inglés en el propio marco .NET. Los paquetes de idiomas tienen los textos localizados.
Dependiendo de su situación exacta, una solución sería desinstalar los paquetes de idiomas (es decir, decirle al cliente que lo haga). En ese caso, los textos de excepción estarán en inglés. Sin embargo, tenga en cuenta que el resto del texto proporcionado por el marco también estará en inglés (por ejemplo, las etiquetas de los botones en un cuadro de mensaje, métodos abreviados de teclado para los comandos de aplicación).
fuente
Me imagino uno de estos enfoques:
Las excepciones solo son leídas por usted, es decir, no son una característica del cliente, por lo que puede usar cadenas cableadas no localizadas que no cambiarán cuando ejecute en modo turco.
Incluya un código de error, por ejemplo,
0x00000001
con cada error para que pueda buscarlo fácilmente en una tabla en inglés.fuente
Basado en la respuesta Undercover1989, pero tiene en cuenta los parámetros y cuando los mensajes se componen de varias cadenas de recursos (como excepciones de argumentos).
fuente
He tenido la misma situación, y todas las respuestas que encontré aquí y en otros lugares no ayudaron o no fueron satisfactorias:
El
Thread.CurrentUICulture
cambia el idioma de las excepciones de .NET, pero no paraWin32Exception
, que utiliza los recursos de Windows en el idioma de la interfaz de usuario de Windows en sí. Así que nunca logré imprimir los mensajesWin32Exception
en inglés en lugar de en alemán, ni siquiera usandoFormatMessage()
como se describe en¿Cómo obtener Win32Exception en inglés?
Por lo tanto, creé mi propia solución, que almacena la mayoría de los mensajes de excepción existentes para diferentes idiomas en archivos externos. No recibirá el mensaje exacto en su idioma deseado, pero recibirá un mensaje en ese idioma, que es mucho más de lo que actualmente recibe (que es un mensaje en un idioma que probablemente no entienda).
Las funciones estáticas de esta clase se pueden ejecutar en instalaciones de Windows con diferentes idiomas:
CreateMessages()
crea los textos específicos de la cultura, losSaveMessagesToXML()
guarda en tantos archivos XML como idiomas se crean o cargan,LoadMessagesFromXML()
carga todos los archivos XML con mensajes específicos del idiomaAl crear los archivos XML en diferentes instalaciones de Windows con diferentes idiomas, pronto tendrá todos los idiomas que necesita.
Quizás pueda crear los textos para diferentes idiomas en 1 Windows cuando tenga instalados varios paquetes de idiomas MUI, pero aún no lo he probado.
Probado con VS2008, listo para usar. ¡Comentarios y sugerencias son bienvenidas!
fuente
Thread.CurrentUICulture
también cambia el idioma de la interfaz de usuario, por lo que es una terrible opción. Un ejemplo clásico son los botones Sí / No / Aceptar / Cancelar en el cuadro de mensaje.Mensajes de excepción en inglés
luego vaya a la carpeta de localización y colóquelo en projectName.xml y agregue
fuente
Debe registrar la pila de llamadas en lugar de solo un mensaje de error (IIRC, excepción simple. ToString () debería hacerlo por usted). A partir de ahí, puede determinar exactamente de dónde se originó la excepción y, por lo general, deducir qué excepción es.
fuente
Anule el mensaje de excepción en el bloque catch mediante el método de extensión. El mensaje de verificación emitido proviene del código o no, como se menciona a continuación.
fuente
InvalidOperationException
. Diviértete averiguando qué significa eso sin el mensaje en sí. Una nueva instancia no lo tendrá mágicamente.Para fines de registro, ciertas aplicaciones pueden necesitar buscar el mensaje de excepción en inglés (además de mostrarlo en la UICultura del cliente habitual).
Para ello, el siguiente código
y luego finalmente cambia la UICultura actual a UICultura anterior.
fuente