feat(app): appearance, language and version in Settings, and Settings from Home

Settings gets a card for how this device shows the app: its appearance
(as the device, light or dark) and its language (the device's, or one
the app speaks, each named in its own language), side by side from
medium windows on, as two outlined dropdowns. Both stay on the device
rather than following the person: they are kept in
<app support>/device_settings.json (written to a temporary file and
renamed into place), read before the app shows, so its first frame
already looks as chosen, and a file that can't be read falls back to
what the device does. DeviceSettingsBloc sits above SessionGate's keyed
subtree, since the settings outlive every person, and both the plain
app and the person's app take their theme mode and locale from it.

At the bottom of Settings, the release and its build, read once at
start together with the build the server is asked about.

Home has a Settings cog beside the streak, with the sync trouble dot as
on Profile. The library's create button reads "Create studyset", and
Delete is red in every menu that offers it: the studyset's card, screen
and rail, and the composer's draft.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-07 01:43:28 +02:00
commit 55a0a7fdf0
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -31,7 +31,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get libraryTitle => 'Library';
@override
String get libraryNewStudyset => 'New studyset';
String get libraryCreateStudyset => 'Create studyset';
@override
String get libraryEmpty => 'No studysets yet';
@ -860,6 +860,29 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get settingsAbout => 'About Halkyon Learn';
@override
String get settingsAppearance => 'Appearance';
@override
String get settingsAppearanceDevice => 'Device theme';
@override
String get settingsAppearanceLight => 'Light';
@override
String get settingsAppearanceDark => 'Dark';
@override
String get settingsLanguage => 'Language';
@override
String get settingsLanguageDevice => 'Device language';
@override
String settingsVersion(String version, String build) {
return 'Version $version (build $build)';
}
@override
String get syncTitle => 'Sync';