stringtranslate.com

obtener texto

En informática , gettext es un sistema de internacionalización y localización (i18n y l10n) que se utiliza habitualmente para escribir programas multilingües en sistemas operativos informáticos similares a Unix . Uno de los principales beneficios de gettext es que separa la programación de la traducción. [4] La implementación más utilizada de gettext es GNU gettext , [5] publicada por el Proyecto GNU en 1995. La biblioteca de tiempo de ejecución es libintl . gettext proporciona una opción para utilizar diferentes cadenas para cualquier número de formas plurales de sustantivos, pero esta característica no tiene soporte para el 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). [6]

Historia

Inicialmente, POSIX no proporcionaba ningún medio para localizar mensajes. A finales de los años 1980 se plantearon dos propuestas: el gettext de Uniforum de 1988 y el catgets de X/Open de 1989 (XPG-3 § 5). Sun Microsystems implementó el primer gettext en 1993. [1] Los desarrolladores de Unix y POSIX nunca se pusieron de acuerdo sobre qué tipo de interfaz utilizar (la otra opción es el catgets de X/Open), por lo que muchas bibliotecas de C , incluida glibc , implementaron ambos. [7] En agosto de 2019 , si gettext debería ser parte de POSIX seguía siendo un punto de debate en el Grupo Austin , a pesar de que su antiguo enemigo ya ha caído en desuso. Las preocupaciones citadas incluían su dependencia de la configuración regional establecida por el sistema (una variable global sujeta a problemas de subprocesamiento múltiple) y su compatibilidad con extensiones más nuevas del lenguaje C que involucran cadenas anchas. [8]

El Proyecto GNU decidió que el enfoque de mensaje como clave de gettext es más simple y más amigable. (La mayoría de los otros sistemas, incluido catgets, requieren que el desarrollador proponga nombres de "clave" para cada cadena). [9] Lanzaron GNU gettext, una implementación de software libre del sistema en 1995. [2] Gettext, GNU o no, ha sido portado desde entonces a muchos lenguajes de programación. [10] La simplicidad de po y el amplio soporte de editores incluso llevaron a su adopción en contextos no programáticos para documentos de texto o como un intermedio entre otros formatos de localización, con conversores como po4a (po para cualquier cosa) y Translate Toolkit surgiendo para proporcionar dicho puente. [11] [12]

Operación

Programación

Flujo de trabajo típico de gettext. La instancia de.po de 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 del código, esta función suele tener el siguiente alias : [13]_

printf ( gettext ( "Mi nombre es %s. \n " ), mi_nombre ); printf ( _ ( "Mi nombre es %s. \n " ), mi_nombre ); // igual, pero más corto   

gettext()Luego, utiliza las cadenas suministradas como claves para buscar traducciones y devolverá la cadena original cuando no haya ninguna traducción disponible. Esto contrasta con POSIX catgets() , [14] AmigaOS GetString() , [15] o Microsoft Windows LoadString() , donde se utiliza un identificador programático (a menudo un 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 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 sugerencias 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í:

/// TRADUCTORS: %s contiene el nombre del usuario tal como se especifica en Preferencias printf ( _ ( "Mi nombre es %s. \n " ), my_name ); 

xgettextse ejecuta usando el comando:

obtener texto -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 ):

#. TRADUCTORS: %s contiene el nombre del usuario tal 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 muchas de las mismas funciones que gettext proporciona en lenguajes similares. [16] GNU bash también tiene una construcción simplificada $"msgid"para la función simple gettext, aunque depende de la biblioteca C para proporcionar una gettext()función. [17]

Traductorio

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

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

Esto creará un fr.poarchivo . 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  "Me llamo %s.\n"

Finalmente, los archivos .po se compilan msgfmten archivos binarios .mo(Machine Object). GNU gettext puede utilizar su propia extensión de nombre de archivo .gmoen sistemas con otra implementación de gettext. [19] Estos ya están listos para su distribución con el paquete de software.

GNU msgfmttambié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 del lenguaje distintos de MO; [20] el equivalente de X/Open es gencat.

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 msgunfmtse pueden compilar archivos de forma inversa .moy existen muchas otras utilidades para el procesamiento por lotes.

Correr

