GNU gettext: Sistema de Internacionalização e Localização
Pontos principais
- O GNU gettext separa a programação da tradução, permitindo que tradutores trabalhem sem alterar o código-fonte.
- Utiliza a própria string original como chave de tradução, eliminando a necessidade de IDs numéricos.
- O fluxo de trabalho padrão envolve a extração de strings (.POT), a tradução (.PO) e a compilação para binário (.MO).
- A função ngettext permite a gestão de formas plurais complexas variando conforme a gramática de cada idioma.
O gettext é um sistema de internacionalização (i18n) e localização (l10n) amplamente utilizado no desenvolvimento de programas multilíngues, especialmente em sistemas operacionais do tipo Unix. A principal vantagem do gettext é a separação rigorosa entre o processo de programação e o de tradução, permitindo que desenvolvedores e tradutores trabalhem de forma independente.
A implementação mais difundida deste sistema é o GNU gettext, lançado pelo Projeto GNU em 1995. A biblioteca de tempo de execução responsável por esse processo é a libintl.
Histórico e Desenvolvimento
No final da década de 1980, o padrão POSIX não oferecia meios nativos para a localização de mensagens. Surgiram então duas propostas principais: o gettext da Uniforum (1988) e o catgets da X/Open (1989). A Sun Microsystems implementou a primeira versão do gettext em 1993.
Houve divergências entre desenvolvedores Unix e POSIX sobre qual interface adotar, o que levou muitas bibliotecas C, incluindo a glibc, a implementarem ambos os sistemas. O Projeto GNU optou pela abordagem do gettext, onde a própria mensagem no idioma original serve como a chave de busca, considerando-a mais simples e amigável do que o sistema de chaves programáticas (IDs) exigido pelo catgets.
Desde 1995, o GNU gettext foi portado para diversas linguagens de programação e influenciou a criação de ferramentas como o po4a (po for anything) e o Translate Toolkit, que permitem a aplicação do formato de tradução em contextos não programáticos, como documentos de texto.
Funcionamento Técnico
Processo de Programação
A interface básica do gettext consiste na função gettext(const char), que recebe a string no idioma original (geralmente inglês). Para otimizar a escrita do código e reduzir a poluição visual, é comum criar um alias (apelido) para essa função, utilizando apenas o caractere sublinhado _().
Diferente de sistemas como o LoadString do Windows, que utiliza IDs numéricos, o gettext usa a string original como chave. Caso a tradução não seja encontrada, o sistema retorna a string original. Para casos onde a mesma frase possui significados diferentes dependendo do contexto, utiliza-se a função cgettext(), que aceita uma string de contexto adicional.
Fluxo de Tradução e Arquivos
O ecossistema gettext utiliza três extensões de arquivo principais:
- .POT (Portable Object Template): Um modelo gerado pela ferramenta
xgettextque extrai todas as strings traduzíveis do código-fonte. - .PO (Portable Object): O arquivo de tradução propriamente dito, derivado do .POT. O tradutor preenche as traduções neste arquivo, utilizando editores de texto ou ferramentas especializadas como o Poedit.
- .MO (Machine Object): A versão binária do arquivo .PO, compilada via
msgfmt. Este arquivo é o que o programa lê durante a execução para exibir as mensagens no idioma do usuário.
Execução e Localização
Em sistemas Unix, o usuário define a variável de ambiente LC_MESSAGES para selecionar o idioma. Em variantes GNU, a variável LANGUAGE também pode ser utilizada, com a vantagem de suportar múltiplos idiomas em ordem de prioridade (fallback), separados por dois pontos.
Tratamento de Plurais
O gettext resolve a complexidade de plurais através da função ngettext(). Como as regras de plural variam drasticamente entre idiomas (alguns possuem apenas dois estados, outros possuem múltiplos), o arquivo .PO armazena no cabeçalho a regra de plural do idioma alvo, geralmente expressa por um operador ternário estilo C.
Isso permite que o software adapte a mensagem não apenas para singular e plural, mas para as formas plurais específicas de cada língua, garantindo a correção gramatical independentemente do número de itens referenciados.
Perguntas frequentes
O que é o GNU gettext?
É um sistema de internacionalização e localização que permite a criação de softwares multilíngues, separando o código-fonte da tradução das mensagens.
Qual a diferença entre arquivos .POT, .PO e .MO?
O .POT é o modelo (template) com as strings originais; o .PO é o arquivo onde as traduções são inseridas; e o .MO é o arquivo binário compilado para leitura rápida pelo software.
Como o gettext lida com plurais?
Através da função ngettext() e de regras de plural definidas no cabeçalho do arquivo .PO, adaptando-se às regras gramaticais de cada idioma.
Qual a vantagem de usar strings como chaves em vez de IDs?
Simplifica o desenvolvimento, pois o programador não precisa criar e gerenciar nomes de chaves ou IDs para cada frase do programa, usando o texto original como referência.