Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions ios/Runner/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Receipe App</string>
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>fr</string>
</array>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
Expand Down
4 changes: 3 additions & 1 deletion lib/app/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import 'package:receipe_app/services/dish_service.dart';
import 'package:receipe_app/services/database_service.dart';
import 'package:receipe_app/services/user_service.dart';
import 'package:receipe_app/ui/views/single_user/single_user_view.dart';
import 'package:receipe_app/services/localization_service.dart';
// @stacked-import

@StackedApp(
Expand Down Expand Up @@ -49,6 +50,7 @@ import 'package:receipe_app/ui/views/single_user/single_user_view.dart';
LazySingleton(classType: DatabaseMigrationService),
InitializableSingleton(classType: DatabaseService),
LazySingleton(classType: UserService),
LazySingleton(classType: LocalizationService),
// @stacked-service
],
bottomsheets: [
Expand All @@ -62,4 +64,4 @@ import 'package:receipe_app/ui/views/single_user/single_user_view.dart';
],
logger: StackedLogger(),
)
class App {}
class App {}
2 changes: 2 additions & 0 deletions lib/app/app.locator.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions lib/enums/languages.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
enum Languages { english, french }
4 changes: 4 additions & 0 deletions lib/generated/intl/messages_all.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,20 @@ import 'package:intl/message_lookup_by_library.dart';
import 'package:intl/src/intl_helpers.dart';

import 'messages_en.dart' as messages_en;
import 'messages_fr.dart' as messages_fr;

typedef Future<dynamic> LibraryLoader();
Map<String, LibraryLoader> _deferredLibraries = {
'en': () => new SynchronousFuture(null),
'fr': () => new SynchronousFuture(null),
};

