halkyon/packages/halkyon_app/lib/l10n/halkyon_app_en.arb
Tizian 「ティツィアーン」 bf46f8c460
feat(learn): a private studyset goes to an assistant only once agreed
ADR 0021, D9 and D17. Before a question sends a private studyset's
content to a remote model, through the parts chosen or a wider reach
with private studysets switched on, a warning names the studysets, the
provider's host and its terms (where checked: Anthropic, OpenAI,
Google, OpenRouter), and is asked once per studyset and assistant: the
agreement is kept in the person's sealed settings (schema 13,
privateAgreements, folded only where both rows hold it), shown in the
studyset's privacy dialog with Take back, and marked on the folded
button while it holds. Follow-ups and Try again ask again once taken
back, as the scope keeps where the parts came from (partsFrom). No
warning for an own assistant on this machine (loopback or localhost,
halkyon_llm's LlmEndpoint.onThisMachine); the local network may be
shared.

Texts that step 3 made untrue: the consent sheet now says what an
assistant looks up goes too and that conversations are kept encrypted
for the person's devices; the privacy dialogs no longer mention
showing a studyset to Claude; the privacy page says what is looked up
and when a private studyset goes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-26 07:17:09 +01:00

1336 lines
53 KiB
Text

{
"@@locale": "en",
"tryAgain": "Try again",
"instanceWelcome": "Welcome to {app}",
"@instanceWelcome": {
"description": "Screen readers hear it for the wordmark on the first start.",
"placeholders": {
"app": {
"type": "String"
}
}
},
"instanceBuiltInTagline": "Comes with the app",
"instanceAnother": "Another instance",
"instanceAnotherTagline": "Enter its address",
"instanceAddress": "Instance address",
"instanceAddressInvalid": "This isn't an address.",
"instanceAddressInsecure": "{app} reaches instances over HTTPS only, so that nobody on the way reads or changes what it sends. Ask for the instance's HTTPS address.",
"@instanceAddressInsecure": {
"placeholders": {
"app": {
"type": "String"
}
}
},
"instanceInsecure": "{name} is reached over plain HTTP, where anyone on the way could read and change what {app} sends, so {app} no longer opens it. Its account stays on {name} and on this device. Use another instance, or remove it from this device.",
"@instanceInsecure": {
"placeholders": {
"name": {
"type": "String"
},
"app": {
"type": "String"
}
}
},
"instanceInsecureUseAnother": "Use another instance",
"instanceInsecureRemove": "Remove from this device",
"instanceAddressRequired": "Enter the address of an instance.",
"instanceContinue": "Continue",
"instanceUnreachable": "No instance of {app} answers at {name}.",
"@instanceUnreachable": {
"placeholders": {
"app": {
"type": "String"
},
"name": {
"type": "String"
}
}
},
"instanceUseBuiltIn": "Use {name}",
"@instanceUseBuiltIn": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"instanceOpenFailed": "Couldn't open the app on {name}.",
"@instanceOpenFailed": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"instanceDataAndBackupsIn": "Data and backups: {place}",
"@instanceDataAndBackupsIn": {
"placeholders": {
"place": {
"type": "String"
}
}
},
"instanceDataIn": "Data: {place}",
"@instanceDataIn": {
"placeholders": {
"place": {
"type": "String"
}
}
},
"instanceBackupsIn": "Backups: {place}",
"@instanceBackupsIn": {
"placeholders": {
"place": {
"type": "String"
}
}
},
"instanceNoBackups": "No backups",
"instanceEuropeanUnion": "European Union",
"instanceCountryInEu": "{country} (EU)",
"@instanceCountryInEu": {
"description": "A country of the European Union, where an instance keeps data: Germany (EU).",
"placeholders": {
"country": {
"type": "String"
}
}
},
"instanceSubdivisionOf": "{subdivision}, {country}",
"@instanceSubdivisionOf": {
"description": "A state or region with its country, where an instance keeps data: California, United States.",
"placeholders": {
"subdivision": {
"type": "String"
},
"country": {
"type": "String"
}
}
},
"accountsTitle": "Accounts",
"accountAdd": "Add account",
"accountAddSubtitle": "Choose the instance for the account to add.",
"accountSignedIn": "Signed in",
"accountRemoveTooltip": "Remove account",
"accountRemoveTitle": "Remove account?",
"accountRemoveMessage": "Removes the account on {name} from this device, with all the device holds of it. What it synced stays on {name}: sign in there again to have it.",
"@accountRemoveMessage": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"accountRemoveConfirm": "Remove",
"accountSignedInOn": "Signed in on {instance}",
"@accountSignedInOn": {
"placeholders": {
"instance": {
"type": "String"
}
}
},
"accountSwitch": "Switch account",
"accountSignOut": "Sign out",
"accountDelete": "Delete account",
"accountDeleteTitle": "Delete your account?",
"accountSignOutFailed": "Couldn't sign out on this device. Try again.",
"accountDeleteFailed": "Couldn't delete your account: the instance wasn't reached. Try again.",
"aboutSourceCode": "The source of what this instance runs:",
"aboutSourceUnreachable": "Couldn't reach this instance to ask where its source is.",
"sessionUnreachable": "Couldn't reach the server.",
"personDataFailed": "Couldn't open this device's data.",
"startSignedOut": "Signed out",
"startOn": "Start on {instance}:",
"@startOn": {
"placeholders": {
"instance": {
"type": "String"
}
}
},
"startOtherInstance": "Use another instance",
"startNoWay": "{instance} offers no way to create an account.",
"@startNoWay": {
"description": "On the start screen, where the instance offers neither SimpleLogin nor a password (ADR 0020, D4): nobody can make an account there.",
"placeholders": {
"instance": {
"type": "String"
}
}
},
"startSignUpsApproved": "New accounts on {instance} wait until its operator approves them.",
"@startSignUpsApproved": {
"description": "On the start screen, where new accounts wait for the operator's approval (Halkyon Learn's ADR 0021, D19).",
"placeholders": {
"instance": {
"type": "String"
}
}
},
"startSignUpsClosed": "{instance} takes no new accounts: sign in with yours.",
"@startSignUpsClosed": {
"description": "On the start screen, where the operator takes no new accounts (D19); Create an account is gone.",
"placeholders": {
"instance": {
"type": "String"
}
}
},
"syncTitle": "Sync",
"syncNow": "Sync now",
"syncStateSyncing": "Syncing…",
"syncStateSynced": "Everything synced",
"syncStateFailing": "Sync is failing",
"syncStateNotYet": "Not synced yet",
"syncStateMismatch": "This app can't sync with {server}",
"@syncStateMismatch": {
"placeholders": {
"server": {
"type": "String"
}
}
},
"syncMismatchDetail": "Update the app. If it is up to date, the server needs an update. What you do meanwhile stays on this device and syncs afterwards.",
"syncLastCompleted": "Last completed at {time}",
"@syncLastCompleted": {
"placeholders": {
"time": {
"type": "String"
}
}
},
"syncLastFailed": "Last attempt failed at {time}",
"@syncLastFailed": {
"placeholders": {
"time": {
"type": "String"
}
}
},
"syncNoRunYet": "No sync has completed since the app started",
"syncPending": "{count, plural, =1{1 change waits to sync} other{{count} changes wait to sync}}",
"@syncPending": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"syncTroubleLabel": "Sync needs attention",
"syncMismatchBanner": "This app can't sync with {server} any more. Update it to keep syncing.",
"@syncMismatchBanner": {
"placeholders": {
"server": {
"type": "String"
}
}
},
"syncMismatchMore": "More",
"startSignIn": "Sign in",
"startCreateAccount": "Create an account",
"waitWaiting": "Your account waits until the operator of {instance} approves it.",
"@waitWaiting": {
"description": "On the wait screen of a new account (D31), under its handle.",
"placeholders": {
"instance": {
"type": "String"
}
}
},
"waitSuspended": "The operator of {instance} has suspended your account. Only they can lift it.",
"@waitSuspended": {
"description": "On the wait screen of a suspended account (D31).",
"placeholders": {
"instance": {
"type": "String"
}
}
},
"waitApproved": "The operator of {instance} has approved your account. Sign in once more, as you did before.",
"@waitApproved": {
"description": "On the wait screen once the account is approved (D31), above Sign in.",
"placeholders": {
"instance": {
"type": "String"
}
}
},
"waitEnded": "This sign-up has ended: the operator of {instance} refused it, or it waited too long.",
"@waitEnded": {
"description": "On the wait screen once the instance knows the wait no more: refused, past its 14 days, or its pass past its 30 (D31).",
"placeholders": {
"instance": {
"type": "String"
}
}
},
"waitBack": "Back to the start",
"@waitBack": {
"description": "The button of an ended wait: the start screen."
},
"waitMatchingCode": "Matching code",
"@waitMatchingCode": {
"description": "Above the four words the operator reads out for the person to match (D33)."
},
"waitMatchingNote": "When the operator of {instance} reads you four words, check that they are these. Never read them out yourself: Halkyon never asks anyone to.",
"@waitMatchingNote": {
"description": "Under the matching code (D33): the operator reads, the person confirms, so nobody posing as the operator learns the words.",
"placeholders": {
"instance": {
"type": "String"
}
}
},
"waitCheckNow": "Check now",
"@waitCheckNow": {
"description": "Asks the instance at once where the wait stands; it asks every 30 seconds by itself."
},
"waitUnreachable": "{instance} couldn't be reached. It's asked again every 30 seconds.",
"@waitUnreachable": {
"description": "On the wait screen, when asking where the wait stands failed.",
"placeholders": {
"instance": {
"type": "String"
}
}
},
"waitDelete": "Delete this account",
"@waitDelete": {
"description": "On the wait screen of a new account: deletes it with its pass (D31)."
},
"waitDeleteTitle": "Delete this account?",
"@waitDeleteTitle": {
"description": "The question before a waiting account is deleted."
},
"waitDeleteMessage": "It goes with everything it has, and nobody can sign in to it again.",
"@waitDeleteMessage": {
"description": "Under that question."
},
"waitDeleteFailed": "Couldn't delete the account. Try again.",
"@waitDeleteFailed": {
"description": "On the wait screen, when deleting the account failed."
},
"passwordAddress": "Email address",
"passwordPassword": "Password",
"passwordNewPassword": "New password",
"passwordCurrent": "Current password",
"passwordRepeat": "New password again",
"passwordsDiffer": "The two passwords differ.",
"passwordShow": "Show password",
"passwordHide": "Hide password",
"passwordContinue": "Continue",
"passwordBack": "Back",
"passwordDone": "Done",
"passwordSave": "Save as a file",
"passwordQrCode": "QR code for your authenticator app",
"passwordMailCode": "Code from the email",
"passwordMailCodeSent": "We emailed a code to {address}. It's valid for 15 minutes.",
"@passwordMailCodeSent": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"passwordHandleIntro": "A code is on its way to {address}. Meanwhile, choose your handle: others find you by it. It stays private until you publish something or fill in your profile, and can change until your first publish.",
"@passwordHandleIntro": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"passwordResendCode": "Send a new code",
"passwordTotpCode": "Code from your authenticator app",
"passwordRecoveryCode": "Recovery code",
"passwordUseRecoveryCode": "Use a recovery code instead",
"passwordUseTotpCode": "Use your authenticator app instead",
"passwordUnlocking": "Unlocking your password on this device…",
"passwordMakingKeys": "Making your keys on this device…",
"passwordSignInTitle": "Sign in",
"passwordSignInAction": "Sign in",
"passwordSignInIntro": "With the email address and password of your account on {instance}.",
"@passwordSignInIntro": {
"placeholders": {
"instance": {
"type": "String"
}
}
},
"passwordSecondFactorIntro": "Enter the code your authenticator app shows for {instance}.",
"@passwordSecondFactorIntro": {
"placeholders": {
"instance": {
"type": "String"
}
}
},
"passwordRecoveryCodeIntro": "Enter one of the recovery codes you kept. Each signs in once.",
"passwordForgot": "Forgot your password?",
"passwordOtherPassword": "Change the address or password",
"passwordLostAuthenticator": "Lost your authenticator?",
"passwordLostAuthenticatorTitle": "Lost authenticator",
"passwordLostAuthenticatorIntro": "With a recovery code you sign in as usual. Without one, ask to reset your authenticators: it takes effect 72 hours later, and signing in with a code before then stops it.",
"passwordResetWithMail": "Reset with a code by email",
"passwordResetWithMailHint": "We email a code to {address}.",
"@passwordResetWithMailHint": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"passwordResetWithPhrase": "Reset with your recovery phrase",
"passwordResetWithPhraseHint": "The 24 words you wrote down.",
"passwordSignInWithoutCode": "Sign in without a code",
"passwordSignInWithoutCodeHint": "Once a reset you asked for has taken effect.",
"passwordResetAction": "Reset",
"passwordAuthenticatorResetAt": "Your authenticators are reset on {date}. We emailed you: if it wasn't you, sign in with a code before then to stop it. After that, sign in with your password alone and set up a new authenticator.",
"@passwordAuthenticatorResetAt": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"passwordUnfinishedIntro": "Your account was never finished. We emailed a code to {address}: with it, you sign in and set up an authenticator.",
"@passwordUnfinishedIntro": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"passwordPhraseField": "Recovery phrase",
"passwordPhraseFieldHint": "The 24 words, with spaces between them",
"passwordPhraseFieldIntro": "Enter your recovery phrase: it proves the account is yours.",
"passwordAuthenticatorTitle": "Set up an authenticator",
"passwordAuthenticatorIntro": "Every sign-in takes a code from an authenticator app, such as Aegis, 2FAS or Proton Authenticator. Scan this code with it, or type in the key.",
"passwordAuthenticatorKey": "Key",
"passwordAuthenticatorOpen": "Open in your authenticator app",
"passwordAuthenticatorNoApp": "No app on this device opens it. Scan the code or type in the key.",
"passwordAuthenticatorCodeIntro": "Then enter the code it shows.",
"passwordAuthenticatorOwnerIntro": "To add it, confirm it is you: your password and a code from an authenticator you added before.",
"passwordExistingCode": "Code from an authenticator you added before",
"passwordRecoveryCodesTitle": "Recovery codes",
"passwordRecoveryCodesIntro": "Each signs in once in place of a code from your authenticator, should you lose it. Keep them where only you find them: they're shown only now.",
"passwordCodesKept": "I've kept them",
"passwordPhraseTitle": "Your recovery phrase",
"passwordPhraseIntro": "These 24 words open your account's keys should you forget your password: without them, what's encrypted is lost. Write them down in order, and keep them where only you find them. They're shown only now.",
"passwordPhraseWrittenDown": "I've written it down",
"passwordPhraseCheckTitle": "Check your recovery phrase",
"passwordPhraseCheckIntro": "Type the words asked for, from what you wrote down.",
"passwordPhraseWord": "Word {number}",
"@passwordPhraseWord": {
"placeholders": {
"number": {
"type": "int"
}
}
},
"passwordPhraseWrong": "These aren't the words. Look again at what you wrote down.",
"passwordPhraseShowAgain": "Show the phrase again",
"passwordCreateTitle": "Create an account",
"passwordCreateIntro": "On {instance}, with your email address, a password, and an authenticator app for the code every sign-in takes.",
"@passwordCreateIntro": {
"placeholders": {
"instance": {
"type": "String"
}
}
},
"passwordSetUpTitle": "Set up a password",
"passwordSetUpIntro": "Sign in with your email address, a password and an authenticator app, on this device and others. Everything you have stays.",
"passwordChooseIntro": "Choose a password. It never leaves this device: the instance can't read it, and can't reset it without what it protects being lost.",
"passwordFinishResetTitle": "Finish the reset",
"passwordFinishResetIntro": "72 hours after you asked to reset your account, finish it here with a new code by email.",
"passwordFinishResetHavePhrase": "I have my recovery phrase",
"passwordFinishResetKeepsKeys": "Your account keeps its keys: nothing encrypted is lost.",
"passwordFinishResetNewKeys": "Without your recovery phrase, your account gets new keys: what was encrypted with the old ones is lost.",
"passwordRecoveryTitle": "Get back into your account",
"passwordRecoveryWithPhrase": "I have my recovery phrase",
"passwordRecoveryWithPhraseHint": "Set a new password at once. Everything stays.",
"passwordRecoveryWithPhraseIntro": "Your recovery phrase opens your account's keys, which your new password then protects. A code from your authenticator, or a recovery code, confirms it.",
"passwordRecoveryNoCodeHint": "Lost your authenticator as well? Reset your account 72 hours later with your recovery phrase: it keeps everything.",
"passwordRecoveryWithoutPhrase": "Reset my account",
"passwordRecoveryWithoutPhraseHint": "Takes effect 72 hours later. Without your recovery phrase, what's encrypted is lost.",
"passwordRecoveryStartIntro": "We email a code to your address. Your account can then be reset 72 hours later; signing in with your password before then stops it.",
"passwordRecoveryFinish": "Finish a reset",
"passwordRecoveryFinishHint": "72 hours after you asked for it.",
"passwordResetStarted": "Your account can be reset from {date}. We emailed you: if it wasn't you, sign in with your password before then to stop it.",
"@passwordResetStarted": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"passwordSectionTitle": "Password and authenticator",
"passwordSectionFailed": "Couldn't read how your account signs in.",
"passwordSectionSetUp": "Set up a password",
"passwordSectionSetUpHint": "Sign in with your email address, a password and an authenticator app.",
"passwordSectionUnfinished": "Finish setting up: add an authenticator",
"passwordSectionUnfinishedHint": "Your password signs in once an authenticator is set up.",
"passwordSectionChange": "Change password",
"passwordSectionKeysMissing": "Sign in on this device with your password to change it.",
"passwordSectionNotConfirmed": "Not set up yet",
"passwordSectionRemove": "Remove {name}?",
"@passwordSectionRemove": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"passwordSectionRemoveIntro": "Enter your password and a code from one of your authenticators to confirm.",
"passwordSectionRemoveAction": "Remove",
"passwordSectionAddAuthenticator": "Add an authenticator",
"passwordSectionRecoveryCodes": "New recovery codes",
"passwordSectionRecoveryCodesHint": "The old ones stop working.",
"passwordSectionNewPhrase": "New recovery phrase",
"passwordSectionPhraseHint": "Your old phrase stops working.",
"passwordChangeTitle": "Change password",
"passwordChangeIntro": "Your other devices are signed out. Your keys stay: nothing is lost.",
"passwordChangeAction": "Change password",
"passwordChanged": "Password changed. Your other devices are signed out.",
"passwordNewCodesIntro": "Enter your password and a code from your authenticator app. Your old recovery codes stop working.",
"passwordNewPhraseIntro": "Your new recovery phrase. Write the 24 words down in order: once you confirm it, your old phrase opens nothing any more.",
"passwordPhraseKept": "New recovery phrase set. The old one no longer works.",
"passwordWrongCredentials": "The address, the password or the code isn't right.",
"passwordTooManyAttempts": "Too many attempts. Try again in an hour.",
"passwordSetupIncomplete": "Your account was never finished: set up an authenticator.",
"passwordNotDue": "This takes effect on {date}.",
"@passwordNotDue": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"passwordNotDueYet": "This hasn't taken effect yet.",
"passwordNoReset": "No reset waits for this address.",
"passwordExists": "This address's account has a password already. Sign in with it, or get back in if you've forgotten it.",
"passwordAddressTaken": "This address belongs to another account.",
"passwordNoPassword": "This account has no password.",
"passwordWrongCode": "This code isn't right. Enter the one your app shows now.",
"passwordLastAuthenticator": "Your last authenticator can't go: every sign-in needs one.",
"passwordTooManyAuthenticators": "Your account has as many authenticators as it may. Remove one first.",
"passwordUnknownAuthenticator": "This authenticator is gone.",
"passwordInvalidSetup": "The instance didn't accept what this device made. Update the app, or try again.",
"passwordChallengeExpired": "That took too long. Try again.",
"passwordUnavailable": "This instance offers no password sign-in.",
"passwordNotAnAddress": "This isn't an email address.",
"passwordTooManyCodes": "Too many codes asked for. Try again in an hour.",
"passwordWrongMailCode": "This code isn't right.",
"passwordTooManyMailTries": "Too many wrong codes. Ask for a new one.",
"passwordMailCodeExpired": "This code is no longer valid. Ask for a new one.",
"passwordMailFailed": "The instance couldn't send the email. Try again later.",
"passwordOtherAddressLinked": "Your account has another email address.",
"passwordNotAPhrase": "This isn't a recovery phrase: check every word and their number.",
"passwordPhraseDoesNotFit": "The address or the recovery phrase isn't right.",
"passwordUnusable": "This password can't be used: it's empty, or holds characters that aren't text.",
"passwordInstanceUnproven": "The instance couldn't prove it knows your password, so this device trusts nothing it says. Try again; if it happens again, the instance isn't the one it claims to be.",
"passwordKeysMissing": "Your account's keys aren't on this device. Sign out and in again with your password here.",
"signUpsClosed": "This instance takes no new accounts.",
"@signUpsClosed": {
"description": "A sign-up refused: the operator takes no new accounts (D19)."
},
"signUpsTooManyWaiting": "Too many new accounts already wait for approval. Try again later.",
"@signUpsTooManyWaiting": {
"description": "A sign-up refused: ten new accounts wait for the operator's approval already (D19)."
},
"passwordUnsafeCosts": "The instance asked for your password to be checked in a way no account uses, so nothing was sent. If it happens again, the instance isn't the one it claims to be.",
"passwordFailed": "Couldn't reach the instance. Check the connection and try again.",
"passwordMinLength": "At least {count} characters",
"@passwordMinLength": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"passwordTooShort": "A new password needs at least {count} characters: should the instance's database ever leak, a short one is guessed first.",
"@passwordTooShort": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"passwordCodesWait": "Too many wrong codes in a row: no code is taken until {date}. If they weren't yours, someone knows your password: change it then.",
"@passwordCodesWait": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"passwordDeleteIntro": "Your account goes with everything in it, in every service of this instance. To confirm, type your password and a code from your authenticator app.",
"passwordSessionEnded": "Too many wrong codes in a row from this device: it was signed out. Sign in again with your password and a code.",
"passwordAddressUnknown": "Enter your account's email address: the code goes there.",
"passwordDeleteIntroByMail": "Your account goes with everything in it, in every service of this instance. None of its authenticators works now, so a code by mail confirms it: type your password, then the code we email to your address.",
"passwordDeleteSendCode": "Email me a code",
"passwordAuthenticatorPasswordIntro": "To add it, confirm it is you with your password.",
"passwordWarningTitle": "Someone tried your password",
"passwordWarningBody": "On {date}, a device signed in to your account sent a wrong password or code ten times in a row, and was signed out. If that wasn't you, someone else may have that device or its session: change your password.",
"@passwordWarningBody": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"passwordWarningDismiss": "Dismiss",
"passwordWarningLater": "Remind me later",
"passwordResetsTitle": "A reset is waiting",
"passwordResetsAuthenticator": "Your authenticators will be removed on {date}: someone asked with your password. If that wasn't you, call it off and change your password.",
"@passwordResetsAuthenticator": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"passwordResetsAccount": "Your account will get a new password and new keys on {date}, and what is encrypted under the old ones will be lost: someone asked with a code by mail. If that wasn't you, call it off.",
"@passwordResetsAccount": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"passwordResetsCallOff": "Call it off",
"passwordCallOffTitle": "Call off the reset",
"passwordCallOffIntro": "Your password and a code call off every reset waiting.",
"passwordSignedInBefore": "Only a device signed in since then can dismiss this warning: sign in again on this one, or change your password.",
"simpleLoginContinue": "Continue with SimpleLogin",
"simpleLoginNote": "SimpleLogin is Proton's sign-in, and a Proton account works there too. It learns that you use {instance}, which keeps only your SimpleLogin ID: your name suggests a handle once, and nothing else is kept.",
"@simpleLoginNote": {
"placeholders": {
"instance": {
"type": "String"
}
}
},
"simpleLoginTitle": "Sign in with SimpleLogin",
"simpleLoginAddTitle": "Add SimpleLogin",
"simpleLoginInBrowser": "Continue in your browser.",
"simpleLoginNewcomerTitle": "New here?",
"simpleLoginNewcomerIntro": "Your SimpleLogin account has no account on {instance} yet.",
"@simpleLoginNewcomerIntro": {
"placeholders": {
"instance": {
"type": "String"
}
}
},
"simpleLoginCreateHint": "Choose a handle and a password; you get a recovery phrase.",
"simpleLoginHaveOne": "I already have one",
"simpleLoginHaveOneHint": "Link it again with your handle and your recovery phrase.",
"handleIntro": "Others find you by your handle. It stays private until you publish something or fill in your profile, and can change until your first publish.",
"handleLabel": "Handle",
"handleFree": "@{handle} is free",
"@handleFree": {
"placeholders": {
"handle": {
"type": "String"
}
}
},
"handleChecking": "Checking…",
"simpleLoginPasswordIntro": "Choose a password: you type it when you sign in on another device. It never leaves this device: the instance can't read it, and can't reset it without what it protects being lost.",
"simpleLoginCreate": "Create the account",
"simpleLoginUnlockTitle": "Your password",
"simpleLoginUnlockIntroAs": "Signed in with SimpleLogin as @{handle}. Your password opens your keys on this device.",
"@simpleLoginUnlockIntroAs": {
"placeholders": {
"handle": {
"type": "String"
}
}
},
"simpleLoginUnlockIntro": "Signed in with SimpleLogin. Your password opens your keys on this device.",
"simpleLoginOpen": "Open",
"simpleLoginMendTitle": "Link your account",
"simpleLoginMendIntro": "Your SimpleLogin account isn't the one your account knows any more. Link them again with your handle and your recovery phrase: your other devices are then signed out.",
"simpleLoginMend": "Link",
"simpleLoginWrongPassword": "The password isn't right.",
"simpleLoginMendDoesNotFit": "The handle or the recovery phrase isn't right.",
"simpleLoginForgotTitle": "A new password",
"simpleLoginForgotIntro": "Your recovery phrase opens your keys, which your new password then protects. Everything stays; your other devices are signed out.",
"simpleLoginForgotDoesNotFit": "The recovery phrase isn't right.",
"simpleLoginResetWaiting": "New keys were asked for: from {date}, a SimpleLogin sign-in can set them up. Your password opening your keys calls it off.",
"@simpleLoginResetWaiting": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"simpleLoginPhraseLost": "Lost your recovery phrase too?",
"simpleLoginResetTitle": "New keys",
"simpleLoginResetIntro": "Without your password or your recovery phrase, nobody can open your keys, not even {instance}. New ones can be set up 72 hours from now, when you sign in with SimpleLogin again. Your handle, your profile and what you published stay; what was encrypted under your old keys is lost, unless you finish on a device still signed in, which keeps them.",
"@simpleLoginResetIntro": {
"placeholders": {
"instance": {
"type": "String"
}
}
},
"simpleLoginResetIntroDevices": "Meanwhile your signed-in devices show the reset, and your password calls it off there, should someone else have asked for it.",
"simpleLoginResetAsk": "Ask for new keys",
"simpleLoginResetAskedTitle": "New keys asked for",
"simpleLoginResetAskedIntro": "From {date}, sign in with SimpleLogin again to set them up. Should you find your password or your recovery phrase before then, opening your keys with it calls the reset off.",
"@simpleLoginResetAskedIntro": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"simpleLoginResetDueTitle": "Your new keys",
"simpleLoginResetDueIntro": "The new keys you asked for can be set up now. Or open your old keys with your password, which calls the reset off.",
"simpleLoginResetNewKeys": "Set up new keys",
"simpleLoginResetNewKeysHint": "A new password and recovery phrase. What was encrypted under your old keys is lost, unless you finish on a device still signed in.",
"simpleLoginResetHavePassword": "I have my password",
"simpleLoginResetHavePasswordHint": "Your keys open, and stay.",
"simpleLoginResetKeepIntro": "Choose a new password: your keys stay, under it and a new recovery phrase, so nothing is lost. Your other devices are signed out.",
"simpleLoginResetFinish": "Set up the keys",
"simpleLoginProofKeyTitle": "Your password and a code",
"simpleLoginProofKeyIntroAs": "Signed in with SimpleLogin as @{handle}. Your account also signs in with a password: type it and a code from your authenticator once, and your password opens your keys after SimpleLogin from then on.",
"@simpleLoginProofKeyIntroAs": {
"placeholders": {
"handle": {
"type": "String"
}
}
},
"simpleLoginProofKeyIntro": "Your account also signs in with a password: type it and a code from your authenticator once, and your password opens your keys after SimpleLogin from then on.",
"simpleLoginResetBanner": "New keys were asked for with your SimpleLogin account: from {date}, whoever has it can set them up. Unless that was you, call it off with your password.",
"@simpleLoginResetBanner": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"simpleLoginResetBannerDue": "New keys were asked for with your SimpleLogin account, and whoever has it can set them up now. Unless that was you, call it off with your password.",
"simpleLoginResetBannerDueHere": "New keys were asked for with your SimpleLogin account and can be set up now. If that was you, finish here: your keys stay. If not, call it off with your password.",
"simpleLoginResetFinishHere": "Finish here",
"simpleLoginCallOffIntro": "Your password calls off the reset of your keys.",
"simpleLoginResetCalledOff": "Reset called off.",
"simpleLoginResetFinished": "New password and recovery phrase set.",
"simpleLoginUnavailable": "This instance doesn't offer sign-in with SimpleLogin.",
"simpleLoginDenied": "SimpleLogin's sign-in was declined, so nothing was shared.",
"simpleLoginNoBrowser": "There's no browser to open SimpleLogin's page in.",
"simpleLoginStartAgain": "The sign-in took too long, or another one took its place. Begin it again.",
"simpleLoginRejected": "SimpleLogin didn't confirm the sign-in. Begin it again.",
"simpleLoginProviderUnavailable": "The instance can't reach SimpleLogin right now. Try again later.",
"simpleLoginTakenByAnotherPerson": "This SimpleLogin account belongs to another account here.",
"simpleLoginOtherIdentityLinked": "Your account has another SimpleLogin account already.",
"simpleLoginTooManyAttempts": "Too many sign-ins began from this network. Try again in an hour.",
"handleInvalid": "A handle is 1 to 30 letters (a to z), digits or underscores.",
"handleReserved": "This handle is kept for the instance.",
"handleTaken": "Someone else has this handle.",
"handleTooManyChecks": "Too many handles were tried. Try again in an hour.",
"simpleLoginSectionTitle": "SimpleLogin",
"simpleLoginSignsYouIn": "Signs you in",
"simpleLoginAddHint": "Sign in with SimpleLogin, or with your Proton account.",
"simpleLoginAdded": "SimpleLogin added.",
"operatorTitle": "This instance",
"@operatorTitle": {
"description": "The card and screen for whoever operates the instance (ADR 0021, D34)."
},
"operatorAccounts": "Accounts and operators",
"@operatorAccounts": {
"description": "The tile leading to the operator's screen."
},
"operatorWaitingCount": "{count, plural, =0{Nobody waits for approval} =1{1 account waits for approval} other{{count} accounts wait for approval}}",
"@operatorWaitingCount": {
"description": "How many accounts wait for the operator; also the badge's label.",
"placeholders": {
"count": {
"type": "int"
}
}
},
"operatorWaitingTitle": "Waiting",
"@operatorWaitingTitle": {
"description": "The card of accounts that wait for approval, new or suspended."
},
"operatorNobodyWaits": "Nobody waits.",
"@operatorNobodyWaits": {
"description": "The waiting card, empty."
},
"operatorNoHandle": "No handle yet",
"@operatorNoHandle": {
"description": "An account without a handle, where its handle would be."
},
"operatorNewSince": "New, waiting since {date}",
"@operatorNewSince": {
"description": "A new account that waits, and since when.",
"placeholders": {
"date": {
"type": "String"
}
}
},
"operatorSuspendedSince": "Suspended since {date}",
"@operatorSuspendedSince": {
"description": "A suspended account, and since when.",
"placeholders": {
"date": {
"type": "String"
}
}
},
"operatorApproveNote": "Read them these four words, and approve only once they confirm these are on their screen.",
"@operatorApproveNote": {
"description": "Before approving: the words prove it is their account that waits (D33)."
},
"operatorApprove": "Approve",
"@operatorApprove": {
"description": "Approves a waiting account."
},
"operatorRefuse": "Refuse",
"@operatorRefuse": {
"description": "Refuses a new account: deleted."
},
"operatorRefuseTitle": "Refuse this account?",
"@operatorRefuseTitle": {
"description": "The question before refusing."
},
"operatorRefuseMessage": "It is deleted with everything it has. They can sign up again.",
"@operatorRefuseMessage": {
"description": "What refusing does."
},
"operatorOperatorsTitle": "Operators",
"@operatorOperatorsTitle": {
"description": "The card of who operates the instance."
},
"operatorTakeBack": "Take back",
"@operatorTakeBack": {
"description": "Takes back the operator's role."
},
"operatorTakeBackTitle": "Take back the role?",
"@operatorTakeBackTitle": {
"description": "The question before taking the role back."
},
"operatorTakeBackMessage": "They keep their account, but no longer approve, refuse or suspend accounts here.",
"@operatorTakeBackMessage": {
"description": "What taking the role back does."
},
"operatorAppoint": "Name an operator",
"@operatorAppoint": {
"description": "Names an account an operator, by its handle."
},
"operatorAppointMessage": "They approve, refuse and suspend accounts here, and name operators, as you do.",
"@operatorAppointMessage": {
"description": "What an operator may do."
},
"operatorAppointConfirm": "Name",
"@operatorAppointConfirm": {
"description": "Confirms naming an operator."
},
"operatorHandle": "Handle",
"@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."
},
"operatorFoundNone": "No account's handle starts like this.",
"@operatorFoundNone": {
"description": "A search that found nothing."
},
"operatorMadeOn": "Since {date}",
"@operatorMadeOn": {
"description": "When an account was made.",
"placeholders": {
"date": {
"type": "String"
}
}
},
"operatorIsOperator": "Operator",
"@operatorIsOperator": {
"description": "A tag: the account operates the instance."
},
"operatorIsWaiting": "Waiting",
"@operatorIsWaiting": {
"description": "A tag: the account waits for approval."
},
"operatorIsSuspended": "Suspended",
"@operatorIsSuspended": {
"description": "A tag: the account is suspended."
},
"operatorSuspend": "Suspend",
"@operatorSuspend": {
"description": "Suspends an account."
},
"operatorSuspendTitle": "Suspend this account?",
"@operatorSuspendTitle": {
"description": "The question before suspending."
},
"operatorSuspendMessage": "They are signed out everywhere and can't sign in until you approve them again. Nothing they have is deleted.",
"@operatorSuspendMessage": {
"description": "What suspending does."
},
"operatorMakeOperator": "Name as operator",
"@operatorMakeOperator": {
"description": "Names a found account an operator."
},
"operatorNotFound": "That account isn't there any more, or doesn't wait.",
"@operatorNotFound": {
"description": "Refused: no such account, or it doesn't wait."
},
"operatorIsOperatorProblem": "An operator can't be suspended. Take back their role first.",
"@operatorIsOperatorProblem": {
"description": "Refused: suspending an operator."
},
"operatorLastOperator": "The instance needs at least one operator.",
"@operatorLastOperator": {
"description": "Refused: taking back the last operator's role."
},
"operatorNotAllowed": "Only the instance's operators can do this.",
"@operatorNotAllowed": {
"description": "Refused: the person doesn't operate the instance."
},
"operatorFailed": "That didn't work. Try again.",
"@operatorFailed": {
"description": "Any other failure."
},
"operatorAssistantNotSet": "That assistant isn't set up here any more.",
"@operatorAssistantNotSet": {
"description": "The assistant asked for is no longer in deploy/assistants.env."
},
"operatorInvalidLimit": "A limit can't be below zero.",
"@operatorInvalidLimit": {
"description": "A limit below 0 was refused."
},
"assistantGrantsTitle": "Assistants",
"@assistantGrantsTitle": {
"description": "The operator's card of the assistants granted (Halkyon Learn's ADR 0021)."
},
"assistantGrantsNone": "Nobody has an assistant yet.",
"@assistantGrantsNone": {
"description": "No assistant is granted to anyone."
},
"assistantGrant": "Grant an assistant",
"@assistantGrant": {
"description": "Opens the sheet granting an assistant to an account."
},
"assistantGrantSave": "Grant",
"@assistantGrantSave": {
"description": "The grant sheet's button."
},
"assistantGrantChange": "Change limits",
"@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."
},
"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)."
},
"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": {
"description": "In the grant sheet: consent (D40) and what the operator sees (D3)."
},
"assistantPerDay": "{amount} a day",
"@assistantPerDay": {
"description": "A daily limit.",
"placeholders": {
"amount": {
"type": "String"
}
}
},
"assistantPerMonth": "{amount} a month",
"@assistantPerMonth": {
"description": "A monthly limit.",
"placeholders": {
"amount": {
"type": "String"
}
}
},
"assistantNoLimits": "No limits",
"@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"
}
}
},
"assistantRevokeMessage": "They can no longer ask it. What they used stays counted.",
"@assistantRevokeMessage": {
"description": "Under the question taking a grant back."
},
"assistantUseByMonth": "Use by month",
"@assistantUseByMonth": {
"description": "Opens everyone's figures (D3)."
},
"assistantUseTitle": "Use of assistants",
"@assistantUseTitle": {
"description": "The title of the figures' screen and sheet."
},
"assistantUseNone": "Nothing used in this month.",
"@assistantUseNone": {
"description": "A month without use."
},
"assistantUseKept": "Counted per UTC day, kept for this month and the two before. Never what was asked.",
"@assistantUseKept": {
"description": "Under the figures: what is counted and for how long (D41, D42)."
},
"assistantRequests": "{count, plural, =1{1 request} other{{count} requests}}",
"@assistantRequests": {
"description": "How many requests were counted.",
"placeholders": {
"count": {
"type": "int"
}
}
},
"assistantTokens": "{amount} tokens",
"@assistantTokens": {
"description": "How many tokens were counted, the number formatted.",
"placeholders": {
"amount": {
"type": "String"
}
}
},
"assistantsTitle": "Assistants",
"@assistantsTitle": {
"description": "Settings' card of the assistants a person may ask (Halkyon Learn's ADR 0021, point 9)."
},
"assistantModelAt": "{model} at {host}",
"@assistantModelAt": {
"description": "Which model answers, and the host that receives what is asked.",
"placeholders": {
"model": {
"type": "String"
},
"host": {
"type": "String"
}
}
},
"assistantLeftToday": "{left} of {limit} left today",
"@assistantLeftToday": {
"description": "What is left of a day's limit.",
"placeholders": {
"left": {
"type": "String"
},
"limit": {
"type": "String"
}
}
},
"assistantLeftThisMonth": "{left} of {limit} left this month",
"@assistantLeftThisMonth": {
"description": "What is left of a month's limit.",
"placeholders": {
"left": {
"type": "String"
},
"limit": {
"type": "String"
}
}
},
"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."
},
"assistantPrivacyPage": "What goes where on {instance}",
"@assistantPrivacyPage": {
"description": "Opens the instance's privacy page (D39).",
"placeholders": {
"instance": {
"type": "String"
}
}
},
"assistantOwnTitle": "With your own key",
"@assistantOwnTitle": {
"description": "Above a person's own assistants (point 10)."
},
"assistantOwnAdd": "Add an assistant with your own key",
"@assistantOwnAdd": {
"description": "Opens the sheet adding an assistant with a personal key."
},
"assistantOwnNote": "The app asks your provider directly: this instance sees neither your key nor your questions, and counts nothing. The key is kept in your settings, encrypted on your devices.",
"@assistantOwnNote": {
"description": "What a personal key means (D5, D6)."
},
"assistantOwnEdit": "Your own key",
"@assistantOwnEdit": {
"description": "The personal key sheet's title."
},
"assistantOwnName": "Name",
"@assistantOwnName": {
"description": "The name the person gives their assistant."
},
"assistantOwnProtocol": "API",
"@assistantOwnProtocol": {
"description": "Above the choice of protocol."
},
"assistantOwnBaseUrl": "Address",
"@assistantOwnBaseUrl": {
"description": "The provider's address field."
},
"assistantOwnBaseUrlHelper": "Empty for the provider's own. Mistral, OpenRouter or a model of your own: its address with /v1.",
"@assistantOwnBaseUrlHelper": {
"description": "Under the address field: which services take which address."
},
"assistantOwnBaseUrlInvalid": "Only https, or http on your own network",
"@assistantOwnBaseUrlInvalid": {
"description": "An address the app refuses: keys and questions would travel in the clear."
},
"assistantOwnModel": "Model",
"@assistantOwnModel": {
"description": "The model's name at the provider."
},
"assistantOwnKey": "Key",
"@assistantOwnKey": {
"description": "The API key field."
},
"assistantOwnKeyHelper": "Empty for a model of your own that takes none.",
"@assistantOwnKeyHelper": {
"description": "Under the key field."
},
"assistantOwnImages": "Reads images",
"@assistantOwnImages": {
"description": "Whether the model reads images (D12)."
},
"assistantOwnSave": "Save",
"@assistantOwnSave": {
"description": "The personal key sheet's button."
},
"assistantOwnRemove": "Remove",
"@assistantOwnRemove": {
"description": "Removes an assistant with a personal key."
},
"assistantOwnRemoveTitle": "Remove {name}?",
"@assistantOwnRemoveTitle": {
"description": "Asks before removing an assistant with a personal key.",
"placeholders": {
"name": {
"type": "String"
}
}
},
"assistantOwnRemoveMessage": "Its key goes from your settings on every device.",
"@assistantOwnRemoveMessage": {
"description": "Under the question removing a personal key."
},
"assistantOwnRefused": "The key wasn't kept: this device can't encrypt your settings yet. Open your account's keys here first.",
"@assistantOwnRefused": {
"description": "A personal key refused, as the settings wouldn't be sealed."
},
"assistantOwnNotAllowed": "Whoever runs {instance} doesn't allow own keys here, so the app doesn't ask these.",
"@assistantOwnNotAllowed": {
"description": "Below the person's own assistants, where the operator doesn't allow them (ADR 0021, D6).",
"placeholders": {
"instance": {
"type": "String",
"example": "learn.halkyon.eu"
}
}
},
"assistantConsentTitle": "Before you ask {name}",
"@assistantConsentTitle": {
"description": "The consent sheet's title (D40).",
"placeholders": {
"name": {
"type": "String"
}
}
},
"assistantConsentModel": "It answers with the model {model} at {host}.",
"@assistantConsentModel": {
"description": "Who answers (D27).",
"placeholders": {
"model": {
"type": "String"
},
"host": {
"type": "String"
}
}
},
"assistantConsentWhatGoes": "Only what you send goes there: your question, what you pick of what it is about, and what it looks up where you let it. The provider's own terms apply to it.",
"@assistantConsentWhatGoes": {
"description": "What goes to the provider (D27)."
},
"assistantConsentImages": "It reads the images you add.",
"@assistantConsentImages": {
"description": "For an assistant that reads images (D12)."
},
"assistantConsentInstance": "It passes through {instance} on its way, which keeps none of it.",
"@assistantConsentInstance": {
"description": "The instance sees it in passing and keeps nothing (D27).",
"placeholders": {
"instance": {
"type": "String"
}
}
},
"assistantConsentOperator": "Whoever runs {instance} sees how much you use it (requests, tokens, cost), never what you ask.",
"@assistantConsentOperator": {
"description": "The operator's figures (D3).",
"placeholders": {
"instance": {
"type": "String"
}
}
},
"assistantConsentConversations": "Your conversations are kept encrypted: only your devices can read them.",
"@assistantConsentConversations": {
"description": "Conversations are sealed on the devices (D13)."
},
"assistantConsentAgree": "Agree",
"@assistantConsentAgree": {
"description": "The consent sheet's button."
},
"assistantConsentAgreedOn": "You agreed on {date}.",
"@assistantConsentAgreedOn": {
"description": "An assistant agreed to, and when.",
"placeholders": {
"date": {
"type": "String"
}
}
},
"assistantProblemNotGranted": "This assistant isn't granted to you any more.",
"@assistantProblemNotGranted": {
"description": "notGranted."
},
"assistantProblemNotAgreed": "Agree to what goes where first.",
"@assistantProblemNotAgreed": {
"description": "notAgreed."
},
"assistantProblemLimitReached": "Its limit is reached until {time}.",
"@assistantProblemLimitReached": {
"description": "limitReached, with when it resets.",
"placeholders": {
"time": {
"type": "String"
}
}
},
"assistantProblemLimitReachedNow": "Its limit is reached for now.",
"@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."
},
"assistantProblemMalformed": "This question can't be sent.",
"@assistantProblemMalformed": {
"description": "malformed."
},
"assistantProblemTooLarge": "This question is too long, or holds too many or too large images.",
"@assistantProblemTooLarge": {
"description": "tooLarge."
},
"assistantProblemTooManyAtOnce": "Wait for the answers on their way first.",
"@assistantProblemTooManyAtOnce": {
"description": "tooManyAtOnce."
},
"assistantProblemProviderKey": "The provider refused the key.",
"@assistantProblemProviderKey": {
"description": "providerKey."
},
"assistantProblemProviderBusy": "The provider is busy. Try again in a moment.",
"@assistantProblemProviderBusy": {
"description": "providerBusy."
},
"assistantProblemProviderRefused": "The provider refused this question.",
"@assistantProblemProviderRefused": {
"description": "providerRefused."
},
"assistantProblemProviderFailed": "The provider failed. Try again.",
"@assistantProblemProviderFailed": {
"description": "providerFailed."
},
"assistantProblemNotAllowed": "Only people it is granted to can do this.",
"@assistantProblemNotAllowed": {
"description": "notAllowed."
},
"assistantProblemFailed": "That didn't work. Try again.",
"@assistantProblemFailed": {
"description": "failed."
}
}