sábado, 29 de dezembro de 2012

Internacionalização de CodeIgniter


CodeIgniter é um framework PHP de código aberto que segue a arquitetura MVC (Modelo-Visão-Controlador). A sua principal vantagem é de ser mais simples e ligeiro (4Mo todo molhado) do que Zend ou Symfony, com uma curva de aprendizagem muito fácil. Nós vamos detalhar neste post a internalização por arquivos de idioma na versão 2.1.3 deste framework.

Gestão da internacionalização


O idioma padrão é definido no arquivo de configuração application/config/config.php
$config['language'] = 'en';
Os arquivos de idioma caem no diretório application/language/

Optamos aqui por um código de idioma de duas letras (en, código ISO 639-1), mas teríamos podido muito bem utilizar um código de três letras (eng, código ISO 639-2 ou 639-3), um código de duas letras localizado (en-ca para o inglês do Canadá, códigos de idioma ISO 639-1 e de país ISO 3166-1), o nome da língua em letras (english), ou qualquer outro formalismo.

O uso recomendado é prefixar o nome do arquivo de idioma (_lang.php) por uma unidade semântica (aqui, o nome do controlador, ou seja test).
Também, para evitar alguma colisão entre as chaves dos arquivos, é costume prefixar cada chave pela mesma unidade semântica.

system/language/en/test_lang.php
$lang['test_test'] = "Let's test";
$lang['test_my_view'] = "My view";
system/language/fr/test_lang.php
$lang['test_test'] = "Vamos experimentar";
$lang['test_my_view'] = "A minha visão";
A chamada de uma variável localizada faz-se no controlador carregando o arquivo de idioma através do método load ao qual passamos dois parâmetros: o prefixo do arquivo de idioma (aqui, o nome do controlador em minúsculas) e o código do idioma usado como sub-diretório do diretório das línguas (se o segundo parâmetro for omitido, é o idioma padrão do arquivo de configuração que será usado).

Depois atribuímos as variáveis que contêm as cadeias do arquivo de idioma através do método line (parametrizado pela chave do array associativo $lang), com tantas chaves do que o array associativo $data.

O controlador então apresenta-se assim:
public function view() {
    $this->lang->load('test', 'pt');

    $data['lets_test'] = $this->lang->line('test_test');
    $data['my_view'] = $this->lang->line('test_my_view');

    $this->load->view('test', $data);
}
Do lado da visão, as variáveis são diretamente visíveis: $lets_test e $my_view.

Uso de parâmetros no arquivo de idioma


A abordagem direta consiste em inserir tantos espaços reservados que forem necessários na cadeia localizada seguindo o formalismo da função PHP sprintf (ou seja %s para uma cadeia padrão).

application/language/en/test_lang.php
$lang['test_lets'] = "Let's %s now";
$lang['test_program'] = "program";
application/language/pt/test_lang.php
$lang['test_lets'] = "Vamos %s agora";
$lang['test_program'] = "programar";
O controlador insere a subcadeia que falta ao chamar.
$data['lets_program'] = sprintf($this->lang->line('test_lets'), $this->lang->line('test_program'));
O display na visão então será, quer Let's program now, quer Vamos programar agora.

O problema agrava-se quando várias subcadeias estiverem passadas como argumentos, a ordem podendo ser diferente dependendo do idioma utilizado.

O truque consiste em utilizar parâmetros numerados na função sprintf. As variáveis ​​podem também ser reutilizadas.

application/language/en/test_lang.php
$lang['test_there'] = "There are %1\$s in the %2\$s. I like %1\$s.";
$lang['test_monkeys'] = "monkeys";
$lang['test_banana_tree'] = "banana tree";
application/language/pt/test_lang.php
$lang['test_there'] = "A %2\$s está cheia de %1\$s. Adoro os %1\$s.";
$lang['test_monkeys'] = "macacos";
$lang['test_banana_tree'] = "bananeira";
O controlador insere as subcadeias que faltam na mesma ordem quando se chama, independentemente da língua.
$data['there'] = sprintf($this->lang->line('test_there'), $this->lang->line('test_monkeys'), $this->lang->line('test_banana_tree'));
O display na visão então será, ou There are monkeys in the banana tree. I like monkeys., ou A bananeira está cheia de macacos. Adoro os macacos.

Síntese


Vimos neste breve tutorial como internacionalizar uma aplicação desenvolvida com o framework CodeIgniter: como configurar arquivos de idioma, como carregá-los nos controladores e, em seguida, mostrar suas variáveis nas visões, gerindo a parametrização deles e o problema da ordem das variáveis.

Num post futuro, vamos ver como tornar os URLs de CodeIgniter SEO-friendly e internacionalizados.

Livro

Professional CodeIgniter

Para ir mais longe, recomendo a leitura deste livro: Professional CodeIgniter, por Thomas Myer (2008, 336 páginas).


Internationalisation de CodeIgniter (em francês)
CodeIgniter internationalization (em inglês)
Internacionalización de CodeIgniter (em espanhol)

Sem comentários:

Publicar um comentário