Assine a Lista Dicas-L
Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.
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
Referências Adicionais
Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.
Avalie esta dica
- Currently 3.09/5
- 1
- 2
- 3
- 4
- 5
Avaliação:
3.1 /5
(323 votos)
Opinião dos Leitores
Jumangu
22 Nov 2007, 19:20
Este script está todo furado, mal feito.
Nada funcionou. é para PHP e não C++.
Dá warning após msgfmt messages.po
Exemplo incompleto, bla bla bla...
Mto ruim.
Leonardo
12 Fev 2007, 15:28
Muito boa essa dica . Mas acho q ta errado esse comando ja que o tutorial eh sobre PHP
xgettext -n *.php --language=C++
nao seria?
xgettext -n *.php --language=PHP
cassio
07 Fev 2007, 22:52
Muito bom mesmo sua colaboração Walter. Parabéns