|
Documentación
Reservar una demoPlataforma
PlataformaMCPCLIAPIFlujos de trabajo
GuíasRegistro de cambios

Localización continua

  • Cómo funciona
  • Configuración

Plataformas

  • App de GitHub
  • GitHub Actions
  • GitLab CI/CD
  • Bitbucket Pipelines
  • Patrones avanzados

App de GitHub

La App de GitHub de Lingo.dev configura la localización continua de un repositorio mediante .lingo/config.json.

Requisitos previos#

Antes de instalar la app, asegúrate de tener:

  • Una organización de Lingo.dev con la función de integración con GitHub activada
  • Un motor de localización en esa organización
  • Acceso de administrador a la organización o al repositorio de GitHub que quieras conectar

Si no eres administrador de la organización de GitHub, GitHub te permite solicitar la instalación. Un administrador de la organización de GitHub debe aprobar esa solicitud antes de que Lingo.dev pueda acceder a los repositorios seleccionados.

Conectar la App de GitHub#

  1. En Lingo.dev, abre tu organización.
  2. Ve a Settings.
  3. Busca GitHub (App) en la sección de integraciones.
  4. Haz clic en Connect en la fila de GitHub (App).
  5. En GitHub, elige la cuenta o la organización en la que quieres instalar la app.
  6. Elige All repositories o Only select repositories.
  7. Haz clic en Install.

Después de instalarla, Lingo.dev muestra la cuenta de GitHub conectada y los repositorios en Settings > GitHub (App). Usa Manage repositories on GitHub desde la misma tarjeta de ajustes cuando necesites añadir o quitar repositorios más adelante.

Si tu solicitud de instalación está pendiente de aprobación, un administrador de GitHub puede revisarla en GitHub, en el área Settings > GitHub Apps de la organización. GitHub también muestra las solicitudes de apps pendientes a los propietarios de la organización en la configuración de la organización.

Añadir la configuración del repositorio#

Crea .lingo/config.json en el repositorio en el que hayas instalado la app:

json
{
  "engineId": "eng_abc123",
  "sourceLocale": "en",
  "targetLocales": ["es", "fr", "de"],
  "files": [
    { "pattern": "docs/en/**/*.md" },
    { "pattern": "docs/en/**/*.mdx" },
    { "pattern": "locales/en.json" }
  ],
  "github": {
    "workflows": {
      "onPushToDefaultBranch": { "enabled": true },
      "onPullRequest": { "enabled": true }
    },
    "safety": {
      "requireApproval": false
    }
  }
}
CampoObligatorioDescripción
engineIdSíEl motor de Lingo.dev que debe traducir este repositorio.
sourceLocaleSíEl idioma de origen que se usa en las rutas de tus archivos fuente, como en o en-US.
targetLocalesSíCódigos de idioma a los que traducir. Se admiten hasta 50 idiomas únicos.
filesSíPatrones de archivos fuente relativos al repositorio. Se admiten hasta 100 patrones.
github.workflows.onPushToDefaultBranch.enabledNoSe ejecuta cuando los archivos fuente cambian en la rama por defecto. Está activado de forma predeterminada.
github.workflows.onPullRequest.enabledNoSe ejecuta cuando los archivos fuente cambian en pull requests. Está desactivado de forma predeterminada.
github.safety.requireApprovalNoRequiere aprobación antes de que traduzcan los flujos de trabajo automáticos de push o PR. Está desactivado de forma predeterminada.

Patrones de archivo#

Los patrones files apuntan a archivos fuente (idioma predeterminado). La app comprueba los archivos modificados con esos patrones y solo procesa los archivos fuente compatibles que coinciden.

Los patrones son relativos al repositorio, distinguen entre mayúsculas y minúsculas y pueden usar:

  • * para coincidir dentro de un segmento de ruta
  • **/ para coincidir con cualquier profundidad de directorios

Los patrones no pueden empezar por / ni contener ...

json
{
  "files": [
    { "pattern": "docs/en/**/*.md" },
    { "pattern": "src/content/en/**/*.mdx" },
    { "pattern": "messages/en.jsonc" }
  ]
}

