Estamos registrando quaisquer exceções que ocorram em nosso sistema, escrevendo o Exception.Message em um arquivo. No entanto, eles são escritos na cultura do cliente. E erros turcos não significam muito para mim.
Então, como podemos registrar qualquer mensagem de erro em inglês sem alterar a cultura do usuário?
c#
.net
exception
localization
Carra
fonte
fonte
Respostas:
Esse problema pode ser parcialmente contornado. O código de exceção do Framework carrega as mensagens de erro de seus recursos, com base no código do idioma do encadeamento atual. No caso de algumas exceções, isso acontece no momento em que a propriedade Message é acessada.
Para essas exceções, você pode obter a versão completa da mensagem em inglês dos EUA, alternando brevemente o código do idioma do encadeamento para en-US enquanto o registra (salvando o código do idioma original do usuário antes e restaurando-o imediatamente depois).
Fazer isso em um thread separado é ainda melhor: isso garante que não haverá efeitos colaterais. Por exemplo:
Onde a classe ExceptionLogger se parece com:
No entanto, como Joe aponta corretamente em um comentário em uma revisão anterior desta resposta, algumas mensagens já são (parcialmente) carregadas dos recursos de idioma no momento em que a exceção é lançada.
Isso se aplica à parte 'parâmetro não pode ser nulo' da mensagem gerada quando uma exceção ArgumentNullException ("foo") é lançada, por exemplo. Nesses casos, a mensagem ainda aparecerá (parcialmente) localizada, mesmo ao usar o código acima.
Além de usar hacks impraticáveis, como executar todo o código que não é da interface do usuário em um thread com localidade en-US, não parece haver muito o que você possa fazer sobre isso: o código de exceção do .NET Framework não tem recursos para substituir o código de idioma da mensagem de erro.
fonte
t.CurrentUICulture = new System.Globalization.CultureInfo("fr-FR");
et.CurrentCulture = new System.Globalization.CultureInfo("fr-FR");
ainda, a exceção resultante era em Inglês ...Environment.GetResourceString("...")
para que sua solução não funcione mais. O melhor é lançar uma exceção personalizada com seu próprio texto de mensagem (em inglês) e usar a propriedade InnerException para manter a antiga.Você pode procurar a mensagem de exceção original em unlocalize.com
fonte
No records found
.Um ponto controverso, talvez, mas em vez de definir a cultura
en-US
, você pode configurá-loInvariant
. NaInvariant
cultura, as mensagens de erro estão em inglês.Ele tem a vantagem de não parecer tendencioso, especialmente para locais que não falam inglês. (também evita comentários maliciosos dos colegas)
fonte
catch
.Aqui está uma solução que não requer codificação e funciona mesmo para textos de exceções carregados muito cedo para que possamos alterar por código (por exemplo, os do mscorlib).
Pode não ser sempre aplicável em todos os casos (depende da sua configuração, pois você precisa criar um arquivo .config além do arquivo .exe principal), mas isso funciona para mim. Portanto, basta criar um
app.config
in dev, (ou um[myapp].exe.config
ouweb.config
em produção) que contenha as seguintes linhas, por exemplo:O que isso faz é dizer à estrutura para redirecionar as ligações de assembly para
mscorlib
os recursos eSystem.Xml
recursos de, para versões entre 1 e 999, em francês (a cultura é definida como "fr
") para um assembly que ... não existe (um arbitrário versão 999).Portanto, quando o CLR procurará recursos em francês para esses dois assemblies (mscorlib e System.xml), ele não os encontrará e retornará ao inglês normalmente. Dependendo do contexto e dos testes, convém adicionar outros assemblies a esses redirecionamentos (assemblies que contêm recursos localizados).
Claro que não acho que isso seja suportado pela Microsoft, portanto, use por seu próprio risco. Bem, caso você detecte um problema, basta remover essa configuração e verificar se não está relacionada.
fonte
O Windows precisa ter o idioma da interface do usuário que você deseja usar instalado. Não tem, não tem como saber magicamente qual é a mensagem traduzida.
Em um Windows 7 final nos EUA, com o pt-PT instalado, o seguinte código:
Produz mensagens em pt-PT, en-US e en-US. Como não há arquivos de cultura francesa instalados, o padrão é o idioma padrão do Windows (instalado?).
fonte
Sei que esse é um tópico antigo, mas acho que minha solução pode ser bastante relevante para qualquer um que o encontre em uma pesquisa na web:
No registrador de exceções, você pode registrar ex.GetType.ToString, o que salvaria o nome da classe de exceção. Eu esperaria que o nome de uma classe devesse ser independente do idioma e, portanto, sempre seria representado em inglês (por exemplo, "System.FileNotFoundException"), embora, atualmente, não tenha acesso a um sistema de idioma estrangeiro para testar o idéia.
Se você realmente deseja o texto da mensagem de erro, pode criar um dicionário com todos os nomes possíveis de classes de exceção e suas mensagens equivalentes no idioma que preferir, mas, para o inglês, acho que o nome da classe é perfeitamente adequado.
fonte
InvalidOperationException
, jogado porSystem.Xml.XmlWellFormedWriter
. Você tenta adivinhar qual erro específico ocorreu sem ler a mensagem. Pode haver mil coisas diferentes.Sem soluções alternativas.
Tks :)
fonte
A configuração
Thread.CurrentThread.CurrentUICulture
será usada para localizar as exceções. Se você precisar de dois tipos de exceções (uma para o usuário e outra para você), poderá usar a função a seguir para converter a mensagem de exceção. Ele está pesquisando nos recursos do .NET-Libraries o texto original para obter a chave do recurso e retornar o valor traduzido. Mas há um ponto fraco que ainda não encontrei uma boa solução: As mensagens que contêm {0} em recursos não serão encontradas. Se alguém tiver uma boa solução, ficaria grato.fonte
A estrutura .NET vem em duas partes:
Todos os textos (por exemplo, mensagens de exceção, rótulos de botão em uma MessageBox etc.) estão em inglês no próprio .NET framework. Os pacotes de idiomas têm os textos localizados.
Dependendo da sua situação exata, uma solução seria desinstalar os pacotes de idiomas (ou seja, instruir o cliente a fazer isso). Nesse caso, os textos de exceção serão em inglês. Observe, no entanto, que todos os outros textos fornecidos pela estrutura também serão em inglês (por exemplo, os rótulos de botão em uma MessageBox, atalhos de teclado para ApplicationCommands).
fonte
Eu imaginaria uma dessas abordagens:
As exceções são lidas apenas por você, ou seja, não são um recurso do cliente; portanto, você pode usar cadeias não localizadas conectadas que não serão alteradas quando você executar no modo turco.
Inclua um código de erro, por exemplo,
0x00000001
com cada erro, para que você possa procurá-lo facilmente em uma tabela em inglês.fonte
Com base na resposta Undercover1989, mas leva em consideração parâmetros e quando as mensagens são compostas por várias seqüências de recursos (como exceções de argumento).
fonte
Eu tive a mesma situação e todas as respostas que encontrei aqui e em outros lugares não ajudaram ou não foram satisfatórias:
A
Thread.CurrentUICulture
altera o idioma das exceções .net, mas ele faz não paraWin32Exception
, que utiliza recursos do Windows na linguagem da própria interface do usuário do Windows. Portanto, nunca consegui imprimir as mensagensWin32Exception
em inglês em vez de alemão, nem mesmo usandoFormatMessage()
o descrito emComo obter o Win32Exception em inglês?
Portanto, criei minha própria solução, que armazena a maioria das mensagens de exceção existentes para diferentes idiomas em arquivos externos. Você não receberá a mensagem exata no idioma desejado, mas receberá uma mensagem nesse idioma, que é muito mais do que recebe atualmente (que é uma mensagem em um idioma que você provavelmente não entende).
As funções estáticas dessa classe podem ser executadas em instalações do Windows com diferentes idiomas:
CreateMessages()
cria os textos específicos da cultura e osSaveMessagesToXML()
salva em tantos arquivos XML quantos idiomas são criados ou carregadosLoadMessagesFromXML()
carrega todos os arquivos XML com mensagens específicas do idiomaAo criar os arquivos XML em diferentes instalações do Windows com diferentes idiomas, em breve você terá todos os idiomas necessários.
Talvez você possa criar textos para diferentes idiomas no Windows 1 quando tiver vários pacotes de idiomas MUI instalados, mas ainda não testei isso.
Testado com o VS2008, pronto para uso. Comentários e sugestões são bem-vindos!
fonte
Thread.CurrentUICulture
também altera o idioma da interface do usuário, tornando-se uma terrível opção. Um exemplo clássico são os botões Sim / Não / OK / Cancelar na caixa de mensagem.Mensagens de exceção em inglês
vá para a pasta Localização e coloque-a em projectName.xml e adicione
fonte
Você deve registrar a pilha de chamadas em vez de apenas a mensagem de erro (IIRC, exceção simples. ToString () deve fazer isso por você). A partir daí, você pode determinar exatamente de onde a exceção se originou e geralmente deduzir qual exceção é.
fonte
Substituir mensagem de exceção no bloco catch usando o método de extensão. A mensagem de verificação emitida é do código ou não, conforme mencionado abaixo.
fonte
InvalidOperationException
. Divirta-se descobrindo o que isso significa sem a própria mensagem. Uma nova instância não a terá magicamente.Para fins de log, certos aplicativos podem precisar buscar a mensagem de exceção em inglês (além de exibi-la na UICulture do cliente habitual).
Para esse efeito, o seguinte código
e, finalmente, altera a UICulture atual novamente para a UICulture anterior.
fonte