Obtener texto
En informática, gettext es un sistema de internacionalización y localización (i18n y l10n) comúnmente utilizado para escribir programas multilingües en sistemas operativos informáticos tipo Unix. Uno de los principales beneficios de gettext es que separa la programación de la traducción. La implementación más comúnmente utilizada de gettext es GNU gettext, lanzada por el Proyecto GNU en 1995. La biblioteca de tiempo de ejecución es libintl. gettext proporciona una opción para usar diferentes cadenas para cualquier número de formas plurales de sustantivos, pero esta característica no admite género gramatical. Las principales extensiones de nombre de archivo utilizadas por este sistema son.POT (Portable Object Template),.PO (Portable Object) y.MO (Machine Object).
Historia
Inicialmente, POSIX no proporcionaba ningún medio para localizar mensajes. A finales de la década de 1980 se plantearon dos propuestas, el gettext Uniforum de 1988 y el catgets X/Open de 1989 (XPG-3 § 5). Sun Microsystems implementó el primer gettext en 1993. Los desarrolladores de Unix y POSIX nunca se pusieron de acuerdo sobre qué tipo de interfaz usar (la otra opción son los catgets X/Open), por lo que muchas bibliotecas C, incluida glibc, implementaron ambas. En agosto de 2019, si gettext debería ser parte de POSIX todavía era un punto de debate en el Grupo Austin, a pesar de que su antiguo enemigo ya había dejado de usarse. Las preocupaciones citadas incluyeron su dependencia de la configuración regional del sistema (una variable global sujeta a problemas de subprocesos múltiples) y su soporte para extensiones de lenguaje C más nuevas que involucran cadenas anchas.
El Proyecto GNU decidió que el enfoque de mensaje como clave de gettext es más simple y amigable. (La mayoría de los demás sistemas, incluido catgets, requieren que el desarrollador proporcione nombres de "clave" para cada cadena). Lanzaron GNU gettext, una implementación de software libre del sistema en 1995. Gettext, GNU o no, Desde entonces ha sido portado a muchos lenguajes de programación. La simplicidad de po y el soporte generalizado del editor incluso llevaron a su adopción en contextos no relacionados con programas para documentos de texto o como intermediario entre otros formatos de localización, con convertidores como po4a (po para cualquier cosa) y Translate Toolkit surgiendo para proporcionar dicho puente.
Operación
Programación

