Internacionalização de aplicações: PHP + gettext em 5 passos

18 02 2007


Internacionalização (i18n – de InternacionalizatioN) de aplicações em PHP é algo
relativamente simples: Vejamos em alguns passos como criar um “hello world” e
internacionaliza-lo. Note que gettext deve estar disponível para a utilização:

1 – Criação da aplicação: Pré gettext
<?php
// arquivo hello.php

echo “hello world\n”;
?>

2 – Criação da aplicação: Preparando para uso de gettext
<?php
// arquivo hello_gt.php

$lang = ‘en’;

// definimos em uma variavel de ambiente qual o idioma padrao sendo utilizado
putenv(“LANG=$lang”);

// e definimos tambem as informacoes de localizao padrao
setlocale(LC_ALL, $lang);

// e exibimos a mensagem “hello world” no idioma especificado
// Note o “_”: Este e’ um alias para a funcao gettext. _(‘msg’) e’
// equivalente a gettext(‘msg’). Esta funcao sera a responsavel pela
// traducao de “hello world”
echo _(“hello world\n”);
?>

Em ambos os casos, a execução irá apenas exibir a mensagem “hello world”:

$ php hello.php
hello world
$ php hello_gt.php
hello world

3 – Extraindo as strings da aplicação
Para efetuarmos as traduções, é necessário criar um arquivo com as mensagens que a aplicação utiliza. Esta extração pode ser efetuada utilizando o programa “xgettext”:

$ xgettext -o hello.po hello_gt.php

Isso irá criar um arquivo chamado “hello.po”, que é o arquivo com as mensagens que a aplicação possui. Utilizando este arquivo como base, podemos criar arquivos de tradução para outros idiomas.

4 – Criando traduções para outros idiomas:
Utilizando o arquivo “hello.po” criado anteriormente como base, criaremos traduções para português do Brasil (pt_BR) e alemão (de_DE). Os passos são os seguintes:

4.1 – Criamos a seguinte estrutura de diretórios:
a: locale/pt_BR/LC_MESSAGES/
b: locale/de_DE/LC_MESSAGES/

4.2 – Copiamos o arquivo “hello.po” para o diretório “locale/pt_BR/LC_MESSAGES/” e para
“locale/de_DE/LC_MESSAGES/”

4.3 – Editamos estes arquivos recém copiados. As partes do arquivo que devem ser editadas são bastante simples de serem encontradas: Vejamos como ficará o arquivo “locale/pt_BR/LC_MESSAGES/hello.po”:

# 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”
“Report-Msgid-Bugs-To: \n”
“POT-Creation-Date: 2007-02-17 16:22-0200\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=iso-8859-1\n”
“Content-Transfer-Encoding: 8bit\n”

#: hello_gt.php:17
msgid “hello world\n”
msgstr “Olá mundo”

Ou seja, editamos a “msgstr” referente a msgid “hello world\n” (a última linha) e o charset utilizado pelo arquivo (“Content-Type: text/plain; charset=iso-8859-1\n”) O mesmo deve ser feito para o arquivo “locale/de_DE/LC_MESSAGES/hello.po”:

# 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”
“Report-Msgid-Bugs-To: \n”
“POT-Creation-Date: 2007-02-17 16:22-0200\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=iso-8859-1\n”
“Content-Transfer-Encoding: 8bit\n”

#: hello_gt.php:17
msgid “hello world\n”
msgstr “hallo welt\n”

4.4 – “Compilamos” o arquivo com as mensagens, para que possa ser utilizado pelo gettext. Para utilizarmos as mensagens que acabamos de traduzir, precisamos gerar um arquivo binário que o gettext irá utilizar para efetuar as traduções. Para criarmos esse arquivo binário, utilizamos o programa “msgfmt”:

$ msgfmt locale/de_DE/LC_MESSAGES/hello.po -o locale/de_DE/LC_MESSAGES/hello.mo
$ msgfmt locale/pt_BR/LC_MESSAGES/hello.po -o locale/pt_BR/LC_MESSAGES/hello.mo

Com isso serão criados dois novos arquivos: “locale/pt_BR/LC_MESSAGES/hello.mo” e “locale/de_DE/LC_MESSAGES/hello.mo”.

