From d3921231b3c4e69313ab5dc49655eda18675806c Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sun, 6 Jul 2025 12:58:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(translation):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=8E=86=E5=8F=B2=E6=8C=89=E9=92=AE=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AF=A6=E6=83=85=E9=A1=B5=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在翻译页面添加历史记录按钮,支持查看翻译历史 - 重构翻译详情页的会话项样式,改进视觉层次和交互 - 启用火山AI服务依赖注入 - 更新测试标记日期为0707 - 优化超时错误提示信息 --- lib/core/bindings/initial_binding.dart | 3 +- lib/modules/settings/views/settings_view.dart | 2 +- .../translation_detail_controller.dart | 8 +- .../views/translation_detail_view.dart | 122 +++++++++--------- .../translation/views/translation_view.dart | 13 ++ 5 files changed, 79 insertions(+), 69 deletions(-) diff --git a/lib/core/bindings/initial_binding.dart b/lib/core/bindings/initial_binding.dart index b916bc88d..d532f449e 100644 --- a/lib/core/bindings/initial_binding.dart +++ b/lib/core/bindings/initial_binding.dart @@ -4,6 +4,7 @@ import 'package:deep_voice/data/services/navigation_manager.dart'; import 'package:get/get.dart'; import '../../data/services/speech_factory.dart'; import '../../data/services/volcano_translation_service.dart'; +import '../../data/services/volcano_ai_service.dart'; import '../../data/services/language_manager.dart'; import '../../core/utils/logger.dart'; import '../../data/services/bluetooth_manager.dart'; @@ -40,7 +41,7 @@ class InitialBinding extends Bindings { Get.lazyPut(() => NavigationManager(), fenix: true); Get.lazyPut(() => LocationManager(), fenix: true); // 火山AI服务 - // Get.lazyPut(() => VolcanoAIService(), fenix: true); + Get.lazyPut(() => VolcanoAIService(), fenix: true); // 账号管理服务 Get.lazyPut(() => AccountService(), fenix: true); diff --git a/lib/modules/settings/views/settings_view.dart b/lib/modules/settings/views/settings_view.dart index 7c69a9216..d8c0976b2 100644 --- a/lib/modules/settings/views/settings_view.dart +++ b/lib/modules/settings/views/settings_view.dart @@ -841,7 +841,7 @@ class SettingsView extends GetView { //------------测试使用标记 start---------------// SizedBox(height: 4.h), Text( - '${Platform.operatingSystem}-test-0626', + '${Platform.operatingSystem}-test-0707', style: TextStyle( fontSize: 12.sp, color: const Color.fromARGB(255, 143, 94, 94), diff --git a/lib/modules/translation/controllers/translation_detail_controller.dart b/lib/modules/translation/controllers/translation_detail_controller.dart index 78f284cee..f2f469041 100644 --- a/lib/modules/translation/controllers/translation_detail_controller.dart +++ b/lib/modules/translation/controllers/translation_detail_controller.dart @@ -50,7 +50,7 @@ class TranslationDetailController extends GetxController { // 异步初始化方法 Future _asyncInitialize() async { isLoading.value = true; - + try { // 使用 Future.microtask 将操作放到后台线程 await Future.microtask(() { @@ -116,13 +116,13 @@ class TranslationDetailController extends GetxController { Future extractSummary(String text) async { return _extractSummaryInternal(text, _defaultTimeoutDuration); } - + // 内部摘要提取方法,避免代码重复 Future _extractSummaryInternal(String text, int timeoutDuration) async { if (text.isEmpty) { return '无法生成摘要:文本为空'; } - + isGeneratingSummary.value = true; try { @@ -155,7 +155,7 @@ class TranslationDetailController extends GetxController { messages: messages, systemPrompt: systemPrompt, ).timeout(Duration(seconds: timeoutDuration), onTimeout: () { - throw TimeoutException('请求超时,请稍后重试'); + throw TimeoutException('请求超时', Duration(seconds: timeoutDuration)); }); } on TimeoutException catch (_) { final timeoutMessage = timeoutDuration == _defaultTimeoutDuration diff --git a/lib/modules/translation/views/translation_detail_view.dart b/lib/modules/translation/views/translation_detail_view.dart index 9e94ecbdf..5b988b5c5 100644 --- a/lib/modules/translation/views/translation_detail_view.dart +++ b/lib/modules/translation/views/translation_detail_view.dart @@ -210,85 +210,81 @@ class TranslationDetailView extends GetView { // 构建会话详情中的翻译项 Widget _buildSessionItemWidget(TranslationItem item, bool isDarkMode) { + final context = Get.context!; return Container( - width: double.infinity, - margin: EdgeInsets.only(bottom: 16.h), + margin: const EdgeInsets.only(bottom: 8), + padding: const EdgeInsets.all(12), decoration: BoxDecoration( - color: isDarkMode ? AppColors.cardBackground : Colors.white, - borderRadius: BorderRadius.circular(16.r), - boxShadow: [ - BoxShadow( - color: Colors.black.withAlpha(isDarkMode ? 30 : 8), - blurRadius: 8, - offset: Offset(0, 2), - ), - ], + color: item.isIntermediate + ? Colors.grey.withOpacity(0.1) // 中间结果使用浅灰色底色 + : (item.sourceLanguageCode == controller.currentItem.sourceLanguageCode + ? Theme.of(context) + .colorScheme + .primary + .withOpacity(0.08) // 源语言匹配时使用主题色底色 + : Theme.of(context) + .colorScheme + .secondary + .withOpacity(0.08)), // 否则使用次要色底色 + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: item.isIntermediate + ? Colors.grey.withOpacity(0.2) + : Colors.transparent, + width: 1, + ), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - // 源文本部分 - Padding( - padding: EdgeInsets.fromLTRB(20.r, 20.r, 20.r, 10.r), - child: Text( - item.sourceText, + // 源文本 + Text( + item.sourceText, + style: TextStyle( + fontSize: 16, + color: Theme.of(context).textTheme.bodyLarge?.color, + ), + ), + if (item.translatedText.isNotEmpty) ...[ + const SizedBox(height: 8), + // 翻译文本 + Text( + item.translatedText, style: TextStyle( - fontSize: 15.sp, - color: isDarkMode ? Colors.white : Colors.black, + fontSize: 16, + color: Theme.of(context).textTheme.bodyMedium?.color, fontWeight: FontWeight.w500, ), ), - ), - // 翻译文本部分 - Padding( - padding: EdgeInsets.fromLTRB(20.r, 10.r, 20.r, 16.r), - child: Row( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Expanded( - child: Text( - item.translatedText, - style: TextStyle( - fontSize: 14.sp, - color: isDarkMode ? Colors.grey[400] : Colors.grey[700], - fontWeight: FontWeight.normal, - ), + ], + // 语言信息和播放按钮 + const SizedBox(height: 4), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${item.sourceLanguageName.tr} → ${item.targetLanguageName.tr}', + style: TextStyle( + fontSize: 12, + color: Theme.of(context).textTheme.bodySmall?.color, + ), + ), + if (!item.isIntermediate) + GestureDetector( + onTap: () => controller.playTranslationItem(item), + child: Icon( + Icons.volume_up, + size: 20, + color: Theme.of(context).colorScheme.primary, ), ), - SizedBox(width: 12.w), - _buildPlayButton(() => controller.playTranslationItem(item), isDarkMode), - ], - ), + ], ), ], ), ); } - - // 构建播放按钮 - Widget _buildPlayButton(VoidCallback onTap, bool isDarkMode) { - return Material( - color: Colors.transparent, - child: InkWell( - onTap: onTap, - borderRadius: BorderRadius.circular(20.r), - splashColor: isDarkMode ? AppColors.primary.withOpacity(0.2) : Colors.blue.withOpacity(0.2), - child: Container( - width: 28.w, - height: 28.h, - decoration: BoxDecoration( - color: isDarkMode ? AppColors.primary.withAlpha(10) : Colors.blue.withAlpha(10), - shape: BoxShape.circle, - ), - child: Icon( - Icons.volume_up, - color: Colors.white, - size: 16.sp, - ), - ), - ), - ); - } + // 构建总结视图 Widget _buildSummaryWidget(bool isDarkMode) { @@ -598,7 +594,7 @@ class TranslationDetailView extends GetView { // 分享内容方法 void _shareContent() { String shareText = ''; - + if (controller.selectedTabIndex.value == 0) { // 分享原始记录 final String sourceText = _getCombinedSourceText(); diff --git a/lib/modules/translation/views/translation_view.dart b/lib/modules/translation/views/translation_view.dart index e529bd98d..239f5d823 100644 --- a/lib/modules/translation/views/translation_view.dart +++ b/lib/modules/translation/views/translation_view.dart @@ -169,6 +169,19 @@ class TranslationView extends GetView { }, tooltip: '查看录音文件', ), + // 添加历史记录按钮 + IconButton( + icon: Icon( + Icons.history, + color: isDarkMode ? Colors.white : Colors.black, + size: 24.sp, + ), + onPressed: () async { + await controller.stopAll(); + Get.toNamed(Routes.translationHistory); + }, + tooltip: '翻译历史', + ), ], ); }