Browse Source

feat(translation): 添加翻译历史按钮并优化详情页样式

- 在翻译页面添加历史记录按钮,支持查看翻译历史
- 重构翻译详情页的会话项样式,改进视觉层次和交互
- 启用火山AI服务依赖注入
- 更新测试标记日期为0707
- 优化超时错误提示信息
newdev_shunjiawei
lxm 1 year ago
parent
commit
d3921231b3
  1. 3
      lib/core/bindings/initial_binding.dart
  2. 2
      lib/modules/settings/views/settings_view.dart
  3. 8
      lib/modules/translation/controllers/translation_detail_controller.dart
  4. 122
      lib/modules/translation/views/translation_detail_view.dart
  5. 13
      lib/modules/translation/views/translation_view.dart

3
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>(() => NavigationManager(), fenix: true);
Get.lazyPut<LocationManager>(() => LocationManager(), fenix: true);
// 火山AI服务
// Get.lazyPut<VolcanoAIService>(() => VolcanoAIService(), fenix: true);
Get.lazyPut<VolcanoAIService>(() => VolcanoAIService(), fenix: true);
// 账号管理服务
Get.lazyPut<AccountService>(() => AccountService(), fenix: true);

2
lib/modules/settings/views/settings_view.dart

@ -841,7 +841,7 @@ class SettingsView extends GetView<SettingsController> {
//------------测试使用标记 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),

8
lib/modules/translation/controllers/translation_detail_controller.dart

@ -50,7 +50,7 @@ class TranslationDetailController extends GetxController {
// 异步初始化方法
Future<void> _asyncInitialize() async {
isLoading.value = true;
try {
// 使用 Future.microtask 将操作放到后台线程
await Future.microtask(() {
@ -116,13 +116,13 @@ class TranslationDetailController extends GetxController {
Future<String> extractSummary(String text) async {
return _extractSummaryInternal(text, _defaultTimeoutDuration);
}
// 内部摘要提取方法,避免代码重复
Future<String> _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

122
lib/modules/translation/views/translation_detail_view.dart

@ -210,85 +210,81 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
// 构建会话详情中的翻译项
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<TranslationDetailController> {
// 分享内容方法
void _shareContent() {
String shareText = '';
if (controller.selectedTabIndex.value == 0) {
// 分享原始记录
final String sourceText = _getCombinedSourceText();

13
lib/modules/translation/views/translation_view.dart

@ -169,6 +169,19 @@ class TranslationView extends GetView<TranslationController> {
},
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: '翻译历史',
),
],
);
}

Loading…
Cancel
Save