Traducir EmDash

En esta página

La interfaz de administración de EmDash es traducible: usa Lingui para extraer los mensajes y Lunaria para seguir el progreso de las traducciones. Todas las traducciones están en archivos PO (gettext), uno por idioma.

Estado de la traducción

Consulta el panel de traducciones para ver el progreso actual de todos los idiomas.

Quién puede traducir

Toda traducción debe estar supervisada por un hablante nativo o fluido. Se aceptan traducciones generadas por IA, pero solo cuando un hablante fluido revisa cada cadena y la previsualiza en el panel de administración en ejecución antes de enviarla. No se acepta la salida automática sin supervisión. Consulta Traducciones asistidas por IA y Probar tus traducciones más abajo.

Dejar una cadena sin traducir es mejor que traducirla mal. Una traducción incorrecta confunde a los usuarios; el texto de reserva en inglés solo les resulta incómodo.

Estructura de archivos

Los catálogos de traducción están en packages/admin/src/locales/:

packages/admin/src/locales/
├── en/
│   └── messages.po    # English (source)
├── de/
│   └── messages.po    # German
└── ...

Cada archivo .po contiene pares msgid/msgstr. El msgid es el texto fuente en inglés; el msgstr es tu traducción. Un msgstr vacío significa «aún sin traducir»: Lingui recurrirá al inglés en tiempo de ejecución.

Traducir cadenas

  1. Consulta el panel de traducciones para ver qué necesita trabajo. Revisa los PR abiertos para evitar duplicar esfuerzos.

  2. Haz un fork del repositorio y crea una rama:

    git checkout -b i18n/de
  3. Abre el archivo PO de tu idioma (p. ej., packages/admin/src/locales/de/messages.po).

  4. Rellena las traducciones. Cada entrada tiene este aspecto:

    #: packages/admin/src/components/LoginPage.tsx:304
    msgid "Sign in with Passkey"
    msgstr ""

    Rellena el msgstr:

    #: packages/admin/src/components/LoginPage.tsx:304
    msgid "Sign in with Passkey"
    msgstr "Mit Passkey anmelden"
  5. Prueba tus traducciones (consulta más abajo).

  6. Abre un PR dirigido a main. Formato del título: i18n(de): add/update German translations.

    Limita el PR al archivo PO, un changeset y los archivos de idioma descritos en Agregar un nuevo idioma. La automatización comenta en un PR de traducción que cambie cualquier otra cosa.

Qué traducir

  • El valor msgstr de cada entrada.

Qué NO traducir

  • Los valores msgid: son claves de búsqueda.
  • Los marcadores de interpolación como {error}, {email}, {label}: déjalos exactamente como están.
  • Las etiquetas de tipo XML como <0>, </0>: envuelven elementos interactivos (enlaces, botones). Conserva las etiquetas y traduce el texto que contienen.
  • Los comentarios que empiezan por #:: son referencias al código fuente añadidas por Lingui.

Interpolación y etiquetas

Algunas cadenas contienen marcadores y etiquetas:

msgid "Authentication error: {error}"
msgstr "Authentifizierungsfehler: {error}"

msgid "Don't have an account? <0>Sign up</0>"
msgstr "Noch kein Konto? <0>Registrieren</0>"

msgid "If an account exists for <0>{email}</0>, we've sent a sign-in link."
msgstr "Falls ein Konto für <0>{email}</0> existiert, haben wir einen Anmeldelink gesendet."

Los marcadores ({error}, {email}) se sustituyen por valores dinámicos en tiempo de ejecución. Las etiquetas (<0>...</0>) envuelven componentes de React. Ambos deben aparecer en tu traducción exactamente como aparecen en el texto fuente: mismos nombres, mismo anidamiento.

Probar tus traducciones

  1. Compila y ejecuta la demo:

    pnpm run locale:compile
    pnpm build
    pnpm --filter emdash-demo dev
  2. Cambia el idioma en la página de Ajustes del administrador y comprueba que tus traducciones se vean bien en contexto.

