Como alterar a variável de ambiente locale?

18

Eu criei os arquivos de localização en_US.utf8 , et_EE.iso88591 e ru_RU.utf8 . Agora, se eu tentar alterar qualquer uma das variáveis ​​de localidade para um ru_RU.utf8 ou en_US.utf8 , isso não terá nenhum efeito:

# locale -a
C
en_US.utf8
et_EE
et_EE.iso88591
POSIX
ru_RU.utf8
# LC_TIME=ru_RU.utf8
# locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
# LC_TIME="ru_RU.utf8"
# locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
# 

No entanto, se eu alterar a variável LANG = , todas as outras variáveis, exceto LANGUAGE = e LC_ALL =, receberão o valor da variável LANG = . Existe uma maneira de modificar cada variável de localidade separadamente? Além disso, estou correto de que as variáveis ​​de localidade não são variáveis ​​comuns do shell, mas mais como parâmetros para o utilitário de localidade ?

Martin
fonte

Respostas:

15

Você pode definir qualquer categoria de localidade independentemente. LANGaplica-se apenas às categorias que não estão explicitamente definidas.

LANGe LC_xxxsão variáveis ​​de ambiente comuns. Eles não são configurações para o localeutilitário: o localeprograma não está envolvido em nenhum processamento de código de idioma, é apenas um pequeno utilitário para relatar configurações de código de idioma atuais e disponíveis.

Quando você escreve LC_TIME=ru_RU.utf8, isso não define uma variável de ambiente, apenas uma variável de shell. As variáveis ​​do shell são internas ao shell, elas não são vistas por outros programas. As variáveis ​​de ambiente, por outro lado, são herdadas pelos programas que o shell inicia. Você também precisa exportar a variável para o ambiente:

$ LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
$ export LC_TIME
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"

ou diretamente

$ export LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"
Gilles 'SO- parar de ser mau'
fonte
"LANG e LC_xxx são variáveis ​​de ambiente comuns" Como você sabe disso LANGe LC_xxxsão variáveis ​​de ambiente? meus testes mostram que apenas LANGe LANGUAGEe LC_MESSAGESe LC_ALLsão variáveis ​​de ambiente, enquanto outras variáveis ​​gostam LC_CTYPEe LC_MONETARYnão são variáveis ​​de ambiente (também, elas não são variáveis ​​de shell)?
Roge_jul
@rony_t Você pode ver o código fonte dos aplicativos e bibliotecas, ver a documentação deles ou experimentar com eles. Por exemplo, compacte env LC_TIME=en_GB datecom env LC_TIME=fr_FR datee env PATH="$PATH" date(obviamente, escolha locais que existem no seu sistema). Obviamente, cada variável pode ou não ser definida no ambiente de um determinado processo. Que teste você fez? Tem certeza de que o aplicativo que você usou se comporta de maneira diferente com base em LC_CTYPE(bastante comum) e LC_MONETARY(bastante raro)?
Gilles 'SO- stop be evil'
No terminal, executei o printenvcomando para listar as variáveis ​​de ambiente do bash, e only LANGe LANGUAGEe LC_MESSAGESand LC_ALLforam listados como variáveis ​​de ambiente. Também executei o comando set -o posixseguido pelo comando setpara obter as variáveis ​​de ambiente e as variáveis ​​de shell do bash, e only LANGe LANGUAGEand LC_MESSAGESand LC_ALLforam listados. Então isso significa que LANGe LANGUAGEe LC_MESSAGESe LC_ALLsão variáveis de ambiente e o resto das variáveis de localidade não são, e também eles não são variáveis do shell.
Rony_t 30/05
@rony_t Não. Significa que você tiver definido as variáveis de ambiente LANG, LANGUAGE, LC_MESSAGESe LC_ALL. (Você fez isso explicitamente ou sua distribuição ou o administrador do sistema fez isso por você.) Você pode definir uma variável de ambiente com qualquer nome (válido sintaticamente)! Mas alguns nomes são significativos para alguns aplicativos e outros não. LC_MESSAGES, LC_CTYPE, LC_TIMEE assim por diante são utilizadas por aplicações que se preocupam com o idioma das mensagens de erro, a codificação de caracteres, o formato da hora, e assim por diante.
Gilles 'SO- stop be evil'
@rony_t A propósito, sua configuração é muito estranha. A configuração de LC_ALLsubstitui todas as outras configurações, portanto, o valor das outras variáveis ​​de localidade não importa. Normalmente, ele é usado apenas temporariamente para forçar um programa a usar um determinado local, não faz sentido tê-lo em seu ambiente normal.
Gilles 'SO- stop be evil'
6

Nas distros baseadas no Fedora / CentOS / RHEL, acredito que você pode alterar o código do idioma para um dos códigos de idioma exibidos quando você executa o locale -acomando neste arquivo de sistema:

/etc/sysconfig/i18n

Por exemplo, no meu sistema Fedora 14:

$ more /etc/sysconfig/i18n 
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"

No GNOME, você pode executar o aplicativo de ajuda:

system-config-language

O que traz essa GUI:

             ss de lang.  gui

Eu acho que é um pouco diferente para as distribuições Debian / Ubuntu. Eu acredito que é este arquivo:

/etc/default/locale

Acredito que sejam variáveis ​​de ambiente, mas não tenho certeza de como os aplicativos as utilizam, se é que o fazem.

Referências

slm
fonte
4

No RedHat 6, pelo menos, observe que se LC_ALL estiver definido, a definição de outras variáveis ​​de ambiente LC_ * não terá efeito, pois LC_ALL terá precedência sobre todas as outras variáveis ​​de ambiente LC_ *.

[root@nbu76 bin]# LC_TIME=en_US.UTF-8
[root@nbu76 bin]# export LC_TIME
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_IE"
LC_NUMERIC="en_IE"
LC_TIME="en_IE"
...
LC_ALL=en_IE
[root@nbu76 bin]# unset LC_ALL
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_US.UTF-8
...
LC_ALL=
[root@nbu76 bin]# export LC_TIME=en_IE
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_IE
....
LC_ALL=
Kiwicmc
fonte
1

Nos sistemas Debian, pode-se executar dpkg-reconfigure localespara definir o idioma principal e disponibilizar outros; pode-se executar update-localepara definir a LANGUAGEvariável de ambiente /etc/default/localepara ter idiomas de fallback.

lfd
fonte
2
dpkg-reconfigure locales, nãolocale
lauriys 17/04