stringtranslate.com

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. [3] La implementación más comúnmente utilizada de gettext es GNU gettext , [4] 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). [5]

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. [6] 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. [7]

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 "clave" para cada cadena). [8] Lanzaron GNU gettext, una implementación de software libre del sistema en 1995. [1] Gettext, GNU o no , desde entonces ha sido portado a muchos lenguajes de programación. [9] 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 un intermediario entre otros formatos de localización, con convertidores como po4a (po para cualquier cosa) y Translate Toolkit surgiendo para proporcionar tal puente. [10] [11]

Operación

Programación

Flujo de trabajo típico de gettext. La instancia de.po a la izquierda muestra una "renovación" de las traducciones mediante msgmerge.

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 comúnmente tiene el alias de _[ cita necesaria ] :

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 traducción disponible. Esto contrasta con POSIX catgets() , [12] AmigaOS GetString() , [13] o Microsoft Windows LoadString() , donde se utiliza una ID programática (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 cgettext()esa que aceptan una cadena de "contexto" adicional.

xgettextse ejecuta en las fuentes para producir un .potarchivo (Plantilla de objetos portátiles), 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 ); 

xgettextse 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 con 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.shbiblioteca que se puede incluir y que proporciona las mismas funciones que gettext proporciona en lenguajes similares. [14] 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. [15]

Traductorio

El traductor obtiene un .poarchivo (objeto portátil) de la plantilla utilizando el msginitprograma y luego completa las traducciones. [16] msginit inicializa las traducciones, por lo que, por ejemplo, para una traducción al idioma francés, el comando a ejecutar sería: [5]

msginit --locale=fr --input=nombre.pot

Esto creará fr.po. Luego, el traductor 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 .poarchivos. 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 en archivos msgfmtbinarios (Machine Object). .moGNU gettext puede usar su propia extensión de nombre de archivo .gmoen sistemas con otra implementación de gettext. [17] Ahora están listos para su distribución con el paquete de software.

GNU msgfmttambién puede realizar algunas comprobaciones relevantes para la cadena de formato utilizada por el lenguaje de programación. También permite la salida a formatos específicos del idioma distintos de MO; [18] el equivalente de X/Opengencat es .

En fases posteriores del flujo de trabajo de desarrollo, msgmergese puede utilizar para "actualizar" una traducción antigua a una plantilla más nueva. También hay archivos msgunfmtpara la compilación inversa .moy muchas otras utilidades para el procesamiento por lotes.

Correr

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 .moarchivo para ello.

Los usuarios de variantes de GNU también pueden utilizar la variable de entorno LANGUAGE. Su principal diferencia con la variable Unix es que admite varios idiomas, separados por dos puntos, como respaldo. [19]

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 el ejemplo de código:

// parámetros: inglés singular, inglés plural, recuento de enteros printf ( ngettext ( "%d mensajes traducidos" , "%d 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 lenguaje, generalmente especificada mediante un operador ternario estilo C. Supongamos que queremos traducir al idioma esloveno :

msgid  "" msgstr  "" " ..." " Idioma: sl\n" " Formas plurales: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n% 100==3 || n%100==4 ? 3 : 0);\n"

Como ahora hay cuatro formas plurales, el po final quedarí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 prevedena sporočili" msgstr[ 3 ]  "%d prevedena sporočila"

El consorcio Unicode proporciona reglas plurales de referencia para los idiomas . [20] msginit también completa previamente la regla apropiada al crear un archivo para un idioma específico. [dieciséis]

Implementaciones

Además de C , gettext tiene las siguientes implementaciones: C# tanto para ASP.NET [21] [22] como para WPF , [23] Perl , [24] PHP , [25] Python , [26] R , [27] Scala , [28 ] y Node.js. [29]

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. [30] El equipo de Microsoft Outlook para iOS también proporciona una biblioteca LocalizedStringsKit con una API similar a gettext. [31]

Ver también

