Quando os arquivos .mo devem ser gerados?

5

Estou criando um programa GTK3 em Python. Eu gostaria de adicionar suporte à tradução. Eu sei como criar um arquivo .pot e .po. No entanto, para disponibilizar o aplicativo em vários idiomas, preciso gerar arquivos .mo. Eu li aqui que a maneira de gerar arquivos .mo é usando o comando msgfmt.make .

A minha pergunta é se eu (o desenvolvedor) deveria gerar os arquivos .mo manualmente no meu computador e então instruir o instalador .deb a mover os arquivos para a pasta usr / share / locale / en_GB / quando estiver sendo instalado? Ou o instalador .deb deve gerar esses arquivos .mo enquanto o usuário instala meu programa em seu sistema?

De maneira que isso pode ser resumido como " os arquivos .mo dependem da máquina? "

Minha estrutura de pastas é a seguinte

nstrain-0.1
   /debian
   /data
   /help
   /nstrain_lib
   nstrain.desktop
   nstrain.py

onde nstrain.py é o arquivo executável principal que o arquivo .desktop executa quando o usuário clica no meu programa.

    
por nik90 30.05.2012 / 15:25

2 respostas

5
Arquivos MO precisam ser gerados no momento da criação. Isso significa que seu sistema de compilação precisa ter um alvo de compilação para ler o texto. Arquivos PO usados como fonte e convertê-los nos arquivos MO binários que serão instalados no sistema do usuário. Como você aponta corretamente, o comando msgfmt ( parte das ferramentas gettext acabará por criá-las.

Então, para responder a última parte da pergunta, sim, os arquivos MO são dependentes da máquina.

Criando arquivos MO de maneira difícil

Agora sobre como criá-los, no layout padrão gettext você geralmente terá todos os arquivos PO no mesmo diretório, um por idioma e nomeado após o código ISO-639 de duas ou três letras de cada idioma:

po/
po/ca.po
po/de.po
...

Se você quiser criá-los manualmente, terá que percorrer cada arquivo nesse diretório e invocar msgfmt manualmente, por exemplo,

$ msgfmt -c po/ca.po -o build/locale/LC_MESSAGES/ca/myapp.mo

Mas você não quer fazer isso quando já existe uma forma estabelecida e ferramentas automatizadas criadas especialmente para a operação de criação de arquivos MO.

Além disso, essas ferramentas cuidam de outras tarefas associadas, como extrair traduções do código e juntá-las em um arquivo POT para que os tradutores façam seu trabalho.

Criando arquivos MO de maneira inteligente

Se você estiver usando Python, recomendo muito usar o pacote python-distutils-extra (instalar pde), que automatiza e oculta a complexidade, bastando especificar o seguinte no arquivo setup.py que você usará para criar, instalar e distribuir seu aplicativo. O mesmo exemplo que @dobey já apontava em sua resposta:

DistUtilsExtra.auto.setup(
    name='myapp',
    version='0.1',
    #license='GPL-3',
    #author='Your Name',
    #author_email='[email protected]',
    #description='UI for managing …',
    #long_description='Here a longer description',
    #url='https://launchpad.net/myapp'
)

Isso cuidará de tudo para você.

Se você quiser testar as traduções antes de enviá-las, use o prático comando build_i18n em python-distutils-extra:

$ python setup.py build_i18n

Isso criará todos os arquivos PO na sua pasta /po e os colocará em build (ele será criado se não existir) no mesmo layout que o gettext espera quando eles são instalados em um sistema.

Você pode testar sua inscrição com traduções por:  * Copiando o conteúdo de /build para /usr/share/locale ou  * Apontando seu aplicativo para o diretório de criação usando a função gettext.bindtextdomain() :

gettext.bindtextdomain(domain='myapp', localedir='/home/me/dev/myapp/build')

Sendo ainda mais inteligente

Fique no ombro dos gigantes. Basta criar um aplicativo de teste com Rapidamente e copiar como as traduções estão configuradas em setup.py , que basicamente se resume a usar o módulo DistutilsExtra no modo auto , conforme descrito acima.

Você também pode usar o aplicativo de teste para gerar traduções e aprender como a geração funciona.

Embalagem

O tarball que você coloca como parte de uma versão não deve incluir os arquivos .mo. Ou seja, você não precisa criá-los manualmente. Isso precisa acontecer quando alguém cria o conteúdo do tarball para instalar manualmente ou, por exemplo, quando um pacote binário Debian está sendo criado.

Olhando para a sua árvore fonte, sugiro novamente usar um sistema de compilação como o python-distutils-extra, que também ajudará na embalagem. Aproximadamente, você precisará:

  • Crie um arquivo setup.py com conteúdo semelhante aos sugeridos acima
  • Crie os arquivos de controle de empacotamento em debian /. Usando o p-d-e, seu arquivo debian/rules pode se tornar muito simples e consistir em apenas algumas linhas.

Na verdade, talvez você queira usar o Quickly para criar o arnés para o sistema de criação e empacotamento do seu aplicativo e, em seguida, substituir o código-fonte gerado pelo Quickly pelo aplicativo de teste pelo código do aplicativo.

    
por David Planella 30.05.2012 / 16:32
2

Considerando que você está usando o Python, presumo que você esteja usando setuptools / distribution / distutils como o sistema de compilação. Nesse caso, você pode usar DistUtilsExtra.auto:


from DistUtilsExtra.auto import setup

setup(
    name="Your Project",
    version="0.1",
    ...
)

Você pode passar os mesmos argumentos para o setup () como normalmente faz para o seu pacote. O DistUtilsExtra.auto pode manipular automaticamente muitas partes de integração do sistema, como traduções, incluindo a tradução de arquivos de texto estáticos, como arquivos .desktop.

    
por dobey 30.05.2012 / 15:45