De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


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)

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


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