fix(studio): doctor i18n + light-mode AppBar contrast (v0.33.1)

Two reports:

1. "In Diagnose ist viel nicht übersetzt, wie pending, chain
   etc." The Doctor summary strip (Modules / Approvals / Audit
   / Services tiles) and the modules panel still rendered
   English wire labels: "pending", "chain", "declared",
   "loaded", "empty", "attention", "No pending approvals",
   "No host services declared", and the matching "{n} modules
   · {m} capabilities" / "{n} approvals awaiting review"
   strings.

   Fix: 13 new ARB keys covering the summary tiles, modules
   panel, and services panel; doctor.dart now reads them via
   AppLocalizations. German operators no longer see English
   labels on Diagnose.

2. "Im Light mode ist der kontrast zur überschrift falsch,
   store ist weiß auf weiß." The AppBar title rendered
   white-on-white in light mode.

   Cause: `appBarTheme.titleTextStyle = textTheme.headlineSmall`
   passed a TextStyle built fresh from GoogleFonts.inter(...)
   with `color: null`. Material's "merge foregroundColor at
   draw time" path didn't always populate it — depended on
   build configuration. The colour fell through to whatever
   the surrounding DefaultTextStyle had, which on the
   light-mode AppBar was the surface colour.

   Fix: bake the foreground colour straight into the title
   style via `copyWith(color: scheme.onSurface)`. Also pin
   `iconTheme: IconThemeData(color: scheme.onSurface)` so
   actions-row icons get the same treatment defensively.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-05-08 13:43:17 +02:00
parent de22791e86
commit 22a851b7e2
9 changed files with 319 additions and 19 deletions

View file

@ -392,6 +392,36 @@
"@approvalsExpiresInHours": { "placeholders": { "hours": { "type": "int" } } },
"doctorTitle": "Diagnose",
"doctorSummaryModules": "Module",
"doctorSummaryApprovals": "Freigaben",
"doctorSummaryAudit": "Protokoll",
"doctorSummaryServices": "Dienste",
"doctorSummaryCapabilities": "{n} Capabilities",
"@doctorSummaryCapabilities": { "placeholders": { "n": { "type": "int" } } },
"doctorSummaryPending": "offen",
"doctorSummaryChain": "{verified}/{total} Chain",
"@doctorSummaryChain": {
"placeholders": {
"verified": { "type": "int" },
"total": { "type": "int" }
}
},
"doctorSummaryDeclared": "deklariert",
"doctorModulesPanelSummary": "{n} Module · {m} Capabilities",
"@doctorModulesPanelSummary": {
"placeholders": {
"n": { "type": "int" },
"m": { "type": "int" }
}
},
"doctorApprovalsNone": "Keine offenen Freigaben",
"doctorApprovalsCount": "{n, plural, =1{1 Freigabe wartet auf Prüfung} other{{n} Freigaben warten auf Prüfung}}",
"@doctorApprovalsCount": { "placeholders": { "n": { "type": "int" } } },
"doctorApprovalsAttentionPill": "wichtig",
"doctorServicesEmpty": "Keine Host-Dienste deklariert",
"doctorServicesEmptyHint": "in ~/.fai/config.yaml unter services: hinzufügen",
"doctorPillLoaded": "geladen",
"doctorPillEmpty": "leer",
"doctorRecheckTooltip": "Erneut prüfen",
"doctorEventLogSection": "Audit-Log",
"doctorModulesApprovalsSection": "Module & Freigaben",

View file

@ -393,6 +393,36 @@
"@approvalsExpiresInHours": { "placeholders": { "hours": { "type": "int" } } },
"doctorTitle": "Doctor",
"doctorSummaryModules": "Modules",
"doctorSummaryApprovals": "Approvals",
"doctorSummaryAudit": "Audit",
"doctorSummaryServices": "Services",
"doctorSummaryCapabilities": "{n} capabilities",
"@doctorSummaryCapabilities": { "placeholders": { "n": { "type": "int" } } },
"doctorSummaryPending": "pending",
"doctorSummaryChain": "{verified}/{total} chain",
"@doctorSummaryChain": {
"placeholders": {
"verified": { "type": "int" },
"total": { "type": "int" }
}
},
"doctorSummaryDeclared": "declared",
"doctorModulesPanelSummary": "{n} modules · {m} capabilities",
"@doctorModulesPanelSummary": {
"placeholders": {
"n": { "type": "int" },
"m": { "type": "int" }
}
},
"doctorApprovalsNone": "No pending approvals",
"doctorApprovalsCount": "{n, plural, =1{1 approval awaiting review} other{{n} approvals awaiting review}}",
"@doctorApprovalsCount": { "placeholders": { "n": { "type": "int" } } },
"doctorApprovalsAttentionPill": "attention",
"doctorServicesEmpty": "No host services declared",
"doctorServicesEmptyHint": "add to ~/.fai/config.yaml under services:",
"doctorPillLoaded": "loaded",
"doctorPillEmpty": "empty",
"doctorRecheckTooltip": "Re-check",
"doctorEventLogSection": "Event log",
"doctorModulesApprovalsSection": "Modules & approvals",

View file

