Em que devo definir meu código de idioma e quais são as implicações disso?

19

Essa pergunta foi estimulada pela pergunta O navegador Chromium não permite definir o tamanho do papel padrão para "Imprimir em arquivo" e também por uma conversa com @Gilles no bate-papo. Conforme indicado por @don_crissti e verificado por mim, alterar o código do idioma (pelo menos LC_PAPER) faz a diferença no tamanho do papel selecionado.

Eu nunca havia pensado muito no que selecionar e sempre fui com en_US.UTF-8ele porque parecia uma escolha padrão razoável.

No entanto, por @Gilles no bate-papo (consulte a conversa iniciando em http://chat.stackexchange.com/transcript/message/17017095#17017095 ). Extratos:

Gilles: LC_PAPER assume como padrão $ LANG

Gilles: Você deve ter LANG = pt_BR.UTF-8. É uma péssima ideia: define LC_COLLATE e quase sempre é uma coisa ruim

Gilles: LC_COLLATE não descreve o agrupamento correto, é muito restritivo (vai caractere por caractere) remove LANG e, em vez disso, define LC_CTYPE e LC_PAPER

Gilles: mais LC_MESSAGES se você quiser mensagens em um idioma diferente do inglês

Claramente, existem questões aqui das quais não estou ciente e tenho certeza de que muitas outras também. Então, quais problemas você deve considerar ao definir locais e como deve defini-los? Eu sempre corri dpkg-reconfigure localesno Debian, e não pensei duas vezes sobre isso.

Pergunta específica: devo definir meu código de idioma para en_IN.UTF-8? Existem desvantagens em fazer isso?

Consulte também: LC_COLLATE (deveria) afeta os intervalos de caracteres?

Faheem Mitha
fonte

Respostas:

29

As configurações de localidade são preferências do usuário relacionadas à sua cultura.

Nomes de localidade

Em todas as variantes atuais do unix que eu conheço (mas não em algumas antiguidades), os nomes de localidades seguem o mesmo padrão:

  • Um código de idioma com duas letras minúsculas ISO 639-1 ou um código de idioma com três letras ISO 639-2 se o idioma não possuir código de duas letras. Por exemplo, enpara inglês, dealemão, jajaponês, ukucraniano, berberbere,…
  • Para muitos idiomas, mas não todos, um sublinhado _seguido por um código de país com duas letras maiúsculas ISO 3166 . Assim: en_USpara inglês dos EUA, inglês en_UKbritânico, francês fr_CAcanadense (Quebec), de_DEalemão da Alemanha, de_ATalemão da Áustria, ja_JPjaponês (do Japão), etc.
  • Opcionalmente, um ponto .seguido do nome de uma codificação de caracteres , como UTF-8, ISO-8859-1, KOI8-U, GB2312, Big5, etc. Com GNU libc, pelo menos, (eu não sei como difundido este é), caso e pontuação é ignorada na codificação de nomes. Por exemplo, o zh_CN.UTF-8chinês mandarim (simplificado) é codificado em UTF-8, enquanto o zh_CNchinês mandarim é codificado em GB2312 e o zh_TWchinês taiwanês (tradicional) é codificado em Big5.
  • Opcionalmente, um sinal de arroba @seguido pelo nome de uma variante. O significado de variantes depende da localidade. Por exemplo, muitos países europeus têm uma @eurovariante de localidade em que o sinal de moeda é € e a codificação é aquela que inclui esse caractere (ISO 8859-15 ou ISO 8859-16), em oposição à variante sem adornos do sinal de moeda mais antigo. Por exemplo, en_IE(inglês, Irlanda) usa a codificação latin1 (ISO 8859-1) e £ como símbolo da moeda, enquanto en_IE@eurousa a codificação latin9 (ISO 8859-15) e € como o símbolo da moeda.

Além disso, existem dois nomes de código de idioma que existem em todos os sistemas do tipo unix: Ce POSIX. Esses nomes são sinônimos e significam computador, ou seja, configurações padrão apropriadas para dados analisados ​​por um programa de computador.

Configurações de localidade

As seguintes categorias de localidade são definidas pelo POSIX :

  • LC_CTYPE: o conjunto de caracteres usado pelos aplicativos do terminal: dados de classificação (quais caracteres são letras, pontuação, espaços, inválidos etc.) e conversão de maiúsculas e minúsculas. Os utilitários de texto normalmente atendem LC_CTYPEà determinação dos limites de caracteres.
  • LC_COLLATE: ordem de agrupamento (ou seja, classificação). Essa configuração é de uso muito limitado por vários motivos:
    • A maioria dos idiomas possui regras complexas que dependem do que está sendo classificado (por exemplo, palavras do dicionário e nomes próprios podem não usar a mesma ordem) e não podem ser expressadas por LC_COLLATE.
    • Existem poucos aplicativos em que a ordem de classificação adequada é importante, executada pelo software que usa as configurações de localidade. Por exemplo, os processadores de texto armazenam o idioma e a codificação de um arquivo no próprio arquivo (caso contrário, o arquivo não seria processado corretamente em um sistema com diferentes configurações de localidade) e não se preocupa com as configurações de localidade especificadas pelo ambiente.
    • LC_COLLATEpode ter efeitos colaterais desagradáveis, principalmente porque causa a ordem de classificação A <a <B <..., que faz com que "entre A e Z" inclua as letras minúsculas de a a y. Em particular, expressões regulares muito comuns, como [A-Z]quebram alguns aplicativos .
  • LC_MESSAGES: o idioma das mensagens informativas e de erro.
  • LC_NUMERIC: formatação numérica: separador decimal e milhares.
    Muitos aplicativos codificam .como separador decimal. Isso LC_NUMERICnão é muito útil e potencialmente perigoso:
    • Mesmo se você configurá-lo, ainda verá o formato padrão com bastante frequência.
    • É provável que você entre em uma situação em que um aplicativo produz saída dependente da localidade e outro aplicativo espere .ser o ponto decimal ou ,um separador de campos.
  • LC_MONETARY: como LC_NUMERIC, mas para montantes em moeda local.
    Muito poucos aplicativos usam isso.
  • LC_TIME: formatação de data e hora: nomes de dias da semana e meses, relógio de 12 ou 24 horas, ordem das partes da data, pontuação etc.

O GNU libc, que você encontrará no Linux não incorporado, define categorias de código de idioma adicionais:

  • LC_PAPER: o tamanho do papel padrão (definido por altura e largura).
  • LC_NAME, LC_ADDRESS, LC_TELEPHONE, LC_MEASUREMENT, LC_IDENTIFICATION: Eu não sei de qualquer aplicativo que usa estes.

Variáveis ​​ambientais

Os aplicativos que usam configurações de localidade os determinam a partir de variáveis ​​de ambiente.

  • Em seguida, o valor da LANGvariável de ambiente é usado, a menos que seja substituído por outra configuração. Se LANGnão estiver definido, o código do idioma padrão é C.
  • Os LC_xxxnomes podem ser usados ​​como variáveis ​​de ambiente.
  • Se LC_ALLestiver definido, todos os outros valores serão ignorados; isso é útil principalmente para definir LC_ALL=Caplicativos de execução que precisam produzir a mesma saída, independentemente de onde eles são executados.
  • Além disso, o GNU libc usaLANGUAGE para definir fallbacks para LC_MESSAGES(por exemplo, LANGUAGE=fr_BE:fr_FR:enpara preferir o francês belga ou, se não estiver disponível, o francês, ou se o inglês não estiver disponível).

Instalando localidades

Os dados de localidade podem ser grandes, portanto, algumas distribuições não os enviam de forma utilizável e requerem uma etapa de instalação adicional.

  • No Debian, para instalar localidades, execute dpkg-reconfigure localese selecione na lista na caixa de diálogo ou edite /etc/locale.gene execute locale-gen.
  • No Ubuntu, para instalar localidades, execute locale-genos nomes das localidades como argumentos.

Você pode definir seu próprio código de idioma .

Recomendação

As configurações úteis são:

  • Defina LC_CTYPEo idioma e a codificação em que você codifica seus arquivos de texto. Verifique se os seus terminais usam essa codificação.
    Para a maioria dos idiomas, apenas a codificação é importante. Há poucas exceções; por exemplo, uma maiúscula iestá Ina maioria dos idiomas, mas İem turco ( tr_TR).
  • Defina LC_MESSAGESpara o idioma em que você deseja ver as mensagens.
  • Defina LC_PAPERcomo en_USse você deseja que US Letter seja o tamanho de papel padrão e praticamente qualquer outra coisa (por exemplo en_GB), se você deseja A4.
  • Opcionalmente, defina o LC_TIMEseu formato de hora favorito.

Como explicado acima, evite configurar LC_COLLATEe LC_NUMERIC. Se você usar LANG, substitua explicitamente essas duas categorias, configurando-as para C.

Gilles 'SO- parar de ser mau'
fonte
Olá Gilles, obrigado pela resposta detalhada. Onde é um bom lugar para substituir as configurações padrão no Debian? Como preciso de um tamanho de papel A4, acho que preciso substituir o valor padrão de LC_PAPER. E posso atualizar isso no sistema sem reiniciar?
Faheem Mitha
11
@FaheemMitha Qual é a melhor maneira independente de distribuição / shell para definir variáveis ​​de ambiente? E se você deseja configurá-lo em todo o sistema, no Debian, também existe /etc/default/locale. Esses arquivos entram em vigor quando você faz login; você pode fazer export LC_PAPER=…em um shell para afetar os comandos lançados a partir desse shell.
Gilles 'SO- stop be evil'