La interfaz básica de gettext es la gettext(const char*)
función, que acepta una cadena que el usuario verá en el idioma original, generalmente inglés. Para ahorrar tiempo de escritura y reducir el desorden de código, esta función es comúnmente conocida _
:
printf()gettext()"Mi nombre es %s.\n"), my_name);printf()¿Qué?()"Mi nombre es %s.\n"), my_name); // mismo, pero más corto
gettext()
luego usa las cadenas proporcionadas como claves para buscar traducciones y devolverá la cadena original cuando no haya traducción disponible. Esto contrasta con POSIX catgets()
, AmigaOS GetString()
o Microsoft Windows LoadString()
, donde un ID programático (a menudo un número entero ) se utiliza. Para manejar el caso en el que el mismo texto en el idioma original puede tener diferentes significados, gettext tiene funciones como cgettext()
que aceptan un "contexto" cadena.
xgettext
se ejecuta en las fuentes para producir un archivo .pot
(plantilla de objeto portátil), que contiene una lista de todas las cadenas traducibles extraídas de las fuentes. Los comentarios que comienzan con ///
se utilizan para dar pistas a los traductores, aunque también se pueden configurar otros prefijos para limitar aún más el alcance. Uno de esos prefijos comunes es TRANSLATORS:
.
Por ejemplo, un archivo de entrada con un comentario podría verse así:
/// TRANSLATORES: %s contiene el nombre del usuario como se especifica en Preferenciasprintf()¿Qué?()"Mi nombre es %s.\n"), my_name);
xgettext
se ejecuta usando el comando:
xgettext -c /
El archivo resultante.pot se ve así con el comentario (tenga en cuenta que xgettext reconoce la cadena como una cadena con formato printf en lenguaje C):
#. TRANSLATORES: %s contiene el nombre del usuario como se especifica en Preferencias#, c-format#: src/name.c:36msgid Mi nombre es %s.msgstr "
En el script de shell POSIX, gettext proporciona una biblioteca gettext.sh
que se puede incluir y que proporciona las mismas funciones que gettext proporciona en lenguajes similares. GNU bash también tiene una construcción simplificada $"msgid"
para la función gettext simple, aunque depende de la biblioteca C para proporcionar una función gettext()
.
Traductor
El traductor deriva un .po
(Objeto portátil) archivo de la plantilla utilizando el msginit
programa, luego llena las traducciones. msginit
inicializa las traducciones, por ejemplo, para una traducción al idioma francés, el comando a ejecutar sería:
msginit --locale=fr --input=name.pot
Esto creará fr.po
. El traductor entonces edita el archivo resultante, ya sea a mano o con una herramienta de traducción como Poedit, o Emacs con su modo de edición para .po
archivos. Una entrada editada parecerá:
#: src/name.c:36msgid Mi nombre es %s.msgstr "Je m'appelle %s.\n"
Finalmente, los archivos.po se compilan con msgfmt
en binario .mo
Archivos. GNU gettext puede utilizar su propia extensión de nombre de archivo .gmo
sobre sistemas con otra implementación de gettext. Estos están listos para su distribución con el paquete de software.
GNU msgfmt
también puede realizar algunos cheques relevantes a la cadena de formato utilizada por el lenguaje de programación. También permite la salida a formatos específicos de lenguaje distintos del MO; el equivalente X/Open es gencat
.
En fases posteriores del flujo de trabajo de desarrollo, msgmerge
se puede utilizar para "actualizar" una traducción antigua a una plantilla más nueva. También existe msgunfmt
para la compilación inversa de archivos .mo
y muchas otras utilidades para el procesamiento por lotes.
Corriendo
El usuario, en sistemas tipo Unix, establece la variable de entorno LC_MESSAGES
, y el programa mostrará cadenas en el idioma seleccionado, si hay un archivo .mo
para ello.
Los usuarios de variantes de GNU también pueden utilizar la variable de entorno LANGUAGE
en su lugar. Su principal diferencia con la variable Unix es que admite varios idiomas, separados por dos puntos, como respaldo.
Forma plural
La interfaz ngettext()
representa el recuento de un sustantivo en la cadena. Al igual que con la convención de gettext()
, a menudo se le asigna un alias N_
en el uso práctico. Considere el ejemplo de código:
// parámetros: español singular, español plural, número enteroprintf()ngettext()"Mensaje traducido", "Mensajes traducidos", n), n);
Un encabezado en la entrada ""
(cadena vacía) del archivo PO almacena algunos metadatos, uno de los cuales es la forma plural que usa el idioma, generalmente especificada usando un operador ternario estilo C. Supongamos que queremos traducir al idioma esloveno:
msgid "msgstr ""..."Idioma: sl\n""Plural-Forms: nplurals=4; plural=(n%100==1 ? 1: n%100==2 ? 2: n%100==3
Dado que ahora hay cuatro formas plurales, el po final se vería así:
#: src/msgfmt.c:876#, c-formatmsgid "Mensaje traducido"msgid_plural "Mensajes traducidos"msgstr[0] "Deprevedenih sporočil"msgstr[1] "Deprevedeno sporočilo"msgstr[2] "Deprevedeni sporočili"msgstr[3] "Deprevedena sporočila"
El consorcio Unicode proporciona reglas plurales de referencia para idiomas. msginit también completa previamente la regla apropiada al crear un archivo para un idioma específico.
Implementaciones
Además de C, gettext tiene las siguientes implementaciones: C# tanto para ASP.NET como para WPF, Perl, PHP, Python, R, Scala y Node.js.
GNU gettext tiene soporte nativo para Objective-C, pero aún no hay soporte para el lenguaje de programación Swift. Una implementación de gettext comúnmente utilizada en estas plataformas Cocoa es POLocalizedString. El equipo de Microsoft Outlook para iOS también proporciona una biblioteca LocalizedStringsKit con una API similar a gettext.