Internacionalização (i18n) em C++: do básico às técnicas avançadas
\n\nInternacionalizaçã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\nConceitos principais de i18n
\n\nAntes 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
Biblioteca GNU gettext para C++
\n\nGNU 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\nInstalação e configuração
\n\nPara usar gettext em um projeto C++, é necessário instalar o pacote libintl e incluir o arquivo de cabeçalho:
#include <libintl.h>\n#include <locale.h>\n\n#define _(STRING) gettext(STRING)\n\nExemplo 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\nCriação de arquivos de tradução
\n\nO processo inclui três etapas:
\n\n- \n
- Extração de strings:
xgettext --keyword=_ main.cpp -o messages.po\n - Edição do arquivo .po — adição de traduções manualmente ou via Poedit. \n
- Compilação para .mo:
msgfmt messages.po -o locale/pt_BR/LC_MESSAGES/myapp.mo\n
Suporte a pluralização
\n\nGettext suporta formas plurais através da função ngettext:
int count = 5;\nprintf(ngettext("%d arquivo deletado", "%d arquivos deletados", count), count);\n\nBiblioteca ICU (International Components for Unicode)
\n\nICU é 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.
Instalação do ICU
\n\nNo Ubuntu/Debian: sudo apt install libicu-dev
\nNo macOS: brew install icu4c
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 Também na biblioteca
GraphQL em Node.js: Guia Completo da Biblioteca graphql-http
Autorização e Autenticação em C++: Bibliotecas e Exemplos Práticos
Cliente HTTP para C# (.NET): top bibliotecas para trabalhar com requisições web