Traduire EmDash

Sur cette page

L’interface d’administration d’EmDash est traduisible en utilisant Lingui pour l’extraction des messages et Lunaria pour le suivi de la progression des traductions. Toutes les traductions sont stockées dans des fichiers PO (gettext) — un par langue.

État de la traduction

Consultez le tableau de bord des traductions pour voir la progression actuelle dans 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 révise chaque chaîne et la prévisualise dans le panneau d’administration en cours d’exécution avant de la soumettre. Les sorties machine non supervisées ne sont pas acceptées. Voir Traductions assistées par IA et Tester vos traductions ci-dessous.

Laisser une chaîne non traduite est préférable à une traduction incorrecte. Une mauvaise traduction induit les utilisateurs en erreur ; la solution de secours en anglais ne fait que les déranger.

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 utilisera l’anglais par défaut à l’exécution.

Traduire les chaînes

  1. Consultez le tableau de bord des traductions pour voir ce qui nécessite du travail. Vérifiez les PR ouvertes pour éviter de dupliquer les efforts.

  2. Forkez le dépôt et créez une branche :

    git checkout -b i18n/de
  3. Ouvrez le fichier PO de votre langue (par exemple, packages/admin/src/locales/de/messages.po).

  4. Remplissez les traductions. Chaque entrée ressemble à ceci :

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

    Remplissez le msgstr :

    #: packages/admin/src/components/LoginPage.tsx:304
    msgid "Sign in with Passkey"
    msgstr "Mit Passkey anmelden"
  5. Testez vos traductions (voir ci-dessous).

  6. Ouvrez une PR ciblant main. Format du titre : i18n(de): add/update German translations.

Quoi traduire

  • La valeur msgstr pour chaque entrée.

Quoi NE 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 style XML comme <0>, </0> — elles enveloppent des éléments interactifs (liens, boutons). Conservez les balises et traduisez le texte entre elles.
  • Les commentaires commençant par #: — ce sont des références de 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>) enveloppent des composants React. Les deux doivent apparaître dans votre traduction exactement comme ils apparaissent dans la source — mêmes noms, même imbrication.

Tester vos traductions

  1. Compilez et exécutez la démo :

    pnpm run locale:compile
    pnpm build
    pnpm --filter emdash-demo dev
  2. Changez la langue dans la page Paramètres de l’administration et vérifiez que vos traductions sont correctes en contexte.

Langue pseudo

EmDash intègre une langue pseudo qui transforme toutes les chaînes enveloppées en sosies accentués — "Dashboard" devient "Ðàšĥƀöàřð", et ainsi de suite. Toute chaîne qui apparaît en anglais normal lorsque la langue pseudo est active manque soit d’un wrapper t\…“, soit provient de l’extérieur du catalogue.

Pour l’activer, ajoutez ce qui suit à votre fichier .env dans le répertoire de démonstration :

EMDASH_PSEUDO_LOCALE=1

Ensuite, redémarrez le serveur de développement. La langue pseudo apparaît comme Pseudo dans le sélecteur de langue sur la page de connexion et dans Paramètres. Basculez vers celle-ci pour repérer les chaînes non enveloppées d’un coup d’œil.

Ajouter une nouvelle langue

Si votre langue n’a pas encore de fichier PO :

  1. Ajoutez la langue à 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
    ];

    C’est la source unique de vérité — lingui.config.ts, lunaria.config.ts et le runtime d’administration dérivent tous leurs listes de langues de ce fichier. Définissez enabled: false sauf si vos traductions ont une couverture à 100 % — un mainteneur l’activera une fois que la traduction atteindra une couverture suffisante.

  2. Exécutez l’extraction pour générer le fichier PO vide :

    pnpm run locale:extract

    Cela crée packages/admin/src/locales/{your-locale}/messages.po avec toutes les chaînes prêtes à traduire.

  3. Traduisez et testez en suivant les étapes ci-dessus.

Normes de traduction

Précision

Les traductions doivent représenter fidèlement le texte source en anglais au niveau d’un locuteur natif. N’ajoutez pas, ne supprimez pas et ne réinterprétez pas le sens. Si une chaîne source est ambiguë, vérifiez le commentaire #: pour l’emplacement du fichier source — lisez le code du composant pour comprendre le contexte.

Cohérence

Utilisez une terminologie cohérente dans votre langue. Si vous traduisez “collection” par “Sammlung” à un endroit, ne changez pas pour “Kollektion” ailleurs. Si votre langue a déjà des traductions, lisez le fichier PO existant avant de commencer pour correspondre à la terminologie établie.

Ton

L’interface d’administration utilise un ton direct et professionnel. Adaptez-vous à cela dans votre langue — évitez les formulations trop formelles ou trop décontractées.

Traductions assistées par IA

Vous pouvez générer des traductions avec des outils IA, y compris un premier passage complet, mais un locuteur courant doit superviser le résultat :

  • Un locuteur courant doit réviser chaque chaîne. Les outils IA font des erreurs subtiles que seul un locuteur courant détecte — mauvais registre, formulation non naturelle, termes techniques incorrects.
  • Un locuteur courant doit prévisualiser les traductions dans l’interface d’administration en cours d’exécution. Les outils IA n’ont aucune conscience des contraintes de mise en page ou du contexte de l’interface utilisateur.
  • Divulguez l’utilisation de l’IA dans la description de votre PR.
  • Les PR avec des traductions machine non supervisées seront fermées.

Traductions partielles

Les traductions partielles sont les bienvenues. Vous n’avez pas besoin de traduire chaque chaîne dans une PR — tout progrès aide. Les chaînes non traduites utiliseront l’anglais par défaut à l’exécution.