Onde a variável $ LANG é definida no Mac OS X?

24

Eu usei wgetpela primeira vez depois de instalar o Lion OS X e notei que o wget foi localizado no meu idioma nativo. A execução do setcomando no terminal mostrou que minha LANGvariável representa meu idioma local. Onde posso alterar ou wgetignorar essa configuração?

atualizar

Aqui está o que localeme dá:

LANG="lt_LT.UTF-8"
LC_COLLATE="lt_LT.UTF-8"
LC_CTYPE="lt_LT.UTF-8"
LC_MESSAGES="lt_LT.UTF-8"
LC_MONETARY="lt_LT.UTF-8"
LC_NUMERIC="lt_LT.UTF-8"
LC_TIME="lt_LT.UTF-8"
LC_ALL=

Portanto, toda a saída de não parâmetros (como prompts e mensagens de depuração) está em lituano. Esse é o meu problema. Eu gostaria de voltar para o inglês.

Estou usando zshcomo meu shell de login.

Eimantas
fonte
Qual é exatamente o problema wget? E o que é localeexibido e é o mesmo que você espera da sua seleção de idioma no painel de preferências do sistema Idioma e texto ?
bmike

Respostas:

26

Por padrão, o Terminal define as variáveis ​​de ambiente do código do idioma para corresponder aos formatos de idioma / hora / data / número atualmente selecionados que o Terminal está usando, que é selecionado via

Preferências do Sistema> Idioma e Texto

(Esse é o nome no Lion. Nos sistemas anteriores, o nome exato do painel de preferências pode variar.)

Uma solução temporária é arrastar o inglês para o topo da lista de idiomas, abrir o Terminal e mover o lituano de volta ao topo. Então, apenas o Terminal estará em inglês. No entanto, ele será redefinido para lituano se você sair e reiniciar o Terminal.

Uma abordagem persistente é dizer ao Terminal para não definir as variáveis ​​de ambiente da localidade, desativando

Terminal> Preferências> Configurações> [perfil]> Avançado> Definir variáveis ​​de ambiente de localidade na inicialização

Em seguida, o código do idioma será "C" sem o idioma especificado e a maioria dos programas será o inglês.

Observe que desativar isso significa que alguns programas não saberão qual Terminal de codificação de caracteres está usando e assumirão que é apenas ASCII ou ISO-Latin-1. Portanto, se o Terminal estiver usando UTF-8 (o padrão), esses programas podem ou não se comportar conforme desejado.

Se isso é principalmente wget, recomendo que você faça uma cópia do perfil de configurações padrão, desative a configuração de localidade no seu perfil personalizado e use somente esse perfil ao usá- wgetlo, para que você possa continuar usando o UTF-8 com suporte total ao usar outros programas, usando as configurações padrão.

Como já mencionado, você também pode substituir as configurações iniciais de localidade fornecidas pelo Terminal em um script de inicialização do shell. Para zsh, coloque-o em ~ / .zshrc. Para o bash, use ~ / .bashrc (e se você ainda não tiver um, crie um ~ / .bash_profile que execute ~ / .bashrc).

Consulte x-man-page: // 1 / locale para obter mais informações sobre cada um dos valores do ambiente de localidade.

No entanto, se você o definisse apenas unset LANGcomo "C", isso normalmente se aplicaria a todos os seus shells e programas, enquanto na maioria das vezes você provavelmente deseja usar o UTF-8 e o Terminal definiu as variáveis ​​de localidade para corresponder, para obter o mais alto grau de cooperação, fidelidade e funcionalidade.

Portanto, se você seguir esse caminho, sugiro que escreva um código para editar, em vez de substituir, os valores iniciais, para preservar as informações de codificação ("UTF-8") e simplesmente forçar o idioma para inglês, em vez de definir as variáveis ​​para "C".

Por exemplo, isso funciona no zsh e no bash:

# Replace Lithuanian with English
export LANG=${LANG/lt_LT/en_US}

Quando LANG="lt_LT.UTF-8", isso mudará para LANG="en_US.UTF-8". Não tenho wgetdisponível para testar isso, mas isso deve ser suficiente.

