From 98f0502f6c13f11c1d126f7a1dff624dd9129da5 Mon Sep 17 00:00:00 2001 From: chetanr25 Date: Wed, 18 Feb 2026 23:11:42 +0530 Subject: [PATCH 1/5] feat: Greet and show real name in app bar header of community. Added a way to extract userDetails and store in provider. Closes #7372 --- .../lib/data_models/login_result.dart | 4 ++- .../data_models/user_management_provider.dart | 14 +++++++--- .../logged_in/logged_in_app_bar_header.dart | 27 +++++++++++++++++-- .../pages/user_management/sign_up_page.dart | 5 +++- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/packages/smooth_app/lib/data_models/login_result.dart b/packages/smooth_app/lib/data_models/login_result.dart index d2cb0fb970f3..bf830fc7f640 100644 --- a/packages/smooth_app/lib/data_models/login_result.dart +++ b/packages/smooth_app/lib/data_models/login_result.dart @@ -9,11 +9,12 @@ enum LoginResultType { successful, unsuccessful, serverIssue, exception } /// Result of a log in attempt, more subtle than a `bool`. class LoginResult { - const LoginResult(this.type, {this.user, this.text}); + const LoginResult(this.type, {this.user, this.userDetails, this.text}); final LoginResultType type; final User? user; final String? text; + final UserDetails? userDetails; String getErrorMessage(final AppLocalizations appLocalizations) => switch (type) { @@ -62,6 +63,7 @@ class LoginResult { password: user.password, cookie: loginStatus.cookie, ), + userDetails: loginStatus.userDetails, ); } catch (e) { return LoginResult(LoginResultType.exception, text: e.toString()); diff --git a/packages/smooth_app/lib/data_models/user_management_provider.dart b/packages/smooth_app/lib/data_models/user_management_provider.dart index fbb93e9fa2fa..a952e3bb1418 100644 --- a/packages/smooth_app/lib/data_models/user_management_provider.dart +++ b/packages/smooth_app/lib/data_models/user_management_provider.dart @@ -13,6 +13,9 @@ class UserManagementProvider with ChangeNotifier { static const String _USER_ID = 'user_id'; static const String _PASSWORD = 'pasword'; static const String _COOKIE = 'user_cookie'; + static const String USER_NAME = 'user_name'; + + static UserDetails? globalUserDetails; /// Checks credentials and conditionally saves them. Future login( @@ -26,7 +29,8 @@ class UserManagementProvider with ChangeNotifier { if (loginResult.type != LoginResultType.successful) { return loginResult; } - await putUser(loginResult.user!); + await putUser(loginResult.user!, name: loginResult.userDetails?.name); + globalUserDetails = loginResult.userDetails; await credentialsInStorage(); return loginResult; } @@ -34,9 +38,11 @@ class UserManagementProvider with ChangeNotifier { /// Deletes saved credentials from storage Future logout() async { OpenFoodAPIConfiguration.globalUser = null; + globalUserDetails = null; DaoSecuredString.remove(key: _USER_ID); DaoSecuredString.remove(key: _PASSWORD); DaoSecuredString.remove(key: _COOKIE); + DaoSecuredString.remove(key: USER_NAME); notifyListeners(); final bool contains = await credentialsInStorage(); return !contains; @@ -63,6 +69,7 @@ class UserManagementProvider with ChangeNotifier { DaoSecuredString.remove(key: _USER_ID); DaoSecuredString.remove(key: _PASSWORD); DaoSecuredString.remove(key: _COOKIE); + DaoSecuredString.remove(key: USER_NAME); Logs.e('Credentials query failed, you have been logged out'); } @@ -87,10 +94,11 @@ class UserManagementProvider with ChangeNotifier { } /// Saves user to storage - Future putUser(User user) async { + Future putUser(User user, {String? name}) async { OpenFoodAPIConfiguration.globalUser = user; await DaoSecuredString.put(key: _USER_ID, value: user.userId); await DaoSecuredString.put(key: _PASSWORD, value: user.password); + await DaoSecuredString.put(key: USER_NAME, value: name ?? ''); if (user.cookie != null) { await DaoSecuredString.put(key: _COOKIE, value: user.cookie!); } else { @@ -119,7 +127,7 @@ class UserManagementProvider with ChangeNotifier { /// Save the cookie if necessary if (user.cookie == null && loginResult.user?.cookie != null) { - putUser(loginResult.user!); + putUser(loginResult.user!, name: loginResult.userDetails?.name); } } } diff --git a/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart b/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart index aa1538886032..2d9565764c43 100644 --- a/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart +++ b/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:openfoodfacts/openfoodfacts.dart'; import 'package:provider/provider.dart'; +import 'package:smooth_app/data_models/user_management_provider.dart'; +import 'package:smooth_app/database/dao_secured_string.dart'; import 'package:smooth_app/generic_lib/design_constants.dart'; import 'package:smooth_app/generic_lib/widgets/app_bars/app_bar_constanst.dart'; import 'package:smooth_app/l10n/app_localizations.dart'; @@ -16,12 +19,32 @@ class LoggedInAppBarHeader extends StatelessWidget { final String userId; + String _getGreeting() { + final int hour = DateTime.now().hour; + if (hour < 12) { + return 'Good morning'; + } else if (hour < 17) { + return 'Good afternoon'; + } else if (hour < 21) { + return 'Good evening'; + } else { + return 'Good night'; + } + } + @override Widget build(BuildContext context) { final AppLocalizations appLocalizations = AppLocalizations.of(context); final SmoothColorsThemeExtension themeExtension = context .extension(); + // OpenFoodAPIConfiguration.globalUser; + final UserDetails? userDetails = UserManagementProvider.globalUserDetails; + final String? name = userDetails?.name; + // late name = DaoSecuredString.get(UserManagementProvider.USER_NAME); // This returns Future + // print(userDetails); + + final String displayName = name?.isNotEmpty == true ? name! : userId; return ConstrainedBox( constraints: const BoxConstraints(minHeight: PROFILE_PICTURE_SIZE), child: Row( @@ -33,8 +56,8 @@ class LoggedInAppBarHeader extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, spacing: VERY_SMALL_SPACE, children: [ - Text( - userId, + AutoSizeText( + '${_getGreeting()} $displayName', style: TextStyle( color: themeExtension.secondaryNormal, fontSize: 18.0, diff --git a/packages/smooth_app/lib/pages/user_management/sign_up_page.dart b/packages/smooth_app/lib/pages/user_management/sign_up_page.dart index 6f59708e42bd..4ae59412de14 100644 --- a/packages/smooth_app/lib/pages/user_management/sign_up_page.dart +++ b/packages/smooth_app/lib/pages/user_management/sign_up_page.dart @@ -418,7 +418,10 @@ class _SignUpPageState extends State with TraceableClientMixin { if (!mounted) { return; } - await context.read().putUser(user); + await context.read().putUser( + user, + name: _displayNameController.trimmedText, + ); if (!mounted) { return; } From 6f14253b4504ece7c59d60bd6d9786ab8c8d40b5 Mon Sep 17 00:00:00 2001 From: chetanr25 Date: Thu, 19 Feb 2026 01:11:06 +0530 Subject: [PATCH 2/5] fix: Currently the app doesn't loose U serDetails after app is restarted. UserDetails is stored in DaoSecuredString by se rialization --- .../data_models/user_management_provider.dart | 44 +++++++++++++++---- .../logged_in/logged_in_app_bar_header.dart | 9 +--- .../pages/user_management/sign_up_page.dart | 5 +-- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/packages/smooth_app/lib/data_models/user_management_provider.dart b/packages/smooth_app/lib/data_models/user_management_provider.dart index a952e3bb1418..c1fa9562edbd 100644 --- a/packages/smooth_app/lib/data_models/user_management_provider.dart +++ b/packages/smooth_app/lib/data_models/user_management_provider.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -13,7 +14,7 @@ class UserManagementProvider with ChangeNotifier { static const String _USER_ID = 'user_id'; static const String _PASSWORD = 'pasword'; static const String _COOKIE = 'user_cookie'; - static const String USER_NAME = 'user_name'; + static const String _USER_DETAILS = 'user_details'; static UserDetails? globalUserDetails; @@ -29,12 +30,24 @@ class UserManagementProvider with ChangeNotifier { if (loginResult.type != LoginResultType.successful) { return loginResult; } - await putUser(loginResult.user!, name: loginResult.userDetails?.name); - globalUserDetails = loginResult.userDetails; + await putUser(loginResult.user!); + await _saveUserDetails(loginResult.userDetails); await credentialsInStorage(); return loginResult; } + /// Saves user details to storage + Future _saveUserDetails(UserDetails? userDetails) async { + globalUserDetails = userDetails; + if (userDetails != null) { + final String jsonString = jsonEncode(userDetails.toJson()); + await DaoSecuredString.put(key: _USER_DETAILS, value: jsonString); + } else { + DaoSecuredString.remove(key: _USER_DETAILS); + } + notifyListeners(); + } + /// Deletes saved credentials from storage Future logout() async { OpenFoodAPIConfiguration.globalUser = null; @@ -42,7 +55,7 @@ class UserManagementProvider with ChangeNotifier { DaoSecuredString.remove(key: _USER_ID); DaoSecuredString.remove(key: _PASSWORD); DaoSecuredString.remove(key: _COOKIE); - DaoSecuredString.remove(key: USER_NAME); + DaoSecuredString.remove(key: _USER_DETAILS); notifyListeners(); final bool contains = await credentialsInStorage(); return !contains; @@ -58,18 +71,20 @@ class UserManagementProvider with ChangeNotifier { String? effectiveUserId; String? effectivePassword; String? effectiveCookie; + String? userDetailsJson; try { effectiveUserId = userId ?? await DaoSecuredString.get(_USER_ID); effectivePassword = password ?? await DaoSecuredString.get(_PASSWORD); effectiveCookie = await DaoSecuredString.get(_COOKIE); + userDetailsJson = await DaoSecuredString.get(_USER_DETAILS); } on PlatformException { /// Decrypting the values can go wrong if, for example, the app was /// manually overwritten from an external apk. DaoSecuredString.remove(key: _USER_ID); DaoSecuredString.remove(key: _PASSWORD); DaoSecuredString.remove(key: _COOKIE); - DaoSecuredString.remove(key: USER_NAME); + DaoSecuredString.remove(key: _USER_DETAILS); Logs.e('Credentials query failed, you have been logged out'); } @@ -83,6 +98,17 @@ class UserManagementProvider with ChangeNotifier { cookie: effectiveCookie, ); OpenFoodAPIConfiguration.globalUser = user; + + // Restore complete UserDetails from JSON + if (userDetailsJson != null && userDetailsJson.isNotEmpty) { + try { + final Map json = jsonDecode(userDetailsJson); + globalUserDetails = UserDetails.fromJson(json); + } catch (e) { + Logs.e('Failed to parse UserDetails: $e'); + DaoSecuredString.remove(key: _USER_DETAILS); + } + } } /// Checks if any credentials exist in storage @@ -94,11 +120,10 @@ class UserManagementProvider with ChangeNotifier { } /// Saves user to storage - Future putUser(User user, {String? name}) async { + Future putUser(User user) async { OpenFoodAPIConfiguration.globalUser = user; await DaoSecuredString.put(key: _USER_ID, value: user.userId); await DaoSecuredString.put(key: _PASSWORD, value: user.password); - await DaoSecuredString.put(key: USER_NAME, value: name ?? ''); if (user.cookie != null) { await DaoSecuredString.put(key: _COOKIE, value: user.cookie!); } else { @@ -125,9 +150,10 @@ class UserManagementProvider with ChangeNotifier { return; } - /// Save the cookie if necessary + /// Save the cookie and user details if necessary if (user.cookie == null && loginResult.user?.cookie != null) { - putUser(loginResult.user!, name: loginResult.userDetails?.name); + await putUser(loginResult.user!); + await _saveUserDetails(loginResult.userDetails); } } } diff --git a/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart b/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart index 2d9565764c43..6d61f020a0bb 100644 --- a/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart +++ b/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart @@ -3,7 +3,6 @@ import 'package:flutter_svg/svg.dart'; import 'package:openfoodfacts/openfoodfacts.dart'; import 'package:provider/provider.dart'; import 'package:smooth_app/data_models/user_management_provider.dart'; -import 'package:smooth_app/database/dao_secured_string.dart'; import 'package:smooth_app/generic_lib/design_constants.dart'; import 'package:smooth_app/generic_lib/widgets/app_bars/app_bar_constanst.dart'; import 'package:smooth_app/l10n/app_localizations.dart'; @@ -38,13 +37,9 @@ class LoggedInAppBarHeader extends StatelessWidget { final SmoothColorsThemeExtension themeExtension = context .extension(); - // OpenFoodAPIConfiguration.globalUser; final UserDetails? userDetails = UserManagementProvider.globalUserDetails; - final String? name = userDetails?.name; - // late name = DaoSecuredString.get(UserManagementProvider.USER_NAME); // This returns Future - // print(userDetails); + final String name = userDetails?.name ?? userId; - final String displayName = name?.isNotEmpty == true ? name! : userId; return ConstrainedBox( constraints: const BoxConstraints(minHeight: PROFILE_PICTURE_SIZE), child: Row( @@ -57,7 +52,7 @@ class LoggedInAppBarHeader extends StatelessWidget { spacing: VERY_SMALL_SPACE, children: [ AutoSizeText( - '${_getGreeting()} $displayName', + '${_getGreeting()} $name', style: TextStyle( color: themeExtension.secondaryNormal, fontSize: 18.0, diff --git a/packages/smooth_app/lib/pages/user_management/sign_up_page.dart b/packages/smooth_app/lib/pages/user_management/sign_up_page.dart index 4ae59412de14..6f59708e42bd 100644 --- a/packages/smooth_app/lib/pages/user_management/sign_up_page.dart +++ b/packages/smooth_app/lib/pages/user_management/sign_up_page.dart @@ -418,10 +418,7 @@ class _SignUpPageState extends State with TraceableClientMixin { if (!mounted) { return; } - await context.read().putUser( - user, - name: _displayNameController.trimmedText, - ); + await context.read().putUser(user); if (!mounted) { return; } From d7fc6fdc4b4ba4eb67f1c0b3967f68ec5e65d0b0 Mon Sep 17 00:00:00 2001 From: chetanr25 Date: Thu, 19 Feb 2026 01:24:45 +0530 Subject: [PATCH 3/5] localised greetings --- .../logged_in/logged_in_app_bar_header.dart | 12 +++++----- packages/smooth_app/lib/l10n/app_en.arb | 6 ++++- .../lib/l10n/app_localizations.dart | 24 +++++++++++++++++++ 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart b/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart index 6d61f020a0bb..88b680dc27a9 100644 --- a/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart +++ b/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart @@ -18,16 +18,16 @@ class LoggedInAppBarHeader extends StatelessWidget { final String userId; - String _getGreeting() { + String _getGreeting(AppLocalizations appLocalizations) { final int hour = DateTime.now().hour; if (hour < 12) { - return 'Good morning'; + return appLocalizations.greet_good_morning; } else if (hour < 17) { - return 'Good afternoon'; + return appLocalizations.greet_good_afternoon; } else if (hour < 21) { - return 'Good evening'; + return appLocalizations.greet_good_evening; } else { - return 'Good night'; + return appLocalizations.greet_good_night; } } @@ -52,7 +52,7 @@ class LoggedInAppBarHeader extends StatelessWidget { spacing: VERY_SMALL_SPACE, children: [ AutoSizeText( - '${_getGreeting()} $name', + '${_getGreeting(appLocalizations)} $name', style: TextStyle( color: themeExtension.secondaryNormal, fontSize: 18.0, diff --git a/packages/smooth_app/lib/l10n/app_en.arb b/packages/smooth_app/lib/l10n/app_en.arb index a6a8081e7d97..3af538855f77 100644 --- a/packages/smooth_app/lib/l10n/app_en.arb +++ b/packages/smooth_app/lib/l10n/app_en.arb @@ -5744,5 +5744,9 @@ "type": "String" } } - } + }, + "greet_good_morning": "Good morning", + "greet_good_afternoon": "Good afternoon", + "greet_good_evening": "Good evening", + "greet_good_night": "Good night" } \ No newline at end of file diff --git a/packages/smooth_app/lib/l10n/app_localizations.dart b/packages/smooth_app/lib/l10n/app_localizations.dart index 3de148c07df4..ca35e473831a 100644 --- a/packages/smooth_app/lib/l10n/app_localizations.dart +++ b/packages/smooth_app/lib/l10n/app_localizations.dart @@ -10785,6 +10785,30 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'{percent}%'** String percent_value(String percent); + + /// No description provided for @greet_good_morning. + /// + /// In en, this message translates to: + /// **'Good morning'** + String get greet_good_morning; + + /// No description provided for @greet_good_afternoon. + /// + /// In en, this message translates to: + /// **'Good afternoon'** + String get greet_good_afternoon; + + /// No description provided for @greet_good_evening. + /// + /// In en, this message translates to: + /// **'Good evening'** + String get greet_good_evening; + + /// No description provided for @greet_good_night. + /// + /// In en, this message translates to: + /// **'Good night'** + String get greet_good_night; } class _AppLocalizationsDelegate From 9154a734912ff1c9ca62124934c6f3b03a4967f9 Mon Sep 17 00:00:00 2001 From: Chetan R Date: Fri, 27 Feb 2026 20:22:12 +0530 Subject: [PATCH 4/5] Update packages/smooth_app/lib/l10n/app_en.arb Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/smooth_app/lib/l10n/app_en.arb | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/smooth_app/lib/l10n/app_en.arb b/packages/smooth_app/lib/l10n/app_en.arb index 3af538855f77..b806601fdc55 100644 --- a/packages/smooth_app/lib/l10n/app_en.arb +++ b/packages/smooth_app/lib/l10n/app_en.arb @@ -5746,7 +5746,19 @@ } }, "greet_good_morning": "Good morning", + "@greet_good_morning": { + "description": "Short greeting shown in the app during the morning (for example, roughly 05:00–11:59). No placeholders." + }, "greet_good_afternoon": "Good afternoon", + "@greet_good_afternoon": { + "description": "Short greeting shown in the app during the afternoon (for example, roughly 12:00–17:59). No placeholders." + }, "greet_good_evening": "Good evening", - "greet_good_night": "Good night" + "@greet_good_evening": { + "description": "Short greeting shown in the app during the evening (for example, roughly 18:00–21:59). No placeholders." + }, + "greet_good_night": "Good night", + "@greet_good_night": { + "description": "Short greeting shown in the app late at night or before going to sleep. No placeholders." + } } \ No newline at end of file From af7688acc423216591c69ac29d967dcef4d9e137 Mon Sep 17 00:00:00 2001 From: chetanr25 Date: Fri, 27 Feb 2026 23:09:38 +0530 Subject: [PATCH 5/5] Add {name} placeholder to localized greeting --- .../logged_in/logged_in_app_bar_header.dart | 12 +++--- packages/smooth_app/lib/l10n/app_en.arb | 38 ++++++++++++++----- .../lib/l10n/app_localizations.dart | 24 ++++++------ 3 files changed, 47 insertions(+), 27 deletions(-) diff --git a/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart b/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart index 88b680dc27a9..8a9af3da146c 100644 --- a/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart +++ b/packages/smooth_app/lib/generic_lib/widgets/app_bars/logged_in/logged_in_app_bar_header.dart @@ -18,16 +18,16 @@ class LoggedInAppBarHeader extends StatelessWidget { final String userId; - String _getGreeting(AppLocalizations appLocalizations) { + String _getGreeting(AppLocalizations appLocalizations, String name) { final int hour = DateTime.now().hour; if (hour < 12) { - return appLocalizations.greet_good_morning; + return appLocalizations.greet_good_morning(name); } else if (hour < 17) { - return appLocalizations.greet_good_afternoon; + return appLocalizations.greet_good_afternoon(name); } else if (hour < 21) { - return appLocalizations.greet_good_evening; + return appLocalizations.greet_good_evening(name); } else { - return appLocalizations.greet_good_night; + return appLocalizations.greet_good_night(name); } } @@ -52,7 +52,7 @@ class LoggedInAppBarHeader extends StatelessWidget { spacing: VERY_SMALL_SPACE, children: [ AutoSizeText( - '${_getGreeting(appLocalizations)} $name', + _getGreeting(appLocalizations, name), style: TextStyle( color: themeExtension.secondaryNormal, fontSize: 18.0, diff --git a/packages/smooth_app/lib/l10n/app_en.arb b/packages/smooth_app/lib/l10n/app_en.arb index 4d80cb1326d0..51bb2c17ca54 100644 --- a/packages/smooth_app/lib/l10n/app_en.arb +++ b/packages/smooth_app/lib/l10n/app_en.arb @@ -5753,21 +5753,41 @@ "type": "String" } } - }, - "greet_good_morning": "Good morning", + }, + "greet_good_morning": "Good morning, {name}", "@greet_good_morning": { - "description": "Short greeting shown in the app during the morning (for example, roughly 05:00–11:59). No placeholders." + "description": "Short greeting shown in the app during the morning (for example, roughly 05:00–11:59).", + "placeholders": { + "name": { + "type": "String" + } + } }, - "greet_good_afternoon": "Good afternoon", + "greet_good_afternoon": "Good afternoon, {name}", "@greet_good_afternoon": { - "description": "Short greeting shown in the app during the afternoon (for example, roughly 12:00–17:59). No placeholders." + "description": "Short greeting shown in the app during the afternoon (for example, roughly 12:00–17:59).", + "placeholders": { + "name": { + "type": "String" + } + } }, - "greet_good_evening": "Good evening", + "greet_good_evening": "Good evening, {name}", "@greet_good_evening": { - "description": "Short greeting shown in the app during the evening (for example, roughly 18:00–21:59). No placeholders." + "description": "Short greeting shown in the app during the evening (for example, roughly 18:00–21:59.)", + "placeholders": { + "name": { + "type": "String" + } + } }, - "greet_good_night": "Good night", + "greet_good_night": "Good night, {name}", "@greet_good_night": { - "description": "Short greeting shown in the app late at night or before going to sleep. No placeholders." + "description": "Short greeting shown in the app late at night or before going to sleep.", + "placeholders": { + "name": { + "type": "String" + } + } } } \ No newline at end of file diff --git a/packages/smooth_app/lib/l10n/app_localizations.dart b/packages/smooth_app/lib/l10n/app_localizations.dart index ba1a14c98d6a..1cec12aee8b0 100644 --- a/packages/smooth_app/lib/l10n/app_localizations.dart +++ b/packages/smooth_app/lib/l10n/app_localizations.dart @@ -10840,29 +10840,29 @@ abstract class AppLocalizations { /// **'{percent}%'** String percent_value(String percent); - /// No description provided for @greet_good_morning. + /// Short greeting shown in the app during the morning (for example, roughly 05:00–11:59). /// /// In en, this message translates to: - /// **'Good morning'** - String get greet_good_morning; + /// **'Good morning, {name}'** + String greet_good_morning(String name); - /// No description provided for @greet_good_afternoon. + /// Short greeting shown in the app during the afternoon (for example, roughly 12:00–17:59). /// /// In en, this message translates to: - /// **'Good afternoon'** - String get greet_good_afternoon; + /// **'Good afternoon, {name}'** + String greet_good_afternoon(String name); - /// No description provided for @greet_good_evening. + /// Short greeting shown in the app during the evening (for example, roughly 18:00–21:59.) /// /// In en, this message translates to: - /// **'Good evening'** - String get greet_good_evening; + /// **'Good evening, {name}'** + String greet_good_evening(String name); - /// No description provided for @greet_good_night. + /// Short greeting shown in the app late at night or before going to sleep. /// /// In en, this message translates to: - /// **'Good night'** - String get greet_good_night; + /// **'Good night, {name}'** + String greet_good_night(String name); } class _AppLocalizationsDelegate