Internacionalização (i18n) em C++: guia completo com gettext e ICU

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Internacionalização (i18n) em C++: do básico às técnicas avançadas

\n\n

Internacionalização (abreviada como i18n — de "internationalization", onde 18 é o número de letras entre a primeira e a última) é o processo de projetar software de forma que ele possa ser facilmente adaptado para diferentes idiomas e regiões sem alterações no código-fonte. Para a linguagem C++, tradicionalmente usada em aplicações de alto desempenho e multiplataforma, a implementação correta de i18n é criticamente importante. Neste artigo, abordaremos as principais abordagens, bibliotecas e exemplos práticos para localização de aplicações C++.

\n\n

Conceitos principais de i18n

\n\n

Antes de passar para as ferramentas, é importante entender os conceitos-chave:

\n\n
    \n
  • Localização (l10n) — adaptação do texto traduzido, formatos de datas, números e moedas para uma região específica.
  • \n
  • Locale — conjunto de regras (idioma, região, codificação) que define a formatação de dados.
  • \n
  • Unicode e UTF-8 — padrão de codificação de caracteres, obrigatório para a internacionalização moderna.
  • \n
  • Pluralização — exibição correta das formas plurais (por exemplo, "1 arquivo", "2 arquivos", "10 arquivos").
  • \n
\n\n

Biblioteca GNU gettext para C++

\n\n

GNU gettext é a ferramenta mais popular para internacionalização no mundo Unix/Linux, que funciona muito bem também com C++. Ela fornece uma API minimalista e utilitários poderosos para extração e gerenciamento de traduções.

\n\n

Instalação e configuração

\n\n

Para usar gettext em um projeto C++, é necessário instalar o pacote libintl e incluir o arquivo de cabeçalho:

\n\n
#include <libintl.h>\n#include <locale.h>\n\n#define _(STRING) gettext(STRING)
\n\n

Exemplo de uso básico

\n\n
#include <iostream>\n#include <libintl.h>\n#include <locale.h>\n\nint main() {\n    setlocale(LC_ALL, "");\n    bindtextdomain("myapp", "./locale");\n    textdomain("myapp");\n\n    std::cout << _("Olá, mundo!") << std::endl;\n    std::cout << _("Arquivo não encontrado") << std::endl;\n    return 0;\n}
\n\n

Criação de arquivos de tradução

\n\n

O processo inclui três etapas:

\n\n
    \n
  1. Extração de strings: xgettext --keyword=_ main.cpp -o messages.po
  2. \n
  3. Edição do arquivo .po — adição de traduções manualmente ou via Poedit.
  4. \n
  5. Compilação para .mo: msgfmt messages.po -o locale/pt_BR/LC_MESSAGES/myapp.mo
  6. \n
\n\n

Suporte a pluralização

\n\n

Gettext suporta formas plurais através da função ngettext:

\n\n
int count = 5;\nprintf(ngettext("%d arquivo deletado", "%d arquivos deletados", count), count);
\n\n

Biblioteca ICU (International Components for Unicode)

\n\n

ICU é uma poderosa biblioteca da IBM, que fornece um conjunto completo de ferramentas para internacionalização: suporte a Unicode, ordenação com reconhecimento de locale, formatação de números, datas, moedas, trabalho com fusos horários e muito mais. Para C++, é usada a API C++ do pacote icu4c.

\n\n

Instalação do ICU

\n\n

No Ubuntu/Debian: sudo apt install libicu-dev
\nNo macOS: brew install icu4c

\n\n

Formatação de números e datas

\n\n
#include <unicode/numfmt.h>\n#include <unicode/datefmt.h>\n#include <iostream>\n\nint main() {\n    // Formatação de número para o locale pt_BR\n    icu::UnicodeString pattern;\n    icu::NumberFormat* fmt = icu::NumberFormat::createInstance(\n        icu::Locale("pt", "BR"), status);\n    icu::UnicodeString result;\n    fmt->format(1234567.89, result);\n    \n    std::string utf8;\n    result.toUTF8String(utf8);\n    std::cout << "Número: " << utf8 << std::endl; // 1                    

Recommendations