Browse Source

refactor(meeting): 替换硬编码字符串为国际化翻译键

将会议模块中的硬编码中文字符串替换为国际化翻译键,支持多语言切换
更新翻译文件zh_cn.dart,添加新增的翻译键和对应中文文本
newdev_shunjiawei
lxm 1 year ago
parent
commit
235fb29e07
  1. 238
      lib/core/translations/language/en_us.dart
  2. 208
      lib/core/translations/language/zh_cn.dart
  3. 4
      lib/modules/explore/views/explore_view.dart
  4. 30
      lib/modules/meeting/controllers/meeting_connect_controller.dart
  5. 28
      lib/modules/meeting/controllers/meeting_home_controller.dart
  6. 12
      lib/modules/meeting/controllers/meeting_record_controller.dart
  7. 5
      lib/modules/meeting/controllers/mind_map_controller.dart
  8. 12
      lib/modules/meeting/views/bottomSheet/ai_bottom_sheet.dart
  9. 10
      lib/modules/meeting/views/bottomSheet/filtrate_drawer.dart
  10. 14
      lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart
  11. 19
      lib/modules/meeting/views/bottomSheet/member_bottom_sheet.dart
  12. 7
      lib/modules/meeting/views/bottomSheet/more_bottom_sheet.dart
  13. 13
      lib/modules/meeting/views/bottomSheet/navigation_bar_bottom_sheet.dart
  14. 24
      lib/modules/meeting/views/bottomSheet/record_language_bottom_sheet.dart
  15. 2
      lib/modules/meeting/views/bottomSheet/second_level_bottom_sheet.dart
  16. 41
      lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart
  17. 13
      lib/modules/meeting/views/bottomSheet/speaker_all_bottom_sheet.dart
  18. 15
      lib/modules/meeting/views/bottomSheet/speaker_bottom_sheet.dart
  19. 4
      lib/modules/meeting/views/meeting_connect_view.dart
  20. 20
      lib/modules/meeting/views/meeting_details_view.dart
  21. 10
      lib/modules/meeting/views/meeting_home_view.dart
  22. 34
      lib/modules/meeting/views/meeting_mine_view.dart
  23. 2
      lib/modules/meeting/views/meeting_record_view.dart
  24. 6
      lib/modules/meeting/views/meeting_view.dart
  25. 9
      lib/modules/meeting/views/mine/meeting_cloud_view.dart
  26. 86
      lib/modules/meeting/views/mine/meeting_member_view.dart
  27. 2
      lib/modules/meeting/views/mine/meeting_transcription_view.dart
  28. 8
      lib/modules/meeting/views/tabs/overview_tab.dart
  29. 6
      lib/modules/meeting/views/tabs/speech_tab.dart
  30. 24
      lib/modules/meeting/views/tabs/summary_tab.dart
  31. 6
      lib/modules/meeting/views/template/template_view.dart
  32. 4
      lib/modules/translation/models/translation_models.dart

238
lib/core/translations/language/en_us.dart

