Alterar idioma temporariamente para mensagens / avisos / erros do terminal

17

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

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

Como posso fazer a troca e voltar usando o bash?

    
por takeshin 27.05.2012 / 09:37

2 respostas

17

Existem várias variáveis de ambiente disponíveis para alterar as configurações de idioma. Você pode visualizar suas configurações de localidade atuais executando o comando locale . Para alterar todas as configurações de localidade para inglês, use LANG=C . Esse C locale está sempre disponível sem instalar pacotes de idiomas adicionais. (Para mudar temporariamente para localidades diferentes do inglês, consulte a postagem @ mklement0 .

Exemplos:

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

$ /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 ele é 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 local para todos os comandos executados no shell atual e inclua as 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=
    
por Lekensteyn 27.05.2012 / 09:44
6

A resposta útil de Lekensteyn funciona muito bem se você quiser mudar para inglês americano on demand, como o OP solicitou, mas se você quiser mudar para uma diferente linguagem on demand , mais trabalho é necessário.

Antes de começar, você deve instalar as tabelas de mensagens com sudo apt-get install language-pack-<lang-tag> , em que <lang-tag> é uma simples linguagem RTF 5646 subtag , como es para espanhol.

Informações de plano de fundo

Os utilitários GNU gettext dão prioridade à variável de ambiente LANGUAGE não padrão [1]  sobre variáveis de ambiente de localidade definidas pelo POSIX LC_ALL , LC_MESSAGES e LANG (nessa ordem).

Dado que LANGUAGE é definido por padrão nos sistemas Ubuntu [2] , ou seja, em substring do valor LANG que reflete uma tag de idioma simples (por exemplo, es para espanhol) ou uma tag de região de idioma (por exemplo, de_DE para a variante alemã do alemão), você deve cancelar ou substituir LANGUAGE para que as mensagens de um idioma diferente entrem em vigor. > [3]

Opção 1: defina LANGUAGE

Exemplo : alternar para espanhol ( es ) mensagens ad-hoc:

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

Observação : uma tag de idioma simples como es é suficiente, mas você pode adicionar um identificador de região (por exemplo, es_AR para a Argentina) e até mesmo um sufixo charset (por exemplo, es_AR.UTF-8 ).
No entanto, mensagens localizadas podem existir somente no nível idioma , e o fallback é usar mensagens que correspondam à parte idioma ( es , neste caso).

Opção 2: desabilitar LANGUAGE e definir LC_ALL

Esta solução alternativa undefines LANGUAGE primeiro e, em seguida, usa a variável de ambiente do código de idioma POSIX LC_ALL para 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 de localização para a localidade especificada (como LC_TIME para formatos de data / hora) e definindo (implicitamente) LC_MESSAGES também informa não -GNU programas do idioma desejado.

Observe como LC_ALL requer que o nome de localidade exato, completo , incluindo o sufixo charset, seja efetivo ( es_ES.UTF-8 ) (diferente de LANGUAGE , para o qual uma tag de idioma simples é suficiente como es )). O mesmo se aplica à configuração de LC_MESSSAGES e LANG . A especificação de um nome de localidade inválido / não instalado causa um fallback para o código do idioma POSIX e, portanto, para o inglês dos EUA.

Notas de rodapé

[1] Os motivos pelos quais a resposta de Lekensteyn funciona mesmo sem cancelar / substituir LANGUAGE é uma exceção : se o valor (efetivo) LC_MESSAGES (geralmente definido indiretamente via LANG ou LC_ALL ) é C ou (seu sinônimo) POSIX , esse valor é respeitado, independentemente do valor de LANGUAGE , se houver. Por outro lado, se o valor (efetivo) LC_MESSAGES for qualquer outro, o específico localidade, LANGUAGE terá precedência.

[2] Isso se aplica ao Ubuntu adequado , mas não necessariamente a outros sabores ; Lekensteyn afirma que o Kubuntu não define LANGUAGE .
Indiscutivelmente, LANGUAGE deve não ser definido por padrão, dado que, na sua ausência, o valor LC_MESSAGES implícito pelo valor LANG (que determina a localidade atual) é respeitado.

[3] Você também pode usar essa abordagem para alternar para [US] inglês atribuindo LANGUAGE=C ou LANGUAGE=POSIX (como uma alternativa a, LANG=C / LANG=POSIX ), embora não esteja claro se isso é ativamente reconhecido ou simplesmente um mecanismo fallback , dado que esses valores não começam com uma tag language ; talvez a melhor escolha seja en_US .

[4] Há um caso de borda onde essa abordagem não funciona: Tentar chamar um executável com um caminho - relativo ou absoluto - NÃO muda para o idioma especificado , enquanto um mero nome de arquivo faz:
LANGUAGE= LC_ALL=es_ES.UTF-8 /path/to/no_such_utility não não funciona (produz uma mensagem na localidade atual), enquanto que LANGUAGE= LC_ALL=es_ES.UTF-8 no_such_utility faz (saídas uma mensagem de erro em espanhol).
Se alguém souber por que e se há uma boa razão para isso, avise-nos.

    
por mklement0 02.11.2016 / 03:10