Alterar temporariamente o idioma para mensagens / avisos / erros do terminal

22

As mensagens no meu terminal são exibidas usando o idioma russo por padrão, que é o meu idioma nativo.

Por um momento, eu quero que eles estejam em inglês (por exemplo, para colar em fóruns) e depois retornem ao idioma padrão.

Como posso alternar e voltar usando o bash?

leva
fonte

Respostas:

23

Existem várias variáveis ​​de ambiente disponíveis para alterar as configurações de idioma. Você pode visualizar as configurações atuais do código de idioma executando o localecomando Para alterar todas as configurações de localidade para inglês, use LANG=C. Esse Ccódigo do idioma está sempre disponível sem a instalação de pacotes de idiomas adicionais. (Para alterar temporariamente para localidades diferentes do inglês, consulte a postagem de @ mklement0 .)

Exemplos:

Executando um comando com as configurações de idioma padrão e imprima as configurações atuais de localidade:

$ /nonexistent
bash: /nonexistent: Bestand of map bestaat niet
$ locale
LANG=nl_NL.UTF-8
LANGUAGE=
LC_CTYPE="nl_NL.UTF-8"
LC_NUMERIC="nl_NL.UTF-8"
LC_TIME="nl_NL.UTF-8"
LC_COLLATE="nl_NL.UTF-8"
LC_MONETARY="nl_NL.UTF-8"
LC_MESSAGES="nl_NL.UTF-8"
LC_PAPER="nl_NL.UTF-8"
LC_NAME="nl_NL.UTF-8"
LC_ADDRESS="nl_NL.UTF-8"
LC_TELEPHONE="nl_NL.UTF-8"
LC_MEASUREMENT="nl_NL.UTF-8"
LC_IDENTIFICATION="nl_NL.UTF-8"
LC_ALL=

Substitua temporariamente o idioma de um programa e mostre que é realmente temporário:

$ LANG=C ls /nonexistent
ls: cannot access /nonexistent: No such file or directory
$ ls /nonexistent
ls: kan geen toegang krijgen tot /nonexistent: Bestand of map bestaat niet

Altere o código do idioma para todos os comandos executados no shell atual e inclua provas novamente:

$ LANG=C
$ ls /nonexistent
ls: cannot access /nonexistent: No such file or directory
$ locale
LANG=C
LANGUAGE=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=
Lekensteyn
fonte
6
Para outros usuários com problemas para fazer isso funcionar - definir LANGou LANG_ALLnão está funcionando para mim, ainda LANGUAGEé. Consulte Por que a substituição da variável de ambiente LANG não está alterando o idioma para mim?
gertvdijk
1
@ gertvdijk: Obrigado por isso; a razão pela qual essa resposta funciona mesmo sem definir LANGUAGEé uma exceção : o GNU gettext dá precedência ao LANGUAGEvalor, exceto se o LC_MESSAGESvalor ( efetivo) (normalmente definido indiretamente via LANGou LC_ALL) for um Cou (seu sinônimo) POSIX. Observe também que LANGUAGEestá desabilitado nesta resposta, enquanto está definido por padrão e, se estiver definido, você deve substituí- lo para alternar para o idioma de uma localidade específica (em oposição a "C" / "POSIX"), que é o que você achou.
precisa
Sua resposta funciona muito bem ao mudar para o código de idioma "C" (com mensagens em inglês dos EUA, conforme solicitado), mas não funcionará para outros códigos de idioma, a menos que LANGUAGEseja explicitamente desconfigurado ou substituído. Dado o título genérico da pergunta, é provável que as pessoas encontrem esta resposta procurando mudar para um idioma que não seja o inglês. Por isso, considere adicionar essas informações à sua resposta.
precisa
@ mklement0 Dado o contexto da pergunta (postando mensagens de erro em inglês), acho que a postagem atual é suficiente. Você pode adicionar outra resposta para explicar os detalhes em torno de LANGUAGEse você quiser :)
Lekensteyn
Eu adicionei minha própria resposta , como você sugeriu. Se você concorda com minha avaliação de que futuros leitores poderão vir aqui procurando mudar para qualquer idioma (como várias pessoas já indicaram ativamente), adicione um link à minha resposta à sua pergunta. Além disso, sugiro alterar o valor de LANGUAGEem sua saída de amostra para nl, que é o valor padrão real quando sua localidade é nl_NL.UTF-8.
usar o seguinte comando
9

A resposta útil de Lekensteyn funciona muito bem se você deseja mudar para o inglês dos EUA sob demanda, conforme solicitado pelo OP, mas se deseja mudar para um idioma diferente sob demanda , é necessário mais trabalho.

