Internacionalización (i18n) en C++: guía completa con gettext e ICU

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Internacionalización (i18n) en C++: desde lo básico hasta técnicas avanzadas

\n\n

La internacionalización (abreviada i18n — de «internationalization», donde 18 es el número de letras entre la primera y la última) es el proceso de diseñar software de manera que pueda adaptarse fácilmente a diferentes idiomas y regiones sin realizar cambios en el código fuente. Para el lenguaje C++, que se utiliza tradicionalmente en aplicaciones de alto rendimiento y multiplataforma, una implementación correcta de i18n es fundamental. En este artículo, exploraremos los enfoques principales, las bibliotecas y ejemplos prácticos para localizar aplicaciones C++.

\n\n

Conceptos básicos de i18n

\n\n

Antes de pasar a las herramientas, es importante comprender los conceptos clave:

\n\n
    \n
  • Localización (l10n) — adaptación del texto traducido, formatos de fecha, números y monedas para una región específica.
  • \n
  • Locale — conjunto de reglas (idioma, región, codificación) que define el formato de los datos.
  • \n
  • Unicode y UTF-8 — estándar de codificación de caracteres, obligatorio para la internacionalización moderna.
  • \n
  • Pluralización — visualización correcta de las formas plurales (por ejemplo, «1 archivo», «2 archivos», «10 archivos»).
  • \n
\n\n

Biblioteca GNU gettext para C++

\n\n

GNU gettext es la herramienta más popular para la internacionalización en el mundo Unix/Linux, y funciona muy bien también con C++. Proporciona una API minimalista y potentes utilidades para extraer y gestionar traducciones.

\n\n

Instalación y configuración

\n\n

Para usar gettext en un proyecto C++, es necesario instalar el paquete libintl e incluir el archivo de cabecera:

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

Ejemplo 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 << _("¡Hola, mundo!") << std::endl;\n    std::cout << _("Archivo no encontrado") << std::endl;\n    return 0;\n}
\n\n

Creación de archivos de traducción

\n\n

El proceso incluye tres pasos:

\n\n
    \n
  1. Extracción de cadenas: xgettext --keyword=_ main.cpp -o messages.po
  2. \n
  3. Edición del archivo .po — añadir traducciones manualmente o mediante Poedit.
  4. \n
  5. Compilación a .mo: msgfmt messages.po -o locale/es/LC_MESSAGES/myapp.mo
  6. \n
\n\n

Soporte de pluralización

\n\n

Gettext admite formas plurales mediante la función ngettext:

\n\n
int count = 5;\nprintf(ngettext("%d archivo eliminado", "%d archivos eliminados", count), count);
\n\n

Biblioteca ICU (International Components for Unicode)

\n\n

ICU es una potente biblioteca de IBM que proporciona un conjunto completo de herramientas para la internacionalización: soporte Unicode, ordenación según locale, formato de números, fechas, monedas, manejo de zonas horarias y mucho más. Para C++, se utiliza la API de C++ del paquete icu4c.

\n\n

Instalación de ICU

\n\n

En Ubuntu/Debian: sudo apt install libicu-dev
\nEn macOS: brew install icu4c

\n\n

Formato de números y fechas

\n\n
#include <unicode/numfmt.h>\n#include <unicode/datefmt.h>\n#include <iostream>\n\nint main() {\n    // Formateo de número para el locale es_ES\n    icu::UnicodeString pattern;\n    icu::NumberFormat* fmt = icu::NumberFormat::createInstance(\n        icu::Locale("es", "ES"), 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