halkyon_app: instances, sign-in and sync plumbing for Halkyon's apps
What every Halkyon app's shell needs, taken from Halkyon Learn's and set on halkyon_base's client: the instances a device keeps an account on, the first start's tiles and where an instance keeps people's data, the account switcher; signing in anonymously, with GitHub or an email code, switching person and the start screen; the gates that build an app's dependencies per instance and per person; and the sync service with its status, Settings card and banner. Texts of its own in English and German take the app's name; what only the app can say, it passes in. Fakes for apps' tests are in testing.dart. An instance's basics now name the app it serves (`app`, set by the host's configuration), and an app accepts only an instance of its own. SerialQueue and CoalescingRunner move into halkyon_core. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
af1de799f4
commit
e23cc77f7c
7 changed files with 10761 additions and 10 deletions
78
packages/halkyon_app/lib/l10n/halkyon_app_de.arb
Normal file
78
packages/halkyon_app/lib/l10n/halkyon_app_de.arb
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
{
|
||||
"@@locale": "de",
|
||||
"tryAgain": "Erneut versuchen",
|
||||
"instanceWelcome": "Willkommen bei {app}",
|
||||
"instanceBuiltInTagline": "In der App voreingestellt",
|
||||
"instanceAnother": "Andere Instanz",
|
||||
"instanceAnotherTagline": "Gib ihre Adresse ein",
|
||||
"instanceAddress": "Adresse der Instanz",
|
||||
"instanceAddressInvalid": "Das ist keine Adresse.",
|
||||
"instanceAddressRequired": "Gib die Adresse einer Instanz ein.",
|
||||
"instanceContinue": "Weiter",
|
||||
"instanceUnreachable": "Unter {name} antwortet keine Instanz von {app}.",
|
||||
"instanceUseBuiltIn": "{name} verwenden",
|
||||
"instanceOpenFailed": "Die App auf {name} konnte nicht geöffnet werden.",
|
||||
"instanceDataAndBackupsIn": "Daten und Sicherungen: {place}",
|
||||
"instanceDataIn": "Daten: {place}",
|
||||
"instanceBackupsIn": "Sicherungen: {place}",
|
||||
"instanceNoBackups": "Keine Sicherungen",
|
||||
"instanceEuropeanUnion": "Europäische Union",
|
||||
"accountsTitle": "Konten",
|
||||
"accountAdd": "Konto hinzufügen",
|
||||
"accountAddSubtitle": "Wähle die Instanz für das Konto, das du hinzufügst.",
|
||||
"accountSignedIn": "Angemeldet",
|
||||
"accountAnonymous": "Anonym",
|
||||
"accountRemoveTooltip": "Konto entfernen",
|
||||
"accountRemoveTitle": "Konto entfernen?",
|
||||
"accountRemoveMessage": "Entfernt das Konto auf {name} von diesem Gerät, mit allem, was das Gerät davon hat. Was es synchronisiert hat, bleibt auf {name}: Melde dich dort wieder an, um es wiederzuhaben. In ein anonymes Konto kann man sich nicht wieder anmelden.",
|
||||
"accountRemoveConfirm": "Entfernen",
|
||||
"sessionUnreachable": "Der Server war nicht erreichbar.",
|
||||
"personDataFailed": "Die Daten dieses Geräts konnten nicht geöffnet werden.",
|
||||
"startSignedOut": "Abgemeldet",
|
||||
"startOn": "Starte auf {instance}:",
|
||||
"startWithGitHub": "Mit GitHub anmelden",
|
||||
"startWithEmail": "Mit E-Mail fortfahren",
|
||||
"startWithoutAccount": "Ohne Konto starten",
|
||||
"startAnonymous": "Dein Fortschritt wird auf diesem Gerät gespeichert. Melde dich an, um ihn zu behalten.",
|
||||
"startGitHubFailed": "Anmeldung mit GitHub fehlgeschlagen.",
|
||||
"startNoGitHubAccount": "Noch kein Konto hier meldet sich mit diesem GitHub-Konto an. Starte ohne Konto und füge GitHub dann im Profil hinzu.",
|
||||
"startOtherInstance": "Andere Instanz verwenden",
|
||||
"emailSignInTitle": "Mit E-Mail fortfahren",
|
||||
"emailSignInIntro": "Wir schicken dir einen Code zum Anmelden. Diese Instanz behält nur einen Fingerabdruck deiner Adresse, nie die Adresse selbst, und schreibt ihr nur, wenn du einen Code anforderst.",
|
||||
"emailSignInAddress": "E-Mail-Adresse",
|
||||
"emailSignInSend": "Code senden",
|
||||
"emailSignInCodeSent": "Wir haben einen Code an {address} geschickt. Er gilt 15 Minuten.",
|
||||
"emailSignInResent": "Ein neuer Code ist unterwegs.",
|
||||
"emailSignInCode": "Code",
|
||||
"emailSignInContinue": "Weiter",
|
||||
"emailSignInResend": "Neuen Code senden",
|
||||
"emailSignInOtherAddress": "Andere Adresse verwenden",
|
||||
"emailSignInSwitchTitle": "Zum Konto von {address} wechseln?",
|
||||
"emailSignInSwitchConfirm": "Wechseln",
|
||||
"emailSignInSwitchStay": "Anonym bleiben",
|
||||
"emailSignInTaken": "Mit {address} meldet sich schon ein anderes Konto an. Um zu ihm zu wechseln, melde dich zuerst ab.",
|
||||
"emailSignInUnavailable": "Diese Instanz bietet keine Anmeldung mit E-Mail an.",
|
||||
"emailSignInNotAnAddress": "Das ist keine E-Mail-Adresse.",
|
||||
"emailSignInTooManyCodes": "Zu viele Codes in der letzten Stunde. Versuche es später noch einmal.",
|
||||
"emailSignInWrongCode": "Dieser Code stimmt nicht.",
|
||||
"emailSignInTooManyTries": "Zu viele falsche Codes. Fordere einen neuen an.",
|
||||
"emailSignInCodeExpired": "Dieser Code gilt nicht mehr. Fordere einen neuen an.",
|
||||
"emailSignInOtherAddressLinked": "Du meldest dich schon mit einer anderen Adresse an.",
|
||||
"emailSignInMailFailed": "Die Instanz konnte die Mail nicht senden. Versuche es später noch einmal.",
|
||||
"emailSignInFailed": "Die Instanz war nicht erreichbar. Versuche es noch einmal.",
|
||||
"syncTitle": "Synchronisierung",
|
||||
"syncNow": "Jetzt synchronisieren",
|
||||
"syncStateSyncing": "Wird synchronisiert…",
|
||||
"syncStateSynced": "Alles synchronisiert",
|
||||
"syncStateFailing": "Synchronisierung schlägt fehl",
|
||||
"syncStateNotYet": "Noch nicht synchronisiert",
|
||||
"syncStateMismatch": "Diese App kann nicht mit {server} synchronisieren",
|
||||
"syncMismatchDetail": "Aktualisiere die App. Ist sie schon aktuell, muss der Server aktualisiert werden. Was du bis dahin tust, bleibt auf diesem Gerät und wird danach synchronisiert.",
|
||||
"syncLastCompleted": "Zuletzt abgeschlossen um {time}",
|
||||
"syncLastFailed": "Letzter Versuch fehlgeschlagen um {time}",
|
||||
"syncNoRunYet": "Seit dem Start der App wurde noch keine Synchronisierung abgeschlossen",
|
||||
"syncPending": "{count, plural, =1{1 Änderung wartet auf die Synchronisierung} other{{count} Änderungen warten auf die Synchronisierung}}",
|
||||
"syncTroubleLabel": "Synchronisierung benötigt Aufmerksamkeit",
|
||||
"syncMismatchBanner": "Diese App kann nicht mehr mit {server} synchronisieren. Aktualisiere sie, um weiter zu synchronisieren.",
|
||||
"syncMismatchMore": "Mehr"
|
||||
}
|
||||
201
packages/halkyon_app/lib/l10n/halkyon_app_en.arb
Normal file
201
packages/halkyon_app/lib/l10n/halkyon_app_en.arb
Normal file
|
|
@ -0,0 +1,201 @@
|
|||
{
|
||||
"@@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.",
|
||||
"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",
|
||||
"accountsTitle": "Accounts",
|
||||
"accountAdd": "Add account",
|
||||
"accountAddSubtitle": "Choose the instance for the account to add.",
|
||||
"accountSignedIn": "Signed in",
|
||||
"accountAnonymous": "Anonymous",
|
||||
"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. An anonymous account can't be signed into again.",
|
||||
"@accountRemoveMessage": {
|
||||
"placeholders": {
|
||||
"name": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"accountRemoveConfirm": "Remove",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
},
|
||||
"startWithGitHub": "Sign in with GitHub",
|
||||
"startWithEmail": "Continue with email",
|
||||
"startWithoutAccount": "Start without an account",
|
||||
"startAnonymous": "Progress is saved on this device. Sign in to keep it.",
|
||||
"startGitHubFailed": "Couldn't sign in with GitHub.",
|
||||
"startNoGitHubAccount": "No account here signs in with this GitHub account yet. Start without an account, then add GitHub in Profile.",
|
||||
"startOtherInstance": "Use another instance",
|
||||
"emailSignInTitle": "Continue with email",
|
||||
"emailSignInIntro": "We mail you a code to sign in. This instance keeps only a fingerprint of your address, never the address itself, and writes to it only when you ask for a code.",
|
||||
"emailSignInAddress": "Email address",
|
||||
"emailSignInSend": "Send code",
|
||||
"emailSignInCodeSent": "We mailed a code to {address}. It's valid for 15 minutes.",
|
||||
"@emailSignInCodeSent": {
|
||||
"placeholders": {
|
||||
"address": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"emailSignInResent": "A new code is on its way.",
|
||||
"emailSignInCode": "Code",
|
||||
"emailSignInContinue": "Continue",
|
||||
"emailSignInResend": "Send a new code",
|
||||
"emailSignInOtherAddress": "Use another address",
|
||||
"emailSignInSwitchTitle": "Switch to the account of {address}?",
|
||||
"@emailSignInSwitchTitle": {
|
||||
"placeholders": {
|
||||
"address": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"emailSignInSwitchConfirm": "Switch",
|
||||
"emailSignInSwitchStay": "Stay anonymous",
|
||||
"emailSignInTaken": "{address} already signs in to another account. To switch to it, sign out first.",
|
||||
"@emailSignInTaken": {
|
||||
"placeholders": {
|
||||
"address": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"emailSignInUnavailable": "This instance doesn't offer signing in with email.",
|
||||
"emailSignInNotAnAddress": "This isn't an email address.",
|
||||
"emailSignInTooManyCodes": "Too many codes in the last hour. Try again later.",
|
||||
"emailSignInWrongCode": "That code isn't right.",
|
||||
"emailSignInTooManyTries": "Too many wrong codes. Ask for a new one.",
|
||||
"emailSignInCodeExpired": "This code is no longer valid. Ask for a new one.",
|
||||
"emailSignInOtherAddressLinked": "You already sign in with another address.",
|
||||
"emailSignInMailFailed": "The instance couldn't send the mail. Try again later.",
|
||||
"emailSignInFailed": "Couldn't reach the instance. Try again.",
|
||||
"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"
|
||||
}
|
||||
3
packages/halkyon_app/lib/l10n/halkyon_app_en_GB.arb
Normal file
3
packages/halkyon_app/lib/l10n/halkyon_app_en_GB.arb
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"@@locale": "en_GB"
|
||||
}
|
||||
3
packages/halkyon_app/lib/l10n/halkyon_app_en_US.arb
Normal file
3
packages/halkyon_app/lib/l10n/halkyon_app_en_US.arb
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"@@locale": "en_US"
|
||||
}
|
||||
605
packages/halkyon_app/lib/l10n/halkyon_app_localizations.dart
Normal file
605
packages/halkyon_app/lib/l10n/halkyon_app_localizations.dart
Normal file
|
|
@ -0,0 +1,605 @@
|
|||
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 @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;
|
||||
|
||||
/// 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 @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 @startWithEmail.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Continue with email'**
|
||||
String get startWithEmail;
|
||||
|
||||
/// 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. Start without an account, then add GitHub in Profile.'**
|
||||
String get startNoGitHubAccount;
|
||||
|
||||
/// No description provided for @startOtherInstance.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Use another instance'**
|
||||
String get startOtherInstance;
|
||||
|
||||
/// No description provided for @emailSignInTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Continue with email'**
|
||||
String get emailSignInTitle;
|
||||
|
||||
/// No description provided for @emailSignInIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'We mail you a code to sign in. This instance keeps only a fingerprint of your address, never the address itself, and writes to it only when you ask for a code.'**
|
||||
String get emailSignInIntro;
|
||||
|
||||
/// No description provided for @emailSignInAddress.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Email address'**
|
||||
String get emailSignInAddress;
|
||||
|
||||
/// No description provided for @emailSignInSend.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Send code'**
|
||||
String get emailSignInSend;
|
||||
|
||||
/// No description provided for @emailSignInCodeSent.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'We mailed a code to {address}. It\'s valid for 15 minutes.'**
|
||||
String emailSignInCodeSent(String address);
|
||||
|
||||
/// No description provided for @emailSignInResent.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'A new code is on its way.'**
|
||||
String get emailSignInResent;
|
||||
|
||||
/// No description provided for @emailSignInCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Code'**
|
||||
String get emailSignInCode;
|
||||
|
||||
/// No description provided for @emailSignInContinue.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Continue'**
|
||||
String get emailSignInContinue;
|
||||
|
||||
/// No description provided for @emailSignInResend.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Send a new code'**
|
||||
String get emailSignInResend;
|
||||
|
||||
/// No description provided for @emailSignInOtherAddress.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Use another address'**
|
||||
String get emailSignInOtherAddress;
|
||||
|
||||
/// No description provided for @emailSignInSwitchTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Switch to the account of {address}?'**
|
||||
String emailSignInSwitchTitle(String address);
|
||||
|
||||
/// No description provided for @emailSignInSwitchConfirm.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Switch'**
|
||||
String get emailSignInSwitchConfirm;
|
||||
|
||||
/// No description provided for @emailSignInSwitchStay.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Stay anonymous'**
|
||||
String get emailSignInSwitchStay;
|
||||
|
||||
/// No description provided for @emailSignInTaken.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'{address} already signs in to another account. To switch to it, sign out first.'**
|
||||
String emailSignInTaken(String address);
|
||||
|
||||
/// No description provided for @emailSignInUnavailable.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This instance doesn\'t offer signing in with email.'**
|
||||
String get emailSignInUnavailable;
|
||||
|
||||
/// No description provided for @emailSignInNotAnAddress.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This isn\'t an email address.'**
|
||||
String get emailSignInNotAnAddress;
|
||||
|
||||
/// No description provided for @emailSignInTooManyCodes.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Too many codes in the last hour. Try again later.'**
|
||||
String get emailSignInTooManyCodes;
|
||||
|
||||
/// No description provided for @emailSignInWrongCode.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'That code isn\'t right.'**
|
||||
String get emailSignInWrongCode;
|
||||
|
||||
/// No description provided for @emailSignInTooManyTries.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Too many wrong codes. Ask for a new one.'**
|
||||
String get emailSignInTooManyTries;
|
||||
|
||||
/// No description provided for @emailSignInCodeExpired.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This code is no longer valid. Ask for a new one.'**
|
||||
String get emailSignInCodeExpired;
|
||||
|
||||
/// No description provided for @emailSignInOtherAddressLinked.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'You already sign in with another address.'**
|
||||
String get emailSignInOtherAddressLinked;
|
||||
|
||||
/// No description provided for @emailSignInMailFailed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The instance couldn\'t send the mail. Try again later.'**
|
||||
String get emailSignInMailFailed;
|
||||
|
||||
/// No description provided for @emailSignInFailed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Couldn\'t reach the instance. Try again.'**
|
||||
String get emailSignInFailed;
|
||||
|
||||
/// 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;
|
||||
}
|
||||
|
||||
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.',
|
||||
);
|
||||
}
|
||||
290
packages/halkyon_app/lib/l10n/halkyon_app_localizations_de.dart
Normal file
290
packages/halkyon_app/lib/l10n/halkyon_app_localizations_de.dart
Normal file
|
|
@ -0,0 +1,290 @@
|
|||
// ignore: unused_import
|
||||
import 'package:intl/intl.dart' as intl;
|
||||
|
||||
import 'halkyon_app_localizations.dart';
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
/// The translations for German (`de`).
|
||||
class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
|
||||
HalkyonAppLocalizationsDe([String locale = 'de']) : super(locale);
|
||||
|
||||
@override
|
||||
String get tryAgain => 'Erneut versuchen';
|
||||
|
||||
@override
|
||||
String instanceWelcome(String app) {
|
||||
return 'Willkommen bei $app';
|
||||
}
|
||||
|
||||
@override
|
||||
String get instanceBuiltInTagline => 'In der App voreingestellt';
|
||||
|
||||
@override
|
||||
String get instanceAnother => 'Andere Instanz';
|
||||
|
||||
@override
|
||||
String get instanceAnotherTagline => 'Gib ihre Adresse ein';
|
||||
|
||||
@override
|
||||
String get instanceAddress => 'Adresse der Instanz';
|
||||
|
||||
@override
|
||||
String get instanceAddressInvalid => 'Das ist keine Adresse.';
|
||||
|
||||
@override
|
||||
String get instanceAddressRequired => 'Gib die Adresse einer Instanz ein.';
|
||||
|
||||
@override
|
||||
String get instanceContinue => 'Weiter';
|
||||
|
||||
@override
|
||||
String instanceUnreachable(String app, String name) {
|
||||
return 'Unter $name antwortet keine Instanz von $app.';
|
||||
}
|
||||
|
||||
@override
|
||||
String instanceUseBuiltIn(String name) {
|
||||
return '$name verwenden';
|
||||
}
|
||||
|
||||
@override
|
||||
String instanceOpenFailed(String name) {
|
||||
return 'Die App auf $name konnte nicht geöffnet werden.';
|
||||
}
|
||||
|
||||
@override
|
||||
String instanceDataAndBackupsIn(String place) {
|
||||
return 'Daten und Sicherungen: $place';
|
||||
}
|
||||
|
||||
@override
|
||||
String instanceDataIn(String place) {
|
||||
return 'Daten: $place';
|
||||
}
|
||||
|
||||
@override
|
||||
String instanceBackupsIn(String place) {
|
||||
return 'Sicherungen: $place';
|
||||
}
|
||||
|
||||
@override
|
||||
String get instanceNoBackups => 'Keine Sicherungen';
|
||||
|
||||
@override
|
||||
String get instanceEuropeanUnion => 'Europäische Union';
|
||||
|
||||
@override
|
||||
String get accountsTitle => 'Konten';
|
||||
|
||||
@override
|
||||
String get accountAdd => 'Konto hinzufügen';
|
||||
|
||||
@override
|
||||
String get accountAddSubtitle =>
|
||||
'Wähle die Instanz für das Konto, das du hinzufügst.';
|
||||
|
||||
@override
|
||||
String get accountSignedIn => 'Angemeldet';
|
||||
|
||||
@override
|
||||
String get accountAnonymous => 'Anonym';
|
||||
|
||||
@override
|
||||
String get accountRemoveTooltip => 'Konto entfernen';
|
||||
|
||||
@override
|
||||
String get accountRemoveTitle => 'Konto entfernen?';
|
||||
|
||||
@override
|
||||
String accountRemoveMessage(String name) {
|
||||
return 'Entfernt das Konto auf $name von diesem Gerät, mit allem, was das Gerät davon hat. Was es synchronisiert hat, bleibt auf $name: Melde dich dort wieder an, um es wiederzuhaben. In ein anonymes Konto kann man sich nicht wieder anmelden.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get accountRemoveConfirm => 'Entfernen';
|
||||
|
||||
@override
|
||||
String get sessionUnreachable => 'Der Server war nicht erreichbar.';
|
||||
|
||||
@override
|
||||
String get personDataFailed =>
|
||||
'Die Daten dieses Geräts konnten nicht geöffnet werden.';
|
||||
|
||||
@override
|
||||
String get startSignedOut => 'Abgemeldet';
|
||||
|
||||
@override
|
||||
String startOn(String instance) {
|
||||
return 'Starte auf $instance:';
|
||||
}
|
||||
|
||||
@override
|
||||
String get startWithGitHub => 'Mit GitHub anmelden';
|
||||
|
||||
@override
|
||||
String get startWithEmail => 'Mit E-Mail fortfahren';
|
||||
|
||||
@override
|
||||
String get startWithoutAccount => 'Ohne Konto starten';
|
||||
|
||||
@override
|
||||
String get startAnonymous =>
|
||||
'Dein Fortschritt wird auf diesem Gerät gespeichert. Melde dich an, um ihn zu behalten.';
|
||||
|
||||
@override
|
||||
String get startGitHubFailed => 'Anmeldung mit GitHub fehlgeschlagen.';
|
||||
|
||||
@override
|
||||
String get startNoGitHubAccount =>
|
||||
'Noch kein Konto hier meldet sich mit diesem GitHub-Konto an. Starte ohne Konto und füge GitHub dann im Profil hinzu.';
|
||||
|
||||
@override
|
||||
String get startOtherInstance => 'Andere Instanz verwenden';
|
||||
|
||||
@override
|
||||
String get emailSignInTitle => 'Mit E-Mail fortfahren';
|
||||
|
||||
@override
|
||||
String get emailSignInIntro =>
|
||||
'Wir schicken dir einen Code zum Anmelden. Diese Instanz behält nur einen Fingerabdruck deiner Adresse, nie die Adresse selbst, und schreibt ihr nur, wenn du einen Code anforderst.';
|
||||
|
||||
@override
|
||||
String get emailSignInAddress => 'E-Mail-Adresse';
|
||||
|
||||
@override
|
||||
String get emailSignInSend => 'Code senden';
|
||||
|
||||
@override
|
||||
String emailSignInCodeSent(String address) {
|
||||
return 'Wir haben einen Code an $address geschickt. Er gilt 15 Minuten.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get emailSignInResent => 'Ein neuer Code ist unterwegs.';
|
||||
|
||||
@override
|
||||
String get emailSignInCode => 'Code';
|
||||
|
||||
@override
|
||||
String get emailSignInContinue => 'Weiter';
|
||||
|
||||
@override
|
||||
String get emailSignInResend => 'Neuen Code senden';
|
||||
|
||||
@override
|
||||
String get emailSignInOtherAddress => 'Andere Adresse verwenden';
|
||||
|
||||
@override
|
||||
String emailSignInSwitchTitle(String address) {
|
||||
return 'Zum Konto von $address wechseln?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get emailSignInSwitchConfirm => 'Wechseln';
|
||||
|
||||
@override
|
||||
String get emailSignInSwitchStay => 'Anonym bleiben';
|
||||
|
||||
@override
|
||||
String emailSignInTaken(String address) {
|
||||
return 'Mit $address meldet sich schon ein anderes Konto an. Um zu ihm zu wechseln, melde dich zuerst ab.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get emailSignInUnavailable =>
|
||||
'Diese Instanz bietet keine Anmeldung mit E-Mail an.';
|
||||
|
||||
@override
|
||||
String get emailSignInNotAnAddress => 'Das ist keine E-Mail-Adresse.';
|
||||
|
||||
@override
|
||||
String get emailSignInTooManyCodes =>
|
||||
'Zu viele Codes in der letzten Stunde. Versuche es später noch einmal.';
|
||||
|
||||
@override
|
||||
String get emailSignInWrongCode => 'Dieser Code stimmt nicht.';
|
||||
|
||||
@override
|
||||
String get emailSignInTooManyTries =>
|
||||
'Zu viele falsche Codes. Fordere einen neuen an.';
|
||||
|
||||
@override
|
||||
String get emailSignInCodeExpired =>
|
||||
'Dieser Code gilt nicht mehr. Fordere einen neuen an.';
|
||||
|
||||
@override
|
||||
String get emailSignInOtherAddressLinked =>
|
||||
'Du meldest dich schon mit einer anderen Adresse an.';
|
||||
|
||||
@override
|
||||
String get emailSignInMailFailed =>
|
||||
'Die Instanz konnte die Mail nicht senden. Versuche es später noch einmal.';
|
||||
|
||||
@override
|
||||
String get emailSignInFailed =>
|
||||
'Die Instanz war nicht erreichbar. Versuche es noch einmal.';
|
||||
|
||||
@override
|
||||
String get syncTitle => 'Synchronisierung';
|
||||
|
||||
@override
|
||||
String get syncNow => 'Jetzt synchronisieren';
|
||||
|
||||
@override
|
||||
String get syncStateSyncing => 'Wird synchronisiert…';
|
||||
|
||||
@override
|
||||
String get syncStateSynced => 'Alles synchronisiert';
|
||||
|
||||
@override
|
||||
String get syncStateFailing => 'Synchronisierung schlägt fehl';
|
||||
|
||||
@override
|
||||
String get syncStateNotYet => 'Noch nicht synchronisiert';
|
||||
|
||||
@override
|
||||
String syncStateMismatch(String server) {
|
||||
return 'Diese App kann nicht mit $server synchronisieren';
|
||||
}
|
||||
|
||||
@override
|
||||
String get syncMismatchDetail =>
|
||||
'Aktualisiere die App. Ist sie schon aktuell, muss der Server aktualisiert werden. Was du bis dahin tust, bleibt auf diesem Gerät und wird danach synchronisiert.';
|
||||
|
||||
@override
|
||||
String syncLastCompleted(String time) {
|
||||
return 'Zuletzt abgeschlossen um $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String syncLastFailed(String time) {
|
||||
return 'Letzter Versuch fehlgeschlagen um $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String get syncNoRunYet =>
|
||||
'Seit dem Start der App wurde noch keine Synchronisierung abgeschlossen';
|
||||
|
||||
@override
|
||||
String syncPending(int count) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other: '$count Änderungen warten auf die Synchronisierung',
|
||||
one: '1 Änderung wartet auf die Synchronisierung',
|
||||
);
|
||||
return '$_temp0';
|
||||
}
|
||||
|
||||
@override
|
||||
String get syncTroubleLabel => 'Synchronisierung benötigt Aufmerksamkeit';
|
||||
|
||||
@override
|
||||
String syncMismatchBanner(String server) {
|
||||
return 'Diese App kann nicht mehr mit $server synchronisieren. Aktualisiere sie, um weiter zu synchronisieren.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get syncMismatchMore => 'Mehr';
|
||||
}
|
||||
297
packages/halkyon_app/lib/l10n/halkyon_app_localizations_en.dart
Normal file
297
packages/halkyon_app/lib/l10n/halkyon_app_localizations_en.dart
Normal file
|
|
@ -0,0 +1,297 @@
|
|||
// ignore: unused_import
|
||||
import 'package:intl/intl.dart' as intl;
|
||||
|
||||
import 'halkyon_app_localizations.dart';
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
/// The translations for English (`en`).
|
||||
class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
|
||||
HalkyonAppLocalizationsEn([String locale = 'en']) : super(locale);
|
||||
|
||||
@override
|
||||
String get tryAgain => 'Try again';
|
||||
|
||||
@override
|
||||
String instanceWelcome(String app) {
|
||||
return 'Welcome to $app';
|
||||
}
|
||||
|
||||
@override
|
||||
String get instanceBuiltInTagline => 'Comes with the app';
|
||||
|
||||
@override
|
||||
String get instanceAnother => 'Another instance';
|
||||
|
||||
@override
|
||||
String get instanceAnotherTagline => 'Enter its address';
|
||||
|
||||
@override
|
||||
String get instanceAddress => 'Instance address';
|
||||
|
||||
@override
|
||||
String get instanceAddressInvalid => 'This isn\'t an address.';
|
||||
|
||||
@override
|
||||
String get instanceAddressRequired => 'Enter the address of an instance.';
|
||||
|
||||
@override
|
||||
String get instanceContinue => 'Continue';
|
||||
|
||||
@override
|
||||
String instanceUnreachable(String app, String name) {
|
||||
return 'No instance of $app answers at $name.';
|
||||
}
|
||||
|
||||
@override
|
||||
String instanceUseBuiltIn(String name) {
|
||||
return 'Use $name';
|
||||
}
|
||||
|
||||
@override
|
||||
String instanceOpenFailed(String name) {
|
||||
return 'Couldn\'t open the app on $name.';
|
||||
}
|
||||
|
||||
@override
|
||||
String instanceDataAndBackupsIn(String place) {
|
||||
return 'Data and backups: $place';
|
||||
}
|
||||
|
||||
@override
|
||||
String instanceDataIn(String place) {
|
||||
return 'Data: $place';
|
||||
}
|
||||
|
||||
@override
|
||||
String instanceBackupsIn(String place) {
|
||||
return 'Backups: $place';
|
||||
}
|
||||
|
||||
@override
|
||||
String get instanceNoBackups => 'No backups';
|
||||
|
||||
@override
|
||||
String get instanceEuropeanUnion => 'European Union';
|
||||
|
||||
@override
|
||||
String get accountsTitle => 'Accounts';
|
||||
|
||||
@override
|
||||
String get accountAdd => 'Add account';
|
||||
|
||||
@override
|
||||
String get accountAddSubtitle =>
|
||||
'Choose the instance for the account to add.';
|
||||
|
||||
@override
|
||||
String get accountSignedIn => 'Signed in';
|
||||
|
||||
@override
|
||||
String get accountAnonymous => 'Anonymous';
|
||||
|
||||
@override
|
||||
String get accountRemoveTooltip => 'Remove account';
|
||||
|
||||
@override
|
||||
String get accountRemoveTitle => 'Remove account?';
|
||||
|
||||
@override
|
||||
String accountRemoveMessage(String name) {
|
||||
return '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.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get accountRemoveConfirm => 'Remove';
|
||||
|
||||
@override
|
||||
String get sessionUnreachable => 'Couldn\'t reach the server.';
|
||||
|
||||
@override
|
||||
String get personDataFailed => 'Couldn\'t open this device\'s data.';
|
||||
|
||||
@override
|
||||
String get startSignedOut => 'Signed out';
|
||||
|
||||
@override
|
||||
String startOn(String instance) {
|
||||
return 'Start on $instance:';
|
||||
}
|
||||
|
||||
@override
|
||||
String get startWithGitHub => 'Sign in with GitHub';
|
||||
|
||||
@override
|
||||
String get startWithEmail => 'Continue with email';
|
||||
|
||||
@override
|
||||
String get startWithoutAccount => 'Start without an account';
|
||||
|
||||
@override
|
||||
String get startAnonymous =>
|
||||
'Progress is saved on this device. Sign in to keep it.';
|
||||
|
||||
@override
|
||||
String get startGitHubFailed => 'Couldn\'t sign in with GitHub.';
|
||||
|
||||
@override
|
||||
String get startNoGitHubAccount =>
|
||||
'No account here signs in with this GitHub account yet. Start without an account, then add GitHub in Profile.';
|
||||
|
||||
@override
|
||||
String get startOtherInstance => 'Use another instance';
|
||||
|
||||
@override
|
||||
String get emailSignInTitle => 'Continue with email';
|
||||
|
||||
@override
|
||||
String get emailSignInIntro =>
|
||||
'We mail you a code to sign in. This instance keeps only a fingerprint of your address, never the address itself, and writes to it only when you ask for a code.';
|
||||
|
||||
@override
|
||||
String get emailSignInAddress => 'Email address';
|
||||
|
||||
@override
|
||||
String get emailSignInSend => 'Send code';
|
||||
|
||||
@override
|
||||
String emailSignInCodeSent(String address) {
|
||||
return 'We mailed a code to $address. It\'s valid for 15 minutes.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get emailSignInResent => 'A new code is on its way.';
|
||||
|
||||
@override
|
||||
String get emailSignInCode => 'Code';
|
||||
|
||||
@override
|
||||
String get emailSignInContinue => 'Continue';
|
||||
|
||||
@override
|
||||
String get emailSignInResend => 'Send a new code';
|
||||
|
||||
@override
|
||||
String get emailSignInOtherAddress => 'Use another address';
|
||||
|
||||
@override
|
||||
String emailSignInSwitchTitle(String address) {
|
||||
return 'Switch to the account of $address?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get emailSignInSwitchConfirm => 'Switch';
|
||||
|
||||
@override
|
||||
String get emailSignInSwitchStay => 'Stay anonymous';
|
||||
|
||||
@override
|
||||
String emailSignInTaken(String address) {
|
||||
return '$address already signs in to another account. To switch to it, sign out first.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get emailSignInUnavailable =>
|
||||
'This instance doesn\'t offer signing in with email.';
|
||||
|
||||
@override
|
||||
String get emailSignInNotAnAddress => 'This isn\'t an email address.';
|
||||
|
||||
@override
|
||||
String get emailSignInTooManyCodes =>
|
||||
'Too many codes in the last hour. Try again later.';
|
||||
|
||||
@override
|
||||
String get emailSignInWrongCode => 'That code isn\'t right.';
|
||||
|
||||
@override
|
||||
String get emailSignInTooManyTries =>
|
||||
'Too many wrong codes. Ask for a new one.';
|
||||
|
||||
@override
|
||||
String get emailSignInCodeExpired =>
|
||||
'This code is no longer valid. Ask for a new one.';
|
||||
|
||||
@override
|
||||
String get emailSignInOtherAddressLinked =>
|
||||
'You already sign in with another address.';
|
||||
|
||||
@override
|
||||
String get emailSignInMailFailed =>
|
||||
'The instance couldn\'t send the mail. Try again later.';
|
||||
|
||||
@override
|
||||
String get emailSignInFailed => 'Couldn\'t reach the instance. Try again.';
|
||||
|
||||
@override
|
||||
String get syncTitle => 'Sync';
|
||||
|
||||
@override
|
||||
String get syncNow => 'Sync now';
|
||||
|
||||
@override
|
||||
String get syncStateSyncing => 'Syncing…';
|
||||
|
||||
@override
|
||||
String get syncStateSynced => 'Everything synced';
|
||||
|
||||
@override
|
||||
String get syncStateFailing => 'Sync is failing';
|
||||
|
||||
@override
|
||||
String get syncStateNotYet => 'Not synced yet';
|
||||
|
||||
@override
|
||||
String syncStateMismatch(String server) {
|
||||
return 'This app can\'t sync with $server';
|
||||
}
|
||||
|
||||
@override
|
||||
String get 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.';
|
||||
|
||||
@override
|
||||
String syncLastCompleted(String time) {
|
||||
return 'Last completed at $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String syncLastFailed(String time) {
|
||||
return 'Last attempt failed at $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String get syncNoRunYet => 'No sync has completed since the app started';
|
||||
|
||||
@override
|
||||
String syncPending(int count) {
|
||||
String _temp0 = intl.Intl.pluralLogic(
|
||||
count,
|
||||
locale: localeName,
|
||||
other: '$count changes wait to sync',
|
||||
one: '1 change waits to sync',
|
||||
);
|
||||
return '$_temp0';
|
||||
}
|
||||
|
||||
@override
|
||||
String get syncTroubleLabel => 'Sync needs attention';
|
||||
|
||||
@override
|
||||
String syncMismatchBanner(String server) {
|
||||
return 'This app can\'t sync with $server any more. Update it to keep syncing.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get syncMismatchMore => 'More';
|
||||
}
|
||||
|
||||
/// The translations for English, as used in the United Kingdom (`en_GB`).
|
||||
class HalkyonAppLocalizationsEnGb extends HalkyonAppLocalizationsEn {
|
||||
HalkyonAppLocalizationsEnGb() : super('en_GB');
|
||||
}
|
||||
|
||||
/// The translations for English, as used in the United States (`en_US`).
|
||||
class HalkyonAppLocalizationsEnUs extends HalkyonAppLocalizationsEn {
|
||||
HalkyonAppLocalizationsEnUs() : super('en_US');
|
||||
}
|
||||
Loading…
Reference in a new issue