El usuario, en sistemas de tipo Unix , establece la variable de entorno LC_MESSAGES y el programa mostrará cadenas en el idioma seleccionado, si existe un .moarchivo para ello.

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

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, número entero printf ( ngettext ( "%d mensaje traducido" , "%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 utiliza el idioma, que normalmente se especifica mediante un operador ternario de estilo C. Supongamos que queremos traducir al idioma esloveno :

msgid  "" msgstr  "" "..." " Idioma: sl\n" " Formas plurales: nplurales=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 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 reglas de referencia para los idiomas en plural . [22] msginit también rellena previamente la regla apropiada al crear un archivo para un idioma específico. [18]

Implementaciones

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

GNU gettext tiene soporte nativo para Objective-C, pero aún no tiene soporte para el lenguaje de programación Swift . Una implementación de gettext que se usa comúnmente en estas plataformas Cocoa es POLocalizedString. [32] El equipo de Microsoft Outlook para iOS también proporciona una biblioteca LocalizedStringsKit con una API similar a gettext. [33]

Véase también

Referencias

  1. ^ ab "Acerca de gettext". gnu.org . Consultado el 9 de mayo de 2024 .
  2. ^ 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: URL no apta ( enlace )
  3. ^ Bruno Haible (22 de febrero de 2024). «GNU gettext 0.22.5 publicado» . Consultado el 7 de marzo de 2024 .
  4. ^ Martindale, Linda (1 de noviembre de 2002). "Bridging the Digital Divide in South Africa | Linux Journal". linuxjournal.com . Linux Journal . Archivado desde el original el 17 de septiembre de 2019 . Consultado el 17 de septiembre de 2019 .
  5. ^ Tykhomyrov, Olexiy Ye (1 de noviembre de 2002). "Introducción a la programación internacionalizada | Linux Journal". linuxjournal.com . Linux Journal . Archivado desde el original el 17 de septiembre de 2019 . Consultado el 17 de septiembre de 2019 .
  6. ^ ab "Cómo traducir con archivos PO y POT de GetText". Icanlocalize.com . Consultado el 3 de abril de 2016 .
  7. ^ "Traducción de mensajes". La biblioteca C de GNU .
  8. ^ "0001122: POSIX debería incluir gettext() y similares - Austin Group Defect Tracker". Austin Group Defect Tracker .
  9. ^ "La visión del programador". gettext 0.10.35 . 30 de abril de 1998.
  10. ^ "Utilidades GNU gettext: Lista de lenguajes de programación".
  11. ^ "po4a". po4a.org .
  12. ^ "El conjunto de herramientas esencial para los ingenieros de localización". Translate Toolkit .
  13. ^ "Utilidades GNU gettext: cómo aparecen las marcas en las fuentes". www.gnu.org . Archivado desde el original el 25 de marzo de 2024 . Consultado el 3 de abril de 2024 .
  14. ^ "Acerca de catgets". gnu.org . Consultado el 24 de octubre de 2017 .
  15. ^ "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 .
  16. ^ "Utilidades GNU gettext: sh".
  17. ^ "Utilidades GNU gettext: bash".
  18. ^ ab "Utilidades GNU gettext: Archivos PO". Gnu.org . Consultado el 3 de abril de 2016 .
  19. ^ "Archivos que transmiten traducciones". Gnu.org . Consultado el 22 de abril de 2014 .
  20. ^ "Invocación de msgfmt". Utilidades GNU gettext .
  21. ^ "Utilidades GNU gettext: variables de entorno local". Gnu.org . Consultado el 3 de abril de 2016 .
  22. ^ "Reglas del plural del lenguaje". unicode.org .
  23. ^ "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 .
  24. ^ "turquoiseowl/i18n: Internacionalización inteligente para ASP.NET". GitHub.com . Consultado el 3 de abril de 2016 .
  25. ^ "NGettext.Wpf - Soporte de internacionalización adecuado para WPF (a través de NGettext)". GitHub . 16 de agosto de 2019.
  26. ^ "libintl-perl - Una biblioteca de internacionalización para Perl que pretende ser compatible con el sistema de traducción de mensajes de Uniforum, tal como se implementa, por ejemplo, en GNU Gettext". github.com . Consultado el 14 de septiembre de 2017 .
  27. ^ "Gettext". php.net . Consultado el 24 de octubre de 2017 .
  28. ^ "gettext – Servicios de internacionalización multilingüe – Documentación de Python 3.7.0". docs.python.org . Consultado el 21 de septiembre de 2018 .
  29. ^ "gettext: Traducir mensajes de texto". rdrr.io . Consultado el 13 de noviembre de 2021 .
  30. ^ "makkarpov/scalingua: una biblioteca de internacionalización simple similar a gettext para Scala". github.com . Consultado el 28 de abril de 2016 .
  31. ^ "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 .
  32. ^ "hulab/POLocalizedString: gettext para iOS/OS X/watchOS/tvOS". GitHub . hulab. 19 de septiembre de 2019.
  33. ^ "microsoft/LocalizedStringKit: Generar archivos .strings directamente desde el código". GitHub . Microsoft. 12 de febrero de 2020.

Enlaces externos