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 ' ;
refactor(halkyon_app): the account section, About, the language and countries' names, shared
What Learn and Todo each held now comes from halkyon_app:
- AccountTiles: whose account on which instance, switching, signing
out (asking first for an anonymous account, as it deletes it) and
deleting it (asking first), the app's own words passed in.
- showAppAbout: the app's name, version, icon and legalese as it gives
them, the source of what the instance runs (AppDependencies gains
sourceCodeUrl), the app's own parts, the licence list.
- resolveAppLocale: the first preferred language the app speaks, never
by country alone, British English otherwise.
- AssetCountryNames, the default of InstanceGate and InstanceScope:
Unicode CLDR 48.2's territory names in English and German
(tool/country_names.py, 7.6 KB), Hong Kong, Macao, Myanmar and
Palestine by their short names as Learn's world map has them, so
Todo says "Germany (EU)" where it said "DE (EU)".
Learn's texts read as before in every language; its About bloc and
gateway, its country names from the world map and the keys only the
moved code used are gone, as are Todo's copies.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-19 23:51:52 +02:00
@ override
String accountSignedInOn ( String instance ) {
return ' Angemeldet auf $ instance ' ;
}
@ override
String accountAnonymousOn ( String instance ) {
return ' Anonym auf $ instance ' ;
}
@ override
String get accountSwitch = > ' Konto wechseln ' ;
@ override
String get accountSignOut = > ' Abmelden ' ;
@ override
String get accountSignOutTitle = > ' Abmelden? ' ;
@ override
String get accountDelete = > ' Konto löschen ' ;
@ override
String get accountDeleteTitle = > ' Dein Konto löschen? ' ;
@ override
String get aboutSourceCode = >
' Der Quellcode dessen, was diese Instanz ausführt: ' ;
@ override
String get aboutSourceUnreachable = >
' Diese Instanz war nicht erreichbar, um nach ihrem Quellcode zu fragen. ' ;
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 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. ' ;
2026-10-20 13:32:21 +02:00
@ override
String get emailSignInUsePassword = >
' Dieses Konto meldet sich mit seinem Passwort und einer Authenticator-App 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 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 ' ;
}