@ -208,6 +208,233 @@ const Map<String, String> enUS = {
'aiSummary': 'AI Summary', 'aiSummary': 'AI Summary',
'meetingTranscript': 'Meeting Transcript', 'meetingTranscript': 'Meeting Transcript',
// Meeting模块 - 导航和基础功能
'files': 'Files',
'mine': 'Mine',
'connect': 'Connect',
'allFiles': 'All Files',
'searchInAllFiles': 'Search in all files',
'from': 'From',
'sortBy': 'Sort by',
'creationTime': 'Creation Time',
'bluetoothConnection': 'Bluetooth Connection',
'meetingReconnect': 'Reconnect',
'searching': 'Searching...',
'searchFailed': 'Search failed, please check if Bluetooth is enabled',
'aiPenNotFound': 'AI PEN device not found',
'connectedToAiPen': 'Connected to AI PEN device',
'checkingNewFiles': 'Checking for new files to import',
'startingWifi': 'Starting Wi-Fi...',
'newFilesDetected': 'New files detected, preparing to import',
'noNewFiles': 'No new files to import',
'connectingWifi': 'Connecting to Wi-Fi...',
'wifiConnected': 'Wi-Fi connected successfully',
'downloadingFiles': 'Downloading files...',
'downloadingFileProgress': 'Total {total} files, downloading file {current}',
'downloadComplete': 'Download complete',
'downloadCompleteInfo':
'Download complete, {count} files in total, returning automatically in 2 seconds',
// Meeting模块 - 录音功能
'startRecording': 'Start Recording',
'liveRecording': 'Live Recording',
'audioVideoRecording': 'Audio/Video Recording',
'callRecording': 'Call Recording',
'importAudio': 'Import Audio',
'transcribing': 'Transcribing...',
'summarizing': 'Summarizing...',
'analyzing': 'Analyzing...',
'summaryComplete': 'Summary Complete',
//'generating': 'Generating...',
'generate': 'Generate',
'overview': 'Overview',
'transcription': 'Transcription',
'summary': 'Summary',
'mindMap': 'Mind Map',
'editSpeaker': 'Edit',
'nameSpeaker': 'Name Speaker',
// Meeting模块 - 我的页面
'transcriptionRecords': 'Transcription Records',
'templateCommunity': 'Template Community',
'comingSoon': 'Coming Soon',
'integration': 'Integration',
'voitransPrivateCloud': 'VOITRANS PRIVATE CLOUD',
'enabled': 'Enabled',
'disabled': 'Disabled',
'myVoitransDevice': 'My VOITRANS Device',
'helpAndFeedback': 'Help & Feedback',
'aboutVoitrans': 'About VOITRANS',
'meetingDays': 'Days',
'meetingHours': 'Hours',
'voitransAiMember': 'Voitrans AI Member',
'unlockStarterMember': 'Unlock Starter Member',
'bindDeviceToActivate': 'Bind Voitrans device to activate Starter membership',
'unlockNow': 'Unlock Now',
// Meeting模块 - 会员功能
'comparison': 'Comparison',
'detailedInfo': 'Detailed Information',
'monthlyTranscriptionTime': 'Monthly Transcription Time',
'unlimited': 'Unlimited',
'professionalTemplates': 'Professional Templates',
'limited': 'Limited',
'fullTemplates': 'Full Templates',
'professionalTerms': 'Professional Terms',
'customTemplates': 'Custom Templates',
'visualMindMap': 'Visual Mind Map',
'speakerIdentification': 'Speaker Identification',
'aiVoiceEnhancement': 'AI Voice Enhancement',
'audioImport': 'Audio Import',
'multipleExportFormats': 'Multiple Export Formats',
'professionalSummaryTemplates': 'Professional Summary Templates',
'professionalTemplateDesc':
'Professional template design to improve your work efficiency. Customized according to industry needs.',
'customTemplateDesc':
'You can customize summary prompts according to your needs and use them to generate the required summaries.',
'askAiDesc':
'Intelligently extract deeper information from recordings, generate data tables, key discussion conclusions, To-Do lists, report emails and other formatted content with one click.',
'visualMindMapDesc':
'Beyond summaries - organize and visualize key points with mind maps for more effective understanding of the full text.',
'templateCommunityDesc':
'Discover, share, and get inspiration from the template library created by users.',
'speakerIdentificationDesc':
'Audio transcription will support speaker identification, more intuitively restore meeting or phone call content. At the same time, the summary will be more accurate.',
'privateCloudSyncDesc':
'Your recordings and transcriptions will be securely stored on dedicated cloud servers, with full encryption during upload and download to ensure privacy and security.',
'aiVoiceEnhancementDesc':
'AI voice enhancement supports multiple noise reduction settings, intelligently eliminates background noise, enhances voice clarity, and improves audio playback quality.',
'audioImportDesc':
'Easily import audio files from local or third-party applications, such as voice memos, Google Drive, etc.',
'multipleExportFormatsDesc':
'Export your audio recordings, transcription text and summaries in various formats (TXT, PDF, JPEG) to meet your needs.',
// Meeting模块 - 升级会员
'upgradeMembership': 'Upgrade Your Membership',
'yearlySubscription': 'Yearly Subscription',
'monthlySubscription': 'Monthly Subscription',
'proMonthly': 'Pro ¥60/month',
'proMonthlyDesc':
'7-day free trial, then ¥800/year. Cancel anytime before trial ends.',
'sevenDayTrial': '7-day Free Trial',
'unlimitedMonthly': 'Unlimited ¥120/month',
'unlimitedMonthlyDesc':
'7-day free trial, then ¥1600/year. Cancel anytime before trial ends.',
'trialNote': '*Free trial for 7 days, then charged annually, cancel anytime.',
'proPrice': 'Pro ¥120',
'proMonthlyPrice': '¥120/month',
'subscribe': 'Subscribe',
'unlimitedPrice': 'Unlimited ¥198',
'unlimitedMonthlyPrice': '¥198/month',
'upgradeNote':
'*After upgrading subscription, the remaining days of the original subscription will be automatically calculated and refunded to your payment account',
'buyMoreTranscriptionTime': 'Buy More Transcription Time',
'sixThousandMinutes': '6,000 minutes',
'threeThousandMinutes': '3,000 minutes',
'sixHundredMinutes': '600 minutes',
'oneHundredTwentyMinutes': '120 minutes',
'validityPeriod': '*Validity Period: ',
'validityNote':
'Activated immediately after purchase, valid for 2 years after activation.',
'purchase': 'Purchase',
// Meeting模块 - 模版和生成
'selectSummaryTemplate': 'Select Summary Template',
'useThisTemplate': 'Use This Template',
'lastUsed': 'Last Used',
'viewAll': 'View All',
'recordingLanguage': 'Recording Language',
'chineseSimplified': 'Chinese Mandarin (Simplified)',
'meetingGenerateNow': 'Generate Now',
'keyEventsAnalyzed': 'Analyzed {count} key events.',
'aiAnalysisDesc':
'AI analysis identifies key events in recordings, allowing you to select important events for AI generation.',
// Meeting模块 - 文件操作和状态
'importing': 'Importing...',
'batchImporting': 'Batch importing...',
'importingLocalRecordings': 'Importing local recordings...',
'importFailed': 'Import file failed: {filePath}, error: {error}',
'importSuccess': 'Successfully imported {count} local recordings',
'importError': 'Import failed: {error}',
'pleaseSelectAudioFile': 'Please select audio file',
'shareAudio': 'Share Meeting Audio',
'shareComplete': 'Share complete!',
'shareFailed': 'Share failed: {error}',
'fileProcessingFailed': 'File processing failed: {filePath}, error: {error}',
// 翻译模块 - Meeting相关
'meetingUnknownLanguage': 'Unknown Language',
// 权限相关 - Meeting相关
'meetingStoragePermission': 'Storage',
'meetingStoragePermissionExplanation':
'We need access to storage permissions so you can select and upload audio files.',
'meetingStoragePermissionPermanentDenial':
'Detected that you have permanently denied storage permission. To continue using this feature, please go to app settings to manually enable storage permission.',
// Meeting模块 - 思维导图相关
'shareMindMap': 'Share Mind Map',
'shareSuccess': 'Share Success',
// Meeting模块 - AI相关
'askAI': 'Ask AI ...',
'askAIPrompt': 'What can I help you with today?',
'continueAsk': 'Continue Asking',
'todoList': 'To-Do List',
'extractConclusion': 'Extract Conclusion',
'generateKeyIndicators': 'Generate Key Indicators',
// Meeting模块 - 更多操作相关
'reSummarize': 'Re-summarize',
// Meeting模块 - 录音语言相关
'recordLanguage': 'Recording Language',
// 'chinese': 'Chinese Mandarin (Simplified)',
'cantonese': 'Cantonese',
'sichuan': 'Sichuan Dialect',
'shanghai': 'Shanghai Dialect',
// 'english': 'English',
// 'japanese': 'Japanese',
// 'korean': 'Korean',
// 'french': 'French',
// 'spanish': 'Spanish',
// 'portuguese': 'Portuguese',
// 'indonesian': 'Indonesian',
// Meeting模块 - 分享相关
'shareLink': 'Share Link',
'copyTranscript': 'Copy Transcript',
'copySummary': 'Copy Summary',
'exportAudio': 'Export Audio',
'exportTranscript': 'Export Transcript',
'shareMeetingAudio': 'Share Meeting Audio',
'exportSummary': 'Export Summary',
'exportAs': 'Export As',
'exportingPDF': 'Exporting PDF...',
// Meeting模块 - 发言者相关
'nameCurrentSpeaker': 'Name Current Speaker',
'recentlyUsedNames': 'Recently Used Names',
'applyToCurrentParagraph': 'Apply to Current Paragraph',
'totalTime': 'Total Time',
'summarySpeakerWillBeUpdatedAutomatically':
'Summary speakers will be updated automatically',
// Meeting模块 - 云端同步相关
'syncToCloud': 'Sync to Cloud',
'syncToCloudTip':
'Automatically sync your recordings to the cloud, you can play, manage and share recordings through any VOITRANS APP or VOITRANS Web (web.voitrans.com).',
'syncToVoitransApp': 'Sync VOITRANS APP',
'transcriptionRecord': 'Transcription Record',
// Meeting模块 - 总结页面相关
'dateAndTime': 'Date & Time',
'location': 'Location',
'attendees': 'Attendees',
'inputLocation': 'Enter Location',
'inputAttendees': 'Enter Attendees',
// 设置页 // 设置页
"systemSettings": "System Settings", "systemSettings": "System Settings",
"premiumMember": "Premium Membership", "premiumMember": "Premium Membership",
@ -305,7 +532,7 @@ const Map<String, String> enUS = {
"loadFailedClickRetry": "Load failed, click to retry", "loadFailedClickRetry": "Load failed, click to retry",
"swipeUpForMore": "Swipe up for more", "swipeUpForMore": "Swipe up for more",
// Preset prompts // 预设提示词
"presetMusic": "Play some music", // Play some music "presetMusic": "Play some music", // Play some music
"presetNavigation": "Navigation to", // Navigation "presetNavigation": "Navigation to", // Navigation
"presetWeather": "Today's weather", // Weather "presetWeather": "Today's weather", // Weather
@ -758,7 +985,7 @@ const Map<String, String> enUS = {
"renameAudioFile": "Rename Audio File", "renameAudioFile": "Rename Audio File",
"enterNewFileName": "Please enter new file name", "enterNewFileName": "Please enter new file name",
// 翻译详情页 // 翻译详情页(translation_detail_view.dart)
"originalRecord": "Original Record", "originalRecord": "Original Record",
"recordSummary": "Record Summary", "recordSummary": "Record Summary",
"clickToGenerateSummary": "clickToGenerateSummary":
@ -955,11 +1182,4 @@ const Map<String, String> enUS = {
"justNow": "Just now", "justNow": "Just now",
"minutesAgo": "@minutes minutes ago", "minutesAgo": "@minutes minutes ago",
"yesterday": "Yesterday", "yesterday": "Yesterday",
// "monday": "Monday",
// "tuesday": "Tuesday",
// "wednesday": "Wednesday",
// "thursday": "Thursday",
// "friday": "Friday",
// "saturday": "Saturday",
// "sunday": "Sunday",
}; };

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

@ -202,6 +202,214 @@ const Map<String, String> zhCN = {
'aiSummary': 'AI总结', 'aiSummary': 'AI总结',
'meetingTranscript': '会议原文', 'meetingTranscript': '会议原文',
// Meeting模块 - 导航和基础功能
'files': '文件',
'mine': '我的',
'connect': '连接',
'allFiles': '全部文件',
'searchInAllFiles': '在所有文件中搜索',
'from': '来自',
'sortBy': '排序方式',
'creationTime': '创建时间',
'bluetoothConnection': '蓝牙连接',
'meetingReconnect': '重新连接',
'searching': '搜索中...',
'searchFailed': '搜索失败,请检查蓝牙是否开启',
'aiPenNotFound': '未搜索到 AI PEN 设备',
'connectedToAiPen': '已连接到 AI PEN 设备',
'checkingNewFiles': '检查是否有新文件需要导入',
'startingWifi': '正在开启Wi-Fi...',
'newFilesDetected': '检查到有新文件,正在准备导入',
'noNewFiles': '没有新文件需要导入',
'connectingWifi': '正在连接 Wi-Fi...',
'wifiConnected': 'Wi-Fi 连接成功',
'downloadingFiles': '正在下载文件...',
'downloadingFileProgress': '共{total}个文件,正在下载第{current}个文件',
'downloadComplete': '下载完成',
'downloadCompleteInfo': '下载完成,共{count}个文件,2秒后自动返回',
// Meeting模块 - 录音功能
'startRecording': '开始录音',
'liveRecording': '现场录音',
'audioVideoRecording': '音、视频录音',
'callRecording': '通话录音',
'importAudio': '导入音频',
'transcribing': '正在转写...',
'summarizing': '正在总结...',
'analyzing': '正在分析...',
'summaryComplete': '总结完成',
//'generating': '正在生成...',
'generate': '生成',
'overview': '概览',
'transcription': '转写',
'summary': '总结',
'mindMap': '思维导图',
'editSpeaker': '编辑',
'nameSpeaker': '命名发言者',
// Meeting模块 - 我的页面
'transcriptionRecords': '转写记录',
'templateCommunity': '模版社区',
'comingSoon': '尽请期待',
'integration': '集成',
'voitransPrivateCloud': 'VOITRANS PRIVATE CLOUD',
'enabled': '开启',
'disabled': '关闭',
'myVoitransDevice': '我的VOITRANS设备',
'helpAndFeedback': '帮助与反馈',
'aboutVoitrans': '关于VOITRANS',
'meetingDays': '天',
'meetingHours': '小时',
'voitransAiMember': 'Voitrans AI会员',
'unlockStarterMember': '解锁 Starter 会员',
'bindDeviceToActivate': '绑定 Voitrans 设备可激活 Starter 会员',
'unlockNow': '立即解锁',
// Meeting模块 - 会员功能
'comparison': '对比',
'detailedInfo': '详细信息',
'monthlyTranscriptionTime': '每月转写时长',
'unlimited': '无限',
'professionalTemplates': '专业模版',
'limited': '有限',
'fullTemplates': '全量模版',
'professionalTerms': '专业术语',
'customTemplates': '自定义模版',
'visualMindMap': '可视化思维导图',
'speakerIdentification': '区分说话人',
'aiVoiceEnhancement': 'AI 人声增强',
'audioImport': '音频导入',
'multipleExportFormats': '支持多种导出格式',
'professionalSummaryTemplates': '专业总结模版',
'professionalTemplateDesc': '专业模版设计,提高您的工作效率。根据行业需求量身定制。',
'customTemplateDesc': '您可以根据需求自定义总结 Prompts,并用它们生成所需的总结。',
'askAiDesc': '从录音中智能挖掘更深入信息,一键生成数据表格、关键讨论结论、To Do、汇报邮件等格式内容。',
'visualMindMapDesc': '超越总结-用思维导图整理和可视化要点,更有效地理解全文。',
'templateCommunityDesc': '发现、分享,并从用户创建的模版库中获得灵感。',
'speakerIdentificationDesc': '音频转写将支持区分发言者,更直观的还原会议或电话通话内容。同时总结将更加准确。',
'privateCloudSyncDesc': '您的录音和转写等数据将安全存储在专属的云端服务器中,无论是上传还是下载,全程加密处理,确保隐私安全。',
'aiVoiceEnhancementDesc': 'Al 人声增强支持多档降噪设置,智能消除背景噪音,增强语音清晰度,提升音频回放效果。',
'audioImportDesc': '可以轻松从本地或第三方应用导入音频文件,如语音备忘录、Google云端硬盘等。',
'multipleExportFormatsDesc': '导出您的音频录音、转写文本和摘要为各种格式(TXT、PDF、JPEG),以满足您的需求。',
// Meeting模块 - 升级会员
'upgradeMembership': '升级您的会员',
'yearlySubscription': '年订阅',
'monthlySubscription': '月订阅',
'proMonthly': 'Pro ¥60/月',
'proMonthlyDesc': '7天免费试用,之后按¥800/年。试用期结束前可随时取消。',
'sevenDayTrial': '7天免费试用',
'unlimitedMonthly': 'Unlimited ¥120/月',
'unlimitedMonthlyDesc': '7天免费试用,之后按¥1600/年。试用期结束前可随时取消。',
'trialNote': '*免费试用7天,然后按年收费,随时取消。',
'proPrice': 'Pro ¥120',
'proMonthlyPrice': '¥120/月',
'subscribe': '订阅',
'unlimitedPrice': 'Unlimited ¥198',
'unlimitedMonthlyPrice': '¥198/月',
'upgradeNote': '*升级订阅后,原订阅的剩余天数会自动折算差价并退还至您的支付账户',
'buyMoreTranscriptionTime': '购买更多转写时长',
'sixThousandMinutes': '6,000分钟',
'threeThousandMinutes': '3,000分钟',
'sixHundredMinutes': '600分钟',
'oneHundredTwentyMinutes': '120分钟',
'validityPeriod': '*有效期:',
'validityNote': '购买后立即激活,激活后2年内有效。',
'purchase': '购买',
// Meeting模块 - 模版和生成
'selectSummaryTemplate': '选择总结模版',
'useThisTemplate': '就用这个模版',
'lastUsed': '上次使用',
'viewAll': '查看全部',
'recordingLanguage': '录音语言',
'chineseSimplified': '中文普通话(简体)',
'meetingGenerateNow': '立即生成',
'keyEventsAnalyzed': '分析出{count}个关键事件。',
'aiAnalysisDesc': 'AI分析识别录音中的关键事件,让你选择重要事件进行AI生成。',
// Meeting模块 - 文件操作和状态
'importing': '正在导入...',
'batchImporting': '正在批量导入...',
'importingLocalRecordings': '正在导入本地录音...',
'importFailed': '导入文件失败: {filePath}, error: {error}',
'importSuccess': '成功导入本地 {count} 条录音',
'importError': '导入失败: {error}',
'pleaseSelectAudioFile': '请选择音频文件',
'shareAudio': '分享会议音频',
'shareComplete': '分享完成!',
'shareFailed': '分享失败: {error}',
'fileProcessingFailed': '文件处理失败: {filePath}, 错误: {error}',
// 翻译模块 - Meeting相关
'meetingUnknownLanguage': '未知语言',
// 权限相关 - Meeting相关
'meetingStoragePermission': '存储',
'meetingStoragePermissionExplanation': '我们需要访问存储权限,以便您可以选择并上传音频文件。',
'meetingStoragePermissionPermanentDenial':
'检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。',
// Meeting模块 - 思维导图相关
'shareMindMap': '分享思维导图',
'shareSuccess': '分享成功',
// Meeting模块 - AI相关
'askAI': '问 AI ...',
'askAIPrompt': '今天我能帮您做点什么呢?',
'continueAsk': '继续提问',
'todoList': '代办事项',
'extractConclusion': '提取结论',
'generateKeyIndicators': '生成关键指标',
// Meeting模块 - 更多操作相关
'reSummarize': '重新总结',
// Meeting模块 - 录音语言相关
'recordLanguage': '录音语言',
// 'chinese': '中文普通话(简体)',
'cantonese': '粤语',
'sichuan': '四川话',
'shanghai': '上海话',
// 'english': '英文',
// 'japanese': '日语',
// 'korean': '韩语',
// 'french': '法语',
// 'spanish': '西班牙语',
// 'portuguese': '葡萄牙语',
// 'indonesian': '印尼语',
// Meeting模块 - 分享相关
'shareLink': '分享链接',
'copyTranscript': '复制转写',
'copySummary': '复制总结',
'exportAudio': '导出音频',
'exportTranscript': '导出转写',
'shareMeetingAudio': '分享会议音频',
'exportSummary': '导出总结',
'exportAs': '导出为',
'exportingPDF': '正在导出PDF...',
// Meeting模块 - 发言者相关
'nameCurrentSpeaker': '命名当前发言者',
'recentlyUsedNames': '最近使用过的名称',
'applyToCurrentParagraph': '应用到当前段落',
'totalTime': '总计',
'summarySpeakerWillBeUpdatedAutomatically': '总结的发言者将自动更新',
// Meeting模块 - 云端同步相关
'syncToCloud': '同步到云端',
'syncToCloudTip': '自动将你的录音同步到云端,你可以通过任意VOITRANS APP或VOITRANS Web(web.voitrans.com)播放、管理和分享录音。',
'syncToVoitransApp': '同步VOITRANS APP',
'transcriptionRecord': '转写记录',
// Meeting模块 - 总结页面相关
'dateAndTime': '日期时间',
'location': '地点',
'attendees': '与会人员',
'inputLocation': '输入地点',
'inputAttendees': '输入与会人员',
// 设置页 // 设置页
"systemSettings": "系统设置", "systemSettings": "系统设置",
"premiumMember": "高级会员", "premiumMember": "高级会员",

4
lib/modules/explore/views/explore_view.dart

@ -23,9 +23,9 @@ class ExploreView extends GetView<ExploreController> {
// 主要内容(可滚动) // 主要内容(可滚动)
Expanded( Expanded(
child: SingleChildScrollView( child: SingleChildScrollView(
physics: const BouncingScrollPhysics(), //physics: const BouncingScrollPhysics(),
child: Padding( child: Padding(
padding: EdgeInsets.fromLTRB(16.w, 0, 16.w, 80.h), padding: EdgeInsets.fromLTRB(16.w, 0, 16.w, 0.h),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [

30
lib/modules/meeting/controllers/meeting_connect_controller.dart

@ -13,7 +13,7 @@ import 'meeting_home_controller.dart';
class MeetingConnectController extends GetxController { class MeetingConnectController extends GetxController {
final _meetingController = Get.find<MeetingHomeController>(); final _meetingController = Get.find<MeetingHomeController>();
RxString stateStr = '搜索中...'.obs; RxString stateStr = 'searching'.tr.obs; // 对应中文:搜索中...
RxBool isRescan = false.obs; RxBool isRescan = false.obs;
RxString importedFilesStr = ''.obs; RxString importedFilesStr = ''.obs;
@ -50,15 +50,15 @@ class MeetingConnectController extends GetxController {
}); });
_isScanningSubscription = FlutterBluePlus.isScanning.listen((state) { _isScanningSubscription = FlutterBluePlus.isScanning.listen((state) {
if (isScanFailed) { if (isScanFailed) {
stateStr.value = '搜索失败,请检查蓝牙是否开启'; stateStr.value = 'searchFailed'.tr; // 对应中文:搜索失败,请检查蓝牙是否开启
isRescan.value = true; isRescan.value = true;
return; return;
} }
if (!state && _device == null) { if (!state && _device == null) {
stateStr.value = '未搜索到 AI PEN 设备'; stateStr.value = 'aiPenNotFound'.tr; // 对应中文:未搜索到 AI PEN 设备
isRescan.value = true; isRescan.value = true;
} else { } else {
stateStr.value = '搜索中...'; stateStr.value = 'searching'.tr; // 对应中文:搜索中...
isRescan.value = false; isRescan.value = false;
} }
}); });
@ -111,7 +111,7 @@ class MeetingConnectController extends GetxController {
_device = result.device; _device = result.device;
await _stopScan(); await _stopScan();
await _connect(); await _connect();
stateStr.value = '已连接到 AI PEN 设备'; stateStr.value = 'connectedToAiPen'.tr; // 对应中文:已连接到 AI PEN 设备
} }
} }
@ -131,7 +131,7 @@ class MeetingConnectController extends GetxController {
for (var element in characteristics) { for (var element in characteristics) {
if (element.characteristicUuid == Guid('FFF1')) { if (element.characteristicUuid == Guid('FFF1')) {
_writeCharacteristic = element; _writeCharacteristic = element;
stateStr.value = '检查是否有新文件需要导入'; stateStr.value = 'checkingNewFiles'.tr; // 对应中文:检查是否有新文件需要导入
sendData([0x5a, 0x01, 0x0d]); sendData([0x5a, 0x01, 0x0d]);
} else if (element.characteristicUuid == Guid('FFF2')) { } else if (element.characteristicUuid == Guid('FFF2')) {
await element.setNotifyValue(true); await element.setNotifyValue(true);
@ -151,11 +151,11 @@ class MeetingConnectController extends GetxController {
switch (command) { switch (command) {
case 0x0d: // 是否有导入文件 case 0x0d: // 是否有导入文件
if (value[3] == 0x01) { if (value[3] == 0x01) {
stateStr.value = '正在开启Wi-Fi...'; stateStr.value = 'startingWifi'.tr; // 对应中文:正在开启Wi-Fi...
importedFilesStr.value = '检查到有新文件,正在准备导入'; importedFilesStr.value = 'newFilesDetected'.tr; // 对应中文:检查到有新文件,正在准备导入
sendData([0x5a, 0x02, 0x87, 0x01]); sendData([0x5a, 0x02, 0x87, 0x01]);
} else { } else {
importedFilesStr.value = '没有新文件需要导入'; importedFilesStr.value = 'noNewFiles'.tr; // 对应中文:没有新文件需要导入
} }
break; break;
case 0x87: // Wi-Fi 开启/关闭 case 0x87: // Wi-Fi 开启/关闭
@ -193,14 +193,14 @@ class MeetingConnectController extends GetxController {
void _connectWifi() async { void _connectWifi() async {
if (_wifiSSID.isNotEmpty && _wifiPassword.isNotEmpty) { if (_wifiSSID.isNotEmpty && _wifiPassword.isNotEmpty) {
stateStr.value = '正在连接 Wi-Fi...'; stateStr.value = 'connectingWifi'.tr; // 对应中文:正在连接 Wi-Fi...
await WiFiForIoTPlugin.connect( await WiFiForIoTPlugin.connect(
_wifiSSID, _wifiSSID,
password: _wifiPassword, password: _wifiPassword,
security: NetworkSecurity.WPA, security: NetworkSecurity.WPA,
); );
await WiFiForIoTPlugin.forceWifiUsage(true); await WiFiForIoTPlugin.forceWifiUsage(true);
stateStr.value = 'Wi-Fi 连接成功'; stateStr.value = 'wifiConnected'.tr; // 对应中文:Wi-Fi 连接成功
sendData([0x5a, 0x01, 0x03]); sendData([0x5a, 0x01, 0x03]);
} }
} }
@ -220,7 +220,7 @@ class MeetingConnectController extends GetxController {
_ftpConnect?.listCommand = ListCommand.LIST; _ftpConnect?.listCommand = ListCommand.LIST;
List<FTPEntry>? listDirectory = await _ftpConnect?.listDirectoryContent(); List<FTPEntry>? listDirectory = await _ftpConnect?.listDirectoryContent();
if (listDirectory != null && listDirectory.isNotEmpty) { if (listDirectory != null && listDirectory.isNotEmpty) {
stateStr.value = '正在下载文件...'; stateStr.value = 'downloadingFiles'.tr; // 对应中文:正在下载文件...
isDownload.value = true; isDownload.value = true;
int totalSize = listDirectory.fold( int totalSize = listDirectory.fold(
0, 0,
@ -228,15 +228,15 @@ class MeetingConnectController extends GetxController {
); );
for (var i = 0; i < listDirectory.length; i++) { for (var i = 0; i < listDirectory.length; i++) {
importedFilesStr.value = importedFilesStr.value =
'共${listDirectory.length}个文件,正在下载第${i + 1}个文件'; 'downloadingFileProgress'.trParams({'total': '${listDirectory.length}', 'current': '${i + 1}'}); // 对应中文:共{total}个文件,正在下载第{current}个文件
int previousSize = i > 0 ? listDirectory[i - 1].size ?? 0 : 0; int previousSize = i > 0 ? listDirectory[i - 1].size ?? 0 : 0;
FTPEntry element = listDirectory[i]; FTPEntry element = listDirectory[i];
await _downloadFile(totalSize, previousSize, element); await _downloadFile(totalSize, previousSize, element);
await _ftpConnect?.deleteFile(element.name); await _ftpConnect?.deleteFile(element.name);
} }
await _disconnect(); await _disconnect();
stateStr.value = '下载完成'; stateStr.value = 'downloadComplete'.tr; // 对应中文:下载完成
importedFilesStr.value = '下载完成,共${listDirectory.length}个文件,2秒后自动返回'; importedFilesStr.value = 'downloadCompleteInfo'.trParams({'count': '${listDirectory.length}'}); // 对应中文:下载完成,共{count}个文件,2秒后自动返回
Future.delayed(const Duration(seconds: 2), () { Future.delayed(const Duration(seconds: 2), () {
_executeUpload(); _executeUpload();
Get.back(); Get.back();

28
lib/modules/meeting/controllers/meeting_home_controller.dart

@ -110,9 +110,9 @@ class MeetingHomeController extends GetxController {
PermissionUtil.instance PermissionUtil.instance
.requestPermission( .requestPermission(
permissionType: Permission.storage, permissionType: Permission.storage,
permissionName: "存储", permissionName: "meetingStoragePermission".tr, // 对应中文:存储
explanationText: "我们需要访问存储权限,以便您可以选择并上传音频文件。", explanationText: "meetingStoragePermissionExplanation".tr, // 对应中文:我们需要访问存储权限,以便您可以选择并上传音频文件。
permanentDenialText: "检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。", permanentDenialText: "meetingStoragePermissionPermanentDenial".tr, // 对应中文:检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。
) )
.then((granted) { .then((granted) {
if (granted) { if (granted) {
@ -164,17 +164,17 @@ class MeetingHomeController extends GetxController {
try { try {
await Share.shareXFiles( await Share.shareXFiles(
[XFile(filePath)], [XFile(filePath)],
text: '分享会议音频', text: 'shareAudio'.tr, // 对应中文:分享会议音频
); );
EasyLoading.showToast('分享完成!'); EasyLoading.showToast('shareComplete'.tr); // 对应中文:分享完成!
} catch (e) { } catch (e) {
EasyLoading.showToast('分享失败: ${e.toString()}'); EasyLoading.showToast('shareFailed'.trParams({'error': e.toString()})); // 对应中文:分享失败: {error}
} }
} }
void addMeetingAudio() async { void addMeetingAudio() async {
EasyLoading.show(status: '正在导入本地录音...'); EasyLoading.show(status: 'importingLocalRecordings'.tr); // 对应中文:正在导入本地录音...
try { try {
int addUp = 0; int addUp = 0;
final appDir = await appDocDir; final appDir = await appDocDir;
@ -258,19 +258,19 @@ class MeetingHomeController extends GetxController {
addUp++; addUp++;
} }
} catch (e) { } catch (e) {
print("文件处理失败: ${fileEntity.path}, 错误: $e"); print('fileProcessingFailed'.trParams({'filePath': fileEntity.path, 'error': e.toString()})); // 对应中文:文件处理失败: {filePath}, 错误: {error}
} }
} }
if (addUp > 0) EasyLoading.showSuccess('成功导入本地 $addUp 条录音'); if (addUp > 0) EasyLoading.showSuccess('importSuccess'.trParams({'count': '$addUp'})); // 对应中文:成功导入本地 {count} 条录音
} catch (e) { } catch (e) {
EasyLoading.showError('导入失败: $e'); EasyLoading.showError('importError'.trParams({'error': e.toString()})); // 对应中文:导入失败: {error}
} finally { } finally {
EasyLoading.dismiss(); EasyLoading.dismiss();
} }
} }
void addTranslatAudio() async { void addTranslatAudio() async {
EasyLoading.show(status: '正在批量导入...'); EasyLoading.show(status: 'batchImporting'.tr); // 对应中文:正在批量导入...
for (final filePath in selected) { for (final filePath in selected) {
try { try {
await _audioPlayer.setAudioSource(AudioSource.file(filePath)); await _audioPlayer.setAudioSource(AudioSource.file(filePath));
@ -308,14 +308,14 @@ class MeetingHomeController extends GetxController {
} }
} }
} catch (e) { } catch (e) {
Logger.error('导入文件失败: $filePath, error: $e'); Logger.error('importFailed'.trParams({'filePath': filePath, 'error': e.toString()})); // 对应中文:导入文件失败: {filePath}, error: {error}
} }
} }
EasyLoading.dismiss(); EasyLoading.dismiss();
} }
void addAudio([String? filePath]) async { void addAudio([String? filePath]) async {
EasyLoading.show(status: '正在导入...'); EasyLoading.show(status: 'importing'.tr); // 对应中文:正在导入...
String fileName = ""; String fileName = "";
bool isParamProvided = filePath != null; // 更清晰的变量名 bool isParamProvided = filePath != null; // 更清晰的变量名
if (filePath != null) { if (filePath != null) {
@ -331,7 +331,7 @@ class MeetingHomeController extends GetxController {
if (!_isAudioFile(file.name)) { if (!_isAudioFile(file.name)) {
Get.snackbar( Get.snackbar(
'error'.tr, // 错误 'error'.tr, // 错误
'请选择音频文件', 'pleaseSelectAudioFile'.tr, // 对应中文:请选择音频文件
snackPosition: SnackPosition.TOP, snackPosition: SnackPosition.TOP,
backgroundColor: Colors.red.withOpacity(0.1), backgroundColor: Colors.red.withOpacity(0.1),
colorText: Colors.red, colorText: Colors.red,

12
lib/modules/meeting/controllers/meeting_record_controller.dart

@ -154,13 +154,13 @@ class MeetingRecordController extends GetxController
// Set default filename based on audio type // Set default filename based on audio type
switch (audioType.value) { switch (audioType.value) {
case 0: case 0:
fileName.value = "现场录音"; fileName.value = "liveRecording".tr; //对应中文:现场录音
break; break;
case 1: case 1:
fileName.value = "音、视频录音"; fileName.value = "audioVideoRecording".tr; //对应中文:音视频录音
break; break;
case 2: case 2:
fileName.value = "通话录音"; fileName.value = "callRecording".tr; //对应中文:电话录音
break; break;
} }
newName.value = fileName.value; newName.value = fileName.value;
@ -460,13 +460,13 @@ class MeetingRecordController extends GetxController
void _resetToDefaultState() { void _resetToDefaultState() {
switch (audioType.value) { switch (audioType.value) {
case 0: case 0:
fileName.value = "现场录音"; fileName.value = "liveRecording".tr; //对应中文:现场录音
break; break;
case 1: case 1:
fileName.value = "音、视频录音"; fileName.value = "audioVideoRecording".tr; //对应中文:音视频录音
break; break;
case 2: case 2:
fileName.value = "通话录音"; fileName.value = "callRecording".tr; //对应中文:电话录音
break; break;
} }
newName.value = fileName.value; newName.value = fileName.value;

5
lib/modules/meeting/controllers/mind_map_controller.dart

@ -175,11 +175,12 @@ class MindMapController extends GetxController {
final File file = File('${tempDir.path}/$fileName'); final File file = File('${tempDir.path}/$fileName');
await file.writeAsBytes(bytes); await file.writeAsBytes(bytes);
final result = await SharePlus.instance.share(ShareParams( final result = await SharePlus.instance.share(ShareParams(
text: '分享思维导图', text: 'shareMindMap'.tr, //对应中文:分享思维导图
files: [XFile(file.path)], files: [XFile(file.path)],
)); ));
if (result.status == ShareResultStatus.success) { if (result.status == ShareResultStatus.success) {
EasyLoading.showToast('分享完成!'); EasyLoading.showToast('shareSuccess'.tr); //对应中文:分享成功
} }
} }
} }

12
lib/modules/meeting/views/bottomSheet/ai_bottom_sheet.dart

@ -30,9 +30,9 @@ class _AIBottomSheetState extends State<AIBottomSheet> {
List _dataList = []; List _dataList = [];
final List _cruxList = [ final List _cruxList = [
'代办事项', 'todoList'.tr, //对应中文:代办事项
'提取结论', 'extractConclusion'.tr, //对应中文:提取结论
'生成关键指标', 'generateKeyIndicators'.tr, //对应中文:生成关键指标
]; ];
final StringBuffer _buffer = StringBuffer(); final StringBuffer _buffer = StringBuffer();
bool _isAdd = true; bool _isAdd = true;
@ -179,7 +179,7 @@ class _AIBottomSheetState extends State<AIBottomSheet> {
Padding( Padding(
padding: EdgeInsets.only(bottom: 5.w), padding: EdgeInsets.only(bottom: 5.w),
child: Text( child: Text(
'继续提问', 'continueAsk'.tr, //对应中文:继续提问
style: TextStyle( style: TextStyle(
color: Colors.grey, color: Colors.grey,
fontSize: 13.sp, fontSize: 13.sp,
@ -226,7 +226,7 @@ class _AIBottomSheetState extends State<AIBottomSheet> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
'今天我能帮您做点什么呢?', 'askAIPrompt'.tr, //对应中文:今天我能帮您做点什么呢?
style: TextStyle( style: TextStyle(
fontSize: 18.sp, fontSize: 18.sp,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
@ -310,7 +310,7 @@ class _AIBottomSheetState extends State<AIBottomSheet> {
height: 1.4, height: 1.4,
), ),
decoration: InputDecoration( decoration: InputDecoration(
hintText: '问 AI ...', hintText: 'askAI'.tr, //对应中文:问 AI ...
hintStyle: TextStyle( hintStyle: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: Colors.grey[400], color: Colors.grey[400],

10
lib/modules/meeting/views/bottomSheet/filtrate_drawer.dart

@ -47,7 +47,7 @@ class _FiltrateDrawerState extends State<FiltrateDrawer> {
fontSize: 14.sp, fontSize: 14.sp,
), ),
decoration: InputDecoration( decoration: InputDecoration(
hintText: '在所有文件中搜索', hintText: 'searchInAllFiles'.tr, // 对应中文:在所有文件中搜索
hintStyle: TextStyle( hintStyle: TextStyle(
color: Colors.black54, color: Colors.black54,
fontSize: 14.sp, fontSize: 14.sp,
@ -109,7 +109,7 @@ class _FiltrateDrawerState extends State<FiltrateDrawer> {
), ),
6.horizontalSpace, 6.horizontalSpace,
Text( Text(
'全部文件(${_homeController.originalDataList.length})', '${'allFiles'.tr}(${_homeController.originalDataList.length})', // 对应中文:全部文件
style: TextStyle( style: TextStyle(
color: Colors.black87, color: Colors.black87,
fontSize: 14.sp, fontSize: 14.sp,
@ -129,7 +129,7 @@ class _FiltrateDrawerState extends State<FiltrateDrawer> {
Padding( Padding(
padding: EdgeInsets.only(bottom: 10.w), padding: EdgeInsets.only(bottom: 10.w),
child: Text( child: Text(
'来自', 'from'.tr, // 对应中文:来自
style: TextStyle( style: TextStyle(
color: Colors.grey, color: Colors.grey,
fontSize: 14.sp, fontSize: 14.sp,
@ -174,7 +174,7 @@ class _FiltrateDrawerState extends State<FiltrateDrawer> {
Padding( Padding(
padding: EdgeInsets.symmetric(vertical: 10.w), padding: EdgeInsets.symmetric(vertical: 10.w),
child: Text( child: Text(
'排序方式', 'sortBy'.tr, // 对应中文:排序方式
style: TextStyle( style: TextStyle(
color: Colors.grey, color: Colors.grey,
fontSize: 14.sp, fontSize: 14.sp,
@ -197,7 +197,7 @@ class _FiltrateDrawerState extends State<FiltrateDrawer> {
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'创建时间', 'creationTime'.tr, // 对应中文:创建时间
style: TextStyle( style: TextStyle(
color: Colors.black87, color: Colors.black87,
fontSize: 14.sp, fontSize: 14.sp,

14
lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart

@ -24,7 +24,7 @@ class _GenerateBottomSheetState extends State<GenerateBottomSheet> {
final GetStorage _storage = GetStorage(); final GetStorage _storage = GetStorage();
bool _isSpeaker = true; bool _isSpeaker = true;
String _languageText = '中文普通话(简体)'; String _languageText = 'chineseSimplified'.tr; // 对应中文:中文普通话(简体)
String _language = 'zh-CN'; String _language = 'zh-CN';
final Map _icons = { final Map _icons = {
@ -149,7 +149,7 @@ class _GenerateBottomSheetState extends State<GenerateBottomSheet> {
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
'选择总结模版', 'selectSummaryTemplate'.tr, // 对应中文:选择总结模版
style: TextStyle( style: TextStyle(
fontSize: 14.sp, fontSize: 14.sp,
color: Colors.black87, color: Colors.black87,
@ -186,7 +186,7 @@ class _GenerateBottomSheetState extends State<GenerateBottomSheet> {
child: Row( child: Row(
children: [ children: [
Text( Text(
'查看全部', 'viewAll'.tr, // 对应中文:查看全部
style: TextStyle( style: TextStyle(
fontSize: 12.sp, fontSize: 12.sp,
color: Colors.grey, color: Colors.grey,
@ -226,7 +226,7 @@ class _GenerateBottomSheetState extends State<GenerateBottomSheet> {
child: Column( child: Column(
children: [ children: [
_row( _row(
'区分说话人', 'speakerIdentification'.tr, // 对应中文:区分说话人
widget: Transform.scale( widget: Transform.scale(
scale: 0.8, scale: 0.8,
alignment: Alignment.centerRight, alignment: Alignment.centerRight,
@ -241,7 +241,7 @@ class _GenerateBottomSheetState extends State<GenerateBottomSheet> {
), ),
), ),
_row( _row(
'录音语言', 'recordingLanguage'.tr, // 对应中文:录音语言
value: _languageText, value: _languageText,
isBorder: false, isBorder: false,
onTap: () { onTap: () {
@ -296,7 +296,7 @@ class _GenerateBottomSheetState extends State<GenerateBottomSheet> {
borderRadius: BorderRadius.circular(12.r), borderRadius: BorderRadius.circular(12.r),
), ),
child: Text( child: Text(
'立即生成', 'meetingGenerateNow'.tr, // 对应中文:立即生成
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: Colors.white, color: Colors.white,
@ -416,7 +416,7 @@ class _GenerateBottomSheetState extends State<GenerateBottomSheet> {
), ),
), ),
child: Text( child: Text(
'上次使用', 'lastUsed'.tr, // 对应中文:上次使用
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 12.sp, fontSize: 12.sp,

19
lib/modules/meeting/views/bottomSheet/member_bottom_sheet.dart

@ -63,11 +63,16 @@ class MemberBottomSheet extends StatelessWidget {
), ),
), ),
), ),
_item(Icons.access_time, Colors.red, '每月300分钟转写时长'), _item(Icons.access_time, Colors.red,
_item(Icons.description, Colors.purpleAccent, '为行业细分场景设计的专业总结模版'), 'monthlyTranscriptionDuration'.tr), //对应中文:每月300分钟转写时长
_item(Icons.auto_awesome, Colors.purpleAccent, 'Autopilot 模版自动总结'), _item(Icons.description, Colors.purpleAccent,
_item(Icons.people, Colors.red, '区分不同说话人'), 'industrySpecificSummaryTemplate'.tr), //对应中文:为行业细分场景设计的专业总结模版
_item(Icons.cloud_upload, Colors.red, '从APP、WEB导入音频进行转写和总结'), _item(Icons.auto_awesome, Colors.purpleAccent,
'autopilotTemplateSummary'.tr), //对应中文:Autopilot 模版自动总结
_item(Icons.people, Colors.red,
'distinguishDifferentSpeakers'.tr), //对应中文:区分不同说话人
_item(Icons.cloud_upload, Colors.red,
'importAudioFromAppWeb'.tr), //对应中文:从APP、WEB导入音频进行转写和总结
Padding( Padding(
padding: EdgeInsets.symmetric(vertical: 20.w), padding: EdgeInsets.symmetric(vertical: 20.w),
child: Row( child: Row(
@ -92,7 +97,7 @@ class MemberBottomSheet extends StatelessWidget {
), ),
), ),
child: Text( child: Text(
'发现更多', 'findMore'.tr, //对应中文:发现更多
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: Colors.black, color: Colors.black,
@ -113,7 +118,7 @@ class MemberBottomSheet extends StatelessWidget {
borderRadius: BorderRadius.circular(12.r), borderRadius: BorderRadius.circular(12.r),
), ),
child: Text( child: Text(
'立即绑定', 'bindImmediately'.tr, //对应中文:立即绑定
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: Colors.white, color: Colors.white,

7
lib/modules/meeting/views/bottomSheet/more_bottom_sheet.dart

@ -25,7 +25,7 @@ class _MoreBottomSheetState extends State<MoreBottomSheet> {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
SizedBox(height: 10.w), SizedBox(height: 10.w),
_shareItem(Icons.refresh, '重新总结', _shareItem(Icons.refresh, 'reSummarize'.tr, //重新总结
onTap: _detailsController.meetingDetails.value.tasktype >= 3 onTap: _detailsController.meetingDetails.value.tasktype >= 3
? () { ? () {
Get.back(); Get.back();
@ -43,7 +43,7 @@ class _MoreBottomSheetState extends State<MoreBottomSheet> {
); );
} }
: null), : null),
_shareItem(Icons.delete_outline, '删除', onTap: () async { _shareItem(Icons.delete_outline, 'delete'.tr, onTap: () async {
_controller.deleteMeeting( _controller.deleteMeeting(
_detailsController.meetingData.value.id, _detailsController.meetingData.value.id,
_detailsController.meetingData.value.filepath, _detailsController.meetingData.value.filepath,
@ -85,7 +85,8 @@ class _MoreBottomSheetState extends State<MoreBottomSheet> {
title, title,
style: TextStyle( style: TextStyle(
fontSize: 14.sp, fontSize: 14.sp,
color: Colors.black87.withValues(alpha: onTap != null ? 1 : 0.5), color:
Colors.black87.withValues(alpha: onTap != null ? 1 : 0.5),
), ),
), ),
), ),

13
lib/modules/meeting/views/bottomSheet/navigation_bar_bottom_sheet.dart

@ -1,7 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get_navigation/src/extension_navigation.dart'; import 'package:get/get.dart';
import 'package:get/state_manager.dart';
import '../../../../routes/app_routes.dart'; import '../../../../routes/app_routes.dart';
import '../../controllers/meeting_home_controller.dart'; import '../../controllers/meeting_home_controller.dart';
@ -18,14 +17,14 @@ class NavigationBarBottomSheet extends GetView<MeetingHomeController> {
if (controller.meetingController.type == 0) if (controller.meetingController.type == 0)
_buildItem( _buildItem(
context, // 传递 context 参数 context, // 传递 context 参数
'开始录音', 'startRecording'.tr, // 对应中文:开始录音
Icons.mic_rounded, Icons.mic_rounded,
Colors.red, Colors.red,
), ),
if (controller.meetingController.type == 1) if (controller.meetingController.type == 1)
_buildItem( _buildItem(
context, // 传递 context 参数 context, // 传递 context 参数
'现场录音', 'liveRecording'.tr, // 对应中文:现场录音
Icons.mic_rounded, Icons.mic_rounded,
Colors.red, Colors.red,
onTap: () async { onTap: () async {
@ -39,7 +38,7 @@ class NavigationBarBottomSheet extends GetView<MeetingHomeController> {
if (controller.meetingController.type == 1) if (controller.meetingController.type == 1)
_buildItem( _buildItem(
context, // 传递 context 参数 context, // 传递 context 参数
'音、视频录音', 'audioVideoRecording'.tr, // 对应中文:音、视频录音
Icons.videocam, Icons.videocam,
Colors.green, Colors.green,
onTap: controller.bleManager.isConnected onTap: controller.bleManager.isConnected
@ -55,7 +54,7 @@ class NavigationBarBottomSheet extends GetView<MeetingHomeController> {
if (controller.meetingController.type == 1) if (controller.meetingController.type == 1)
_buildItem( _buildItem(
context, // 传递 context 参数 context, // 传递 context 参数
'通话录音', 'callRecording'.tr, // 对应中文:通话录音
Icons.phone, Icons.phone,
Colors.orange, Colors.orange,
onTap: controller.bleManager.isConnected onTap: controller.bleManager.isConnected
@ -70,7 +69,7 @@ class NavigationBarBottomSheet extends GetView<MeetingHomeController> {
), ),
_buildItem( _buildItem(
context, // 传递 context 参数 context, // 传递 context 参数
'导入音频', 'importAudio'.tr, // 对应中文:导入音频
Icons.file_upload_outlined, Icons.file_upload_outlined,
Colors.deepPurple, Colors.deepPurple,
onTap: () { onTap: () {

24
lib/modules/meeting/views/bottomSheet/record_language_bottom_sheet.dart

@ -14,17 +14,17 @@ class RecordLanguageBottomSheet extends StatefulWidget {
class _RecordLanguageBottomSheetState extends State<RecordLanguageBottomSheet> { class _RecordLanguageBottomSheetState extends State<RecordLanguageBottomSheet> {
final List _languages = [ final List _languages = [
{'name': '中文普通话(简体)', 'value': 'zh-CN'}, {'name': 'chinese'.tr, 'value': 'zh-CN'}, // 对应中文:中文普通话(简体)
{'name': '粤语', 'value': 'cant'}, {'name': 'cantonese'.tr, 'value': 'cant'}, // 对应中文:粤语
{'name': '四川话', 'value': 'sc'}, {'name': 'sichuan'.tr, 'value': 'sc'}, // 对应中文:四川话
{'name': '上海话', 'value': 'zh_shanghai'}, {'name': 'shanghai'.tr, 'value': 'zh_shanghai'}, // 对应中文:上海话
{'name': '英文', 'value': 'en-US'}, {'name': 'english'.tr, 'value': 'en-US'}, // 对应中文:英文
{'name': '日语', 'value': 'ja-JP'}, {'name': 'japanese'.tr, 'value': 'ja-JP'}, // 对应中文:日语
{'name': '韩语', 'value': 'ko-KR'}, {'name': 'korean'.tr, 'value': 'ko-KR'}, // 对应中文:韩语
{'name': '法语', 'value': 'fr-FR'}, {'name': 'french'.tr, 'value': 'fr-FR'}, // 对应中文:法语
{'name': '西班牙语', 'value': 'es-MX'}, {'name': 'spanish'.tr, 'value': 'es-MX'}, // 对应中文:西班牙语
{'name': '葡萄牙语', 'value': 'pt-BR'}, {'name': 'portuguese'.tr, 'value': 'pt-BR'}, // 对应中文:葡萄牙语
{'name': '印尼语', 'value': 'id-ID'}, {'name': 'indonesian'.tr, 'value': 'id-ID'}, // 对应中文:印尼语
]; ];
@override @override
@ -40,7 +40,7 @@ class _RecordLanguageBottomSheetState extends State<RecordLanguageBottomSheet> {
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'录音语言', 'recordLanguage'.tr, // 对应中文:录音语言
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: Colors.black87, color: Colors.black87,

2
lib/modules/meeting/views/bottomSheet/second_level_bottom_sheet.dart

@ -148,7 +148,7 @@ class _SecondLevelBottomSheetState extends State<SecondLevelBottomSheet> {
borderRadius: BorderRadius.circular(12.r), borderRadius: BorderRadius.circular(12.r),
), ),
child: Text( child: Text(
'导出', 'export'.tr, // 对应中文:导出
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: Colors.white, color: Colors.white,

41
lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart

@ -79,7 +79,7 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
_box([ _box([
_shareItem( _shareItem(
Icons.link, Icons.link,
'分享链接', 'shareLink'.tr, // 对应中文:分享链接
isBorder: false, isBorder: false,
onTap: () async { onTap: () async {
Get.back(); Get.back();
@ -110,20 +110,20 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
previewThumbnail: thumbnail, previewThumbnail: thumbnail,
)); ));
if (result.status == ShareResultStatus.success) { if (result.status == ShareResultStatus.success) {
EasyLoading.showToast('分享完成!'); EasyLoading.showToast('shareSuccess'.tr); // 对应中文:分享完成
} }
}, },
), ),
]), ]),
_box([ _box([
_shareItem(Icons.copy, '复制转写', _shareItem(Icons.copy, 'copyTranscript'.tr, // 对应中文:复制转写
onTap: _controller.meetingDetails.value.tasktype >= 2 onTap: _controller.meetingDetails.value.tasktype >= 2
? () { ? () {
Get.back(); Get.back();
_copy(_getAllText()); _copy(_getAllText());
} }
: null), : null),
_shareItem(Icons.copy, '复制总结', _shareItem(Icons.copy, 'copySummary'.tr, // 对应中文:复制总结
isBorder: false, isBorder: false,
onTap: _controller.meetingDetails.value.tasktype >= 3 onTap: _controller.meetingDetails.value.tasktype >= 3
? () { ? () {
@ -133,11 +133,14 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
: null), : null),
]), ]),
_box([ _box([
_shareItem(Icons.multitrack_audio, '导出音频', onTap: () { _shareItem(
Icons.multitrack_audio, 'exportAudio'.tr, // 对应中文:导出音频
onTap: () {
Get.back(); Get.back();
_share(_controller.meetingData.value.filepath, '分享会议音频'); _share(_controller.meetingData.value.filepath,
'shareMeetingAudio'.tr); // 对应中文:分享会议音频
}), }),
_shareItem(Icons.message, '导出转写', _shareItem(Icons.message, 'exportTranscript'.tr, // 对应中文:导出转写
onTap: _controller.meetingDetails.value.tasktype >= 2 onTap: _controller.meetingDetails.value.tasktype >= 2
? () async { ? () async {
Get.back(); Get.back();
@ -146,17 +149,18 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
'${tempDir.path}/${_controller.meetingData.value.title}_speaker.txt'); '${tempDir.path}/${_controller.meetingData.value.title}_speaker.txt');
String allText = _getAllText(); String allText = _getAllText();
await file.writeAsString(allText); await file.writeAsString(allText);
_share(file.path, '分享会议转写'); _share(file.path,
'exportTranscript'.tr); // 对应中文:分享会议转写
} }
: null), : null),
_shareItem(Icons.article, '导出总结', _shareItem(Icons.article, 'exportSummary'.tr, // 对应中文:导出总结
onTap: _controller.meetingDetails.value.tasktype >= 3 onTap: _controller.meetingDetails.value.tasktype >= 3
? () async { ? () async {
Get.back(); Get.back();
Get.bottomSheet( Get.bottomSheet(
SecondLevelBottomSheet( SecondLevelBottomSheet(
'导出总结', 'exportSummary'.tr, // 对应中文:导出总结
'导出为', 'exportAs'.tr, // 对应中文:导出为
(int index) async { (int index) async {
if (index == 0) { if (index == 0) {
// 导出TXT // 导出TXT
@ -166,7 +170,8 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
'${tempDir.path}/${_controller.meetingData.value.title}_summary.txt'); '${tempDir.path}/${_controller.meetingData.value.title}_summary.txt');
await file.writeAsString(_controller await file.writeAsString(_controller
.meetingDetails.value.summary); .meetingDetails.value.summary);
_share(file.path, '分享会议总结'); _share(file.path,
'exportSummary'.tr); // 对应中文:分享会议总结
} else { } else {
// 导出PDF // 导出PDF
_exportMarkdownPdf(); _exportMarkdownPdf();
@ -197,7 +202,7 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
: null), : null),
_shareItem( _shareItem(
Icons.lan, Icons.lan,
'导出思维导图', 'shareMindMap'.tr, // 对应中文:分享思维导图
isBorder: false, isBorder: false,
onTap: _controller.meetingDetails.value.tasktype >= 3 onTap: _controller.meetingDetails.value.tasktype >= 3
? () { ? () {
@ -298,7 +303,7 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
files: [XFile(filepath)], files: [XFile(filepath)],
)); ));
if (result.status == ShareResultStatus.success) { if (result.status == ShareResultStatus.success) {
EasyLoading.showToast('分享完成!'); EasyLoading.showToast('shareSuccess'.tr); // 对应中文:分享完成!
} }
} }
@ -307,8 +312,8 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
text: text, text: text,
)).then( )).then(
(value) => Get.snackbar( (value) => Get.snackbar(
'success'.tr, // 成功 'success'.tr, // 对应中文:成功
'复制成功', 'copySuccess'.tr, // 对应中文:复制成功
backgroundColor: Colors.blue.withValues(alpha: 0.8), backgroundColor: Colors.blue.withValues(alpha: 0.8),
colorText: Colors.white, colorText: Colors.white,
), ),
@ -340,7 +345,7 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
} }
Future<void> _exportMarkdownPdf() async { Future<void> _exportMarkdownPdf() async {
EasyLoading.show(status: '正在导出PDF...'); EasyLoading.show(status: 'exportingPDF'.tr); // 对应中文:正在导出PDF...
final tempDir = await getTemporaryDirectory(); final tempDir = await getTemporaryDirectory();
final file = File( final file = File(
'${tempDir.path}/${_controller.meetingData.value.title}_summary.pdf'); '${tempDir.path}/${_controller.meetingData.value.title}_summary.pdf');
@ -357,7 +362,7 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
build: (context) => markdownWidgets, build: (context) => markdownWidgets,
)); ));
await file.writeAsBytes(await markdownPdf.save()); await file.writeAsBytes(await markdownPdf.save());
await _share(file.path, '分享会议总结'); await _share(file.path, 'exportSummary'.tr); // 对应中文:分享会议总结
EasyLoading.dismiss(); EasyLoading.dismiss();
} }
} }

13
lib/modules/meeting/views/bottomSheet/speaker_all_bottom_sheet.dart

@ -100,7 +100,7 @@ class _SpeakerAllBottomSheetState extends State<SpeakerAllBottomSheet> {
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'命名发言者', 'nameSpeaker'.tr, // 对应中文:命名发言者
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: Colors.black87, color: Colors.black87,
@ -209,7 +209,7 @@ class _SpeakerAllBottomSheetState extends State<SpeakerAllBottomSheet> {
Padding( Padding(
padding: EdgeInsets.only(top: 10.w, bottom: 5.w), padding: EdgeInsets.only(top: 10.w, bottom: 5.w),
child: Text( child: Text(
'最近使用过的名称', 'recentlyUsedNames'.tr, // 对应中文:最近使用过的名称
style: TextStyle( style: TextStyle(
fontSize: 12.sp, fontSize: 12.sp,
color: Colors.grey[600]!, color: Colors.grey[600]!,
@ -259,7 +259,7 @@ class _SpeakerAllBottomSheetState extends State<SpeakerAllBottomSheet> {
child: Row( child: Row(
children: [ children: [
Text( Text(
'总计', 'totalTime'.tr, // 对应中文:总计
style: TextStyle( style: TextStyle(
fontSize: 12.sp, fontSize: 12.sp,
color: Colors.grey, color: Colors.grey,
@ -431,7 +431,7 @@ class _SpeakerAllBottomSheetState extends State<SpeakerAllBottomSheet> {
Padding( Padding(
padding: EdgeInsets.symmetric(vertical: 5.w), padding: EdgeInsets.symmetric(vertical: 5.w),
child: Text( child: Text(
'总结的发言者将自动更新', 'summarySpeakerWillBeUpdatedAutomatically'.tr, // 对应中文:总结的发言者将自动更新
style: TextStyle( style: TextStyle(
fontSize: 14.sp, fontSize: 14.sp,
color: Colors.grey[600], color: Colors.grey[600],
@ -453,7 +453,7 @@ class _SpeakerAllBottomSheetState extends State<SpeakerAllBottomSheet> {
borderRadius: BorderRadius.circular(12.r), borderRadius: BorderRadius.circular(12.r),
), ),
child: Text( child: Text(
'取消', 'cancel'.tr, // 对应中文:取消
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: Colors.black, color: Colors.black,
@ -474,7 +474,8 @@ class _SpeakerAllBottomSheetState extends State<SpeakerAllBottomSheet> {
borderRadius: BorderRadius.circular(12.r), borderRadius: BorderRadius.circular(12.r),
), ),
child: Text( child: Text(
'确认', 'confirm'.tr, // 对应中文:确认
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: Colors.white, color: Colors.white,

15
lib/modules/meeting/views/bottomSheet/speaker_bottom_sheet.dart

@ -71,7 +71,7 @@ class _SpeakerBottomSheetState extends State<SpeakerBottomSheet> {
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'命名当前发言者', 'nameCurrentSpeaker'.tr, // 对应中文:命名当前发言者
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: Colors.black87, color: Colors.black87,
@ -158,7 +158,7 @@ class _SpeakerBottomSheetState extends State<SpeakerBottomSheet> {
children: [ children: [
if (index == 0) if (index == 0)
Text( Text(
'最近使用过的名称', 'recentlyUsedNames'.tr, // 对应中文:最近使用过的名称
style: TextStyle( style: TextStyle(
fontSize: 12.sp, fontSize: 12.sp,
color: Colors.grey[600]!, color: Colors.grey[600]!,
@ -189,15 +189,18 @@ class _SpeakerBottomSheetState extends State<SpeakerBottomSheet> {
}, },
), ),
), ),
_row('应用到当前段落', _type == 0, onTap: () { _row(
'applyToCurrentParagraph'.tr, // 对应中文:应用到当前段落
_type == 0, onTap: () {
setState(() { setState(() {
_type = 0; _type = 0;
}); });
}), }),
_row( _row(
'应用到这个发言者的所有段落', 'applyToAllParagraphs'.tr, // 对应中文:应用到这个发言者的所有段落
_type == 1, _type == 1,
description: '总结将根据模版自动更新', description:
'summaryWillBeUpdatedAutomatically'.tr, // 对应中文:总结将根据模版自动更新
onTap: () { onTap: () {
setState(() { setState(() {
_type = 1; _type = 1;
@ -216,7 +219,7 @@ class _SpeakerBottomSheetState extends State<SpeakerBottomSheet> {
borderRadius: BorderRadius.circular(12.r), borderRadius: BorderRadius.circular(12.r),
), ),
child: Text( child: Text(
'保存', 'save'.tr, // 对应中文:保存
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: Colors.white, color: Colors.white,

4
lib/modules/meeting/views/meeting_connect_view.dart

@ -32,7 +32,7 @@ class MeetingConnectView extends GetView<MeetingConnectController> {
onPressed: () => Get.back(), onPressed: () => Get.back(),
), ),
title: Text( title: Text(
'蓝牙连接', 'bluetoothConnection'.tr, // 对应中文:蓝牙连接
style: TextStyle( style: TextStyle(
fontSize: 17.sp, fontSize: 17.sp,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
@ -63,7 +63,7 @@ class MeetingConnectView extends GetView<MeetingConnectController> {
), ),
Obx( Obx(
() => controller.isRescan.value () => controller.isRescan.value
? _button('重新连接', Icons.refresh, onTap: () { ? _button('meetingReconnect'.tr, Icons.refresh, onTap: () { // 对应中文:重新连接
controller.startScan(); controller.startScan();
}) })
: const SizedBox(), : const SizedBox(),

20
lib/modules/meeting/views/meeting_details_view.dart

@ -301,10 +301,10 @@ class MeetingDetailsView extends GetView<MeetingDetailsController> {
child: Obx( child: Obx(
() => Row( () => Row(
children: [ children: [
_iconItem(Icons.summarize, '概览', 0), _iconItem(Icons.summarize, 'overview'.tr, 0), // 对应中文:概览
_iconItem(Icons.message, '转写', 1), _iconItem(Icons.message, 'transcription'.tr, 1), // 对应中文:转写
_iconItem(Icons.article, '总结', 2), _iconItem(Icons.article, 'summary'.tr, 2), // 对应中文:总结
_iconItem(Icons.lan, '思维导图', 3), _iconItem(Icons.lan, 'mindMap'.tr, 3), // 对应中文:思维导图
], ],
), ),
), ),
@ -327,12 +327,12 @@ class MeetingDetailsView extends GetView<MeetingDetailsController> {
? const SizedBox() ? const SizedBox()
: controller.meetingDetails.value.tasktype == 1 || : controller.meetingDetails.value.tasktype == 1 ||
controller.meetingDetails.value.tasktype == 2 controller.meetingDetails.value.tasktype == 2
? _meetingWait('正在分析...') ? _meetingWait('analyzing'.tr) // 对应中文:正在分析...
: const OverviewTab(), : const OverviewTab(),
), ),
Obx( Obx(
() => controller.meetingDetails.value.tasktype == 1 () => controller.meetingDetails.value.tasktype == 1
? _meetingWait('正在转写...') ? _meetingWait('transcribing'.tr) // 对应中文:正在转写...
: const SpeechTab(), : const SpeechTab(),
), ),
Obx( Obx(
@ -340,8 +340,8 @@ class MeetingDetailsView extends GetView<MeetingDetailsController> {
controller.meetingDetails.value.tasktype == 2 controller.meetingDetails.value.tasktype == 2
? _meetingWait( ? _meetingWait(
controller.meetingDetails.value.tasktype == 1 controller.meetingDetails.value.tasktype == 1
? '正在转写...' ? 'transcribing'.tr // 对应中文:正在转写...
: '正在总结...') : 'summarizing'.tr) // 对应中文:正在总结...
: const SummaryTab(), : const SummaryTab(),
), ),
Obx( Obx(
@ -351,8 +351,8 @@ class MeetingDetailsView extends GetView<MeetingDetailsController> {
? const SizedBox() ? const SizedBox()
: _meetingWait( : _meetingWait(
controller.meetingDetails.value.tasktype == 1 controller.meetingDetails.value.tasktype == 1
? '正在转写...' ? 'transcribing'.tr // 对应中文:正在转写...
: '正在总结...'), : 'summarizing'.tr), // 对应中文:正在总结...
), ),
], ],
), ),

10
lib/modules/meeting/views/meeting_home_view.dart

@ -86,7 +86,7 @@ class _MeetingHomeViewState extends State<MeetingHomeView>
5.horizontalSpace, 5.horizontalSpace,
Obx( Obx(
() => Text( () => Text(
'${_controller.filtrateType.value.isNotEmpty ? _controller.filtrateType : '全部文件'}(${_controller.dataList.length})', '${_controller.filtrateType.value.isNotEmpty ? _controller.filtrateType : 'allFiles'.tr}(${_controller.dataList.length})', // 对应中文:全部文件
style: TextStyle( style: TextStyle(
color: isDarkMode ? Colors.white : Colors.black87, color: isDarkMode ? Colors.white : Colors.black87,
fontSize: 16.sp, fontSize: 16.sp,
@ -136,7 +136,7 @@ class _MeetingHomeViewState extends State<MeetingHomeView>
Padding( Padding(
padding: EdgeInsets.symmetric(horizontal: 5.w), padding: EdgeInsets.symmetric(horizontal: 5.w),
child: Text( child: Text(
'连接', 'connect'.tr, // 对应中文:连接
style: TextStyle( style: TextStyle(
color: isDarkMode ? Colors.white : Colors.black87, color: isDarkMode ? Colors.white : Colors.black87,
fontSize: 14.sp, fontSize: 14.sp,
@ -329,10 +329,10 @@ class _MeetingHomeViewState extends State<MeetingHomeView>
padding: EdgeInsets.only(top: 5.w), padding: EdgeInsets.only(top: 5.w),
child: Text( child: Text(
taskData['tasktype'] == 1 taskData['tasktype'] == 1
? '正在转写...' ? 'transcribing'.tr // 对应中文:正在转写...
: taskData['tasktype'] == 2 : taskData['tasktype'] == 2
? '正在总结...' ? 'summarizing'.tr // 对应中文:正在总结...
: '总结完成', : 'summaryComplete'.tr, // 对应中文:总结完成
style: TextStyle( style: TextStyle(
color: Colors.blue, color: Colors.blue,
fontSize: 10.sp, fontSize: 10.sp,

34
lib/modules/meeting/views/meeting_mine_view.dart

@ -54,7 +54,7 @@ class _MeetingMineViewState extends State<MeetingMineView>
_box([ _box([
_item( _item(
Icons.article_outlined, Icons.article_outlined,
'转写记录', 'transcriptionRecords'.tr, // 对应中文:转写记录
onTap: () { onTap: () {
Get.to(() => const MeetingTranscriptionView()); Get.to(() => const MeetingTranscriptionView());
}, },
@ -63,14 +63,14 @@ class _MeetingMineViewState extends State<MeetingMineView>
_box([ _box([
_item( _item(
Icons.layers_outlined, Icons.layers_outlined,
'模版社区', 'templateCommunity'.tr, // 对应中文:模版社区
description: '尽请期待', description: 'comingSoon'.tr, // 对应中文:尽请期待
onTap: () {}, onTap: () {},
), ),
_item( _item(
Icons.sync_alt_outlined, Icons.sync_alt_outlined,
'集成', 'integration'.tr, // 对应中文:集成
description: '尽请期待', description: 'comingSoon'.tr, // 对应中文:尽请期待
onTap: () {}, onTap: () {},
), ),
]), ]),
@ -80,8 +80,8 @@ class _MeetingMineViewState extends State<MeetingMineView>
Icons.cloud_upload_outlined, Icons.cloud_upload_outlined,
'VOITRANS PRIVATE CLOUD', 'VOITRANS PRIVATE CLOUD',
description: _meetingController.user['privatecloud'] == 1 description: _meetingController.user['privatecloud'] == 1
? '开启' ? 'enabled'.tr // 对应中文:开启
: '关闭', : 'disabled'.tr, // 对应中文:关闭
onTap: () { onTap: () {
Get.to(() => const MeetingCloudView()); Get.to(() => const MeetingCloudView());
}, },
@ -97,7 +97,7 @@ class _MeetingMineViewState extends State<MeetingMineView>
), ),
_item( _item(
Icons.settings_remote_outlined, Icons.settings_remote_outlined,
'我的VOITRANS设备', 'myVoitransDevice'.tr, // 对应中文:我的VOITRANS设备
onTap: () { onTap: () {
Get.toNamed(Routes.devices); Get.toNamed(Routes.devices);
}, },
@ -106,14 +106,14 @@ class _MeetingMineViewState extends State<MeetingMineView>
_box([ _box([
_item( _item(
Icons.help_outline_rounded, Icons.help_outline_rounded,
'帮助与反馈', 'helpAndFeedback'.tr, // 对应中文:帮助与反馈
onTap: () { onTap: () {
Get.toNamed(Routes.feedback); Get.toNamed(Routes.feedback);
}, },
), ),
_item( _item(
Icons.info_outline_rounded, Icons.info_outline_rounded,
'关于VOITRANS', 'aboutVoitrans'.tr, // 对应中文:关于VOITRANS
description: 'v1.0.0', description: 'v1.0.0',
onTap: () {}, onTap: () {},
), ),
@ -189,17 +189,17 @@ class _MeetingMineViewState extends State<MeetingMineView>
children: [ children: [
_statisticsItem( _statisticsItem(
'${_controller.days.value}', '${_controller.days.value}',
'天', 'meetingDays'.tr, // 对应中文:天
Colors.lime, Colors.lime,
), ),
_statisticsItem( _statisticsItem(
'${_controller.numberFiles.value}', '${_controller.numberFiles.value}',
'文件', 'files'.tr, // 对应中文:文件
Colors.lightGreen, Colors.lightGreen,
), ),
_statisticsItem( _statisticsItem(
'${_controller.hourage.value}', '${_controller.hourage.value}',
'小时', 'meetingHours'.tr, // 对应中文:小时
Colors.blueGrey, Colors.blueGrey,
), ),
], ],
@ -305,7 +305,7 @@ class _MeetingMineViewState extends State<MeetingMineView>
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'Voitrans AI会员', 'voitransAiMember'.tr, // 对应中文:Voitrans AI会员
style: TextStyle( style: TextStyle(
color: MeetingUIUtils.getTextColor(isDarkMode), color: MeetingUIUtils.getTextColor(isDarkMode),
fontSize: 16.sp, fontSize: 16.sp,
@ -350,7 +350,7 @@ class _MeetingMineViewState extends State<MeetingMineView>
), ),
5.horizontalSpace, 5.horizontalSpace,
Text( Text(
'解锁 Starter 会员', 'unlockStarterMember'.tr, // 对应中文:解锁 Starter 会员
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 18.sp, fontSize: 18.sp,
@ -365,7 +365,7 @@ class _MeetingMineViewState extends State<MeetingMineView>
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'绑定 Voitrans 设备可激活 Starter 会员', 'bindDeviceToActivate'.tr, // 对应中文:绑定 Voitrans 设备可激活 Starter 会员
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 12.sp, fontSize: 12.sp,
@ -385,7 +385,7 @@ class _MeetingMineViewState extends State<MeetingMineView>
), ),
), ),
child: Text( child: Text(
'立即解锁', 'unlockNow'.tr, // 对应中文:立即解锁
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 14.sp, fontSize: 14.sp,

2
lib/modules/meeting/views/meeting_record_view.dart

@ -347,7 +347,7 @@ class MeetingRecordView extends GetView<MeetingRecordController> {
// 标题 // 标题
Text( Text(
'editMeetingTitle'.tr, 'editMeetingTitle'.tr, // 对应中文:修改会议标题(非必填)
style: TextStyle( style: TextStyle(
color: isDarkMode ? Colors.white : Colors.black87, color: isDarkMode ? Colors.white : Colors.black87,
fontSize: 20.sp, fontSize: 20.sp,

6
lib/modules/meeting/views/meeting_view.dart

@ -35,11 +35,11 @@ class MeetingView extends GetView<MeetingController> {
right: 0, right: 0,
child: Obx( child: Obx(
() => BottomNavigationBar( () => BottomNavigationBar(
items: const [ items: [
BottomNavigationBarItem( BottomNavigationBarItem(
icon: Icon(Icons.folder_outlined), icon: Icon(Icons.folder_outlined),
activeIcon: Icon(Icons.folder), activeIcon: Icon(Icons.folder),
label: '文件', label: 'files'.tr, // 对应中文:文件
), ),
BottomNavigationBarItem( BottomNavigationBarItem(
icon: SizedBox(), icon: SizedBox(),
@ -48,7 +48,7 @@ class MeetingView extends GetView<MeetingController> {
BottomNavigationBarItem( BottomNavigationBarItem(
icon: Icon(Icons.person_outline), icon: Icon(Icons.person_outline),
activeIcon: Icon(Icons.person), activeIcon: Icon(Icons.person),
label: '我的', label: 'mine'.tr, // 对应中文:我的
), ),
], ],
backgroundColor: backgroundColor:

9
lib/modules/meeting/views/mine/meeting_cloud_view.dart

@ -60,7 +60,7 @@ class _MeetingCloudViewState extends State<MeetingCloudView> {
onPressed: () => Get.back(), onPressed: () => Get.back(),
), ),
title: Text( title: Text(
'同步到云端', 'syncToCloud'.tr, // 对应中文:同步到云端
style: TextStyle( style: TextStyle(
fontSize: 17.sp, fontSize: 17.sp,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
@ -101,7 +101,7 @@ class _MeetingCloudViewState extends State<MeetingCloudView> {
Padding( Padding(
padding: EdgeInsets.only(top: 20.w, bottom: 10.w), padding: EdgeInsets.only(top: 20.w, bottom: 10.w),
child: Text( child: Text(
'同步到云端', 'syncToCloud'.tr, // 对应中文:同步到云端
style: TextStyle( style: TextStyle(
color: isDarkMode ? Colors.white : Colors.black87, color: isDarkMode ? Colors.white : Colors.black87,
fontSize: 18.sp, fontSize: 18.sp,
@ -110,7 +110,8 @@ class _MeetingCloudViewState extends State<MeetingCloudView> {
), ),
), ),
Text( Text(
'自动将你的录音同步到云端,你可以通过任意VOITRANS APP或VOITRANS Web(web.voitrans.com)播放、管理和分享录音。', 'syncToCloudTip'
.tr, // 对应中文:自动将你的录音同步到云端,你可以通过任意VOITRANS APP或VOITRANS Web(web.voitrans.com)播放、管理和分享录音。
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
color: isDarkMode ? Colors.white : Colors.black87, color: isDarkMode ? Colors.white : Colors.black87,
@ -132,7 +133,7 @@ class _MeetingCloudViewState extends State<MeetingCloudView> {
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'同步VOITRANS APP', 'syncToVoitransApp'.tr, // 对应中文:同步VOITRANS APP
style: TextStyle( style: TextStyle(
color: isDarkMode ? Colors.white : Colors.black87, color: isDarkMode ? Colors.white : Colors.black87,
fontSize: 16.sp, fontSize: 16.sp,

86
lib/modules/meeting/views/mine/meeting_member_view.dart

@ -43,7 +43,7 @@ class _MeetingMemberViewState extends State<MeetingMemberView> {
onPressed: () => Get.back(), onPressed: () => Get.back(),
), ),
title: Text( title: Text(
'VOITRANS AI会员', 'voitransAiMember'.tr, // 对应中文:VOITRANS AI会员
style: TextStyle( style: TextStyle(
fontSize: 17.sp, fontSize: 17.sp,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
@ -133,7 +133,7 @@ class _MeetingMemberViewState extends State<MeetingMemberView> {
), ),
5.horizontalSpace, 5.horizontalSpace,
Text( Text(
'解锁 Starter 会员', 'unlockStarterMember'.tr, // 对应中文:解锁 Starter 会员
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 18.sp, fontSize: 18.sp,
@ -148,7 +148,7 @@ class _MeetingMemberViewState extends State<MeetingMemberView> {
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'绑定 Voitrans 设备可激活 Starter 会员', 'bindDeviceToActivate'.tr, // 对应中文:绑定 Voitrans 设备可激活 Starter 会员
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 12.sp, fontSize: 12.sp,
@ -168,7 +168,7 @@ class _MeetingMemberViewState extends State<MeetingMemberView> {
), ),
), ),
child: Text( child: Text(
'立即解锁', 'unlockNow'.tr, // 对应中文:立即解锁
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 14.sp, fontSize: 14.sp,
@ -213,7 +213,7 @@ class _MeetingMemberViewState extends State<MeetingMemberView> {
) )
: null, : null,
child: Text( child: Text(
'对比', 'comparison'.tr, // 对应中文:对比
style: TextStyle( style: TextStyle(
color: _tabsIndex == 0 ? Colors.black : Colors.white, color: _tabsIndex == 0 ? Colors.black : Colors.white,
fontSize: 14.sp, fontSize: 14.sp,
@ -241,7 +241,7 @@ class _MeetingMemberViewState extends State<MeetingMemberView> {
) )
: null, : null,
child: Text( child: Text(
'详细信息', 'detailedInfo'.tr, // 对应中文:详细信息
style: TextStyle( style: TextStyle(
color: _tabsIndex == 1 ? Colors.black : Colors.white, color: _tabsIndex == 1 ? Colors.black : Colors.white,
fontSize: 14.sp, fontSize: 14.sp,
@ -342,24 +342,24 @@ class _MeetingMemberViewState extends State<MeetingMemberView> {
), ),
), ),
_tableItem( _tableItem(
'每月转写时长', 'monthlyTranscriptionTime'.tr, // 对应中文:每月转写时长
starter: '300', starter: '300',
pro: '1200', pro: '1200',
unlimited: '无限', unlimited: 'unlimited'.tr, // 对应中文:无限
isGradient: true, isGradient: true,
), ),
_tableItem( _tableItem(
'专业模版', 'professionalTemplates'.tr, // 对应中文:专业模版
starter: '有限', starter: 'limited'.tr, // 对应中文:有限
pro: '全量模版', pro: 'fullTemplates'.tr, // 对应中文:全量模版
unlimited: '全量模版', unlimited: 'fullTemplates'.tr, // 对应中文:全量模版
), ),
_tableItem( _tableItem(
'专业术语', 'professionalTerms'.tr, // 对应中文:专业术语
starter: '—', starter: '—',
), ),
_tableItem( _tableItem(
'自定义模版', 'customTemplates'.tr, // 对应中文:自定义模版
starter: '—', starter: '—',
), ),
_tableItem( _tableItem(
@ -367,22 +367,22 @@ class _MeetingMemberViewState extends State<MeetingMemberView> {
starter: '—', starter: '—',
), ),
_tableItem( _tableItem(
'可视化思维导图', 'visualMindMap'.tr, // 对应中文:可视化思维导图
), ),
_tableItem( _tableItem(
'区分说话人', 'speakerIdentification'.tr, // 对应中文:区分说话人
), ),
_tableItem( _tableItem(
'Private Cloud Sync', 'Private Cloud Sync',
), ),
_tableItem( _tableItem(
'AI 人声增强', 'aiVoiceEnhancement'.tr, // 对应中文:AI 人声增强
), ),
_tableItem( _tableItem(
'音频导入', 'audioImport'.tr, // 对应中文:音频导入
), ),
_tableItem( _tableItem(
'支持多种导出格式', 'multipleExportFormats'.tr, // 对应中文:支持多种导出格式
), ),
], ],
); );
@ -394,62 +394,62 @@ class _MeetingMemberViewState extends State<MeetingMemberView> {
_detailedItem( _detailedItem(
Icons.description, Icons.description,
Colors.purpleAccent, Colors.purpleAccent,
'专业总结模版', 'professionalSummaryTemplates'.tr, // 对应中文:专业总结模版
'专业模版设计,提高您的工作效率。根据行业需求量身定制。', 'professionalTemplateDesc'.tr, // 对应中文:专业模版设计,提高您的工作效率。根据行业需求量身定制。
), ),
_detailedItem( _detailedItem(
Icons.edit_note, Icons.edit_note,
Colors.purpleAccent, Colors.purpleAccent,
'自定义模版', 'customTemplates'.tr, // 对应中文:自定义模版
'您可以根据需求自定义总结 Prompts,并用它们生成所需的总结。', 'customTemplateDesc'.tr, // 对应中文:您可以根据需求自定义总结 Prompts,并用它们生成所需的总结。
), ),
_detailedItem( _detailedItem(
Icons.psychology, Icons.psychology,
Colors.purpleAccent, Colors.purpleAccent,
'Ask AI', 'Ask AI',
'从录音中智能挖掘更深入信息,一键生成数据表格、关键讨论结论、To Do、汇报邮件等格式内容。', 'askAiDesc'.tr, // 对应中文:从录音中智能挖掘更深入信息,一键生成数据表格、关键讨论结论、To Do、汇报邮件等格式内容。
), ),
_detailedItem( _detailedItem(
Icons.account_tree, Icons.account_tree,
Colors.purpleAccent, Colors.purpleAccent,
'可视化思维导图', 'visualMindMap'.tr, // 对应中文:可视化思维导图
'超越总结-用思维导图整理和可视化要点,更有效地理解全文。', 'visualMindMapDesc'.tr, // 对应中文:超越总结-用思维导图整理和可视化要点,更有效地理解全文。
), ),
_detailedItem( _detailedItem(
Icons.groups, Icons.groups,
Colors.purpleAccent, Colors.purpleAccent,
'模版社区', 'templateCommunity'.tr, // 对应中文:模版社区
'发现、分享,并从用户创建的模版库中获得灵感。', 'templateCommunityDesc'.tr, // 对应中文:发现、分享,并从用户创建的模版库中获得灵感。
), ),
_detailedItem( _detailedItem(
Icons.people, Icons.people,
Colors.red, Colors.red,
'区分说话人', 'speakerIdentification'.tr, // 对应中文:区分说话人
'音频转写将支持区分发言者,更直观的还原会议或电话通话内容。同时总结将更加准确。', 'speakerIdentificationDesc'.tr, // 对应中文:音频转写将支持区分发言者,更直观的还原会议或电话通话内容。同时总结将更加准确。
), ),
_detailedItem( _detailedItem(
Icons.cloud_sync, Icons.cloud_sync,
Colors.red, Colors.red,
'Private Cloud Sync', 'Private Cloud Sync',
'您的录音和转写等数据将安全存储在专属的云端服务器中,无论是上传还是下载,全程加密处理,确保隐私安全。', 'privateCloudSyncDesc'.tr, // 对应中文:您的录音和转写等数据将安全存储在专属的云端服务器中,无论是上传还是下载,全程加密处理,确保隐私安全。
), ),
_detailedItem( _detailedItem(
Icons.graphic_eq, Icons.graphic_eq,
Colors.red, Colors.red,
'AI人声增强', 'aiVoiceEnhancement'.tr, // 对应中文:AI人声增强
'Al 人声增强支持多档降噪设置,智能消除背景噪音,增强语音清晰度,提升音频回放效果。', 'aiVoiceEnhancementDesc'.tr, // 对应中文:Al 人声增强支持多档降噪设置,智能消除背景噪音,增强语音清晰度,提升音频回放效果。
), ),
_detailedItem( _detailedItem(
Icons.file_upload, Icons.file_upload,
Colors.red, Colors.red,
'音频导入', 'audioImport'.tr, // 对应中文:音频导入
'可以轻松从本地或第三方应用导入音频文件,如语音备忘录、Google云端硬盘等。', 'audioImportDesc'.tr, // 对应中文:可以轻松从本地或第三方应用导入音频文件,如语音备忘录、Google云端硬盘等。
), ),
_detailedItem( _detailedItem(
Icons.file_download, Icons.file_download,
Colors.blue, Colors.blue,
'多种导出格式', 'multipleExportFormats'.tr, // 对应中文:多种导出格式
'导出您的音频录音、转写文本和摘要为各种格式(TXT、PDF、JPEG),以满足您的需求。', 'multipleExportFormatsDesc'.tr, // 对应中文:导出您的音频录音、转写文本和摘要为各种格式(TXT、PDF、JPEG),以满足您的需求。
), ),
], ],
); );
@ -644,7 +644,7 @@ class _MeetingMemberViewState extends State<MeetingMemberView> {
margin: EdgeInsets.only(top: 30.w), margin: EdgeInsets.only(top: 30.w),
alignment: Alignment.center, alignment: Alignment.center,
child: Text( child: Text(
'升级您的会员', 'upgradeMembership'.tr, // 对应中文:升级您的会员
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 24.sp, fontSize: 24.sp,
@ -675,7 +675,7 @@ class _MeetingMemberViewState extends State<MeetingMemberView> {
) )
: null, : null,
child: Text( child: Text(
'年订阅', 'yearlySubscription'.tr, // 对应中文:年订阅
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 16.sp, fontSize: 16.sp,
@ -701,7 +701,7 @@ class _MeetingMemberViewState extends State<MeetingMemberView> {
) )
: null, : null,
child: Text( child: Text(
'月订阅', 'monthlySubscription'.tr, // 对应中文:月订阅
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 16.sp, fontSize: 16.sp,
@ -714,9 +714,9 @@ class _MeetingMemberViewState extends State<MeetingMemberView> {
), ),
if (_upgradeIndex == 0) if (_upgradeIndex == 0)
_upgradeItem( _upgradeItem(
'Pro ¥60/月', 'proMonthly'.tr, // 对应中文:Pro ¥60/月
'7天免费试用,之后按¥800/年。试用期结束前可随时取消。', 'proMonthlyDesc'.tr, // 对应中文:7天免费试用,之后按¥800/年。试用期结束前可随时取消。
'7天免费试用', 'sevenDayTrial'.tr, // 对应中文:7天免费试用
onTap: () {}, onTap: () {},
), ),
if (_upgradeIndex == 0) if (_upgradeIndex == 0)

2
lib/modules/meeting/views/mine/meeting_transcription_view.dart

@ -37,7 +37,7 @@ class MeetingTranscriptionView extends GetView<MeetingHomeController> {
onPressed: () => Get.back(), onPressed: () => Get.back(),
), ),
title: Text( title: Text(
'转写记录', 'transcriptionRecord'.tr, // 对应中文:转写记录
style: TextStyle( style: TextStyle(
fontSize: 17.sp, fontSize: 17.sp,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,

8
lib/modules/meeting/views/tabs/overview_tab.dart

@ -71,7 +71,7 @@ class _OverviewTabState extends State<OverviewTab> {
Padding( Padding(
padding: EdgeInsets.symmetric(vertical: 10.w), padding: EdgeInsets.symmetric(vertical: 10.w),
child: Text( child: Text(
'分析出${_dataList.length}个关键事件。', 'keyEventsAnalyzed'.trParams({'count': '${_dataList.length}'}), // 对应中文:分析出{count}个关键事件。
style: TextStyle( style: TextStyle(
color: isDarkMode ? Colors.grey[400] : Colors.grey, color: isDarkMode ? Colors.grey[400] : Colors.grey,
fontSize: 12.sp, fontSize: 12.sp,
@ -120,7 +120,7 @@ class _OverviewTabState extends State<OverviewTab> {
width: 150.w, width: 150.w,
child: _button( child: _button(
Icons.auto_awesome, Icons.auto_awesome,
'生成', 'generate'.tr, // 对应中文:生成
() { () {
Get.bottomSheet( Get.bottomSheet(
const GenerateBottomSheet(), const GenerateBottomSheet(),
@ -210,7 +210,7 @@ class _OverviewTabState extends State<OverviewTab> {
), ),
), ),
Text( Text(
'概览', 'overview'.tr, // 对应中文:概览
style: TextStyle( style: TextStyle(
color: MeetingUIUtils.getTextColor(isDarkMode), color: MeetingUIUtils.getTextColor(isDarkMode),
fontSize: 18.sp, fontSize: 18.sp,
@ -218,7 +218,7 @@ class _OverviewTabState extends State<OverviewTab> {
), ),
), ),
Text( Text(
'AI分析识别录音中的关键事件,让你选择重要事件进行AI生成。', 'aiAnalysisDesc'.tr, // 对应中文:AI分析识别录音中的关键事件,让你选择重要事件进行AI生成。
style: TextStyle( style: TextStyle(
color: MeetingUIUtils.getSecondaryTextColor(isDarkMode), color: MeetingUIUtils.getSecondaryTextColor(isDarkMode),
fontSize: 14.sp, fontSize: 14.sp,

6
lib/modules/meeting/views/tabs/speech_tab.dart

@ -256,7 +256,7 @@ class SpeechTab extends GetView<MeetingDetailsController> {
!controller.isSpeakerText.value) !controller.isSpeakerText.value)
_button( _button(
Icons.edit, Icons.edit,
'编辑', 'editSpeaker'.tr, // 对应中文:编辑
() { () {
controller.isSpeakerText.value = true; controller.isSpeakerText.value = true;
controller.dragOffset.value = 0; controller.dragOffset.value = 0;
@ -267,7 +267,7 @@ class SpeechTab extends GetView<MeetingDetailsController> {
!controller.isSpeakerText.value) !controller.isSpeakerText.value)
_button( _button(
Icons.supervisor_account, Icons.supervisor_account,
'命名发言者', 'nameSpeaker'.tr, // 对应中文:命名发言者
() { () {
Get.bottomSheet( Get.bottomSheet(
const SpeakerAllBottomSheet(), const SpeakerAllBottomSheet(),
@ -304,7 +304,7 @@ class SpeechTab extends GetView<MeetingDetailsController> {
width: 150.w, width: 150.w,
child: _button( child: _button(
Icons.auto_awesome, Icons.auto_awesome,
'生成', 'generate'.tr, // 对应中文:生成
() { () {
Get.bottomSheet( Get.bottomSheet(
const GenerateBottomSheet(), const GenerateBottomSheet(),

24
lib/modules/meeting/views/tabs/summary_tab.dart

@ -23,9 +23,9 @@ class _SummaryTabState extends State<SummaryTab> {
late final Worker _personnelListener; late final Worker _personnelListener;
final String _addressPrefix = '地点:'; final String _addressPrefix = '${'location'.tr}:'; // 对应中文:地点
String _addressText = ''; String _addressText = '';
final String _personnelPrefix = '与会人员:'; final String _personnelPrefix = '${'attendees'.tr}:'; // 对应中文:与会人员
String _personnelText = ''; String _personnelText = '';
final TextEditingController _addressController = TextEditingController(); final TextEditingController _addressController = TextEditingController();
final TextEditingController _personnelController = TextEditingController(); final TextEditingController _personnelController = TextEditingController();
@ -57,11 +57,11 @@ class _SummaryTabState extends State<SummaryTab> {
_addressController.text = _addressPrefix + _addressController.text = _addressPrefix +
(_controller.meetingDetails.value.address.isNotEmpty (_controller.meetingDetails.value.address.isNotEmpty
? _controller.meetingDetails.value.address ? _controller.meetingDetails.value.address
: '[输入地点]'); : '[${'inputLocation'.tr}]'); // 对应中文:输入地点
_personnelController.text = _personnelPrefix + _personnelController.text = _personnelPrefix +
(_controller.meetingDetails.value.personnel.isNotEmpty (_controller.meetingDetails.value.personnel.isNotEmpty
? _controller.meetingDetails.value.personnel ? _controller.meetingDetails.value.personnel
: '[输入与会人员]'); : '[${'inputAttendees'.tr}]'); // 对应中文:输入与会人员
final markdown = const ParchmentMarkdownCodec() final markdown = const ParchmentMarkdownCodec()
.decode(_controller.meetingDetails.value.summary); .decode(_controller.meetingDetails.value.summary);
setState(() { setState(() {
@ -288,7 +288,7 @@ class _SummaryTabState extends State<SummaryTab> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
'日期和时间:${DateUtil.formatDateMs( '${'dateAndTime'.tr}:${DateUtil.formatDateMs(
_controller.meetingData.value.creationtime, _controller.meetingData.value.creationtime,
format: DateFormats.y_mo_d_h_m, format: DateFormats.y_mo_d_h_m,
)}', )}',
@ -346,12 +346,13 @@ class _SummaryTabState extends State<SummaryTab> {
if (_controller.meetingDetails.value.tasktype >= 3) if (_controller.meetingDetails.value.tasktype >= 3)
_button( _button(
Icons.supervisor_account, Icons.supervisor_account,
'编辑发言者', 'editSpeaker'.tr, // 对应中文:编辑发言者
() { () {
Get.bottomSheet( Get.bottomSheet(
const SpeakerAllBottomSheet(), const SpeakerAllBottomSheet(),
isScrollControlled: true, isScrollControlled: true,
backgroundColor: isDarkMode ? Colors.grey[800] : Colors.grey[100], backgroundColor:
isDarkMode ? Colors.grey[800] : Colors.grey[100],
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.vertical( borderRadius: BorderRadius.vertical(
top: Radius.circular(12.r), top: Radius.circular(12.r),
@ -368,7 +369,8 @@ class _SummaryTabState extends State<SummaryTab> {
Get.bottomSheet( Get.bottomSheet(
const AIBottomSheet(), const AIBottomSheet(),
isScrollControlled: true, isScrollControlled: true,
backgroundColor: isDarkMode ? Colors.grey[800] : Colors.white, backgroundColor:
isDarkMode ? Colors.grey[800] : Colors.white,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.vertical( borderRadius: BorderRadius.vertical(
top: Radius.circular(12.r), top: Radius.circular(12.r),
@ -382,12 +384,14 @@ class _SummaryTabState extends State<SummaryTab> {
width: 150.w, width: 150.w,
child: _button( child: _button(
Icons.auto_awesome, Icons.auto_awesome,
'生成', 'generate'.tr, // 对应中文:生成
() { () {
Get.bottomSheet( Get.bottomSheet(
const GenerateBottomSheet(), const GenerateBottomSheet(),
isScrollControlled: true, isScrollControlled: true,
backgroundColor: isDarkMode ? Colors.grey[800] : Colors.grey[100], backgroundColor: isDarkMode
? Colors.grey[800]
: Colors.grey[100],
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.vertical( borderRadius: BorderRadius.vertical(
top: Radius.circular(12.r), top: Radius.circular(12.r),

6
lib/modules/meeting/views/template/template_view.dart

@ -97,7 +97,7 @@ class _TemplateViewState extends State<TemplateView> {
onPressed: () => Get.back(), onPressed: () => Get.back(),
), ),
title: Text( title: Text(
'选择总结模版', 'selectSummaryTemplate'.tr, // 对应中文:选择总结模版
style: TextStyle( style: TextStyle(
fontSize: 17.sp, fontSize: 17.sp,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
@ -135,7 +135,7 @@ class _TemplateViewState extends State<TemplateView> {
borderRadius: BorderRadius.circular(12.r), borderRadius: BorderRadius.circular(12.r),
), ),
child: Text( child: Text(
'就用这个模版', 'useThisTemplate'.tr, // 对应中文:就用这个模版
style: TextStyle( style: TextStyle(
fontSize: 16.sp, fontSize: 16.sp,
color: Colors.white, color: Colors.white,
@ -304,7 +304,7 @@ class _TemplateViewState extends State<TemplateView> {
), ),
), ),
child: Text( child: Text(
'上次使用', 'lastUsed'.tr, // 对应中文:上次使用
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 12.sp, fontSize: 12.sp,

4
lib/modules/translation/models/translation_models.dart

@ -64,13 +64,13 @@ class TranslationItem {
String get sourceLanguageName { String get sourceLanguageName {
final languageManager = Get.find<LanguageManager>(); final languageManager = Get.find<LanguageManager>();
return languageManager.getChineseNameByAsrCode(sourceLanguageCode) ?? return languageManager.getChineseNameByAsrCode(sourceLanguageCode) ??
'未知语言'; 'meetingUnknownLanguage'.tr; // 对应中文:未知语言
} }
/// 获取目标语言的中文名称 /// 获取目标语言的中文名称
String get targetLanguageName { String get targetLanguageName {
final languageManager = Get.find<LanguageManager>(); final languageManager = Get.find<LanguageManager>();
return languageManager.getChineseNameByAsrCode(targetLanguageCode) ?? return languageManager.getChineseNameByAsrCode(targetLanguageCode) ??
'未知语言'; 'meetingUnknownLanguage'.tr; // 对应中文:未知语言
} }
} }
Loading…
Cancel
Save