diff --git a/STML/stml_application/lib/localization/locales.dart b/STML/stml_application/lib/localization/locales.dart new file mode 100644 index 00000000..61d13619 --- /dev/null +++ b/STML/stml_application/lib/localization/locales.dart @@ -0,0 +1,22 @@ +import 'package:flutter_localization/flutter_localization.dart'; + +const List LOCALES = [ + MapLocale("en", LocaleData.EN), + MapLocale("es", LocaleData.ES), + ]; + +mixin LocaleData { + static const String title = 'title'; + static const String body = 'body'; + + static const Map EN = { + title: 'Localization', + body: 'Welcome to this localized Flutter application %a' + }; + + static const Map ES = { + title: 'Localización', + body: 'Bienvenido a esta aplicación Flutter localizada %a' + }; + +} \ No newline at end of file diff --git a/STML/stml_application/lib/main.dart b/STML/stml_application/lib/main.dart index dba6a656..3ebd02c4 100644 --- a/STML/stml_application/lib/main.dart +++ b/STML/stml_application/lib/main.dart @@ -19,8 +19,13 @@ import 'package:memoryminder/features/caregiver_task_management/caregiver_task_s import 'package:memoryminder/src/features/wearable-integration/health_dashboard.dart'; import 'package:memoryminder/src/features/wearable-integration/fitbit_login.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:flutter_localization/flutter_localization.dart'; +import 'package:memoryminder/localization/locales.dart'; + + final storage = FlutterSecureStorage(); +final FlutterLocalization localization = FlutterLocalization.instance; void main() async { initializeLogging(); @@ -40,6 +45,12 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( + // Localization for multi language support + supportedLocales: [ + Locale('en', ''), // English + Locale('es', '') // Spanish + ], + localizationsDelegates: localization.localizationsDelegates, debugShowCheckedModeBanner: false, title: 'MemoryMinder', theme: ThemeData( @@ -81,6 +92,7 @@ void initializeData() async { await PermissionManager.requestInitialPermissions(); await cm.initializeCamera(); NotificationService().initialize(); + configureLocalization(); } // Handle notifications when the app is in the background @@ -88,6 +100,15 @@ Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { print("⚠️ Background message: ${message.notification?.title}"); } +void configureLocalization() { + localization.init(mapLocales: LOCALES, initLanguageCode: "en"); + // localization.onTranslatedLanguage = onTranslatedLanguage; + } + + // void onTranslatedLanguage(Locale? locale) { + // setState(() {}); + // } + Future _loadFitbitCredentials() async { String? storedAccessToken = await storage.read(key: 'fitbitAccessToken'); String? storedRefreshToken = await storage.read(key: 'fitbitRefreshToken'); diff --git a/STML/stml_application/lib/pages/home_pages.dart b/STML/stml_application/lib/pages/home_pages.dart new file mode 100644 index 00000000..1528548d --- /dev/null +++ b/STML/stml_application/lib/pages/home_pages.dart @@ -0,0 +1,78 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localization/flutter_localization.dart'; +import 'package:memoryminder/localization/locales.dart'; + +class HomePage extends StatefulWidget { + const HomePage({super.key}); + + @override + State createState() => _HomePageState(); +} + +class _HomePageState extends State { + late FlutterLocalization _flutterLocalization; + + late String _currentLocale; + @override + void initState() { + super.initState(); + _flutterLocalization = FlutterLocalization.instance; + _currentLocale = _flutterLocalization.currentLocale!.languageCode; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text( + LocaleData.title.getString(context), + ), + actions: [ + DropdownButton( + value: _currentLocale, + items: const [ + DropdownMenuItem( + value: "en", + child: Text("English"), + ), + DropdownMenuItem( + value: "es", + child: Text("Spanish"), + ), + + ], + onChanged: (value) { + _setLocale(value); + }, + ) + ], + ), + body: Container( + padding: const EdgeInsets.symmetric( + horizontal: 20, + vertical: 50, + ), + child: Text( + context.formatString(LocaleData.body, ["TeamC"]), + style: const TextStyle( + fontSize: 21, + ), + ), + ), + ); + } + + void _setLocale(String? value) { + if (value == null) return; + if (value == "en") { + _flutterLocalization.translate("en"); + } else if (value == "de") { + _flutterLocalization.translate("es"); + } else { + return; + } + setState(() { + _currentLocale = value; + }); + } +} \ No newline at end of file diff --git a/STML/stml_application/lib/src/features/caregiver-dashboard/presentation/care_recipient_profile.dart b/STML/stml_application/lib/src/features/caregiver-dashboard/presentation/care_recipient_profile.dart index c9a4e730..954f7c96 100644 --- a/STML/stml_application/lib/src/features/caregiver-dashboard/presentation/care_recipient_profile.dart +++ b/STML/stml_application/lib/src/features/caregiver-dashboard/presentation/care_recipient_profile.dart @@ -1,6 +1,7 @@ // ignore_for_file: avoid_print, prefer_const_constructors // Imported libraries and packages +import 'package:memoryminder/pages/home_pages.dart'; import 'package:memoryminder/src/features/caregiver-dashboard/presentation/add_care_recipient.dart'; import 'package:memoryminder/src/features/caregiver-dashboard/presentation/app_bar.dart'; import 'package:memoryminder/src/features/caregiver-dashboard/presentation/caregiver-dashboard.dart'; @@ -122,6 +123,14 @@ class CareRecipientProfileScreenState extends State screen: DementiaResourcesScreen(loc: careRecipientLocation), keyName: "DementiaResourcesButtonKey", ), + _buildElevatedButton( + context: context, + icon: Icon(Icons.language, + size: iconSize, color: Color.fromARGB(255, 2, 63, 129)), + text: 'Set Language Preferences', + screen: HomePage(), + keyName: "DementiaResourcesButtonKey", + ), ], ), ), diff --git a/STML/stml_application/pubspec.yaml b/STML/stml_application/pubspec.yaml index 7515935e..b71f64b7 100644 --- a/STML/stml_application/pubspec.yaml +++ b/STML/stml_application/pubspec.yaml @@ -69,6 +69,7 @@ dependencies: flutter_secure_storage: ^8.0.0 http: ^0.13.6 fl_chart: ^0.64.0 + flutter_localization: ^0.3.1 record: ^5.0.0 syncfusion_flutter_calendar: ^28.1.37