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.
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)
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários