Browse Source

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

- 修改翻译历史、详情、列表和主视图中的硬编码文本为对应的翻译键
- 在中文翻译文件中添加缺失的翻译项
- 统一使用国际化方案管理界面文本
newdev_shunjiawei
lxm 1 year ago
parent
commit
2fa63b9d36
  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聊天。我将用专业知识帮助您。请问有什么问题想咨询吗?",
"healthAdvisorVoiceWelcome": "我在这里!",
// 翻译历史
// 翻译模块
// 翻译主页 (translation_view.dart)
"translationHistory": "翻译历史",
"enableRecording": "是否开启录音",
"viewAudioFiles": "查看录音文件",
"headsetUser": "耳机用户",
"phoneUser": "手机用户",
// 翻译历史页 (translation_history_view.dart)
"noTranslationHistory": "暂无历史记录",
"clearHistory": "清除历史记录",
"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": "用户反馈",

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

@ -102,7 +102,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
children: [
Expanded(
child: Obx(() => _buildTabButton(
title: '原始记录',
title: 'originalRecord'.tr, // 原始记录
isSelected: controller.selectedTabIndex.value == 0,
onTap: () => controller.switchTab(0),
isDarkMode: isDarkMode,
@ -112,7 +112,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
// SizedBox(width: 12.w),
// Expanded(
// child: Obx(() => _buildTabButton(
// title: '记录摘要',
// title: 'recordSummary'.tr, // 记录摘要
// isSelected: controller.selectedTabIndex.value == 1,
// onTap: () => controller.switchTab(1),
// isDarkMode: isDarkMode,
@ -361,7 +361,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
padding: EdgeInsets.all(24.r),
child: Center(
child: Text(
'点击下方按钮生成会话摘要',
'clickToGenerateSummary'.tr, // 点击下方按钮生成会话摘要
style: TextStyle(
fontSize: 15.sp,
color: isDarkMode ? Colors.grey[400] : Colors.grey[600],
@ -384,7 +384,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'摘要内容',
'summaryContent'.tr, // 摘要内容
style: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.bold,
@ -459,8 +459,8 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
void _copySummaryToClipboard() {
Clipboard.setData(ClipboardData(text: controller.summaryResult.value));
Get.snackbar(
'已复制',
'摘要已复制到剪贴板',
'copied'.tr, // 已复制
'summaryCopiledToClipboard'.tr, // 摘要已复制到剪贴板
snackPosition: SnackPosition.BOTTOM,
duration: Duration(seconds: 2),
);
@ -490,7 +490,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
child: controller.isGeneratingSummary.value
? _buildGeneratingIndicator(isDarkMode)
: Text(
controller.summaryResult.value.isEmpty ? '提取摘要' : '已生成摘要',
controller.summaryResult.value.isEmpty ? 'extractSummary'.tr : 'summaryGenerated'.tr, // 提取摘要 : 已生成摘要
style: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.w600,
@ -515,7 +515,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
),
SizedBox(width: 12.w),
Text(
'生成中...',
'generating'.tr, // 生成中...
style: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.w600,
@ -545,7 +545,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
),
),
child: Text(
'重新生成',
'regenerate'.tr, // 重新生成
style: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.w600,
@ -570,14 +570,14 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
Get.dialog(
AlertDialog(
title: Text(
'请求超时',
'requestTimeout'.tr, // 请求超时
style: TextStyle(
fontSize: 18.sp,
fontWeight: FontWeight.bold,
),
),
content: Text(
'生成摘要请求超时,可能是网络问题或服务器繁忙。',
'summaryTimeoutMessage'.tr, // 生成摘要请求超时,可能是网络问题或服务器繁忙。
style: TextStyle(
fontSize: 16.sp,
),
@ -586,7 +586,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
TextButton(
onPressed: () => Get.back(),
child: Text(
'取消',
'cancel'.tr, // 取消
style: TextStyle(
fontSize: 16.sp,
color: Colors.grey[700],
@ -600,7 +600,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
controller.retryExtractSummaryWithExtendedTimeout(text);
},
child: Text(
'重试',
'retry'.tr, // 重试
style: TextStyle(
fontSize: 16.sp,
color: Colors.blue,
@ -624,7 +624,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
AlertDialog(
backgroundColor: isDarkMode ? AppColors.cardBackground : Colors.white,
title: Text(
'删除翻译记录',
'deleteTranslationRecord'.tr, // 删除翻译记录
style: TextStyle(
fontSize: 18.sp,
fontWeight: FontWeight.bold,
@ -636,7 +636,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'确定要删除这条翻译记录吗?此操作无法撤销。',
'deleteTranslationConfirm'.tr, // 确定要删除这条翻译记录吗?此操作无法撤销。
style: TextStyle(
fontSize: 16.sp,
color: isDarkMode ? Colors.grey[300] : Colors.black87,
@ -720,15 +720,15 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
// 分享原始记录
final String sourceText = _getCombinedSourceText();
final String translatedText = _getCombinedTranslatedText();
shareText = '原文:\n$sourceText\n\n译文:\n$translatedText';
shareText = '${'originalText'.tr}:\n$sourceText\n\n${'translatedText'.tr}:\n$translatedText'; // 原文:译文:
} else {
// 分享摘要
if (controller.summaryResult.value.isNotEmpty) {
shareText = '会话摘要:\n${controller.summaryResult.value}';
shareText = '${'sessionSummary'.tr}:\n${controller.summaryResult.value}'; // 会话摘要:
} else {
Get.snackbar(
'无法分享',
'请先生成摘要',
'cannotShare'.tr, // 无法分享
'generateSummaryFirst'.tr, // 请先生成摘要
snackPosition: SnackPosition.BOTTOM,
duration: Duration(seconds: 2),
);
@ -739,7 +739,7 @@ class TranslationDetailView extends GetView<TranslationDetailController> {
// 调用系统分享
Share.share(
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 sourceName = languageManager.getChineseNameByAsrCode(item.sourceLanguageCode) ?? '未知语言';
final targetName = languageManager.getChineseNameByAsrCode(item.targetLanguageCode) ?? '未知语言';
final sourceName = languageManager.getChineseNameByAsrCode(item.sourceLanguageCode) ?? 'unknownLanguage'.tr; // 未知语言
final targetName = languageManager.getChineseNameByAsrCode(item.targetLanguageCode) ?? 'unknownLanguage'.tr; // 未知语言
// 使用双向箭头符号表示翻译方向
return '$sourceName ⇄ $targetName';
@ -253,7 +253,7 @@ class TranslationHistoryView extends GetView<TranslationHistoryController> {
AlertDialog(
backgroundColor: isDarkMode ? AppColors.cardBackground : Colors.white,
title: Text(
'删除会话记录',
'deleteSessionRecord'.tr, // 删除会话记录
style: TextStyle(
fontSize: 18.sp,
fontWeight: FontWeight.bold,
@ -261,7 +261,7 @@ class TranslationHistoryView extends GetView<TranslationHistoryController> {
),
),
content: Text(
'确定要删除该会话的所有翻译记录吗?此操作无法撤销。',
'deleteSessionConfirm'.tr, // 确定要删除该会话的所有翻译记录吗?此操作无法撤销。
style: TextStyle(
fontSize: 16.sp,
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(),
),
title: Text(
"翻译录音文件", //
"translateAudioFiles".tr, // 翻译录音文件
style: TextStyle(
fontSize: 17.sp,
fontWeight: FontWeight.w600,
@ -52,7 +52,7 @@ class TranslationListView extends GetView<TranslationListController> {
return Obx(() {
final fileList = controller.files; // 不要 toList()
if (fileList.isEmpty) {
return Center(child: Text('暂无音频文件'));
return Center(child: Text('noAudioFiles'.tr)); // 暂无音频文件
}
return ListView.builder(
@ -75,17 +75,17 @@ class TranslationListView extends GetView<TranslationListController> {
return FutureBuilder<Duration>(
future: controller.getAudioDuration(file.path),
builder: (context, snapshot) {
String durationText = "计算中...";
String durationText = "calculating".tr; // 计算中...
if (snapshot.hasData) {
final duration = snapshot.data!;
if (duration.inSeconds > 0) {
durationText =
"${duration.inMinutes}:${(duration.inSeconds % 60).toString().padLeft(2, '0')}";
} else {
durationText = "未知";
durationText = "unknown".tr; // 未知
}
} else if (snapshot.hasError) {
durationText = "错误";
durationText = "error".tr; // 错误
}
return GestureDetector(
onLongPressStart: (details) {
@ -216,8 +216,8 @@ class TranslationListView extends GetView<TranslationListController> {
// 播放状态文本
Text(
isCurrentFile
? (isPlaying ? '播放中...' : '已暂停')
: '点击播放',
? (isPlaying ? 'playing'.tr : 'paused'.tr) // 播放中... : 已暂停
: 'clickToPlay'.tr, // 点击播放
style: TextStyle(
color: Colors.blue,
fontSize: 10.sp,
@ -269,7 +269,7 @@ class TranslationListView extends GetView<TranslationListController> {
size: 20.w,
color: isDarkMode ? Colors.white : Colors.black87,
),
'重命名',
'rename'.tr, // 重命名
isDarkMode ? Colors.white : Colors.black87,
() {
// 弹出重命名输入框
@ -282,7 +282,7 @@ class TranslationListView extends GetView<TranslationListController> {
size: 20.w,
color: isDarkMode ? Colors.white : Colors.black87,
),
'智能转写',
'smartTranscription'.tr, // 智能转写
isDarkMode ? Colors.white : Colors.black87,
() {
Get.toNamed(Routes.meeting, arguments: {
@ -296,7 +296,7 @@ class TranslationListView extends GetView<TranslationListController> {
size: 20.w,
color: isDarkMode ? Colors.red[700] : Colors.red,
),
'删除',
'delete'.tr, // 删除
isDarkMode ? Colors.red[700]! : Colors.red,
() {
file.delete();
@ -358,7 +358,7 @@ class TranslationListView extends GetView<TranslationListController> {
mainAxisSize: MainAxisSize.min,
children: [
Text(
'重命名音频文件',
'renameAudioFile'.tr, // 重命名音频文件
style: TextStyle(
color: isDarkMode ? Colors.white : Colors.black87,
fontSize: 16.sp,
@ -390,7 +390,7 @@ class TranslationListView extends GetView<TranslationListController> {
fontSize: 16.sp,
),
decoration: InputDecoration(
hintText: '请输入新的文件名',
hintText: 'enterNewFileName'.tr, // 请输入新的文件名
hintStyle: TextStyle(
color: isDarkMode ? Colors.white70 : Colors.black54,
fontSize: 16.sp,
@ -422,7 +422,7 @@ class TranslationListView extends GetView<TranslationListController> {
borderRadius: BorderRadius.circular(12.w),
),
child: Text(
'取消',
'cancel'.tr, // 取消
style: TextStyle(
fontSize: 14.sp,
color: isDarkMode ? AppColors.primary : Colors.blue,
@ -455,7 +455,7 @@ class TranslationListView extends GetView<TranslationListController> {
borderRadius: BorderRadius.circular(12.w),
),
child: Text(
'确认',
'confirm'.tr, // 确认
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,

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

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

Loading…
Cancel
Save