Fusion du lot F : objections redit / contredit, coquilles validées par leur auteur, messagerie, délai de 3 jours

Conflits avec B2 : docs.rs garde shown_tally / shown_evaluation et votable ;
proposals.rs sert les totaux montrés et « votable » ; CONTROLES réunit C24
(« faire une objection », le panier par son adresse), C28–C33 et les deux passages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-10-31 05:57:21 +01:00
co-authored by Claude Opus 5.5
55 changed files with 5435 additions and 456 deletions
+109 -18
View File
@@ -11,6 +11,9 @@ export const en: Messages = {
'nav.mandates': 'Mandates',
'nav.protocols': 'Protocols',
'nav.groups': 'My groups',
'nav.messages': 'Messages',
'nav.messages.count.one': 'Messages, {n} unread',
'nav.messages.count.other': 'Messages, {n} unread',
'nav.docs.count.one': '{label}, {n} document in progress',
'nav.docs.count.other': '{label}, {n} documents in progress',
'nav.access': 'Access',
@@ -137,7 +140,7 @@ export const en: Messages = {
'deep.addition': 'new article',
'deep.removal': 'removal of “{title}”',
'deep.inertia': 'inertia to {level}',
'deep.blocked': 'blocked',
'deep.held': 'not open to vote: objection',
'deep.mine': 'your proposal',
'deep.stale': 'needs reconfirming',
'deep.wellrated': 'well-rated',
@@ -198,7 +201,14 @@ export const en: Messages = {
'vote.stale': 'The text has changed in substance since you voted: your vote no longer counts until you reconfirm it.',
'vote.reconfirm': 'Reconfirm: {choice}',
'vote.private': 'Nobody sees your vote: only the totals are visible.',
'vote.blocked': "A contradiction flag is holding it back: it can't come into force while the flag stands.",
'vote.held': 'An objection is holding this version back: it cannot be voted on until the objection is lifted. Votes already cast stay.',
'vote.held.redit': 'It repeats “{other}”.',
'vote.held.contredit': 'It contradicts “{other}”.',
'vote.held.author.redit': 'For it to be voted on again, change the article it repeats. The person who raised the objection then lifts it or reiterates it; with no answer from them within 3 days, it is lifted.',
'vote.held.author.contredit': 'For it to be voted on again, reword it. The person who raised the objection then lifts it or reiterates it; with no answer from them within 3 days, it is lifted.',
'vote.held.waiting': 'An answer came: {name} lifts or reiterates the objection by {date}; with no answer, it is lifted.',
'vote.held.mine': 'You raised this objection: lift it when the answer suits you.',
'vote.held.mine.asked': 'An answer came: lift your objection if it suits you, or reiterate it, by {date}. With no answer from you, it is lifted.',
'vote.entered': '“{title}” has come into force.',
'vote.entered.remove': '“{title}” has been removed from the text in force.',
'vote.entered.inertia': 'The inertia of “{title}” has changed.',
@@ -218,9 +228,9 @@ export const en: Messages = {
'vote.choice.none': 'withdrawing your vote',
'vote.chain.note': 'Your vote leaves from your Ğ1 wallet: {amount} Ğ1, in a single gesture. The chain shows that you voted, never what you voted.',
'vote.chain.counts': 'Your voice counts for the Ğ1 identity of the wallet that signs, if it is a member of the web of trust.',
'vote.chain.off': 'Voting through the Ğ1 chain is not open yet: the account that receives the votes is still to be created. You can read, propose and flag a contradiction.',
'vote.chain.off': 'Voting through the Ğ1 chain is not open yet: the account that receives the votes is still to be created. You can read, propose and raise an objection.',
'vote.members': 'Only members of this group vote here.',
'vote.details': 'Typos, translations, flags, history',
'vote.details': 'Typos, translations, objections, history',
'ballot.reason.not_member': 'the wallet that signed is not that of a member of the Ğ1 web of trust.',
'ballot.reason.no_identity': 'the wallet that signed is linked to no Ğ1 identity.',
'ballot.reason.transfer': 'the transfer to the vote account is missing, or its amount is too low.',
@@ -247,6 +257,7 @@ export const en: Messages = {
'basket.sent.other': '{n} votes saved.',
'basket.section': 'Vote on this section',
'basket.mine': 'your vote: {choice}',
'basket.held': 'not open to vote: an objection holds it back',
'sign.title': 'Vote with your Ğ1 wallet',
'sign.summary.one': '{n} vote, in one transaction: {amount} Ğ1 to the vote account, with your sealed ballot.',
'sign.summary.other': '{n} votes, in one transaction: {amount} Ğ1 to the vote account, with your sealed ballot.',
@@ -360,27 +371,98 @@ export const en: Messages = {
'history.typo': 'typo fixed',
'history.substantive': 'substantive change (votes to reconfirm)',
'history.amendment': 'starting text replaced',
'history.revert': 'fix taken back by the author',
'history.by': 'by {name}',
'history.typo.validated': 'validated by {name}',
'history.typo.deadline': 'applied with no answer within 3 days',
'typo.title': 'Fix a typo',
'typo.note': 'Accents, capitals, typos, words run together or split: the fix applies without a vote, with its author and its diff. Punctuation, figures, formulas, addresses and any change in meaning go through a proposal.',
'typo.note': "Accents, capitals, typos, words run together or split: the fix is not voted on. On your own text, it applies at once. On someone else's, its author validates it (an administrator for a seed text); with no answer within 3 days, it applies. Punctuation, figures, formulas, addresses and any change in meaning go through a proposal.",
'typo.save': 'Save the fix',
'typo.done': 'Typo fixed, votes untouched.',
'typo.substantive': 'This edit affects the meaning: propose it as a change.',
'typo.asProposal': 'Make it a proposal',
'typo.pending.author': 'Your fix waits for the author of the text: it applies when they validate it, or by itself on {date}.',
'typo.pending.admin': 'Your fix waits for an administrator, as this text comes from the seed: it applies when they validate it, or by itself on {date}.',
'typo.list': 'Suggested typo fixes',
'typo.by': 'suggested by {name}',
'typo.status.pending': 'waiting: applies by itself on {date}',
'typo.status.applied': 'applied',
'typo.status.refused': 'refused',
'typo.status.stale': 'out of date: the text changed meanwhile',
'typo.settled.by': 'by {name}',
'typo.settled.deadline': 'with no answer within 3 days',
'typo.validate': 'Validate',
'typo.refuse': 'Refuse',
'typo.undo': 'Go back to the text before',
'typo.redo': 'Apply after all',
'typo.validated': 'Fix applied.',
'typo.refused': 'Fix refused.',
'signal.title': 'Contradictions',
'signal.none': 'No flags.',
'signal.add': 'Flag a contradiction',
'signal.target': 'Contradicts',
'signal.reason': 'How these two texts contradict each other',
'signal.send': 'Flag',
'signal.sent': 'Flag saved.',
'signal.note': "While a flag stands, these two texts can't be in force together. Its author lifts it; a substantive change makes it lapse.",
'signal.lift': 'Lift',
'signal.lifted': 'lifted',
'signal.lifted.revision': 'lapsed: the text changed',
'signal.by': 'by {name}',
'objection.title': 'Objections',
'objection.none': 'No objection.',
'objection.add': 'Raise an objection',
'objection.kind': 'Your objection',
'objection.kind.redit': 'Repeats',
'objection.kind.contredit': 'Contradicts',
'objection.kind.redit.hint': 'this text repeats another article',
'objection.kind.contredit.hint': 'this text says the opposite of another article',
'objection.target': 'Which article?',
'objection.reason.redit': 'How these two texts say the same thing',
'objection.reason.contredit': 'How these two texts contradict each other',
'objection.send': 'Send the objection',
'objection.sent': 'Objection saved: the later of the two versions cannot be voted on until it is lifted.',
'objection.note': 'An objection makes the later of the two versions not open to vote until it is lifted — never a text in force. Its author answers: for a repetition, they change the article it repeats; for a contradiction, they reword. You then lift the objection or reiterate it; with no answer from you within 3 days, it is lifted.',
'objection.says.redit': '“{held}” repeats “{other}”',
'objection.says.contredit': '“{held}” contradicts “{other}”',
'objection.by': 'objection by {name}',
'objection.held.here': 'this version cannot be voted on',
'objection.phase.author': "waiting for the author's answer",
'objection.phase.objector': 'answer received: lifted or reiterated by {date}, otherwise lifted by itself',
'objection.answer.revision': 'answer: the held text was reworded',
'objection.answer.other': 'answer: the other text changed',
'objection.answer.proposal': 'answer: a linked proposal',
'objection.lifted.objector': 'lifted by the person who raised it',
'objection.lifted.admin': 'lifted by an administrator',
'objection.lifted.deadline': 'lifted: 3 days without follow-up',
'objection.lifted.withdrawn': 'lifted: the proposal was withdrawn',
'objection.lifted.revision': 'lapsed: the text changed',
'objection.lift': 'Lift the objection',
'objection.lift.admin': 'Lift the objection (administrator)',
'objection.reiterate': 'Reiterate the objection',
'objection.done.lifted': 'Objection lifted.',
'objection.done.reiterated': 'Objection reiterated: a new answer is awaited.',
'objection.respond.redit': 'Change the article it repeats',
'objection.respond.contredit': 'Reword',
'objection.linked': 'This proposal answers an objection: once submitted, the person who raised it lifts it or reiterates it.',
'messages.title': 'Messages',
'messages.intro': 'What waits for a gesture from you: an objection to answer, a typo fix to validate. Each message carries its deadline; a message dealt with asks nothing more.',
'messages.none': 'No messages for now.',
'messages.readAll': 'Mark all as read',
'messages.read': 'Mark as read',
'messages.unread': 'unread',
'messages.due': 'deadline: {date}',
'messages.open': 'See it in the text',
'messages.topic.objection': 'Objection',
'messages.topic.typo': 'Typo',
'messages.objection_raised.redit': '{name} raises an objection: your version “{held}” repeats “{other}”. It cannot be voted on until the objection is lifted. To answer, change the article it repeats.',
'messages.objection_raised.contredit': '{name} raises an objection: your version “{held}” contradicts “{other}”. It cannot be voted on until the objection is lifted. To answer, reword it.',
'messages.objection_reiterated': '{name} reiterates their objection: “{held}” still cannot be voted on. Answer again.',
'messages.objection_answered': 'Your objection on “{held}” has been answered. Lift it if the answer suits you, or reiterate it. With no answer from you, it is lifted.',
'messages.typo_pending.author': '{name} suggests a typo fix in your version “{title}”.',
'messages.typo_pending.admin': '{name} suggests a typo fix in “{title}”, a seed text: an administrator validates it.',
'messages.respond': 'Answer',
'messages.outcome.answered': 'answered',
'messages.outcome.reiterated': 'objection reiterated',
'messages.outcome.lifted': 'objection lifted',
'messages.outcome.admin': 'objection lifted by an administrator',
'messages.outcome.deadline.objection': 'objection lifted: 3 days without follow-up',
'messages.outcome.deadline.typo': 'fix applied: 3 days without an answer',
'messages.outcome.withdrawn': 'proposal withdrawn',
'messages.outcome.applied': 'fix applied',
'messages.outcome.refused': 'fix refused',
'messages.outcome.stale': 'fix out of date: the text changed',
'messages.outcome.done': 'dealt with',
'propose.mode.replace': 'Change this text',
'propose.mode.remove': 'Remove this article',
@@ -491,7 +573,7 @@ export const en: Messages = {
'error.internal': 'Something failed on our side. Try again in a moment.',
'error.title': 'The title is empty or too long (120 characters max).',
'error.body': 'The text is empty or too long (4,000 characters max).',
'error.reason': 'Say in a few words how these texts contradict each other (10 to 600 characters).',
'error.reason': 'Say in a few words what your objection rests on (10 to 600 characters).',
'error.substantive_not_author': "This edit affects the meaning: only the proposal's author can make it. Propose your own version.",
'error.substantive_in_force': 'This edit affects the meaning: propose it as a change.',
'error.same_unit': "These two texts target the same article: they can't be in force together anyway.",
@@ -516,6 +598,15 @@ export const en: Messages = {
'error.author': 'This account is not a Ğ1 address.',
'error.not_votable': 'This version is no longer open for voting.',
'error.members_only': 'Only members of this group vote here.',
'error.objection': 'An objection is holding this version back: it cannot be voted on until the objection is lifted.',
'error.kind': 'Say whether this text repeats the other or contradicts it.',
'error.other': 'Choose another article, in force or proposed.',
'error.both_in_force': 'Both texts are in force: an objection always targets a version that is not in force yet.',
'error.objection_exists': 'You already have an objection standing on these two texts.',
'error.nothing_to_reiterate': 'Nothing to reiterate: no answer has come yet.',
'error.lifted': 'This objection is already lifted.',
'error.settled': 'This fix is already decided.',
'error.link': 'This proposal cannot answer this objection: it targets another article, or the objection is lifted.',
'error.retry': 'Try again',
'common.cancel': 'Cancel',