Aller au contenu

Internationalisation (i18n)

Les produits et la documentation de l'écosystème sont servis en plusieurs langues. Cette page explique la politique linguistique et sa mise en œuvre technique.

Politique linguistique

Niveau Langues
Obligatoire Монгол (mn) · English (en)
Pour les produits principaux + 中文 (zh) · Русский (ru)
Pour la documentation d'écosystème Mongol + les six langues officielles de l'ONU

Le mongol est la langue source : le texte d'origine est rédigé en mongol puis traduit vers les autres langues.

Les six langues officielles des Nations unies sont : العربية (ar) · 中文 (zh) · English (en) · Français (fr) · Русский (ru) · Español (es). Ce site (documentation au niveau de l'écosystème) est servi en mongol plus ces six langues — sept au total.

Pourquoi précisément ces langues ?

Les lecteurs de la documentation d'écosystème ne sont pas seulement des développeurs internes : on y trouve des partenaires internationaux, des bailleurs, des organismes de normalisation et des intégrateurs étrangers. Les six langues de l'ONU offrent la portée mondiale la plus large et constituent un choix neutre, qui ne privilégie aucun pays.

La documentation technique approfondie d'une plateforme donnée (schémas d'endpoints, référence des SDK) sort du champ de cette politique : elle reste en MN + EN dans son propre dépôt.

L'i18n dans les produits

Les applications déterminent la langue de l'utilisateur dans cet ordre :

  1. Le réglage de l'utilisateur (enregistré dans son profil),
  2. L'Accept-Language du navigateur,
  3. La langue par défaut (mn).

L'assistant IA répond dans la langue de l'utilisateur — celle dans laquelle la question est arrivée.

Les deux couches de dictionnaire

Le dictionnaire réside à deux endroits, et il importe d'en comprendre la frontière :

Dictionnaire Taille
Partagé — connexion, menu, administration, eID @gerege/ui-core 846 clés × 7 langues
De plateforme — la terminologie du domaine concerné lib/<platform>I18n.ts Propre à chaque plateforme, souvent 2–4 langues

La règle : le dictionnaire partagé ne connaît que la surface partagée. Le vocabulaire IBAN/relevés du portefeuille, le catalogue d'API du portail développeur, la terminologie des processus métier de Ring — tout cela réside dans le dictionnaire propre à l'application.

La raison en est le coût : placer les 1,104 termes de Ring dans le dictionnaire partagé, c'est les faire porter par kiosk, POS et le portefeuille — et chaque langue ajoutée multiplie ce coût par sept.

Un dictionnaire de plateforme se replie sur l'anglais pour les langues non traduites : l'interface peut donc exister en sept langues alors que le texte marketing et la terminologie métier n'existent que dans quelques-unes.

Langue d'interface ≠ langue de contenu

Passer le dictionnaire de quatre langues à sept a cassé chaque endroit où figurait Record<Lang, …> : le texte marketing de la landing, les descriptions du catalogue d'API — ceux-là sont écrits par des humains et ne s'étendent pas comme l'interface. À ces endroits, l'ensemble des langues se déclare explicitement, par exemple sous la forme LANDING_LANGS.

L'i18n dans la documentation

Le site de documentation de chaque dépôt utilise MkDocs Material + mkdocs-static-i18n.

La structure par suffixe

La traduction se fait en ajoutant un code de langue au nom du fichier :

docs/
├── index.md        ← Монгол (par défaut)
├── index.ar.md     ← العربية
├── index.zh.md     ← 中文
├── index.en.md     ← English
├── index.fr.md     ← Français
├── index.ru.md     ← Русский
└── index.es.md     ← Español

Configuration :

plugins:
  - i18n:
      docs_structure: suffix
      fallback_to_default: true
      reconfigure_material: true
      reconfigure_search: true
      languages:
        - locale: mn
          default: true
          name: Монгол
          build: true
        - locale: en
          name: English
          build: true
        - locale: ar
          name: العربية
          build: true
        # … zh · fr · ru · es de même

La langue par défaut est construite à la racine du site (/), les autres sous un sous-chemin (/en/, /ar/, /zh/, /fr/, /ru/, /es/).

