79 lines
2.4 KiB
Dart
79 lines
2.4 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:workouttest_util/util/logging.dart';
|
|
import 'package:flutter/cupertino.dart';
|
|
import 'package:flutter/services.dart';
|
|
|
|
class AppLocalizations with Logging {
|
|
late Locale locale;
|
|
bool isTest;
|
|
late Map<String, String> _localizedStrings;
|
|
|
|
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<AppLocalizations>(context, AppLocalizations);
|
|
}
|
|
|
|
// Static member to have a simple access to the delegate from the MaterialApp
|
|
static const LocalizationsDelegate<AppLocalizations> delegate = AppLocalizationsDelegate();
|
|
|
|
setLocale(Locale locale) {
|
|
this.locale = locale;
|
|
}
|
|
|
|
Future<bool> 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<String, dynamic> jsonMap = json.decode(jsonString);
|
|
|
|
_localizedStrings = jsonMap.map((key, value) {
|
|
return MapEntry(key, value.toString());
|
|
});
|
|
|
|
return true;
|
|
}
|
|
|
|
Future<AppLocalizations> 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 ?? key;
|
|
}
|
|
}
|
|
|
|
class AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
|
|
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<AppLocalizations> load(Locale locale) async {
|
|
// AppLocalizations class is where the JSON loading actually runs
|
|
AppLocalizations localizations = AppLocalizations(locale, isTest: isTest);
|
|
if (isTest) {
|
|
await localizations.loadTest(locale);
|
|
} else {
|
|
await localizations.load();
|
|
}
|
|
return localizations;
|
|
}
|
|
|
|
@override
|
|
bool shouldReload(AppLocalizationsDelegate old) => false;
|
|
}
|