|
Documentación
Agenda 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 con .lingo/config.json.

Requisitos previos#

Antes de instalar la app, asegúrate de contar con:

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

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

Conecta 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 donde quieres instalar la app.
  6. Elige All repositories o Only select repositories.
  7. Haz clic en Install.

Después de la instalación, Lingo.dev muestra la cuenta de GitHub conectada y los repositorios en Settings > GitHub (App). Usa Manage repositories on GitHub desde esa misma tarjeta de configuración cuando necesites agregar 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 dentro de la configuración de la organización.

Agrega la configuración del repositorio#

Crea .lingo/config.json en el repositorio donde instalaste 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 se 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 cambian archivos fuente en la rama predeterminada. Está habilitado de forma predeterminada.
github.workflows.onPullRequest.enabledNoSe ejecuta cuando cambian archivos fuente en pull requests. Está deshabilitado de forma predeterminada.
github.safety.requireApprovalNoRequiere aprobación antes de que traduzcan los flujos de trabajo automáticos de push o PR. Está deshabilitado de forma predeterminada.

Patrones de archivos#

Los patrones files apuntan a archivos fuente (idioma predeterminado). La app compara los archivos modificados con estos patrones y solo procesa los archivos fuente compatibles que coincidan.

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

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

Los patrones no pueden comenzar con / ni contener ...

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

Opciones de archivo#

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

OpciónAplica aDescripción
formatTodosAnula el formato inferido a partir de la extensión del archivo. Es obligatorio para OpenAPI YAML ("yaml-openapi").
include / excludeTodosListas de glob para ajustar qué archivos coincide con la entrada; se usan junto con pattern o en lugar de este.
translateFrontmatterFieldsMarkdown, MDX, MarkdocClaves de frontmatter para traducir. De forma predeterminada, son title y description.
translateComponentPropsMDX, MarkdocProps de componentes MDX y atributos de etiquetas Markdoc que se traducirán.
lockedKeysJSON, JSONCRutas de claves que conservan el valor de origen y nunca se traducen.
preservedKeysJSON, JSONCRutas de claves que conservan el valor de destino actual y no se vuelven a traducir.
injectLocaleJSON, JSONCEscribe el código del idioma de destino en la salida en la clave indicada (el valor predeterminado es language).

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

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 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 fuente están en messages/en.json, configura "sourceLocale": "en".

Cuando la ruta de origen contiene un directorio de idioma, la app reemplaza ese directorio. Cuando la ruta de origen es un archivo con nombre de idioma, la app reemplaza 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 predeterminada#

Cuando se agrega o modifica un archivo fuente coincidente en la rama predeterminada, la app lo traduce y hace commit de los archivos localizados en:

txt
lingo/translations/<default-branch>

Luego abre o actualiza un pull request desde esa rama de traducciones hacia la rama predeterminada. Si la rama de traducciones ya existe, se le agregan nuevos commits.

Si en ese mismo push se agrega o modifica un archivo de destino, la app considera que ese archivo ya fue atendido y lo incluye en el PR de traducción en lugar de sobrescribirlo.

Pull requests#

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

La app no escribe en ramas de PR provenientes de forks ni escribe en la rama predeterminada a partir de un comentario en un PR. Los pull requests deben estar abiertos para que la app pueda hacer commit de las traducciones.

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

Actualizaciones incrementales y recuperación#

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

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

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 un paso de aprobación humana antes de que se ejecuten las traducciones automáticas.

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

txt
/lingo approve

Los comandos con alcance limitado de /lingo translate no requieren esta aprobació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 ayuda.
/lingo helpMuestra ayuda.
/lingo translate <glob>...Traduce los archivos de destino faltantes 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 cada archivo fuente coincidente y cada idioma dentro del alcance, sobrescribiendo los destinos existentes.
/lingo approveAprueba una propuesta de traducción pendiente en el PR.

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

De forma predeterminada, /lingo translate se ejecuta en modo de completado: solo crea archivos de destino que faltan en la rama del PR. Agrega --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 sucede cuando una ejecución escribiría más de 100 archivos en un solo commit o más de 5 MB de contenido traducido en un solo commit.

Cuando eso 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é pasa cuando no hay coincidencias#

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

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

Siguientes pasos#

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

¿Te resultó útil esta página?

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