Informática

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 xgettext que 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.