Fazer isso dessa maneira significa que, se você alterar a preferência de codificação de caracteres no Terminal, não a substituirá no script de inicialização do shell.

Chris Page
fonte
Bem feito; para generalizar o LANGcomando redefinition: echo ${LANG/*./en_US.}substitui o nome da cultura atual por en_US qualquer que seja; trabalha em bash, ksh, zsh.
usar o seguinte comando
7

Está definido aqui ...

insira a descrição da imagem aqui

Se você quiser mais ou menos opções no menu suspenso, vá para a guia Codificações para visualizar ainda mais a recompensa.

bmike
fonte
3
no os x é ~ / .bash_profile, não bashrc. As pessoas ficaram muito confusas com isso ao ler tutoriais online.
Enrico Susatyo
Puta que pariu - obrigado por entender isso. Eu até fui para a página de código aberto e verifiquei se a apple fez alterações no gnu bash e ainda entendeu errado. (editar a minha resposta - graças @the_great_monkey)
bmike
4
O terminal cria shells de logon, que executam ~ / .bash_profile. No entanto, a maioria das personalizações de usuário deve ser colocada em ~ / .bashrc, para que também se apliquem a shells sem login (por exemplo, subconchas), e ~ / .bash_profile deve executar ~ / .bashrc, para que se aplique a shells de login. ~ / .bash_profile geralmente está vazio e contém apenas código especificamente para shells de login de nível superior que o usuário não deseja executar para sub shells.
Chris Page
1
"uma leitura rápida da página de manual mostra que o shell define esse valor a cada logon" A página de manual do bash diz isso, mas o Terminal define o valor inicial, e eu nunca vi o bash defini-los se eles ainda não estavam definidos. Se eu desativar a preferência "definir ambiente de localidade ...", nenhuma das variáveis ​​será definida e o locale será exibido LANG=e os outros valores serão todos padrão "C".
Chris Page
2

Resolvi esse problema definindo o idioma no meu arquivo .profile, carregado sempre que inicio um terminal.

export LANG="en_US.UTF-8"
export LC_ALL="POSIX"
user42973
fonte
LC_ALLsubstitui LANG, portanto, seu primeiro comando não terá efeito.
usar o seguinte código
Além disso, POSIXé equivalente Ce que não lida com o Unicode.
Sebastian Graf
1

Baseado mais na experiência do Linux, se você não deseja alterar completamente sua localização com LC_LANG, mas gostaria de ter apenas mensagens do sistema em inglês, basta definir

LC_COLLATE=C    (to have standard sorting in ls, etc)
LC_CTYPE=en_US.UTF-8
dmpogo
fonte
É a LC_MESSAGESvariável que controla em qual idioma as mensagens devem ser exibidas (se instaladas).
precisa saber é o seguinte
0

Usando um servidor debian em francês e um cliente macsox bash, "apenas" tive que adicionar isso ao meu .bash_profile no diretório de usuários do macosx:

exportar LANG = fr_FR.UTF-8

Resolvido.

XiangXing
fonte
0

As outras respostas estão corretas, ou seja, sobre a Terminalconfiguração das variáveis ​​de ambiente locale definidas na inicialização e no uso dos shell /etc/profile. No entanto, existe outra maneira que vale a pena entender - especialmente se o "problema" ocorrer devido a um sshlogin remoto .

O OpenSSH (conforme usado no Linux, BSD e macOS) pode enviar variáveis ​​de ambiente do ambiente do cliente para o shell que o servidor inicia. Isso é feito apenas se o cliente estiver configurado para enviá-los e o servidor estiver configurado para aceitá-los. O cliente ( ~/.ssh/config) precisaria ter:

SendEnv LANG LC_*

e o servidor ( /etc/ssh/sshd_config) precisaria de:

AcceptEnv LANG LC_*

Se os dois estiverem no local, o local do cliente será propagado para o shell de login no servidor ssh:

$ ssh me@my-mac locale
LANG="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_CTYPE="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_ALL=

A configuração necessária do servidor não existe por padrão no Snow Leopard ; está lá na serra . Lembre-se de reiniciar o servidor SSH após modificar /etc/sshd_config!!!

starfry
fonte