Postagens populares

quinta-feira, 12 de março de 2009

Internacionalização (I18N) de aplicativos com symfony

Uma das grandes vantagens de utilizar um framework profissional é que você não precisa reinventar a roda toda vez que precisa de um recurso diferente. Facilita e agiliza o processo, permitindo a você total foco na lógica do negócio.

Um grande dilema para os desenvolvedores web sempre foi a internacionalização, ou, I18N (entre o I e o N são 18 letras - InternationalizatioN). Em muitos casos, nos remotos tempos do HTML simples, era um verdadeiro pesadelo criar um site com múltiplos idiomas. Bem, mesmo com o PHP e alguns recursos, como o gettext, haviam ainda muitos problemas. Além, é claro, dos dados no caso de sites dinâmicos, que discutirei em um post separado.

Bem, com o symfony isto tudo é coisa do passado. Falarei primeiro da tradução dos templates e termos fixos do aplicativo. Para criar um aplicativo com I18N, basta criar um catálogo xml com os termos e utilizar uma função em seus templates para traduzir os termos. Logo, teríamos um template normal da seguinte forma:

<p>
Bem vindo a página da empresa X!
Agora são < ? php echo date('H:i:s') ? >
</p>


Mas caso eu necessite de outro idioma, ou mesmo preparar meu aplicativo caso isto seja necessário no futuro (pois ao não encontrar o termo, o symfony devolve o termo passado à função), teríamos:

<p>
<? php echo __('Bem vindo a página da empresa X!') ?>
<? php echo __('Agora são %date%' , array ('%date%' => date('H:i:s'))) ?>
</p>

Você deve estar se perguntando o que é esse __(): é a função de tradução, com ela que acontece a mágia da tradução dos termos, você diz ao symfony para procurar uma tradução.

A função aceita como parâmetros:

Termos que devem ser enviados a separadamente, como o %date%, em formato de array, como em nosso exemplo, onde a hora vai ser diferente cada vez que acessarmos o a página, logo, a data deve ser inserida na string após a tradução dos demais termos. Além disto, em alguns idiomas, determinadas informações podem ter uma ordem diferente.

O Nome do arquivo de tradução também pode ser especificado, e, se não o fizer, o symfony procurará pelo arquivo messages.{idioma - 2 letras ISO}.xml na pasta I18N do aplicativo.

A assinatura do método é esta: function __($text, $args = array(), $catalogue = 'messages') {}

Para traduzir para o inglês, devemos criar um arquivo messages.en.xml, e dentro cadastrar as sentenças:
<trans-unit approved="no" id="global_1">
<source>Bem vindo a página da empresa X! </source>
<target state="translated"> Welcome to X company web site!</target>
</trans-unit>

<trans-unit approved="no" id="global_2">
<source> Agora são %date% </source>
<target state="translated"> It's %date% </target>
</trans-unit>

Além do arquivo de tradução do aplicativo, pode-se ainda dividir os arquivos de tradução por módulo, permitindo uma melhor organização dos arquivos.

O symfony ainda possui um arquivo de configuração para o I18N, na pasta config/i18n.yml do aplicativo. Nele você pode configurar alguns parametros como um prefixo e sufixo para identificar termos não traduzidos, habilitar o debug ou desabilitar as traduções.

É isso aí! Com isto você já pode traduzir todos os templates e termos de sua aplicação. Em uma próxima postagem explico como gerenciar traduções para as informações do banco de dados.

2 comentários:

  1. Pode explicar como posso inserir uma opção de ter 2 línguas no site?? Ter inglês e português e dar a hipótese de escolher e consoante a escolha meter o site na língua que se escolheu.

    ResponderExcluir
  2. Siga os passos que eu passei para traduzir a interface, e quando precisar trocar, passe um parametro chamado sf_culture=pt_BR para portugues Brasil por exemplo, ou sf_culture=pt_PT para portugues portugal, e assim por diante.

    As siglas referentes ao idioma devem seguir o padrão ISO.

    ResponderExcluir

Comenta aí galera, vamos debater os assuntos!

Magazine Luiza