v3 : interface Svelte — accueil, groupes, lecteur du texte en vigueur, panneau contextuel, éditeur à assistant, trustinWallet
- Accueil sobre, menu complet à gauche (Décisions, Docs de référence, Mandats, Protocoles), intro demandée, quatre sections, connexion Ğ1. - Lecteur : texte en vigueur en Literata, actions contextuelles par article (le vote, propositions, proposer), propositions en cours sous la « surface » avec leur niveau d'eau, aperçus « si les bien cotées passent » / « si tout passe », langue du texte fr/en/es (traductions éditoriales). - Panneau : vote pour/contre, seuil et formule (MathML), inertie et son changement (voté en inertie +), coquille sans vote, traduction, signalement de contradiction, historique des corrections. - trustinWallet (/acces) : groupes et membres, invitations à usage unique, administrateurs, retours d'usage. - Contrôles : vitest (markdown, catalogues, anti-lexique), Playwright C1–C10 + M1. - Sections du seed portées jusqu'à l'écran. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,321 @@
|
||||
// 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.',
|
||||
|
||||
'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.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.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>;
|
||||
Reference in New Issue
Block a user