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 dans des fichiers PO (gettext) — un par locale.

État de la traduction

Consultez le tableau de bord des traductions pour 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 fonctionnement avant de soumettre. Les résultats machine non supervisés ne sont pas acceptés. 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 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    # Anglais (source)
├── de/
│   └── messages.po    # Allemand
└── ...

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

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

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

    git checkout -b i18n/fr
  3. Ouvrez le fichier PO de votre locale (ex., packages/admin/src/locales/fr/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 "Se connecter avec Passkey"
  5. Testez vos traductions (voir ci-dessous).

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

Ce qu’il faut traduire

  • La valeur msgstr de 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} — gardez-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 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 "Erreur d'authentification : {error}"

msgid "Don't have an account? <0>Sign up</0>"
msgstr "Vous n'avez pas de compte ? <0>Inscrivez-vous</0>"

msgid "If an account exists for <0>{email}</0>, we've sent a sign-in link."
msgstr "Si un compte existe pour <0>{email}</0>, nous avons envoyé un lien de connexion."

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 dans la source — mêmes noms, même imbrication.

Tester vos traductions

  1. Compiler et lancer la démo :

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

Locale pseudo

EmDash inclut une locale pseudo qui transforme toutes les chaînes enveloppées en imitations accentuées — "Dashboard" devient "Ðàšĥƀöàřð", et ainsi de suite. Toute chaîne qui apparaît en anglais normal lorsque la locale pseudo est active n’a pas de wrapper 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

Puis redémarrez le serveur de développement. La locale pseudo apparaît comme Pseudo dans le sélecteur de langue sur la page de connexion et dans les Paramètres. Basculez dessus 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 locale à 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 },  // ajoutez la vôtre
    ];

    C’est la source unique de vérité — lingui.config.ts, lunaria.config.ts et le runtime de l’admin dérivent tous leurs listes de locales de ce fichier. Définissez enabled: false pendant que la traduction est en cours. Un mainteneur active la locale une fois qu’elle a une couverture suffisante pour l’utilisation dans l’interface d’administration.

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

    pnpm run locale:extract

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

  3. 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 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 au sein de votre locale. Si vous traduisez « collection » par « collection » à un endroit, ne passez pas à « recueil » ailleurs. Si votre langue a déjà des traductions, parcourez le fichier PO existant avant de commencer pour correspondre à la terminologie établie.

Ton

L’interface d’administration utilise un ton direct et professionnel. Reproduisez cela dans votre langue — évitez un langage trop formel ou trop familier.

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 réviser chaque chaîne. Les outils d’IA commettent des erreurs subtiles que seul un locuteur courant détecte — registre incorrect, formulation peu naturelle, termes techniques incorrects.
  • Un locuteur courant doit prévisualiser les traductions dans l’interface d’administration en fonctionnement. Les outils d’IA n’ont aucune connaissance des contraintes de mise en page ou du contexte de l’UI.
  • Mentionnez 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 en une seule PR — tout progrès aide. Les chaînes non traduites se rabattront sur l’anglais à l’exécution.