Ir al contenido

Traducción de Tarjetas

Greentic permite traducir Adaptive Cards a varios idiomas. Puedes hacerlo de dos maneras:

  • Un comando: generate --auto-translate (extrae + traduce + compila)
  • Paso a paso: extraer → traducir → compilar
Ventana de terminal
greentic-cards2pack generate \
--cards ./cards \
--out ./my-pack \
--name my-pack \
--auto-translate \
--langs fr,de,ja

Listo. El pack incluye assets/i18n/en.json, fr.json, de.json, ja.json.

  1. Crear tarjetas

    cards/welcome.json
    {
    "type": "AdaptiveCard",
    "version": "1.4",
    "body": [
    { "type": "TextBlock", "text": "Welcome!", "size": "Large" },
    { "type": "TextBlock", "text": "How can I help you today?" }
    ],
    "actions": [
    { "type": "Action.Submit", "title": "Get Help" },
    { "type": "Action.Submit", "title": "Contact Support" }
    ]
    }
  2. Extraer cadenas traducibles

    Ventana de terminal
    greentic-cards2pack extract-i18n \
    --input ./cards \
    --output i18n/en.json

    Salida:

    i18n/en.json
    {
    "card.welcome.body_0.text": "Welcome!",
    "card.welcome.body_1.text": "How can I help you today?",
    "card.welcome.actions_0.title": "Get Help",
    "card.welcome.actions_1.title": "Contact Support"
    }
  3. Traducir con greentic-i18n-translator

    Ventana de terminal
    greentic-i18n-translator translate \
    --langs fr,ja \
    --en i18n/en.json

    Esto crea i18n/fr.json e i18n/ja.json en el mismo directorio.

  4. Generar el pack

    Ventana de terminal
    greentic-cards2pack generate \
    --cards ./cards \
    --out ./my-pack \
    --name my-pack

Las claves extraídas siguen este patrón:

{prefix}.{cardId}.{json_path}.{field}
ParteOrigenEjemplo
prefixFlag --prefix (predeterminado: card)card
cardIdCampo greentic.cardId o nombre de archivowelcome
json_pathPosición en la estructura de la tarjetabody_0, actions_1
fieldNombre del campotext, title, label

Ejemplos:

  • card.welcome.body_0.text → texto del primer TextBlock
  • card.welcome.actions_0.title → título de la primera acción
  • card.form.body_1.placeholder → placeholder del segundo elemento del body
  • card.form.body_0_choices_2.title → título de la tercera opción de choice

Mantén los nombres de marca y los términos técnicos consistentes en todas las traducciones:

glossary.json
{
"Greentic": "Greentic",
"Dashboard": "Dashboard",
"CLI": "CLI"
}

Úsalo con cualquiera de los dos enfoques:

Ventana de terminal
# Un comando
greentic-cards2pack generate \
--cards ./cards --out ./pack --name demo \
--auto-translate --langs fr,de \
--glossary glossary.json
# Paso a paso
greentic-i18n-translator translate \
--langs fr,de \
--en i18n/en.json \
--glossary glossary.json
CampoElemento de origen
textTextBlock, RichTextBlock
titleActions, toggles, títulos de facts
labelEtiquetas de input
placeholderPlaceholders de input
errorMessageMensajes de validación
altTextTexto alternativo de imagen
fallbackTextContenido alternativo
valueValores de facts

Se omite automáticamente:

  • Cadenas vacías
  • Plantillas Handlebars puras: {{variable}}
  • Referencias a variables: ${var}
  • Patrones i18n existentes: $t(key) (a menos que se use --include-existing)
greentic.demo.yaml
i18n:
default_locale: "en"
locales:
en: "assets/i18n/en.json"
fr: "assets/i18n/fr.json"
ja: "assets/i18n/ja.json"
- id: set_language
type: state
config:
key: "locale"
value: "fr"
next: show_welcome
- id: show_welcome
type: adaptive-card
config:
card: "cards/welcome"
# Card text automatically resolved based on session locale

Los fallos de traducción no son fatales. Si greentic-i18n-translator falla para un idioma:

  • El pack igualmente se compila correctamente
  • Aparece una advertencia en .cards2pack/manifest.json
  • El bundle en inglés (en.json) siempre se crea

Revisa las advertencias:

Ventana de terminal
cat my-pack/.cards2pack/manifest.json | jq '.warnings[] | select(.kind == "translation")'
auto-translation failed: failed to execute greentic-i18n-translator

Instala: cargo install greentic-i18n-translator

O define una ruta personalizada: export GREENTIC_I18N_TRANSLATOR_BIN=/path/to/translator

Si falta una clave en el bundle del idioma de destino, el runtime usa como respaldo el texto fuente en inglés.

Asegúrate de que los placeholders de Handlebars se conserven:

// Correct
{ "card.welcome.body_0.text": "Bonjour, {{name}} !" }
// Wrong — placeholder lost
{ "card.welcome.body_0.text": "Bonjour, nom !" }