MessageLookupByLibrary? _findExact(String localeName) {
switch (localeName) {
case 'en':
return messages_en.messages;
case 'fr':
return messages_fr.messages;
default:
return null;
}
Expand Down
110 changes: 110 additions & 0 deletions lib/generated/intl/messages_fr.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a fr locale. All the
// messages from the main program should be duplicated here with the same
// function name.

// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes
// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes

import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';

final messages = new MessageLookup();

typedef String MessageIfAbsent(String messageStr, List<dynamic> args);

class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'fr';

final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
"already_have_an_account":
MessageLookupByLibrary.simpleMessage("Vous avez déjà un compte?"),
"are_you_sure": MessageLookupByLibrary.simpleMessage(
"Êtes-vous sûr de vouloir supprimer ce plat ?"),
"cancel": MessageLookupByLibrary.simpleMessage("Annuler"),
"click_done": MessageLookupByLibrary.simpleMessage(
"Cliquez sur \"Terminé\" après votre saisie."),
"connection_error": MessageLookupByLibrary.simpleMessage(
"Il semble que nous ayons un problème de connexion au serveur. Veuillez réessayer lorsque vous avez un réseau plus fort"),
"connection_timeout": MessageLookupByLibrary.simpleMessage(
"Pas de connexion Internet. Il semble que la connexion a expiré"),
"create_a_dish": MessageLookupByLibrary.simpleMessage("Créer un plat"),
"create_a_dish_intro": MessageLookupByLibrary.simpleMessage(
"Salut 😚, il est temps de créer ce plat spécial que vous avez toujours désiré. \nVeuillez remplir les détails ci-dessous"),
"create_dish": MessageLookupByLibrary.simpleMessage("Créer un plat"),
"dark_mode": MessageLookupByLibrary.simpleMessage("MODE SOMBRE"),
"date_created":
MessageLookupByLibrary.simpleMessage("Date de création : "),
"delete_dish":
MessageLookupByLibrary.simpleMessage("Supprimer le plat"),
"dont_have_an_account":
MessageLookupByLibrary.simpleMessage("Vous n\'avez pas de compte?"),
"drawer_home": MessageLookupByLibrary.simpleMessage("ACCUEIL"),
"edit_dish": MessageLookupByLibrary.simpleMessage("Modifier le plat"),
"email_address": MessageLookupByLibrary.simpleMessage("Adresse e-mail"),
"email_cannot_be_empty": MessageLookupByLibrary.simpleMessage(
"L\'e-mail ne peut pas être vide"),
"email_must_be_a_valid_email": MessageLookupByLibrary.simpleMessage(
"L\'e-mail doit être une adresse e-mail valide"),
"enter_your_email":
MessageLookupByLibrary.simpleMessage("Entrez votre adresse e-mail"),
"enter_your_first_name":
MessageLookupByLibrary.simpleMessage("Entrez votre prénom"),
"enter_your_last_name":
MessageLookupByLibrary.simpleMessage("Entrez votre nom de famille"),
"enter_your_password":
MessageLookupByLibrary.simpleMessage("Entrez votre mot de passe"),
"first_name": MessageLookupByLibrary.simpleMessage("Prénom"),
"generate_recipe_contents": MessageLookupByLibrary.simpleMessage(
"Génération du contenu de la recette"),
"get_started": MessageLookupByLibrary.simpleMessage("Commencer"),
"hello_word": MessageLookupByLibrary.simpleMessage("Bonjour le monde"),
"hi": MessageLookupByLibrary.simpleMessage("Salut"),
"home": MessageLookupByLibrary.simpleMessage("Accueil"),
"ingredient_of_dish":
MessageLookupByLibrary.simpleMessage("Ingrédients du plat"),
"ingredients": MessageLookupByLibrary.simpleMessage("Ingrédients"),
"instructions": MessageLookupByLibrary.simpleMessage("Instructions"),
"kindly_edit": MessageLookupByLibrary.simpleMessage(
"Veuillez modifier les détails ci-dessous pour refléter les bonnes informations sur le plat standard"),
"last_name": MessageLookupByLibrary.simpleMessage("Nom de famille"),
"login": MessageLookupByLibrary.simpleMessage("S\'identifier"),
"logout": MessageLookupByLibrary.simpleMessage("SE DÉCONNECTER "),
"my_dish": MessageLookupByLibrary.simpleMessage("MON PLAT"),
"mydish": MessageLookupByLibrary.simpleMessage("Mon plat"),
"name": MessageLookupByLibrary.simpleMessage("Nom : "),
"name_of_dish": MessageLookupByLibrary.simpleMessage("Nom du plat"),
"no_dish_available": MessageLookupByLibrary.simpleMessage(
"Il n\'y a actuellement aucun plat disponible à afficher"),
"no_internet": MessageLookupByLibrary.simpleMessage(
"Pas de connexion Internet. Veuillez réessayer plus tard"),
"onboarding_subtitle_one": MessageLookupByLibrary.simpleMessage(
"Kally Dish propose des denrées non périssables au prix de gros le plus bas, livrées gratuitement à votre porte"),
"onboarding_subtitle_three": MessageLookupByLibrary.simpleMessage(
"Kally Dish offre un accès exclusif à des avantages de réduction des coûts, d\'économie de temps et de réduction du stress grâce à son plan d\'adhésion"),
"onboarding_subtitle_two": MessageLookupByLibrary.simpleMessage(
"Avec Kally Dish, vous pouvez passer votre commande depuis le confort de votre domicile en appelant l\'un de nos numéros"),
"onboarding_title_one": MessageLookupByLibrary.simpleMessage(
"Livraison gratuite de qualité"),
"onboarding_title_three": MessageLookupByLibrary.simpleMessage(
"Abonnez-vous à notre magasin"),
"onboarding_title_two":
MessageLookupByLibrary.simpleMessage("Commande sans couture"),
"password": MessageLookupByLibrary.simpleMessage("Mot de passe"),
"please_sign_in_to_continue": MessageLookupByLibrary.simpleMessage(
"Veuillez vous connecter pour continuer"),
"required": MessageLookupByLibrary.simpleMessage("Obligatoire"),
"service_unavailable":
MessageLookupByLibrary.simpleMessage("Service non disponible"),
"sign_up": MessageLookupByLibrary.simpleMessage("S\'inscrire"),
"unknown_error":
MessageLookupByLibrary.simpleMessage("Erreur inconnue"),
"welcome": MessageLookupByLibrary.simpleMessage("Bienvenue"),
"yes": MessageLookupByLibrary.simpleMessage("Oui")
};
}
1 change: 1 addition & 0 deletions lib/generated/l10n.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

