这是基于vue-vben-admin 模板适用于abp Vnext的前端管理项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

74 lines
2.7 KiB

import 'dart:ui';
import 'package:core/services/environment.service.dart';
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<TranslationState> _store = InternalStore<TranslationState>(state: TranslationState());
SessionService get _sessionService => resolve<SessionService>();
EnvironmentService get _environmentService => resolve<EnvironmentService>();
LocalizationService get _localizationService => resolve<LocalizationService>();
@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<TranslationState> _mapTranslationsMap(String language) async {
Map<String, Map<String, String>> translationsMap = {};
var environment = _environmentService.getEnvironment();
var translationFiles = environment.localization.translationFiles?[language] ?? ['$language.json'];
for (var translationFile in translationFiles) {
try {
var filePath = 'res/translations/$translationFile';
var content = await rootBundle.loadString(filePath);
var translationsObject = jsonDecode(content) as Map<String, dynamic>;
var translations = translationsMap[language] ?? {};
translations.addAll(translationsObject.map((key, value) => MapEntry(key, value)));
translationsMap.putIfAbsent(language, () => translations);
} catch (e) {
logger.error(e);
}
}
return TranslationState(
language: language,
translations: translationsMap,
);
}
@override
Map<String, Map<String, String>> getResources() {
return _store.state.translations;
}
}