i18n é um pacote que tenta simplificar o fluxo de trabalho e desenvolvimento de aplicativos internacionalizados. & Nbsp; É um wrapper fino em torno das ferramentas existentes, nomeadamente gettext e babel.
Uso básico
# Demo.py
#
de i18n.translator importação Tradutor
supported_languages = ['it_IT', 'fr_FR', 'de_DE']
# Ativar traduções italiano
tr = Translator ("/ path / to / root ', supported_languages,' it_IT ')
impressão tr ._ ('Olá, mundo! ")
onde / path / to / root / é o diretório raiz do seu projeto. Quando instanciado, a classe Tradutor automaticamente cria um diretório chamado / path / to / root / idiomas onde as traduções são armazenados.
mensagens Extraindo
Antes de fazer a tradução real, você precisa extrair as mensagens de seus arquivos de origem, invocando o comando de extração no módulo i18n, que é um invólucro em torno extrato pybabel e atualização pybabel:
& Nbsp; python -m i18n --root = / path / to / root --languages = it_IT, fr_FR, de_DE extrato
extrato olha por todas as mensagens acondicionada dentro chamadas para _ (), gettext () ou ngettext () e produz um arquivo chamado línguas / template.pot. Este é um file` po gettext padrão que contém todas as mensagens encontradas na aplicação.
Além disso, extrair () também cria um arquivo de catálogo de mensagens para cada um dos idiomas suportados como línguas / $ CODE / LC_MESSAGES / messages.po, onde $ CODE é uma das línguas enumeradas no supported_languages (it_IT, fr_FR de_DE e no exemplo acima ).
Os arquivos de catálogo está agora pronto para ser traduzido usando uma das muitas ferramentas existentes, por exemplo QT Linguist ou Poedit. Para o correto funcionamento do aplicativo, o línguas inteiras / hierarquia precisa ser preservada. Sugerimos para acompanhar os vários arquivos messages.po em Sistema de Controle de Versão, juntamente com os outros arquivos pertencentes à aplicação.
mensagens Atualizando
Durante o desenvolvimento da aplicação, você certamente irá adicionar novas mensagens a ser traduzido. O comando extrato tratar automaticamente neste caso: se ele encontrar arquivos de catálogo existentes, o seu conteúdo (incluindo as traduções existentes) é mesclada com as mensagens recém-extraído.
catálogos Compilando
É necessário compilar os arquivos de catálogo antes de usá-los com gettext. Por padrão, o nosso tradutor objeto compila automaticamente todos os catálogos encontradas em linguagens /, produzindo os correspondentes .mo arquivos. A compilação é feita apenas quando o arquivo de catálogo foi modificado. Isto significa que, na maioria dos casos, você não precisa se preocupar com a compilação dos catálogos.
Se você preferir ter mais controle sobre esta etapa, você pode passar autocompile = False para o construtor de Tradutor e compilá-los manualmente a partir da linha de comando:
& Nbsp; python -m i18n --root = / path / to / root --languages = it_IT, fr_FR, de_DE compilar
Armazenar traduções em um banco de dados
Para algumas aplicações, é útil para permitir que o usuário defina novas traduções e / ou substituir as configurações padrão. i18n suporta este caso de uso com a classe DBTranslator, que é uma subclasse de Translator. Ao traduzir, DBTranslator primeiro procura no banco de dados: se a mensagem não for encontrado, ele delega ao comportamento gettext padrão.
DBTranslator baseia-se sqlalchemy. Seu construtor tem um parâmetro adicional do motor:
de i18n.dbtranslator importação DBTranslator
de sqlalchemy create_engine importação
motor = create_engine ('sqlite: ///db.sqlite')
ROOT = '/ path / to / root'
LANGUAGES = ['it_IT', 'fr_FR']
DEST_LANGUAGE = 'it_IT'
tr = DBTranslator (ROOT, LANGUAGES, DEST_LANGUAGE, motor = motor)
impressão tr ._ ("Olá mundo")
DBTranslator cria automaticamente os translation_entries tabela no DB. Então, cabe a aplicação para fornecer uma interface de usuário para manipular a tabela. Para o teste, você pode usar o método add_translation () para inserir uma nova tradução no DB:
tr.add_translation ("it_IT", "Olá mundo", "ciao mondo")
impressão tr ._ ("Hello World") # imprime "ciao mondo"
Como usar um tradutor mundial
Pelo projeto, i18n tenta evitar completamente qualquer estado global. Isso significa que você pode criar uma instância como muitos Tradutor e DBTranslator como você quer, cada um referente a um diretório e / ou banco de dados diferente. Isto é especialmente útil para o ensaio.
No entanto, na prática, a maioria dos projetos quiser usar um tradutor global que sabe sobre as mensagens de todos os componentes do projeto. O aplicativo de demonstração mostra uma maneira de fazê-lo no módulo translate.py:
py importação
de i18n.translator importação Tradutor
# Definir a raiz do projeto para o diretório que contém esse arquivo
ROOT = py.path.local (__ __ arquivo). Dirpath ()
LANGUAGES = ['it_IT', 'fr_FR', 'de_DE']
tr = Translator (ROOT, línguas, 'it_IT')
_ = Tr._
ngettext = tr.ngettext
se __name__ == '__main__':
& Nbsp; tr.cmdline (sys.argv)
Desta forma, o restante do aplicativo pode simplesmente importar e usar _ () e ngettext () de translate.py. Ou, pelo sua preferência, importar diretamente o tr objeto e uso tr ._ () e tr.ngettext () para traduzir mensagens.
As duas últimas linhas do código permite uma maneira conveniente chamar extrair e compilar a partir da linha de comando sem ter que especificar manualmente o diretório raiz e os idiomas suportados. Apenas corra:
& Nbsp; extrato translate.py python # ... ou compilar
Requisitos :
- Python
Comentários não encontrado