GNU obtener texto | |
---|---|
Tipo de | localización de software , biblioteca |
Autor | Ulrich Drupper |
Desarrolladores | proyecto GNU |
Escrito en | xi |
Sistema operativo | Similar a Unix , Microsoft Windows |
Idiomas de la interfaz | Ruso y 37 idiomas más |
plataforma de hardware | multiplataforma |
ultima versión |
|
Formatos de archivo legibles | Objeto de máquina GNU Gettext (big endian) [d] y Objeto de máquina GNU Gettext (litte endian) [d] |
Formatos de archivo generados | Objeto de máquina GNU Gettext (big endian) [d] y Objeto de máquina GNU Gettext (litte endian) [d] |
Estado | activo |
Licencia | |
Sitio web | gnu.org/software/gettext/ |
Archivos multimedia en Wikimedia Commons |
gettext es una biblioteca de proyectos GNU para la internacionalización , muy utilizada en software libre .
La principal diferencia con otras herramientas similares es que gettext usa sus originales en inglés para designar cadenas traducibles en el texto del programa, en lugar de identificadores especiales. Por lo tanto, resulta que el programa no necesita archivos de traducción para mostrar la interfaz en inglés. Esto suele ser conveniente, porque la mayoría de las aplicaciones desarrolladas ya están escritas en inglés.
gettext tiene soporte plural . Para hacer esto, se usa una función especial en el código fuente del programa y se dan dos líneas, en singular y plural. Al sustituir una traducción a otro idioma, se utilizan tantas formas de la cadena de traducción como sea necesario para ese idioma. Para hacer esto, el encabezado del archivo de traducción debe contener una expresión específica del idioma para seleccionar la cadena de traducción número por número.
La biblioteca gettext asume que las traducciones se almacenan en archivos con las extensiones .mo ( Eng. Machine Object , un archivo binario fácil de leer por el programa y específico de la plataforma) o .gmo (GNU .mo), .po ( Objeto portátil en inglés , una traducción independiente de la plataforma de archivos legible por humanos) y .pot ( la plantilla PO es un directorio, una preparación de un archivo .po para traducir a un nuevo idioma). [2] Además de las propias cadenas de traducción, los archivos .po pueden contener comentarios del traductor y varias marcas de servicio.
Para generar y actualizar estos archivos cuando cambia el programa, se supone que debe utilizar una serie de utilidades incluidas en la biblioteca gettext.
Inicialmente, el programa recopila las líneas del código fuente del programa xgettexten un archivo (directorio) .pot . Este archivo y los archivos de traducción se actualizan con cadenas nuevas y modificadas que aparecen en el código fuente mediante msgmerge. Al mismo tiempo, todas las cadenas ya traducidas se guardan, las que ya no se usan se marcan como obsoletas y las que han cambiado se marcan como inexactas ( english fuzzy ). De forma predeterminada, el programa no utilizará cadenas obsoletas e inexactas. Son necesarios para la comodidad del traductor: a menudo es más fácil basarse en una traducción existente, aunque desactualizada, que traducir la frase completa de nuevo.
Para comenzar a traducir un programa a un idioma específico, el traductor crea un .poarchivo: copia .potel archivo en el lugar correcto y le cambia el título. Para hacer esto, puede usar el programa msginit. La utilidad convierte el archivo de traducción terminado en archivos .mo msgfmt. [2] .
También existen utilidades para traductores que facilitan la edición de la traducción, por ejemplo:
Además de la implementación básica de gettext para C estándar , existen implementaciones de un enfoque similar para C++ , Objective-C , secuencias de comandos sh / bash , Python , Perl , PHP , GNU CLISP , Emacs Lisp , librep, GNU Smalltalk , Java , Scala [3] , GNU awk , Pascal , wxWidgets (usando la clase wxLocale), YCP ( lenguaje YaST2 ), Tcl , Pike y R , lenguajes de plataforma Mono (espacio de nombres Mono.Unix), y para el framework Qt . Algunos de estos idiomas son compatibles directamente con las utilidades mencionadas anteriormente. [2] .
El uso en la mayoría de los idiomas es similar al uso en C.
Las cadenas que se muestran al usuario durante la operación del programa y, en consecuencia, requieren traducción, están escritas en inglés en el código fuente del programa y marcadas con una llamada de función gettexto ngettextsimilar.
printf ( gettext ( "¡Hola! Mi nombre es %s. \n " ), nombre );Por lo general, para reducir el tamaño del código fuente y mejorar la legibilidad, #define _ gettextse declara y utiliza un sinónimo de función breve (guion bajo). Así que la llamada se convierte en
printf ( _ ( "¡Hola! Mi nombre es %s. \n " ), nombre );Para la línea anterior, aparecerá una entrada como esta en el directorio, después del procesamiento adecuado mediante los comandos xgettext y msginit:
#: src/name.c:36 msgstr "¡Hola! Mi nombre es %s.\n" msgstr "" PluralesPara traducir el plural se utiliza la función ngettext, que toma como parámetros dos cadenas inglesas (para el singular y el plural, respectivamente) y un número entero. En PHP , la llamada ngettextpara generar una cadena con un número se ve así:
printf ( ngettext ( "hace %d días" , "hace %d días" , $hacedías ), $hacedías );La función ngettexten sí no sustituye un valor numérico por %d, por lo que el programador necesita llamar a una función printfo similar para formar la cadena deseada con un número.
Luego traduce las líneas en ese archivo, por ejemplo, para una traducción al ruso:
#: src/name.c:36 msgid "¡Hola! Mi nombre es %s.\n" msgstr "¡Hola! Mi nombre es %s.\n" PluralesPara traducir plurales, es necesario que el encabezado (donde se indiquen datos como Project-Id-Versiony PO-Revision-Date) .podel archivo indique la regla de formación de plurales para un idioma determinado. Por ejemplo, en ruso hay tres formas de plural:
La elección de una de estas tres formas, según el número, se realiza mediante la siguiente fórmula [4] :
" Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"La expresión pluralaquí se escribe utilizando la sintaxis del lenguaje C y solo puede basarse en la variable n, que denota el número de salida.
Después de tal declaración, las formas toman los números 0, 1 y 2, y la traducción de la frase es la siguiente:
msgid " Hace %d días" msgid_plural "Hace %d días" msgstr [ 0 ] "Hace %d días" msgstr[ 1 ] "Hace %d días" msgstr[ 2 ] "Hace %d días"Por lo general, un usuario de sistemas operativos similares a UNIX no necesita realizar pasos adicionales para seleccionar una traducción en particular. La traducción está determinada por una variable del sistema , que normalmente ya está establecida en el valor requerido. LANG