Internacionalización (i18n) en C++: guía completa

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



La internacionalización (abreviada i18n — del inglés "internationalization", donde 18 representa el número de letras entre la primera 'i' y la última 'n') es el proceso de diseñar software de manera que pueda adaptarse a diferentes idiomas y características regionales sin modificar el código. En C++, esta tarea tiene su propia especificidad: el lenguaje no proporciona herramientas integradas para trabajar con traducciones, pero existen varias bibliotecas potentes que resuelven este problema.



¿Por qué es importante i18n para proyectos en C++?



Las aplicaciones modernas en C++ rara vez se limitan a un solo idioma. Programas de escritorio, juegos, soluciones de servidor — todos requieren soporte para múltiples configuraciones regionales. Los principales problemas que resuelve i18n son:



  • Trabajo con codificaciones — transición de ASCII a UTF-8, UTF-16 y otras codificaciones multibyte;
  • Formateo de números, fechas y monedas — en diferentes países se utilizan diferentes separadores y formatos;
  • Orden de las palabras en las oraciones — el ruso requiere declinaciones, mientras que el inglés requiere artículos;
  • Pluralización — las reglas para formar el plural varían (en ruso hay 3 formas, en inglés 2).


Bibliotecas principales para i18n en C++



1. GNU gettext — el clásico del género



GNU gettext es la biblioteca más popular para internacionalización en C y C++. Utiliza archivos de traducción separados (.po/.mo) y permite aislar las cadenas del código.



Ejemplo básico de uso:



#include <iostream>#include <libintl.h>#include <locale.h>

#define _(str) gettext(str)

int main() { setlocale(LC_ALL, ""); bindtextdomain("myapp", "./locale"); textdomain("myapp");

std::cout << _("Hello, world!") << std::endl; std::cout << _("File not found") << std::endl; return 0;}


Para extraer cadenas se utiliza la utilidad xgettext, que escanea el código fuente y crea un archivo .pot. Luego, los traductores trabajan con los archivos .po.



Ventajas:

  • Simplicidad de integración;
  • Comunidad enorme y múltiples herramientas (Poedit, Lokalize);
  • Soporte para pluralización mediante ngettext();
  • Funciona en cualquier plataforma.


Desventajas:

  • No admite traducciones contextuales sin trucos adicionales;
  • Requiere una etapa de compilación separada para generar archivos .mo.


2. Boost.Locale — enfoque moderno de C++



La biblioteca Boost.Locale proporciona una interfaz más moderna y type-safe. Está construida sobre ICU (International Components for Unicode) o configuraciones regionales del sistema.



Ejemplo de trabajo con traducciones:



#include <boost/locale.hpp>#include <iostream>

int main() { using namespace boost::locale; generator gen; std::locale loc = gen("ru_RU.UTF-8"); std::locale::global(loc); // Creamos un traductor translator tr; std::cout << tr("Hello, world!") << std::endl; std::cout << tr("Today is {1}", "Monday") << std::endl; // Pluralización std::cout << tr("You have {1} message", "You have {1} messages", 5) << std::endl; return 0;}


Ventajas:

  • Soporte nativo para UTF-8;
  • Formateo de fechas, números y monedas;
  • Soporte para traducciones contextuales;
  • Funciona con std::string y std::wstring.


Desventajas:

  • Dependencia de Boost (biblioteca pesada);
  • Menos herramientas para traductores.


3. ICU — estándar industrial



ICU (Intern

Recommendations