Plugin Multi Language Zend Framework 1 - Parte 1

Vou demostrar como fazer um plugin de multi language para Zend Framework 1. Funcionará da seguinte maneira... será colocado o valor da linguagem antes do nome do modulo na url...

www.site.com/pt_BR/module/controller/action

E a aplicação irá traduzir o conteúdo conforme esse valor, caso o valor seja en, o conteúdo será em inglês, para es será em espanhol, e assim para qualquer linguagem que queira utilizar.

Primeiramente vou demostrar a estrutura básica de pastas que utilizei...

estrutura de pastas 1

É uma estrutura padrão como recomenda a própria Zend, conforme o link http://framework.zend.com/manual/1.12/en/project-structure.project.html

E como na imagem a cima os arquivos de tradução que usaremos estará no diretório /data/locales/, e dentro de locales irá conter diversos diretórios com as siglas das linguagens, por exemplo en - es - pt_BR, etc... Usaremos exatamente essas três para demostrar o plugin e seu funcionamento.

Crie os diretório en, es e pt_BR dentro de /data/locales/ e dentro de cada uma crie um arquivo chamado Translate.php, por enquanto deixe-o vazio.

Dentro de cada diretório das linguagens coloque os arquivos de tradução do Zend_Validate que são as mensagens de validação que a classe Zend_Form utiliza, por padrão a linguagem é inglês.

Você pode conseguir esses arquivos dentro da pasta do Zend Framework 1 quando você faz o download no site oficial, esses arquivos estão em /resources/languages/ e dentro desse diretório também consta vários diretórios com as siglas das linguagens, procure o diretório en, es e pt, copie de cada uma o arquivo Zend_Validation.php e cole nos seus respectivos diretório na sua aplicação.

Sua aplicação deverá estar assim até o momento...

estrutura de pastas 2

Após isso crie um diretório dentro de application chamado plugins, nesse diretório estará nosso plugin de tradução. Você deverá criar os seguintes arquivos dentro de plugins, RouteDefault.php e Translate.php

RouteDefault.php


/**
 * Plugin de rotas para tradução
 * 
 * Defini a rota caso exista o parâmetro lang na url
 * 
 * O parâmetro lang será o primeiro parâmetro da url
 * exemplo endereco_do_site/lang/module/controller/action
 * 
 * @author Everson da Luz
*/
class Application_Plugin_RouteDefault extends Zend_Controller_Plugin_Abstract
{
   public function routeStartup(Zend_Controller_Request_Abstract $request) 
   {        

   }
}

Translate.php


/**
 * Plugin de tradução
 * 
 * Defini e registra o caminho padrão para os arquivos de tradução
 * os arquivos devem estar no diretório /data/locales/
 * seguido por subdiretório com as iniciais de suas linguagens como pt_BR, en, es, etc.
 * 
 * Defini para todos os formulários da classe Zend_Form utilizarem o translate para as mensagens
 * 
 * Registra o tradutor para ser utitlizado em toda a aplicação
 * 
 * @author Everson da Luz
*/
class Application_Plugin_Translate extends Zend_Controller_Plugin_Abstract
{
   public function preDispatch(Zend_Controller_Request_Abstract $request)
   {

   }
}

Após isso em seu bootstrap da aplicação você deverá registrar esses plugins com o seguinte código...

Bootstrap.php


class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    /**
     * Registra as linguas da aplicação
     * de acordo com os nomes dos diretórios dentro do diretório /data/locales/
     */
    protected function _initRegistersLangs()
    {
        // Obtém o nome dos diretório dentro diretório locales
        $languages = scandir(APPLICATION_PATH . '/../data/locales/');

        // Remove os indices com pontos de voltar
        foreach ($languages as $key => $lang) {
            if ($lang == '.' || $lang == '..') {
                unset($languages[$key]);
            }
        }

        // Registra o array com as siglas das linguagens
        Zend_Registry::set('languages', $languages);
    }

    /**
     * Registra o plugin de rotas para as linguagens
     */
    protected function _initRouteDefault() 
    {
        $front = Zend_Controller_Front::getInstance();      
        // Registra um plugin
        $front->registerPlugin(new Application_Plugin_RouteDefault());
    }

    /**
     * Registra o plugin Translate
     */
    protected function _initTranslate() 
    {
        $front = Zend_Controller_Front::getInstance();
        // Registra um plugin
        $front->registerPlugin(new Application_Plugin_Translate());
    }
}

O método _initRegistersLangs(), irá scanear o diretório /data/locales/ e irá pegar todos os nomes dos diretórios que contém lá, e transformará em um array. Depois removemos os pontos que consta junto do array, e por último registramos esse array com o Zend_Register para poder ser utilizado em toda a aplicação. Sua estrutura de pastas final ficará assim...

estrutura de pastas 3

Com isso terminamos a primeira parte do tutorial. Confira as outras partes nos links a baixo.

Plugin multi language Zend Framework 1 - Parte 1

Plugin multi language Zend Framework 1 - Parte 2

Plugin multi language Zend Framework 1 - Parte 3

Voltar para o topo