58 changes: 58 additions & 0 deletions lib/l10n/intl_fr.arb
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
{
"@@locale": "fr",
"hello_word": "Bonjour le monde",
"get_started": "Commencer",
"onboarding_title_one": "Livraison gratuite de qualité",
"onboarding_subtitle_one": "Kally Dish propose des denrées non périssables au prix de gros le plus bas, livrées gratuitement à votre porte",
"onboarding_title_two": "Commande sans couture",
"onboarding_subtitle_two": "Avec Kally Dish, vous pouvez passer votre commande depuis le confort de votre domicile en appelant l'un de nos numéros",
"onboarding_title_three": "Abonnez-vous à notre magasin",
"onboarding_subtitle_three": "Kally Dish offre un accès exclusif à des avantages de réduction des coûts, d'économie de temps et de réduction du stress grâce à son plan d'adhésion",
"welcome": "Bienvenue",
"mydish": "Mon plat",
"please_sign_in_to_continue": "Veuillez vous connecter pour continuer",
"email_address": "Adresse e-mail",
"enter_your_email": "Entrez votre adresse e-mail",
"password": "Mot de passe",
"enter_your_password": "Entrez votre mot de passe",
"first_name": "Prénom",
"enter_your_first_name": "Entrez votre prénom",
"last_name": "Nom de famille",
"enter_your_last_name": "Entrez votre nom de famille",
"login": "S'identifier",
"dont_have_an_account": "Vous n'avez pas de compte?",
"already_have_an_account": "Vous avez déjà un compte?",
"sign_up": "S'inscrire",
"email_cannot_be_empty": "L'e-mail ne peut pas être vide",
"email_must_be_a_valid_email": "L'e-mail doit être une adresse e-mail valide",
"required": "Obligatoire",
"kindly_edit": "Veuillez modifier les détails ci-dessous pour refléter les bonnes informations sur le plat standard",
"edit_dish": "Modifier le plat",
"name_of_dish": "Nom du plat",
"instructions": "Instructions",
"ingredients": "Ingrédients",
"click_done": "Cliquez sur \"Terminé\" après votre saisie.",
"name": "Nom : ",
"date_created": "Date de création : ",
"cancel": "Annuler",
"yes": "Oui",
"are_you_sure": "Êtes-vous sûr de vouloir supprimer ce plat ?",
"delete_dish": "Supprimer le plat",
"create_a_dish": "Créer un plat",
"create_a_dish_intro": "Salut 😚, il est temps de créer ce plat spécial que vous avez toujours désiré. \nVeuillez remplir les détails ci-dessous",
"ingredient_of_dish": "Ingrédients du plat",
"create_dish": "Créer un plat",
"no_internet": "Pas de connexion Internet. Veuillez réessayer plus tard",
"connection_timeout": "Pas de connexion Internet. Il semble que la connexion a expiré",
"service_unavailable": "Service non disponible",
"unknown_error": "Erreur inconnue",
"home": "Accueil",
"drawer_home": "ACCUEIL",
"hi": "Salut",
"my_dish": "MON PLAT",
"dark_mode": "MODE SOMBRE",
"logout": "SE DÉCONNECTER ",
"no_dish_available": "Il n'y a actuellement aucun plat disponible à afficher",
"generate_recipe_contents": "Génération du contenu de la recette",
"connection_error": "Il semble que nous ayons un problème de connexion au serveur. Veuillez réessayer lorsque vous avez un réseau plus fort"
}
3 changes: 3 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:receipe_app/services/localization_service.dart';
import 'package:stacked_services/stacked_services.dart';
import 'app/app.bottomsheets.dart';
import 'app/app.dialogs.dart';
Expand All @@ -16,6 +17,7 @@ Future<void> main() async {
await setupLocator();
setupDialogUi();
setupBottomSheetUi();
await S.load(const Locale.fromSubtags(languageCode: 'en'));
runApp(const MainApp());
}

