ajout de la localization

pull/112/head^2
Tim LEVADOUX 2 years ago
parent a43ccca81f
commit c53e74a50e

@ -0,0 +1,31 @@
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
class LanguageTranslation {
late Locale locale;
static Map<dynamic, dynamic> _localizedValues = {};
LanguageTranslation(this.locale) {
_localizedValues = {};
}
static LanguageTranslation? of(BuildContext context) {
return Localizations.of<LanguageTranslation>(context, LanguageTranslation);
}
String text(String key) {
return _localizedValues[key] ?? '** $key not found';
}
static Future<LanguageTranslation> load(Locale locale) async {
LanguageTranslation translations = LanguageTranslation(locale);
String jsonContent =
await rootBundle.loadString("locales/i18n_${locale.languageCode}.json");
_localizedValues = json.decode(jsonContent);
return translations;
}
get currentLanguage => locale.languageCode;
}

@ -0,0 +1,17 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'translation.dart';
class TranslationsDelegate extends LocalizationsDelegate<LanguageTranslation> {
const TranslationsDelegate();
@override
bool isSupported(Locale locale) => ['en', 'ar'].contains(locale.languageCode);
@override
Future<LanguageTranslation> load(Locale locale) =>
LanguageTranslation.load(locale);
@override
bool shouldReload(TranslationsDelegate old) => false;
}

@ -5,6 +5,9 @@ import 'Classes/config.dart';
import 'Classes/account.dart';
import 'Classes/localization/translation_delegate.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
void main() {
runApp(MultiProvider(providers: [
ChangeNotifierProvider(
@ -19,9 +22,28 @@ class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return const MaterialApp(
return MaterialApp(
debugShowCheckedModeBanner: false,
home: LoginPage(),
localizationsDelegates: const [
TranslationsDelegate(),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: const [
Locale('en', ''),
Locale('fr', ''),
Locale('pt', ''),
],
localeResolutionCallback: (locale, supportedLocales) {
for (var supportedLocaleLanguage in supportedLocales) {
if (supportedLocaleLanguage.languageCode == locale!.languageCode &&
supportedLocaleLanguage.countryCode == locale.countryCode) {
return supportedLocaleLanguage;
}
}
return supportedLocales.first;
},
home: const LoginPage(),
);
}
}

@ -1,11 +1,13 @@
import 'package:flutter/material.dart';
import 'package:test/Classes/account.dart';
import 'package:test/Classes/config.dart';
import 'package:test/Classes/localization/translation.dart';
import 'package:test/ui/add_password_page.dart';
import 'package:test/ui/widget/password_widget.dart';
import 'package:test/ui/widget/page_title_widget.dart';
import 'package:provider/provider.dart';
import '../Classes/localization/translation.dart';
import '../Classes/localization/translation_delegate.dart';
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
@ -39,7 +41,9 @@ class _HomePageState extends State<HomePage> {
padding: EdgeInsets.all(w * 0.04),
child: Row(
children: [
const PageTitleW(title: "Home"),
PageTitleW(
title:
LanguageTranslation.of(context)!.text('home_title')),
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
@ -89,14 +93,15 @@ class _HomePageState extends State<HomePage> {
style: const TextStyle(color: Colors.white),
cursorColor: Colors.white,
controller: searchCtrl,
decoration: const InputDecoration(
prefixIcon: Icon(
decoration: InputDecoration(
prefixIcon: const Icon(
Icons.search,
color: Colors.white,
),
border: InputBorder.none,
hintText: 'Search',
hintStyle: TextStyle(color: Colors.white),
hintText:
LanguageTranslation.of(context)!.text('search'),
hintStyle: const TextStyle(color: Colors.white),
),
),
),

@ -0,0 +1,43 @@
import 'package:flutter/material.dart';
import '../../Classes/localization/translation.dart';
languageSelector(BuildContext context) {
// set up the button
// set up the AlertDialog
AlertDialog alert = AlertDialog(
title: const Text("Choisissez une langue"),
actions: [
InkWell(
onTap: () {
LanguageTranslation.load(const Locale("fr"));
Navigator.pop(context);
},
child: const Text("FR"),
),
InkWell(
onTap: () {
LanguageTranslation.load(const Locale("en"));
Navigator.pop(context);
},
child: const Text("EN"),
),
InkWell(
onTap: () {
LanguageTranslation.load(const Locale("pt"));
Navigator.pop(context);
},
child: const Text("PT"),
),
],
);
// show the dialog
showDialog(
context: context,
builder: (BuildContext context) {
return alert;
},
);
}

@ -2,6 +2,8 @@ import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test/Classes/account.dart';
import 'package:test/Classes/localization/translation.dart';
import 'package:test/ui/popup/language_popup.dart';
import 'package:test/ui/qrcode/qrcode_password.dart';
import 'package:test/ui/widget/settingwidget/share_widget.dart';
import 'package:test/ui/widget/page_title_widget.dart';
@ -165,9 +167,11 @@ class _SettingThemePage extends State<SettingThemePage> {
child: Row(children: [
Expanded(
child: InkWell(
onTap: () {
//envoie de l'email
},
onTap: (() {
setState(() {
languageSelector(context);
});
}),
child: Padding(
padding: EdgeInsets.all(h * 0.02),
child: Row(children: [

@ -0,0 +1,4 @@
{
"home_title" : "Home",
"search" : "search"
}

@ -0,0 +1,4 @@
{
"home_title" : "Accueil",
"search" : "rechercher"
}

@ -0,0 +1,4 @@
{
"home_title" : "Inicio",
"search" : "busca"
}

@ -58,6 +58,8 @@ dependencies:
ai_barcode_scanner: ^0.0.3
share_plus: ^6.3.0
file_picker: ^5.2.3
flutter_localizations:
sdk: flutter
flutter_icons:
android: "launcher_icon"
@ -82,11 +84,13 @@ dev_dependencies:
flutter:
assets:
- assets/
- locales/
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
generate: true
# To add assets to your application, add an assets section, like this:
# assets:

Loading…
Cancel
Save