Obtener texto

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 20 de diciembre de 2021; las comprobaciones requieren 7 ediciones .

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
  • biblioteca - LGPL
  • herramientas - GPL
  • Documentación - GFDL /GPL
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 .

Descripción

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.

Uso

Para el programador

Líneas simples

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 "" Plurales

Para 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.

Para el traductor

Líneas simples

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" Plurales

Para 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:

  • 1, 21, 31… día
  • 2, 3, 4, 22, 23, 24, 32, 33, 34… días
  • 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, 27, 28, 29, 30, 35, 36... días

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"

Para el usuario

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

Véase también

Notas

  1. Haible B. GNU gettext 0.21 lanzado  - 2020 .
  2. 1 2 3 El manual gettext de GNU Archivado el 5 de diciembre de 2007 en Wayback Machine . 
  3. makkarpov/scalingua: Una simple biblioteca de internacionalización similar a gettext para Scala . github.com . Consultado el 28 de abril de 2016. Archivado desde el original el 24 de abril de 2020.
  4. Así es como se ve una línea en un archivo de traducción .po . El \n al final de una línea significa un salto de línea.

Enlaces