você está aqui: Home  → Arquivo de Mensagens Curso Gratuito sobre Expressões Regulares, com o Prof.  Julio Neves

Internacionalização de programas em PHP

Colaboração: Walter Rodrigo de Sá Cruz

Data de Publicação: 20 de Abril de 2005

A biblioteca GNU gettext é utilizada para resolver um problema comum em programação: Se o seu programa vai ser distruído em dezenas de linguagens, qual o caminho a seguir em relação à internacionalização? Produzir diversos arquivos compilados, um em cada idioma (como o windows)? E se o programa for interpretado ao invés de compilado? Mais uma versão diferente para cada idioma ? NÃO!

Com o gettext, temos uma solução simples e eficiente (no mundo MS já existia algo semelhante desde o VB5, porém só recentemente, com o .NET esse tipo de recurso passou a ser difundido e utilizado de maneira extensiva). O que o gettext faz? Ao criar o código, o programador marca as strings que serão traduzidas. O gettext dispõe de utilitários que extraem todas essas strings marcadas para um arquivo de texto, a partir da qual um tradutor faz as devidas traduções em suas língua. Então, o seu programa, ao inicializar, carrega a biblioteca gettext e carrega as strings traduzidas de acordo com o idioma configurado.

O gettext é usado no linux para internacionalização de programas em C, C++, shell script, python, perl, e é claro, o PHP não podia ficar de fora.

Segue um exemplo rápido de internacionalização em PHP:

Suponhamos um arquivo chamado artigo.php com o conteúdo:

<?php
echo "String normal";
?>

Que, sem nenhum segredo, imprimiria na tela "String normal".

Vamos agora preparar o arquivo para usar o gettext. A tradução dele será para o espanhol da Espanha

<?php
$language = 'es_ES';
putenv("LANG=$language"); //configura a variável de ambiente LANG para es_ES
setlocale(LC_ALL, $language); // configura a variável de localidade para es_ES

// Configura o text domain como 'messages'
$domain = 'messages';
bindtextdomain($domain, "locale/");
textdomain($domain);
echo gettext("String traduzida");
?>

Reparem que antes do echo foram adicionadas algumas linhas de inicialização do gettext. E a própria linha do echo foi mudada de

echo "String traduzida";

para

echo gettext("String traduzida");

Para extrairmos as strings, usamos o seguinte comando no shell:

xgettext -n *.php --language=C++

Que criará o arquivo messages.po com o seguinte conteúdo:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2005-04-14 11:34-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: artigo.php:10
msgid "String traduzida"
msgstr ""

Nossa intenção é traduzir o programa para o espanhol falado na Espanha. O código para a Espanha é es_ES (esses códigos são definidos pela RFC 1766 e pelo padrão ISO 639). Devemos então copiar o arquivo messages.po gerado para locale/<LANG_CODE>/LC_MESSAGES/, no caso, locale/es_ES/LC_MESSAGES/ e traduzido no campo msgstr.

Após traduzido, devemos gerar o arquivo .mo com o comando:

msgfmt messages.po

A tradução está pronta! Quer fazer um teste? Execute no browser o arquivo artigo.php.

Normalmente, usa-se uma versão abreviada ao chamar o gettext junto com o echo ou o print:

<?php
echo T_("String traduzida");
?>

E então, ao extrair as strings com o xgettext, adiciona-se a string "--keyword=T_" ao comando, ficando:

xgettext -n *.php --language=C++ --keyword=T_

Esse é apenas o básico da internacionalização com o gettext :). E lembrando que temos ainda de nos preocupar com outras questões como a questão de datas (alguns países e a maioria dos bancos de dados usa o formato mm-dd-YYYY) e outras coisas mais.

Para mais informações, visite a página do manual do gettext do php (http://php.net/gettext)



Veja a relação completa dos artigos de Walter Rodrigo de Sá Cruz