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>
2026-10-19 15:18:49 +02:00
// 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 ' ;
halkyon_app: data locations as precise as a country or a state
An operator's DATA_LOCATION and BACKUP_LOCATION may name a subdivision
(ISO 3166-2, US-CA, DE-BY) besides the EU or a country. The app adds
"(EU)" to a member country and the country to a subdivision ("Germany
(EU)", "California, United States", "Bavaria, Germany (EU)"), in
English and German, and shows the most specific flag there is: a
subdivision's own where the flag package has one, else its country's.
Subdivision names come from Unicode CLDR 48.2 (tool/subdivision_names.py),
bundled with their licence, which the app registers.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-19 18:47:25 +02:00
@ override
String instanceCountryInEu ( String country ) {
return ' $ country (EU) ' ;
}
@ override
String instanceSubdivisionOf ( String subdivision , String country ) {
return ' $ subdivision , $ country ' ;
}
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>
2026-10-19 15:18:49 +02:00
@ 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 = >
2026-10-19 21:32:14 +02:00
' Noch kein Konto hier meldet sich mit diesem GitHub-Konto an. ' ;
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>
2026-10-19 15:18:49 +02:00
@ 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 ' ;
}