2015-07-28 15 views
8

Próbuję zlokalizować mój program, ale chciałbym, aby komunikaty o błędach wysyłane do programistów pojawiały się w języku angielskim. Nie byłem w stanie znaleźć sposobu, aby tak się stało, ponieważ wydaje się, że jeśli kultura interfejsu użytkownika jest ustawiona na inny język, gdy zostanie zgłoszony błąd, jest on wysyłany w tym języku. Ponieważ sam nie napisałem tego programu i jest on dość duży, myślę, że byłoby niepraktyczne, aby tworzyć nowe try catch blocks, aby spróbować ustawić język z powrotem na angielski, gdy wystąpi lub może wystąpić błąd. Obecnie CurrentCulture i DefaultThreadCurrentCulture są zawsze ustawione na język angielski w całej aplikacji, podczas gdy CurrentUICulture jest ustawiony na język użytkownika końcowego.C# - Pobieranie komunikatów o wyjątkach w języku angielskim, gdy aplikacja jest w innym języku?

W toku obejścia mam obecnie funkcję, która przeglądała listę błędów (przy użyciu System.Resources.ResourceSets (które, jak zakładam, są błędami systemu Windows, ale potrzebuję również sposobu na znalezienie błędów w .NET, więc Potrafię iterować po nich). Ciąg znaków zastępuje błędy pasujące w innych językach i zastępuje je ich angielskimi odpowiednikami, aby utworzyć dużą wiadomość błędów, która zostanie wysłana do programistów za każdym razem, gdy aplikacja się zawiesza. Naprawdę, nie mam wiele do tłumaczenia ponieważ większość wiadomości jest śladem stosu serwera i pokazuje, gdzie został zgłoszony wyjątek.Największy problem polega na tłumaczeniu komunikatu Inner Exception i czasami głównym komunikatem wyjątku, ponieważ czasami zgłaszane błędy nie pojawiają się w ResourceSet i czasami używają elementów formatujących jak "{0}".

Oto kod, który mam do przetłumaczenia pozostałych błędów. Nadal pracuję nad dodaniem wzorców regex do tłumaczenia błędów, które używają rzeczy takich jak "{0}", więc jeśli ktoś ma sugestie na te lub lepsze sposoby na to, byłbym wdzięczny za sugestie.

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 
    } 

Próbowałem również stosując metodę zamieszczonych tutaj (Exception messages in English?), ale bez większego powodzenia. Wciąż kończyłem z tymi samymi zlokalizowanymi komunikatami o błędach. Oto kod, w którym wiem, że jest zgłaszany błąd, ale nie wygląda na to, że blok catch robi cokolwiek, by zmienić język. Moja klasa ExceptionLogger jest skonfigurowana w taki sam sposób, jak w przykładzie Stackoverflow z dodatkiem linii do zapisu błędu w pliku. Błąd jest zgłaszany przy wcf.Client.Ping() (Nie obchodzi mnie faktyczny błąd, używam go do testowania).

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(); 
     } 
} 

Jeśli nie ma nic innego, czy istnieje sposób, aby uzyskać listę wszystkich możliwych błędów programu .NET Framework w języku angielskim, a także w innych językach? Czy istnieje klasa, do której mogę uzyskać dostęp, aby uzyskać te informacje z mojego programu lub listy w innym miejscu? Próbowałem przeglądać witryny takie jak unlocalize.com i finderr.net, ale naprawdę nie chcę pisać czegoś, co przeszuka wszystkie strony, aby znaleźć każdy możliwy błąd.

Przepraszam, jeśli czegoś mi brakuje. Jestem całkiem nowy w C# i programowaniu w ogóle, a ten problem doprowadza mnie do szaleństwa!

Edit: Zapomniałem dodać, że wolałbym uniknąć do rozwiązania, takie jak te, gdzie trzeba być stale zmieniając CurrentUICulture:

Force exceptions language in English

Prevent exception messages from being translated into the user's language?

lub roztwory gdzie usuwać język pakiety lub coś na komputerze użytkownika lub po prostu ustaw błędy po angielsku podczas debugowania (te logi błędów będą również wysyłane z komputera końcowego użytkownika w przypadku awarii aplikacji i jeśli używają innego języka, potrzebujemy zarejestrowanych błędów po angielsku) .

Co więcej, wiem, że mogłem po prostu zgłosić komunikat o błędzie lub użyć opcji unlocalize.com lub finderr.net do tłumaczenia wiadomości, ale myślę, że inni programiści mogliby mnie zabić, gdyby musieli to zrobić, hah. Sądzę, że jeśli gorsze jest najgorsze, mogę zapytać o unloocalize site? Wygląda jednak na prawdziwy ból.

Odpowiedz

-1

Spróbuj tego:

Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-us"); 
+0

Spróbuj gdzie? W mojej funkcji TranslateExceptionMessageTest CurrentUICulture i CurrentCulture są już ustawione na "en"/"en-us". Nie mogę ustawić CurrentUICulture na "en-us" w innym miejscu kodu, ponieważ musi on zostać ustawiony na kulturę wybraną przez użytkownika dla celów lokalizacji interfejsu użytkownika. – jalexis

1

Here można znaleźć rozwiązanie dla tego problemu. Aby w wielkim skrócie:

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(); 
} 

gdzie klasa ExceptionLogger wyglądał:

class ExceptionLogger 
{ 
    Exception _ex; 

    public ExceptionLogger(Exception ex) 
    { 
    _ex = ex; 
    } 

    public void DoLog() 
    { 
    Console.WriteLine(_ex.ToString()); //Will display en-US message 
    } 
} 
+0

Próbowałem tego i okazało się, że język wyjątku został ustawiony, gdy został rzucony. Kultura wątku czytającego wiadomość nie zmieniła tego. – hultqvist

Powiązane problemy