Idioma pseudo

EmDash incluye un idioma pseudo que convierte todas las cadenas envueltas en imitaciones con acentos: "Dashboard" se convierte en "Ðàšĥƀöàřð", y así sucesivamente. Cualquier cadena que aparezca en inglés normal mientras el idioma pseudo está activo carece de un envoltorio t\…“ o proviene de fuera del catálogo.

Para activarlo, añade lo siguiente a tu archivo .env en el directorio de la demo:

EMDASH_PSEUDO_LOCALE=1

Después reinicia el servidor de desarrollo. El idioma pseudo aparece como Pseudo en el selector de idioma de la página de inicio de sesión y en Ajustes. Cámbiate a él para detectar de un vistazo las cadenas sin envolver.

Agregar un nuevo idioma

Si tu idioma todavía no tiene un archivo PO:

  1. Añade el idioma a packages/admin/src/locales/locales.ts:

    export const LOCALES: LocaleDefinition[] = [
      { code: "en", label: "English", enabled: true },
      // ...
      {
        code: "vi",
        label: "Tiếng Việt",
        enabled: false,
        dateLocale: () => import("react-day-picker/locale/vi").then((m) => m.vi),
      },
    ];

    dateLocale carga la localización del calendario y del formato de fecha para tu idioma. Elige el archivo más cercano en react-day-picker/locale, como pt para pt-PT, y usa la exportación que se nombra en ese archivo. Omítelo solo si tu idioma usa el calendario del inglés de EE. UU.

    Esta es la única fuente de verdad: lingui.config.ts, lunaria.config.ts y el entorno de ejecución del administrador derivan sus listas de idiomas de este archivo. Establece enabled: false mientras la traducción esté en curso. Un mantenedor habilita el idioma cuando tiene cobertura suficiente para usarse en la interfaz de administración.

  2. Ejecuta la extracción para generar el archivo PO vacío:

    pnpm run locale:extract

    Esto crea packages/admin/src/locales/{your-locale}/messages.po con todas las cadenas listas para traducir.

  3. Traduce y prueba siguiendo los pasos anteriores.

Estándares de traducción

Precisión

Las traducciones deben representar fielmente el texto fuente en inglés al nivel de un hablante nativo. No añadas, elimines ni reinterpretes el significado. Si una cadena fuente es ambigua, consulta el comentario #: con la ubicación del archivo fuente y lee el código del componente para entender el contexto.

Consistencia

Usa una terminología coherente dentro de tu idioma. Si traduces «collection» como «Sammlung» en un lugar, no cambies a «Kollektion» en otro. Si tu idioma ya tiene traducciones, lee el archivo PO existente antes de empezar para respetar la terminología establecida.

Tono

La interfaz de administración usa un tono directo y profesional. Iguálalo en tu idioma: evita las formulaciones demasiado formales o demasiado informales.

Traducciones asistidas por IA

Puedes generar traducciones con herramientas de IA, incluida una primera pasada completa, pero un hablante fluido debe supervisar el resultado:

  • Un hablante fluido debe revisar cada cadena. Las herramientas de IA cometen errores sutiles que solo detecta un hablante fluido: registro incorrecto, formulaciones poco naturales, términos técnicos incorrectos.
  • Un hablante fluido debe previsualizar las traducciones en la interfaz de administración en ejecución. Las herramientas de IA no conocen las restricciones de diseño ni el contexto de la interfaz.
  • Indica el uso de IA en la descripción de tu PR.
  • Los PR con traducciones automáticas sin supervisión se cerrarán.

Traducciones parciales

Las traducciones parciales son bienvenidas. No necesitas traducir todas las cadenas en un solo PR: cualquier avance ayuda. Las cadenas sin traducir recurrirán al inglés en tiempo de ejecución.