@ -1730,6 +1730,102 @@ abstract class AppLocalizations {
/// **'Doctor'**
String get doctorTitle;
/// No description provided for @doctorSummaryModules.
///
/// In en, this message translates to:
/// **'Modules'**
String get doctorSummaryModules;
/// No description provided for @doctorSummaryApprovals.
///
/// In en, this message translates to:
/// **'Approvals'**
String get doctorSummaryApprovals;
/// No description provided for @doctorSummaryAudit.
///
/// In en, this message translates to:
/// **'Audit'**
String get doctorSummaryAudit;
/// No description provided for @doctorSummaryServices.
///
/// In en, this message translates to:
/// **'Services'**
String get doctorSummaryServices;
/// No description provided for @doctorSummaryCapabilities.
///
/// In en, this message translates to:
/// **'{n} capabilities'**
String doctorSummaryCapabilities(int n);
/// No description provided for @doctorSummaryPending.
///
/// In en, this message translates to:
/// **'pending'**
String get doctorSummaryPending;
/// No description provided for @doctorSummaryChain.
///
/// In en, this message translates to:
/// **'{verified}/{total} chain'**
String doctorSummaryChain(int verified, int total);
/// No description provided for @doctorSummaryDeclared.
///
/// In en, this message translates to:
/// **'declared'**
String get doctorSummaryDeclared;
/// No description provided for @doctorModulesPanelSummary.
///
/// In en, this message translates to:
/// **'{n} modules · {m} capabilities'**
String doctorModulesPanelSummary(int n, int m);
/// No description provided for @doctorApprovalsNone.
///
/// In en, this message translates to:
/// **'No pending approvals'**
String get doctorApprovalsNone;
/// No description provided for @doctorApprovalsCount.
///
/// In en, this message translates to:
/// **'{n, plural, =1{1 approval awaiting review} other{{n} approvals awaiting review}}'**
String doctorApprovalsCount(int n);
/// No description provided for @doctorApprovalsAttentionPill.
///
/// In en, this message translates to:
/// **'attention'**
String get doctorApprovalsAttentionPill;
/// No description provided for @doctorServicesEmpty.
///
/// In en, this message translates to:
/// **'No host services declared'**
String get doctorServicesEmpty;
/// No description provided for @doctorServicesEmptyHint.
///
/// In en, this message translates to:
/// **'add to ~/.fai/config.yaml under services:'**
String get doctorServicesEmptyHint;
/// No description provided for @doctorPillLoaded.
///
/// In en, this message translates to:
/// **'loaded'**
String get doctorPillLoaded;
/// No description provided for @doctorPillEmpty.
///
/// In en, this message translates to:
/// **'empty'**
String get doctorPillEmpty;
/// No description provided for @doctorRecheckTooltip.
///
/// In en, this message translates to:

View file

@ -978,6 +978,69 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get doctorTitle => 'Diagnose';
@override
String get doctorSummaryModules => 'Module';
@override
String get doctorSummaryApprovals => 'Freigaben';
@override
String get doctorSummaryAudit => 'Protokoll';
@override
String get doctorSummaryServices => 'Dienste';
@override
String doctorSummaryCapabilities(int n) {
return '$n Capabilities';
}
@override
String get doctorSummaryPending => 'offen';
@override
String doctorSummaryChain(int verified, int total) {
return '$verified/$total Chain';
}
@override
String get doctorSummaryDeclared => 'deklariert';
@override
String doctorModulesPanelSummary(int n, int m) {
return '$n Module · $m Capabilities';
}
@override
String get doctorApprovalsNone => 'Keine offenen Freigaben';
@override
String doctorApprovalsCount(int n) {
String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: '$n Freigaben warten auf Prüfung',
one: '1 Freigabe wartet auf Prüfung',
);
return '$_temp0';
}
@override
String get doctorApprovalsAttentionPill => 'wichtig';
@override
String get doctorServicesEmpty => 'Keine Host-Dienste deklariert';
@override
String get doctorServicesEmptyHint =>
'in ~/.fai/config.yaml unter services: hinzufügen';
@override
String get doctorPillLoaded => 'geladen';
@override
String get doctorPillEmpty => 'leer';
@override
String get doctorRecheckTooltip => 'Erneut prüfen';

View file

@ -992,6 +992,69 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get doctorTitle => 'Doctor';
@override
String get doctorSummaryModules => 'Modules';
@override
String get doctorSummaryApprovals => 'Approvals';
@override
String get doctorSummaryAudit => 'Audit';
@override
String get doctorSummaryServices => 'Services';
@override
String doctorSummaryCapabilities(int n) {
return '$n capabilities';
}
@override
String get doctorSummaryPending => 'pending';
@override
String doctorSummaryChain(int verified, int total) {
return '$verified/$total chain';
}
@override
String get doctorSummaryDeclared => 'declared';
@override
String doctorModulesPanelSummary(int n, int m) {
return '$n modules · $m capabilities';
}
@override
String get doctorApprovalsNone => 'No pending approvals';
@override
String doctorApprovalsCount(int n) {
String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: '$n approvals awaiting review',
one: '1 approval awaiting review',
);
return '$_temp0';
}
@override
String get doctorApprovalsAttentionPill => 'attention';
@override
String get doctorServicesEmpty => 'No host services declared';
@override
String get doctorServicesEmptyHint =>
'add to ~/.fai/config.yaml under services:';
@override
String get doctorPillLoaded => 'loaded';
@override
String get doctorPillEmpty => 'empty';
@override
String get doctorRecheckTooltip => 'Re-check';