Files
decision/web/src/lib/i18n/fr.ts
T
YvvandClaude Opus 5.5 ac9c904e7e v3 : seconde relecture — une coquille ne touche ni chiffre, ni signe, ni relation ; retour arrière du déploiement
- Correction de coquille : un chiffre, un signe, un séparateur dans un nombre ou
  une relation changés (« >= » → « <= », « + » → « - », « 182.625 » → « 182 625 »,
  « % » → « ‰ ») rendent la modification « de fond ». Testé dans le moteur et
  par l'API sur le vrai texte K1.
- Déploiement : les conteneurs retirés de la racine qui tournaient sont notés ;
  si la suite échoue, l'étape « retablir » arrête le produit et les relance.
  Le produit est recréé à chaque déploiement (--force-recreate).
- Cookies préfixés en https : __Host-ld_session, __Secure-ld_oauth (pas de
  cookie planté par un site voisin sous librodrome.org).
- syft épinglé (v1.55.0) dans les deux pipelines : ce conteneur a le socket Docker.
- Docs : limites connues assumées, groupe d'essai à deux voix, error.identity_kind.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 04:54:30 +02:00

329 lines
17 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Source unique des libellés de l'interface — en français d'abord.
// Ton : on tutoie la personne ; le sujet est la personne ou le collectif,
// jamais la formule ni le système. Les clés en/es doivent être identiques
// (vérifié à la compilation). Termes interdits : tests/unit/lexicon.test.ts.
export const fr = {
'app.name': 'libreDecision',
'app.skip': 'Aller au contenu',
'nav.label': 'Boîte à outils',
'nav.home': 'Accueil',
'nav.decisions': 'Décisions',
'nav.docs': 'Docs de référence',
'nav.mandates': 'Mandats',
'nav.protocols': 'Protocoles',
'nav.soon': 'à venir',
'nav.groups': 'Mes groupes',
'nav.access': 'Accès',
'nav.access.hint': 'trustinWallet',
'nav.feedback': 'Faire un retour',
'nav.signin': 'Se connecter',
'nav.signout': 'Se déconnecter',
'nav.mood.toNight': 'Ambiance nuit',
'nav.mood.toStone': 'Ambiance pierre',
'nav.lang': 'Langue',
'nav.menu': 'Menu',
'nav.close': 'Fermer',
'home.title': 'Rendre possible la décision collective',
'home.subtitle': 'en fonction du contexte, processus et modalités, boîte à outils',
'home.decisions': "Un parcours assisté pour choisir les bonnes modalités de décision, et tenir le journal des décisions.",
'home.docs': "Acte d'engagement, licence, charte, constitution : des textes vivants, sous vote permanent.",
'home.mandates': 'Créer et révoquer tout type de mandat.',
'home.protocols': "Des workflows pour s'organiser sans organe statutaire : rôles tournants et automatisations techniques.",
'home.open': 'ouvert',
'home.soon': 'à venir',
'home.signin': 'Se connecter avec sa clé Ğ1',
'home.signin.note': 'Le même accès que le forum Monnaie libre : tu signes dans Ğecko, sans mot de passe.',
'home.continue': 'Ouvrir mes groupes',
'signin.title': 'Se connecter',
'signin.g1': 'Se connecter avec Ğ1',
'signin.g1.how': "Tu es envoyé sur connect.monnaie-libre.fr, le service de connexion du forum Monnaie libre. Tu y approuves la connexion dans Ğecko (lien ou QR code), puis tu reviens ici. Aucun mot de passe, aucune clé ne nous est transmise.",
'signin.g1.members': 'Réservé aux membres de la toile de confiance Ğ1.',
'signin.g1.pending': "La connexion Ğ1 arrive : l'inscription de libreDecision auprès de connect.monnaie-libre.fr est en cours. En attendant, on entre avec un lien d'invitation.",
'signin.invite': "Tu as reçu un lien d'invitation ? Ouvre-le simplement : il te connecte.",
'signin.dev': 'Connexion de développement',
'signin.dev.name': 'Nom',
'signin.dev.admin': 'administrateur des accès',
'signin.dev.go': 'Entrer',
'signin.error.refus': 'La connexion a été refusée sur connect.monnaie-libre.fr.',
'signin.error.etat': 'La connexion a expiré ou vient d’un autre navigateur. Recommence depuis ce navigateur.',
'signin.error.incomplet': 'Le retour de connect.monnaie-libre.fr était incomplet. Recommence.',
'signin.error.echange': 'connect.monnaie-libre.fr ne répond pas. Réessaie dans un moment.',
'signin.error.interne': 'La connexion a échoué de notre côté. Réessaie dans un moment.',
'invite.title': 'Invitation',
'invite.working': 'Connexion en cours…',
'invite.invalid': "Ce lien d'invitation n'est plus valable : il a déjà servi ou il a expiré. Demande un nouveau lien à la personne qui te l'a envoyé.",
'invite.missing': "Ce lien est incomplet. Ouvre le lien d'invitation entier, tel que tu l'as reçu.",
'groups.title': 'Mes groupes',
'groups.same.key': 'Groupes qui utilisent la même clé',
'groups.locked': 'Réservé à ses membres',
'groups.locked.long': "Ce groupe s'ouvre à ses membres. L'accès se demande à un administrateur de trustinWallet.",
'groups.test': 'Pour les essais',
'groups.open': 'Ouvrir',
'groups.empty': "Aucun groupe n'est visible pour l'instant.",
'group.tools': 'Outils',
'group.tool.soon': 'Cet outil arrive plus tard.',
'group.docs.empty': "Aucun document de référence dans ce groupe pour l'instant.",
'docs.title': 'Docs de référence',
'docs.inForce.one': '{n} article en vigueur',
'docs.inForce.other': '{n} articles en vigueur',
'docs.open.one': '{n} proposition en cours',
'docs.open.other': '{n} propositions en cours',
'doc.view.label': 'Lire',
'doc.view.inforce': 'En vigueur',
'doc.view.wellrated': 'Si les bien cotées passent',
'doc.view.all': 'Si tout passe',
'doc.view.wellrated.note': "Aperçu : le texte tel qu'il serait si les propositions bien cotées entraient en vigueur. Rien n'est adopté.",
'doc.view.all.note': "Aperçu : le texte tel qu'il serait si toutes les propositions entraient en vigueur, même peu soutenues. Rien n'est adopté.",
'doc.view.empty': 'Aucune proposition ne change le texte dans cet aperçu.',
'doc.mark.added': 'ajouté',
'doc.mark.replaced': 'modifié',
'doc.mark.removed': 'retiré',
'doc.lang.label': 'Langue du texte',
'doc.lang.translation': 'Traduction éditoriale, sans vote. Le texte qui fait foi est en français.',
'doc.lang.original': "Lire l'original",
'doc.lang.stale': 'traduction à revoir',
'doc.lang.missing': 'pas encore traduit',
'doc.seed': 'seed a minima',
'doc.seed.long': "Entré en vigueur sans vote, pour ne pas partir d'une page blanche. Il reste sous vote : 0 vote pour l'instant.",
'doc.confirmed': 'confirmé par le vote',
'doc.adopted': 'adopté le {date}',
'doc.action.vote': 'Le vote',
'doc.action.proposals': 'Propositions',
'doc.action.propose': 'Proposer une modification',
'doc.empty': "Aucun article n'est en vigueur. Les propositions ci-dessous remontent dès qu'elles atteignent leur seuil.",
'doc.published': 'Publié sur le dépôt des textes',
'doc.publish.pending': 'Publication en attente',
'deep.title': 'Propositions en cours',
'deep.note': "Pas encore en vigueur. Chacune remonte dès qu'elle atteint son seuil : au moins {floor} voix pour, puis la majorité que demande son inertie.",
'deep.new': 'Proposer un nouvel article',
'deep.drafts': 'Tes brouillons',
'deep.drafts.note': 'Non soumis au vote. Toi seul les vois.',
'deep.rival': 'remplacerait « {title} »',
'deep.addition': 'nouvel article',
'deep.removal': 'retrait de « {title} »',
'deep.inertia': 'inertie : {level}',
'deep.blocked': 'bloquée',
'deep.mine': 'ta proposition',
'deep.stale': 'à reconfirmer',
'deep.wellrated': 'bien cotée',
'deep.filter.all': 'Toutes',
'deep.filter.wellrated': 'Bien cotées',
'deep.filter.mine': 'Les miennes',
'deep.none': 'Aucune proposition dans ce filtre.',
'deep.variant': 'variante {label}',
'section.introduction': 'Introduction',
'section.fondamental': 'Engagements fondamentaux',
'section.technique': 'Engagements techniques',
'section.conclusion': 'Conclusion',
'section.annexe': 'Annexes',
'section.formule': 'Formule de vote',
'section.inertie': 'Inertie',
'section.ordonnancement': 'Ordonnancement',
'tally.short': '{for} pour · {against} contre',
'tally.required': 'Seuil : {n} voix pour',
'tally.missing.one': 'Il manque {n} voix pour.',
'tally.missing.other': 'Il manque {n} voix pour.',
'tally.reached': 'Seuil atteint.',
'tally.level': 'Niveau : {pct} % du seuil',
'inertia.low': 'inertie faible',
'inertia.standard': 'inertie standard',
'inertia.high': 'inertie haute',
'inertia.max': 'inertie maximale',
'inertia.level.low': 'faible',
'inertia.level.standard': 'standard',
'inertia.level.high': 'haute',
'inertia.level.max': 'maximale',
'panel.vote': 'Le vote',
'panel.proposals': 'Propositions',
'panel.propose': 'Proposer',
'panel.close': 'Fermer le panneau',
'panel.inforce': 'En vigueur',
'panel.proposal': 'Proposition',
'panel.by': 'proposé par {name}',
'panel.seed.origin': 'texte issu du seed',
'panel.changes': 'Voir les changements',
'panel.text': 'Voir le texte',
'vote.yours': 'Ton vote',
'vote.for': 'Pour',
'vote.against': 'Contre',
'vote.retract': 'Retirer mon vote',
'vote.saved': 'Vote enregistré.',
'vote.retracted': 'Vote retiré.',
'vote.stale': "Le texte a changé de fond depuis ton vote : ton vote ne compte plus tant que tu ne l'as pas reconfirmé.",
'vote.reconfirm': 'Reconfirmer : {choice}',
'vote.private': 'Ton vote ne se montre à personne : seuls les totaux sont visibles.',
'vote.blocked': "Un signalement de contradiction la retient : elle ne peut pas entrer en vigueur tant qu'il tient.",
'vote.entered': '« {title} » est entré en vigueur.',
'vote.entered.remove': '« {title} » est retiré du texte en vigueur.',
'vote.entered.inertia': "L'inertie de « {title} » a changé.",
'vote.closed': 'Cette version ne se vote plus.',
'vote.wotOnly': 'Ici, seuls les membres de la toile de confiance Ğ1 votent : connecte-toi avec ta clé Ğ1 pour voter. Tu peux lire, proposer et signaler une contradiction.',
'inertia.title': 'Inertie',
'inertia.explain': "Plus l'inertie est haute, plus il faut de voix pour changer ce texte quand peu de gens votent.",
'inertia.change': "Proposer un changement d'inertie",
'inertia.change.to': 'Nouvelle inertie',
'inertia.change.note': "Un changement d'inertie se vote lui-même avec l'inertie au-dessus : {level}.",
'inertia.change.submit': 'Soumettre au vote',
'inertia.change.open': "Changement d'inertie en cours : vers {level}",
'formula.title': 'La formule du seuil',
'formula.intro': 'Le nombre de voix pour exigé, R, dépend de la participation :',
'formula.W': "W — électorat : {n} ({source})",
'formula.W.wot': 'membres de la toile de confiance Ğ1',
'formula.W.group': 'membres du groupe',
'formula.T': 'T — voix exprimées : {n}',
'formula.M': 'M — majorité à pleine participation : {n} %',
'formula.G': 'G — gradient : {n}',
'formula.B': 'B — base : {n}',
'formula.C': 'C — minimum de voix pour : {n}',
'formula.R': 'R — seuil actuel : {n} voix pour',
'formula.reading': "À faible participation, il faut presque l'unanimité ; quand tout le monde vote, la majorité M suffit. Rien ne passe sous C voix pour.",
'history.title': 'Corrections',
'history.initial': 'texte initial',
'history.typo': 'coquille corrigée',
'history.substantive': 'changement de fond (votes à reconfirmer)',
'history.by': 'par {name}',
'typo.title': 'Corriger une coquille',
'typo.note': "Accents, ponctuation, faute de frappe : la correction s'applique sans vote, avec son auteur et son diff. Un changement de sens passe par une proposition.",
'typo.save': 'Enregistrer la correction',
'typo.done': 'Coquille corrigée, sans toucher aux votes.',
'typo.substantive': 'Ce changement touche au sens : propose-le comme modification.',
'typo.asProposal': 'En faire une proposition',
'signal.title': 'Contradictions',
'signal.none': 'Aucun signalement.',
'signal.add': 'Signaler une contradiction',
'signal.target': 'Contredit',
'signal.reason': 'En quoi ces deux textes se contredisent',
'signal.send': 'Signaler',
'signal.sent': 'Signalement enregistré.',
'signal.note': "Tant qu'un signalement tient, ces deux textes ne peuvent pas être en vigueur ensemble. Son auteur le lève ; un changement de fond le fait tomber.",
'signal.lift': 'Lever',
'signal.lifted': 'levé',
'signal.lifted.revision': 'tombé : le texte a changé',
'signal.by': 'par {name}',
'propose.mode.replace': 'Modifier ce texte',
'propose.mode.remove': 'Retirer cet article',
'propose.mode.new': 'Nouvel article',
'propose.after': 'Placer après',
'propose.after.end': 'à la fin',
'propose.title': 'Titre',
'propose.body': 'Texte',
'propose.remove.note': 'La proposition de retrait se vote comme une autre ; si elle passe, l’article sort du texte en vigueur.',
'propose.draft': 'Enregistrer le brouillon',
'propose.submit': 'Soumettre au vote',
'propose.drafted': 'Brouillon enregistré.',
'propose.submitted': 'Proposition soumise au vote.',
'propose.rule': "Tant que c'est un brouillon, tu le modifies librement. Une fois soumis, une coquille se corrige sans toucher aux votes ; un changement de fond demande aux votants de reconfirmer.",
'propose.edit': 'Modifier',
'propose.withdraw': 'Retirer ma proposition',
'propose.withdrawn': 'Proposition retirée.',
'propose.saved.typo': 'Correction enregistrée, les votes restent.',
'propose.saved.substantive': 'Nouvelle version enregistrée : les votants devront reconfirmer.',
'assist.title': 'Assistant',
'assist.quiet': 'Rien à signaler : une proposition, une décision.',
'assist.split': 'Ce texte semble porter {n} décisions. Une proposition = une décision : les découper ?',
'assist.split.do': 'Découper en {n} brouillons',
'assist.split.done': 'Découpé en {n} brouillons.',
'assist.similar': 'Proche de « {title} »{where}.',
'assist.similar.inForce': ' (en vigueur)',
'assist.similar.variant': 'En faire une variante de cet article',
'assist.long': 'Texte long ({n} signes) : un article court se vote mieux.',
'translate.title': 'Traduire ({lang})',
'translate.save': 'Enregistrer la traduction',
'translate.saved': 'Traduction enregistrée.',
'translate.note': 'Les traductions ne se votent pas. Elles passent « à revoir » quand le texte français change de fond.',
'feedback.title': 'Faire un retour',
'feedback.prompt': "Ce que tu as fait, ce que tu attendais, ce qui s'est passé.",
'feedback.send': 'Envoyer le retour',
'feedback.sent': 'Retour envoyé. Merci.',
'feedback.context': "L'adresse de la page, la langue et la taille de l'écran sont jointes.",
'access.title': 'trustinWallet — accès',
'access.intro': "Qui ouvre quel groupe. Monnaie libre s'ouvre de lui-même aux membres de la toile de confiance Ğ1 ; les autres groupes s'ouvrent un par un.",
'access.groups': 'Groupes',
'access.members.none': 'Aucun membre accordé.',
'access.members.wot': '+ tous les membres de la toile Ğ1',
'access.grant': 'Accorder',
'access.revoke': 'Retirer',
'access.choose': 'Choisir une identité',
'access.invitations': 'Invitations',
'access.invite.label': 'Pour qui',
'access.invite.groups': 'Groupes ouverts par le lien',
'access.invite.admin': 'administrateur des accès',
'access.invite.create': "Créer le lien d'invitation",
'access.invite.link': "Lien d'invitation, à usage unique, valable 14 jours. Il ne s'affichera plus : copie-le maintenant.",
'access.invite.copy': 'Copier le lien',
'access.invite.copied': 'Lien copié.',
'access.invite.cancel': 'Annuler',
'access.invite.pending': 'En attente',
'access.identities': 'Identités',
'access.admin': 'administrateur',
'access.admin.give': 'Rendre administrateur',
'access.admin.take': 'Retirer le rôle',
'access.kind.g1': 'Ğ1',
'access.kind.invite': 'invitation',
'access.kind.dev': 'dev',
'access.member': 'membre de la toile',
'access.feedback': 'Retours',
'access.feedback.none': 'Aucun retour.',
'access.feedback.seen': 'Vu',
'access.feedback.done': 'Traité',
'access.publication': "Publication des textes",
'access.publication.remote': "Dépôt : {remote}",
'access.publication.key': "Clé de déploiement du serveur. Ajoute-la avec le droit d'écriture sur ce dépôt (Paramètres › Dépôt › Clés de déploiement) : sans elle, les publications attendent.",
'access.publication.none': "La publication n'est pas configurée sur ce serveur.",
'access.denied': 'La gestion des accès est réservée aux administrateurs de trustinWallet.',
'soon.title': 'À venir',
'soon.body': "Cet outil arrive plus tard. Les chantiers s'ouvrent un par un : d'abord les docs de référence.",
'error.unauthenticated': 'Connecte-toi pour continuer.',
'error.forbidden': "Tu n'as pas accès à cette page.",
'error.not_found': "Cette page n'existe pas, ou elle ne t'est pas visible.",
'error.network': 'Le serveur ne répond pas. Vérifie ta connexion et réessaie.',
'error.internal': 'Quelque chose a échoué de notre côté. Réessaie dans un moment.',
'error.title': 'Le titre est vide ou trop long (120 signes au plus).',
'error.body': 'Le texte est vide ou trop long (4 000 signes au plus).',
'error.reason': 'Dis en quelques mots en quoi ces textes se contredisent (10 à 600 signes).',
'error.substantive_not_author': "Ce changement touche au sens : seul l'auteur de la proposition peut le faire. Propose ta propre version.",
'error.substantive_in_force': 'Ce changement touche au sens : propose-le comme modification.',
'error.same_unit': "Ces deux textes visent le même article : ils ne peuvent de toute façon pas être en vigueur ensemble.",
'error.last_admin': 'Il faut garder au moins un administrateur.',
'error.g1_not_configured': "La connexion Ğ1 n'est pas encore active.",
'error.invitation_invalid': "Ce lien d'invitation n'est plus valable.",
'error.identity_kind': "Un nouveau lien ne peut viser qu'une personne invitée, jamais une identité Ğ1.",
'error.wot_members_only': 'Ici, seuls les membres de la toile de confiance Ğ1 votent.',
'error.retry': 'Réessayer',
'common.cancel': 'Annuler',
'common.close': 'Fermer',
'common.save': 'Enregistrer',
'common.loading': 'Chargement…',
'common.back': 'Retour',
} as const;
export type Key = keyof typeof fr;
export type Messages = Record<Key, string>;