Antes de iniciar, você deve instalar tabelas de mensagens com sudo apt-get install language-pack-<lang-tag>, onde <lang-tag>está uma sub-etiqueta simples do idioma RTF 5646 , como espara o espanhol.

Informação de fundo

GNU gettext utilitários baseados dar precedência para a fora do padrão LANGUAGEvariável ambiente [1] sobre as variáveis ambiente localidade POSIX-definidos LC_ALL, LC_MESSAGESe LANG(nesta ordem).

Dado que LANGUAGEé definido por padrão nos sistemas Ubuntu [2] , ou seja, uma substring do LANGvalor que reflete uma tag de idioma simples (por exemplo, espara espanhol) ou uma tag de região de idioma (por exemplo, de_DEpara a variante alemã do alemão), você deve desmarcar ou substituir LANGUAGEpara que as mensagens de um idioma diferente entrem em vigor. [3]

Opção 1: Definir LANGUAGE

Exemplo : Alterne para as esmensagens em espanhol ( ) ad-hoc:

$ LANGUAGE=es ls NoSuchFile
ls: no se puede acceder a NoSuchFile: No existe el archivo o el directorio

Nota : Uma tag de idioma simples como esé suficiente, mas você pode adicionar um identificador de região (por exemplo, es_ARpara a Argentina) e até mesmo um sufixo de conjunto de caracteres (por exemplo, es_AR.UTF-8).
No entanto, as mensagens localizadas podem existir apenas no nível do idioma , e o fallback é usar mensagens que correspondam à parte do idioma ( esneste caso).

Opção 2: Desativar LANGUAGEe definirLC_ALL

Esta solução alternativa define primeiro a definição indefinida LANGUAGE e, em seguida, usa a variável de ambiente locale POSIX LC_ALLpara definir implicitamente LC_MESSAGES[4] :

$ LANGUAGE= LC_ALL=es_ES.UTF-8 ls NoSuchFile
ls: no se puede acceder a NoSuchFile: No existe el archivo o el directorio

Esta solução tem a vantagem de definir todos os aspectos da localização para o código do idioma especificado (como LC_TIMEpara formatos de data / hora) e por (implicitamente) a configuração LC_MESSAGEStambém informa os programas que não são do GNU no idioma desejado.

Observe como LC_ALLexige que o nome completo e exato do local, incluindo o sufixo charset, seja eficaz ( es_ES.UTF-8) (diferentemente LANGUAGEdo qual uma tag de idioma simples é suficiente (como es)). O mesmo se aplica à configuração LC_MESSSAGESe LANG. A especificação de um nome de localidade inválido / não instalado causa fallback para a localidade POSIX e, portanto, inglês dos EUA.


Notas de rodapé

[1] As razões pelas quais a resposta de Lekensteyn funciona mesmo sem desabilitar / substituir LANGUAGEsão uma exceção : se o LC_MESSAGESvalor (efetivo) (geralmente definido indiretamente via LANGou LC_ALL) for um Cou (seu sinônimo) POSIX, esse valor será respeitado, independentemente do valor de LANGUAGE, caso existam. Por outro lado, se o LC_MESSAGESvalor (efetivo) for qualquer outro local específico , LANGUAGEterá precedência.

[2] Isso se aplica ao Ubuntu propriamente , mas não necessariamente a outros sabores ; Lekensteyn afirma que Kubuntu se não definido LANGUAGE.
Pode-se argumentar LANGUAGEque não deve ser definido por padrão, uma vez que, na sua ausência, o LC_MESSAGESvalor implícito no LANGvalor (que determina a localidade atual) é respeitado.

[3] Você também pode usar essa abordagem para mudar para o inglês [EUA] atribuindo um LANGUAGE=Cou LANGUAGE=POSIX(como uma alternativa a LANG=C/ / LANG=POSIX), embora não esteja claro se isso é reconhecido ativamente ou simplesmente um mecanismo de fallback , uma vez que esses valores não comece com uma tag de idioma ; talvez a melhor escolha seria en_US.

[4] Há uma borda caso em que esta abordagem não funciona: Tentar invocar um executável com uma caminho - seja relativo ou absoluto - não muda para o idioma especificado, enquanto que uma mera filename faz:
LANGUAGE= LC_ALL=es_ES.UTF-8 /path/to/no_such_utilityfaz não trabalho (saídas de uma mensagem no local atual), enquanto o
LANGUAGE= LC_ALL=es_ES.UTF-8 no_such_utilityfaz (gera uma mensagem de erro em espanhol).
Se alguém souber o porquê e se há uma boa razão para isso, informe-nos.

mklement0
fonte
Dica do chapéu para @ wjandrea por sua ajuda na estruturação deste post.
precisa saber é o seguinte