import 'dart:convert'; import 'dart:ui'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; class AppLocalizations { Locale locale; AppLocalizations(this.locale); // 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 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; } // This method will be called from every widget which needs a localized text String translate(String key) { return _localizedStrings[key]; } } class _AppLocalizationsDelegate extends LocalizationsDelegate { // This delegate instance will never change (it doesn't even have fields!) // It can provide a constant constructor. const _AppLocalizationsDelegate(); @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); await localizations.load(); return localizations; } @override bool shouldReload(_AppLocalizationsDelegate old) => false; }