FSX-Translate/lib/manager/translate.dart
2024-08-19 15:11:49 +08:00

115 lines
3.1 KiB
Dart

import 'dart:convert';
import 'dart:math';
import 'dart:ui';
import 'package:devicelocale/devicelocale.dart';
import 'package:flutter/services.dart';
import 'package:flutter_translate/common/components/common_language_selector.dart';
import 'package:flutter_translate/common/utils/number_utils.dart';
import 'package:flutter_translate/generated/assets.dart';
import 'package:flutter_translate/model/language_model.dart';
import 'package:flutter_translate/pages/home/home_controller.dart';
import 'package:get/get.dart';
class Translate {
Translate._();
factory Translate() {
return _instance;
}
static final Translate _instance = Translate._();
/// 支持翻译的所有语言
var languageList = <LanguageModel>[].obs;
/// 是否选择的源语言
var isSelectFromLanguage = true.obs;
/// 源语言
var fromLanguageEntity = LanguageModel(
code: 'zh-cn',
name: 'Chinese (Simplified)',
).obs;
/// 目标语言
var toLanguageEntity = LanguageModel(
code: 'en',
name: 'English',
).obs;
Future<void> init() async {
var data = jsonDecode(await rootBundle.loadString(Assets.jsonLanguage));
if (data != null && data is List) {
languageList.value = data.map((e) => LanguageModel.fromMap(e)).toList();
}
List<Locale> languages = await Devicelocale.preferredLanguagesAsLocales;
if (languages.isNotEmpty) {
List<dynamic> list = data.map((e) => LanguageModel.fromMap(e)).toList();
var languageEntity = list
.firstWhereOrNull((e) => e.code.contains(languages[0].languageCode));
if (languageEntity != null) {
fromLanguageEntity.value = languageEntity;
}
if (toLanguageEntity.value.code == fromLanguageEntity.value.code) {
int index = list.indexWhere(
(element) => element.code == toLanguageEntity.value.code);
var num =
NumberUtils.getRandomNumberExcludingCurrent(0, list.length, index);
toLanguageEntity.value = list[num];
}
}
}
void languageConvert() async {
var code = toLanguageEntity.value.code;
var name = toLanguageEntity.value.name;
toLanguageEntity.update((fn) {
fn?.code = fromLanguageEntity.value.code;
fn?.name = fromLanguageEntity.value.name;
});
fromLanguageEntity.update((fn) {
fn?.code = code;
fn?.name = name;
});
if (Get.isRegistered<HomeController>()) {
HomeController.to.initData();
}
}
void changeLanguage(LanguageModel item) {
if (isSelectFromLanguage.value) {
fromLanguageEntity.update((fn) {
fn?.code = item.code;
fn?.name = item.name;
});
} else {
toLanguageEntity.update((fn) {
fn?.code = item.code;
fn?.name = item.name;
});
}
if (Get.isRegistered<HomeController>()) {
HomeController.to.initData();
}
}
void languageChangeBottomSheet(bool isFrom) {
isSelectFromLanguage.value = isFrom;
Get.bottomSheet(
isScrollControlled: true,
const CommonLanguageSelector(),
);
}
void changeSelectLanguage(bool isFrom) {
isSelectFromLanguage.value = isFrom;
}
}