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 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 ' ;
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 = > ' 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 ' ;
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 ' Signed in on $ instance ' ;
}
@ override
String accountAnonymousOn ( String instance ) {
return ' Anonymous on $ instance ' ;
}
@ override
String get accountSwitch = > ' Switch account ' ;
@ override
String get accountSignOut = > ' Sign out ' ;
@ override
String get accountSignOutTitle = > ' Sign out? ' ;
@ override
String get accountDelete = > ' Delete account ' ;
@ override
String get accountDeleteTitle = > ' Delete your account? ' ;
@ override
String get aboutSourceCode = > ' The source of what this instance runs: ' ;
@ override
String get aboutSourceUnreachable = >
' Couldn \' t reach this instance to ask where its source is. ' ;
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 = > ' 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 = >
2026-10-19 21:32:14 +02:00
' No account here signs in with this GitHub account yet. ' ;
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 = > ' 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. ' ;
2026-10-20 13:32:21 +02:00
@ override
String get emailSignInUsePassword = >
' This account signs in with its password and an authenticator app. ' ;
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 = > ' 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 ' ) ;
}