Traducción

Resumen

Esta página explica cómo traducir una app: la herramienta que extrae las cadenas, la configuración de la sincronización con Transifex en la comunidad (archivo de configuración, ramas, archivos excluidos, validación y permisos del repositorio), la traducción manual sin Transifex, y enumera los cuatro procesos de traducción. Está dirigida a quienes desarrollan apps.

Fuente: documentación de Nextcloud, «developer_manual/app_development/translation», versión 3ad9158, licencia CC BY 3.0; traducida y adaptada para APS Conecta Gestión.

El sistema de traducción de Nextcloud funciona con Transifex. Para empezar a traducir, registrarse y entrar en un grupo. Si la app de la comunidad debe traducirla la comunidad de Nextcloud en Transifex, basta con seguir la sección de configuración de más abajo.

Herramienta de traducción

Nota

Por ahora, la traducción basada en la herramienta solo admite repositorios alojados en github.com. Si la app está alojada en otro lugar, se puede intentar seguir en su lugar la Traducción manual.

La herramienta de traducción recorre el código fuente en busca de llamadas a los métodos t() o n() para extraer las cadenas que deben traducirse. Si, por ejemplo, se incluye en el repositorio código JS minificado, esos nombres de métodos también son bastante comunes y podrían provocar extracciones erróneas. Por eso se permite indicar una lista de archivos en los que la herramienta de traducción no buscará cadenas. Basta con añadir un archivo llamado .l10nignore en la carpeta raíz de la app e indicar los archivos, uno por línea:

# compiled vue templates
js/bruteforcesettings.js

Configuración de la sincronización con Transifex

Configuración de Transifex .tx/config

Para configurar la sincronización con Transifex dentro de la comunidad de Nextcloud, primero hay que añadir la configuración de Transifex a la carpeta de la app en .tx/config (reemplazar MYAPP por el id de la app):

[main]
host     = https://www.transifex.com
lang_map = hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja, bg_BG: bg, cs_CZ: cs, fi_FI: fi

[o:nextcloud:p:nextcloud:r:{{APPID}}]
file_filter = translationfiles/<lang>/{{APPID}}.po
source_file = translationfiles/templates/{{APPID}}.pot
source_lang = en
type        = PO

Luego crear una carpeta l10n y un archivo l10n/.gitkeep para crear una carpeta vacía que más adelante contendrá las traducciones.

Selección de ramas .tx/backport

El bot se ejecutará cada noche y solo enviará commits a las siguientes ramas cuando haya una actualización de la traducción:

  • main

  • master

  • stableX (siendo X las 3 versiones recientes de Nextcloud Server)

Esta lista se puede sobrescribir creando en el repositorio un archivo .tx/backport con el siguiente contenido:

develop stable

Eso sincronizaría las traducciones de las ramas (main y master se añaden automáticamente):

  • main

  • master

  • develop

  • stable

Excluir archivos .l10nignore

Añadir un archivo más, llamado .l10nignore, en la raíz del repositorio, con los archivos y carpetas que se deben ignorar en las traducciones. Debe usarse para excluir archivos que generan falsos positivos en las traducciones, como:

  • Archivos JavaScript compilados js/

  • Dependencias PHP de terceros vendor/

  • Archivos y documentación que no se distribuyen docs/

Validar las cadenas de origen

Una vez terminada la configuración, se pueden validar las cadenas de origen de la traducción, lo que señala algunos errores comunes. Clonar el repositorio nextcloud/docker-ci y después ejecutar el siguiente script:

bash translations/validateSyncSetup.sh Owner Repository

Permisos del repositorio

Ahora la cuenta de GitHub @nextcloud-bot necesita acceso write al repositorio. Se la puede invitar desde los ajustes del repositorio:

https://github.com/<user-name>/<repo-name>/settings/access

Después de enviar la invitación, abrir un ticket con la plantilla «Request translations».

Atención

En general, conviene activar la función de ramas protegidas para las ramas predeterminada y estables. Si se hace, hay que conceder a @nextcloud-bot permisos admin y permitir que los administradores se salten la protección. Sin embargo, esta función solo es posible en repositorios que pertenecen a organizaciones, ¡no en repositorios que pertenecen a personas! Se puede crear una organización propia

Si se necesita ayuda, basta con abrir un ticket con la solicitud y también se puede recibir orientación a lo largo de los pasos.

Traducción manual

Si Transifex no es la opción adecuada o la app no se acepta para traducción, generar las cadenas de gettext por cuenta propia ejecutando nuestra herramienta de traducción en la carpeta de la app:

cd /srv/http/nextcloud/apps/myapp
translationtool.phar create-pot-files

La herramienta de traducción requiere gettext, que se puede instalar con:

apt-get install gettext

La herramienta anterior genera una plantilla que se puede usar para traducir todas las cadenas de una app. Esta plantilla se encuentra en la carpeta translationfiles/template/ con el nombre myapp.pot. Se puede usar con la herramienta de traducción que se prefiera, como Poedit. Esta crea entonces un archivo .po. El archivo .po debe colocarse en una carpeta con el nombre del código de idioma y con el nombre de la app como nombre de archivo; por ejemplo, translationfiles/es/myapp.po. Después de este paso, hay que invocar la herramienta para pasar el archivo po a nuestro propio formato de archivo, que el código del servidor lee más fácilmente:

translationtool.phar convert-po-files

Ahora está disponible la siguiente estructura de carpetas:

myapp/l10n
|-- es.js
|-- es.json
myapp/translationfiles
|-- es
|   |-- myapp.po
|-- templates
    |-- myapp.pot

Después solo se necesitan los archivos .json y .js para tener una app localizada que funcione.

Documentación sobre el proceso de traducción

A continuación se describen cuatro procesos:

  1. Proceso para traducir una cadena nueva

  2. Proceso para corregir un error tipográfico o gramatical en una cadena traducida

  3. Proceso para hacer traducible una cadena que no lo es

  4. Proceso para corregir un problema en la cadena de origen