Rejestrujemy wszelkie wyjątki, które zdarzają się w naszym systemie, pisząc do pliku wyjątek. Są one jednak zapisane w kulturze klienta. A błędy tureckie niewiele dla mnie znaczą.
Jak więc możemy rejestrować komunikaty o błędach w języku angielskim bez zmiany kultury użytkowników?
c#
.net
exception
localization
Carra
źródło
źródło
Odpowiedzi:
Ten problem można częściowo obejść. Kod wyjątku środowiska ładuje komunikaty o błędach ze swoich zasobów w oparciu o bieżące ustawienia regionalne wątku. W przypadku niektórych wyjątków dzieje się to w momencie uzyskania dostępu do właściwości Message.
W przypadku tych wyjątków możesz uzyskać pełną wersję wiadomości w języku angielskim, krótko zmieniając ustawienia regionalne wątku na en-US podczas logowania (wcześniej zapisując oryginalne ustawienia narodowe użytkownika i natychmiast przywracając je).
Robienie tego w osobnym wątku jest jeszcze lepsze: zapewnia to, że nie będzie żadnych skutków ubocznych. Na przykład:
Gdzie klasa ExceptionLogger wygląda mniej więcej tak:
Jednak jak Joe słusznie wskazuje w komentarzu do wcześniejszej wersji tej odpowiedzi, niektóre wiadomości są już (częściowo) ładowane z zasobów językowych w momencie zgłoszenia wyjątku.
Dotyczy to części „parametr nie może być zerowy” komunikatu generowanego, gdy na przykład zgłoszony jest wyjątek ArgumentNullException („foo”). W takich przypadkach komunikat będzie nadal (częściowo) zlokalizowany, nawet przy użyciu powyższego kodu.
Poza wykorzystaniem niepraktycznych włamań, takich jak uruchomienie całego kodu innego niż interfejs użytkownika w wątku z ustawieniami narodowymi en-US, na początku nie wydaje się, aby można było wiele z tym zrobić: kod wyjątku .NET Framework nie ma narzędzia do zastępowania ustawień regionalnych komunikatów o błędach.
źródło
t.CurrentUICulture = new System.Globalization.CultureInfo("fr-FR");
at.CurrentCulture = new System.Globalization.CultureInfo("fr-FR");
mimo to powstały wyjątek po angielsku ...Environment.GetResourceString("...")
czemu Twoje rozwiązanie nie działa. Najlepiej jest rzucić niestandardowy wyjątek z własnym tekstem wiadomości (w języku angielskim) i użyć właściwości InnerException, aby zachować stary.Możesz wyszukać oryginalną wiadomość wyjątku na unlocalize.com
źródło
No records found
.Być może kwestia sporna, ale zamiast ustawić kulturę
en-US
, możesz ją ustawićInvariant
. WInvariant
kulturze komunikaty o błędach są w języku angielskim.Ma to tę zaletę, że nie wygląda na stronnicze, szczególnie w przypadku nieamerykańskich lokalizacji anglojęzycznych. (alias unika złośliwych uwag kolegów)
źródło
catch
.Oto rozwiązanie, które nie wymaga żadnego kodowania i działa nawet w przypadku tekstów wyjątków, które są ładowane zbyt wcześnie, abyśmy mogli zmienić kod (na przykład te w mscorlib).
Nie zawsze może mieć zastosowanie w każdym przypadku (zależy to od konfiguracji, ponieważ musisz mieć możliwość utworzenia pliku .config oprócz głównego pliku .exe), ale to działa dla mnie. Więc po prostu stwórz
app.config
in dev, (lub a[myapp].exe.config
lubweb.config
w produkcji), który zawiera na przykład następujące wiersze:Mówi to frameworkowi, aby przekierowywał wiązania zestawu dla
mscorlib
zasobów iSystem.Xml
zasobów, w wersjach od 1 do 999, w języku francuskim (kultura jest ustawiona na „fr
”) na zestaw, który ... nie istnieje (arbitralny wersja 999).Kiedy więc CLR będzie szukał francuskich zasobów dla tych dwóch zestawów (mscorlib i System.xml), nie znajdzie ich i z wdziękiem powróci do angielskiego. W zależności od kontekstu i testów, możesz chcieć dodać inne zestawy do tych przekierowań (zestawy, które zawierają zlokalizowane zasoby).
Oczywiście nie sądzę, że jest to obsługiwane przez Microsoft, więc używaj na własne ryzyko. Cóż, w przypadku wykrycia problemu możesz po prostu usunąć tę konfigurację i sprawdzić, czy nie jest ona powiązana.
źródło
System Windows musi mieć zainstalowany język interfejsu użytkownika. Tak nie jest, nie ma magicznej wiedzy na temat przetłumaczonej wiadomości.
W en-US Windows 7 Ultimate z zainstalowanym pt-PT następujący kod:
Tworzy wiadomości w pt-PT, en-US i en-US. Ponieważ nie ma zainstalowanych plików kultury francuskiej, domyślnie jest to domyślny (zainstalowany?) Język systemu Windows.
źródło
Wiem, że to stary temat, ale myślę, że moje rozwiązanie może być odpowiednie dla każdego, kto natknie się na to podczas wyszukiwania w Internecie:
W loggerze wyjątków możesz zalogować np. GetType.ToString, który zapisałby nazwę klasy wyjątku. Spodziewałbym się, że nazwa klasy powinna być niezależna od języka i dlatego zawsze będzie reprezentowana w języku angielskim (np. „System.FileNotFoundException”), chociaż obecnie nie mam dostępu do systemu języka obcego, aby przetestować pomysł.
Jeśli naprawdę chcesz również tekst komunikatu o błędzie, możesz utworzyć słownik wszystkich możliwych nazw klas wyjątków i odpowiadających im komunikatów w dowolnym języku, ale dla angielskiego uważam, że nazwa klasy jest całkowicie odpowiednia.
źródło
InvalidOperationException
rzuconySystem.Xml.XmlWellFormedWriter
. Próbujesz zgadnąć, jaki konkretny błąd wystąpił, nie czytając komunikatu. Może być tysiąc różnych rzeczy.Bez obejść.
Tks :)
źródło
Ustawienie
Thread.CurrentThread.CurrentUICulture
zostanie wykorzystane do zlokalizowania wyjątków. Jeśli potrzebujesz dwóch rodzajów wyjątków (jeden dla użytkownika, drugi dla Ciebie), możesz użyć poniższej funkcji do przetłumaczenia komunikatu wyjątku. Przeszukuje w zasobach bibliotek .NET oryginalny tekst, aby uzyskać klucz zasobu, a następnie zwrócić przetłumaczoną wartość. Ale jest jedna słabość, której nie znalazłem jeszcze dobrego rozwiązania: Wiadomości, które zawierają {0} zasobów, nie zostaną znalezione. Jeśli ktoś ma dobre rozwiązanie, byłbym wdzięczny.źródło
Struktura .NET składa się z dwóch części:
Wszystkie teksty (np. Komunikaty o wyjątkach, etykiety przycisków na MessageBox itp.) Są w języku angielskim w samym środowisku .NET. Pakiety językowe zawierają zlokalizowane teksty.
W zależności od konkretnej sytuacji rozwiązaniem byłoby odinstalowanie pakietów językowych (tj. Powiadomienie klienta). W takim przypadku teksty wyjątków będą w języku angielskim. Należy jednak pamiętać, że wszystkie inne teksty dostarczone w ramach frameworka będą również w języku angielskim (np. Etykiety przycisków w MessageBox, skróty klawiaturowe dla poleceń aplikacji).
źródło
Wyobrażam sobie jedno z tych podejść:
Wyjątki są zawsze odczytywane tylko przez Ciebie, tzn. Nie są funkcją klienta, więc możesz używać przewodowych nie zlokalizowanych ciągów, które nie zmienią się, gdy uruchomisz w trybie tureckim.
Dołącz kod błędu, np.
0x00000001
Przy każdym błędzie, abyś mógł łatwo sprawdzić go w angielskiej tabeli.źródło
Na podstawie odpowiedzi Undercover1989, ale uwzględnia parametry i kiedy komunikaty składają się z kilku ciągów zasobów (takich jak wyjątki argumentów).
źródło
Miałem tę samą sytuację i wszystkie odpowiedzi, które znalazłem tutaj i gdzie indziej, nie pomogły lub nie były satysfakcjonujące:
Thread.CurrentUICulture
Zmienia język wyjątków .NET, ale nie zaWin32Exception
, który korzysta z zasobów systemu Windows w języku Windows UI samego. Więc nigdy nie udało mi się wydrukować wiadomościWin32Exception
w języku angielskim zamiast niemieckim, nawet przy użyciuFormatMessage()
opisanego wJak uzyskać wyjątek Win32Ex po angielsku?
Dlatego stworzyłem własne rozwiązanie, które przechowuje większość istniejących komunikatów wyjątków dla różnych języków w plikach zewnętrznych. Nie dostaniesz bardzo dokładnej wiadomości w wybranym języku, ale dostaniesz wiadomość w tym języku, czyli o wiele więcej niż obecnie (która jest wiadomością w języku, którego prawdopodobnie nie rozumiesz).
Funkcje statyczne tej klasy można wykonywać w instalacjach Windows w różnych językach:
CreateMessages()
tworzy teksty specyficzne dla kultury,SaveMessagesToXML()
zapisuje je w tylu plikach XML, ile języków jest tworzonych lub ładowanychLoadMessagesFromXML()
ładuje wszystkie pliki XML z komunikatami specyficznymi dla językaPodczas tworzenia plików XML w różnych instalacjach systemu Windows w różnych językach wkrótce dostępne będą wszystkie potrzebne języki.
Być może możesz utworzyć teksty dla różnych języków w 1 systemie Windows, jeśli masz zainstalowanych wiele pakietów językowych MUI, ale jeszcze tego nie przetestowałem.
Testowany z VS2008, gotowy do użycia. Komentarze i sugestie są mile widziane!
źródło
Thread.CurrentUICulture
Także zmianę języka interfejsu użytkownika, dzięki czemu jest straszny rozwiązaniem. Klasycznym przykładem są przyciski Tak / Nie / OK / Anuluj w oknie komunikatu.Komunikaty wyjątków w języku angielskim
następnie przejdź do folderu Lokalizacja i umieść go w projectName.xml i dodaj
źródło
Powinieneś zarejestrować stos wywołań zamiast samego komunikatu o błędzie (IIRC, prosty wyjątek. ToString () powinno to zrobić za Ciebie). Stamtąd możesz dokładnie określić, skąd pochodzi wyjątek, i zazwyczaj wydedukować, który to wyjątek.
źródło
Zastąp komunikat wyjątku w bloku catch przy użyciu metody rozszerzenia. Sprawdź, czy zgłoszony komunikat pochodzi z kodu lub nie, jak wspomniano poniżej.
źródło
InvalidOperationException
. Baw się dobrze, zastanawiając się, co to znaczy bez samej wiadomości. Nowa instancja nie będzie tego magicznie mieć.Do celów rejestrowania niektóre aplikacje mogą wymagać pobrania komunikatu o wyjątku w języku angielskim (oprócz wyświetlania go w standardowej wersji UICulture klienta).
W tym celu następujący kod
a następnie ostatecznie zmienia bieżącą UICulture z powrotem na wcześniejszą UICulture.
źródło