Opciones de archivo#

Cada entrada de files puede incluir opciones además de su pattern. Todas son opcionales y cada una solo se aplica a determinados formatos.

OpciónSe aplica aDescripción
formatTodosAnula el formato deducido a partir de la extensión del archivo. Es obligatorio para OpenAPI YAML ("yaml-openapi").
include / excludeTodosListas de globs para acotar qué archivos coincide con la entrada, usadas junto con pattern o en su lugar.
translateFrontmatterFieldsMarkdown, MDX, MarkdocClaves de frontmatter que deben traducirse. Por defecto, son title y description.
translateComponentPropsMDX, MarkdocProps de componentes MDX y atributos de etiquetas de Markdoc que deben traducirse.
lockedKeysJSON, JSONCRutas de claves que mantienen el valor de origen y nunca se traducen.
preservedKeysJSON, JSONCRutas de claves que mantienen el valor de destino existente y no se vuelven a traducir.
injectLocaleJSON, JSONCEscribe el código del idioma de destino en la salida en la clave indicada (por defecto, language).

Las entradas translateComponentProps pueden ser un nombre de prop, que se aplica a esa prop en cualquier componente o etiqueta, o un objeto que limita las props a componentes o etiquetas concretos:

json
{
  "files": [
    {
      "pattern": "src/content/en/**/*.mdx",
      "translateFrontmatterFields": ["title", "description"],
      "translateComponentProps": [
        "alt",
        { "component": ["Callout", "Hero"], "props": ["title", "subtitle"] }
      ]
    },
    {
      "pattern": "locales/en.json",
      "lockedKeys": ["app.version"],
      "injectLocale": { "enabled": true, "key": "language" }
    }
  ]
}

Dónde se escriben los archivos localizados#

La app deriva cada ruta de destino a partir de la ruta de origen y de los códigos de idioma de tu configuración:

Ruta de origenIdioma de destinoRuta de salida
docs/en/guide.mdesdocs/es/guide.md
docs/en-US/guide.mdfr-FRdocs/fr-FR/guide.md
locales/en.jsondelocales/de.json
README.mdeses/README.md

Usa el nombre completo del directorio o del archivo como código de idioma. Por ejemplo, si los archivos fuente están en docs/en-US/, configura "sourceLocale": "en-US", no "en". Si las cadenas de origen están en messages/en.json, configura "sourceLocale": "en".

Cuando la ruta de origen contiene un directorio de idioma, la app sustituye ese directorio. Cuando la ruta de origen es un archivo con nombre de idioma, la app sustituye el nombre del archivo. Si no existe ninguno de esos patrones, la app coloca el archivo traducido en un nuevo directorio del idioma de destino junto al archivo fuente.

Flujos de trabajo#

Push a la rama por defecto#

Cuando se añade o modifica un archivo fuente coincidente en la rama por defecto, la app lo traduce y hace commit de los archivos localizados en:

txt
lingo/translations/<default-branch>

Después, abre o actualiza una pull request desde esa rama de traducciones hacia la rama por defecto. Si la rama de traducciones ya existe, se añaden nuevos commits a ella.

Si en el mismo push se añade o modifica un archivo de destino, la app considera que ese archivo ya está gestionado y lo incorpora a la PR de traducción en lugar de sobrescribirlo.

Pull requests#

Cuando github.workflows.onPullRequest.enabled es true, la app revisa los cambios de la pull request en busca de archivos fuente coincidentes. Hace commit de los archivos traducidos directamente en la rama de la PR.

La app no escribe en ramas de PR procedentes de forks ni en la rama por defecto desde un comentario en una PR. Las pull requests deben estar abiertas para que la app pueda hacer commit de las traducciones.

En las PR, Lingo.dev actualiza un comentario con los archivos traducidos y cualquier error.

Actualizaciones incrementales y recuperación#

En los archivos de destino existentes, la app traduce solo los cambios de origen que puede detectar en lugar de regenerar el archivo completo. Para los archivos de destino nuevos, crea el archivo localizado para cada idioma de destino configurado.

