Zend Framework: Utilizando o Zend_Translate para tradução da aplicação usando um array
Escrevi a alguns dias um artigo sobre a utilização do Zend_Locale para globalizar uma aplicação. Junto com esse processo, caminha a tradução para a internacionalização (i18n) da aplicação. Uma ferramenta bastante poderosa que está embutida no Zend Framework é o Zend_Translate.
O uso da ferramenta consite na chamada de um método para retornar a string correspondente ao termo. O Zend_Translate necessita de uma fonte de tradução, que pode ser de diversos tipos: Array, Csv, Gettext, Ini, Tbx, Tmx, Qt, Xliff e XmlTm. Alguns desses são muito utilizados em algumas aplicações, como Array e Gettext. Outras são padrões comuns na indústria de desenvolvimento como o Tmx. Enfim, há diversas plataformas e cada uma tem sua particularidade. Recomendo a leitura da página do manual de referência para ver qual é a melhor opção para seu uso.
http://framework.zend.com/manual/en/zend.translate.adapter.html#zend.tra...
Nesse artigo estarei explicando sobre o Array e em um próximo sobre o Gettext.
Usando a tradução com um Array (Zend_Translate_Array)
Para utilizar o Zend_Translate passamos três parâmetros para o componente: o tipo da tradução, a fonte de tradução e a linguagem referente a fonte de tradução:
$english = array();
$translate = new Zend_Translate('array', $english, 'en');
Esse código você pode ser adicionado ao bootstrap.php
A fonte de tradução nada mais é que um array contendo a string a ser traduzida como chave do Array, e a tradução como valor da chave:
$english = array('Você está bem?' => 'Are you ok?',
'Sim' => 'Yes',
'Não' => 'No');
$translate = new Zend_Translate('array', $english, 'en');Pode haver diversas fontes de tradução, uma para cada linguagem. Para adicionar mais traduções, podemos utilizar o método addTranslation:
$english = array('Você está bem?' => 'Are you ok?',
'Sim' => 'Yes',
'Não' => 'No');
$spanish = array('Você está bem?' => '¿Estás bien?',
'Sim' => 'Si',
'Não' => 'No');
$translate = new Zend_Translate('array', $english, 'en');
$translate->addTranslation($spanish, 'es');Nota: Ainda estou investigando algo que acredito ser um defeito:
Sempre que adicionamos uma linguagem ao Zend_Translate (ao instanciar ou via addTranslation) o locale, somente do objeto Zend_Translate é alterado para o último passado. No exemplo acima, o após ser executado, o locale será definido para "es" (se você não está familiarizado com locale leia esse artigo). O que penso ser um comportamento incorreto quando tenho um objeto Zend_Locale registrado, veja:
$locale = new Zend_Locale('pt_BR');
Zend_Registry::set('Zend_Locale', $locale);
$english = array('Você está bem?' => 'Are you ok?',
'Sim' => 'Yes',
'Não' => 'No');
$spanish = array('Você está bem?' => '¿Estás bien?',
'Sim' => 'Si',
'Não' => 'No');
$translate = new Zend_Translate('array', $english, 'en');
$translate->addTranslation($spanish, 'es');Estou em contato com algumas listas de discussões para verificar isso, então, para resolver esse problema é só chamar o método setLocale do Zend_Translate após adicionar as linguagens:
$locale = new Zend_Locale('pt_BR');
Zend_Registry::set('Zend_Locale', $locale);
$english = array('Você está bem?' => 'Are you ok?',
'Sim' => 'Yes',
'Não' => 'No');
$spanish = array('Você está bem?' => '¿Estás bien?',
'Sim' => 'Si',
'Não' => 'No');
$translate = new Zend_Translate('array', $english, 'en');
$translate->addTranslation($spanish, 'es');
$translate->setLocale();Após instanciado, precisamos disponibilizar o objeto para a view. Como estamos criando esse objeto no bootstrap.php, vamos utilizar o Zend_Registry para transportar esse objeto para a view:
$english = array('Você está bem?' => 'Are you ok?',
'Sim' => 'Yes',
'Não' => 'No');
$spanish = array('Você está bem?' => '¿Estás bien?',
'Sim' => 'Si',
'Não' => 'No');
$translate = new Zend_Translate('array', $english, 'en');
$translate->addTranslation($spanish, 'es');
$translate->setLocale();
Zend_Registry::set('Zend_Translate', $translate);Na view (application/views/scripts/index/index.phtml - usado aqui como exemplo) sem estar preparada para internacionalização utilizamos o seguinte código:
<p>Você está bem? <button> Sim </button> <button> Não </button> </p>
Usando o objeto de tradução, podemos alterar para:
<?php
$translate = Zend_Registry::get('Zend_Translate');
<p>
<?php
echo $translate->_('Você está bem?');
?>
<button> <?php echo $translate->_('Sim'); ?> </button>
<button> <?php echo $translate->_('Não'); ?> </button>
</p>Pronto, acesse no seu browser o index e você verá as palavras em português, porquê definimos o locale como português ao criar o objeto.
Para testar com inglês, basta mudar o locale para "en" e visualize em seu browser:
$locale = new Zend_Locale('en');No próxima parte do artigo mostrarei como fazer com Gettext.
Para ler mais informações sobre como utilizar o Zend_Translate leia:
http://framework.zend.com/manual/en/zend.translate.html
- Login to post comments




