Diferença entre os arquivos locale-archive e Machine Object no diretório / usr / share / locale / locale_dir / LC_MESSAGES /?

6

Pelo que entendi, o utilitário locale-gen gera o banco de dados /usr/lib/locale/locale-archive com base nas entradas do arquivo /etc/locale.gen e nos arquivos de configuração / modelo de localidade em /usr/share/i18n/locales/ . Além disso, os utilitários armazenam seus arquivos de tradução no formato Objeto de Máquina no diretório /usr/share/locale/<locale_dir>/LC_MESSAGES/ . Por exemplo:

# dpkg -L wget | grep nl
/usr/share/locale/nl
/usr/share/locale/nl/LC_MESSAGES
/usr/share/locale/nl/LC_MESSAGES/wget.mo
#

Quando executo, por exemplo, strace -e open wget , posso ver que os arquivos /usr/lib/locale/locale-archive e /usr/share/locale/nl/LC_MESSAGES/wget.mo estão abertos.

Quais dados de localização são armazenados em arquivos no diretório /usr/share/locale/<locale_dir>/LC_MESSAGES/ e quais dados de localização são armazenados em /usr/lib/locale/locale-archive ?

    
por Martin 14.12.2016 / 16:00

1 resposta

1

Apesar de praticamente não saber nada sobre como a localização é implementada no Linux, eu tentei o meu melhor para entender isso.

Breve Descrição

/usr/lib/locale/locale-archive

locale-archive é um arquivo mapeado na memória gerado por locale-gen(8) que invoca localedef(1) . Mapeado na memória significa que, uma vez criado e chamado por um programa, só é carregado uma vez na memória. Como todos os conjuntos de idiomas definidos em /etc/locale.gen são predefinidos e o próprio arquivo é altamente estático, não há necessidade de ter várias vezes na memória. Assim, toda vez que é chamado por outro programa, o processo é apontado para o arquivo já carregado na memória, portanto, somando-se à memória virtual do programa. Desta forma, não apenas a pegada de memória física do processo é reduzida, mas também cada sistema relativo à localização é acelerado. (nenhum disco I / O adicional necessário!)

Além disso, parece funcionar como uma espécie de arquivo de localidade de failback contendo todos os idiomas do sistema. Além disso, o arquivo é muito usado por softwares escritos com a glibc.

/usr/share/locale/$LOCALE_DIR/LC_MESSAGES/$PROGRAM.mo

A internacionalização ( i18n, 18 chars between 'i' and 'n' ) do software no Linux pode ser obtida usando o GNU-gettext.

  1. Quando um programa é escrito, todas as instruções de impressão são adaptadas para usar a função gettext() do GNUs envolvendo a string que precisa ser impressa.
  2. Em seguida, xgettext(1) itera sobre a origem, criando .pot (Portable Object Template Files) em seu caminho.
  3. O tradutor humano pode usar msginit(1) para analisá-lo em .po (Portable Object) arquivos, geralmente representando um catálogo de mensagens. Então todas as cordas são traduzidas manualmente.
  4. Depois disso, msgfmt(1) é usado para compilar o arquivo .po editado em arquivos binários .mo (Message Object) . Estes podem ser enviados junto com o pacote de software.

Ao instalar um pacote em um sistema, /usr/share/locale/<locale_dir>/LC_MESSAGES/ é preenchido com $PROGRAM.mo arquivos. Quando, e. invocando wget, sua LANG env-variable apontará wget para usar sua configuração de localidade atual, o que resulta em wget incluindo as traduções pré-compiladas corretas por meio de ponteiros para a leitura .mo binary .

Detalhes adicionais e fontes

Para arquivo de localidade:

Mapeamento de memória: Centos-Mailing-List
Métodos Sub-pacotes I18N: Documentação do Fedora em diferentes compilações de arquivo de localidade

Considere também as páginas de manual para locale(1), localedef(1) e locale-gen(8) .

Para arquivos .mo :

Processo de criação de arquivos .mo : Wikipedia no Gettext
Formato de arquivo GNU MO: explicação e formato binário

Considere também as páginas de manual para xgettext(1), msginit(1) e msgfmt(1) .

Veja também as variáveis ENV LC_MESSAGE e LOCPATH .

Estou certo de que isso apenas arranhou a superfície deste vasto tópico. No entanto, espero que isso seja suficiente para você começar.

    
por 20.12.2016 / 18:33

Tags