i18n compatibilty
parent
66edbf3f38
commit
28cd6e73f4
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"text_description": "مرحبًا ، سيتغير هذا النص وفقًا للغة"
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"text_description": "Hello, this text will change according to the language",
|
||||
"i18n_hello" : "Hello",
|
||||
"i18n_take_pictures" : "Take pictures"
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"i18n_hello": "Bonjour",
|
||||
"i18n_take_pictures" : "Prendre des photos"
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"text_description": "नमस्कार, यह पाठ भाषा के अनुसार बदल जाएगा"
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"text_description": "Halo, teks ini akan berubah menurut bahasanya"
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"text_description": "สวัสดีข้อความนี้จะเปลี่ยนไปตามภาษา"
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"text_description": "Merhaba, bu yazı dile göre değişecek"
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"text_description": "您好,该文字会根据语言而变化"
|
||||
}
|
||||
|
|
@ -11,6 +11,9 @@ PODS:
|
|||
- path_provider_foundation (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- shared_preferences_foundation (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- sqflite (0.0.2):
|
||||
- Flutter
|
||||
- FMDB (>= 2.7.5)
|
||||
|
|
@ -21,6 +24,7 @@ DEPENDENCIES:
|
|||
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
|
||||
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`)
|
||||
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`)
|
||||
- sqflite (from `.symlinks/plugins/sqflite/ios`)
|
||||
|
||||
SPEC REPOS:
|
||||
|
|
@ -37,6 +41,8 @@ EXTERNAL SOURCES:
|
|||
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||
path_provider_foundation:
|
||||
:path: ".symlinks/plugins/path_provider_foundation/ios"
|
||||
shared_preferences_foundation:
|
||||
:path: ".symlinks/plugins/shared_preferences_foundation/ios"
|
||||
sqflite:
|
||||
:path: ".symlinks/plugins/sqflite/ios"
|
||||
|
||||
|
|
@ -46,6 +52,7 @@ SPEC CHECKSUMS:
|
|||
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
|
||||
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e
|
||||
path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9
|
||||
shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472
|
||||
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
|
||||
Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
This is the app localizations for multi language
|
||||
This function is used to change the language
|
||||
We used shared preferences to change a whole language of the apps
|
||||
*/
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
class AppLocalizations {
|
||||
final Locale locale;
|
||||
|
||||
AppLocalizations(this.locale);
|
||||
|
||||
static AppLocalizations? of(BuildContext context) {
|
||||
return Localizations.of<AppLocalizations>(context, AppLocalizations);
|
||||
}
|
||||
|
||||
late Map<String, String> _localizedStrings;
|
||||
|
||||
Future<bool> load() async {
|
||||
// Load the language JSON file from the "lang" folder
|
||||
String jsonString =
|
||||
await rootBundle.loadString('assets/lang/${locale.languageCode}.json');
|
||||
Map<String, dynamic> jsonMap = json.decode(jsonString);
|
||||
|
||||
_localizedStrings = jsonMap.map((key, value) {
|
||||
return MapEntry(key, value.toString());
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// This method will be called from every widget which needs a localized text
|
||||
String? translate(String key) {
|
||||
return _localizedStrings[key];
|
||||
}
|
||||
}
|
||||
|
||||
class AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
|
||||
const AppLocalizationsDelegate();
|
||||
|
||||
@override
|
||||
bool isSupported(Locale locale) {
|
||||
// Include all of your supported language codes here
|
||||
return ['fr', 'en', 'id', 'ar', 'zh', 'hi', 'th', 'tk']
|
||||
.contains(locale.languageCode);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<AppLocalizations> load(Locale locale) async {
|
||||
final SharedPreferences _pref = await SharedPreferences.getInstance();
|
||||
String? lCode = _pref.getString('lCode');
|
||||
String? cCode = _pref.getString('cCode');
|
||||
|
||||
if (lCode == null || cCode == null) {
|
||||
await _pref.setString('lCode', locale.languageCode);
|
||||
await _pref.setString('cCode', locale.countryCode!);
|
||||
} else {
|
||||
locale = Locale(lCode, cCode);
|
||||
}
|
||||
AppLocalizations localizations = new AppLocalizations(locale);
|
||||
await localizations.load();
|
||||
return localizations;
|
||||
}
|
||||
|
||||
@override
|
||||
bool shouldReload(AppLocalizationsDelegate old) => true;
|
||||
}
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
import 'package:mobdr/cubit/language/language_cubit.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
class InitialLanguage extends StatefulWidget {
|
||||
final Widget child;
|
||||
|
||||
const InitialLanguage({required this.child});
|
||||
|
||||
@override
|
||||
_InitialLanguageState createState() => _InitialLanguageState();
|
||||
}
|
||||
|
||||
class _InitialLanguageState extends State<InitialLanguage> {
|
||||
late LanguageCubit _languageCubit;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_languageCubit = BlocProvider.of<LanguageCubit>(context);
|
||||
_getLocale().then((val) {
|
||||
_languageCubit.changeLanguage(val);
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return widget.child;
|
||||
}
|
||||
|
||||
Future<Locale> _getLocale() async {
|
||||
final SharedPreferences _pref = await SharedPreferences.getInstance();
|
||||
String? lCode = _pref.getString('lCode');
|
||||
String? cCode = _pref.getString('cCode');
|
||||
if (lCode == null || cCode == null) {
|
||||
await _pref.setString('lCode', 'fr');
|
||||
await _pref.setString('cCode', 'FR');
|
||||
return Locale('fr', 'FR');
|
||||
} else {
|
||||
return Locale(lCode, cCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
import 'package:bloc/bloc.dart';
|
||||
import 'package:meta/meta.dart';
|
||||
|
||||
part 'language_state.dart';
|
||||
|
||||
class LanguageCubit extends Cubit<LanguageState>{
|
||||
LanguageCubit() : super(LanguageInitial());
|
||||
|
||||
void changeLanguage(locale){
|
||||
emit(ChangeLanguageSuccess(locale));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
part of 'language_cubit.dart';
|
||||
|
||||
@immutable
|
||||
abstract class LanguageState {}
|
||||
|
||||
class LanguageInitial extends LanguageState{}
|
||||
|
||||
class ChangeLanguageSuccess extends LanguageState{
|
||||
final locale;
|
||||
ChangeLanguageSuccess(this.locale);
|
||||
}
|
||||
|
|
@ -4,10 +4,17 @@ import 'dart:ui';
|
|||
|
||||
import 'package:mobdr/config/constant.dart';
|
||||
|
||||
import 'package:mobdr/cubit/language/language_cubit.dart';
|
||||
import 'package:mobdr/cubit/language/app_localizations.dart';
|
||||
import 'package:mobdr/cubit/language/initial_language.dart';
|
||||
|
||||
import 'package:mobdr/ui/splash_screen.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||
|
||||
void main() {
|
||||
// this function makes application always run in portrait mode
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
|
|
@ -31,18 +38,61 @@ class MyApp extends StatelessWidget {
|
|||
// This widget is the root of your application.
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialApp(
|
||||
scrollBehavior: MyCustomScrollBehavior(),
|
||||
title: APP_NAME,
|
||||
debugShowCheckedModeBanner: false,
|
||||
theme: ThemeData(
|
||||
visualDensity: VisualDensity.adaptivePlatformDensity,
|
||||
pageTransitionsTheme: PageTransitionsTheme(builders: {
|
||||
TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
|
||||
TargetPlatform.android: ZoomPageTransitionsBuilder(),
|
||||
// Initialize all bloc provider used on this entire application here
|
||||
return MultiBlocProvider(
|
||||
providers: [
|
||||
// this bloc used for feature - change language
|
||||
BlocProvider<LanguageCubit>(
|
||||
create: (BuildContext context) => LanguageCubit(),
|
||||
),
|
||||
],
|
||||
// if you want to change default language, go to lib/ui/feature/multi_language/initial_language.dart and change en US to your default language
|
||||
child: InitialLanguage(
|
||||
child: BlocBuilder<LanguageCubit, LanguageState>(
|
||||
builder: (context, state) {
|
||||
return MaterialApp(
|
||||
scrollBehavior: MyCustomScrollBehavior(),
|
||||
title: APP_NAME,
|
||||
debugShowCheckedModeBanner: false,
|
||||
theme: ThemeData(
|
||||
visualDensity: VisualDensity.adaptivePlatformDensity,
|
||||
pageTransitionsTheme: PageTransitionsTheme(builders: {
|
||||
/*
|
||||
Below is the example to change MaterialPageRoute default transition in iOS and Android :
|
||||
FadeUpwardsPageTransitionsBuilder() <= Default MaterialPageRoute Transition
|
||||
OpenUpwardsPageTransitionsBuilder()
|
||||
ZoomPageTransitionsBuilder()
|
||||
CupertinoPageTransitionsBuilder()
|
||||
*/
|
||||
TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
|
||||
TargetPlatform.android: ZoomPageTransitionsBuilder(),
|
||||
}),
|
||||
),
|
||||
// below is used for language feature
|
||||
supportedLocales: [
|
||||
Locale('fr', 'FR'),
|
||||
Locale('en', 'US'),
|
||||
Locale('id', 'ID'),
|
||||
Locale('ar', 'DZ'),
|
||||
Locale('zh', 'HK'),
|
||||
Locale('hi', 'IN'),
|
||||
Locale('th', 'TH'),
|
||||
Locale('tk', 'TK'),
|
||||
],
|
||||
// These delegates make sure that the localization data for the proper language is loaded
|
||||
localizationsDelegates: [
|
||||
AppLocalizationsDelegate(),
|
||||
GlobalMaterialLocalizations.delegate,
|
||||
GlobalWidgetsLocalizations.delegate
|
||||
],
|
||||
// Returns a locale which will be used by the app
|
||||
locale: (state is ChangeLanguageSuccess)
|
||||
? state.locale
|
||||
: Locale('fr', 'FR'),
|
||||
home: SplashScreenPage(),
|
||||
);
|
||||
}),
|
||||
),
|
||||
home: SplashScreenPage(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,9 @@ we used AutomaticKeepAliveClientMixin to keep the state when moving from 1 navba
|
|||
*/
|
||||
|
||||
import 'package:mobdr/config/constant.dart';
|
||||
import 'package:mobdr/cubit/language/language_cubit.dart';
|
||||
import 'package:mobdr/cubit/language/app_localizations.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:mobdr/config/global_style.dart';
|
||||
import 'package:mobdr/model/wishlist_model.dart';
|
||||
import 'package:mobdr/ui/general/chat_us.dart';
|
||||
|
|
@ -12,7 +15,7 @@ import 'package:mobdr/ui/general/product_detail/product_detail.dart';
|
|||
import 'package:mobdr/ui/reusable/reusable_widget.dart';
|
||||
import 'package:mobdr/ui/reusable/cache_image_network.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
class TabHomePage extends StatefulWidget {
|
||||
@override
|
||||
|
|
@ -31,8 +34,18 @@ class _TabHomePageState extends State<TabHomePage>
|
|||
@override
|
||||
bool get wantKeepAlive => true;
|
||||
|
||||
String defaultLang = 'en';
|
||||
|
||||
late LanguageCubit _languageCubit;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_languageCubit = BlocProvider.of<LanguageCubit>(context);
|
||||
_getLocale().then((val) {
|
||||
setState(() {
|
||||
defaultLang = val!;
|
||||
});
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
||||
|
|
@ -41,6 +54,20 @@ class _TabHomePageState extends State<TabHomePage>
|
|||
super.dispose();
|
||||
}
|
||||
|
||||
Future<String?> _getLocale() async {
|
||||
final SharedPreferences _pref = await SharedPreferences.getInstance();
|
||||
String? lCode = _pref.getString('lCode');
|
||||
return lCode;
|
||||
}
|
||||
|
||||
void changeLocale(Locale locale) async {
|
||||
final SharedPreferences _pref = await SharedPreferences.getInstance();
|
||||
await _pref.setString('lCode', locale.languageCode);
|
||||
await _pref.setString('cCode', locale.countryCode!);
|
||||
_languageCubit.changeLanguage(locale);
|
||||
defaultLang = locale.languageCode;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// if we used AutomaticKeepAliveClientMixin, we must call super.build(context);
|
||||
|
|
@ -51,7 +78,8 @@ class _TabHomePageState extends State<TabHomePage>
|
|||
automaticallyImplyLeading: false,
|
||||
elevation: GlobalStyle.appBarElevation,
|
||||
title: Text(
|
||||
'Bonjour, Frédérik',
|
||||
AppLocalizations.of(context)!.translate('i18n_hello')! +
|
||||
', Frédérik',
|
||||
style: GlobalStyle.appBarTitle,
|
||||
),
|
||||
backgroundColor: GlobalStyle.appBarBackgroundColor,
|
||||
|
|
@ -242,7 +270,8 @@ class _TabHomePageState extends State<TabHomePage>
|
|||
BorderSide(color: SOFT_BLUE, width: 1.0),
|
||||
)),
|
||||
child: Text(
|
||||
'Prendre des photos',
|
||||
AppLocalizations.of(context)!
|
||||
.translate('i18n_take_pictures')!,
|
||||
style: TextStyle(
|
||||
color: SOFT_BLUE,
|
||||
fontWeight: FontWeight.bold,
|
||||
|
|
|
|||
|
|
@ -7,10 +7,12 @@ import Foundation
|
|||
|
||||
import package_info_plus
|
||||
import path_provider_foundation
|
||||
import shared_preferences_foundation
|
||||
import sqflite
|
||||
|
||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||
FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin"))
|
||||
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
||||
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
|
||||
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
|
||||
}
|
||||
|
|
|
|||
93
pubspec.lock
93
pubspec.lock
|
|
@ -9,6 +9,14 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.10.0"
|
||||
bloc:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: bloc
|
||||
sha256: "658a5ae59edcf1e58aac98b000a71c762ad8f46f1394c34a52050cafb3e11a80"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.1.1"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -126,6 +134,14 @@ packages:
|
|||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_bloc:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_bloc
|
||||
sha256: "434951eea948dbe87f737b674281465f610b8259c16c097b8163ce138749a775"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.1.2"
|
||||
flutter_blurhash:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -150,6 +166,11 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.0-alpha.6"
|
||||
flutter_localizations:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
|
|
@ -232,6 +253,14 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.8.0"
|
||||
nested:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: nested
|
||||
sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
numerus:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -352,6 +381,14 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.2.4"
|
||||
provider:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: provider
|
||||
sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.5"
|
||||
rxdart:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
@ -360,6 +397,62 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.27.7"
|
||||
shared_preferences:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: shared_preferences
|
||||
sha256: "5949029e70abe87f75cfe59d17bf5c397619c4b74a099b10116baeb34786fad9"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.17"
|
||||
shared_preferences_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_android
|
||||
sha256: a51a4f9375097f94df1c6e0a49c0374440d31ab026b59d58a7e7660675879db4
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.16"
|
||||
shared_preferences_foundation:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_foundation
|
||||
sha256: "6b84fdf06b32bb336f972d373cd38b63734f3461ba56ac2ba01b56d052796259"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
shared_preferences_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_linux
|
||||
sha256: d7fb71e6e20cd3dfffcc823a28da3539b392e53ed5fc5c2b90b55fdaa8a7e8fa
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
shared_preferences_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_platform_interface
|
||||
sha256: "824bfd02713e37603b2bdade0842e47d56e7db32b1dcdd1cae533fb88e2913fc"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
shared_preferences_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_web
|
||||
sha256: "6737b757e49ba93de2a233df229d0b6a87728cea1684da828cbc718b65dcf9d7"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.5"
|
||||
shared_preferences_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_windows
|
||||
sha256: bd014168e8484837c39ef21065b78f305810ceabc1d4f90be6e3b392ce81b46d
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
sky_engine:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
|
|
|
|||
18
pubspec.yaml
18
pubspec.yaml
|
|
@ -31,16 +31,23 @@ dependencies:
|
|||
flutter:
|
||||
sdk: flutter
|
||||
|
||||
flutter_localizations:
|
||||
sdk: flutter
|
||||
|
||||
# The following adds the Cupertino Icons font to your application.
|
||||
# Use with the CupertinoIcons class for iOS style icons.
|
||||
cupertino_icons: 1.0.5
|
||||
fluttertoast: 8.1.3
|
||||
package_info_plus: 3.0.3
|
||||
flutter_bloc: 8.1.2
|
||||
flutter_html: 3.0.0-alpha.6
|
||||
|
||||
#https://pub.dev/packages/intl
|
||||
intl: 0.17.0
|
||||
|
||||
carousel_slider: 4.2.1
|
||||
cached_network_image: 3.2.3
|
||||
shared_preferences: 2.0.17
|
||||
universal_io: 2.2.0
|
||||
|
||||
dev_dependencies:
|
||||
|
|
@ -107,4 +114,13 @@ flutter:
|
|||
- assets/images/mastercard.png
|
||||
- assets/images/logo.png
|
||||
- assets/images/logo_dark.png
|
||||
- assets/images/onboarding/search_product.gif
|
||||
- assets/images/onboarding/search_product.gif
|
||||
|
||||
- assets/lang/fr.json
|
||||
- assets/lang/en.json
|
||||
- assets/lang/id.json
|
||||
- assets/lang/ar.json
|
||||
- assets/lang/zh.json
|
||||
- assets/lang/hi.json
|
||||
- assets/lang/th.json
|
||||
- assets/lang/tk.json
|
||||
Loading…
Reference in New Issue