С# - Получение сообщений об исключении на английском языке, когда приложение находится на другом языке?

Я пытаюсь локализовать свою программу, но мне бы хотелось, чтобы сообщения об ошибках, отправляемые разработчикам, появлялись на английском языке. Я не смог найти способ сделать это, потому что кажется, что если культура пользовательского интерфейса установлена ​​на другой язык, когда возникает ошибка, она выбрасывается на этом языке. Поскольку я сам не писал эту программу, и она довольно большая, я думаю, было бы нецелесообразно создавать новые блоки catch catch, чтобы попытаться установить культуру на английский язык всякий раз, когда возникает или может произойти ошибка. В настоящее время CurrentCulture и DefaultThreadCurrentCulture всегда устанавливаются на английском языке по всему приложению, а CurrentUICulture - на конечный пользовательский язык.

Как я обходной путь, у меня в настоящее время есть функция, которая выполняет итерацию через список ошибок (используя System.Resources.ResourceSets(которые я предполагаю, являются ошибками Windows, но мне также нужен способ найти ошибки .NET, поэтому я может выполнять итерацию через эти строки). Эта строка заменяет совпадающие ошибки на других языках и заменяет их их эквивалентами на английском языке для создания большого сообщения об ошибках, которое должно быть отправлено разработчикам всякий раз, когда приложение терпит крах. Действительно, мне не так много перевести как большая часть сообщения представляет собой трассировку стека сервера и показывает, где было выбрано исключение. Самая большая проблема заключается в переводе сообщения "Внутреннее исключение", а иногда и в сообщении о главном исключении, поскольку иногда возникающие ошибки не отображаются в ResourceSet и иногда используют элементы форматирования, такие как '{0}'.

Вот код, который я до сих пор использовал для перевода оставшихся ошибок. Я все еще работаю над добавлением шаблонов регулярных выражений для перевода ошибок, которые используют такие вещи, как "{0}", поэтому, если у кого-то есть предложения по этому или более эффективному способу сделать это, я буду благодарен за предложения.

    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
    }

Я также попытался использовать метод, опубликованный здесь (Исключительные сообщения на английском языке?), но без большой удачи. Я по-прежнему получал те же локализованные сообщения об ошибках. Вот код, в котором я знаю, что возникает ошибка, но не похоже, что блок catch делает что-либо, чтобы изменить язык. Мой класс ExceptionLogger настроен таким же образом, как в примере Stackoverflow, с добавлением строки для записи ошибки в файл. Ошибка вызывается в wcf.Client.Ping() (мне не нужна фактическая ошибка. Я использую ее для тестирования).

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

Если ничего другого, есть ли способ получить список всех возможных ошибок .NET Framework на английском языке, а также на других языках? Есть ли класс, к которому я могу получить доступ, чтобы получить их из моей программы или из списка в другом месте? Я пробовал смотреть на сайты, такие как unlocalize.com и finderr.net, но я действительно не хочу писать что-то, чтобы просканировать все страницы, чтобы найти все возможные ошибки.

Извините, если я полностью что-то упустил. Я новичок в С# и программировании в целом, и эта проблема сводит меня с ума!

Изменить: я забыл добавить, что я бы предпочел избежать таких решений, в которых вы должны постоянно менять CurrentUICulture:

Язык принудительных исключений на английском языке

Запретить перевод сообщений исключения на язык пользователя?

Или решения, в которых вы удаляете языковые пакеты или что-то на компьютере пользователя или просто устанавливаете ошибки на английском языке при отладке (эти журналы ошибок также будут отправляться с компьютера конечных пользователей в случае сбоя приложения и если они используют другой язык, нам нужны ошибки, зарегистрированные на английском языке).

Кроме того, я знаю, что могу просто отправить сообщения об ошибках или использовать unlocalize.com или finderr.net для перевода сообщений, но я думаю, что другие разработчики могут убить меня, если они должны это сделать, ха. Думаю, если худшее пришло в худшее, я мог бы запросить сайт с нецеленами? Кажется, это настоящая боль.

Ответ 1

Структура исключений загружает сообщения об ошибках на основе культуры текущего потока. Поэтому вы можете перехватить исключение, а в блоке catch вы можете создать свой собственный объект logger и настроить его культуру в соответствии с вашими потребностями.

    try
{
//.....Code Goes Here
}
Catch (Exception ex)
{
   var eh = new ExceptionHandler("Your-Culture");
   //....code goes here
}

Public class ExceptionHandler
{
//code goes on
    public ExceptionHandler(string culture)
{
//set your culture here
}
}

Ответ 2

Здесь вы можете найти решение проблемы. Короче говоря:

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
  }
}

Ответ 3

Попробуйте следующее:

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