Replaces the Store-only DE/EN toggle with an app-wide one parked in the sidebar footer next to the theme button. Pressing it flips every translated string at once: nav labels, page titles, common buttons, the bilingual store-index content. Implementation: - Adds `flutter_localizations` + `intl` to pubspec, plus `flutter.generate: true` so `flutter gen-l10n` runs in the build pipeline. - ARB sources at `lib/l10n/app_en.arb` and `app_de.arb`. The EN file is the template; DE carries the German strings. Initial coverage: navigation, common buttons, page titles, channels / store / audit / modules / approvals headers, hub-unreachable copy, MCP + n8n panel headers + hints. Rest of the UI strings are still English-literal — those fall in incrementally as we touch each surface. - Generated `AppLocalizations` lives at `lib/l10n/app_localizations*.dart` (regenerated via `flutter gen-l10n` on every ARB edit). - `StudioAppState` gains `localeNotifier` alongside `modeNotifier`; persisted via SharedPreferences key `locale.code`. - Sidebar `_LanguageToggle` reads/writes through the notifier. The Store's per-page locale state is gone: `_locale` now reads `Localizations.localeOf(context) .languageCode`, so the bilingual store-index content follows the global setting without a second toggle. - `_NavPage.label` becomes `_NavPage.id` + `labelOf(context)`; Cmd+K palette and Sidebar both read the localized label. Out of scope this iteration: localizing the remaining ~80% of UI strings (Settings dialog labels, Store search hint, error messages). Those land incrementally — the i18n infrastructure now means each is a one-line ARB edit + one call-site swap. Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
26 lines
848 B
Dart
26 lines
848 B
Dart
// Smoke test: app boots and shows every navigation destination.
|
|
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:fai_studio/data/hub.dart';
|
|
import 'package:fai_studio/main.dart';
|
|
|
|
void main() {
|
|
testWidgets('Studio shell shows every navigation destination',
|
|
(tester) async {
|
|
await tester.pumpWidget(
|
|
const StudioApp(
|
|
initialThemeMode: ThemeModeValue.system,
|
|
initialLocale: Locale('en'),
|
|
),
|
|
);
|
|
|
|
expect(find.text('F∆I Studio'), findsOneWidget);
|
|
expect(find.text('Doctor'), findsWidgets);
|
|
expect(find.text('Modules'), findsWidgets);
|
|
expect(find.text('Store'), findsOneWidget);
|
|
expect(find.text('Flows'), findsOneWidget);
|
|
expect(find.text('Audit'), findsOneWidget);
|
|
expect(find.text('Approvals'), findsOneWidget);
|
|
});
|
|
}
|