Maxiwere45 a2a7ffd79f feat(i18n): add FR/EN internationalization with in-app language selector
- gen-l10n setup (flutter_localizations, intl, l10n.yaml, ARB en/fr)
- localeProvider (persisted) wired into MaterialApp
- language selector in the System page (alongside the color palette)
- all user-facing strings across screens moved to AppLocalizations

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 12:13:51 +02:00

59 lines
1.9 KiB
Dart

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'l10n/app_localizations.dart';
import 'presentation/pages/main_page.dart';
import 'presentation/pages/pokemon_detail.dart';
import 'presentation/pages/game_over_page.dart';
import 'presentation/providers/theme_provider.dart';
import 'presentation/providers/locale_provider.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
if (Platform.isLinux || Platform.isWindows || Platform.isMacOS) {
sqfliteFfiInit();
databaseFactory = databaseFactoryFfi;
}
runApp(const ProviderScope(child: MyApp()));
}
/// Widget racine : construit le MaterialApp (thème dérivé de la palette, routes).
class MyApp extends ConsumerWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final paletteIndex = ref.watch(themeProvider);
final palette = appPalettes[paletteIndex];
final locale = ref.watch(localeProvider);
return MaterialApp(
onGenerateTitle: (context) => AppLocalizations.of(context)!.appTitle,
locale: locale,
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: palette.primary,
surface: palette.surface,
),
textTheme: GoogleFonts.vt323TextTheme(
Theme.of(context).textTheme,
).apply(
bodyColor: Colors.black87,
displayColor: Colors.black87,
),
useMaterial3: true,
),
debugShowCheckedModeBanner: false,
routes: {
'/': (context) => const MainPage(),
'/pokemon-detail': (context) => const PokemonDetailPage(),
'/game-over': (context) => const GameOverPage(),
},
);
}
}