segunda-feira, 1 de abril de 2013

Internacionalização com FuelPHP


FuelPHP é um framework PHP livre e de código aberto, baseado no PHP 5.3+. Ele implementa uma arquitetura HMVC (Modelo-Visão-Controlador hierárquico) onde o controlador tem um papel central, a visão e o modelo estando completamente separados (não podem se comunicar um com o outro). Também oferece outros recursos, como uma implementação RESTful, uma análise de modelos, um mapeamento objecto-relacional (ORM), um pacote de autenticação e um sistema de cache entre outras coisas. Nós nos focamos aqui em como gerencia a internacionalização na sua versão 1.5.1 de janeiro de 2013. O desenvolvimento da nova base de código 2.0 já começou mas a gestão da internacionalização deveria ser a mesma.

Um exemplo muito simples


Nesta primeira abordagem, vamos implementar o código para mostrar um modelo através do controlador (vamos passar completamente por cima da visão).

Vamos começar com o nosso próprio controlador Controller_Test colocado em fuel/app/classes/controller/test.php. Nós colocamos um pouco de conteúdo, isto é, o título e o conteúdo textual do modelo para exibir. A classe View é um objeto de invólucro para as páginas HTML contendo PHP. O seu método forge tem três parâmetros: o caminho para o arquivo da visão (o template, ou modelo), relativo ao diretório app/views (aqui, test/template), um array associativo de variáveis e valores PHP ($data), e um parâmetro booleano de codificação (opcional, pondo a true, seu valor padrão, indica que seguimos a directiva de codificação do arquivo de configuração app/config/config.php, que substitui a do arquivo core/config/config.php). A codificação interna de conjuntos de caracteres é o UTF-8 por padrão.
class Controller_Test extends Controller
{
    public function action_index()
    {
        $data = array();
        $data['title']   = "Test Page";
        $data['content'] = "Test page content";

        return View::forge('test/template', $data, true);
    }
}
O modelo fuel/app/views/test/template.php é o seguinte:
<!DOCTYPE html>
<html>
<head>
    
    <?php echo $title ?>
</head>
<body>
    
<?= $content ?>
</body> </html>

Idiomas e localidades


O idioma padrão é o inglês (en), definido no arquivo de configuração app/config/config.php, que substitui o do arquivo core/config/config.php. Se quiser alterar o seu valor durante a execução, é suficiente usar a seguinte chamada:
Config::set('language', 'pt');
Também pode configurar diretamente os idiomas e localidades no arquivo app/config/config.php.
return array(
    'language'           => 'en', // Default language
    'language_fallback'  => 'en', // Fallback language when file isn't available for default language
    'locale'             => 'en_US', // PHP set_locale() setting, null to not set
    'locales'            => array(
        'en' => 'en_US',
        'pt' => 'pt_PT'
    ),
);
  • language é o idioma padrão do aplicativo
  • language_fallback é o idioma que será usado se o padrão não ser encontrado
  • locale é o local atual, usado pela função PHP set_locale(). Pode ter o valor null
  • locales são os locais suportados pela aplicação. Pode usar o local que quiser (idioma + região), e forçá-lo a usar um idioma específico
Neste exemplo, escolhemos o inglês (Estados Unidos) por padrão, e acrescentamos o suporte do português (Europeu).

Armazenamento de dados sobre os idiomas


FuelPHP oferece suporte a quatro maneiras diferentes para armazenar dados sobre os idiomas:
  • uma matriz PHP:
    return array('key' => 'value');
    
  • um arquivo de configuração INI:
    [group]
    key=value
    
  • um arquivo de configuração YAML:
    group:
       key: value
    
  • um arquivo de configuração JSON:
    {
    "group":
        {
            "key": "value"
        }
    }
    
Vamos agora criar o arquivo de idioma para o português app/lang/pt/test.php
return array(
    'test_page' => 'Página de teste',
    'penguin' => 'Pinguim',
    'hello' => 'Olá!',
    'hello_name' => 'Olá, :name!',
    'test_group'=> array('hello' => 'Olá, :name.')
);
E seu equivalente em inglês app/lang/en/test.php
return array(
    'test_page' => 'Test page',
    'penguin' => 'Penguin',
    'hello' => 'Hello!',
    'hello_name' => 'Hello, :name!',
    'test_group'=> array('hello' => 'Hello to you, :name.')
);
O controlador fuel/app/classes/controller/test.php é agora:
class Controller_Test extends Controller
{
    public function action_index()
    {
        Config::set('language', 'pt');
        Lang::load('test');

        $data = array();
        $data['title'] = Lang::get('test.test_page');
        $data['content1'] = Lang::get('hello');
        $data['content2'] = Lang::get('hello_name', array('name' => Lang::get('penguin')));
        $data['content3'] = Lang::get('test_group.hello', array('name' => Lang::get('penguin')));

        return View::forge('test/template', $data, 'UTF-8');
    }
}
E o modelo (fuel/app/views/test/template.php):
<!DOCTYPE html>
<html>
<head>
    
    <?= $title ?>
</head>
<body>
    
<?= $content1 ?> <?= $content2 ?> <?= $content3 ?>
</body> </html>
O resultado em português é:
Olá!
Olá, Pinguim!
Olá, Pinguim.
E em inglês (comentando a linha Config::set('language', 'pt');), obtemos:
Hello!
Hello, Penguin!
Hello to you, Penguin.
Para carregar um arquivo de idioma, a classe Lang propõe o método load. Neste exemplo, carregamos todos os dados de idioma, mas poderiamos muito bem ter carregado apenas o grupo test com:
Lang::load('test', 'test_group');
Como pode ver, também é possível usar um espaço reservado chamado no texto traduzido, prefixado com dois pontos (aqui, :name).
Em uma nota lateral, a classe Lang de FuelPHP contém métodos para definir uma linha específica no arquivo de idioma (set), para remover uma linha específicada do arquivo de idioma carregado (delete), e para salvar um arquivo de idioma (save), permitindo que atualize de forma dinâmica um arquivo de idioma.


Internationalization with FuelPHP (em inglês)
Internationalisation avec FuelPHP (em francês)
Internacionalización con FuelPHP (em espanhol)

Sem comentários:

Enviar um comentário