import 'dart:ui'; import 'package:core/services/localization.service.dart'; import 'package:core/services/service.base.dart'; import 'package:core/services/session.service.dart'; import 'package:core/services/translation.service.dart'; import 'package:core/utils/index.dart'; import 'package:dev_app/models/translation.state.dart'; import 'package:get/get.dart'; import 'package:rxdart/rxdart.dart'; import 'package:flutter/services.dart' show rootBundle; import 'dart:convert' show jsonDecode; class TranslationResService extends ServiceBase implements TranslationService { TranslationResService(super.injector); final InternalStore _store = InternalStore(state: TranslationState()); SessionService get _sessionService => resolve(); LocalizationService get _localizationService => resolve(); @override void onInit() { super.onInit(); _initTranslations(); } void _initTranslations() { var translation$ = _store.sliceState((state) => state); translation$.listen((state) async { //Get.clearTranslations(); if (state.translations.isEmpty) return; Get.appendTranslations(state.translations); await Get.updateLocale(Locale.fromSubtags(languageCode: state.language!)); }); _store.patch((state) { state.translations = _localizationService.getResources(); }); _sessionService.onLanguageChange$() .whereNotNull() .switchMap((language) => Stream.fromFuture(_mapTranslationsMap(language))) .listen(_store.set); } Future _mapTranslationsMap(String language) async { Map> translationsMap = {}; var filePath = 'res/translations/$language.json'; var content = await rootBundle.loadString(filePath); var translationsObject = jsonDecode(content) as Map; translationsMap.putIfAbsent( language, () => translationsObject.map((key, value) => MapEntry(key, value)) ); return TranslationState( language: language, translations: translationsMap, ); } @override Map> getResources() { return _store.state.translations; } }