|
|
@ -10,7 +10,8 @@ import '../../../core/utils/logger.dart'; |
|
|
/// 文本翻译控制器 |
|
|
/// 文本翻译控制器 |
|
|
class TextTranslationController extends GetxController { |
|
|
class TextTranslationController extends GetxController { |
|
|
// 依赖服务 |
|
|
// 依赖服务 |
|
|
final VolcanoTranslationService _translationService = Get.find<VolcanoTranslationService>(); |
|
|
final VolcanoTranslationService _translationService = |
|
|
|
|
|
Get.find<VolcanoTranslationService>(); |
|
|
final LanguageManager _languageManager = Get.find<LanguageManager>(); |
|
|
final LanguageManager _languageManager = Get.find<LanguageManager>(); |
|
|
final GetStorage _storage = GetStorage(); |
|
|
final GetStorage _storage = GetStorage(); |
|
|
|
|
|
|
|
|
@ -47,6 +48,12 @@ class TextTranslationController extends GetxController { |
|
|
/// 初始化翻译服务 |
|
|
/// 初始化翻译服务 |
|
|
Future<void> _initializeTranslationService() async { |
|
|
Future<void> _initializeTranslationService() async { |
|
|
try { |
|
|
try { |
|
|
|
|
|
// 已初始化则跳过 |
|
|
|
|
|
if (_translationService.isInitialized) { |
|
|
|
|
|
Logger.info('翻译服务已初始化'); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
// final initialized = |
|
|
final initialized = await _translationService.initialize(); |
|
|
final initialized = await _translationService.initialize(); |
|
|
if (!initialized) { |
|
|
if (!initialized) { |
|
|
Logger.error('翻译服务初始化失败'); |
|
|
Logger.error('翻译服务初始化失败'); |
|
|
@ -74,22 +81,28 @@ class TextTranslationController extends GetxController { |
|
|
/// 加载保存的语言设置 |
|
|
/// 加载保存的语言设置 |
|
|
void _loadSavedLanguages() { |
|
|
void _loadSavedLanguages() { |
|
|
try { |
|
|
try { |
|
|
final savedSourceLanguage = _storage.read('text_translation_source_language'); |
|
|
final savedSourceLanguage = |
|
|
final savedTargetLanguage = _storage.read('text_translation_target_language'); |
|
|
_storage.read('text_translation_source_language'); |
|
|
|
|
|
final savedTargetLanguage = |
|
|
|
|
|
_storage.read('text_translation_target_language'); |
|
|
|
|
|
|
|
|
if (savedSourceLanguage != null && supportedLanguages.contains(savedSourceLanguage)) { |
|
|
if (savedSourceLanguage != null && |
|
|
|
|
|
supportedLanguages.contains(savedSourceLanguage)) { |
|
|
sourceLanguageChineseName.value = savedSourceLanguage; |
|
|
sourceLanguageChineseName.value = savedSourceLanguage; |
|
|
// 同时更新语言代码 |
|
|
// 同时更新语言代码 |
|
|
final asrCode = _languageManager.getAsrCodeByChineseName(savedSourceLanguage); |
|
|
final asrCode = |
|
|
|
|
|
_languageManager.getAsrCodeByChineseName(savedSourceLanguage); |
|
|
if (asrCode != null) { |
|
|
if (asrCode != null) { |
|
|
sourceLanguageCode.value = asrCode; |
|
|
sourceLanguageCode.value = asrCode; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (savedTargetLanguage != null && supportedLanguages.contains(savedTargetLanguage)) { |
|
|
if (savedTargetLanguage != null && |
|
|
|
|
|
supportedLanguages.contains(savedTargetLanguage)) { |
|
|
targetLanguageChineseName.value = savedTargetLanguage; |
|
|
targetLanguageChineseName.value = savedTargetLanguage; |
|
|
// 同时更新语言代码 |
|
|
// 同时更新语言代码 |
|
|
final asrCode = _languageManager.getAsrCodeByChineseName(savedTargetLanguage); |
|
|
final asrCode = |
|
|
|
|
|
_languageManager.getAsrCodeByChineseName(savedTargetLanguage); |
|
|
if (asrCode != null) { |
|
|
if (asrCode != null) { |
|
|
targetLanguageCode.value = asrCode; |
|
|
targetLanguageCode.value = asrCode; |
|
|
} |
|
|
} |
|
|
@ -102,8 +115,10 @@ class TextTranslationController extends GetxController { |
|
|
/// 保存语言设置 |
|
|
/// 保存语言设置 |
|
|
void _saveLanguageSettings() { |
|
|
void _saveLanguageSettings() { |
|
|
try { |
|
|
try { |
|
|
_storage.write('text_translation_source_language', sourceLanguageChineseName.value); |
|
|
_storage.write( |
|
|
_storage.write('text_translation_target_language', targetLanguageChineseName.value); |
|
|
'text_translation_source_language', sourceLanguageChineseName.value); |
|
|
|
|
|
_storage.write( |
|
|
|
|
|
'text_translation_target_language', targetLanguageChineseName.value); |
|
|
} catch (e) { |
|
|
} catch (e) { |
|
|
Logger.error('保存语言设置失败: $e'); |
|
|
Logger.error('保存语言设置失败: $e'); |
|
|
} |
|
|
} |
|
|
@ -173,20 +188,21 @@ class TextTranslationController extends GetxController { |
|
|
/// 执行翻译 |
|
|
/// 执行翻译 |
|
|
Future<void> translateText() async { |
|
|
Future<void> translateText() async { |
|
|
final text = textController.text.trim(); |
|
|
final text = textController.text.trim(); |
|
|
|
|
|
|
|
|
// 验证输入 |
|
|
// 验证输入 |
|
|
if (text.isEmpty) { |
|
|
if (text.isEmpty) { |
|
|
Get.snackbar( |
|
|
// Get.snackbar( |
|
|
'error'.tr, |
|
|
// 'error'.tr, |
|
|
'pleaseInputText'.tr, |
|
|
// 'pleaseInputText'.tr, |
|
|
snackPosition: SnackPosition.TOP, |
|
|
// snackPosition: SnackPosition.TOP, |
|
|
backgroundColor: Colors.orange.withOpacity(0.9), |
|
|
// backgroundColor: Colors.orange.withOpacity(0.9), |
|
|
colorText: Colors.white, |
|
|
// colorText: Colors.white, |
|
|
); |
|
|
// ); |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (text.length > 1000) { |
|
|
if (text.length > 5000) { |
|
|
|
|
|
// 5000 字符限制 |
|
|
Get.snackbar( |
|
|
Get.snackbar( |
|
|
'error'.tr, |
|
|
'error'.tr, |
|
|
'textTooLong'.tr, |
|
|
'textTooLong'.tr, |
|
|
@ -196,24 +212,29 @@ class TextTranslationController extends GetxController { |
|
|
); |
|
|
); |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 检查源语言和目标语言是否相同 |
|
|
// 检查源语言和目标语言是否相同 |
|
|
if (sourceLanguageChineseName.value == targetLanguageChineseName.value) { |
|
|
if (sourceLanguageChineseName.value == targetLanguageChineseName.value) { |
|
|
translatedText.value = text; |
|
|
translatedText.value = text; |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
isTranslating.value = true; |
|
|
isTranslating.value = true; |
|
|
translatedText.value = ''; |
|
|
translatedText.value = ''; |
|
|
|
|
|
|
|
|
try { |
|
|
try { |
|
|
Logger.info('开始翻译: $text'); |
|
|
Logger.info('开始翻译: $text'); |
|
|
Logger.info('源语言: ${sourceLanguageChineseName.value} -> ${sourceLanguageCode.value}'); |
|
|
Logger.info( |
|
|
Logger.info('目标语言: ${targetLanguageChineseName.value} -> ${targetLanguageCode.value}'); |
|
|
'源语言: ${sourceLanguageChineseName.value} -> ${sourceLanguageCode.value}'); |
|
|
|
|
|
Logger.info( |
|
|
|
|
|
'目标语言: ${targetLanguageChineseName.value} -> ${targetLanguageCode.value}'); |
|
|
|
|
|
|
|
|
// 确保翻译服务已初始化 |
|
|
// 确保翻译服务已初始化 |
|
|
Logger.info('确保翻译服务已初始化...'); |
|
|
Logger.info('确保翻译服务已初始化...'); |
|
|
final initialized = await _translationService.initialize(); |
|
|
bool initialized = _translationService.isInitialized; |
|
|
|
|
|
if (!initialized) { |
|
|
|
|
|
initialized = await _translationService.initialize(); |
|
|
|
|
|
} |
|
|
Logger.info('翻译服务初始化结果: $initialized'); |
|
|
Logger.info('翻译服务初始化结果: $initialized'); |
|
|
if (!initialized) { |
|
|
if (!initialized) { |
|
|
throw Exception('翻译服务初始化失败'); |
|
|
throw Exception('翻译服务初始化失败'); |
|
|
@ -289,7 +310,9 @@ class TextTranslationController extends GetxController { |
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween, |
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween, |
|
|
children: [ |
|
|
children: [ |
|
|
Text( |
|
|
Text( |
|
|
isSourceLanguage ? 'sourceLanguage'.tr : 'targetLanguage'.tr, |
|
|
isSourceLanguage |
|
|
|
|
|
? 'sourceLanguage'.tr |
|
|
|
|
|
: 'targetLanguage'.tr, |
|
|
style: const TextStyle( |
|
|
style: const TextStyle( |
|
|
fontSize: 18, |
|
|
fontSize: 18, |
|
|
fontWeight: FontWeight.bold, |
|
|
fontWeight: FontWeight.bold, |
|
|
@ -311,10 +334,12 @@ class TextTranslationController extends GetxController { |
|
|
final isSelected = isSourceLanguage |
|
|
final isSelected = isSourceLanguage |
|
|
? language == sourceLanguageChineseName.value |
|
|
? language == sourceLanguageChineseName.value |
|
|
: language == targetLanguageChineseName.value; |
|
|
: language == targetLanguageChineseName.value; |
|
|
|
|
|
|
|
|
return ListTile( |
|
|
return ListTile( |
|
|
title: Text(language), |
|
|
title: Text(language), |
|
|
trailing: isSelected ? const Icon(Icons.check, color: Colors.blue) : null, |
|
|
trailing: isSelected |
|
|
|
|
|
? const Icon(Icons.check, color: Colors.blue) |
|
|
|
|
|
: null, |
|
|
onTap: () { |
|
|
onTap: () { |
|
|
if (isSourceLanguage) { |
|
|
if (isSourceLanguage) { |
|
|
setSourceLanguage(language); |
|
|
setSourceLanguage(language); |
|
|
|