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