5 – Modificando a aplicação para utilizar os novos idiomas:
Após os 4 passos anteriores, já estamos habilitados a utilizar dois novos idiomas na aplicação.
Vejamos como utilizar em “pt_BR”

<?php
// arquivo hello_gt.php

$lang = ‘pt_BR’;

// definimos em uma variavel de ambiente qual o idioma padrao sendo utilizado
putenv(“LANG=$lang”);

// e definimos tambem as informacoes de localizao padrao
setlocale(LC_ALL, $lang);

// definimos que o domínio de textos “hello” esta localizado no diretorio “locale/”
bindtextdomain(‘hello’,‘locale/’);

// e definimos que iremos utilizar o dominio de textos “hello”
textdomain(‘hello’);

// e exibimos a mensagem “hello world” no idioma especificado
// Note o “_”: Este e’ um alias para a funcao gettext. _(‘msg’) e’
// equivalente a gettext(‘msg’). Esta funcao sera a responsavel pela
// traducao de “hello world”
echo _(“hello world\n”);
?>

Executando temos:

$ php hello_gt.php
Ola mundo

Vejamos como utilizar em “de_DE”

<?php
// arquivo hello_gt.php

$lang = ‘de_DE’;

// definimos em uma variavel de ambiente qual o idioma padrao sendo utilizado
putenv(“LANG=$lang”);

// e definimos tambem as informacoes de localizao padrao
setlocale(LC_ALL, $lang);

// definimos que o domínio de textos “hello” esta localizado no diretorio “locale/”
bindtextdomain(‘hello’,‘locale/’);

// e definimos que iremos utilizar o dominio de textos “hello”
textdomain(‘hello’);

// e exibimos a mensagem “hello world” no idioma especificado
// Note o “_”: Este e’ um alias para a funcao gettext. _(‘msg’) e’
// equivalente a gettext(‘msg’). Esta funcao sera a responsavel pela
// traducao de “hello world”
echo _(“hello world\n”);
?>

Executando temos:

$ php hello_gt.php
hallo welt

E assim vimos, simples e rapidamente, como internacionalizar uma aplicação.
É isso.

Anúncios

Ações

Information

8 responses

19 04 2007
Mauricio

Gostaria de saber como posso instalar o gettext em meu servidor web..rodando windows 2003
Abraços.

25 06 2010
pateta

it’s impossible!

30 06 2007
battisti

poxa bem legal esta gettext com relação a velocidade de execução do sistema você sentiu alguma diferença?

Fez aplicações grandes ou apelas testes ?

1 07 2007
E Silva

Uso em um framework e nao noto diferença na velocidade.

É possivel que em uma aplicação / site com milhares de acessos simultaneos isso possa causar diferença. Em aplicações com não muitos acessos, não vejo problemas.

13 12 2007
Marcus Vinicius Bastos LEandro

Olá,

O seu post me ajudou bastante! Obrigado!

OBS: Qual plugin você usa para fazer highlight no código php?

Tem como me passar?

Abraços!

9 12 2008
klederson

esse putenv() tava me matando nada funcionava só por causa disso, valeu mesmo! :)

22 05 2009
villas

Eu sei que o post é antigo pakas mas o assunto é o mesmo. Estou tentando traduzir um app em php/smarty sem nenhum POT file. A questão é se tem como extrair de algum modo as mensagens sem ter que editar todo o código pra inserir (no teu exemplo ai no post) o “_( )” em tudo que é texto …

Outra coisa é que o smarty usa muito “_()” pois é multi-linguas e já vem com as traduções prontas. Então teria que ter outro identificador como por exemplo: “_T( )” estou correto ?

16 02 2012
Bargão Robalo

Salvou Brother!

O jeito mais fácil pra aprender a internacionalizar usando .po

Agora o seguinte: Eu tive alguns inconvenientes com os comentários, desconfigurou os caracteres (aspas e apóstrofo) e ainda tive que habilitar nas configurações do servidor php o módulo gettext que estava desabilitado.

No mais deu tudo certo, abraços!!!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s




%d blogueiros gostam disto: