La interfaz de administración de EmDash es traducible usando Lingui para la extracción de mensajes y Lunaria para el seguimiento del progreso de traducción. Todas las traducciones están en archivos PO (gettext) — uno por idioma.
Estado de la traducción
Consulta el panel de traducción para ver el progreso actual en todos los idiomas.
Quién puede traducir
Cada traducción debe ser supervisada por un hablante nativo o fluido. Las traducciones generadas por IA se aceptan, pero solo cuando un hablante fluido revisa cada cadena y la previsualiza en el panel de administración en ejecución antes de enviar. La salida de máquina sin supervisión no se acepta. Consulta Traducciones asistidas por IA y Probar tus traducciones a continuación.
Dejar una cadena sin traducir es mejor que traducirla incorrectamente. Una traducción incorrecta engaña a los usuarios; el respaldo en inglés solo los incomoda.
Estructura de archivos
Los catálogos de traducción están en packages/admin/src/locales/:
packages/admin/src/locales/
├── en/
│ └── messages.po # Inglés (fuente)
├── de/
│ └── messages.po # Alemán
└── ...
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 no traducido” — Lingui recurrirá al inglés en tiempo de ejecución.
Traducir cadenas
-
Consulta el panel de traducción para ver qué necesita trabajo. Revisa los PRs abiertos para evitar duplicar esfuerzos.
-
Haz fork del repo y crea una rama:
git checkout -b i18n/es -
Abre el archivo PO de tu idioma (ej.,
packages/admin/src/locales/es/messages.po). -
Completa las traducciones. Cada entrada se ve así:
#: packages/admin/src/components/LoginPage.tsx:304 msgid "Sign in with Passkey" msgstr ""Completa el
msgstr:#: packages/admin/src/components/LoginPage.tsx:304 msgid "Sign in with Passkey" msgstr "Iniciar sesión con Passkey" -
Prueba tus traducciones (ver abajo).
-
Abre un PR apuntando a
main. Formato del título:i18n(es): add/update Spanish translations.
Qué traducir
- El valor
msgstrde cada entrada.
Qué NO traducir
- Los valores
msgid— son claves de búsqueda. - Marcadores de interpolación como
{error},{email},{label}— mantenlos exactamente como están. - Etiquetas estilo XML como
<0>,</0>— envuelven elementos interactivos (enlaces, botones). Mantén las etiquetas y traduce el texto entre ellas. - Comentarios que empiezan con
#:— son referencias de origen añadidas por Lingui.
Interpolación y etiquetas
Algunas cadenas contienen marcadores y etiquetas:
msgid "Authentication error: {error}"
msgstr "Error de autenticación: {error}"
msgid "Don't have an account? <0>Sign up</0>"
msgstr "¿No tienes una cuenta? <0>Regístrate</0>"
msgid "If an account exists for <0>{email}</0>, we've sent a sign-in link."
msgstr "Si existe una cuenta para <0>{email}</0>, hemos enviado un enlace de inicio de sesión."
Los marcadores ({error}, {email}) se reemplazan con valores dinámicos en tiempo de ejecución. Las etiquetas (<0>...</0>) envuelven componentes React. Ambos deben aparecer en tu traducción exactamente como aparecen en la fuente — mismos nombres, mismo anidamiento.
Probar tus traducciones
-
Compilar y ejecutar la demo:
pnpm run locale:compile pnpm build pnpm --filter emdash-demo dev -
Cambiar idioma en la página de Configuración del admin y verificar que las traducciones se ven correctas en contexto.
Idioma pseudo
EmDash incluye un idioma pseudo que distorsiona todas las cadenas envueltas en imitaciones acentuadas — "Dashboard" se convierte en "Ðàšĥƀöàřð", y así sucesivamente. Cualquier cadena que aparezca en inglés normal mientras el idioma pseudo está activo no tiene un wrapper t\…“ o proviene de fuera del catálogo.
Para habilitarlo, agrega lo siguiente a tu archivo .env en el directorio demo:
EMDASH_PSEUDO_LOCALE=1
Luego reinicia el servidor de desarrollo. El idioma pseudo aparece como Pseudo en el selector de idioma en la página de login y en Configuración. Cámbialo para detectar cadenas sin envolver de un vistazo.
Agregar un nuevo idioma
Si tu idioma aún no tiene un archivo PO:
-
Agrega el idioma a
packages/admin/src/locales/locales.ts:export const LOCALES: LocaleDefinition[] = [ { code: "en", label: "English", enabled: true }, { code: "de", label: "Deutsch", enabled: true }, // ... { code: "vi", label: "Tiếng Việt", enabled: false }, // agrega el tuyo ];Esta es la única fuente de verdad —
lingui.config.ts,lunaria.config.tsy el runtime del admin derivan sus listas de idiomas de este archivo. Estableceenabled: falsemientras la traducción está en progreso. Un mantenedor habilita el idioma una vez que tiene cobertura suficiente para su uso en la interfaz de administración. -
Ejecuta la extracción para generar el archivo PO vacío:
pnpm run locale:extractEsto crea
packages/admin/src/locales/{tu-idioma}/messages.pocon todas las cadenas listas para traducir. -
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 a nivel de hablante nativo. No agregues, elimines ni reinterpretes el significado. Si una cadena fuente es ambigua, revisa el comentario #: para la ubicación del archivo fuente — lee el código del componente para entender el contexto.
Consistencia
Usa terminología consistente dentro de tu idioma. Si traduces “collection” como “colección” en un lugar, no cambies a “recopilación” en otro lado. Si tu idioma ya tiene traducciones, lee el archivo PO existente antes de comenzar para coincidir con la terminología establecida.
Tono
La interfaz de administración usa un tono directo y profesional. Iguala eso en tu idioma — evita un lenguaje excesivamente formal o excesivamente casual.
Traducciones asistidas por IA
Puedes generar traducciones con herramientas de IA, incluyendo 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 un hablante fluido detecta — registro incorrecto, fraseo antinatural, 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 tienen conocimiento de las restricciones de diseño o el contexto de la UI.
- Indica el uso de IA en la descripción de tu PR.
- Los PRs con traducciones automáticas sin supervisión se cerrarán.
Traducciones parciales
Las traducciones parciales son bienvenidas. No necesitas traducir cada cadena en un solo PR — cualquier progreso ayuda. Las cadenas sin traducir recurrirán al inglés en tiempo de ejecución.