feat(app): the operator's overview of screens, grants to several people at once with one budget each, assistants by provider

Halkyon Learn's ADR 0021, D57 to D63, on halkyon_base's budgets and
effort:

- The operator's screen is an overview (Waiting, Operators, Accounts,
  Assistants, each with its count) whose rows open screens of their own,
  read 50 at a time as they scroll (OperatorListCubit, OperatorPage), so
  hundreds of accounts push nothing else down (D62).
- A handle is picked among the accounts there are (AccountSuggestionField):
  appointing an operator and granting take no other (D61).
- AssistantGrantsScreen replaces AssistantGrantsCard: the assistants set
  up by provider, with their efforts and prices; the people granted, found
  by their handle's start; one sheet granting several assistants, a
  provider's at once, to several people, each with one budget in money and
  tokens a day and a month, or changing one person's (D58, D59).
- Assistants are grouped by provider wherever they are listed, each under
  its name with a dot in its colour (ProviderLabel, D60).
- AssistantsCard shows what is left of the person's budget for all their
  assistants together; the months of the figures run oldest first (D57).
- AssistantChoice says the efforts a question may ask at and the ceiling
  on output each asks for (D63); a person's own key gets none and keeps
  4,096 tokens.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-26 16:05:49 +01:00
commit cc87120bc8
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
5 changed files with 5348 additions and 2709 deletions

View file

@ -314,6 +314,9 @@
"operatorAccounts": "Konten und Admins",
"operatorWaitingCount": "{count, plural, =0{Niemand wartet auf Freigabe} =1{1 Konto wartet auf Freigabe} other{{count} Konten warten auf Freigabe}}",
"operatorWaitingTitle": "Wartend",
"operatorOperatorsCount": "{count, plural, =1{1 Admin} other{{count} Admins}}",
"operatorAccountsTitle": "Konten",
"operatorAccountsCount": "{count, plural, =1{1 Konto} other{{count} Konten}}",
"operatorNobodyWaits": "Niemand wartet.",
"operatorNoHandle": "Noch kein Handle",
"operatorNewSince": "Neu, wartet seit {date}",
@ -331,7 +334,7 @@
"operatorAppointMessage": "Admins geben hier Konten frei, lehnen sie ab, sperren sie und ernennen Admins, so wie du.",
"operatorAppointConfirm": "Ernennen",
"operatorHandle": "Handle",
"operatorFindTitle": "Ein Konto finden",
"operatorHandleSuggested": "Vorgeschlagen werden nur Handles, die es hier gibt.",
"operatorFoundNone": "Kein Handle beginnt so.",
"operatorMadeOn": "Seit {date}",
"operatorIsOperator": "Admin",
@ -350,27 +353,39 @@
"operatorInvalidLimit": "Eine Grenze kann nicht unter null liegen.",
"assistantGrantsTitle": "Assistenten",
"assistantGrantsNone": "Noch hat niemand einen Assistenten.",
"assistantSetCount": "{count, plural, =0{Keiner eingerichtet} =1{1 Assistent} other{{count} Assistenten}}",
"assistantPeopleCount": "{count, plural, =0{niemandem freigegeben} =1{1 Person} other{{count} Personen}}",
"assistantSetUpTitle": "Hier eingerichtet",
"assistantPeopleTitle": "Personen",
"assistantGranteesFoundNone": "Niemand mit Assistenten hat ein Handle, das so beginnt.",
"assistantUnpriced": "Ohne Preise: zählt nur Tokens",
"assistantEffort": "{effort, select, low{niedrig} medium{mittel} high{hoch} xhigh{sehr hoch} max{maximal} other{{effort}}}",
"assistantEffortName": "{effort, select, low{Niedrig} medium{Mittel} high{Hoch} xhigh{Sehr hoch} max{Maximal} other{{effort}}}",
"assistantEffortSetUp": "Denkaufwand {effort}, bis {max}",
"assistantEffortFixed": "Denkaufwand {effort}",
"assistantNameUnset": "{name} (nicht mehr eingerichtet)",
"assistantNotAgreedCount": "{count, plural, =1{1 noch ohne Zustimmung} other{{count} noch ohne Zustimmung}}",
"assistantGrant": "Assistenten freigeben",
"assistantGrantSave": "Freigeben",
"assistantGrantChange": "Grenzen ändern",
"assistantGrantAssistant": "Assistent",
"assistantGrantDaily": "Grenze pro Tag",
"assistantGrantMonthly": "Grenze pro Monat",
"assistantGrantChange": "Assistenten ändern",
"assistantGrantLimitHelper": "Leer für keine. Tage und Monate nach UTC.",
"assistantGrantBudget": "Budget, für alle zusammen",
"assistantGrantMoneyDaily": "Geld pro Tag",
"assistantGrantMoneyMonthly": "Geld pro Monat",
"assistantGrantTokensDaily": "Tokens pro Tag",
"assistantGrantTokensMonthly": "Tokens pro Monat",
"assistantGrantMoneyNote": "Geld zählt die Assistenten mit Preisen, Tokens zählen alle. Was zuerst aufgebraucht ist, hält sie an.",
"assistantGrantReplaces": "{count, plural, =1{Die Freigabe ersetzt das Budget dieser Person:} other{Die Freigabe ersetzt die Budgets dieser Personen:}}",
"assistantGrantUnsetDropped": "Beim Speichern wird zurückgenommen, was nicht mehr eingerichtet ist: {names}.",
"assistantGrantLimitInvalid": "Keine Zahl, die das nimmt",
"assistantGrantNoHandle": "Kein Konto hat dieses Handle.",
"assistantGrantTokens": "Tokens",
"assistantGrantNote": "Vor der ersten Frage stimmen sie zu, was wohin geht. Du siehst, wie viel sie nutzen, nie, was sie fragen.",
"assistantGrantNote": "Vor der ersten Frage stimmen sie zu, was wohin geht. Assistenten, die sie schon haben, bleiben. Du siehst, wie viel sie nutzen, nie, was sie fragen.",
"assistantPerDay": "{amount} pro Tag",
"assistantPerMonth": "{amount} pro Monat",
"assistantNoLimits": "Ohne Grenzen",
"assistantGrantAgreed": "Zugestimmt",
"assistantGrantNotAgreed": "Noch nicht zugestimmt",
"assistantGrantOutdated": "Die Preise haben sich geändert: Grenzen neu setzen",
"assistantGrantUnset": "Nicht mehr eingerichtet",
"assistantRevoke": "Zurücknehmen",
"assistantRevokeTitle": "{assistant} zurücknehmen?",
"assistantRevokeMessage": "Sie können ihn nicht mehr fragen. Was sie genutzt haben, bleibt gezählt.",
"assistantRevokeAllTitle": "Alle Assistenten zurücknehmen?",
"assistantRevokeMessage": "Sie können keinen mehr fragen, und ihr Budget entfällt. Was sie genutzt haben, bleibt gezählt.",
"assistantUseByMonth": "Nutzung nach Monat",
"assistantUseTitle": "Nutzung der Assistenten",
"assistantUseNone": "In diesem Monat nichts genutzt.",
@ -381,8 +396,8 @@
"assistantModelAt": "{model} bei {host}",
"assistantLeftToday": "{left} von {limit} heute übrig",
"assistantLeftThisMonth": "{left} von {limit} diesen Monat übrig",
"assistantYourBudget": "Dein Budget, für alle zusammen",
"assistantAgree": "Lesen und zustimmen",
"assistantWaitsForLimits": "Wartet darauf, dass seine Grenzen neu gesetzt werden",
"assistantYourUse": "Deine Nutzung",
"assistantPrivacyPage": "Was auf {instance} wohin geht",
"assistantOwnTitle": "Mit deinem eigenen Schlüssel",
@ -415,9 +430,9 @@
"assistantConsentAgreedOn": "Du hast am {date} zugestimmt.",
"assistantProblemNotGranted": "Dieser Assistent ist für dich nicht mehr freigegeben.",
"assistantProblemNotAgreed": "Stimm zuerst zu, was wohin geht.",
"assistantProblemInvalidEffort": "Mit diesem Denkaufwand antwortet er nicht.",
"assistantProblemLimitReached": "Seine Grenze ist bis {time} erreicht.",
"assistantProblemLimitReachedNow": "Seine Grenze ist vorerst erreicht.",
"assistantProblemLimitOutdated": "Es wartet darauf, dass seine Grenzen neu gesetzt werden.",
"assistantProblemImagesNotRead": "Es liest keine Bilder.",
"assistantProblemMalformed": "Diese Frage kann nicht gesendet werden.",
"assistantProblemTooLarge": "Diese Frage ist zu lang oder enthält zu viele oder zu große Bilder.",

