Internacionalizando um programa C com o gettext

gettext é a biblioteca de internacionalização (i18n) do GNU, e é um dos padrões mais importantes do Software Livre para a internacionalização dos programas. Tradutores são usados para isso, e existem bastantes ferramentas utéis para trabalhar com os dados do gettext, de maneira que é recomendável a todos evitar tentar criar sua própria ferramenta. O Gettext também funciona no Windows, assim não já desculpa.

É realmente mais fácil do que parece. Abaixo segue os passos necessários:
Adicione essas linhas ao cabeçalho do módulo C onde fica a função main():

#ifdef USE_GETTEXT
#include <libintl.h>
#include <locale.h>
#define _(String) gettext (String)
#else
#define _(String) String
#endif

E adicione essas ao inicio da sua função main():

#ifdef USE_GETTEXT
setlocale (LC_MESSAGES, "");
setlocale (LC_CTYPE, "");
setlocale (LC_COLLATE, "");
textdomain ("my-program");
bindtextdomain ("my-program", NULL);
#endif

Isso tudo tem a finalidade de inicializar o gettext, vamos agora passar para o uso no restante dos módulos. Em cada um deles, você terá que adicionar essas linhas ao cabeçalho:

#ifdef USE_GETTEXT
#include <libintl.h>
#define _(String) gettext (String)
#else
#define _(String) String
#endif

Depois de  tudo isso, você deve ser capaz de internacionalizar qualquer texto que quiser, apenas escreva _(“whatever”) ao invés de apenas “whatever”:

printf(_("whatever");

Não esqueça de compilar seu programa com a opção -DUSE_GETTEXT se você usar o mesmo #define que foi usado aqui. Agora vamos para segunda parte, que é gerar os modelos *.pot, e instalar os módulos de tradução *.mo em seu sistema:

xgettext -k_ -o my-program.pot *.c *.h --from-code=iso-8859-1

Se você preferir, pode criar arquivo *.pot diferentes para partes diferentes de seu programa ao invés de um arquivo grande para ajudar os tradutores, e depois juntar todos os arquivo *.po dentro de um único antes de converter ele para *.mo com o msgcat:

msgcat -o my-program.es.po my-program.part1.es.po my-program.part2.po my-program.part3.es.po

Para compilar os arquivos *.po no *.mo, apenas faça:

msgfmt my-program.es.po -o my-program.es.mo

Depois, não esqueça de instala-lo no diretório apropriado de seu sistema:

cp my-program.es.mo /usr/share/locale/es/LC_MESSAGES/my-program.mo

Naturalmente, você pode instruir o seu programa a buscar o arquivo *.mo em um diferente diretório, mesmo em um caminho relativo. Apenas leia as página “man”, esse artigo é apenas uma introdução ao assunto.
Traduzido de http://www.miriamruiz.es/weblog/?p=88