Próbuję uzyskać wszystkie komunikaty Exception
w języku angielskim, bez względu na to, w jakim języku jest komputer, na którym działa mój program.Jak uzyskać błąd Win32Exception w języku angielskim?
jakie udało się uzyskać niemal wszystkie komunikaty o wyjątkach w języku angielskim używając odpowiedzi z następujących stanowisk: Exception messages in English? i niektóre inne rozwiązanie znalazłem (jak przy użyciu odbicia zmienić domyślną CultureInfo
). Mam specyficzny problem z SocketException
, Bez względu na to, co robię, otrzymuję go w domyślnym języku maszyny.
stworzyłem program testowy, aby pokazać problem: Program ten test drukowania wyjątków w języku domyślnym:
using System;
using System.Text;
using System.Threading;
using System.IO;
using System.Net.Sockets;
using System.Reflection;
using System.Globalization;
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
try
{
//I'm not listening on the following port:
TcpClient s = new TcpClient("localhost", 2121);
}
catch (Exception ex)
{
Console.WriteLine("Socket exception: " + ex.Message);
}
try
{
//the following file doesn't exists:
File.ReadAllText("filenotexist.txt");
}
catch (Exception ex)
{
Console.WriteLine("File exception: " + ex.Message);
}
}
}
}
Wynik ten na moim komputerze następujący tekst:
H:\Shared>Test-def.exe
Socket exception: No connection could be made because the target machine actively refused it 127.0.0.1:2121
File exception: Could not find file 'H:\Shared\filenotexist.txt'.
Na maszynie japońskiej zapisuje wszystkie wyjątki w języku japońskim (czego nie rozumiem):
Z:\>Test-def.exe
Socket exception: 対象のコンピューターによって拒否されたため、接続できませんでした。 127.0.0.1:2121
File exception: ファイル 'Z:\filenotexist.txt' が見つかりませんでした。
(Japoński "\" wygląda inaczej w japońskiej maszynie, ale po skopiowaniu do mojego urządzenia jest oznaczony jako "\")
Po połączeniu odpowiedzi, które znalazłem, wprowadziłem następujące rozwiązanie: tak teraz wygląda to tak:
namespace TestApp
{
class Program
{
//will change CultureInfo to English, this should change all threads CultureInfo to English.
public static void SetEnglishCulture()
{
CultureInfo ci = new CultureInfo("en-US");
//change CultureInfo for current thread:
Thread.CurrentThread.CurrentUICulture = ci;
Thread.CurrentThread.CurrentCulture = ci;
//change CultureInfo for new threads:
Type t = typeof(CultureInfo);
try
{
t.InvokeMember("s_userDefaultCulture", BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static, null, ci, new object[] { ci });
t.InvokeMember("s_userDefaultUICulture", BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static, null, ci, new object[] { ci });
}
catch { }
try
{
t.InvokeMember("m_userDefaultCulture", BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static, null, ci, new object[] { ci });
t.InvokeMember("m_userDefaultUICulture", BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static, null, ci, new object[] { ci });
}
catch { }
}
static void Main(string[] args)
{
//first thing: set CultureInfo to English:
SetEnglishCulture();
try
{
//I'm not listening on the following port:
TcpClient s = new TcpClient("localhost", 2121);
}
catch (Exception ex)
{
Console.WriteLine("Socket exception: " + ex.Message);
}
try
{
//the following file doesn't exists:
File.ReadAllText("filenotexist.txt");
}
catch (Exception ex)
{
Console.WriteLine("File exception: " + ex.Message);
}
}
}
}
teraz na japońskiej maszynie to napisać wyjątki plików po angielsku, ale są wyjątki Net.socket nadal w języku japońskim:
Z:\>Test-en.exe
Socket exception: 対象のコンピューターによって拒否されたため、接続できませんでした。 127.0.0.1:2121
File exception: Could not find file 'Z:\filenotexist.txt'.
ja również testowane jakiś inny wyjątki, niektóre wyjątki są teraz wyświetlane w języku angielskim, bu nie wszystkie z nich, wyjątki gniazd są trwałe. Jak widać, wyjątek pliku został przetłumaczony na angielski, ale wyjątek gniazda jest nadal w języku japońskim.
Testowałem to w prawie każdym środowisku .NET (od 2.1 do 4.5), wciąż takie same.
- Czy istnieje pełne rozwiązanie dla wszystkich wyjątków?
- Czy coś przeoczyłem?
- Czy powinienem zrobić cokolwiek innego?
- Może istnieje inny sposób uruchomienia programu na obcej maszynie i ustawienia zmiennej środowiskowej, aby uzyskać wyjście angielskie?
Nie otrzymuję żadnego angielskiego tekstu, ani w VS2008 (.net 3.5), ani w VS2015 (.net 4.5.2). defSb zawiera niemiecki tekst, engSb nie zawiera nic. –
defLangID jest identyfikatorem języka, użyłem eng-us w mojej próbce, ale wygląda na to, że twoja maszyna go nie obsługuje, ale może obsługuje inne eng. język? może eng-uk? Możesz spróbować użyć innych ustawień narodowych, zobacz pełną listę tutaj: https://msdn.microsoft.com/en-us/library/windows/desktop/dd318693(v=vs.85).aspxhttps://msdn.microsoft. com/en-us/library/windows/desktop/dd318693 (v = vs.85) .aspx – SHR