Browse Source

refactor(translation): 将硬编码文本替换为国际化翻译键

- 修改翻译历史、详情、列表和主视图中的硬编码文本为对应的翻译键
- 在中文翻译文件中添加缺失的翻译项
- 统一使用国际化方案管理界面文本
weicu
lxm 1 year ago
parent
commit
43232d11c7
  1. 47
      lib/core/translations/language/zh_cn.dart
  2. 40
      lib/modules/translation/views/translation_detail_view.dart
  3. 8
      lib/modules/translation/views/translation_history_view.dart
  4. 28
      lib/modules/translation/views/translation_list_view.dart
  5. 10
      lib/modules/translation/views/translation_view.dart

47
lib/core/translations/language/zh_cn.dart

@ -364,11 +364,54 @@ const Map<String, String> zhCN = {
"healthAdvisorWelcome": "您好,我是吴小江,很高兴能为您提供多功能AI聊天。我将用专业知识帮助您。请问有什么问题想咨询吗?", "healthAdvisorWelcome": "您好,我是吴小江,很高兴能为您提供多功能AI聊天。我将用专业知识帮助您。请问有什么问题想咨询吗?",
"healthAdvisorVoiceWelcome": "我在这里!", "healthAdvisorVoiceWelcome": "我在这里!",
// 翻译历史 // 翻译模块
// 翻译主页 (translation_view.dart)
"translationHistory": "翻译历史",
"enableRecording": "是否开启录音",
"viewAudioFiles": "查看录音文件",
"headsetUser": "耳机用户",
"phoneUser": "手机用户",
// 翻译历史页 (translation_history_view.dart)
"noTranslationHistory": "暂无历史记录", "noTranslationHistory": "暂无历史记录",
"clearHistory": "清除历史记录", "clearHistory": "清除历史记录",
"clearHistoryConfirm": "确定要清除所有翻译历史记录吗?此操作无法撤销。", "clearHistoryConfirm": "确定要清除所有翻译历史记录吗?此操作无法撤销。",
"translationHistory": "翻译历史", "unknownLanguage": "未知语言",
"deleteSessionRecord": "删除会话记录",
"deleteSessionConfirm": "确定要删除该会话的所有翻译记录吗?此操作无法撤销。",
// 翻译录音文件列表页 (translation_list_view.dart)
"translateAudioFiles": "翻译录音文件",
"noAudioFiles": "暂无音频文件",
"calculating": "计算中...",
"playing": "播放中...",
"paused": "已暂停",
"clickToPlay": "点击播放",
"rename": "重命名",
"smartTranscription": "智能转写",
"renameAudioFile": "重命名音频文件",
"enterNewFileName": "请输入新的文件名",
// 翻译详情页 (translation_detail_view.dart)
"originalRecord": "原始记录",
"recordSummary": "记录摘要",
"clickToGenerateSummary": "点击下方按钮生成会话摘要",
"summaryContent": "摘要内容",
"copied": "已复制",
"summaryCopiledToClipboard": "摘要已复制到剪贴板",
"extractSummary": "提取摘要",
"summaryGenerated": "已生成摘要",
"generating": "生成中...",
"regenerate": "重新生成",
"summaryTimeoutMessage": "生成摘要请求超时,可能是网络问题或服务器繁忙。",
"deleteTranslationRecord": "删除翻译记录",
"deleteTranslationConfirm": "确定要删除这条翻译记录吗?此操作无法撤销。",
"originalText": "原文",
"translatedText": "译文",
"sessionSummary": "会话摘要",
"cannotShare": "无法分享",
"generateSummaryFirst": "请先生成摘要",
"translationSessionRecord": "翻译会话记录",
//用户反馈页 //用户反馈页
"feedback": "用户反馈", "feedback": "用户反馈",

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

@ -102,7 +102,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
children: [ children: [
Expanded( Expanded(
child: Obx(() => _buildTabButton( child: Obx(() => _buildTabButton(
title: '原始记录', title: 'originalRecord'.tr, // 原始记录
isSelected: controller.selectedTabIndex.value == 0, isSelected: controller.selectedTabIndex.value == 0,
onTap: () => controller.switchTab(0), onTap: () => controller.switchTab(0),
isDarkMode: isDarkMode, isDarkMode: isDarkMode,
@ -112,7 +112,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
// SizedBox(width: 12.w), // SizedBox(width: 12.w),
// Expanded( // Expanded(
// child: Obx(() => _buildTabButton( // child: Obx(() => _buildTabButton(
// title: '记录摘要', // title: 'recordSummary'.tr, // 记录摘要
// isSelected: controller.selectedTabIndex.value == 1, // isSelected: controller.selectedTabIndex.value == 1,
// onTap: () => controller.switchTab(1), // onTap: () => controller.switchTab(1),
// isDarkMode: isDarkMode, // isDarkMode: isDarkMode,
@ -361,7 +361,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
padding: EdgeInsets.all(24.r), padding: EdgeInsets.all(24.r),
child: Center( child: Center(
child: Text( child: Text(
'点击下方按钮生成会话摘要', 'clickToGenerateSummary'.tr, // 点击下方按钮生成会话摘要
style: TextStyle( style: TextStyle(
fontSize: 15.sp, fontSize: 15.sp,
color: isDarkMode ? Colors.grey[400] : Colors.grey[600], color: isDarkMode ? Colors.grey[400] : Colors.grey[600],
@ -384,7 +384,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
'摘要内容', 'summaryContent'.tr, // 摘要内容
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
@ -459,8 +459,8 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
void _copySummaryToClipboard() { void _copySummaryToClipboard() {
Clipboard.setData(ClipboardData(text: controller.summaryResult.value)); Clipboard.setData(ClipboardData(text: controller.summaryResult.value));
Get.snackbar( Get.snackbar(
'已复制', 'copied'.tr, // 已复制
'摘要已复制到剪贴板', 'summaryCopiledToClipboard'.tr, // 摘要已复制到剪贴板
snackPosition: SnackPosition.BOTTOM, snackPosition: SnackPosition.BOTTOM,
duration: Duration(seconds: 2), duration: Duration(seconds: 2),
); );
@ -490,7 +490,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
child: controller.isGeneratingSummary.value child: controller.isGeneratingSummary.value
? _buildGeneratingIndicator(isDarkMode) ? _buildGeneratingIndicator(isDarkMode)
: Text( : Text(
controller.summaryResult.value.isEmpty ? '提取摘要' : '已生成摘要', controller.summaryResult.value.isEmpty ? 'extractSummary'.tr : 'summaryGenerated'.tr, // 提取摘要 : 已生成摘要
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
@ -515,7 +515,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
), ),
SizedBox(width: 12.w), SizedBox(width: 12.w),
Text( Text(
'生成中...', 'generating'.tr, // 生成中...
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
@ -545,7 +545,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
), ),
), ),
child: Text( child: Text(
'重新生成', 'regenerate'.tr, // 重新生成
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
@ -570,14 +570,14 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
Get.dialog( Get.dialog(
AlertDialog( AlertDialog(
title: Text( title: Text(
'请求超时', 'requestTimeout'.tr, // 请求超时
style: TextStyle( style: TextStyle(
fontSize: 18.sp, fontSize: 18.sp,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
), ),
content: Text( content: Text(
'生成摘要请求超时,可能是网络问题或服务器繁忙。', 'summaryTimeoutMessage'.tr, // 生成摘要请求超时,可能是网络问题或服务器繁忙。
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
), ),
@ -586,7 +586,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
TextButton( TextButton(
onPressed: () => Get.back(), onPressed: () => Get.back(),
child: Text( child: Text(
'取消', 'cancel'.tr, // 取消
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: Colors.grey[700], color: Colors.grey[700],
@ -600,7 +600,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
controller.retryExtractSummaryWithExtendedTimeout(text); controller.retryExtractSummaryWithExtendedTimeout(text);
}, },
child: Text( child: Text(
'重试', 'retry'.tr, // 重试
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: Colors.blue, color: Colors.blue,
@ -624,7 +624,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
AlertDialog( AlertDialog(
backgroundColor: isDarkMode ? AppColors.cardBackground : Colors.white, backgroundColor: isDarkMode ? AppColors.cardBackground : Colors.white,
title: Text( title: Text(
'删除翻译记录', 'deleteTranslationRecord'.tr, // 删除翻译记录
style: TextStyle( style: TextStyle(
fontSize: 18.sp, fontSize: 18.sp,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
@ -636,7 +636,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
'确定要删除这条翻译记录吗?此操作无法撤销。', 'deleteTranslationConfirm'.tr, // 确定要删除这条翻译记录吗?此操作无法撤销。
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: isDarkMode ? Colors.grey[300] : Colors.black87, color: isDarkMode ? Colors.grey[300] : Colors.black87,
@ -720,15 +720,15 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
// 分享原始记录 // 分享原始记录
final String sourceText = _getCombinedSourceText(); final String sourceText = _getCombinedSourceText();
final String translatedText = _getCombinedTranslatedText(); final String translatedText = _getCombinedTranslatedText();
shareText = '原文:\n$sourceText\n\n译文:\n$translatedText'; shareText = '${'originalText'.tr}:\n$sourceText\n\n${'translatedText'.tr}:\n$translatedText'; // 原文:译文:
} else { } else {
// 分享摘要 // 分享摘要
if (controller.summaryResult.value.isNotEmpty) { if (controller.summaryResult.value.isNotEmpty) {
shareText = '会话摘要:\n${controller.summaryResult.value}'; shareText = '${'sessionSummary'.tr}:\n${controller.summaryResult.value}'; // 会话摘要:
} else { } else {
Get.snackbar( Get.snackbar(
'无法分享', 'cannotShare'.tr, // 无法分享
'请先生成摘要', 'generateSummaryFirst'.tr, // 请先生成摘要
snackPosition: SnackPosition.BOTTOM, snackPosition: SnackPosition.BOTTOM,
duration: Duration(seconds: 2), duration: Duration(seconds: 2),
); );
@ -739,7 +739,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
// 调用系统分享 // 调用系统分享
Share.share( Share.share(
shareText, shareText,
subject: '翻译会话记录 - ${DateFormat('yyyy-MM-dd HH:mm').format(controller.currentItem.timestamp)}', subject: '${'translationSessionRecord'.tr} - ${DateFormat('yyyy-MM-dd HH:mm').format(controller.currentItem.timestamp)}', // 翻译会话记录
); );
} }
} }

8
lib/modules/translation/views/translation_history_view.dart

@ -238,8 +238,8 @@ class TranslationHistoryView extends GetView<TranslationHistoryController> {
final languageManager = Get.find<LanguageManager>(); final languageManager = Get.find<LanguageManager>();
// 获取源语言和目标语言的中文名称 // 获取源语言和目标语言的中文名称
final sourceName = languageManager.getChineseNameByAsrCode(item.sourceLanguageCode) ?? '未知语言'; final sourceName = languageManager.getChineseNameByAsrCode(item.sourceLanguageCode) ?? 'unknownLanguage'.tr; // 未知语言
final targetName = languageManager.getChineseNameByAsrCode(item.targetLanguageCode) ?? '未知语言'; final targetName = languageManager.getChineseNameByAsrCode(item.targetLanguageCode) ?? 'unknownLanguage'.tr; // 未知语言
// 使用双向箭头符号表示翻译方向 // 使用双向箭头符号表示翻译方向
return '$sourceName ⇄ $targetName'; return '$sourceName ⇄ $targetName';
@ -253,7 +253,7 @@ class TranslationHistoryView extends GetView<TranslationHistoryController> {
AlertDialog( AlertDialog(
backgroundColor: isDarkMode ? AppColors.cardBackground : Colors.white, backgroundColor: isDarkMode ? AppColors.cardBackground : Colors.white,
title: Text( title: Text(
'删除会话记录', 'deleteSessionRecord'.tr, // 删除会话记录
style: TextStyle( style: TextStyle(
fontSize: 18.sp, fontSize: 18.sp,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
@ -261,7 +261,7 @@ class TranslationHistoryView extends GetView<TranslationHistoryController> {
), ),
), ),
content: Text( content: Text(
'确定要删除该会话的所有翻译记录吗?此操作无法撤销。', 'deleteSessionConfirm'.tr, // 确定要删除该会话的所有翻译记录吗?此操作无法撤销。
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: isDarkMode ? Colors.grey[300] : Colors.black87, color: isDarkMode ? Colors.grey[300] : Colors.black87,

28
lib/modules/translation/views/translation_list_view.dart

@ -37,7 +37,7 @@ class TranslationListView extends GetView<TranslationListController> {
onPressed: () => Get.back(), onPressed: () => Get.back(),
), ),
title: Text( title: Text(
"翻译录音文件", // "translateAudioFiles".tr, // 翻译录音文件
style: TextStyle( style: TextStyle(
fontSize: 17.sp, fontSize: 17.sp,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
@ -52,7 +52,7 @@ class TranslationListView extends GetView<TranslationListController> {
return Obx(() { return Obx(() {
final fileList = controller.files; // 不要 toList() final fileList = controller.files; // 不要 toList()
if (fileList.isEmpty) { if (fileList.isEmpty) {
return Center(child: Text('暂无音频文件')); return Center(child: Text('noAudioFiles'.tr)); // 暂无音频文件
} }
return ListView.builder( return ListView.builder(
@ -75,17 +75,17 @@ class TranslationListView extends GetView<TranslationListController> {
return FutureBuilder<Duration>( return FutureBuilder<Duration>(
future: controller.getAudioDuration(file.path), future: controller.getAudioDuration(file.path),
builder: (context, snapshot) { builder: (context, snapshot) {
String durationText = "计算中..."; String durationText = "calculating".tr; // 计算中...
if (snapshot.hasData) { if (snapshot.hasData) {
final duration = snapshot.data!; final duration = snapshot.data!;
if (duration.inSeconds > 0) { if (duration.inSeconds > 0) {
durationText = durationText =
"${duration.inMinutes}:${(duration.inSeconds % 60).toString().padLeft(2, '0')}"; "${duration.inMinutes}:${(duration.inSeconds % 60).toString().padLeft(2, '0')}";
} else { } else {
durationText = "未知"; durationText = "unknown".tr; // 未知
} }
} else if (snapshot.hasError) { } else if (snapshot.hasError) {
durationText = "错误"; durationText = "error".tr; // 错误
} }
return GestureDetector( return GestureDetector(
onLongPressStart: (details) { onLongPressStart: (details) {
@ -216,8 +216,8 @@ class TranslationListView extends GetView<TranslationListController> {
// 播放状态文本 // 播放状态文本
Text( Text(
isCurrentFile isCurrentFile
? (isPlaying ? '播放中...' : '已暂停') ? (isPlaying ? 'playing'.tr : 'paused'.tr) // 播放中... : 已暂停
: '点击播放', : 'clickToPlay'.tr, // 点击播放
style: TextStyle( style: TextStyle(
color: Colors.blue, color: Colors.blue,
fontSize: 10.sp, fontSize: 10.sp,
@ -269,7 +269,7 @@ class TranslationListView extends GetView<TranslationListController> {
size: 20.w, size: 20.w,
color: isDarkMode ? Colors.white : Colors.black87, color: isDarkMode ? Colors.white : Colors.black87,
), ),
'重命名', 'rename'.tr, // 重命名
isDarkMode ? Colors.white : Colors.black87, isDarkMode ? Colors.white : Colors.black87,
() { () {
// 弹出重命名输入框 // 弹出重命名输入框
@ -282,7 +282,7 @@ class TranslationListView extends GetView<TranslationListController> {
size: 20.w, size: 20.w,
color: isDarkMode ? Colors.white : Colors.black87, color: isDarkMode ? Colors.white : Colors.black87,
), ),
'智能转写', 'smartTranscription'.tr, // 智能转写
isDarkMode ? Colors.white : Colors.black87, isDarkMode ? Colors.white : Colors.black87,
() { () {
Get.toNamed(Routes.meeting, arguments: { Get.toNamed(Routes.meeting, arguments: {
@ -296,7 +296,7 @@ class TranslationListView extends GetView<TranslationListController> {
size: 20.w, size: 20.w,
color: isDarkMode ? Colors.red[700] : Colors.red, color: isDarkMode ? Colors.red[700] : Colors.red,
), ),
'删除', 'delete'.tr, // 删除
isDarkMode ? Colors.red[700]! : Colors.red, isDarkMode ? Colors.red[700]! : Colors.red,
() { () {
file.delete(); file.delete();
@ -358,7 +358,7 @@ class TranslationListView extends GetView<TranslationListController> {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Text( Text(
'重命名音频文件', 'renameAudioFile'.tr, // 重命名音频文件
style: TextStyle( style: TextStyle(
color: isDarkMode ? Colors.white : Colors.black87, color: isDarkMode ? Colors.white : Colors.black87,
fontSize: 16.sp, fontSize: 16.sp,
@ -390,7 +390,7 @@ class TranslationListView extends GetView<TranslationListController> {
fontSize: 16.sp, fontSize: 16.sp,
), ),
decoration: InputDecoration( decoration: InputDecoration(
hintText: '请输入新的文件名', hintText: 'enterNewFileName'.tr, // 请输入新的文件名
hintStyle: TextStyle( hintStyle: TextStyle(
color: isDarkMode ? Colors.white70 : Colors.black54, color: isDarkMode ? Colors.white70 : Colors.black54,
fontSize: 16.sp, fontSize: 16.sp,
@ -422,7 +422,7 @@ class TranslationListView extends GetView<TranslationListController> {
borderRadius: BorderRadius.circular(12.w), borderRadius: BorderRadius.circular(12.w),
), ),
child: Text( child: Text(
'取消', 'cancel'.tr, // 取消
style: TextStyle( style: TextStyle(
fontSize: 14.sp, fontSize: 14.sp,
color: isDarkMode ? AppColors.primary : Colors.blue, color: isDarkMode ? AppColors.primary : Colors.blue,
@ -455,7 +455,7 @@ class TranslationListView extends GetView<TranslationListController> {
borderRadius: BorderRadius.circular(12.w), borderRadius: BorderRadius.circular(12.w),
), ),
child: Text( child: Text(
'确认', 'confirm'.tr, // 确认
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 14.sp, fontSize: 14.sp,

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

@ -154,7 +154,7 @@ class TranslationView extends GetView<TranslationController> {
size: 24.sp, size: 24.sp,
), ),
onPressed: controller.toggleisRecord, onPressed: controller.toggleisRecord,
tooltip: '是否开启录音', tooltip: 'enableRecording'.tr, // 是否开启录音
), ),
IconButton( IconButton(
icon: Icon( icon: Icon(
@ -167,7 +167,7 @@ class TranslationView extends GetView<TranslationController> {
Get.toNamed(Routes.translationList); Get.toNamed(Routes.translationList);
controller.setupScrollListener(); controller.setupScrollListener();
}, },
tooltip: '查看录音文件', tooltip: 'viewAudioFiles'.tr, // 查看录音文件
), ),
// 添加历史记录按钮 // 添加历史记录按钮
IconButton( IconButton(
@ -180,7 +180,7 @@ class TranslationView extends GetView<TranslationController> {
await controller.stopAll(); await controller.stopAll();
Get.toNamed(Routes.translationHistory); Get.toNamed(Routes.translationHistory);
}, },
tooltip: '翻译历史', tooltip: 'translationHistory'.tr, // 翻译历史
), ),
], ],
); );
@ -428,7 +428,7 @@ class TranslationView extends GetView<TranslationController> {
speakerId: 1, speakerId: 1,
activeSpeaker: controller.activeSpeaker.value, activeSpeaker: controller.activeSpeaker.value,
icon: Icons.headset, // 耳机图标 icon: Icons.headset, // 耳机图标
label: "耳机用户", label: "headsetUser".tr, // 耳机用户
), ),
SizedBox(width: 40.w), SizedBox(width: 40.w),
// 手机图标按钮 (说话者2) // 手机图标按钮 (说话者2)
@ -437,7 +437,7 @@ class TranslationView extends GetView<TranslationController> {
speakerId: 2, speakerId: 2,
activeSpeaker: controller.activeSpeaker.value, activeSpeaker: controller.activeSpeaker.value,
icon: Icons.phone_android, // 手机图标 icon: Icons.phone_android, // 手机图标
label: "手机用户", label: "phoneUser".tr, // 手机用户
), ),
], ],
); );

Loading…
Cancel
Save