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.
quinta-feira, 12 de março de 2009
Assinar:
Postar comentários (Atom)
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.
ResponderExcluirSiga 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.
ResponderExcluirAs siglas referentes ao idioma devem seguir o padrão ISO.