[C#] 영어로 된 예외 메시지?

Exception.Message를 파일에 작성하여 시스템에서 발생하는 모든 예외를 로깅합니다. 그러나 그들은 고객의 문화로 작성되었습니다. 터키의 실수는 나에게 큰 의미가 없습니다.

그렇다면 사용자 문화를 바꾸지 않고 어떻게 오류 메시지를 영어로 기록 할 수 있습니까?



답변

이 문제는 부분적으로 해결 될 수 있습니다. Framework 예외 코드는 현재 스레드 로캘을 기반으로 리소스에서 오류 메시지를로드합니다. 일부 예외의 경우 Message 속성에 액세스 할 때 발생합니다.

이러한 예외가 발생하는 경우 스레드 로캘을 en-US로 간단히 전환하여 로그를 기록하여 메시지의 전체 영어 버전 메시지를 얻을 수 있습니다 (원래의 사용자 로캘을 미리 저장 한 후 바로 복원).

별도의 스레드에서이 작업을 수행하는 것이 더 좋습니다. 이렇게하면 부작용이 발생하지 않습니다. 예를 들면 다음과 같습니다.

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

ExceptionLogger 클래스는 다음과 같습니다.

class ExceptionLogger
{
  Exception _ex;

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

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

그러나 Joe 가이 회신의 이전 개정에 대한 주석에서 올바르게 지적한 것처럼 일부 메시지는 예외가 발생할 때 언어 자원에서 이미 (부분적으로)로드됩니다.

예를 들어 ArgumentNullException ( “foo”) 예외가 발생할 때 생성 된 메시지의 ‘매개 변수가 널일 수 없음’부분에 적용됩니다. 이러한 경우 위의 코드를 사용하더라도 메시지가 여전히 부분적으로 현지화되어 나타납니다.

en-US 로켈이있는 스레드에서 UI가 아닌 모든 코드를 실행하는 등 실용적이 아닌 해킹을 사용하는 것 외에는 할 수있는 일이 많지 않습니다. .NET Framework 예외 코드에는 오류 메시지 로캘을 재정의하는 기능


답변

unlocalize.com 에서 원래 예외 메시지를 검색 할 수 있습니다.


답변

논쟁의 여지가 있지만 문화를로 설정하는 대신로 설정할 en-US수 있습니다 Invariant. 에서 Invariant문화, 오류 메시지가 영어로되어 있습니다.

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

비 미국 영어권 지역에서는 편향적으로 보이지 않는 장점이 있습니다. (일명 동료의 비난을 피함)


답변

다음은 코딩이 필요하지 않으며 너무 일찍로드 된 예외 텍스트 (예 : mscorlib의 텍스트)로 변경할 수없는 예외 텍스트에도 작동하는 솔루션입니다.

모든 경우에 항상 적용 가능한 것은 아니지만 (주 .exe 파일과 함께 .config 파일을 만들 수 있어야하기 때문에 설정에 따라 다릅니다) 그러나 그것은 저에게 효과적입니다. 따라서 예를 들어 다음과 같은 줄이 포함 된 app.configin dev (또는 a [myapp].exe.config또는 web.configproduction)를 만드십시오 .

<configuration>
  ...
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="mscorlib.resources" publicKeyToken="b77a5c561934e089"
                          culture="fr" /> <!-- change this to your language -->

        <bindingRedirect oldVersion="1.0.0.0-999.0.0.0" newVersion="999.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Xml.resources" publicKeyToken="b77a5c561934e089"
                          culture="fr" /> <!-- change this to your language -->

        <bindingRedirect oldVersion="1.0.0.0-999.0.0.0" newVersion="999.0.0.0"/>
      </dependentAssembly>

      <!-- add other assemblies and other languages here -->

    </assemblyBinding>
  </runtime>
  ...
</configuration>

이 작업은 프레임 워크 에서 프랑스어 (문화는 ” ” 로 설정 됨)의 프랑스어 (문화는 ” ” 로 설정 됨 )에서 존재하지 않는 (임의의) 임의의 (임의 mscorlib의) 리소스 및 리소스에 대한 어셈블리 바인딩을 리디렉션 하도록 지시합니다. 버전 999).System.Xmlfr

따라서 CLR이이 두 어셈블리 (mscorlib 및 System.xml)에 대한 프랑스어 리소스를 찾을 때는 찾지 못하고 정상적으로 영어로 대체됩니다. 상황과 테스트에 따라 이러한 리디렉션 (현지화 된 리소스가 포함 된 어셈블리)에 다른 어셈블리를 추가 할 수 있습니다.

물론 이것이 Microsoft에서 지원한다고 생각하지 않으므로 자신의 책임하에 사용하십시오. 문제를 발견 한 경우이 구성을 제거하고 관련이 없는지 확인할 수 있습니다.


답변

Windows에는 사용하려는 UI 언어가 설치되어 있어야합니다. 번역 된 메시지가 무엇인지 마술처럼 알 수있는 방법은 없습니다.

pt-PT가 설치된 en-US Windows 7 Ultimate에서 다음 코드는 다음과 같습니다.

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("pt-PT");
string msg1 = new DirectoryNotFoundException().Message;

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
string msg2 = new FileNotFoundException().Message;

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
string msg3 = new FileNotFoundException().Message;

pt-PT, en-US 및 en-US로 메시지를 생성합니다. 프랑스어 문화권 파일이 설치되어 있지 않기 때문에 기본적으로 Windows 기본 (설치?) 언어가 사용됩니다.


답변

나는 이것이 오래된 주제라는 것을 알고 있지만 내 솔루션은 웹 검색에서 우연히 발견되는 사람과 관련이 있다고 생각합니다.

예외 로거에서 ex.GetType.ToString을 기록하면 예외 클래스의 이름이 저장됩니다. 클래스의 이름은 언어와 독립적이어야하고 따라서 항상 영어로 표시 될 것으로 기대합니다 (예 : “System.FileNotFoundException”). 현재로서는 외국어 시스템에 액세스 할 수는 없습니다. 생각.

오류 메시지 텍스트를 정말로 원한다면 가능한 모든 예외 클래스 이름과 해당 메시지의 사전을 원하는 언어로 만들 수 있지만 영어의 경우 클래스 이름이 완벽하다고 생각합니다.


답변

CultureInfo oldCI = Thread.CurrentThread.CurrentCulture;

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture ("en-US");
Thread.CurrentThread.CurrentUICulture=new CultureInfo("en-US");
try
{
  System.IO.StreamReader sr=new System.IO.StreamReader(@"c:\does-not-exist");
}
catch(Exception ex)
{
  Console.WriteLine(ex.ToString())
}
Thread.CurrentThread.CurrentCulture = oldCI;
Thread.CurrentThread.CurrentUICulture = oldCI;

해결 방법이 없습니다.

Tks 🙂