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 se encuentran en archivos PO (gettext) — uno por idioma.
Estado de traducción
Consulte el panel de traducción para ver el progreso actual en todos los idiomas.
Quién puede traducir
Toda traducción debe ser 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 aceptan resultados de máquinas sin supervisión. Consulte Traducciones asistidas por IA y Probar sus traducciones a continuación.
Dejar una cadena sin traducir es mejor que traducirla incorrectamente. Una traducción incorrecta confunde a los usuarios; el respaldo en inglés solo les causa inconvenientes.
Estructura de archivos
Los catálogos de traducción se encuentran 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 su traducción. Un msgstr vacío significa “aún no traducido” — Lingui recurrirá al inglés en tiempo de ejecución.
Traducir cadenas
-
Consulte el panel de traducción para ver qué necesita trabajo. Revise los PRs abiertos para evitar duplicar esfuerzos.
-
Bifurque el repositorio y cree una rama:
git checkout -b i18n/de -
Abra el archivo PO de su idioma (por ejemplo,
packages/admin/src/locales/de/messages.po). -
Complete las traducciones. Cada entrada se ve así:
#: packages/admin/src/components/LoginPage.tsx:304 msgid "Sign in with Passkey" msgstr ""Complete el
msgstr:#: packages/admin/src/components/LoginPage.tsx:304 msgid "Sign in with Passkey" msgstr "Mit Passkey anmelden" -
Pruebe sus traducciones (ver abajo).
-
Abra un PR dirigido a
main. Formato del título:i18n(de): add/update German translations.
Qué traducir
- El valor
msgstrpara cada entrada.
Qué NO traducir
- Valores
msgid— estos son claves de búsqueda. - Marcadores de posición de interpolación como
{error},{email},{label}— manténgalos exactamente como están. - Etiquetas de estilo XML como
<0>,</0>— estas envuelven elementos interactivos (enlaces, botones). Mantenga las etiquetas y traduzca el texto entre ellas. - Comentarios que comienzan con
#:— estas son referencias de origen agregadas por Lingui.
Interpolación y etiquetas
Algunas cadenas contienen marcadores de posición 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 de posición ({error}, {email}) se reemplazan con valores dinámicos en tiempo de ejecución. Las etiquetas (<0>...</0>) envuelven componentes de React. Ambos deben aparecer en su traducción exactamente como aparecen en la fuente — mismos nombres, mismo anidamiento.
Probar sus traducciones
-
Compile y ejecute la demostración:
pnpm run locale:compile pnpm build pnpm --filter emdash-demo dev -
Cambie el idioma en la página de Configuración de administración y verifique que sus traducciones se vean correctas en contexto.
Idioma pseudo
EmDash incluye un idioma pseudo que convierte todas las cadenas envueltas en parecidos acentuados — "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 habilitarlo, agregue lo siguiente a su archivo .env en el directorio de demostración:
EMDASH_PSEUDO_LOCALE=1
Luego reinicie el servidor de desarrollo. El idioma pseudo aparece como Pseudo en el selector de idioma en la página de inicio de sesión y en Configuración. Cámbielo para detectar cadenas sin envolver de un vistazo.
Agregar un nuevo idioma
Si su idioma aún no tiene un archivo PO:
-
Agregue 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: "ja", label: "日本語", enabled: false }, // add yours ];Esta es la única fuente de verdad —
lingui.config.ts,lunaria.config.tsy el tiempo de ejecución de administración derivan sus listas de idiomas de este archivo. Establezcaenabled: falsea menos que sus traducciones tengan 100% de cobertura — un mantenedor lo habilitará una vez que la traducción alcance una cobertura suficiente. -
Ejecute la extracción para generar el archivo PO vacío:
pnpm run locale:extractEsto crea
packages/admin/src/locales/{your-locale}/messages.pocon todas las cadenas listas para traducir. -
Traduzca y pruebe 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 agregue, elimine ni reinterprete el significado. Si una cadena fuente es ambigua, verifique el comentario #: para la ubicación del archivo fuente — lea el código del componente para comprender el contexto.
Consistencia
Use terminología consistente dentro de su idioma. Si traduce “collection” como “Sammlung” en un lugar, no cambie a “Kollektion” en otro lugar. Si su idioma ya tiene traducciones, lea el archivo PO existente antes de comenzar para que coincida con la terminología establecida.
Tono
La interfaz de administración utiliza un tono directo y profesional. Ajústese a eso en su idioma — evite frases excesivamente formales o excesivamente casuales.
Traducciones asistidas por IA
Puede 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 un hablante fluido detecta — registro incorrecto, frases 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 tienen conocimiento de las limitaciones de diseño o el contexto de la interfaz de usuario.
- Divulgue el uso de IA en la descripción de su PR.
- Los PRs con traducciones automáticas sin supervisión se cerrarán.
Traducciones parciales
Las traducciones parciales son bienvenidas. No necesita traducir cada cadena en un PR — cualquier progreso ayuda. Las cadenas sin traducir recurrirán al inglés en tiempo de ejecución.