Como as configurações de localidade funcionam em um processo?

3

Estou tentando entender como o idioma funciona no Linux. É assim que eu acho que funciona:

Cada processo tem uma tabela de variáveis de ambiente, você pode iniciar um processo e definir algumas variáveis de ambiente para este processo com algumas variáveis de localidade (por exemplo: LC_ALL=en_US.UTF-8 ).

Mas se esse processo recém-lançado quiser ver quais são suas variáveis de localidade, ele não procurará na tabela de variáveis de ambiente, mas haverá uma tabela de variáveis de localidade separada que o processo analisa, algo assim:

Portanto,seoprocessoquiserusarasvariáveisdelocalidadedefinidasemsuatabeladevariáveisdeambiente,eledeverácopiá-lasemsuatabeladevariáveisdeidiomaprimeiro.Porexemplo,paracopiaravariávelLC_ALLdatabeladevariáveisdeambienteparaatabeladevariáveisdelocalidade,oprocessofazoseguinte:

setlocale(LC_ALL,"");

Estou correto no meu entendimento? E se eu estiver correto, todos os processos têm uma tabela de variáveis de localidade, ou esta tabela só está presente em programas escritos em C?

    
por James 11.06.2018 / 17:49

1 resposta

2

Seu entendimento é parcialmente correto, mas apenas parcialmente. Uma coisa que você está perdendo para entender isso é como as configurações de localidade são usadas. As configurações de localidade são usadas por várias funções de biblioteca que executam ações dependentes de localidade, como traduzir mensagens (que usa LC_MESSAGES ), formatar números ( LC_NUMERIC ) e datas ( LC_TIME , codificar e decodificar texto ( LC_CTYPE ), classificando o texto ( LC_COLLATE ), etc.

Tome por exemplo uma função que formata uma data. Se solicitado a usar um formato dependente de localidade, ele procurará as regras de formatação de data na localidade que foi configurada para uso no processo atual. A formatação de data não se preocupa com um nome de localidade, o que ela precisa saber é como formatar a data. Então, enquanto ele olha no que você poderia chamar de “tabela de localidade”, esta tabela não contém nomes (por exemplo, LC_TIME é fr_FR ) mas configurações (por exemplo “o formato de data abreviada usa o dia do pedido-mês-ano , o formato de data por extenso usa os nomes dos meses janvier , février ,… ”).

A função C setlocale preenche algumas entradas na tabela de configurações de localidade do processo. São necessários dois argumentos: uma categoria para preencher e uma cadeia que é um nome dado a um valor específico para essas configurações de localidade. A string é basicamente um nome de arquivo para carregar as configurações. Por exemplo, setlocale(LC_TIME, "fr_FR") basicamente significa “carregar configurações de formatação de data na tabela de localidade do processo a partir do arquivo /usr/share/i18n/locales/fr_FR ” (é mais complicado do que isso, outros arquivos estão envolvidos, mas essa é a idéia básica).

A função C setlocale tem um modo de operação onde procurará variáveis de ambiente. Se você der a ela uma string vazia em vez de um nome, ela determinará um nome de código do idioma baseado no hierarquia de variável de ambiente de localidade . Este modo é o que a maioria dos programas usa. Mais uma vez, as variáveis de ambiente e os nomes de localidade influenciam o setlocale , não como funcionam as funções que executam ações dependentes de localidade.

A tabela de configurações de localidade é um recurso da biblioteca padrão ( libc ) à qual quase todos os programas são vinculados (independentemente de em que idioma estão escritos). A maioria dos idiomas fornece uma maneira de defini-lo chamando a função setlocale da biblioteca padrão. Por exemplo, Perl e Python possuem uma função setlocale que se assemelha a C's. Os idiomas de alto nível também costumam ter uma maneira de definir configurações de localidade com base no ambiente, por exemplo, use locale em Perl; no bash é automático, mas as configurações de localidade não são baseadas no ambiente, mas nas variáveis do shell com o mesmo nome (portanto, configurar eg LC_COLLATE tem um efeito no bash mesmo se você não export ).

    
por 12.06.2018 / 08:57