Si una localización anterior de una PR omitió un cambio de origen o falló antes de actualizar el archivo de destino, la siguiente sincronización de la PR puede recuperarlo comparando el origen de la PR con el origen de la rama base y traduciendo el cambio que falta.

Si un archivo fuente ya no existe en el commit que se está procesando, la app lo omite.

Modo de aprobación#

Configura github.safety.requireApproval como true cuando quieras añadir un paso de aprobación humana antes de que se ejecuten las traducciones automáticas.

En los pushes a la rama por defecto, la comprobación de Lingo.dev muestra las acciones Approve y Deny. En las pull requests, la app publica un comentario con una propuesta de traducción; responde con:

txt
/lingo approve

Los comandos /lingo translate con alcance definido no requieren esta validación previa.

Comando manual para PR#

Usa /lingo en un comentario de pull request para completar o forzar traducciones de archivos específicos.

txt
/lingo translate docs/en/**/*.md
txt
/lingo translate docs/en/**/*.mdx --locales fr,es
txt
/lingo translate docs/en/**/*.md --force

Referencia de comandos:

ComandoDescripción
/lingoMuestra la ayuda.
/lingo helpMuestra la ayuda.
/lingo translate <glob>...Traduce los archivos de destino que faltan para los archivos fuente coincidentes.
/lingo translate <glob>... --locales fr,esLimita la ejecución a los idiomas de destino configurados. El analizador de comandos convierte los valores de idioma a minúsculas.
/lingo translate <glob>... --forceTraduce todos los archivos fuente e idiomas coincidentes dentro del alcance, sobrescribiendo los destinos existentes.
/lingo approveAprueba una propuesta de traducción pendiente en la PR.

El comando debe ir en su propia línea. Los globs se comparan con archivos que también coinciden con tus patrones de archivos fuente files configurados. Igual que los patrones de configuración, los globs del comando no pueden empezar por / ni contener ...

Por defecto, /lingo translate se ejecuta en modo de completado: solo crea los archivos de destino que faltan en la rama de la PR. Añade --force cuando quieras regenerar archivos de destino existentes.

Formatos compatibles#

La App de GitHub detecta estos formatos a partir de la extensión del archivo:

  • JSON (.json)
  • JSONC (.jsonc)
  • Markdown (.md)
  • MDX (.mdx)
  • Markdoc

Los documentos OpenAPI escritos en YAML también son compatibles, pero no se detectan automáticamente. Configura "format": "yaml-openapi" en el patrón de archivo:

json
{
  "files": [
    { "pattern": "openapi/en.yaml", "format": "yaml-openapi" }
  ]
}

Actualizaciones grandes#

La app puede dividir la salida de traducción en varios commits. Esto ocurre cuando una ejecución escribiría más de 100 archivos en un solo commit o más de 5 MB de contenido de archivos traducidos en un solo commit.

Cuando ocurre, los mensajes de commit incluyen el número de lote, por ejemplo:

txt
feat: Lingo.dev translations (1/3)
feat: Lingo.dev translations (2/3)
feat: Lingo.dev translations (3/3)

Qué ocurre cuando no hay coincidencias#

Si falta .lingo/config.json, la app omite el repositorio sin avisar. Una vez que existe la configuración, una configuración no válida genera una comprobación fallida y, en las PR, un comentario con el error de validación.

Si ninguno de los archivos modificados coincide con tus patrones de origen, la app finaliza sin escribir traducciones. En el caso de /lingo translate, el bot responde con una breve explicación, por ejemplo: no hay archivos coincidentes, no hay idiomas coincidentes o todos los archivos de destino ya existen.

Siguientes pasos#

GitHub Actions
Usa GitHub Action en lugar de la App de GitHub
Patrones avanzados
Comprobaciones de traducción, conflictos de fusión y selección de flujo de trabajo
Conecta tu motor
Canaliza las traducciones de la App de GitHub a través de tu motor

¿Te ha resultado útil esta página?

Moses SkodaMoses Skoda·Actualizado hace 25 días·8 min de lectura