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 de computadora similares a Unix . Uno de los principales beneficios de gettext es que separa la programación de la traducción. [3] La implementación más comúnmente utilizada de gettext es GNU gettext , [4] lanzado por el Proyecto GNU en 1995. La biblioteca en 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 no tiene soporte para el género gramatical.
Autor (es) original (es) | Microsistemas solares |
---|---|
Desarrollador (es) | varios |
Versión inicial | 1990 [1] |
Lanzamiento estable | 0,21 [2] / 27 de julio de 2020 |
Repositorio | varios basados en OpenSolaris y GNU gettext |
Sistema operativo | Multiplataforma |
Tipo | Internacionalización y localización |
Licencia | Varias licencias de software gratuito |
Sitio web | www |
Historia
Inicialmente, POSIX no proporcionaba ningún medio para localizar mensajes. Se plantearon dos propuestas a finales de la década de 1980, el gettext Uniforum de 1988 y los 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. [5] A agosto de 2019[actualizar], si gettext debería ser parte de POSIX era todavía un tema de debate en el Grupo Austin , a pesar del hecho de que su antiguo enemigo ya ha caído en desuso. 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. [6]
El Proyecto GNU decidió que el enfoque de mensaje como clave de gettext es más simple y amigable. (La mayoría de los otros sistemas, incluidos catgets, requieren que el desarrollador cree nombres de "claves" para cada cadena). [7] Lanzaron GNU gettext, una implementación de software libre del sistema en 1995. [1] Gettext, GNU o no , desde entonces se ha adaptado a muchos lenguajes de programación. [8] La simplicidad de po y el soporte generalizado del editor incluso conducen a su adopción en contextos no programáticos para documentos de texto o como un intermedio entre otros formatos de localización, con convertidores como po4a (po para cualquier cosa) y Translate Toolkit emergiendo para proporcionar tal puente. [9] [10]
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 del código, esta función suele tener el alias de _
:
printf ( gettext ( "Mi nombre es% s. \ n " ), mi_nombre ); printf ( _ ( "Mi nombre es% s. \ n " ), mi_nombre ); // igual, pero más corto
gettext()
luego usa las cadenas proporcionadas como claves para buscar traducciones y devolverá la cadena original cuando no haya ninguna traducción disponible. Esto contrasta con POSIX catgets()
, [11] AmigaOS GetString()
o Microsoft Windows LoadString()
donde se usa un ID de programación (a menudo un número entero). Para manejar el caso en el que el mismo texto en el idioma original puede tener diferentes significados, gettext tiene funciones como las cgettext()
que aceptan una cadena de "contexto" adicional.
xgettext
se ejecuta en las fuentes para producir un .pot
archivo (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í:
/// TRADUCTORES:% s contiene el nombre del usuario como se especifica en Preferencias printf ( _ ( "Mi nombre es% s. \ N " ), my_name );
xgettext
se ejecuta usando el comando:
xgettext -c /
El archivo .pot resultante se ve así con el comentario (tenga en cuenta que xgettext reconoce la cadena como una cadena de formato printf en lenguaje C ):
#. TRADUCTORES:% s contiene el nombre del usuario como se especifica en Preferencias #, formato c #: src / name.c: 36 msgid "Mi nombre es% s. \ N" msgstr ""
En el script de shell POSIX , gettext proporciona una gettext.sh
biblioteca que se puede incluir y que proporciona las mismas funciones que gettext proporciona en lenguajes similares. [12] 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 gettext()
función. [13]
Traductorio
El traductor deriva un .po
archivo (Objeto portátil) de la plantilla usando el msginit
programa, luego completa las traducciones. [14] msginit
inicializa las traducciones, por lo que, por ejemplo, para una traducción al francés, el comando a ejecutar sería: [15]
msginit --locale = fr --input = nombre.pot
Esto creará fr.po
. El traductor luego 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 de .po
archivos. Una entrada editada se verá así:
#: src / name.c: 36 msgid "Mi nombre es% s. \ n" msgstr "Je m'appelle% s. \ n"
Finalmente, los archivos .po se compilan msgfmt
en archivos binarios .mo
(objeto de máquina). GNU gettext puede usar su propia extensión de nombre de archivo .gmo
en sistemas con otra implementación de gettext. [16] Ahora están listos para su distribución con el paquete de software.
GNU msgfmt
también puede realizar algunas comprobaciones relacionadas con la cadena de formato utilizada por el lenguaje de programación. También permite la salida a formatos específicos de idioma distintos de MO; [17] 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 .mo
archivos y muchas otras utilidades para el procesamiento por lotes.
Corriendo
El usuario, en sistemas de tipo Unix, establece la variable de entorno LC_MESSAGES
y el programa mostrará cadenas en el idioma seleccionado, si hay un .mo
archivo para ello.
Los usuarios de variantes de GNU también pueden utilizar la variable de entorno en su LANGUAGE
lugar. Su principal diferencia con la variable Unix es que admite varios idiomas, separados por dos puntos, como respaldo. [18]
Forma plural
La ngettext()
interfaz tiene en cuenta 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 la muestra de código:
// parámetros: singular en inglés, plural en inglés, recuento de enteros printf ( ngettext ( "% d mensaje traducido" , "% d mensajes traducidos" , n ), n );
Un encabezado en la ""
entrada (cadena vacía) de los almacenes de archivos PO algunos metadatos, una de las cuales es la forma plural que los usos del lenguaje, por lo general especifican utilizando un estilo de C operador ternario . Digamos que queremos traducir para el idioma esloveno :
msgid "" msgstr "" "..." " Idioma: sl \ n" " Plural-Forms: nplurals = 4; plural = (n% 100 == 1? 1: n% 100 == 2? 2: n% 100 == 3 || n% 100 == 4? 3: 0); \ n "
Dado que ahora hay cuatro formas plurales, la po final se vería así:
#: src / msgfmt.c: 876 #, formato c msgid "% d mensaje traducido" msgid_plural "% d mensajes traducidos" msgstr [ 0 ] "% d prevedenih sporočil" msgstr [ 1 ] "% d prevedeno sporočilo" msgstr [ 2 ] "% d prevedeni sporočili" msgstr [ 3 ] "% d prevedena sporočila"
El consorcio Unicode proporciona las reglas plurales de referencia para los idiomas . [19] msginit también rellena previamente la regla apropiada al crear un archivo para un idioma específico. [14]
Implementaciones
Además de C , gettext tiene las siguientes implementaciones: C # para ASP.NET [20] [21] y para WPF , [22] Perl , [23] PHP , [24] Python , [25] Scala , [26] y Node.js . [27]
GNU gettext tiene soporte nativo para Objective-C, pero todavía no hay soporte para el lenguaje de programación Swift . Una implementación de gettext comúnmente utilizada en estas plataformas Cocoa es POLocalizedString. [28] El equipo de Microsoft Outlook para iOS también proporciona una biblioteca LocalizedStringsKit con una API similar a gettext. [29]
Ver también
- traductor
- Poeditar
- Kit de herramientas de traducción
- Virtaal
- Weblate
Referencias
- ^ a b "¿Historia de gettext () et al? - comp.unix.solaris" . Compgroups.net . Consultado el 3 de abril de 2016 .
- ^ https://ftp.gnu.org/pub/gnu/gettext/
- ^ Martindale, Linda (1 de noviembre de 2002). "Cerrar la brecha digital en Sudáfrica | Linux Journal" . linuxjournal.com . Diario de Linux . Archivado desde el original el 17 de septiembre de 2019 . Consultado el 17 de septiembre de 2019 .
- ^ Tykhomyrov, Olexiy Ye (1 de noviembre de 2002). "Introducción a la Programación de Internacionalización | Linux Journal" . linuxjournal.com . Diario de Linux . Archivado desde el original el 17 de septiembre de 2019 . Consultado el 17 de septiembre de 2019 .
- ^ "Traducción de mensajes" . La Biblioteca de C de GNU .
- ^ "0001122: POSIX debe incluir gettext () y amigos - Austin Group Defect Tracker" . Rastreador de defectos del grupo Austin .
- ^ "La vista del programador" . gettext 0.10.35 . 30 de abril de 1998.
- ^ "Utilidades GNU gettext: Lista de lenguajes de programación" .
- ^ "po4a" . po4a.org .
- ^ "El kit de herramientas esencial para los ingenieros de localización" . Traducir el kit de herramientas .
- ^ "Acerca de los gatos" . gnu.org . Consultado el 24 de octubre de 2017 .
- ^ "Utilidades GNU gettext: sh" .
- ^ "Utilidades GNU gettext: bash" .
- ^ a b "Utilidades GNU gettext: archivos PO" . Gnu.org . Consultado el 3 de abril de 2016 .
- ^ "Cómo traducir con archivos GetText PO y POT" . Icanlocalize.com . Consultado el 3 de abril de 2016 .
- ^ "Archivos que transportan traducciones" . Gnu.org . Consultado el 22 de abril de 2014 .
- ^ "msgfmt Invocación" . Utilidades GNU gettext .
- ^ "Utilidades GNU gettext: Variables de entorno local" . Gnu.org . Consultado el 3 de abril de 2016 .
- ^ "Reglas del plural del lenguaje" . unicode.org .
- ^ "Archivo de código de Google - almacenamiento a largo plazo para el alojamiento de proyectos de código de Google" . Code.google.com . Consultado el 3 de abril de 2016 .
- ^ "turquoiseowl / i18n: internacionalización inteligente para ASP.NET" . GitHub.com . Consultado el 3 de abril de 2016 .
- ^ "NGettext.Wpf - Soporte de internacionalización adecuado para WPF (a través de NGettext)" .
- ^ "libintl-perl: una biblioteca de internacionalización para Perl que pretende ser compatible con el sistema de traducción de mensajes Uniforum tal como se implementa, por ejemplo, en GNU Gettext" . github.com . Consultado el 14 de septiembre de 2017 .
- ^ "Gettext" . php.net . Consultado el 24 de octubre de 2017 .
- ^ "gettext - Servicios de internacionalización multilingüe - Documentación de Python 3.7.0" . docs.python.org . Consultado el 21 de septiembre de 2018 .
- ^ "makkarpov / scalingua: una biblioteca de internacionalización simple similar a gettext para Scala" . github.com . Consultado el 28 de abril de 2016 .
- ^ "DanielBaulig / node-gettext: una adaptación de la biblioteca Gettext de Javascript de Joshua I. Miller para node.js" . GitHub.com . Consultado el 3 de abril de 2016 .
- ^ "hulab / POLocalizedString: gettext para iOS / OS X / watchOS / tvOS" . GitHub . hulab. 19 de septiembre de 2019.
- ^ "microsoft / LocalizedStringKit: Genere archivos .strings directamente desde su código" . GitHub . Microsoft. 12 de febrero de 2020.
enlaces externos
- Sitio oficial de GNU gettext