L’interface d’administration d’EmDash est traduisible : elle utilise Lingui pour l’extraction des messages et Lunaria pour le suivi de l’avancement des traductions. Toutes les traductions se trouvent dans des fichiers PO (gettext), un par langue.
État de la traduction
Consultez le tableau de bord des traductions pour voir l’avancement actuel de toutes les langues.
Qui peut traduire
Chaque traduction doit être supervisée par un locuteur natif ou courant. Les traductions générées par IA sont acceptées, mais uniquement lorsqu’un locuteur courant relit chaque chaîne et la prévisualise dans le panneau d’administration en cours d’exécution avant de la soumettre. Les sorties automatiques non supervisées ne sont pas acceptées. Consultez Traductions assistées par IA et Tester vos traductions ci-dessous.
Laisser une chaîne non traduite vaut mieux que la traduire de façon erronée. Une traduction incorrecte induit les utilisateurs en erreur ; le repli en anglais ne fait que les gêner.
Structure des fichiers
Les catalogues de traduction se trouvent dans packages/admin/src/locales/ :
packages/admin/src/locales/
├── en/
│ └── messages.po # English (source)
├── de/
│ └── messages.po # German
└── ...
Chaque fichier .po contient des paires msgid/msgstr. Le msgid est le texte source en anglais ; le msgstr est votre traduction. Un msgstr vide signifie « pas encore traduit » : Lingui se rabattra sur l’anglais à l’exécution.
Traduire des chaînes
-
Consultez le tableau de bord des traductions pour voir ce qui doit être fait. Vérifiez les PR ouvertes pour éviter de dupliquer le travail.
-
Forkez le dépôt et créez une branche :
git checkout -b i18n/de -
Ouvrez le fichier PO de votre langue (par ex.
packages/admin/src/locales/de/messages.po). -
Renseignez les traductions. Chaque entrée ressemble à ceci :
#: packages/admin/src/components/LoginPage.tsx:304 msgid "Sign in with Passkey" msgstr ""Renseignez le
msgstr:#: packages/admin/src/components/LoginPage.tsx:304 msgid "Sign in with Passkey" msgstr "Mit Passkey anmelden" -
Testez vos traductions (voir ci-dessous).
-
Ouvrez une PR ciblant
main. Format du titre :i18n(de): add/update German translations.Limitez la PR au fichier PO, à un changeset et aux fichiers de langue décrits dans Ajouter une nouvelle langue. Un automatisme commente toute PR de traduction qui modifie autre chose.
Ce qu’il faut traduire
- La valeur
msgstrde chaque entrée.
Ce qu’il ne faut PAS traduire
- Les valeurs
msgid: ce sont des clés de recherche. - Les espaces réservés d’interpolation comme
{error},{email},{label}: conservez-les exactement tels quels. - Les balises de type XML comme
<0>,</0>: elles entourent des éléments interactifs (liens, boutons). Conservez les balises et traduisez le texte qu’elles contiennent. - Les commentaires commençant par
#:: ce sont des références au code source ajoutées par Lingui.
Interpolation et balises
Certaines chaînes contiennent des espaces réservés et des balises :
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."
Les espaces réservés ({error}, {email}) sont remplacés par des valeurs dynamiques à l’exécution. Les balises (<0>...</0>) entourent des composants React. Les deux doivent apparaître dans votre traduction exactement comme dans la source : mêmes noms, même imbrication.
Tester vos traductions
-
Compilez et lancez la démo :
pnpm run locale:compile pnpm build pnpm --filter emdash-demo dev -
Changez de langue dans la page Paramètres de l’administration et vérifiez que vos traductions s’affichent correctement en contexte.
Locale pseudo
EmDash fournit une locale pseudo qui transforme toutes les chaînes encapsulées en sosies accentués : "Dashboard" devient "Ðàšĥƀöàřð", et ainsi de suite. Toute chaîne qui apparaît en anglais normal lorsque la locale pseudo est active n’a pas d’encapsulation t\…“ ou provient de l’extérieur du catalogue.
Pour l’activer, ajoutez ce qui suit à votre fichier .env dans le répertoire de la démo :
EMDASH_PSEUDO_LOCALE=1
Redémarrez ensuite le serveur de développement. La locale pseudo apparaît sous le nom Pseudo dans le sélecteur de langue de la page de connexion et dans les Paramètres. Passez dessus pour repérer d’un coup d’œil les chaînes non encapsulées.
Ajouter une nouvelle langue
Si votre langue n’a pas encore de fichier PO :
-
Ajoutez la langue à
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), }, ];dateLocalecharge la localisation du calendrier et du format de date pour votre langue. Choisissez le fichier le plus proche dansreact-day-picker/locale, commeptpourpt-PT, et utilisez l’export nommé dans ce fichier. Ne l’omettez que si votre langue utilise le calendrier de l’anglais américain.C’est l’unique source de vérité :
lingui.config.ts,lunaria.config.tset l’exécution de l’administration en dérivent tous leurs listes de langues. Définissezenabled: falsependant que la traduction est en cours. Un mainteneur active la langue une fois qu’elle atteint une couverture suffisante pour être utilisée dans l’interface d’administration. -
Lancez l’extraction pour générer le fichier PO vide :
pnpm run locale:extractCela crée
packages/admin/src/locales/{your-locale}/messages.poavec toutes les chaînes prêtes à être traduites. -
Traduisez et testez en suivant les étapes ci-dessus.
Standards de traduction
Précision
Les traductions doivent représenter fidèlement le texte source en anglais, au niveau d’un locuteur natif. N’ajoutez, ne supprimez et ne réinterprétez pas le sens. Si une chaîne source est ambiguë, consultez le commentaire #: pour l’emplacement du fichier source et lisez le code du composant pour comprendre le contexte.
Cohérence
Utilisez une terminologie cohérente au sein de votre langue. Si vous traduisez « collection » par « Sammlung » à un endroit, ne passez pas à « Kollektion » ailleurs. Si votre langue dispose déjà de traductions, lisez le fichier PO existant avant de commencer afin de respecter la terminologie établie.
Ton
L’interface d’administration adopte un ton direct et professionnel. Reproduisez-le dans votre langue : évitez les formulations trop formelles ou trop familières.
Traductions assistées par IA
Vous pouvez générer des traductions avec des outils d’IA, y compris une première passe complète, mais un locuteur courant doit superviser le résultat :
- Un locuteur courant doit relire chaque chaîne. Les outils d’IA commettent des erreurs subtiles que seul un locuteur courant détecte : mauvais registre, tournures peu naturelles, termes techniques incorrects.
- Un locuteur courant doit prévisualiser les traductions dans l’interface d’administration en cours d’exécution. Les outils d’IA n’ont aucune connaissance des contraintes de mise en page ni du contexte de l’interface.
- Signalez l’utilisation de l’IA dans la description de votre PR.
- Les PR contenant des traductions automatiques non supervisées seront fermées.
Traductions partielles
Les traductions partielles sont les bienvenues. Vous n’avez pas besoin de traduire toutes les chaînes dans une seule PR : toute avancée est utile. Les chaînes non traduites se rabattront sur l’anglais à l’exécution.