View file

@ -764,6 +764,28 @@
"@operatorWaitingTitle": {
"description": "The card of accounts that wait for approval, new or suspended."
},
"operatorOperatorsCount": "{count, plural, =1{1 operator} other{{count} operators}}",
"@operatorOperatorsCount": {
"description": "How many operate the instance, in the overview's row.",
"placeholders": {
"count": {
"type": "int"
}
}
},
"operatorAccountsTitle": "Accounts",
"@operatorAccountsTitle": {
"description": "The overview's row leading to every account, and that screen's title."
},
"operatorAccountsCount": "{count, plural, =1{1 account} other{{count} accounts}}",
"@operatorAccountsCount": {
"description": "How many accounts the instance has.",
"placeholders": {
"count": {
"type": "int"
}
}
},
"operatorNobodyWaits": "Nobody waits.",
"@operatorNobodyWaits": {
"description": "The waiting card, empty."
@ -842,9 +864,9 @@
"@operatorHandle": {
"description": "The field for an account's handle."
},
"operatorFindTitle": "Find an account",
"@operatorFindTitle": {
"description": "The card searching accounts by the start of their handle."
"operatorHandleSuggested": "Only handles there are here are suggested.",
"@operatorHandleSuggested": {
"description": "Below a field suggesting handles as they are typed."
},
"operatorFoundNone": "No account's handle starts like this.",
"@operatorFoundNone": {
@ -923,7 +945,98 @@
"@assistantGrantsNone": {
"description": "No assistant is granted to anyone."
},
"assistantGrant": "Grant an assistant",
"assistantSetCount": "{count, plural, =0{None set up} =1{1 assistant} other{{count} assistants}}",
"@assistantSetCount": {
"description": "How many assistants are set up, in the overview's row.",
"placeholders": {
"count": {
"type": "int"
}
}
},
"assistantPeopleCount": "{count, plural, =0{nobody granted} =1{1 person} other{{count} people}}",
"@assistantPeopleCount": {
"description": "How many people have an assistant, after how many are set up.",
"placeholders": {
"count": {
"type": "int"
}
}
},
"assistantSetUpTitle": "Set up here",
"@assistantSetUpTitle": {
"description": "The card of the assistants set up in deploy/assistants.env."
},
"assistantPeopleTitle": "People",
"@assistantPeopleTitle": {
"description": "The card, and the sheet section, of the people granted assistants."
},
"assistantGranteesFoundNone": "Nobody with an assistant has a handle starting like this.",
"@assistantGranteesFoundNone": {
"description": "No person granted one matches the start of a handle typed."
},
"assistantUnpriced": "No prices: counts its tokens only",
"@assistantUnpriced": {
"description": "An assistant set up without prices, which a budget counts in tokens alone."
},
"assistantEffort": "{effort, select, low{low} medium{medium} high{high} xhigh{extra high} max{max} other{{effort}}}",
"@assistantEffort": {
"description": "How much a model thinks before it answers, as a word in a sentence.",
"placeholders": {
"effort": {
"type": "String"
}
}
},
"assistantEffortName": "{effort, select, low{Low} medium{Medium} high{High} xhigh{Extra high} max{Max} other{{effort}}}",
"@assistantEffortName": {
"description": "How much a model thinks before it answers, as a name standing alone, as in a menu.",
"placeholders": {
"effort": {
"type": "String"
}
}
},
"assistantEffortSetUp": "Effort {effort}, up to {max}",
"@assistantEffortSetUp": {
"description": "An assistant's effort unless asked otherwise, and the highest a question may ask.",
"placeholders": {
"effort": {
"type": "String"
},
"max": {
"type": "String"
}
}
},
"assistantEffortFixed": "Effort {effort}",
"@assistantEffortFixed": {
"description": "An assistant's effort, the only one it takes.",
"placeholders": {
"effort": {
"type": "String"
}
}
},
"assistantNameUnset": "{name} (no longer set up)",
"@assistantNameUnset": {
"description": "An assistant granted that is no longer set up.",
"placeholders": {
"name": {
"type": "String"
}
}
},
"assistantNotAgreedCount": "{count, plural, =1{1 not agreed to yet} other{{count} not agreed to yet}}",
"@assistantNotAgreedCount": {
"description": "How many of a person's assistants they haven't agreed to yet.",
"placeholders": {
"count": {
"type": "int"
}
}
},
"assistantGrant": "Grant assistants",
"@assistantGrant": {
"description": "Opens the sheet granting an assistant to an account."
},
@ -931,39 +1044,65 @@
"@assistantGrantSave": {
"description": "The grant sheet's button."
},
"assistantGrantChange": "Change limits",
"assistantGrantChange": "Change assistants",
"@assistantGrantChange": {
"description": "A grant's menu item, and the sheet's title, changing its limits."
},
"assistantGrantAssistant": "Assistant",
"@assistantGrantAssistant": {
"description": "Above the choice of assistant in the grant sheet."
},
"assistantGrantDaily": "Limit a day",
"@assistantGrantDaily": {
"description": "The daily limit field."
},
"assistantGrantMonthly": "Limit a month",
"@assistantGrantMonthly": {
"description": "The monthly limit field."
"description": "The sheet changing a person's assistants and budget, and a person's menu item."
},
"assistantGrantLimitHelper": "Empty for none. Days and months are UTC's.",
"@assistantGrantLimitHelper": {
"description": "Under the limit fields: the instance counts by UTC days and months (D42)."
},
"assistantGrantBudget": "Budget, for all of them together",
"@assistantGrantBudget": {
"description": "The sheet's section of a person's budget."
},
"assistantGrantMoneyDaily": "Money a day",
"@assistantGrantMoneyDaily": {
"description": "A budget field."
},
"assistantGrantMoneyMonthly": "Money a month",
"@assistantGrantMoneyMonthly": {
"description": "A budget field."
},
"assistantGrantTokensDaily": "Tokens a day",
"@assistantGrantTokensDaily": {
"description": "A budget field."
},
"assistantGrantTokensMonthly": "Tokens a month",
"@assistantGrantTokensMonthly": {
"description": "A budget field."
},
"assistantGrantMoneyNote": "Money counts the assistants with prices, tokens count every one. Whichever runs out first stops them.",
"@assistantGrantMoneyNote": {
"description": "Below the budget fields."
},
"assistantGrantReplaces": "{count, plural, =1{Granting replaces the budget this person has:} other{Granting replaces the budgets these people have:}}",
"@assistantGrantReplaces": {
"description": "Before the people whose budget a grant replaces, each with theirs.",
"placeholders": {
"count": {
"type": "int"
}
}
},
"assistantGrantUnsetDropped": "Saving takes back what is no longer set up: {names}.",
"@assistantGrantUnsetDropped": {
"description": "Changing a person's assistants drops those no longer set up.",
"placeholders": {
"names": {
"type": "String"
}
}
},
"assistantGrantLimitInvalid": "Not a number this takes",
"@assistantGrantLimitInvalid": {
"description": "A limit typed that is no amount or number of tokens."
},
"assistantGrantNoHandle": "No account has this handle.",
"@assistantGrantNoHandle": {
"description": "The grant sheet: the handle typed is nobody's."
},
"assistantGrantTokens": "tokens",
"@assistantGrantTokens": {
"description": "After a limit in tokens, for an assistant without prices."
},
"assistantGrantNote": "They agree once to what goes where before they ask it. You see how much they use, never what they ask.",
"assistantGrantNote": "They agree once to what goes where before they ask one. Assistants they have already stay. You see how much they use, never what they ask.",
"@assistantGrantNote": {
"description": "In the grant sheet: consent (D40) and what the operator sees (D3)."
},
@ -989,36 +1128,15 @@
"@assistantNoLimits": {
"description": "A grant without limits."
},
"assistantGrantAgreed": "Agreed",
"@assistantGrantAgreed": {
"description": "A grant whose person agreed to what goes where."
},
"assistantGrantNotAgreed": "Not agreed yet",
"@assistantGrantNotAgreed": {
"description": "A grant whose person hasn't agreed yet."
},
"assistantGrantOutdated": "Its prices changed: set its limits again",
"@assistantGrantOutdated": {
"description": "A grant whose limits are in another unit than the pricing now; it answers nothing until set again."
},
"assistantGrantUnset": "No longer set up",
"@assistantGrantUnset": {
"description": "A grant of an assistant taken out of deploy/assistants.env."
},
"assistantRevoke": "Take back",
"@assistantRevoke": {
"description": "A grant's menu item."
},
"assistantRevokeTitle": "Take back {assistant}?",
"@assistantRevokeTitle": {
"description": "Asks before taking a grant back.",
"placeholders": {
"assistant": {
"type": "String"
}
}
"assistantRevokeAllTitle": "Take back every assistant?",
"@assistantRevokeAllTitle": {
"description": "Asks before taking every assistant back from a person."
},
"assistantRevokeMessage": "They can no longer ask it. What they used stays counted.",
"assistantRevokeMessage": "They can no longer ask any of them, and their budget goes. What they used stays counted.",
"@assistantRevokeMessage": {
"description": "Under the question taking a grant back."
},
@ -1096,14 +1214,14 @@
}
}
},
"assistantYourBudget": "Your budget, for all of them",
"@assistantYourBudget": {
"description": "The person's budget for all their assistants."
},
"assistantAgree": "Read and agree",
"@assistantAgree": {
"description": "Opens the consent sheet of an assistant not agreed to yet."
},
"assistantWaitsForLimits": "Waits for its limits to be set again",
"@assistantWaitsForLimits": {
"description": "An assistant whose limits are outdated: it answers nothing until the operator sets them again."
},
"assistantYourUse": "Your use",
"@assistantYourUse": {
"description": "Opens the person's own figures."
@ -1276,6 +1394,10 @@
"@assistantProblemNotAgreed": {
"description": "notAgreed."
},
"assistantProblemInvalidEffort": "It doesn't think at this effort.",
"@assistantProblemInvalidEffort": {
"description": "A question asked an effort its assistant does not take."
},
"assistantProblemLimitReached": "Its limit is reached until {time}.",
"@assistantProblemLimitReached": {
"description": "limitReached, with when it resets.",
@ -1289,10 +1411,6 @@
"@assistantProblemLimitReachedNow": {
"description": "Refused: a limit is reached, the instance not saying until when."
},
"assistantProblemLimitOutdated": "It waits for its limits to be set again.",
"@assistantProblemLimitOutdated": {
"description": "limitOutdated."
},
"assistantProblemImagesNotRead": "It reads no images.",
"@assistantProblemImagesNotRead": {
"description": "imagesNotRead."

View file

@ -1987,6 +1987,24 @@ abstract class HalkyonAppLocalizations {
/// **'Waiting'**
String get operatorWaitingTitle;
/// How many operate the instance, in the overview's row.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 operator} other{{count} operators}}'**
String operatorOperatorsCount(int count);
/// The overview's row leading to every account, and that screen's title.
///
/// In en, this message translates to:
/// **'Accounts'**
String get operatorAccountsTitle;
/// How many accounts the instance has.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 account} other{{count} accounts}}'**
String operatorAccountsCount(int count);
/// The waiting card, empty.
///
/// In en, this message translates to:
@ -2089,11 +2107,11 @@ abstract class HalkyonAppLocalizations {
/// **'Handle'**
String get operatorHandle;
/// The card searching accounts by the start of their handle.
/// Below a field suggesting handles as they are typed.
///
/// In en, this message translates to:
/// **'Find an account'**
String get operatorFindTitle;
/// **'Only handles there are here are suggested.'**
String get operatorHandleSuggested;
/// A search that found nothing.
///
@ -2203,10 +2221,82 @@ abstract class HalkyonAppLocalizations {
/// **'Nobody has an assistant yet.'**
String get assistantGrantsNone;
/// How many assistants are set up, in the overview's row.
///
/// In en, this message translates to:
/// **'{count, plural, =0{None set up} =1{1 assistant} other{{count} assistants}}'**
String assistantSetCount(int count);
/// How many people have an assistant, after how many are set up.
///
/// In en, this message translates to:
/// **'{count, plural, =0{nobody granted} =1{1 person} other{{count} people}}'**
String assistantPeopleCount(int count);
/// The card of the assistants set up in deploy/assistants.env.
///
/// In en, this message translates to:
/// **'Set up here'**
String get assistantSetUpTitle;
/// The card, and the sheet section, of the people granted assistants.
///
/// In en, this message translates to:
/// **'People'**
String get assistantPeopleTitle;
/// No person granted one matches the start of a handle typed.
///
/// In en, this message translates to:
/// **'Nobody with an assistant has a handle starting like this.'**
String get assistantGranteesFoundNone;
/// An assistant set up without prices, which a budget counts in tokens alone.
///
/// In en, this message translates to:
/// **'No prices: counts its tokens only'**
String get assistantUnpriced;
/// How much a model thinks before it answers, as a word in a sentence.
///
/// In en, this message translates to:
/// **'{effort, select, low{low} medium{medium} high{high} xhigh{extra high} max{max} other{{effort}}}'**
String assistantEffort(String effort);
/// How much a model thinks before it answers, as a name standing alone, as in a menu.
///
/// In en, this message translates to:
/// **'{effort, select, low{Low} medium{Medium} high{High} xhigh{Extra high} max{Max} other{{effort}}}'**
String assistantEffortName(String effort);
/// An assistant's effort unless asked otherwise, and the highest a question may ask.
///
/// In en, this message translates to:
/// **'Effort {effort}, up to {max}'**
String assistantEffortSetUp(String effort, String max);
/// An assistant's effort, the only one it takes.
///
/// In en, this message translates to:
/// **'Effort {effort}'**
String assistantEffortFixed(String effort);
/// An assistant granted that is no longer set up.
///
/// In en, this message translates to:
/// **'{name} (no longer set up)'**
String assistantNameUnset(String name);
/// How many of a person's assistants they haven't agreed to yet.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 not agreed to yet} other{{count} not agreed to yet}}'**
String assistantNotAgreedCount(int count);
/// Opens the sheet granting an assistant to an account.
///
/// In en, this message translates to:
/// **'Grant an assistant'**
/// **'Grant assistants'**
String get assistantGrant;
/// The grant sheet's button.
@ -2215,48 +2305,72 @@ abstract class HalkyonAppLocalizations {
/// **'Grant'**
String get assistantGrantSave;
/// A grant's menu item, and the sheet's title, changing its limits.
/// The sheet changing a person's assistants and budget, and a person's menu item.
///
/// In en, this message translates to:
/// **'Change limits'**
/// **'Change assistants'**
String get assistantGrantChange;
/// Above the choice of assistant in the grant sheet.
///
/// In en, this message translates to:
/// **'Assistant'**
String get assistantGrantAssistant;
/// The daily limit field.
///
/// In en, this message translates to:
/// **'Limit a day'**
String get assistantGrantDaily;
/// The monthly limit field.
///
/// In en, this message translates to:
/// **'Limit a month'**
String get assistantGrantMonthly;
/// Under the limit fields: the instance counts by UTC days and months (D42).
///
/// In en, this message translates to:
/// **'Empty for none. Days and months are UTC\'s.'**
String get assistantGrantLimitHelper;
/// The sheet's section of a person's budget.
///
/// In en, this message translates to:
/// **'Budget, for all of them together'**
String get assistantGrantBudget;
/// A budget field.
///
/// In en, this message translates to:
/// **'Money a day'**
String get assistantGrantMoneyDaily;
/// A budget field.
///
/// In en, this message translates to:
/// **'Money a month'**
String get assistantGrantMoneyMonthly;
/// A budget field.
///
/// In en, this message translates to:
/// **'Tokens a day'**
String get assistantGrantTokensDaily;
/// A budget field.
///
/// In en, this message translates to:
/// **'Tokens a month'**
String get assistantGrantTokensMonthly;
/// Below the budget fields.
///
/// In en, this message translates to:
/// **'Money counts the assistants with prices, tokens count every one. Whichever runs out first stops them.'**
String get assistantGrantMoneyNote;
/// Before the people whose budget a grant replaces, each with theirs.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Granting replaces the budget this person has:} other{Granting replaces the budgets these people have:}}'**
String assistantGrantReplaces(int count);
/// Changing a person's assistants drops those no longer set up.
///
/// In en, this message translates to:
/// **'Saving takes back what is no longer set up: {names}.'**
String assistantGrantUnsetDropped(String names);
/// A limit typed that is no amount or number of tokens.
///
/// In en, this message translates to:
/// **'Not a number this takes'**
String get assistantGrantLimitInvalid;
/// The grant sheet: the handle typed is nobody's.
///
/// In en, this message translates to:
/// **'No account has this handle.'**
String get assistantGrantNoHandle;
/// After a limit in tokens, for an assistant without prices.
///
/// In en, this message translates to:
@ -2266,7 +2380,7 @@ abstract class HalkyonAppLocalizations {
/// In the grant sheet: consent (D40) and what the operator sees (D3).
///
/// In en, this message translates to:
/// **'They agree once to what goes where before they ask it. You see how much they use, never what they ask.'**
/// **'They agree once to what goes where before they ask one. Assistants they have already stay. You see how much they use, never what they ask.'**
String get assistantGrantNote;
/// A daily limit.
@ -2287,46 +2401,22 @@ abstract class HalkyonAppLocalizations {
/// **'No limits'**
String get assistantNoLimits;
/// A grant whose person agreed to what goes where.
///
/// In en, this message translates to:
/// **'Agreed'**
String get assistantGrantAgreed;
/// A grant whose person hasn't agreed yet.
///
/// In en, this message translates to:
/// **'Not agreed yet'**
String get assistantGrantNotAgreed;
/// A grant whose limits are in another unit than the pricing now; it answers nothing until set again.
///
/// In en, this message translates to:
/// **'Its prices changed: set its limits again'**
String get assistantGrantOutdated;
/// A grant of an assistant taken out of deploy/assistants.env.
///
/// In en, this message translates to:
/// **'No longer set up'**
String get assistantGrantUnset;
/// A grant's menu item.
///
/// In en, this message translates to:
/// **'Take back'**
String get assistantRevoke;
/// Asks before taking a grant back.
/// Asks before taking every assistant back from a person.
///
/// In en, this message translates to:
/// **'Take back {assistant}?'**
String assistantRevokeTitle(String assistant);
/// **'Take back every assistant?'**
String get assistantRevokeAllTitle;
/// Under the question taking a grant back.
///
/// In en, this message translates to:
/// **'They can no longer ask it. What they used stays counted.'**
/// **'They can no longer ask any of them, and their budget goes. What they used stays counted.'**
String get assistantRevokeMessage;
/// Opens everyone's figures (D3).
@ -2389,18 +2479,18 @@ abstract class HalkyonAppLocalizations {
/// **'{left} of {limit} left this month'**
String assistantLeftThisMonth(String left, String limit);
/// The person's budget for all their assistants.
///
/// In en, this message translates to:
/// **'Your budget, for all of them'**
String get assistantYourBudget;
/// Opens the consent sheet of an assistant not agreed to yet.
///
/// In en, this message translates to:
/// **'Read and agree'**
String get assistantAgree;
/// An assistant whose limits are outdated: it answers nothing until the operator sets them again.
///
/// In en, this message translates to:
/// **'Waits for its limits to be set again'**
String get assistantWaitsForLimits;
/// Opens the person's own figures.
///
/// In en, this message translates to:
@ -2593,6 +2683,12 @@ abstract class HalkyonAppLocalizations {
/// **'Agree to what goes where first.'**
String get assistantProblemNotAgreed;
/// A question asked an effort its assistant does not take.
///
/// In en, this message translates to:
/// **'It doesn\'t think at this effort.'**
String get assistantProblemInvalidEffort;
/// limitReached, with when it resets.
///
/// In en, this message translates to:
@ -2605,12 +2701,6 @@ abstract class HalkyonAppLocalizations {
/// **'Its limit is reached for now.'**
String get assistantProblemLimitReachedNow;
/// limitOutdated.
///
/// In en, this message translates to:
/// **'It waits for its limits to be set again.'**
String get assistantProblemLimitOutdated;
/// imagesNotRead.
///
/// In en, this message translates to:

View file

@ -1194,6 +1194,31 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
@override
String get operatorWaitingTitle => 'Wartend';
@override
String operatorOperatorsCount(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count Admins',
one: '1 Admin',
);
return '$_temp0';
}
@override
String get operatorAccountsTitle => 'Konten';
@override
String operatorAccountsCount(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count Konten',
one: '1 Konto',
);
return '$_temp0';
}
@override
String get operatorNobodyWaits => 'Niemand wartet.';
@ -1254,7 +1279,8 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
String get operatorHandle => 'Handle';
@override
String get operatorFindTitle => 'Ein Konto finden';
String get operatorHandleSuggested =>
'Vorgeschlagen werden nur Handles, die es hier gibt.';
@override
String get operatorFoundNone => 'Kein Handle beginnt so.';
@ -1319,6 +1345,101 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
@override
String get assistantGrantsNone => 'Noch hat niemand einen Assistenten.';
@override
String assistantSetCount(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count Assistenten',
one: '1 Assistent',
zero: 'Keiner eingerichtet',
);
return '$_temp0';
}
@override
String assistantPeopleCount(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count Personen',
one: '1 Person',
zero: 'niemandem freigegeben',
);
return '$_temp0';
}
@override
String get assistantSetUpTitle => 'Hier eingerichtet';
@override
String get assistantPeopleTitle => 'Personen';
@override
String get assistantGranteesFoundNone =>
'Niemand mit Assistenten hat ein Handle, das so beginnt.';
@override
String get assistantUnpriced => 'Ohne Preise: zählt nur Tokens';
@override
String assistantEffort(String effort) {
String _temp0 = intl.Intl.selectLogic(
effort,
{
'low': 'niedrig',
'medium': 'mittel',
'high': 'hoch',
'xhigh': 'sehr hoch',
'max': 'maximal',
'other': '$effort',
},
);
return '$_temp0';
}
@override
String assistantEffortName(String effort) {
String _temp0 = intl.Intl.selectLogic(
effort,
{
'low': 'Niedrig',
'medium': 'Mittel',
'high': 'Hoch',
'xhigh': 'Sehr hoch',
'max': 'Maximal',
'other': '$effort',
},
);
return '$_temp0';
}
@override
String assistantEffortSetUp(String effort, String max) {
return 'Denkaufwand $effort, bis $max';
}
@override
String assistantEffortFixed(String effort) {
return 'Denkaufwand $effort';
}
@override
String assistantNameUnset(String name) {
return '$name (nicht mehr eingerichtet)';
}
@override
String assistantNotAgreedCount(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count noch ohne Zustimmung',
one: '1 noch ohne Zustimmung',
);
return '$_temp0';
}
@override
String get assistantGrant => 'Assistenten freigeben';
@ -1326,33 +1447,56 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
String get assistantGrantSave => 'Freigeben';
@override
String get assistantGrantChange => 'Grenzen ändern';
@override
String get assistantGrantAssistant => 'Assistent';
@override
String get assistantGrantDaily => 'Grenze pro Tag';
@override
String get assistantGrantMonthly => 'Grenze pro Monat';
String get assistantGrantChange => 'Assistenten ändern';
@override
String get assistantGrantLimitHelper =>
'Leer für keine. Tage und Monate nach UTC.';
@override
String get assistantGrantLimitInvalid => 'Keine Zahl, die das nimmt';
String get assistantGrantBudget => 'Budget, für alle zusammen';
@override
String get assistantGrantNoHandle => 'Kein Konto hat dieses Handle.';
String get assistantGrantMoneyDaily => 'Geld pro Tag';
@override
String get assistantGrantMoneyMonthly => 'Geld pro Monat';
@override
String get assistantGrantTokensDaily => 'Tokens pro Tag';
@override
String get assistantGrantTokensMonthly => 'Tokens pro Monat';
@override
String get assistantGrantMoneyNote =>
'Geld zählt die Assistenten mit Preisen, Tokens zählen alle. Was zuerst aufgebraucht ist, hält sie an.';
@override
String assistantGrantReplaces(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'Die Freigabe ersetzt die Budgets dieser Personen:',
one: 'Die Freigabe ersetzt das Budget dieser Person:',
);
return '$_temp0';
}
@override
String assistantGrantUnsetDropped(String names) {
return 'Beim Speichern wird zurückgenommen, was nicht mehr eingerichtet ist: $names.';
}
@override
String get assistantGrantLimitInvalid => 'Keine Zahl, die das nimmt';
@override
String get assistantGrantTokens => 'Tokens';
@override
String get assistantGrantNote =>
'Vor der ersten Frage stimmen sie zu, was wohin geht. Du siehst, wie viel sie nutzen, nie, was sie fragen.';
'Vor der ersten Frage stimmen sie zu, was wohin geht. Assistenten, die sie schon haben, bleiben. Du siehst, wie viel sie nutzen, nie, was sie fragen.';
@override
String assistantPerDay(String amount) {
@ -1367,30 +1511,15 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
@override
String get assistantNoLimits => 'Ohne Grenzen';
@override
String get assistantGrantAgreed => 'Zugestimmt';
@override
String get assistantGrantNotAgreed => 'Noch nicht zugestimmt';
@override
String get assistantGrantOutdated =>
'Die Preise haben sich geändert: Grenzen neu setzen';
@override
String get assistantGrantUnset => 'Nicht mehr eingerichtet';
@override
String get assistantRevoke => 'Zurücknehmen';
@override
String assistantRevokeTitle(String assistant) {
return '$assistant zurücknehmen?';
}
String get assistantRevokeAllTitle => 'Alle Assistenten zurücknehmen?';
@override
String get assistantRevokeMessage =>
'Sie können ihn nicht mehr fragen. Was sie genutzt haben, bleibt gezählt.';
'Sie können keinen mehr fragen, und ihr Budget entfällt. Was sie genutzt haben, bleibt gezählt.';
@override
String get assistantUseByMonth => 'Nutzung nach Monat';
@ -1440,11 +1569,10 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
}
@override
String get assistantAgree => 'Lesen und zustimmen';
String get assistantYourBudget => 'Dein Budget, für alle zusammen';
@override
String get assistantWaitsForLimits =>
'Wartet darauf, dass seine Grenzen neu gesetzt werden';
String get assistantAgree => 'Lesen und zustimmen';
@override
String get assistantYourUse => 'Deine Nutzung';
@ -1568,6 +1696,10 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
@override
String get assistantProblemNotAgreed => 'Stimm zuerst zu, was wohin geht.';
@override
String get assistantProblemInvalidEffort =>
'Mit diesem Denkaufwand antwortet er nicht.';
@override
String assistantProblemLimitReached(String time) {
return 'Seine Grenze ist bis $time erreicht.';
@ -1577,10 +1709,6 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
String get assistantProblemLimitReachedNow =>
'Seine Grenze ist vorerst erreicht.';
@override
String get assistantProblemLimitOutdated =>
'Es wartet darauf, dass seine Grenzen neu gesetzt werden.';
@override
String get assistantProblemImagesNotRead => 'Es liest keine Bilder.';

View file

@ -1173,6 +1173,31 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
@override
String get operatorWaitingTitle => 'Waiting';
@override
String operatorOperatorsCount(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count operators',
one: '1 operator',
);
return '$_temp0';
}
@override
String get operatorAccountsTitle => 'Accounts';
@override
String operatorAccountsCount(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count accounts',
one: '1 account',
);
return '$_temp0';
}
@override
String get operatorNobodyWaits => 'Nobody waits.';
@ -1233,7 +1258,8 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
String get operatorHandle => 'Handle';
@override
String get operatorFindTitle => 'Find an account';
String get operatorHandleSuggested =>
'Only handles there are here are suggested.';
@override
String get operatorFoundNone => 'No account\'s handle starts like this.';
@ -1298,39 +1324,157 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
String get assistantGrantsNone => 'Nobody has an assistant yet.';
@override
String get assistantGrant => 'Grant an assistant';
String assistantSetCount(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count assistants',
one: '1 assistant',
zero: 'None set up',
);
return '$_temp0';
}
@override
String assistantPeopleCount(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count people',
one: '1 person',
zero: 'nobody granted',
);
return '$_temp0';
}
@override
String get assistantSetUpTitle => 'Set up here';
@override
String get assistantPeopleTitle => 'People';
@override
String get assistantGranteesFoundNone =>
'Nobody with an assistant has a handle starting like this.';
@override
String get assistantUnpriced => 'No prices: counts its tokens only';
@override
String assistantEffort(String effort) {
String _temp0 = intl.Intl.selectLogic(
effort,
{
'low': 'low',
'medium': 'medium',
'high': 'high',
'xhigh': 'extra high',
'max': 'max',
'other': '$effort',
},
);
return '$_temp0';
}
@override
String assistantEffortName(String effort) {
String _temp0 = intl.Intl.selectLogic(
effort,
{
'low': 'Low',
'medium': 'Medium',
'high': 'High',
'xhigh': 'Extra high',
'max': 'Max',
'other': '$effort',
},
);
return '$_temp0';
}
@override
String assistantEffortSetUp(String effort, String max) {
return 'Effort $effort, up to $max';
}
@override
String assistantEffortFixed(String effort) {
return 'Effort $effort';
}
@override
String assistantNameUnset(String name) {
return '$name (no longer set up)';
}
@override
String assistantNotAgreedCount(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count not agreed to yet',
one: '1 not agreed to yet',
);
return '$_temp0';
}
@override
String get assistantGrant => 'Grant assistants';
@override
String get assistantGrantSave => 'Grant';
@override
String get assistantGrantChange => 'Change limits';
@override
String get assistantGrantAssistant => 'Assistant';
@override
String get assistantGrantDaily => 'Limit a day';
@override
String get assistantGrantMonthly => 'Limit a month';
String get assistantGrantChange => 'Change assistants';
@override
String get assistantGrantLimitHelper =>
'Empty for none. Days and months are UTC\'s.';
@override
String get assistantGrantLimitInvalid => 'Not a number this takes';
String get assistantGrantBudget => 'Budget, for all of them together';
@override
String get assistantGrantNoHandle => 'No account has this handle.';
String get assistantGrantMoneyDaily => 'Money a day';
@override
String get assistantGrantMoneyMonthly => 'Money a month';
@override
String get assistantGrantTokensDaily => 'Tokens a day';
@override
String get assistantGrantTokensMonthly => 'Tokens a month';
@override
String get assistantGrantMoneyNote =>
'Money counts the assistants with prices, tokens count every one. Whichever runs out first stops them.';
@override
String assistantGrantReplaces(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'Granting replaces the budgets these people have:',
one: 'Granting replaces the budget this person has:',
);
return '$_temp0';
}
@override
String assistantGrantUnsetDropped(String names) {
return 'Saving takes back what is no longer set up: $names.';
}
@override
String get assistantGrantLimitInvalid => 'Not a number this takes';
@override
String get assistantGrantTokens => 'tokens';
@override
String get assistantGrantNote =>
'They agree once to what goes where before they ask it. You see how much they use, never what they ask.';
'They agree once to what goes where before they ask one. Assistants they have already stay. You see how much they use, never what they ask.';
@override
String assistantPerDay(String amount) {
@ -1345,30 +1489,15 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
@override
String get assistantNoLimits => 'No limits';
@override
String get assistantGrantAgreed => 'Agreed';
@override
String get assistantGrantNotAgreed => 'Not agreed yet';
@override
String get assistantGrantOutdated =>
'Its prices changed: set its limits again';
@override
String get assistantGrantUnset => 'No longer set up';
@override
String get assistantRevoke => 'Take back';
@override
String assistantRevokeTitle(String assistant) {
return 'Take back $assistant?';
}
String get assistantRevokeAllTitle => 'Take back every assistant?';
@override
String get assistantRevokeMessage =>
'They can no longer ask it. What they used stays counted.';
'They can no longer ask any of them, and their budget goes. What they used stays counted.';
@override
String get assistantUseByMonth => 'Use by month';
@ -1418,10 +1547,10 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
}
@override
String get assistantAgree => 'Read and agree';
String get assistantYourBudget => 'Your budget, for all of them';
@override
String get assistantWaitsForLimits => 'Waits for its limits to be set again';
String get assistantAgree => 'Read and agree';
@override
String get assistantYourUse => 'Your use';
@ -1544,6 +1673,10 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
@override
String get assistantProblemNotAgreed => 'Agree to what goes where first.';
@override
String get assistantProblemInvalidEffort =>
'It doesn\'t think at this effort.';
@override
String assistantProblemLimitReached(String time) {
return 'Its limit is reached until $time.';
@ -1552,10 +1685,6 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
@override
String get assistantProblemLimitReachedNow => 'Its limit is reached for now.';
@override
String get assistantProblemLimitOutdated =>
'It waits for its limits to be set again.';
@override
String get assistantProblemImagesNotRead => 'It reads no images.';