halkyon/packages/halkyon_app/lib/l10n/halkyon_app_localizations.dart

1853 lines
62 KiB
Dart
Raw Normal View History

import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart' as intl;
import 'halkyon_app_localizations_de.dart';
import 'halkyon_app_localizations_en.dart';
// ignore_for_file: type=lint
/// Callers can lookup localized strings with an instance of HalkyonAppLocalizations
/// returned by `HalkyonAppLocalizations.of(context)`.
///
/// Applications need to include `HalkyonAppLocalizations.delegate()` in their app's
/// `localizationDelegates` list, and the locales they support in the app's
/// `supportedLocales` list. For example:
///
/// ```dart
/// import 'l10n/halkyon_app_localizations.dart';
///
/// return MaterialApp(
/// localizationsDelegates: HalkyonAppLocalizations.localizationsDelegates,
/// supportedLocales: HalkyonAppLocalizations.supportedLocales,
/// home: MyApplicationHome(),
/// );
/// ```
///
/// ## Update pubspec.yaml
///
/// Please make sure to update your pubspec.yaml to include the following
/// packages:
///
/// ```yaml
/// dependencies:
/// # Internationalization support.
/// flutter_localizations:
/// sdk: flutter
/// intl: any # Use the pinned version from flutter_localizations
///
/// # Rest of dependencies
/// ```
///
/// ## iOS Applications
///
/// iOS applications define key application metadata, including supported
/// locales, in an Info.plist file that is built into the application bundle.
/// To configure the locales supported by your app, you’ll need to edit this
/// file.
///
/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file.
/// Then, in the Project Navigator, open the Info.plist file under the Runner
/// project’s Runner folder.
///
/// Next, select the Information Property List item, select Add Item from the
/// Editor menu, then select Localizations from the pop-up menu.
///
/// Select and expand the newly-created Localizations item then, for each
/// locale your application supports, add a new item and select the locale
/// you wish to add from the pop-up menu in the Value field. This list should
/// be consistent with the languages listed in the HalkyonAppLocalizations.supportedLocales
/// property.
abstract class HalkyonAppLocalizations {
HalkyonAppLocalizations(String locale)
: localeName = intl.Intl.canonicalizedLocale(locale.toString());
final String localeName;
static HalkyonAppLocalizations of(BuildContext context) {
return Localizations.of<HalkyonAppLocalizations>(
context,
HalkyonAppLocalizations,
)!;
}
static const LocalizationsDelegate<HalkyonAppLocalizations> delegate =
_HalkyonAppLocalizationsDelegate();
/// A list of this localizations delegate along with the default localizations
/// delegates.
///
/// Returns a list of localizations delegates containing this delegate along with
/// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
/// and GlobalWidgetsLocalizations.delegate.
///
/// Additional delegates can be added by appending to this list in
/// MaterialApp. This list does not have to be used at all if a custom list
/// of delegates is preferred or required.
static const List<LocalizationsDelegate<dynamic>> localizationsDelegates =
<LocalizationsDelegate<dynamic>>[
delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
];
/// A list of this localizations delegate's supported locales.
static const List<Locale> supportedLocales = <Locale>[
Locale('de'),
Locale('en'),
Locale('en', 'GB'),
Locale('en', 'US'),
];
/// No description provided for @tryAgain.
///
/// In en, this message translates to:
/// **'Try again'**
String get tryAgain;
/// Screen readers hear it for the wordmark on the first start.
///
/// In en, this message translates to:
/// **'Welcome to {app}'**
String instanceWelcome(String app);
/// No description provided for @instanceBuiltInTagline.
///
/// In en, this message translates to:
/// **'Comes with the app'**
String get instanceBuiltInTagline;
/// No description provided for @instanceAnother.
///
/// In en, this message translates to:
/// **'Another instance'**
String get instanceAnother;
/// No description provided for @instanceAnotherTagline.
///
/// In en, this message translates to:
/// **'Enter its address'**
String get instanceAnotherTagline;
/// No description provided for @instanceAddress.
///
/// In en, this message translates to:
/// **'Instance address'**
String get instanceAddress;
/// No description provided for @instanceAddressInvalid.
///
/// In en, this message translates to:
/// **'This isn\'t an address.'**
String get instanceAddressInvalid;
/// No description provided for @instanceAddressInsecure.
///
/// In en, this message translates to:
/// **'{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.'**
String instanceAddressInsecure(String app);
/// No description provided for @instanceInsecure.
///
/// In en, this message translates to:
/// **'{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.'**
String instanceInsecure(String name, String app);
/// No description provided for @instanceInsecureUseAnother.
///
/// In en, this message translates to:
/// **'Use another instance'**
String get instanceInsecureUseAnother;
/// No description provided for @instanceInsecureRemove.
///
/// In en, this message translates to:
/// **'Remove from this device'**
String get instanceInsecureRemove;
/// No description provided for @instanceAddressRequired.
///
/// In en, this message translates to:
/// **'Enter the address of an instance.'**
String get instanceAddressRequired;
/// No description provided for @instanceContinue.
///
/// In en, this message translates to:
/// **'Continue'**
String get instanceContinue;
/// No description provided for @instanceUnreachable.
///
/// In en, this message translates to:
/// **'No instance of {app} answers at {name}.'**
String instanceUnreachable(String app, String name);
/// No description provided for @instanceUseBuiltIn.
///
/// In en, this message translates to:
/// **'Use {name}'**
String instanceUseBuiltIn(String name);
/// No description provided for @instanceOpenFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t open the app on {name}.'**
String instanceOpenFailed(String name);
/// No description provided for @instanceDataAndBackupsIn.
///
/// In en, this message translates to:
/// **'Data and backups: {place}'**
String instanceDataAndBackupsIn(String place);
/// No description provided for @instanceDataIn.
///
/// In en, this message translates to:
/// **'Data: {place}'**
String instanceDataIn(String place);
/// No description provided for @instanceBackupsIn.
///
/// In en, this message translates to:
/// **'Backups: {place}'**
String instanceBackupsIn(String place);
/// No description provided for @instanceNoBackups.
///
/// In en, this message translates to:
/// **'No backups'**
String get instanceNoBackups;
/// No description provided for @instanceEuropeanUnion.
///
/// In en, this message translates to:
/// **'European Union'**
String get instanceEuropeanUnion;
/// A country of the European Union, where an instance keeps data: Germany (EU).
///
/// In en, this message translates to:
/// **'{country} (EU)'**
String instanceCountryInEu(String country);
/// A state or region with its country, where an instance keeps data: California, United States.
///
/// In en, this message translates to:
/// **'{subdivision}, {country}'**
String instanceSubdivisionOf(String subdivision, String country);
/// No description provided for @accountsTitle.
///
/// In en, this message translates to:
/// **'Accounts'**
String get accountsTitle;
/// No description provided for @accountAdd.
///
/// In en, this message translates to:
/// **'Add account'**
String get accountAdd;
/// No description provided for @accountAddSubtitle.
///
/// In en, this message translates to:
/// **'Choose the instance for the account to add.'**
String get accountAddSubtitle;
/// No description provided for @accountSignedIn.
///
/// In en, this message translates to:
/// **'Signed in'**
String get accountSignedIn;
/// No description provided for @accountAnonymous.
///
/// In en, this message translates to:
/// **'Anonymous'**
String get accountAnonymous;
/// No description provided for @accountRemoveTooltip.
///
/// In en, this message translates to:
/// **'Remove account'**
String get accountRemoveTooltip;
/// No description provided for @accountRemoveTitle.
///
/// In en, this message translates to:
/// **'Remove account?'**
String get accountRemoveTitle;
/// No description provided for @accountRemoveMessage.
///
/// In en, this message translates to:
/// **'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. An anonymous account can\'t be signed into again.'**
String accountRemoveMessage(String name);
/// No description provided for @accountRemoveConfirm.
///
/// In en, this message translates to:
/// **'Remove'**
String get accountRemoveConfirm;
/// No description provided for @accountSignedInOn.
///
/// In en, this message translates to:
/// **'Signed in on {instance}'**
String accountSignedInOn(String instance);
/// No description provided for @accountAnonymousOn.
///
/// In en, this message translates to:
/// **'Anonymous on {instance}'**
String accountAnonymousOn(String instance);
/// No description provided for @accountSwitch.
///
/// In en, this message translates to:
/// **'Switch account'**
String get accountSwitch;
/// No description provided for @accountSignOut.
///
/// In en, this message translates to:
/// **'Sign out'**
String get accountSignOut;
/// No description provided for @accountSignOutTitle.
///
/// In en, this message translates to:
/// **'Sign out?'**
String get accountSignOutTitle;
/// No description provided for @accountDelete.
///
/// In en, this message translates to:
/// **'Delete account'**
String get accountDelete;
/// No description provided for @accountDeleteTitle.
///
/// In en, this message translates to:
/// **'Delete your account?'**
String get accountDeleteTitle;
/// No description provided for @accountSignOutFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t sign out on this device. Try again.'**
String get accountSignOutFailed;
/// No description provided for @accountDeleteFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t delete your account: the instance wasn\'t reached. Try again.'**
String get accountDeleteFailed;
/// No description provided for @aboutSourceCode.
///
/// In en, this message translates to:
/// **'The source of what this instance runs:'**
String get aboutSourceCode;
/// No description provided for @aboutSourceUnreachable.
///
/// In en, this message translates to:
/// **'Couldn\'t reach this instance to ask where its source is.'**
String get aboutSourceUnreachable;
/// No description provided for @sessionUnreachable.
///
/// In en, this message translates to:
/// **'Couldn\'t reach the server.'**
String get sessionUnreachable;
/// No description provided for @personDataFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t open this device\'s data.'**
String get personDataFailed;
/// No description provided for @startSignedOut.
///
/// In en, this message translates to:
/// **'Signed out'**
String get startSignedOut;
/// No description provided for @startOn.
///
/// In en, this message translates to:
/// **'Start on {instance}:'**
String startOn(String instance);
/// No description provided for @startWithGitHub.
///
/// In en, this message translates to:
/// **'Sign in with GitHub'**
String get startWithGitHub;
/// No description provided for @startWithoutAccount.
///
/// In en, this message translates to:
/// **'Start without an account'**
String get startWithoutAccount;
/// No description provided for @startAnonymous.
///
/// In en, this message translates to:
/// **'Progress is saved on this device. Sign in to keep it.'**
String get startAnonymous;
/// No description provided for @startGitHubFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t sign in with GitHub.'**
String get startGitHubFailed;
/// No description provided for @startNoGitHubAccount.
///
/// In en, this message translates to:
/// **'No account here signs in with this GitHub account yet.'**
String get startNoGitHubAccount;
/// Said after a GitHub account nobody on the instance signs in with, where people sign in with a password and GitHub is added to nobody (ADR 0017).
///
/// In en, this message translates to:
/// **'Create an account with your email address and a password instead.'**
String get gitHubCreateAccountInstead;
/// An anonymous person signed in with a GitHub account nobody here has, where GitHub is added to nobody: the password set up below keeps their account.
///
/// In en, this message translates to:
/// **'No account here signs in with this GitHub account yet. To keep your progress, set up a password instead.'**
String get gitHubNoAccountSetUpPassword;
/// No description provided for @gitHubUsePassword.
///
/// In en, this message translates to:
/// **'This account signs in with its email address and password now, not with GitHub.'**
String get gitHubUsePassword;
/// No description provided for @gitHubDeprecated.
///
/// In en, this message translates to:
/// **'GitHub can\'t be added as a way to sign in any more: your email address and password are.'**
String get gitHubDeprecated;
/// No description provided for @gitHubEnded.
///
/// In en, this message translates to:
/// **'Sign-in with GitHub has ended on this instance.'**
String get gitHubEnded;
/// No description provided for @startOtherInstance.
///
/// In en, this message translates to:
/// **'Use another instance'**
String get startOtherInstance;
/// No description provided for @syncTitle.
///
/// In en, this message translates to:
/// **'Sync'**
String get syncTitle;
/// No description provided for @syncNow.
///
/// In en, this message translates to:
/// **'Sync now'**
String get syncNow;
/// No description provided for @syncStateSyncing.
///
/// In en, this message translates to:
/// **'Syncing…'**
String get syncStateSyncing;
/// No description provided for @syncStateSynced.
///
/// In en, this message translates to:
/// **'Everything synced'**
String get syncStateSynced;
/// No description provided for @syncStateFailing.
///
/// In en, this message translates to:
/// **'Sync is failing'**
String get syncStateFailing;
/// No description provided for @syncStateNotYet.
///
/// In en, this message translates to:
/// **'Not synced yet'**
String get syncStateNotYet;
/// No description provided for @syncStateMismatch.
///
/// In en, this message translates to:
/// **'This app can\'t sync with {server}'**
String syncStateMismatch(String server);
/// No description provided for @syncMismatchDetail.
///
/// In en, this message translates to:
/// **'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.'**
String get syncMismatchDetail;
/// No description provided for @syncLastCompleted.
///
/// In en, this message translates to:
/// **'Last completed at {time}'**
String syncLastCompleted(String time);
/// No description provided for @syncLastFailed.
///
/// In en, this message translates to:
/// **'Last attempt failed at {time}'**
String syncLastFailed(String time);
/// No description provided for @syncNoRunYet.
///
/// In en, this message translates to:
/// **'No sync has completed since the app started'**
String get syncNoRunYet;
/// No description provided for @syncPending.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 change waits to sync} other{{count} changes wait to sync}}'**
String syncPending(int count);
/// No description provided for @syncTroubleLabel.
///
/// In en, this message translates to:
/// **'Sync needs attention'**
String get syncTroubleLabel;
/// No description provided for @syncMismatchBanner.
///
/// In en, this message translates to:
/// **'This app can\'t sync with {server} any more. Update it to keep syncing.'**
String syncMismatchBanner(String server);
/// No description provided for @syncMismatchMore.
///
/// In en, this message translates to:
/// **'More'**
String get syncMismatchMore;
feat(app): sign in with a password and TOTP on the device ADR 0017, step 3: halkyon_app's side, which Learn and Todo take. - The account's cryptography on the device (`SodiumAccountCrypto`): halkyon_keys and SRP's client half, each step on an isolate of its own. sodium hands out results as views of native memory its finalizers free once the isolate that made them ends, so everything crossing back is copied first: a view read freed memory and crashed the process. - `PasswordGateway` on the module's endpoints (steps without a session through a client holding none; an authenticator set up with a session granted but not yet the device's), and `PasswordRepository` running the flows: signing in (M2 checked, the keys opened before anything is trusted), signing up, a password for someone signed in, an account never finished, the authenticators, recovery codes, changing the password, a new recovery phrase, and getting back in. - The unlocked keys in the system's keyring per instance and person (`SecureAccountKeyStore`), gone once another person signs in or nobody, and with the instance's removal. - The screens: the start screen's Sign in and Create an account (and when GitHub sign-in ends), the sign-in sheet (codes, recovery codes, an account never finished, a lost authenticator), the account's setup (the recovery phrase shown once, three random words typed back before anything reaches the instance; the authenticator's QR code, drawn with pub.dev's qr; the recovery codes), getting back in, and the account section (`AccountSecuritySection`). - `FileSaver` moves from Learn into halkyon_app, for the phrase and the codes in Todo too; `AppDependencies` names it and `passwords`. - halkyon_keys rebuilds account keys from the secret keys a device kept; the key proof's message is in halkyon_base_client, checked against the register's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-20 15:42:45 +02:00
/// No description provided for @startSignIn.
///
/// In en, this message translates to:
/// **'Sign in'**
String get startSignIn;
/// No description provided for @startCreateAccount.
///
/// In en, this message translates to:
/// **'Create an account'**
String get startCreateAccount;
/// No description provided for @startGitHubEnds.
///
/// In en, this message translates to:
/// **'Sign-in with GitHub ends on {date}.'**
String startGitHubEnds(String date);
/// No description provided for @passwordAddress.
///
/// In en, this message translates to:
/// **'Email address'**
String get passwordAddress;
/// No description provided for @passwordPassword.
///
/// In en, this message translates to:
/// **'Password'**
String get passwordPassword;
/// No description provided for @passwordNewPassword.
///
/// In en, this message translates to:
/// **'New password'**
String get passwordNewPassword;
/// No description provided for @passwordCurrent.
///
/// In en, this message translates to:
/// **'Current password'**
String get passwordCurrent;
/// No description provided for @passwordRepeat.
///
/// In en, this message translates to:
/// **'New password again'**
String get passwordRepeat;
/// No description provided for @passwordsDiffer.
///
/// In en, this message translates to:
/// **'The two passwords differ.'**
String get passwordsDiffer;
/// No description provided for @passwordShow.
///
/// In en, this message translates to:
/// **'Show password'**
String get passwordShow;
/// No description provided for @passwordHide.
///
/// In en, this message translates to:
/// **'Hide password'**
String get passwordHide;
/// No description provided for @passwordContinue.
///
/// In en, this message translates to:
/// **'Continue'**
String get passwordContinue;
/// No description provided for @passwordBack.
///
/// In en, this message translates to:
/// **'Back'**
String get passwordBack;
/// No description provided for @passwordDone.
///
/// In en, this message translates to:
/// **'Done'**
String get passwordDone;
/// No description provided for @passwordSave.
///
/// In en, this message translates to:
/// **'Save as a file'**
String get passwordSave;
/// No description provided for @passwordQrCode.
///
/// In en, this message translates to:
/// **'QR code for your authenticator app'**
String get passwordQrCode;
/// No description provided for @passwordMailCode.
///
/// In en, this message translates to:
/// **'Code from the email'**
String get passwordMailCode;
/// No description provided for @passwordMailCodeSent.
///
/// In en, this message translates to:
/// **'We emailed a code to {address}. It\'s valid for 15 minutes.'**
String passwordMailCodeSent(String address);
/// No description provided for @passwordResendCode.
///
/// In en, this message translates to:
/// **'Send a new code'**
String get passwordResendCode;
/// No description provided for @passwordTotpCode.
///
/// In en, this message translates to:
/// **'Code from your authenticator app'**
String get passwordTotpCode;
/// No description provided for @passwordRecoveryCode.
///
/// In en, this message translates to:
/// **'Recovery code'**
String get passwordRecoveryCode;
/// No description provided for @passwordUseRecoveryCode.
///
/// In en, this message translates to:
/// **'Use a recovery code instead'**
String get passwordUseRecoveryCode;
/// No description provided for @passwordUseTotpCode.
///
/// In en, this message translates to:
/// **'Use your authenticator app instead'**
String get passwordUseTotpCode;
/// No description provided for @passwordUnlocking.
///
/// In en, this message translates to:
/// **'Unlocking your password on this device…'**
String get passwordUnlocking;
/// No description provided for @passwordMakingKeys.
///
/// In en, this message translates to:
/// **'Making your keys on this device…'**
String get passwordMakingKeys;
/// No description provided for @passwordSignInTitle.
///
/// In en, this message translates to:
/// **'Sign in'**
String get passwordSignInTitle;
/// No description provided for @passwordSignInAction.
///
/// In en, this message translates to:
/// **'Sign in'**
String get passwordSignInAction;
/// No description provided for @passwordSignInIntro.
///
/// In en, this message translates to:
/// **'With the email address and password of your account on {instance}.'**
String passwordSignInIntro(String instance);
/// No description provided for @passwordSecondFactorIntro.
///
/// In en, this message translates to:
/// **'Enter the code your authenticator app shows for {instance}.'**
String passwordSecondFactorIntro(String instance);
/// No description provided for @passwordRecoveryCodeIntro.
///
/// In en, this message translates to:
/// **'Enter one of the recovery codes you kept. Each signs in once.'**
String get passwordRecoveryCodeIntro;
/// No description provided for @passwordForgot.
///
/// In en, this message translates to:
/// **'Forgot your password?'**
String get passwordForgot;
/// No description provided for @passwordOtherPassword.
///
/// In en, this message translates to:
/// **'Change the address or password'**
String get passwordOtherPassword;
/// No description provided for @passwordLostAuthenticator.
///
/// In en, this message translates to:
/// **'Lost your authenticator?'**
String get passwordLostAuthenticator;
/// No description provided for @passwordLostAuthenticatorTitle.
///
/// In en, this message translates to:
/// **'Lost authenticator'**
String get passwordLostAuthenticatorTitle;
/// No description provided for @passwordLostAuthenticatorIntro.
///
/// In en, this message translates to:
/// **'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.'**
String get passwordLostAuthenticatorIntro;
/// No description provided for @passwordResetWithMail.
///
/// In en, this message translates to:
/// **'Reset with a code by email'**
String get passwordResetWithMail;
/// No description provided for @passwordResetWithMailHint.
///
/// In en, this message translates to:
/// **'We email a code to {address}.'**
String passwordResetWithMailHint(String address);
/// No description provided for @passwordResetWithPhrase.
///
/// In en, this message translates to:
/// **'Reset with your recovery phrase'**
String get passwordResetWithPhrase;
/// No description provided for @passwordResetWithPhraseHint.
///
/// In en, this message translates to:
/// **'The 24 words you wrote down.'**
String get passwordResetWithPhraseHint;
/// No description provided for @passwordSignInWithoutCode.
///
/// In en, this message translates to:
/// **'Sign in without a code'**
String get passwordSignInWithoutCode;
/// No description provided for @passwordSignInWithoutCodeHint.
///
/// In en, this message translates to:
/// **'Once a reset you asked for has taken effect.'**
String get passwordSignInWithoutCodeHint;
/// No description provided for @passwordResetAction.
///
/// In en, this message translates to:
/// **'Reset'**
String get passwordResetAction;
/// No description provided for @passwordAuthenticatorResetAt.
///
/// In en, this message translates to:
/// **'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.'**
String passwordAuthenticatorResetAt(String date);
/// No description provided for @passwordUnfinishedIntro.
///
/// In en, this message translates to:
/// **'Your account was never finished. We emailed a code to {address}: with it, you sign in and set up an authenticator.'**
String passwordUnfinishedIntro(String address);
/// No description provided for @passwordPhraseField.
///
/// In en, this message translates to:
/// **'Recovery phrase'**
String get passwordPhraseField;
/// No description provided for @passwordPhraseFieldHint.
///
/// In en, this message translates to:
/// **'The 24 words, with spaces between them'**
String get passwordPhraseFieldHint;
/// No description provided for @passwordPhraseFieldIntro.
///
/// In en, this message translates to:
/// **'Enter your recovery phrase: it proves the account is yours.'**
String get passwordPhraseFieldIntro;
/// No description provided for @passwordAuthenticatorTitle.
///
/// In en, this message translates to:
/// **'Set up an authenticator'**
String get passwordAuthenticatorTitle;
/// No description provided for @passwordAuthenticatorIntro.
///
/// In en, this message translates to:
/// **'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.'**
String get passwordAuthenticatorIntro;
/// No description provided for @passwordAuthenticatorKey.
///
/// In en, this message translates to:
/// **'Key'**
String get passwordAuthenticatorKey;
/// No description provided for @passwordAuthenticatorOpen.
///
/// In en, this message translates to:
/// **'Open in your authenticator app'**
String get passwordAuthenticatorOpen;
/// No description provided for @passwordAuthenticatorNoApp.
///
/// In en, this message translates to:
/// **'No app on this device opens it. Scan the code or type in the key.'**
String get passwordAuthenticatorNoApp;
/// No description provided for @passwordAuthenticatorCodeIntro.
///
/// In en, this message translates to:
/// **'Then enter the code it shows.'**
String get passwordAuthenticatorCodeIntro;
/// No description provided for @passwordAuthenticatorOwnerIntro.
///
/// In en, this message translates to:
/// **'To add it, confirm it is you: your password and a code from an authenticator you added before.'**
String get passwordAuthenticatorOwnerIntro;
feat(app): sign in with a password and TOTP on the device ADR 0017, step 3: halkyon_app's side, which Learn and Todo take. - The account's cryptography on the device (`SodiumAccountCrypto`): halkyon_keys and SRP's client half, each step on an isolate of its own. sodium hands out results as views of native memory its finalizers free once the isolate that made them ends, so everything crossing back is copied first: a view read freed memory and crashed the process. - `PasswordGateway` on the module's endpoints (steps without a session through a client holding none; an authenticator set up with a session granted but not yet the device's), and `PasswordRepository` running the flows: signing in (M2 checked, the keys opened before anything is trusted), signing up, a password for someone signed in, an account never finished, the authenticators, recovery codes, changing the password, a new recovery phrase, and getting back in. - The unlocked keys in the system's keyring per instance and person (`SecureAccountKeyStore`), gone once another person signs in or nobody, and with the instance's removal. - The screens: the start screen's Sign in and Create an account (and when GitHub sign-in ends), the sign-in sheet (codes, recovery codes, an account never finished, a lost authenticator), the account's setup (the recovery phrase shown once, three random words typed back before anything reaches the instance; the authenticator's QR code, drawn with pub.dev's qr; the recovery codes), getting back in, and the account section (`AccountSecuritySection`). - `FileSaver` moves from Learn into halkyon_app, for the phrase and the codes in Todo too; `AppDependencies` names it and `passwords`. - halkyon_keys rebuilds account keys from the secret keys a device kept; the key proof's message is in halkyon_base_client, checked against the register's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-20 15:42:45 +02:00
/// No description provided for @passwordExistingCode.
///
/// In en, this message translates to:
/// **'Code from an authenticator you added before'**
String get passwordExistingCode;
/// No description provided for @passwordRecoveryCodesTitle.
///
/// In en, this message translates to:
/// **'Recovery codes'**
String get passwordRecoveryCodesTitle;
/// No description provided for @passwordRecoveryCodesIntro.
///
/// In en, this message translates to:
/// **'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.'**
String get passwordRecoveryCodesIntro;
/// No description provided for @passwordCodesKept.
///
/// In en, this message translates to:
/// **'I\'ve kept them'**
String get passwordCodesKept;
/// No description provided for @passwordPhraseTitle.
///
/// In en, this message translates to:
/// **'Your recovery phrase'**
String get passwordPhraseTitle;
/// No description provided for @passwordPhraseIntro.
///
/// In en, this message translates to:
/// **'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.'**
String get passwordPhraseIntro;
/// No description provided for @passwordPhraseWrittenDown.
///
/// In en, this message translates to:
/// **'I\'ve written it down'**
String get passwordPhraseWrittenDown;
/// No description provided for @passwordPhraseCheckTitle.
///
/// In en, this message translates to:
/// **'Check your recovery phrase'**
String get passwordPhraseCheckTitle;
/// No description provided for @passwordPhraseCheckIntro.
///
/// In en, this message translates to:
/// **'Type the words asked for, from what you wrote down.'**
String get passwordPhraseCheckIntro;
/// No description provided for @passwordPhraseWord.
///
/// In en, this message translates to:
/// **'Word {number}'**
String passwordPhraseWord(int number);
/// No description provided for @passwordPhraseWrong.
///
/// In en, this message translates to:
/// **'These aren\'t the words. Look again at what you wrote down.'**
String get passwordPhraseWrong;
/// No description provided for @passwordPhraseShowAgain.
///
/// In en, this message translates to:
/// **'Show the phrase again'**
String get passwordPhraseShowAgain;
/// No description provided for @passwordCreateTitle.
///
/// In en, this message translates to:
/// **'Create an account'**
String get passwordCreateTitle;
/// No description provided for @passwordCreateIntro.
///
/// In en, this message translates to:
/// **'On {instance}, with your email address, a password, and an authenticator app for the code every sign-in takes.'**
String passwordCreateIntro(String instance);
/// No description provided for @passwordSetUpTitle.
///
/// In en, this message translates to:
/// **'Set up a password'**
String get passwordSetUpTitle;
/// No description provided for @passwordSetUpIntro.
///
/// In en, this message translates to:
/// **'Sign in with your email address, a password and an authenticator app, on this device and others. Everything you have stays.'**
String get passwordSetUpIntro;
/// No description provided for @passwordChooseIntro.
///
/// In en, this message translates to:
/// **'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.'**
String get passwordChooseIntro;
/// No description provided for @passwordFinishResetTitle.
///
/// In en, this message translates to:
/// **'Finish the reset'**
String get passwordFinishResetTitle;
/// No description provided for @passwordFinishResetIntro.
///
/// In en, this message translates to:
/// **'72 hours after you asked to reset your account, finish it here with a new code by email.'**
String get passwordFinishResetIntro;
/// No description provided for @passwordFinishResetHavePhrase.
///
/// In en, this message translates to:
/// **'I have my recovery phrase'**
String get passwordFinishResetHavePhrase;
/// No description provided for @passwordFinishResetKeepsKeys.
///
/// In en, this message translates to:
/// **'Your account keeps its keys: nothing encrypted is lost.'**
String get passwordFinishResetKeepsKeys;
/// No description provided for @passwordFinishResetNewKeys.
///
/// In en, this message translates to:
/// **'Without your recovery phrase, your account gets new keys: what was encrypted with the old ones is lost.'**
String get passwordFinishResetNewKeys;
/// No description provided for @passwordRecoveryTitle.
///
/// In en, this message translates to:
/// **'Get back into your account'**
String get passwordRecoveryTitle;
/// No description provided for @passwordRecoveryWithPhrase.
///
/// In en, this message translates to:
/// **'I have my recovery phrase'**
String get passwordRecoveryWithPhrase;
/// No description provided for @passwordRecoveryWithPhraseHint.
///
/// In en, this message translates to:
/// **'Set a new password at once. Everything stays.'**
String get passwordRecoveryWithPhraseHint;
/// No description provided for @passwordRecoveryWithPhraseIntro.
///
/// In en, this message translates to:
/// **'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.'**
String get passwordRecoveryWithPhraseIntro;
/// No description provided for @passwordRecoveryNoCodeHint.
///
/// In en, this message translates to:
/// **'Lost your authenticator as well? Reset your account 72 hours later with your recovery phrase: it keeps everything.'**
String get passwordRecoveryNoCodeHint;
/// No description provided for @passwordRecoveryWithoutPhrase.
///
/// In en, this message translates to:
/// **'Reset my account'**
String get passwordRecoveryWithoutPhrase;
/// No description provided for @passwordRecoveryWithoutPhraseHint.
///
/// In en, this message translates to:
/// **'Takes effect 72 hours later. Without your recovery phrase, what\'s encrypted is lost.'**
String get passwordRecoveryWithoutPhraseHint;
/// No description provided for @passwordRecoveryStartIntro.
///
/// In en, this message translates to:
/// **'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.'**
String get passwordRecoveryStartIntro;
/// No description provided for @passwordRecoveryFinish.
///
/// In en, this message translates to:
/// **'Finish a reset'**
String get passwordRecoveryFinish;
/// No description provided for @passwordRecoveryFinishHint.
///
/// In en, this message translates to:
/// **'72 hours after you asked for it.'**
String get passwordRecoveryFinishHint;
/// No description provided for @passwordResetStarted.
///
/// In en, this message translates to:
/// **'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.'**
String passwordResetStarted(String date);
/// No description provided for @passwordSectionTitle.
///
/// In en, this message translates to:
/// **'Password and authenticator'**
String get passwordSectionTitle;
/// No description provided for @passwordSectionFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t read how your account signs in.'**
String get passwordSectionFailed;
/// No description provided for @passwordSectionGitHubEnds.
///
/// In en, this message translates to:
/// **'Sign-in with GitHub ends on {date}. Set up a password before then to keep your account.'**
String passwordSectionGitHubEnds(String date);
/// No description provided for @passwordSectionSetUp.
///
/// In en, this message translates to:
/// **'Set up a password'**
String get passwordSectionSetUp;
/// No description provided for @passwordSectionSetUpHint.
///
/// In en, this message translates to:
/// **'Sign in with your email address, a password and an authenticator app.'**
String get passwordSectionSetUpHint;
/// No description provided for @passwordSectionUnfinished.
///
/// In en, this message translates to:
/// **'Finish setting up: add an authenticator'**
String get passwordSectionUnfinished;
/// No description provided for @passwordSectionUnfinishedHint.
///
/// In en, this message translates to:
/// **'Your password signs in once an authenticator is set up.'**
String get passwordSectionUnfinishedHint;
/// No description provided for @passwordSectionChange.
///
/// In en, this message translates to:
/// **'Change password'**
String get passwordSectionChange;
/// No description provided for @passwordSectionKeysMissing.
///
/// In en, this message translates to:
/// **'Sign in on this device with your password to change it.'**
String get passwordSectionKeysMissing;
/// No description provided for @passwordSectionNotConfirmed.
///
/// In en, this message translates to:
/// **'Not set up yet'**
String get passwordSectionNotConfirmed;
/// No description provided for @passwordSectionRemove.
///
/// In en, this message translates to:
/// **'Remove {name}?'**
String passwordSectionRemove(String name);
/// No description provided for @passwordSectionRemoveIntro.
///
/// In en, this message translates to:
/// **'Enter your password and a code from one of your authenticators to confirm.'**
feat(app): sign in with a password and TOTP on the device ADR 0017, step 3: halkyon_app's side, which Learn and Todo take. - The account's cryptography on the device (`SodiumAccountCrypto`): halkyon_keys and SRP's client half, each step on an isolate of its own. sodium hands out results as views of native memory its finalizers free once the isolate that made them ends, so everything crossing back is copied first: a view read freed memory and crashed the process. - `PasswordGateway` on the module's endpoints (steps without a session through a client holding none; an authenticator set up with a session granted but not yet the device's), and `PasswordRepository` running the flows: signing in (M2 checked, the keys opened before anything is trusted), signing up, a password for someone signed in, an account never finished, the authenticators, recovery codes, changing the password, a new recovery phrase, and getting back in. - The unlocked keys in the system's keyring per instance and person (`SecureAccountKeyStore`), gone once another person signs in or nobody, and with the instance's removal. - The screens: the start screen's Sign in and Create an account (and when GitHub sign-in ends), the sign-in sheet (codes, recovery codes, an account never finished, a lost authenticator), the account's setup (the recovery phrase shown once, three random words typed back before anything reaches the instance; the authenticator's QR code, drawn with pub.dev's qr; the recovery codes), getting back in, and the account section (`AccountSecuritySection`). - `FileSaver` moves from Learn into halkyon_app, for the phrase and the codes in Todo too; `AppDependencies` names it and `passwords`. - halkyon_keys rebuilds account keys from the secret keys a device kept; the key proof's message is in halkyon_base_client, checked against the register's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-20 15:42:45 +02:00
String get passwordSectionRemoveIntro;
/// No description provided for @passwordSectionRemoveAction.
///
/// In en, this message translates to:
/// **'Remove'**
String get passwordSectionRemoveAction;
/// No description provided for @passwordSectionAddAuthenticator.
///
/// In en, this message translates to:
/// **'Add an authenticator'**
String get passwordSectionAddAuthenticator;
/// No description provided for @passwordSectionRecoveryCodes.
///
/// In en, this message translates to:
/// **'New recovery codes'**
String get passwordSectionRecoveryCodes;
/// No description provided for @passwordSectionRecoveryCodesHint.
///
/// In en, this message translates to:
/// **'The old ones stop working.'**
String get passwordSectionRecoveryCodesHint;
/// No description provided for @passwordSectionNewPhrase.
///
/// In en, this message translates to:
/// **'New recovery phrase'**
String get passwordSectionNewPhrase;
/// No description provided for @passwordSectionPhraseHint.
///
/// In en, this message translates to:
/// **'Your old phrase stops working.'**
String get passwordSectionPhraseHint;
/// No description provided for @passwordChangeTitle.
///
/// In en, this message translates to:
/// **'Change password'**
String get passwordChangeTitle;
/// No description provided for @passwordChangeIntro.
///
/// In en, this message translates to:
/// **'Your other devices are signed out. Your keys stay: nothing is lost.'**
String get passwordChangeIntro;
/// No description provided for @passwordChangeAction.
///
/// In en, this message translates to:
/// **'Change password'**
String get passwordChangeAction;
/// No description provided for @passwordChanged.
///
/// In en, this message translates to:
/// **'Password changed. Your other devices are signed out.'**
String get passwordChanged;
/// No description provided for @passwordNewCodesIntro.
///
/// In en, this message translates to:
/// **'Enter your password and a code from your authenticator app. Your old recovery codes stop working.'**
feat(app): sign in with a password and TOTP on the device ADR 0017, step 3: halkyon_app's side, which Learn and Todo take. - The account's cryptography on the device (`SodiumAccountCrypto`): halkyon_keys and SRP's client half, each step on an isolate of its own. sodium hands out results as views of native memory its finalizers free once the isolate that made them ends, so everything crossing back is copied first: a view read freed memory and crashed the process. - `PasswordGateway` on the module's endpoints (steps without a session through a client holding none; an authenticator set up with a session granted but not yet the device's), and `PasswordRepository` running the flows: signing in (M2 checked, the keys opened before anything is trusted), signing up, a password for someone signed in, an account never finished, the authenticators, recovery codes, changing the password, a new recovery phrase, and getting back in. - The unlocked keys in the system's keyring per instance and person (`SecureAccountKeyStore`), gone once another person signs in or nobody, and with the instance's removal. - The screens: the start screen's Sign in and Create an account (and when GitHub sign-in ends), the sign-in sheet (codes, recovery codes, an account never finished, a lost authenticator), the account's setup (the recovery phrase shown once, three random words typed back before anything reaches the instance; the authenticator's QR code, drawn with pub.dev's qr; the recovery codes), getting back in, and the account section (`AccountSecuritySection`). - `FileSaver` moves from Learn into halkyon_app, for the phrase and the codes in Todo too; `AppDependencies` names it and `passwords`. - halkyon_keys rebuilds account keys from the secret keys a device kept; the key proof's message is in halkyon_base_client, checked against the register's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-20 15:42:45 +02:00
String get passwordNewCodesIntro;
/// No description provided for @passwordNewPhraseIntro.
///
/// In en, this message translates to:
/// **'Your new recovery phrase. Write the 24 words down in order: once you confirm it, your old phrase opens nothing any more.'**
String get passwordNewPhraseIntro;
/// No description provided for @passwordPhraseKept.
///
/// In en, this message translates to:
/// **'New recovery phrase set. The old one no longer works.'**
String get passwordPhraseKept;
/// No description provided for @passwordWrongCredentials.
///
/// In en, this message translates to:
/// **'The address, the password or the code isn\'t right.'**
String get passwordWrongCredentials;
/// No description provided for @passwordTooManyAttempts.
///
/// In en, this message translates to:
/// **'Too many attempts. Try again in an hour.'**
String get passwordTooManyAttempts;
/// No description provided for @passwordSetupIncomplete.
///
/// In en, this message translates to:
/// **'Your account was never finished: set up an authenticator.'**
String get passwordSetupIncomplete;
/// No description provided for @passwordNotDue.
///
/// In en, this message translates to:
/// **'This takes effect on {date}.'**
String passwordNotDue(String date);
/// No description provided for @passwordNotDueYet.
///
/// In en, this message translates to:
/// **'This hasn\'t taken effect yet.'**
String get passwordNotDueYet;
/// No description provided for @passwordNoReset.
///
/// In en, this message translates to:
/// **'No reset waits for this address.'**
String get passwordNoReset;
/// No description provided for @passwordExists.
///
/// In en, this message translates to:
/// **'This address\'s account has a password already. Sign in with it, or get back in if you\'ve forgotten it.'**
String get passwordExists;
/// No description provided for @passwordAddressTaken.
///
/// In en, this message translates to:
/// **'This address belongs to another account.'**
String get passwordAddressTaken;
/// No description provided for @passwordNoAddress.
///
/// In en, this message translates to:
/// **'Your account has no email address yet.'**
String get passwordNoAddress;
/// No description provided for @passwordNoPassword.
///
/// In en, this message translates to:
/// **'This account has no password.'**
String get passwordNoPassword;
/// No description provided for @passwordWrongCode.
///
/// In en, this message translates to:
/// **'This code isn\'t right. Enter the one your app shows now.'**
String get passwordWrongCode;
/// No description provided for @passwordLastAuthenticator.
///
/// In en, this message translates to:
/// **'Your last authenticator can\'t go: every sign-in needs one.'**
String get passwordLastAuthenticator;
/// No description provided for @passwordTooManyAuthenticators.
///
/// In en, this message translates to:
/// **'Your account has as many authenticators as it may. Remove one first.'**
String get passwordTooManyAuthenticators;
/// No description provided for @passwordUnknownAuthenticator.
///
/// In en, this message translates to:
/// **'This authenticator is gone.'**
String get passwordUnknownAuthenticator;
/// No description provided for @passwordInvalidSetup.
///
/// In en, this message translates to:
/// **'The instance didn\'t accept what this device made. Update the app, or try again.'**
String get passwordInvalidSetup;
/// No description provided for @passwordChallengeExpired.
///
/// In en, this message translates to:
/// **'That took too long. Try again.'**
String get passwordChallengeExpired;
/// No description provided for @passwordUnavailable.
///
/// In en, this message translates to:
/// **'This instance offers no password sign-in.'**
String get passwordUnavailable;
/// No description provided for @passwordNotAnAddress.
///
/// In en, this message translates to:
/// **'This isn\'t an email address.'**
String get passwordNotAnAddress;
/// No description provided for @passwordTooManyCodes.
///
/// In en, this message translates to:
/// **'Too many codes asked for. Try again in an hour.'**
String get passwordTooManyCodes;
/// No description provided for @passwordWrongMailCode.
///
/// In en, this message translates to:
/// **'This code isn\'t right.'**
String get passwordWrongMailCode;
/// No description provided for @passwordTooManyMailTries.
///
/// In en, this message translates to:
/// **'Too many wrong codes. Ask for a new one.'**
String get passwordTooManyMailTries;
/// No description provided for @passwordMailCodeExpired.
///
/// In en, this message translates to:
/// **'This code is no longer valid. Ask for a new one.'**
String get passwordMailCodeExpired;
/// No description provided for @passwordMailFailed.
///
/// In en, this message translates to:
/// **'The instance couldn\'t send the email. Try again later.'**
String get passwordMailFailed;
/// No description provided for @passwordOtherAddressLinked.
///
/// In en, this message translates to:
/// **'Your account has another email address.'**
String get passwordOtherAddressLinked;
/// No description provided for @passwordNotAPhrase.
///
/// In en, this message translates to:
/// **'This isn\'t a recovery phrase: check every word and their number.'**
String get passwordNotAPhrase;
/// No description provided for @passwordPhraseDoesNotFit.
///
/// In en, this message translates to:
/// **'The address or the recovery phrase isn\'t right.'**
String get passwordPhraseDoesNotFit;
/// No description provided for @passwordUnusable.
///
/// In en, this message translates to:
/// **'This password can\'t be used: it\'s empty, or holds characters that aren\'t text.'**
String get passwordUnusable;
/// No description provided for @passwordInstanceUnproven.
///
/// In en, this message translates to:
/// **'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.'**
String get passwordInstanceUnproven;
/// No description provided for @passwordKeysMissing.
///
/// In en, this message translates to:
/// **'Your account\'s keys aren\'t on this device. Sign out and in again with your password here.'**
String get passwordKeysMissing;
/// No description provided for @passwordUnsafeCosts.
///
/// In en, this message translates to:
/// **'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.'**
String get passwordUnsafeCosts;
feat(app): sign in with a password and TOTP on the device ADR 0017, step 3: halkyon_app's side, which Learn and Todo take. - The account's cryptography on the device (`SodiumAccountCrypto`): halkyon_keys and SRP's client half, each step on an isolate of its own. sodium hands out results as views of native memory its finalizers free once the isolate that made them ends, so everything crossing back is copied first: a view read freed memory and crashed the process. - `PasswordGateway` on the module's endpoints (steps without a session through a client holding none; an authenticator set up with a session granted but not yet the device's), and `PasswordRepository` running the flows: signing in (M2 checked, the keys opened before anything is trusted), signing up, a password for someone signed in, an account never finished, the authenticators, recovery codes, changing the password, a new recovery phrase, and getting back in. - The unlocked keys in the system's keyring per instance and person (`SecureAccountKeyStore`), gone once another person signs in or nobody, and with the instance's removal. - The screens: the start screen's Sign in and Create an account (and when GitHub sign-in ends), the sign-in sheet (codes, recovery codes, an account never finished, a lost authenticator), the account's setup (the recovery phrase shown once, three random words typed back before anything reaches the instance; the authenticator's QR code, drawn with pub.dev's qr; the recovery codes), getting back in, and the account section (`AccountSecuritySection`). - `FileSaver` moves from Learn into halkyon_app, for the phrase and the codes in Todo too; `AppDependencies` names it and `passwords`. - halkyon_keys rebuilds account keys from the secret keys a device kept; the key proof's message is in halkyon_base_client, checked against the register's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-20 15:42:45 +02:00
/// No description provided for @passwordFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t reach the instance. Check the connection and try again.'**
String get passwordFailed;
/// No description provided for @passwordMinLength.
///
/// In en, this message translates to:
/// **'At least {count} characters'**
String passwordMinLength(int count);
/// No description provided for @passwordTooShort.
///
/// In en, this message translates to:
/// **'A new password needs at least {count} characters: should the instance\'s database ever leak, a short one is guessed first.'**
String passwordTooShort(int count);
fix(auth): codes wait after ten wrong in a row, and the owner is told Whoever knew the password could guess codes at 10 an hour forever, unnoticed, each guess checked against every authenticator (the second reading's M4). Every code an account's second factor refuses after a right password (sign-in, a phrase's reset, a change) or from a signed-in device (removing an authenticator, new recovery codes, the code from one confirmed before) now counts, per account, from every network; after every tenth in a row no code is taken (codesWait, saying until when), an hour, then twice as long each time, a day at the most (longestCodeWait, second_factor_waits.dart): at a day, ten guesses a day still have about a 1 % chance a year against one authenticator, so the first wait mails the owner that someone knows their password. The instance keeps no address, so sign-in and the phrase's reset now send the address the device typed (and its language), used only for that mail after its hash is checked against the account's. A code accepted clears it all. Migration (module, Learn's and Todo's servers, Learn's device schema): CREATE TABLE "second_factor_failures" ("id" bigserial PRIMARY KEY, "authUserId" uuid NOT NULL, "failures" bigint NOT NULL, "waits" bigint NOT NULL, "waitUntil" timestamp, "updatedAt" timestamp NOT NULL) with a unique index on "authUserId": a new table, nothing touched. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-20 21:47:38 +02:00
/// No description provided for @passwordCodesWait.
///
/// In en, this message translates to:
/// **'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.'**
String passwordCodesWait(String date);
/// No description provided for @passwordDeleteIntro.
///
/// In en, this message translates to:
/// **'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.'**
String get passwordDeleteIntro;
fix(auth): a session's wrong codes end the session, not the account's codes Wrong codes for removing an authenticator, new recovery codes or confirming one counted toward the account's waits (the re-review's third finding): a stolen session alone, without the password, could keep the owner's codes waiting for up to a day at a time, renewed without end, holding them out of signing in and of changing the password, the way to end that session, and nobody was mailed. Those codes now count per session, where the session is (the register's own, or a member's, which forwards the code): each try counted before its code is checked (one statement, so tries sent at once count each), a code accepted clearing the count, and the tenth wrong in a row ending the session (sessionEnded; the device says it was signed out). A try that checked no code (a refusal of something else) is taken back. The account's waits now count only codes after a right password, and the per-account ten tries an hour, which a session could fill as well, go. Migration (module, Learn's and Todo's servers, Learn's device schema): CREATE TABLE "session_code_failures" ("id" bigserial PRIMARY KEY, "sessionId" uuid NOT NULL, "authUserId" uuid NOT NULL, "failures" bigint NOT NULL, "updatedAt" timestamp NOT NULL) with a unique index on "sessionId": a new table, nothing touched. Its rows go with a code accepted, with the person, and hourly once their session is gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-20 22:53:20 +02:00
/// No description provided for @passwordSessionEnded.
///
/// In en, this message translates to:
/// **'Too many wrong codes in a row from this device: it was signed out. Sign in again with your password and a code.'**
String get passwordSessionEnded;
/// No description provided for @passwordAddressUnknown.
///
/// In en, this message translates to:
/// **'Enter your account\'s email address: the code goes there.'**
String get passwordAddressUnknown;
/// No description provided for @passwordDeleteIntroByMail.
///
/// In en, this message translates to:
/// **'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.'**
String get passwordDeleteIntroByMail;
/// No description provided for @passwordDeleteSendCode.
///
/// In en, this message translates to:
/// **'Email me a code'**
String get passwordDeleteSendCode;
/// No description provided for @passwordSignInAgain.
///
/// In en, this message translates to:
/// **'To give an account that signs in with GitHub its password, sign in with GitHub again first: it has been more than a few minutes.'**
String get passwordSignInAgain;
/// No description provided for @passwordSignInWithGitHubAgain.
///
/// In en, this message translates to:
/// **'Sign in with GitHub again'**
String get passwordSignInWithGitHubAgain;
/// No description provided for @passwordOfferTitle.
///
/// In en, this message translates to:
/// **'Set up a password'**
String get passwordOfferTitle;
/// No description provided for @passwordOfferBody.
///
/// In en, this message translates to:
/// **'Sign-in with GitHub is ending. Set up a password and an authenticator app to keep your account.'**
String get passwordOfferBody;
/// No description provided for @passwordOfferLater.
///
/// In en, this message translates to:
/// **'Later'**
String get passwordOfferLater;
/// No description provided for @passwordAuthenticatorPasswordIntro.
///
/// In en, this message translates to:
/// **'To add it, confirm it is you with your password.'**
String get passwordAuthenticatorPasswordIntro;
/// No description provided for @passwordWarningTitle.
///
/// In en, this message translates to:
/// **'Someone tried your password'**
String get passwordWarningTitle;
/// No description provided for @passwordWarningBody.
///
/// In en, this message translates to:
/// **'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.'**
String passwordWarningBody(String date);
/// No description provided for @passwordWarningDismiss.
///
/// In en, this message translates to:
/// **'Dismiss'**
String get passwordWarningDismiss;
/// No description provided for @passwordWarningLater.
///
/// In en, this message translates to:
/// **'Remind me later'**
String get passwordWarningLater;
/// No description provided for @passwordResetsTitle.
///
/// In en, this message translates to:
/// **'A reset is waiting'**
String get passwordResetsTitle;
/// No description provided for @passwordResetsAuthenticator.
///
/// In en, this message translates to:
/// **'Your authenticators will be removed on {date}: someone asked with your password. If that wasn\'t you, call it off and change your password.'**
String passwordResetsAuthenticator(String date);
/// No description provided for @passwordResetsAccount.
///
/// In en, this message translates to:
/// **'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.'**
String passwordResetsAccount(String date);
/// No description provided for @passwordResetsCallOff.
///
/// In en, this message translates to:
/// **'Call it off'**
String get passwordResetsCallOff;
/// No description provided for @passwordCallOffTitle.
///
/// In en, this message translates to:
/// **'Call off the reset'**
String get passwordCallOffTitle;
/// No description provided for @passwordCallOffIntro.
///
/// In en, this message translates to:
/// **'Your password and a code call off every reset waiting.'**
String get passwordCallOffIntro;
/// No description provided for @passwordSectionGitHubEndsDeletes.
///
/// In en, this message translates to:
/// **'Sign-in with GitHub ends on {date}. Set up a password before then: an account without one is deleted 30 days later, with everything in it.'**
String passwordSectionGitHubEndsDeletes(String date);
/// No description provided for @passwordSignedInBefore.
///
/// In en, this message translates to:
/// **'Only a device signed in since then can dismiss this warning: sign in again on this one, or change your password.'**
String get passwordSignedInBefore;
feat(app): signing in with SimpleLogin, its sheet and the start screen's offer (ADR 0020) Where the instance offers SimpleLogin, the start screen offers it first, saying that the instance keeps only the SimpleLogin ID, and opens a sheet that waits for SimpleLogin's page in the browser (Cancel ends the wait), then: for someone new, the choice between creating an account (the suggested handle or another, checked with the instance, the password twice, the recovery phrase shown once and three of its words typed back, nothing reaching the instance before) and linking theirs again with its handle and recovery phrase; for an account, its password opening its keys; for an account of before, the keys made with the handle it lacks. SimpleLoginCubit holds the steps, each refusal shown where it is mended (a handle's on the handle, a sign-in to begin again on the browser's), and closing the sheet stops waiting on the loopback. The suggested handle is never checked: the instance suggests none that anybody has, and every answer about a handle counts against its limit (D5). The fake's handle rule is now the module's. Learn and Todo build it with SimpleLogin's browser (halkyon_oidc_flutter, now a direct dependency of both, with their names on the loopback's page), their schemes and their loopback ports (43823, 43824), as the instance's forwarding page has them. Their tests offer no SimpleLogin; halkyon_app's test the sheet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-24 01:21:29 +02:00
/// No description provided for @simpleLoginContinue.
///
/// In en, this message translates to:
/// **'Continue with SimpleLogin'**
String get simpleLoginContinue;
/// No description provided for @simpleLoginNote.
///
/// In en, this message translates to:
/// **'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.'**
String simpleLoginNote(String instance);
/// No description provided for @simpleLoginTitle.
///
/// In en, this message translates to:
/// **'Sign in with SimpleLogin'**
String get simpleLoginTitle;
/// No description provided for @simpleLoginAddTitle.
///
/// In en, this message translates to:
/// **'Add SimpleLogin'**
String get simpleLoginAddTitle;
/// No description provided for @simpleLoginInBrowser.
///
/// In en, this message translates to:
/// **'Continue in your browser.'**
String get simpleLoginInBrowser;
/// No description provided for @simpleLoginNewcomerTitle.
///
/// In en, this message translates to:
/// **'New here?'**
String get simpleLoginNewcomerTitle;
/// No description provided for @simpleLoginNewcomerIntro.
///
/// In en, this message translates to:
/// **'Your SimpleLogin account has no account on {instance} yet.'**
String simpleLoginNewcomerIntro(String instance);
/// No description provided for @simpleLoginCreateHint.
///
/// In en, this message translates to:
/// **'Choose a handle and a password; you get a recovery phrase.'**
String get simpleLoginCreateHint;
/// No description provided for @simpleLoginHaveOne.
///
/// In en, this message translates to:
/// **'I already have one'**
String get simpleLoginHaveOne;
/// No description provided for @simpleLoginHaveOneHint.
///
/// In en, this message translates to:
/// **'Link it again with your handle and your recovery phrase.'**
String get simpleLoginHaveOneHint;
/// No description provided for @simpleLoginHandleIntro.
///
/// In en, this message translates to:
/// **'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.'**
String get simpleLoginHandleIntro;
/// No description provided for @simpleLoginHandle.
///
/// In en, this message translates to:
/// **'Handle'**
String get simpleLoginHandle;
/// No description provided for @simpleLoginHandleFree.
///
/// In en, this message translates to:
/// **'@{handle} is free'**
String simpleLoginHandleFree(String handle);
/// No description provided for @simpleLoginPasswordIntro.
///
/// In en, this message translates to:
/// **'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.'**
String get simpleLoginPasswordIntro;
/// No description provided for @simpleLoginCreate.
///
/// In en, this message translates to:
/// **'Create the account'**
String get simpleLoginCreate;
/// No description provided for @simpleLoginUnlockTitle.
///
/// In en, this message translates to:
/// **'Your password'**
String get simpleLoginUnlockTitle;
/// No description provided for @simpleLoginUnlockIntroAs.
///
/// In en, this message translates to:
/// **'Signed in with SimpleLogin as @{handle}. Your password opens your keys on this device.'**
String simpleLoginUnlockIntroAs(String handle);
/// No description provided for @simpleLoginUnlockIntro.
///
/// In en, this message translates to:
/// **'Signed in with SimpleLogin. Your password opens your keys on this device.'**
String get simpleLoginUnlockIntro;
/// No description provided for @simpleLoginOpen.
///
/// In en, this message translates to:
/// **'Open'**
String get simpleLoginOpen;
/// No description provided for @simpleLoginMendTitle.
///
/// In en, this message translates to:
/// **'Link your account'**
String get simpleLoginMendTitle;
/// No description provided for @simpleLoginMendIntro.
///
/// In en, this message translates to:
/// **'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.'**
String get simpleLoginMendIntro;
/// No description provided for @simpleLoginMend.
///
/// In en, this message translates to:
/// **'Link'**
String get simpleLoginMend;
/// No description provided for @simpleLoginWrongPassword.
///
/// In en, this message translates to:
/// **'The password isn\'t right.'**
String get simpleLoginWrongPassword;
/// No description provided for @simpleLoginMendDoesNotFit.
///
/// In en, this message translates to:
/// **'The handle or the recovery phrase isn\'t right.'**
String get simpleLoginMendDoesNotFit;
/// No description provided for @simpleLoginUnavailable.
///
/// In en, this message translates to:
/// **'This instance doesn\'t offer sign-in with SimpleLogin.'**
String get simpleLoginUnavailable;
/// No description provided for @simpleLoginDenied.
///
/// In en, this message translates to:
/// **'SimpleLogin\'s sign-in was declined, so nothing was shared.'**
String get simpleLoginDenied;
/// No description provided for @simpleLoginNoBrowser.
///
/// In en, this message translates to:
/// **'There\'s no browser to open SimpleLogin\'s page in.'**
String get simpleLoginNoBrowser;
/// No description provided for @simpleLoginStartAgain.
///
/// In en, this message translates to:
/// **'The sign-in took too long, or another one took its place. Begin it again.'**
String get simpleLoginStartAgain;
/// No description provided for @simpleLoginRejected.
///
/// In en, this message translates to:
/// **'SimpleLogin didn\'t confirm the sign-in. Begin it again.'**
String get simpleLoginRejected;
/// No description provided for @simpleLoginProviderUnavailable.
///
/// In en, this message translates to:
/// **'The instance can\'t reach SimpleLogin right now. Try again later.'**
String get simpleLoginProviderUnavailable;
/// No description provided for @simpleLoginTakenByAnotherPerson.
///
/// In en, this message translates to:
/// **'This SimpleLogin account belongs to another account here.'**
String get simpleLoginTakenByAnotherPerson;
/// No description provided for @simpleLoginOtherIdentityLinked.
///
/// In en, this message translates to:
/// **'Your account has another SimpleLogin account already.'**
String get simpleLoginOtherIdentityLinked;
/// No description provided for @simpleLoginTooManyAttempts.
///
/// In en, this message translates to:
/// **'Too many sign-ins began from this network. Try again in an hour.'**
String get simpleLoginTooManyAttempts;
/// No description provided for @simpleLoginHandleInvalid.
///
/// In en, this message translates to:
/// **'A handle is 1 to 30 letters (a to z), digits or underscores.'**
String get simpleLoginHandleInvalid;
/// No description provided for @simpleLoginHandleReserved.
///
/// In en, this message translates to:
/// **'This handle is kept for the instance.'**
String get simpleLoginHandleReserved;
/// No description provided for @simpleLoginHandleTaken.
///
/// In en, this message translates to:
/// **'Someone else has this handle.'**
String get simpleLoginHandleTaken;
/// No description provided for @simpleLoginTooManyHandleChecks.
///
/// In en, this message translates to:
/// **'Too many handles were tried. Try again in an hour.'**
String get simpleLoginTooManyHandleChecks;
/// No description provided for @simpleLoginSectionTitle.
///
/// In en, this message translates to:
/// **'SimpleLogin'**
String get simpleLoginSectionTitle;
/// No description provided for @simpleLoginSignsYouIn.
///
/// In en, this message translates to:
/// **'Signs you in'**
String get simpleLoginSignsYouIn;
/// No description provided for @simpleLoginAddHint.
///
/// In en, this message translates to:
/// **'Sign in with SimpleLogin, or with your Proton account.'**
String get simpleLoginAddHint;
/// No description provided for @simpleLoginAdded.
///
/// In en, this message translates to:
/// **'SimpleLogin added.'**
String get simpleLoginAdded;
}
class _HalkyonAppLocalizationsDelegate
extends LocalizationsDelegate<HalkyonAppLocalizations> {
const _HalkyonAppLocalizationsDelegate();
@override
Future<HalkyonAppLocalizations> load(Locale locale) {
return SynchronousFuture<HalkyonAppLocalizations>(
lookupHalkyonAppLocalizations(locale),
);
}
@override
bool isSupported(Locale locale) =>
<String>['de', 'en'].contains(locale.languageCode);
@override
bool shouldReload(_HalkyonAppLocalizationsDelegate old) => false;
}
HalkyonAppLocalizations lookupHalkyonAppLocalizations(Locale locale) {
// Lookup logic when language+country codes are specified.
switch (locale.languageCode) {
case 'en':
{
switch (locale.countryCode) {
case 'GB':
return HalkyonAppLocalizationsEnGb();
case 'US':
return HalkyonAppLocalizationsEnUs();
}
break;
}
}
// Lookup logic when only language code is specified.
switch (locale.languageCode) {
case 'de':
return HalkyonAppLocalizationsDe();
case 'en':
return HalkyonAppLocalizationsEn();
}
throw FlutterError(
'HalkyonAppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
'an issue with the localizations generation tool. Please file an issue '
'on GitHub with a reproducible sample app and the gen-l10n configuration '
'that was used.',
);
}