Repli (fallback)

fallback_to_default: true — une page non traduite affiche son contenu dans la langue par défaut. Ainsi, même si des traductions manquent, le site reste complet et aucun 404 n'apparaît.

C'est le choix pragmatique : la documentation s'enrichit sans cesse et la traduction suit avec retard. Attendre que toutes les pages soient traduites d'un coup reviendrait à ne pas publier la documentation du tout.

Traduction de la navigation

Les libellés du menu se trouvent dans mkdocs.yml et non dans le contenu des pages ; ils sont donc traduits séparément pour chaque locale :

        - locale: en
          nav_translations:
            Архитектур: Architecture
            Платформууд: Platforms
        - locale: ar
          nav_translations:
            Архитектур: البنية المعمارية
            Платформууд: المنصّات

Si vous ajoutez une page en oubliant d'ajouter son entrée nav_translations pour les six locales, ce libellé restera en mongol : la construction n'échoue pas, l'oubli ne se voit donc qu'à l'œil.

Écriture de droite à gauche (RTL)

العربية se lit de droite à gauche. Material reconnaît la locale ar, pose <html dir="rtl"> et inverse de lui-même le menu, les titres et le sens des tableaux — inutile d'indiquer direction séparément.

En revanche, les blocs de code et les diagrammes ASCII restent de gauche à droite, même en RTL. C'est normal : une notation technique (URL, commandes, YAML) perd son sens si l'on en inverse le sens de lecture.

Ancres des titres en cyrillique

Le slugify standard supprime les lettres cyrilliques

Le slugify par défaut de l'extension toc de Python-Markdown supprime les caractères non ASCII. De ce fait, le titre ## Танилт reçoit un id vide et le lien interne à la page (#танилт) cesse de fonctionner.

La solution : un slugify qui préserve l'unicode.

markdown_extensions:
  - toc:
      permalink: true
      slugify: !!python/object/apply:pymdownx.slugs.slugify {kwds: {case: lower}}

Ce site est configuré de la même façon.

L'ordre de traduction

Pour ajouter une nouvelle documentation :

  1. Rédigez le texte source en mongol — la source est toujours le mongol.
  2. Stabilisez la version mongole par une construction stricte (liens et ancres sont vérifiés).
  3. Traduisez ensuite dans les six langues d'un seul tenant. Traduire une page à moitié désynchronise les langues entre elles.

Terminez une page dans toutes les langues

Mieux vaut travailler page par page que langue par langue : convertir un même document en six langues simultanément garde la terminologie, la structure et les lignes des tableaux identiques. À l'inverse, « d'abord l'anglais pour toutes les pages » condamne les langues traduites plus tard à courir après un texte source déjà modifié.

Ce qui se traduit et ce qui ne se traduit pas

Traduit Laissé tel quel
Texte courant, titres, valeurs des tableaux Noms de domaine (sso.gerege.mn)
Explications, avertissements, conseils Noms de dépôts (template-gerege-mn)
Libellés explicatifs dans les diagrammes Code, YAML, commandes, chemins d'endpoints
En-têtes de tableaux Noms de produits (eID Mongolia, G-Sign)
Texte des badges d'état Noms de standards (OIDC, PKCE, RFC 3161)

Les noms de fichiers et l'arborescence ne sont jamais traduits : c'est platforms/sso.ru.md, pas платформы/sso.md. Ainsi le chemin de l'URL reste identique d'une langue à l'autre et les liens profonds continuent de fonctionner.

L'état de ce site

Toutes les pages de la documentation d'écosystème sont prêtes en sept langues :

Locale Langue Chemin État
mn Монгол (par défaut) / ✅ complet
ar العربية /ar/ ✅ complet
zh 中文 /zh/ ✅ complet
en English /en/ ✅ complet
fr Français /fr/ ✅ complet
ru Русский /ru/ ✅ complet
es Español /es/ ✅ complet

fallback_to_default reste activé : lorsqu'une page est ajoutée et que sa traduction tarde, cette page affiche l'original mongol et le site reste complet.

Si vous repérez une erreur ou une formulation maladroite, envoyez une PR au dépôt — voir Cette plateforme documentaire.