studio - C#- ¿Recibe mensajes de excepción en inglés cuando la aplicación está en otro idioma?
visual studio installer (2)
Prueba esto:
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-us");
Estoy intentando localizar mi programa, pero me gustaría que los mensajes de error que se envían a los desarrolladores aparezcan en inglés. No he podido encontrar la manera de que esto ocurra, ya que parece que si la cultura de la interfaz de usuario está configurada en otro idioma cuando se produce un error, se lanza en ese idioma. Como yo no escribí este programa yo mismo, y es bastante grande, creo que no sería práctico crear nuevos bloques try catch para tratar de volver a establecer el idioma en inglés cada vez que se produzca un error o que pueda ocurrir. Actualmente, CurrentCulture y DefaultThreadCurrentCulture siempre se configuran en inglés en toda la aplicación, mientras que CurrentUICulture se establece en el idioma del usuario final.
Como solución alternativa, actualmente tengo una función que ha estado iterando a través de una lista de errores (usando System.Resources.ResourceSets (que supongo que son errores de Windows, pero también necesito una forma de encontrar los errores de .NET para que pueda iterar) ) reemplaza los errores coincidentes en otros idiomas y los reemplaza con sus equivalentes en inglés para generar un gran mensaje de errores que se enviará a los desarrolladores cada vez que la aplicación se cuelgue. Realmente, no tengo mucho que traducir ya que la mayoría de los es el seguimiento de la pila del servidor y muestra dónde se lanzó la excepción. El mayor problema es traducir el mensaje Excepción interna y, a veces, el mensaje de excepción principal, ya que a veces los errores arrojados no aparecen en el ResourceSet y a veces usan elementos de formato como } ''.
Aquí está el código que tengo para traducir los errores restantes. Todavía estoy trabajando en agregar patrones de expresiones regulares para traducir errores que usan cosas como ''{0}'', por lo que si alguien tiene sugerencias para eso o mejores formas de hacerlo, agradecería sugerencias.
public static string TranslateExceptionMessageTest(string exmsg, Exception e, CultureInfo currentui)
{
CultureInfo test = Thread.CurrentThread.CurrentUICulture;
string matchingstr = "";
string newstr = exmsg;
string resourcecollection = "";
Assembly a = e.GetType().Assembly;
ResourceManager rm = new ResourceManager(a.GetName().Name, a);
ResourceSet rsOriginal = rm.GetResourceSet(currentui, true, true);
ResourceSet rsTranslated = rm.GetResourceSet(new CultureInfo("en-US"), true, true);
foreach (DictionaryEntry item in rsOriginal)
{
if (exmsg.Contains(item.Value.ToString()))
{
if (item.Key.ToString() == "Word_At") // sometimes with spanish errors this replaces words containing the letters ''en'' with ''at''.
{
string newat = " " + item.Value.ToString() + " "; // this is the formatting the word ''at'' appears with, in any culture I''ve tested.
matchingstr = " " + rsTranslated.GetString(item.Key.ToString(), false) + " ";
newstr = newstr.Replace(newat, matchingstr);
}
else
{
matchingstr = rsTranslated.GetString(item.Key.ToString(), false);
newstr = newstr.Replace(item.Value.ToString(), matchingstr);
}
}
resourcecollection = resourcecollection + Environment.NewLine + "Key: " + item.Key.ToString() + Environment.NewLine + "Value: " + item.Value.ToString();
}
return newstr; // success
}
También he intentado usar el método publicado aquí (¿ Mensajes de excepción en inglés? ) Pero sin mucha suerte. Todavía terminé con los mismos mensajes de error localizados. Aquí está el código donde sé que se está lanzando un error, pero no parece que el bloque catch esté haciendo algo para cambiar el idioma. Mi clase ExceptionLogger está configurada de la misma manera que en el ejemplo de Stackoverflow con la adición de una línea para escribir el error en un archivo. El error se produce en wcf.Client.Ping () (no me importa el error real. Lo estoy usando para probar).
private void PreloadWcfDlls(object state)
{
if (Global.Inst.ServerMode == ApplicationServerMode.Unknown)
return;
try
{
using (var wcf = ClientGrabber.GetSchemaClient(Global.Inst.ServerMode))
{
wcf.Client.Ping();
}
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString()); //Will display localized message
ExceptionLogger el = new ExceptionLogger(ex);
System.Threading.Thread t = new System.Threading.Thread(el.DoLog);
t.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
t.Start();
}
}
Si nada más, ¿hay alguna manera de obtener una lista de todos los posibles errores de .NET Framework en inglés y en otros idiomas? ¿Hay alguna clase a la que pueda acceder para obtener estos desde mi programa o una lista en otro lugar? He intentado buscar sitios como unlocalize.com y finderr.net, pero realmente no quiero tener que escribir algo para rastrear todas las páginas y encontrar todos los errores posibles.
Lo siento si me falta algo por completo. ¡Soy bastante nuevo en C # y la programación en general y este problema me está volviendo loco!
Editar: Olvidé agregar que preferiría evitar una solución como esta en la que tenga que cambiar constantemente la CurrentUICulture:
Forzar excepciones de idioma en inglés
Evitar que los mensajes de excepción se traduzcan al idioma del usuario?
O soluciones donde elimina paquetes de idiomas o algo en la computadora del usuario o simplemente establece los errores en inglés cuando se depura (estos registros de errores también se enviarán desde la computadora de un usuario final en caso de que la aplicación falle y si están usando otra) idioma que necesitamos los errores registrados en inglés).
Además, sé que podría buscar en google los mensajes de error o usar unlocalize.com o finderr.net para traducir los mensajes, pero creo que los otros desarrolladores podrían matarme si tuvieran que hacer eso, ja, ja. Supongo que, si empeora, ¿podría consultar el sitio de deslocalización? Aunque parece un verdadero dolor.
Aquí puedes encontrar una solución para el problema. Para resumir la larga historia:
try { System.IO.StreamReader sr=new System.IO.StreamReader(@"c:/does-not-exist"); } catch(Exception ex) { Console.WriteLine(ex.ToString()); //Will display localized message ExceptionLogger el = new ExceptionLogger(ex); System.Threading.Thread t = new System.Threading.Thread(el.DoLog); t.CurrentUICulture = new System.Globalization.CultureInfo("en-US"); t.Start(); }
Donde la clase ExceptionLogger se ve algo así como:
class ExceptionLogger { Exception _ex; public ExceptionLogger(Exception ex) { _ex = ex; } public void DoLog() { Console.WriteLine(_ex.ToString()); //Will display en-US message } }