Jul
02
2009

Usando ficheiros .po e .mo para traduzir o seu site

Depois de já ter visto várias vezes sites com este tipo de ficheiros decidi fazer o teste com este tipo de tradução e realmente para quem está a pensar em fazer sites muli-lingua esta é sem dúvida a melhor forma de o fazer.

De referir que o que neste caso menciono como tradução são os textos e/ou mensagens colocados no código dos seus ficheiros, como por exemplo os echo(”mensagem”); nos html <label><?=(”mensagem”)</label>, etc…

De forma a facilitar o trabalho deve nos seus ficheiros mudar o seguinte.

Em todas as mensagens, titulos, alertas, etc., que queira ver traduzidos deve mudar o seguinte:

echo (”mensagem”);  - deve ser mudado para echo _(”mensagem); ou echo gettext(”mensagem”);

A função _(”")  e gettext(”") são a mesma coisa, pela qual eu prefiro a primeira apenas pela sua simplicidade.

De notar que ao usar uma destas opções, caso ainda não tenha criado os respectivos ficheiros de tradução em nada muda o que vai aparecer na página, ou seja, se desde o inicio do seu projecto colocar as mensagens desta forma vai facilitar no final recolher todas as variáveis que tem de ser traduzidas.

No final do projecto, ou antes, para testar, a melhor forma de criar os seus ficheiros de tradução é usar o programa grátis PoEdit, que pode ser encontrado no seguinte link. O PoEdit pode ser usado em várias linguas, incluindo Portugues.

No seu programa PoEdit, crie um novo Catalogo. Preenchendo os dados da primeira janela tal como o exemplo abaixo, e não esquecendo de colocar a codificação em UTF-8, isto para que depois ao colocar as mesagens traduzidas no seu site elas não apareçam com aqueles caracteres malucos :)

Janelas Inicias PoEdit

Na 2ª opção, imagem á direita acima, escolha a pasta no seu PC onde está localizado o seu site. Assim, poderemos automaticamente detectar todos os termos que no nosso projecto colocamos com o _(”texto”); ou gettext(”texto”); e rapidamente criar o ficheiro base para tradução.

Agora basta carregar na opção de Actualizar (imagem abaixo) para que automaticamente sejam detectados todos os termos a traduzir.

Actualizar a partir da fonte

Depois de  actualizado é começar a fazer as traduções dos termos apresentados na lista.

Agora a parte melhor, que é a do código. Imaginando que usam um ficheiro de configuração para os vossos projectos que é carregado globalmente, com as configurações de base de dados, etc.. devem acrescentar o seguinte código:

// variável de lingua, exemplo $_GET["lingua"]
$locale = 'pt';
//onde vão ficar os ficheiros .po e . mo  a estrutura deve ser
//../lib/lang/pt/LC_MESSAGES/msg_pt.{po,mo} para portugues
//e ../lib/lang/es/LC_MESSAGES/msg_es.{po,mo}, para espanhol
//mas aqui apenas indicamos a pasta de origem
$locale_dir = '../lib/lang';
//indica qual o nome do fiheiro a carregar, eu fiz nomes diferentes,
//mas poderá usar o mesmo, visto que ficam em pastas diferentes.
$message="msg_".$locale;
//define a variavel com a lingua escolhida
putenv("LANGUAGE=$locale");

Esta secção apenas uso em modo de desenvolvimento, isto porque estes tipo de ficheiro/informação ficam em cache, e a unica forma, de depois de fazer uma alteração a ver é reiniciar o servidor apache, ou mudar os nomes dos ficheiros. Desta forma verificamos qual o ficheiro mais actual e temos sempre a informação actualziada. Depois de concluir, comente esta secção ou elimine-a.

// Caminho para o ficheiro
$filename = "$locale_dir/$locale/LC_MESSAGES/$message.mo";
$mtime = filemtime($filename); // verifica se houve modificações

// o nosso ficheiro unico
$filename_new = "$locale_dir/$locale/LC_MESSAGES/$message-$mtime.mo";

if (!file_exists($filename_new)) {  // verifica se já temos algum
// se não criamos a partir do original
copy($filename,$filename_new);
}
// mudamos para o novo ficheiro
$message = "$message-$mtime";
}

e por fim o resto do código

bindtextdomain($message, $locale_dir);
textdomain($message);
// manter esta codificação devido aos caracteres especiais
bind_textdomain_codeset($message, 'UTF-8');

E prontos, está feito. Espero que a informação vos seja útil.

Envie um comentário