Мы регистрируем любые исключения, которые происходят в нашей системе, записывая сообщение Exception.Message в файл. Однако они написаны в культуре клиента. И турецкие ошибки не имеют большого значения для меня.
Итак, как мы можем регистрировать любые сообщения об ошибках на английском без изменения культуры пользователей?
c#
.net
exception
localization
Карра
источник
источник
Ответы:
Эту проблему можно частично обойти. Код исключения Framework загружает сообщения об ошибках из своих ресурсов в зависимости от текущей локали потока. В случае некоторых исключений это происходит во время доступа к свойству Message.
За этими исключениями вы можете получить полную версию сообщения на английском и американском языках, кратко переключив языковой стандарт потока на en-US во время его регистрации (предварительно сохраняя исходный языковой стандарт пользователя и восстанавливая его сразу после этого).
Делать это в отдельном потоке еще лучше: это гарантирует отсутствие побочных эффектов. Например:
Где класс ExceptionLogger выглядит примерно так:
Однако, как правильно указывает Джо в комментарии к предыдущей редакции этого ответа, некоторые сообщения уже (частично) загружаются из языковых ресурсов на момент выдачи исключения.
Это относится к части «параметр не может быть пустым» сообщения, сгенерированного, например, при возникновении исключения ArgumentNullException («foo»). В этих случаях сообщение все равно будет отображаться (частично) локализованным даже при использовании приведенного выше кода.
Помимо использования непрактичных хаков, таких как запуск всего кода, не относящегося к пользовательскому интерфейсу, в потоке с локализацией en-US, для начала, кажется, мало что можно сделать с этим: в коде исключений .NET Framework нет средства для переопределения локали сообщения об ошибке.
источник
t.CurrentUICulture = new System.Globalization.CultureInfo("fr-FR");
иt.CurrentCulture = new System.Globalization.CultureInfo("fr-FR");
все же, полученное исключение было на английском ...Environment.GetResourceString("...")
поэтому ваше решение больше не работает. Лучше всего создать пользовательское исключение с собственным (английским) текстом сообщения и использовать свойство InnerException, чтобы сохранить старое.Вы можете найти оригинальное сообщение об исключении на unlocalize.com.
источник
No records found
.Возможно, спорный момент, но вместо того, чтобы установить культуру
en-US
, вы можете установить его наInvariant
. ВInvariant
культуре сообщения об ошибках на английском языке.Он имеет преимущество в том, что не выглядит предвзятым, особенно для неамериканских англоязычных языков. (он же избегает грубых замечаний коллег)
источник
catch
.Вот решение, которое не требует какого-либо кодирования и работает даже для текстов исключений, которые загружаются слишком рано, чтобы мы могли изменить их по коду (например, в mscorlib).
Это может быть не всегда применимо в каждом случае (это зависит от ваших настроек, так как вам нужно иметь возможность создавать файл .config помимо основного файла .exe), но это работает для меня. Итак, просто создайте
app.config
в dev (или a[myapp].exe.config
илиweb.config
in production), который содержит следующие строки, например:Это говорит платформе о перенаправлении привязок сборки для
mscorlib
ресурсов иSystem.Xml
ресурсов, для версий от 1 до 999, на французском языке (культура установлена в "fr
") к сборке, которая ... не существует (произвольно версия 999).Поэтому, когда CLR будет искать французские ресурсы для этих двух сборок (mscorlib и System.xml), он не найдет их и изящно переключится на английский. В зависимости от контекста и тестирования вы можете добавить другие сборки в эти перенаправления (сборки, содержащие локализованные ресурсы).
Конечно, я не думаю, что это поддерживается Microsoft, поэтому используйте на свой страх и риск. Ну, в случае, если вы обнаружите проблему, вы можете просто удалить эту конфигурацию и проверить, что она не связана.
источник
В Windows должен быть установлен язык интерфейса, который вы хотите использовать. Если это не так, у него нет возможности волшебным образом узнать, что такое переведенное сообщение.
В en-US windows 7 ultimate с установленным pt-PT следующий код:
Производит сообщения в pt-PT, en-US и en-US. Поскольку файлы французской культуры не установлены, по умолчанию используется язык Windows по умолчанию (установлен?).
источник
Я знаю, что это старая тема, но я думаю, что мое решение может быть весьма уместным для любого, кто сталкивается с этим в веб-поиске:
В регистраторе исключений вы можете войти в ex.GetType.ToString, что позволит сохранить имя класса исключения. Я ожидаю, что имя класса должно быть независимым от языка и поэтому всегда будет представлено на английском языке (например, «System.FileNotFoundException»), хотя в настоящее время у меня нет доступа к системе иностранных языков для проверки идея.
Если вы действительно хотите получить текст сообщения об ошибке, вы можете создать словарь всех возможных имен классов исключений и их эквивалентных сообщений на любом языке, который вы предпочитаете, но для английского я думаю, что имя класса вполне подходит.
источник
InvalidOperationException
, брошенный мимоSystem.Xml.XmlWellFormedWriter
. Вы пытаетесь угадать, какая именно ошибка произошла, не читая сообщение. Может быть тысяча разных вещей.Без РАБОТ.
Ткс :)
источник
Настройка
Thread.CurrentThread.CurrentUICulture
будет использоваться для локализации исключений. Если вам нужны два вида исключений (одно для пользователя, другое для вас), вы можете использовать следующую функцию для перевода сообщения об исключении. Он ищет в ресурсах .NET-библиотеки исходный текст, чтобы получить ключ ресурса, а затем вернуть переведенное значение. Но есть один недостаток, который я пока не нашел хорошего решения: сообщения, содержащие {0} в ресурсах, не будут найдены. Если у кого-то есть хорошее решение, я был бы благодарен.источник
.NET Framework состоит из двух частей:
Все тексты (например, сообщения об исключениях, ярлыки кнопок в MessageBox и т. Д.) Написаны на английском языке в самой платформе .NET. Языковые пакеты имеют локализованные тексты.
В зависимости от вашей конкретной ситуации решение может состоять в том, чтобы удалить языковые пакеты (то есть сказать клиенту сделать это). В этом случае тексты исключений будут на английском языке. Однако обратите внимание, что весь другой текст, предоставляемый платформой, будет также английским (например, надписи кнопок на MessageBox, сочетания клавиш для ApplicationCommands).
источник
Я хотел бы представить один из этих подходов:
Исключения только когда-либо читаются вами, то есть они не являются клиентской функцией, поэтому вы можете использовать жестко привязанные нелокальные строки, которые не изменятся при работе в турецком режиме.
Включите код ошибки, например, в
0x00000001
каждую ошибку, чтобы ее можно было легко найти в английской таблице.источник
Основано на ответе Undercover1989, но учитывает параметры и случаи, когда сообщения состоят из нескольких строк ресурсов (например, исключений аргументов).
источник
У меня была такая же ситуация, и все ответы, которые я нашел здесь и в других местах, не помогали или не удовлетворяли:
Thread.CurrentUICulture
Изменяет язык исключений .net, но это не дляWin32Exception
, которая использует ресурсы Windows , на языке самого интерфейса Windows. Поэтому мне так и не удалось напечатать сообщенияWin32Exception
на английском, а не на немецком языке, даже не используя,FormatMessage()
как описано вразделе Как получить Win32Exception на английском?
Поэтому я создал свое собственное решение, которое хранит большинство существующих сообщений об исключениях для разных языков во внешних файлах. Вы не получите очень точное сообщение на желаемом языке, но вы получите сообщение на этом языке, которое намного больше, чем вы получаете в настоящее время (это сообщение на языке, который вы, вероятно, не понимаете).
Статические функции этого класса могут выполняться в установках Windows с разными языками:
CreateMessages()
создает тексты, зависящие от культуры,SaveMessagesToXML()
сохраняет их в столько файлов XML, сколько языков создано или загружено,LoadMessagesFromXML()
загружает все файлы XML с сообщениями, зависящими от языка.При создании файлов XML на разных установках Windows с разными языками у вас скоро появятся все нужные вам языки.
Возможно, вы можете создавать тексты для разных языков в 1 Windows, когда у вас установлено несколько языковых пакетов MUI, но я еще не проверял это.
Протестировано с VS2008, готов к использованию. Комментарии и предложения приветствуются!
источник
Thread.CurrentUICulture
также меняет язык интерфейса, что делает его ужасным вариантом. Классическим примером являются кнопки Да / Нет / ОК / Отмена в окне сообщения.Исключительные сообщения на английском языке
затем перейдите в папку Localization и поместите ее в projectName.xml и добавьте
источник
Вы должны регистрировать стек вызовов вместо просто сообщения об ошибке (IIRC, простое исключение. ToString () должна сделать это за вас). Отсюда вы можете точно определить, откуда возникло исключение, и, как правило, определить, какое это исключение.
источник
Переопределить сообщение об исключении в блоке перехвата, используя метод расширения. Убедитесь, что выброшенное сообщение получено из кода или нет, как указано ниже.
источник
InvalidOperationException
. Получайте удовольствие, выясняя, что это значит без самого сообщения. У нового экземпляра не будет волшебства.В целях ведения журнала некоторым приложениям может потребоваться получить сообщение об исключении на английском языке (помимо его отображения в обычном клиентском UICulture).
Для этой цели следующий код
и затем, наконец, меняет текущую UICulture обратно на более раннюю UICulture.
источник