Referencias

  1. ^ ab "¿Historia de gettext() y otros? - comp.unix.solaris". Compgroups.net . Archivado desde el original el 23 de marzo de 2012 . Consultado el 3 de abril de 2016 .{{cite web}}: CS1 maint: unfit URL (link)
  2. ^ "Índice de /gnu/gettext".
  3. ^ Martindale, Linda (1 de noviembre de 2002). "Reducir 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 .
  4. ^ 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 .
  5. ^ ab "Cómo traducir con archivos GetText PO y POT". Icanlocalize.com . Consultado el 3 de abril de 2016 .
  6. ^ "Traducción de mensajes". La biblioteca GNU C.
  7. ^ "0001122: POSIX debe incluir gettext() y amigos - Austin Group Defect Tracker". Rastreador de defectos del grupo Austin .
  8. ^ "La visión del programador". obtener texto 0.10.35 . 30 de abril de 1998.
  9. ^ "Utilidades GNU gettext: lista de lenguajes de programación".
  10. ^ "po4a". po4a.org .
  11. ^ "El conjunto de herramientas esencial para los ingenieros de localización". Traducir kit de herramientas .
  12. ^ "Acerca de los gatos". gnu.org . Consultado el 24 de octubre de 2017 .
  13. ^ "Manual de AmigaOS: módulos y paquetes de Python - Wiki de documentación de AmigaOS". wiki.amigaos.net . Consultado el 9 de julio de 2023 .
  14. ^ "Utilidades GNU gettext: sh".
  15. ^ "Utilidades GNU gettext: bash".
  16. ^ ab "Utilidades GNU gettext: archivos PO". Gnu.org . Consultado el 3 de abril de 2016 .
  17. ^ "Archivos que transmiten traducciones". Gnu.org . Consultado el 22 de abril de 2014 .
  18. ^ "Invocación msgfmt". Utilidades GNU gettext .
  19. ^ "Utilidades GNU gettext: variables de entorno local". Gnu.org . Consultado el 3 de abril de 2016 .
  20. ^ "Reglas del plural del lenguaje". unicode.org .
  21. ^ "Google Code Archive: almacenamiento a largo plazo para el alojamiento de proyectos de Google Code". Código.google.com . Consultado el 3 de abril de 2016 .
  22. ^ "turquoiseowl/i18n: internacionalización inteligente para ASP.NET". GitHub.com . Consultado el 3 de abril de 2016 .
  23. ^ "NGettext.Wpf: soporte de internacionalización adecuado para WPF (a través de NGettext)". GitHub . 16 de agosto de 2019.
  24. ^ "libintl-perl: una biblioteca de internacionalización para Perl que pretende ser compatible con el sistema de traducción de mensajes Uniforum implementado, por ejemplo, en GNU Gettext". github.com . Consultado el 14 de septiembre de 2017 .
  25. ^ "Obtener texto". php.net . Consultado el 24 de octubre de 2017 .
  26. ^ "gettext - Servicios de internacionalización multilingüe - Documentación de Python 3.7.0". docs.python.org . Consultado el 21 de septiembre de 2018 .
  27. ^ "gettext: traducir mensajes de texto". rdrr.io. _ Consultado el 13 de noviembre de 2021 .
  28. ^ "makkarpov/scalingua: una biblioteca de internacionalización sencilla similar a gettext para Scala". github.com . Consultado el 28 de abril de 2016 .
  29. ^ "DanielBaulig/node-gettext: una adaptación de la biblioteca Javascript Gettext de Joshua I. Miller para node.js". GitHub.com . Consultado el 3 de abril de 2016 .
  30. ^ "hulab/POLocalizedString: gettext para iOS/OS X/watchOS/tvOS". GitHub . hulab. 19 de septiembre de 2019.
  31. ^ "microsoft/LocalizedStringKit: genere archivos .strings directamente desde su código". GitHub . Microsoft. 12 de febrero de 2020.

enlaces externos