import 'dart:convert'; import 'dart:ui'; import 'package:aitrainer_app/service/logging.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; class AppLocalizations with Logging { Locale locale; bool isTest; AppLocalizations(this.locale, {this.isTest = false}); // Helper method to keep the code in the widgets concise // Localizations are accessed using an InheritedWidget "of" syntax static AppLocalizations of(BuildContext context) { return Localizations.of(context, AppLocalizations); } // Static member to have a simple access to the delegate from the MaterialApp static const LocalizationsDelegate delegate = AppLocalizationsDelegate(); Map _localizedStrings; setLocale(Locale locale) { this.locale = locale; } Future load() async { // Load the language JSON file from the "lang" folder log(" -- load language pieces " + locale.languageCode); String jsonString = await rootBundle.loadString('i18n/${locale.languageCode}.json'); Map jsonMap = json.decode(jsonString); _localizedStrings = jsonMap.map((key, value) { return MapEntry(key, value.toString()); }); return true; } Future loadTest(Locale locale) async { return AppLocalizations(locale); } // This method will be called from every widget which needs a localized text String translate(String key) { if (isTest) return key; String translated = _localizedStrings[key]; return translated != null ? translated : key; } } class AppLocalizationsDelegate extends LocalizationsDelegate { final bool isTest; // This delegate instance will never change (it doesn't even have fields!) // It can provide a constant constructor. const AppLocalizationsDelegate({this.isTest = false}); @override bool isSupported(Locale locale) { // Include all of your supported language codes here return ['en', 'hu'].contains(locale.languageCode); } @override Future load(Locale locale) async { // AppLocalizations class is where the JSON loading actually runs AppLocalizations localizations = new AppLocalizations(locale, isTest: this.isTest); if (isTest) { await localizations.loadTest(locale); } else { await localizations.load(); } return localizations; } @override bool shouldReload(AppLocalizationsDelegate old) => false; }