Logotipo Dicas-L, por Ricardo Burile

Busca

Visite também: UnderLinux ·  VivaOLinux ·  LinuxSecurity ·  NoticiasLinux ·  BR-Linux ·  SoftwareLivre.org ·  [mais]   
 

Mão na Massa LDAP - 1 Profissional por Máquina
Configure um serviço de Diretórios baseado no servidor OpenLDAP!
Dia 6 de Dezembro - São Paulo
Saiba mais


 

Aprenda inglês em casa

Baixe gratuitamente as duas primeiras aulas

English for Reading and Listening

Receba por email, diariamente, mensagens contendo materiais para leitura e audição, incluindo arquivos no formato MP3 gravados por falantes nativos.

Saiba mais e faça sua inscrição

Você está aqui: Home  → Arquivo Dicas-L

 

Mão na Massa - LDAP

Assine a Lista Dicas-L

Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.

Publicar em del.icio.us

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)

Recomende este site
Recomendar este artigo


Versão para impressão


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
*Nome:
Email:
Me notifique sobre novos comentários nessa pagina
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script

Mão na Massa LDAP - 1 Profissional por Máquina
Configure um serviço de Diretórios baseado no servidor OpenLDAP!
Dia 6 de Dezembro - São Paulo
Saiba mais

Biblioteca

Redes - Guia Prático
Por Carlos. E. Morimoto

Hardware - o Guia Definitivo
Por Carlos. E. Morimoto

Kurumin 7 - Guia Prático
Por Carlos. E. Morimoto

Linux: Ferramentas Técnicas, 2ed
Por Carlos. E. Morimoto

VPN: Virtual Private Network
Por Lino Sarlo da Silva

MySQL - Guia do Programador
Por André Milani

Sistemas de Banco de Dados
Por Ramez E. Elmasri e Shamkant Navathe

Hardware PC: Guia de Aprendizagem Rápida
Por Carlos E. Morimoto

Extreme Programming
Por Vinicius Manhaes Teles

Google Hacking
Por JOHNNY LONG

Elite da Tropa
Por Luis Eduardo Soares, Andre Batista e Rodrigo Pimentel

Harry Potter e as Relíquias da Morte
Por J.K. Rowling

Manual Completo do Linux: Guia do Administrador
Por Evi Nemeth, Trent R. Hein, Garth Snyder

PHP para Quem Conhece PHP
Por Juliano Niederauer

O Conhecimento em Rede
Por Carlos Nepomuceno e Marcos Cavalcanti

Enterprise Javabeans 3.0
Por Bill Burke, Richard Monson

Redes de Computadores
Por Andrew S. Tanembaum

Marley e Eu: a Vida e o Amor ao Lado do Pior Cão do Mundo
Por John Grogan

Deus, um delírio
Por Richard Dawkins

Java: Como Programar
Por Harvey M. Deitel e Paul J. Deitel

Descobrindo o Linux: Entenda o Sistema Operacional GNU/Linux
Por Joao Eriberto Mota Filho

Use a Cabeça!: JSP & Servlets
Por Brian Bashan, Kathy Sierra, Bert Bates

1808
Por Laurentino Gomes

UML: Guia do Usuário
Por Grady Booch, James Rumbaugh e Ivar Jacobson