Expand All @@ -37,6 +39,7 @@ class MainApp extends StatelessWidget {
navigatorObservers: [
StackedService.routeObserver,
],
locale: LocalizationService().currentLocale,
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
Expand Down
18 changes: 18 additions & 0 deletions lib/services/localization_service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import 'dart:ui';

import 'package:receipe_app/enums/languages.dart';

class LocalizationService {
//Hold current app locale
Locale _currentLocale = Locale.fromSubtags(languageCode: 'en');
Locale get currentLocale => _currentLocale;

//refactoring app-drawer VM localization
Languages _selectedLocale = Languages.english;
Languages get selectedLocale => _selectedLocale;

//function to assign locale
void assignLocale(Languages value) {
_selectedLocale = value;
}
}
35 changes: 34 additions & 1 deletion lib/ui/widgets/common/app_drawer/app_drawer.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:receipe_app/app/app.logger.dart';
import 'package:receipe_app/enums/languages.dart';
import 'package:receipe_app/generated/l10n.dart';
import 'package:receipe_app/ui/common/app_images.dart';
import 'package:receipe_app/ui/extension/build_context_extension.dart';
Expand All @@ -10,14 +12,15 @@ import 'dart:io';
import 'package:flutter/cupertino.dart';

class AppDrawer extends StackedView<AppDrawerModel> {
const AppDrawer({super.key});
AppDrawer({super.key});

@override
AppDrawerModel viewModelBuilder(
BuildContext context,
) =>
AppDrawerModel();

final _logger = getLogger('AppDrawer');
@override
Widget builder(
BuildContext context,
Expand Down Expand Up @@ -99,6 +102,36 @@ class AppDrawer extends StackedView<AppDrawerModel> {
),
SizedBox(height: 10.h),
Divider(thickness: 15.w, color: context.palette?.gray1),
ListTile(
leading: Icon(Icons.translate),
title: DropdownButton(
padding: EdgeInsets.all(20),
isExpanded: true,
borderRadius: BorderRadius.all(Radius.circular(10)),
value: viewModel.selectedLanguage,
items: Languages.values
.map(
(language) => DropdownMenuItem(
value: language,
child: Text(language.name.toUpperCase()),
),
)
.toList(),
onChanged: (value) {
if (value == null) return;
_logger.i(value);

final subtag = value.name.substring(0, 2);
S.load(
Locale.fromSubtags(
languageCode: subtag,
),
); //Load the current locale using the subtag
viewModel.toggleLanguage(value);
},
),
),
Divider(thickness: 15.w, color: context.palette?.gray1),
Spacer(),
Divider(
thickness: 10.w,
Expand Down
16 changes: 14 additions & 2 deletions lib/ui/widgets/common/app_drawer/app_drawer_model.dart
Original file line number Diff line number Diff line change
@@ -1,21 +1,33 @@
import 'package:receipe_app/app/app.router.dart';
import 'package:receipe_app/data_model/user.dart';
import 'package:receipe_app/enums/languages.dart';
import 'package:receipe_app/services/localization_service.dart';
import 'package:receipe_app/services/secure_storage_service.dart';
import 'package:receipe_app/services/user_service.dart';
import 'package:stacked/stacked.dart';
import 'package:receipe_app/app/app.locator.dart';
import 'package:receipe_app/app/app.logger.dart';

import 'package:stacked_services/stacked_services.dart';

class AppDrawerModel extends ReactiveViewModel {
final _navigationService = locator<NavigationService>();
final _userService = locator<UserService>();
final _secureStorageService = locator<SecureStorageService>();
final _localizationService = locator<LocalizationService>();

final _logger = getLogger('App_Drawer ViewModel');

User? get user => _userService.user;

final _logger = getLogger('App_Drawer');
Languages get selectedLanguage => _localizationService.selectedLocale;

//toggle and refresh Language dropdown
void toggleLanguage(Languages value) {
_logger.i(value);

_localizationService.assignLocale(value);
rebuildUi();
}

void navigateToHome() {
_logger.i("go back");
Expand Down
Loading