Este artículo tiene varios problemas. Ayúdenos a mejorarlo o a discutir estos problemas en la página de discusión . ( Aprenda cómo y cuándo eliminar estos mensajes )
|
Autor(es) original(es) | Microsistemas Sun [1] |
---|---|
Desarrollador(es) | varios |
Lanzamiento inicial | 1990 ( 1990 ) | [2]
Versión estable | 0,22,5 [3] / 21 de febrero de 2024 ( 21 de febrero de 2024 ) |
Repositorio | Varios basados en OpenSolaris y GNU gettext |
Sistema operativo | Multiplataforma |
Tipo | Internacionalización y localización |
Licencia | Varias licencias de software libre |
Sitio web | www.gnu.org/software/gettext/ |
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]
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 [actualizar], 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]
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.
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 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 );
xgettext
se 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.sh
biblioteca 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]
El traductor deriva un .po
archivo (objeto portátil) de la plantilla utilizando el msginit
programa 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.po
archivo . 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 .po
archivos. 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 msgfmt
en archivos binarios .mo
(Machine Object). GNU gettext puede utilizar su propia extensión de nombre de archivo .gmo
en sistemas con otra implementación de gettext. [19] Estos ya 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 del lenguaje distintos de MO; [20] el equivalente de 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 msgunfmt
se pueden compilar archivos de forma inversa .mo
y existen muchas otras utilidades para el procesamiento por lotes.
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 .mo
archivo 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 de Unix es que admite varios idiomas, separados por dos puntos, como alternativa. [21]
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]
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]
{{cite web}}
: CS1 maint: URL no apta ( enlace )