From 50ea471ab9d8bfe262a916437e9cee445ed8fc10 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 20 Aug 2025 15:39:51 +0800 Subject: [PATCH] =?UTF-8?q?refactor(meeting):=20=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E7=A1=AC=E7=BC=96=E7=A0=81=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=BA?= =?UTF-8?q?=E5=9B=BD=E9=99=85=E5=8C=96=E7=BF=BB=E8=AF=91=E9=94=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将会议模块中的硬编码中文字符串替换为国际化翻译键,支持多语言切换 更新翻译文件zh_cn.dart,添加新增的翻译键和对应中文文本 --- lib/core/translations/language/en_us.dart | 238 +++++++++++++++++- lib/core/translations/language/zh_cn.dart | 208 +++++++++++++++ lib/modules/explore/views/explore_view.dart | 4 +- .../meeting_connect_controller.dart | 30 +-- .../controllers/meeting_home_controller.dart | 28 +-- .../meeting_record_controller.dart | 12 +- .../controllers/mind_map_controller.dart | 5 +- .../views/bottomSheet/ai_bottom_sheet.dart | 12 +- .../views/bottomSheet/filtrate_drawer.dart | 10 +- .../bottomSheet/generate_bottom_sheet.dart | 14 +- .../bottomSheet/member_bottom_sheet.dart | 19 +- .../views/bottomSheet/more_bottom_sheet.dart | 7 +- .../navigation_bar_bottom_sheet.dart | 13 +- .../record_language_bottom_sheet.dart | 24 +- .../second_level_bottom_sheet.dart | 2 +- .../views/bottomSheet/share_bottom_sheet.dart | 41 +-- .../bottomSheet/speaker_all_bottom_sheet.dart | 13 +- .../bottomSheet/speaker_bottom_sheet.dart | 15 +- .../meeting/views/meeting_connect_view.dart | 4 +- .../meeting/views/meeting_details_view.dart | 20 +- .../meeting/views/meeting_home_view.dart | 10 +- .../meeting/views/meeting_mine_view.dart | 34 +-- .../meeting/views/meeting_record_view.dart | 2 +- lib/modules/meeting/views/meeting_view.dart | 6 +- .../views/mine/meeting_cloud_view.dart | 9 +- .../views/mine/meeting_member_view.dart | 86 +++---- .../mine/meeting_transcription_view.dart | 2 +- .../meeting/views/tabs/overview_tab.dart | 8 +- .../meeting/views/tabs/speech_tab.dart | 6 +- .../meeting/views/tabs/summary_tab.dart | 24 +- .../meeting/views/template/template_view.dart | 6 +- .../models/translation_models.dart | 6 +- 32 files changed, 683 insertions(+), 235 deletions(-) diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index a5b86bc55..9fbd2f937 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -208,6 +208,233 @@ const Map enUS = { 'aiSummary': 'AI Summary', '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", "premiumMember": "Premium Membership", @@ -305,7 +532,7 @@ const Map enUS = { "loadFailedClickRetry": "Load failed, click to retry", "swipeUpForMore": "Swipe up for more", - // Preset prompts + // 预设提示词 "presetMusic": "Play some music", // Play some music "presetNavigation": "Navigation to", // Navigation "presetWeather": "Today's weather", // Weather @@ -758,7 +985,7 @@ const Map enUS = { "renameAudioFile": "Rename Audio File", "enterNewFileName": "Please enter new file name", - // 翻译详情页 + // 翻译详情页(translation_detail_view.dart) "originalRecord": "Original Record", "recordSummary": "Record Summary", "clickToGenerateSummary": @@ -955,11 +1182,4 @@ const Map enUS = { "justNow": "Just now", "minutesAgo": "@minutes minutes ago", "yesterday": "Yesterday", - // "monday": "Monday", - // "tuesday": "Tuesday", - // "wednesday": "Wednesday", - // "thursday": "Thursday", - // "friday": "Friday", - // "saturday": "Saturday", - // "sunday": "Sunday", }; diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 2dc75a89b..b78dbf411 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -202,6 +202,214 @@ const Map zhCN = { 'aiSummary': 'AI总结', '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": "系统设置", "premiumMember": "高级会员", diff --git a/lib/modules/explore/views/explore_view.dart b/lib/modules/explore/views/explore_view.dart index d57c9561f..0f373dbf1 100644 --- a/lib/modules/explore/views/explore_view.dart +++ b/lib/modules/explore/views/explore_view.dart @@ -23,9 +23,9 @@ class ExploreView extends GetView { // 主要内容(可滚动) Expanded( child: SingleChildScrollView( - physics: const BouncingScrollPhysics(), + //physics: const BouncingScrollPhysics(), child: Padding( - padding: EdgeInsets.fromLTRB(16.w, 0, 16.w, 80.h), + padding: EdgeInsets.fromLTRB(16.w, 0, 16.w, 0.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ diff --git a/lib/modules/meeting/controllers/meeting_connect_controller.dart b/lib/modules/meeting/controllers/meeting_connect_controller.dart index 56c7b213f..440b917b5 100644 --- a/lib/modules/meeting/controllers/meeting_connect_controller.dart +++ b/lib/modules/meeting/controllers/meeting_connect_controller.dart @@ -13,7 +13,7 @@ import 'meeting_home_controller.dart'; class MeetingConnectController extends GetxController { final _meetingController = Get.find(); - RxString stateStr = '搜索中...'.obs; + RxString stateStr = 'searching'.tr.obs; // 对应中文:搜索中... RxBool isRescan = false.obs; RxString importedFilesStr = ''.obs; @@ -50,15 +50,15 @@ class MeetingConnectController extends GetxController { }); _isScanningSubscription = FlutterBluePlus.isScanning.listen((state) { if (isScanFailed) { - stateStr.value = '搜索失败,请检查蓝牙是否开启'; + stateStr.value = 'searchFailed'.tr; // 对应中文:搜索失败,请检查蓝牙是否开启 isRescan.value = true; return; } if (!state && _device == null) { - stateStr.value = '未搜索到 AI PEN 设备'; + stateStr.value = 'aiPenNotFound'.tr; // 对应中文:未搜索到 AI PEN 设备 isRescan.value = true; } else { - stateStr.value = '搜索中...'; + stateStr.value = 'searching'.tr; // 对应中文:搜索中... isRescan.value = false; } }); @@ -111,7 +111,7 @@ class MeetingConnectController extends GetxController { _device = result.device; await _stopScan(); 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) { if (element.characteristicUuid == Guid('FFF1')) { _writeCharacteristic = element; - stateStr.value = '检查是否有新文件需要导入'; + stateStr.value = 'checkingNewFiles'.tr; // 对应中文:检查是否有新文件需要导入 sendData([0x5a, 0x01, 0x0d]); } else if (element.characteristicUuid == Guid('FFF2')) { await element.setNotifyValue(true); @@ -151,11 +151,11 @@ class MeetingConnectController extends GetxController { switch (command) { case 0x0d: // 是否有导入文件 if (value[3] == 0x01) { - stateStr.value = '正在开启Wi-Fi...'; - importedFilesStr.value = '检查到有新文件,正在准备导入'; + stateStr.value = 'startingWifi'.tr; // 对应中文:正在开启Wi-Fi... + importedFilesStr.value = 'newFilesDetected'.tr; // 对应中文:检查到有新文件,正在准备导入 sendData([0x5a, 0x02, 0x87, 0x01]); } else { - importedFilesStr.value = '没有新文件需要导入'; + importedFilesStr.value = 'noNewFiles'.tr; // 对应中文:没有新文件需要导入 } break; case 0x87: // Wi-Fi 开启/关闭 @@ -193,14 +193,14 @@ class MeetingConnectController extends GetxController { void _connectWifi() async { if (_wifiSSID.isNotEmpty && _wifiPassword.isNotEmpty) { - stateStr.value = '正在连接 Wi-Fi...'; + stateStr.value = 'connectingWifi'.tr; // 对应中文:正在连接 Wi-Fi... await WiFiForIoTPlugin.connect( _wifiSSID, password: _wifiPassword, security: NetworkSecurity.WPA, ); await WiFiForIoTPlugin.forceWifiUsage(true); - stateStr.value = 'Wi-Fi 连接成功'; + stateStr.value = 'wifiConnected'.tr; // 对应中文:Wi-Fi 连接成功 sendData([0x5a, 0x01, 0x03]); } } @@ -220,7 +220,7 @@ class MeetingConnectController extends GetxController { _ftpConnect?.listCommand = ListCommand.LIST; List? listDirectory = await _ftpConnect?.listDirectoryContent(); if (listDirectory != null && listDirectory.isNotEmpty) { - stateStr.value = '正在下载文件...'; + stateStr.value = 'downloadingFiles'.tr; // 对应中文:正在下载文件... isDownload.value = true; int totalSize = listDirectory.fold( 0, @@ -228,15 +228,15 @@ class MeetingConnectController extends GetxController { ); for (var i = 0; i < listDirectory.length; i++) { 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; FTPEntry element = listDirectory[i]; await _downloadFile(totalSize, previousSize, element); await _ftpConnect?.deleteFile(element.name); } await _disconnect(); - stateStr.value = '下载完成'; - importedFilesStr.value = '下载完成,共${listDirectory.length}个文件,2秒后自动返回'; + stateStr.value = 'downloadComplete'.tr; // 对应中文:下载完成 + importedFilesStr.value = 'downloadCompleteInfo'.trParams({'count': '${listDirectory.length}'}); // 对应中文:下载完成,共{count}个文件,2秒后自动返回 Future.delayed(const Duration(seconds: 2), () { _executeUpload(); Get.back(); diff --git a/lib/modules/meeting/controllers/meeting_home_controller.dart b/lib/modules/meeting/controllers/meeting_home_controller.dart index e994d5025..470b312d5 100644 --- a/lib/modules/meeting/controllers/meeting_home_controller.dart +++ b/lib/modules/meeting/controllers/meeting_home_controller.dart @@ -110,9 +110,9 @@ class MeetingHomeController extends GetxController { PermissionUtil.instance .requestPermission( permissionType: Permission.storage, - permissionName: "存储", - explanationText: "我们需要访问存储权限,以便您可以选择并上传音频文件。", - permanentDenialText: "检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。", + permissionName: "meetingStoragePermission".tr, // 对应中文:存储 + explanationText: "meetingStoragePermissionExplanation".tr, // 对应中文:我们需要访问存储权限,以便您可以选择并上传音频文件。 + permanentDenialText: "meetingStoragePermissionPermanentDenial".tr, // 对应中文:检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。 ) .then((granted) { if (granted) { @@ -164,17 +164,17 @@ class MeetingHomeController extends GetxController { try { await Share.shareXFiles( [XFile(filePath)], - text: '分享会议音频', + text: 'shareAudio'.tr, // 对应中文:分享会议音频 ); - EasyLoading.showToast('分享完成!'); + EasyLoading.showToast('shareComplete'.tr); // 对应中文:分享完成! } catch (e) { - EasyLoading.showToast('分享失败: ${e.toString()}'); + EasyLoading.showToast('shareFailed'.trParams({'error': e.toString()})); // 对应中文:分享失败: {error} } } void addMeetingAudio() async { - EasyLoading.show(status: '正在导入本地录音...'); + EasyLoading.show(status: 'importingLocalRecordings'.tr); // 对应中文:正在导入本地录音... try { int addUp = 0; final appDir = await appDocDir; @@ -258,19 +258,19 @@ class MeetingHomeController extends GetxController { addUp++; } } 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) { - EasyLoading.showError('导入失败: $e'); + EasyLoading.showError('importError'.trParams({'error': e.toString()})); // 对应中文:导入失败: {error} } finally { EasyLoading.dismiss(); } } void addTranslatAudio() async { - EasyLoading.show(status: '正在批量导入...'); + EasyLoading.show(status: 'batchImporting'.tr); // 对应中文:正在批量导入... for (final filePath in selected) { try { await _audioPlayer.setAudioSource(AudioSource.file(filePath)); @@ -308,14 +308,14 @@ class MeetingHomeController extends GetxController { } } } catch (e) { - Logger.error('导入文件失败: $filePath, error: $e'); + Logger.error('importFailed'.trParams({'filePath': filePath, 'error': e.toString()})); // 对应中文:导入文件失败: {filePath}, error: {error} } } EasyLoading.dismiss(); } void addAudio([String? filePath]) async { - EasyLoading.show(status: '正在导入...'); + EasyLoading.show(status: 'importing'.tr); // 对应中文:正在导入... String fileName = ""; bool isParamProvided = filePath != null; // 更清晰的变量名 if (filePath != null) { @@ -331,7 +331,7 @@ class MeetingHomeController extends GetxController { if (!_isAudioFile(file.name)) { Get.snackbar( 'error'.tr, // 错误 - '请选择音频文件', + 'pleaseSelectAudioFile'.tr, // 对应中文:请选择音频文件 snackPosition: SnackPosition.TOP, backgroundColor: Colors.red.withOpacity(0.1), colorText: Colors.red, diff --git a/lib/modules/meeting/controllers/meeting_record_controller.dart b/lib/modules/meeting/controllers/meeting_record_controller.dart index 47e656df3..eea8c50d2 100644 --- a/lib/modules/meeting/controllers/meeting_record_controller.dart +++ b/lib/modules/meeting/controllers/meeting_record_controller.dart @@ -154,13 +154,13 @@ class MeetingRecordController extends GetxController // Set default filename based on audio type switch (audioType.value) { case 0: - fileName.value = "现场录音"; + fileName.value = "liveRecording".tr; //对应中文:现场录音 break; case 1: - fileName.value = "音、视频录音"; + fileName.value = "audioVideoRecording".tr; //对应中文:音视频录音 break; case 2: - fileName.value = "通话录音"; + fileName.value = "callRecording".tr; //对应中文:电话录音 break; } newName.value = fileName.value; @@ -460,13 +460,13 @@ class MeetingRecordController extends GetxController void _resetToDefaultState() { switch (audioType.value) { case 0: - fileName.value = "现场录音"; + fileName.value = "liveRecording".tr; //对应中文:现场录音 break; case 1: - fileName.value = "音、视频录音"; + fileName.value = "audioVideoRecording".tr; //对应中文:音视频录音 break; case 2: - fileName.value = "通话录音"; + fileName.value = "callRecording".tr; //对应中文:电话录音 break; } newName.value = fileName.value; diff --git a/lib/modules/meeting/controllers/mind_map_controller.dart b/lib/modules/meeting/controllers/mind_map_controller.dart index b35c53e3e..45786ff99 100644 --- a/lib/modules/meeting/controllers/mind_map_controller.dart +++ b/lib/modules/meeting/controllers/mind_map_controller.dart @@ -175,11 +175,12 @@ class MindMapController extends GetxController { final File file = File('${tempDir.path}/$fileName'); await file.writeAsBytes(bytes); final result = await SharePlus.instance.share(ShareParams( - text: '分享思维导图', + text: 'shareMindMap'.tr, //对应中文:分享思维导图 + files: [XFile(file.path)], )); if (result.status == ShareResultStatus.success) { - EasyLoading.showToast('分享完成!'); + EasyLoading.showToast('shareSuccess'.tr); //对应中文:分享成功 } } } diff --git a/lib/modules/meeting/views/bottomSheet/ai_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/ai_bottom_sheet.dart index ecf83a2e7..b5003f21f 100644 --- a/lib/modules/meeting/views/bottomSheet/ai_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/ai_bottom_sheet.dart @@ -30,9 +30,9 @@ class _AIBottomSheetState extends State { List _dataList = []; final List _cruxList = [ - '代办事项', - '提取结论', - '生成关键指标', + 'todoList'.tr, //对应中文:代办事项 + 'extractConclusion'.tr, //对应中文:提取结论 + 'generateKeyIndicators'.tr, //对应中文:生成关键指标 ]; final StringBuffer _buffer = StringBuffer(); bool _isAdd = true; @@ -179,7 +179,7 @@ class _AIBottomSheetState extends State { Padding( padding: EdgeInsets.only(bottom: 5.w), child: Text( - '继续提问', + 'continueAsk'.tr, //对应中文:继续提问 style: TextStyle( color: Colors.grey, fontSize: 13.sp, @@ -226,7 +226,7 @@ class _AIBottomSheetState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '今天我能帮您做点什么呢?', + 'askAIPrompt'.tr, //对应中文:今天我能帮您做点什么呢? style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.bold, @@ -310,7 +310,7 @@ class _AIBottomSheetState extends State { height: 1.4, ), decoration: InputDecoration( - hintText: '问 AI ...', + hintText: 'askAI'.tr, //对应中文:问 AI ... hintStyle: TextStyle( fontSize: 16.sp, color: Colors.grey[400], diff --git a/lib/modules/meeting/views/bottomSheet/filtrate_drawer.dart b/lib/modules/meeting/views/bottomSheet/filtrate_drawer.dart index b9b8df66f..6e1258503 100644 --- a/lib/modules/meeting/views/bottomSheet/filtrate_drawer.dart +++ b/lib/modules/meeting/views/bottomSheet/filtrate_drawer.dart @@ -47,7 +47,7 @@ class _FiltrateDrawerState extends State { fontSize: 14.sp, ), decoration: InputDecoration( - hintText: '在所有文件中搜索', + hintText: 'searchInAllFiles'.tr, // 对应中文:在所有文件中搜索 hintStyle: TextStyle( color: Colors.black54, fontSize: 14.sp, @@ -109,7 +109,7 @@ class _FiltrateDrawerState extends State { ), 6.horizontalSpace, Text( - '全部文件(${_homeController.originalDataList.length})', + '${'allFiles'.tr}(${_homeController.originalDataList.length})', // 对应中文:全部文件 style: TextStyle( color: Colors.black87, fontSize: 14.sp, @@ -129,7 +129,7 @@ class _FiltrateDrawerState extends State { Padding( padding: EdgeInsets.only(bottom: 10.w), child: Text( - '来自', + 'from'.tr, // 对应中文:来自 style: TextStyle( color: Colors.grey, fontSize: 14.sp, @@ -174,7 +174,7 @@ class _FiltrateDrawerState extends State { Padding( padding: EdgeInsets.symmetric(vertical: 10.w), child: Text( - '排序方式', + 'sortBy'.tr, // 对应中文:排序方式 style: TextStyle( color: Colors.grey, fontSize: 14.sp, @@ -197,7 +197,7 @@ class _FiltrateDrawerState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '创建时间', + 'creationTime'.tr, // 对应中文:创建时间 style: TextStyle( color: Colors.black87, fontSize: 14.sp, diff --git a/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart index b5b5ce256..3537b4435 100644 --- a/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart @@ -24,7 +24,7 @@ class _GenerateBottomSheetState extends State { final GetStorage _storage = GetStorage(); bool _isSpeaker = true; - String _languageText = '中文普通话(简体)'; + String _languageText = 'chineseSimplified'.tr; // 对应中文:中文普通话(简体) String _language = 'zh-CN'; final Map _icons = { @@ -149,7 +149,7 @@ class _GenerateBottomSheetState extends State { children: [ Expanded( child: Text( - '选择总结模版', + 'selectSummaryTemplate'.tr, // 对应中文:选择总结模版 style: TextStyle( fontSize: 14.sp, color: Colors.black87, @@ -186,7 +186,7 @@ class _GenerateBottomSheetState extends State { child: Row( children: [ Text( - '查看全部', + 'viewAll'.tr, // 对应中文:查看全部 style: TextStyle( fontSize: 12.sp, color: Colors.grey, @@ -226,7 +226,7 @@ class _GenerateBottomSheetState extends State { child: Column( children: [ _row( - '区分说话人', + 'speakerIdentification'.tr, // 对应中文:区分说话人 widget: Transform.scale( scale: 0.8, alignment: Alignment.centerRight, @@ -241,7 +241,7 @@ class _GenerateBottomSheetState extends State { ), ), _row( - '录音语言', + 'recordingLanguage'.tr, // 对应中文:录音语言 value: _languageText, isBorder: false, onTap: () { @@ -296,7 +296,7 @@ class _GenerateBottomSheetState extends State { borderRadius: BorderRadius.circular(12.r), ), child: Text( - '立即生成', + 'meetingGenerateNow'.tr, // 对应中文:立即生成 style: TextStyle( fontSize: 16.sp, color: Colors.white, @@ -416,7 +416,7 @@ class _GenerateBottomSheetState extends State { ), ), child: Text( - '上次使用', + 'lastUsed'.tr, // 对应中文:上次使用 style: TextStyle( color: Colors.white, fontSize: 12.sp, diff --git a/lib/modules/meeting/views/bottomSheet/member_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/member_bottom_sheet.dart index e77769091..321c28606 100644 --- a/lib/modules/meeting/views/bottomSheet/member_bottom_sheet.dart +++ b/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.description, Colors.purpleAccent, '为行业细分场景设计的专业总结模版'), - _item(Icons.auto_awesome, Colors.purpleAccent, 'Autopilot 模版自动总结'), - _item(Icons.people, Colors.red, '区分不同说话人'), - _item(Icons.cloud_upload, Colors.red, '从APP、WEB导入音频进行转写和总结'), + _item(Icons.access_time, Colors.red, + 'monthlyTranscriptionDuration'.tr), //对应中文:每月300分钟转写时长 + _item(Icons.description, Colors.purpleAccent, + 'industrySpecificSummaryTemplate'.tr), //对应中文:为行业细分场景设计的专业总结模版 + _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: EdgeInsets.symmetric(vertical: 20.w), child: Row( @@ -92,7 +97,7 @@ class MemberBottomSheet extends StatelessWidget { ), ), child: Text( - '发现更多', + 'findMore'.tr, //对应中文:发现更多 style: TextStyle( fontSize: 16.sp, color: Colors.black, @@ -113,7 +118,7 @@ class MemberBottomSheet extends StatelessWidget { borderRadius: BorderRadius.circular(12.r), ), child: Text( - '立即绑定', + 'bindImmediately'.tr, //对应中文:立即绑定 style: TextStyle( fontSize: 16.sp, color: Colors.white, diff --git a/lib/modules/meeting/views/bottomSheet/more_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/more_bottom_sheet.dart index a02fff599..188ca945e 100644 --- a/lib/modules/meeting/views/bottomSheet/more_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/more_bottom_sheet.dart @@ -25,7 +25,7 @@ class _MoreBottomSheetState extends State { mainAxisSize: MainAxisSize.min, children: [ SizedBox(height: 10.w), - _shareItem(Icons.refresh, '重新总结', + _shareItem(Icons.refresh, 'reSummarize'.tr, //重新总结 onTap: _detailsController.meetingDetails.value.tasktype >= 3 ? () { Get.back(); @@ -43,7 +43,7 @@ class _MoreBottomSheetState extends State { ); } : null), - _shareItem(Icons.delete_outline, '删除', onTap: () async { + _shareItem(Icons.delete_outline, 'delete'.tr, onTap: () async { _controller.deleteMeeting( _detailsController.meetingData.value.id, _detailsController.meetingData.value.filepath, @@ -85,7 +85,8 @@ class _MoreBottomSheetState extends State { title, style: TextStyle( fontSize: 14.sp, - color: Colors.black87.withValues(alpha: onTap != null ? 1 : 0.5), + color: + Colors.black87.withValues(alpha: onTap != null ? 1 : 0.5), ), ), ), diff --git a/lib/modules/meeting/views/bottomSheet/navigation_bar_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/navigation_bar_bottom_sheet.dart index 5e92df93a..7f594cdc6 100644 --- a/lib/modules/meeting/views/bottomSheet/navigation_bar_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/navigation_bar_bottom_sheet.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get_navigation/src/extension_navigation.dart'; -import 'package:get/state_manager.dart'; +import 'package:get/get.dart'; import '../../../../routes/app_routes.dart'; import '../../controllers/meeting_home_controller.dart'; @@ -18,14 +17,14 @@ class NavigationBarBottomSheet extends GetView { if (controller.meetingController.type == 0) _buildItem( context, // 传递 context 参数 - '开始录音', + 'startRecording'.tr, // 对应中文:开始录音 Icons.mic_rounded, Colors.red, ), if (controller.meetingController.type == 1) _buildItem( context, // 传递 context 参数 - '现场录音', + 'liveRecording'.tr, // 对应中文:现场录音 Icons.mic_rounded, Colors.red, onTap: () async { @@ -39,7 +38,7 @@ class NavigationBarBottomSheet extends GetView { if (controller.meetingController.type == 1) _buildItem( context, // 传递 context 参数 - '音、视频录音', + 'audioVideoRecording'.tr, // 对应中文:音、视频录音 Icons.videocam, Colors.green, onTap: controller.bleManager.isConnected @@ -55,7 +54,7 @@ class NavigationBarBottomSheet extends GetView { if (controller.meetingController.type == 1) _buildItem( context, // 传递 context 参数 - '通话录音', + 'callRecording'.tr, // 对应中文:通话录音 Icons.phone, Colors.orange, onTap: controller.bleManager.isConnected @@ -70,7 +69,7 @@ class NavigationBarBottomSheet extends GetView { ), _buildItem( context, // 传递 context 参数 - '导入音频', + 'importAudio'.tr, // 对应中文:导入音频 Icons.file_upload_outlined, Colors.deepPurple, onTap: () { diff --git a/lib/modules/meeting/views/bottomSheet/record_language_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/record_language_bottom_sheet.dart index 217613373..bfab9698d 100644 --- a/lib/modules/meeting/views/bottomSheet/record_language_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/record_language_bottom_sheet.dart @@ -14,17 +14,17 @@ class RecordLanguageBottomSheet extends StatefulWidget { class _RecordLanguageBottomSheetState extends State { final List _languages = [ - {'name': '中文普通话(简体)', 'value': 'zh-CN'}, - {'name': '粤语', 'value': 'cant'}, - {'name': '四川话', 'value': 'sc'}, - {'name': '上海话', 'value': 'zh_shanghai'}, - {'name': '英文', 'value': 'en-US'}, - {'name': '日语', 'value': 'ja-JP'}, - {'name': '韩语', 'value': 'ko-KR'}, - {'name': '法语', 'value': 'fr-FR'}, - {'name': '西班牙语', 'value': 'es-MX'}, - {'name': '葡萄牙语', 'value': 'pt-BR'}, - {'name': '印尼语', 'value': 'id-ID'}, + {'name': 'chinese'.tr, 'value': 'zh-CN'}, // 对应中文:中文普通话(简体) + {'name': 'cantonese'.tr, 'value': 'cant'}, // 对应中文:粤语 + {'name': 'sichuan'.tr, 'value': 'sc'}, // 对应中文:四川话 + {'name': 'shanghai'.tr, 'value': 'zh_shanghai'}, // 对应中文:上海话 + {'name': 'english'.tr, 'value': 'en-US'}, // 对应中文:英文 + {'name': 'japanese'.tr, 'value': 'ja-JP'}, // 对应中文:日语 + {'name': 'korean'.tr, 'value': 'ko-KR'}, // 对应中文:韩语 + {'name': 'french'.tr, 'value': 'fr-FR'}, // 对应中文:法语 + {'name': 'spanish'.tr, 'value': 'es-MX'}, // 对应中文:西班牙语 + {'name': 'portuguese'.tr, 'value': 'pt-BR'}, // 对应中文:葡萄牙语 + {'name': 'indonesian'.tr, 'value': 'id-ID'}, // 对应中文:印尼语 ]; @override @@ -40,7 +40,7 @@ class _RecordLanguageBottomSheetState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '录音语言', + 'recordLanguage'.tr, // 对应中文:录音语言 style: TextStyle( fontSize: 16.sp, color: Colors.black87, diff --git a/lib/modules/meeting/views/bottomSheet/second_level_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/second_level_bottom_sheet.dart index 023056133..8bcfc410a 100644 --- a/lib/modules/meeting/views/bottomSheet/second_level_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/second_level_bottom_sheet.dart @@ -148,7 +148,7 @@ class _SecondLevelBottomSheetState extends State { borderRadius: BorderRadius.circular(12.r), ), child: Text( - '导出', + 'export'.tr, // 对应中文:导出 style: TextStyle( fontSize: 16.sp, color: Colors.white, diff --git a/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart index 55086266f..66afed3ec 100644 --- a/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart @@ -79,7 +79,7 @@ class _ShareBottomSheetState extends State { _box([ _shareItem( Icons.link, - '分享链接', + 'shareLink'.tr, // 对应中文:分享链接 isBorder: false, onTap: () async { Get.back(); @@ -110,20 +110,20 @@ class _ShareBottomSheetState extends State { previewThumbnail: thumbnail, )); if (result.status == ShareResultStatus.success) { - EasyLoading.showToast('分享完成!'); + EasyLoading.showToast('shareSuccess'.tr); // 对应中文:分享完成 } }, ), ]), _box([ - _shareItem(Icons.copy, '复制转写', + _shareItem(Icons.copy, 'copyTranscript'.tr, // 对应中文:复制转写 onTap: _controller.meetingDetails.value.tasktype >= 2 ? () { Get.back(); _copy(_getAllText()); } : null), - _shareItem(Icons.copy, '复制总结', + _shareItem(Icons.copy, 'copySummary'.tr, // 对应中文:复制总结 isBorder: false, onTap: _controller.meetingDetails.value.tasktype >= 3 ? () { @@ -133,11 +133,14 @@ class _ShareBottomSheetState extends State { : null), ]), _box([ - _shareItem(Icons.multitrack_audio, '导出音频', onTap: () { + _shareItem( + Icons.multitrack_audio, 'exportAudio'.tr, // 对应中文:导出音频 + onTap: () { 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 ? () async { Get.back(); @@ -146,17 +149,18 @@ class _ShareBottomSheetState extends State { '${tempDir.path}/${_controller.meetingData.value.title}_speaker.txt'); String allText = _getAllText(); await file.writeAsString(allText); - _share(file.path, '分享会议转写'); + _share(file.path, + 'exportTranscript'.tr); // 对应中文:分享会议转写 } : null), - _shareItem(Icons.article, '导出总结', + _shareItem(Icons.article, 'exportSummary'.tr, // 对应中文:导出总结 onTap: _controller.meetingDetails.value.tasktype >= 3 ? () async { Get.back(); Get.bottomSheet( SecondLevelBottomSheet( - '导出总结', - '导出为', + 'exportSummary'.tr, // 对应中文:导出总结 + 'exportAs'.tr, // 对应中文:导出为 (int index) async { if (index == 0) { // 导出TXT @@ -166,7 +170,8 @@ class _ShareBottomSheetState extends State { '${tempDir.path}/${_controller.meetingData.value.title}_summary.txt'); await file.writeAsString(_controller .meetingDetails.value.summary); - _share(file.path, '分享会议总结'); + _share(file.path, + 'exportSummary'.tr); // 对应中文:分享会议总结 } else { // 导出PDF _exportMarkdownPdf(); @@ -197,7 +202,7 @@ class _ShareBottomSheetState extends State { : null), _shareItem( Icons.lan, - '导出思维导图', + 'shareMindMap'.tr, // 对应中文:分享思维导图 isBorder: false, onTap: _controller.meetingDetails.value.tasktype >= 3 ? () { @@ -298,7 +303,7 @@ class _ShareBottomSheetState extends State { files: [XFile(filepath)], )); if (result.status == ShareResultStatus.success) { - EasyLoading.showToast('分享完成!'); + EasyLoading.showToast('shareSuccess'.tr); // 对应中文:分享完成! } } @@ -307,8 +312,8 @@ class _ShareBottomSheetState extends State { text: text, )).then( (value) => Get.snackbar( - 'success'.tr, // 成功 - '复制成功', + 'success'.tr, // 对应中文:成功 + 'copySuccess'.tr, // 对应中文:复制成功 backgroundColor: Colors.blue.withValues(alpha: 0.8), colorText: Colors.white, ), @@ -340,7 +345,7 @@ class _ShareBottomSheetState extends State { } Future _exportMarkdownPdf() async { - EasyLoading.show(status: '正在导出PDF...'); + EasyLoading.show(status: 'exportingPDF'.tr); // 对应中文:正在导出PDF... final tempDir = await getTemporaryDirectory(); final file = File( '${tempDir.path}/${_controller.meetingData.value.title}_summary.pdf'); @@ -357,7 +362,7 @@ class _ShareBottomSheetState extends State { build: (context) => markdownWidgets, )); await file.writeAsBytes(await markdownPdf.save()); - await _share(file.path, '分享会议总结'); + await _share(file.path, 'exportSummary'.tr); // 对应中文:分享会议总结 EasyLoading.dismiss(); } } diff --git a/lib/modules/meeting/views/bottomSheet/speaker_all_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/speaker_all_bottom_sheet.dart index 07ba347b0..ba1708b90 100644 --- a/lib/modules/meeting/views/bottomSheet/speaker_all_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/speaker_all_bottom_sheet.dart @@ -100,7 +100,7 @@ class _SpeakerAllBottomSheetState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '命名发言者', + 'nameSpeaker'.tr, // 对应中文:命名发言者 style: TextStyle( fontSize: 16.sp, color: Colors.black87, @@ -209,7 +209,7 @@ class _SpeakerAllBottomSheetState extends State { Padding( padding: EdgeInsets.only(top: 10.w, bottom: 5.w), child: Text( - '最近使用过的名称', + 'recentlyUsedNames'.tr, // 对应中文:最近使用过的名称 style: TextStyle( fontSize: 12.sp, color: Colors.grey[600]!, @@ -259,7 +259,7 @@ class _SpeakerAllBottomSheetState extends State { child: Row( children: [ Text( - '总计', + 'totalTime'.tr, // 对应中文:总计 style: TextStyle( fontSize: 12.sp, color: Colors.grey, @@ -431,7 +431,7 @@ class _SpeakerAllBottomSheetState extends State { Padding( padding: EdgeInsets.symmetric(vertical: 5.w), child: Text( - '总结的发言者将自动更新', + 'summarySpeakerWillBeUpdatedAutomatically'.tr, // 对应中文:总结的发言者将自动更新 style: TextStyle( fontSize: 14.sp, color: Colors.grey[600], @@ -453,7 +453,7 @@ class _SpeakerAllBottomSheetState extends State { borderRadius: BorderRadius.circular(12.r), ), child: Text( - '取消', + 'cancel'.tr, // 对应中文:取消 style: TextStyle( fontSize: 16.sp, color: Colors.black, @@ -474,7 +474,8 @@ class _SpeakerAllBottomSheetState extends State { borderRadius: BorderRadius.circular(12.r), ), child: Text( - '确认', + 'confirm'.tr, // 对应中文:确认 + style: TextStyle( fontSize: 16.sp, color: Colors.white, diff --git a/lib/modules/meeting/views/bottomSheet/speaker_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/speaker_bottom_sheet.dart index 3c7e69dad..a93f9fa31 100644 --- a/lib/modules/meeting/views/bottomSheet/speaker_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/speaker_bottom_sheet.dart @@ -71,7 +71,7 @@ class _SpeakerBottomSheetState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '命名当前发言者', + 'nameCurrentSpeaker'.tr, // 对应中文:命名当前发言者 style: TextStyle( fontSize: 16.sp, color: Colors.black87, @@ -158,7 +158,7 @@ class _SpeakerBottomSheetState extends State { children: [ if (index == 0) Text( - '最近使用过的名称', + 'recentlyUsedNames'.tr, // 对应中文:最近使用过的名称 style: TextStyle( fontSize: 12.sp, color: Colors.grey[600]!, @@ -189,15 +189,18 @@ class _SpeakerBottomSheetState extends State { }, ), ), - _row('应用到当前段落', _type == 0, onTap: () { + _row( + 'applyToCurrentParagraph'.tr, // 对应中文:应用到当前段落 + _type == 0, onTap: () { setState(() { _type = 0; }); }), _row( - '应用到这个发言者的所有段落', + 'applyToAllParagraphs'.tr, // 对应中文:应用到这个发言者的所有段落 _type == 1, - description: '总结将根据模版自动更新', + description: + 'summaryWillBeUpdatedAutomatically'.tr, // 对应中文:总结将根据模版自动更新 onTap: () { setState(() { _type = 1; @@ -216,7 +219,7 @@ class _SpeakerBottomSheetState extends State { borderRadius: BorderRadius.circular(12.r), ), child: Text( - '保存', + 'save'.tr, // 对应中文:保存 style: TextStyle( fontSize: 16.sp, color: Colors.white, diff --git a/lib/modules/meeting/views/meeting_connect_view.dart b/lib/modules/meeting/views/meeting_connect_view.dart index e56d0ab1f..c056c2c4d 100644 --- a/lib/modules/meeting/views/meeting_connect_view.dart +++ b/lib/modules/meeting/views/meeting_connect_view.dart @@ -32,7 +32,7 @@ class MeetingConnectView extends GetView { onPressed: () => Get.back(), ), title: Text( - '蓝牙连接', + 'bluetoothConnection'.tr, // 对应中文:蓝牙连接 style: TextStyle( fontSize: 17.sp, fontWeight: FontWeight.w600, @@ -63,7 +63,7 @@ class MeetingConnectView extends GetView { ), Obx( () => controller.isRescan.value - ? _button('重新连接', Icons.refresh, onTap: () { + ? _button('meetingReconnect'.tr, Icons.refresh, onTap: () { // 对应中文:重新连接 controller.startScan(); }) : const SizedBox(), diff --git a/lib/modules/meeting/views/meeting_details_view.dart b/lib/modules/meeting/views/meeting_details_view.dart index 0d8ae4769..15444981a 100644 --- a/lib/modules/meeting/views/meeting_details_view.dart +++ b/lib/modules/meeting/views/meeting_details_view.dart @@ -301,10 +301,10 @@ class MeetingDetailsView extends GetView { child: Obx( () => Row( children: [ - _iconItem(Icons.summarize, '概览', 0), - _iconItem(Icons.message, '转写', 1), - _iconItem(Icons.article, '总结', 2), - _iconItem(Icons.lan, '思维导图', 3), + _iconItem(Icons.summarize, 'overview'.tr, 0), // 对应中文:概览 + _iconItem(Icons.message, 'transcription'.tr, 1), // 对应中文:转写 + _iconItem(Icons.article, 'summary'.tr, 2), // 对应中文:总结 + _iconItem(Icons.lan, 'mindMap'.tr, 3), // 对应中文:思维导图 ], ), ), @@ -327,12 +327,12 @@ class MeetingDetailsView extends GetView { ? const SizedBox() : controller.meetingDetails.value.tasktype == 1 || controller.meetingDetails.value.tasktype == 2 - ? _meetingWait('正在分析...') + ? _meetingWait('analyzing'.tr) // 对应中文:正在分析... : const OverviewTab(), ), Obx( () => controller.meetingDetails.value.tasktype == 1 - ? _meetingWait('正在转写...') + ? _meetingWait('transcribing'.tr) // 对应中文:正在转写... : const SpeechTab(), ), Obx( @@ -340,8 +340,8 @@ class MeetingDetailsView extends GetView { controller.meetingDetails.value.tasktype == 2 ? _meetingWait( controller.meetingDetails.value.tasktype == 1 - ? '正在转写...' - : '正在总结...') + ? 'transcribing'.tr // 对应中文:正在转写... + : 'summarizing'.tr) // 对应中文:正在总结... : const SummaryTab(), ), Obx( @@ -351,8 +351,8 @@ class MeetingDetailsView extends GetView { ? const SizedBox() : _meetingWait( controller.meetingDetails.value.tasktype == 1 - ? '正在转写...' - : '正在总结...'), + ? 'transcribing'.tr // 对应中文:正在转写... + : 'summarizing'.tr), // 对应中文:正在总结... ), ], ), diff --git a/lib/modules/meeting/views/meeting_home_view.dart b/lib/modules/meeting/views/meeting_home_view.dart index 6a6e1ec5f..f1c9ed0f8 100644 --- a/lib/modules/meeting/views/meeting_home_view.dart +++ b/lib/modules/meeting/views/meeting_home_view.dart @@ -86,7 +86,7 @@ class _MeetingHomeViewState extends State 5.horizontalSpace, Obx( () => Text( - '${_controller.filtrateType.value.isNotEmpty ? _controller.filtrateType : '全部文件'}(${_controller.dataList.length})', + '${_controller.filtrateType.value.isNotEmpty ? _controller.filtrateType : 'allFiles'.tr}(${_controller.dataList.length})', // 对应中文:全部文件 style: TextStyle( color: isDarkMode ? Colors.white : Colors.black87, fontSize: 16.sp, @@ -136,7 +136,7 @@ class _MeetingHomeViewState extends State Padding( padding: EdgeInsets.symmetric(horizontal: 5.w), child: Text( - '连接', + 'connect'.tr, // 对应中文:连接 style: TextStyle( color: isDarkMode ? Colors.white : Colors.black87, fontSize: 14.sp, @@ -329,10 +329,10 @@ class _MeetingHomeViewState extends State padding: EdgeInsets.only(top: 5.w), child: Text( taskData['tasktype'] == 1 - ? '正在转写...' + ? 'transcribing'.tr // 对应中文:正在转写... : taskData['tasktype'] == 2 - ? '正在总结...' - : '总结完成', + ? 'summarizing'.tr // 对应中文:正在总结... + : 'summaryComplete'.tr, // 对应中文:总结完成 style: TextStyle( color: Colors.blue, fontSize: 10.sp, diff --git a/lib/modules/meeting/views/meeting_mine_view.dart b/lib/modules/meeting/views/meeting_mine_view.dart index 9a6c8363c..42291a6a0 100644 --- a/lib/modules/meeting/views/meeting_mine_view.dart +++ b/lib/modules/meeting/views/meeting_mine_view.dart @@ -54,7 +54,7 @@ class _MeetingMineViewState extends State _box([ _item( Icons.article_outlined, - '转写记录', + 'transcriptionRecords'.tr, // 对应中文:转写记录 onTap: () { Get.to(() => const MeetingTranscriptionView()); }, @@ -63,14 +63,14 @@ class _MeetingMineViewState extends State _box([ _item( Icons.layers_outlined, - '模版社区', - description: '尽请期待', + 'templateCommunity'.tr, // 对应中文:模版社区 + description: 'comingSoon'.tr, // 对应中文:尽请期待 onTap: () {}, ), _item( Icons.sync_alt_outlined, - '集成', - description: '尽请期待', + 'integration'.tr, // 对应中文:集成 + description: 'comingSoon'.tr, // 对应中文:尽请期待 onTap: () {}, ), ]), @@ -80,8 +80,8 @@ class _MeetingMineViewState extends State Icons.cloud_upload_outlined, 'VOITRANS PRIVATE CLOUD', description: _meetingController.user['privatecloud'] == 1 - ? '开启' - : '关闭', + ? 'enabled'.tr // 对应中文:开启 + : 'disabled'.tr, // 对应中文:关闭 onTap: () { Get.to(() => const MeetingCloudView()); }, @@ -97,7 +97,7 @@ class _MeetingMineViewState extends State ), _item( Icons.settings_remote_outlined, - '我的VOITRANS设备', + 'myVoitransDevice'.tr, // 对应中文:我的VOITRANS设备 onTap: () { Get.toNamed(Routes.devices); }, @@ -106,14 +106,14 @@ class _MeetingMineViewState extends State _box([ _item( Icons.help_outline_rounded, - '帮助与反馈', + 'helpAndFeedback'.tr, // 对应中文:帮助与反馈 onTap: () { Get.toNamed(Routes.feedback); }, ), _item( Icons.info_outline_rounded, - '关于VOITRANS', + 'aboutVoitrans'.tr, // 对应中文:关于VOITRANS description: 'v1.0.0', onTap: () {}, ), @@ -189,17 +189,17 @@ class _MeetingMineViewState extends State children: [ _statisticsItem( '${_controller.days.value}', - '天', + 'meetingDays'.tr, // 对应中文:天 Colors.lime, ), _statisticsItem( '${_controller.numberFiles.value}', - '文件', + 'files'.tr, // 对应中文:文件 Colors.lightGreen, ), _statisticsItem( '${_controller.hourage.value}', - '小时', + 'meetingHours'.tr, // 对应中文:小时 Colors.blueGrey, ), ], @@ -305,7 +305,7 @@ class _MeetingMineViewState extends State mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - 'Voitrans AI会员', + 'voitransAiMember'.tr, // 对应中文:Voitrans AI会员 style: TextStyle( color: MeetingUIUtils.getTextColor(isDarkMode), fontSize: 16.sp, @@ -350,7 +350,7 @@ class _MeetingMineViewState extends State ), 5.horizontalSpace, Text( - '解锁 Starter 会员', + 'unlockStarterMember'.tr, // 对应中文:解锁 Starter 会员 style: TextStyle( color: Colors.white, fontSize: 18.sp, @@ -365,7 +365,7 @@ class _MeetingMineViewState extends State mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '绑定 Voitrans 设备可激活 Starter 会员', + 'bindDeviceToActivate'.tr, // 对应中文:绑定 Voitrans 设备可激活 Starter 会员 style: TextStyle( color: Colors.white, fontSize: 12.sp, @@ -385,7 +385,7 @@ class _MeetingMineViewState extends State ), ), child: Text( - '立即解锁', + 'unlockNow'.tr, // 对应中文:立即解锁 style: TextStyle( color: Colors.white, fontSize: 14.sp, diff --git a/lib/modules/meeting/views/meeting_record_view.dart b/lib/modules/meeting/views/meeting_record_view.dart index 6ddb25a75..5f453d387 100644 --- a/lib/modules/meeting/views/meeting_record_view.dart +++ b/lib/modules/meeting/views/meeting_record_view.dart @@ -347,7 +347,7 @@ class MeetingRecordView extends GetView { // 标题 Text( - 'editMeetingTitle'.tr, + 'editMeetingTitle'.tr, // 对应中文:修改会议标题(非必填) style: TextStyle( color: isDarkMode ? Colors.white : Colors.black87, fontSize: 20.sp, diff --git a/lib/modules/meeting/views/meeting_view.dart b/lib/modules/meeting/views/meeting_view.dart index dfa9a4e5a..a2aa30687 100644 --- a/lib/modules/meeting/views/meeting_view.dart +++ b/lib/modules/meeting/views/meeting_view.dart @@ -35,11 +35,11 @@ class MeetingView extends GetView { right: 0, child: Obx( () => BottomNavigationBar( - items: const [ + items: [ BottomNavigationBarItem( icon: Icon(Icons.folder_outlined), activeIcon: Icon(Icons.folder), - label: '文件', + label: 'files'.tr, // 对应中文:文件 ), BottomNavigationBarItem( icon: SizedBox(), @@ -48,7 +48,7 @@ class MeetingView extends GetView { BottomNavigationBarItem( icon: Icon(Icons.person_outline), activeIcon: Icon(Icons.person), - label: '我的', + label: 'mine'.tr, // 对应中文:我的 ), ], backgroundColor: diff --git a/lib/modules/meeting/views/mine/meeting_cloud_view.dart b/lib/modules/meeting/views/mine/meeting_cloud_view.dart index 7f9e0d41f..e209f5b78 100644 --- a/lib/modules/meeting/views/mine/meeting_cloud_view.dart +++ b/lib/modules/meeting/views/mine/meeting_cloud_view.dart @@ -60,7 +60,7 @@ class _MeetingCloudViewState extends State { onPressed: () => Get.back(), ), title: Text( - '同步到云端', + 'syncToCloud'.tr, // 对应中文:同步到云端 style: TextStyle( fontSize: 17.sp, fontWeight: FontWeight.w600, @@ -101,7 +101,7 @@ class _MeetingCloudViewState extends State { Padding( padding: EdgeInsets.only(top: 20.w, bottom: 10.w), child: Text( - '同步到云端', + 'syncToCloud'.tr, // 对应中文:同步到云端 style: TextStyle( color: isDarkMode ? Colors.white : Colors.black87, fontSize: 18.sp, @@ -110,7 +110,8 @@ class _MeetingCloudViewState extends State { ), ), Text( - '自动将你的录音同步到云端,你可以通过任意VOITRANS APP或VOITRANS Web(web.voitrans.com)播放、管理和分享录音。', + 'syncToCloudTip' + .tr, // 对应中文:自动将你的录音同步到云端,你可以通过任意VOITRANS APP或VOITRANS Web(web.voitrans.com)播放、管理和分享录音。 textAlign: TextAlign.center, style: TextStyle( color: isDarkMode ? Colors.white : Colors.black87, @@ -132,7 +133,7 @@ class _MeetingCloudViewState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '同步VOITRANS APP', + 'syncToVoitransApp'.tr, // 对应中文:同步VOITRANS APP style: TextStyle( color: isDarkMode ? Colors.white : Colors.black87, fontSize: 16.sp, diff --git a/lib/modules/meeting/views/mine/meeting_member_view.dart b/lib/modules/meeting/views/mine/meeting_member_view.dart index 89bfdd27d..29875e100 100644 --- a/lib/modules/meeting/views/mine/meeting_member_view.dart +++ b/lib/modules/meeting/views/mine/meeting_member_view.dart @@ -43,7 +43,7 @@ class _MeetingMemberViewState extends State { onPressed: () => Get.back(), ), title: Text( - 'VOITRANS AI会员', + 'voitransAiMember'.tr, // 对应中文:VOITRANS AI会员 style: TextStyle( fontSize: 17.sp, fontWeight: FontWeight.w600, @@ -133,7 +133,7 @@ class _MeetingMemberViewState extends State { ), 5.horizontalSpace, Text( - '解锁 Starter 会员', + 'unlockStarterMember'.tr, // 对应中文:解锁 Starter 会员 style: TextStyle( color: Colors.white, fontSize: 18.sp, @@ -148,7 +148,7 @@ class _MeetingMemberViewState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '绑定 Voitrans 设备可激活 Starter 会员', + 'bindDeviceToActivate'.tr, // 对应中文:绑定 Voitrans 设备可激活 Starter 会员 style: TextStyle( color: Colors.white, fontSize: 12.sp, @@ -168,7 +168,7 @@ class _MeetingMemberViewState extends State { ), ), child: Text( - '立即解锁', + 'unlockNow'.tr, // 对应中文:立即解锁 style: TextStyle( color: Colors.white, fontSize: 14.sp, @@ -213,7 +213,7 @@ class _MeetingMemberViewState extends State { ) : null, child: Text( - '对比', + 'comparison'.tr, // 对应中文:对比 style: TextStyle( color: _tabsIndex == 0 ? Colors.black : Colors.white, fontSize: 14.sp, @@ -241,7 +241,7 @@ class _MeetingMemberViewState extends State { ) : null, child: Text( - '详细信息', + 'detailedInfo'.tr, // 对应中文:详细信息 style: TextStyle( color: _tabsIndex == 1 ? Colors.black : Colors.white, fontSize: 14.sp, @@ -342,24 +342,24 @@ class _MeetingMemberViewState extends State { ), ), _tableItem( - '每月转写时长', + 'monthlyTranscriptionTime'.tr, // 对应中文:每月转写时长 starter: '300', pro: '1200', - unlimited: '无限', + unlimited: 'unlimited'.tr, // 对应中文:无限 isGradient: true, ), _tableItem( - '专业模版', - starter: '有限', - pro: '全量模版', - unlimited: '全量模版', + 'professionalTemplates'.tr, // 对应中文:专业模版 + starter: 'limited'.tr, // 对应中文:有限 + pro: 'fullTemplates'.tr, // 对应中文:全量模版 + unlimited: 'fullTemplates'.tr, // 对应中文:全量模版 ), _tableItem( - '专业术语', + 'professionalTerms'.tr, // 对应中文:专业术语 starter: '—', ), _tableItem( - '自定义模版', + 'customTemplates'.tr, // 对应中文:自定义模版 starter: '—', ), _tableItem( @@ -367,22 +367,22 @@ class _MeetingMemberViewState extends State { starter: '—', ), _tableItem( - '可视化思维导图', + 'visualMindMap'.tr, // 对应中文:可视化思维导图 ), _tableItem( - '区分说话人', + 'speakerIdentification'.tr, // 对应中文:区分说话人 ), _tableItem( 'Private Cloud Sync', ), _tableItem( - 'AI 人声增强', + 'aiVoiceEnhancement'.tr, // 对应中文:AI 人声增强 ), _tableItem( - '音频导入', + 'audioImport'.tr, // 对应中文:音频导入 ), _tableItem( - '支持多种导出格式', + 'multipleExportFormats'.tr, // 对应中文:支持多种导出格式 ), ], ); @@ -394,62 +394,62 @@ class _MeetingMemberViewState extends State { _detailedItem( Icons.description, Colors.purpleAccent, - '专业总结模版', - '专业模版设计,提高您的工作效率。根据行业需求量身定制。', + 'professionalSummaryTemplates'.tr, // 对应中文:专业总结模版 + 'professionalTemplateDesc'.tr, // 对应中文:专业模版设计,提高您的工作效率。根据行业需求量身定制。 ), _detailedItem( Icons.edit_note, Colors.purpleAccent, - '自定义模版', - '您可以根据需求自定义总结 Prompts,并用它们生成所需的总结。', + 'customTemplates'.tr, // 对应中文:自定义模版 + 'customTemplateDesc'.tr, // 对应中文:您可以根据需求自定义总结 Prompts,并用它们生成所需的总结。 ), _detailedItem( Icons.psychology, Colors.purpleAccent, 'Ask AI', - '从录音中智能挖掘更深入信息,一键生成数据表格、关键讨论结论、To Do、汇报邮件等格式内容。', + 'askAiDesc'.tr, // 对应中文:从录音中智能挖掘更深入信息,一键生成数据表格、关键讨论结论、To Do、汇报邮件等格式内容。 ), _detailedItem( Icons.account_tree, Colors.purpleAccent, - '可视化思维导图', - '超越总结-用思维导图整理和可视化要点,更有效地理解全文。', + 'visualMindMap'.tr, // 对应中文:可视化思维导图 + 'visualMindMapDesc'.tr, // 对应中文:超越总结-用思维导图整理和可视化要点,更有效地理解全文。 ), _detailedItem( Icons.groups, Colors.purpleAccent, - '模版社区', - '发现、分享,并从用户创建的模版库中获得灵感。', + 'templateCommunity'.tr, // 对应中文:模版社区 + 'templateCommunityDesc'.tr, // 对应中文:发现、分享,并从用户创建的模版库中获得灵感。 ), _detailedItem( Icons.people, Colors.red, - '区分说话人', - '音频转写将支持区分发言者,更直观的还原会议或电话通话内容。同时总结将更加准确。', + 'speakerIdentification'.tr, // 对应中文:区分说话人 + 'speakerIdentificationDesc'.tr, // 对应中文:音频转写将支持区分发言者,更直观的还原会议或电话通话内容。同时总结将更加准确。 ), _detailedItem( Icons.cloud_sync, Colors.red, 'Private Cloud Sync', - '您的录音和转写等数据将安全存储在专属的云端服务器中,无论是上传还是下载,全程加密处理,确保隐私安全。', + 'privateCloudSyncDesc'.tr, // 对应中文:您的录音和转写等数据将安全存储在专属的云端服务器中,无论是上传还是下载,全程加密处理,确保隐私安全。 ), _detailedItem( Icons.graphic_eq, Colors.red, - 'AI人声增强', - 'Al 人声增强支持多档降噪设置,智能消除背景噪音,增强语音清晰度,提升音频回放效果。', + 'aiVoiceEnhancement'.tr, // 对应中文:AI人声增强 + 'aiVoiceEnhancementDesc'.tr, // 对应中文:Al 人声增强支持多档降噪设置,智能消除背景噪音,增强语音清晰度,提升音频回放效果。 ), _detailedItem( Icons.file_upload, Colors.red, - '音频导入', - '可以轻松从本地或第三方应用导入音频文件,如语音备忘录、Google云端硬盘等。', + 'audioImport'.tr, // 对应中文:音频导入 + 'audioImportDesc'.tr, // 对应中文:可以轻松从本地或第三方应用导入音频文件,如语音备忘录、Google云端硬盘等。 ), _detailedItem( Icons.file_download, Colors.blue, - '多种导出格式', - '导出您的音频录音、转写文本和摘要为各种格式(TXT、PDF、JPEG),以满足您的需求。', + 'multipleExportFormats'.tr, // 对应中文:多种导出格式 + 'multipleExportFormatsDesc'.tr, // 对应中文:导出您的音频录音、转写文本和摘要为各种格式(TXT、PDF、JPEG),以满足您的需求。 ), ], ); @@ -644,7 +644,7 @@ class _MeetingMemberViewState extends State { margin: EdgeInsets.only(top: 30.w), alignment: Alignment.center, child: Text( - '升级您的会员', + 'upgradeMembership'.tr, // 对应中文:升级您的会员 style: TextStyle( color: Colors.white, fontSize: 24.sp, @@ -675,7 +675,7 @@ class _MeetingMemberViewState extends State { ) : null, child: Text( - '年订阅', + 'yearlySubscription'.tr, // 对应中文:年订阅 style: TextStyle( color: Colors.white, fontSize: 16.sp, @@ -701,7 +701,7 @@ class _MeetingMemberViewState extends State { ) : null, child: Text( - '月订阅', + 'monthlySubscription'.tr, // 对应中文:月订阅 style: TextStyle( color: Colors.white, fontSize: 16.sp, @@ -714,9 +714,9 @@ class _MeetingMemberViewState extends State { ), if (_upgradeIndex == 0) _upgradeItem( - 'Pro ¥60/月', - '7天免费试用,之后按¥800/年。试用期结束前可随时取消。', - '7天免费试用', + 'proMonthly'.tr, // 对应中文:Pro ¥60/月 + 'proMonthlyDesc'.tr, // 对应中文:7天免费试用,之后按¥800/年。试用期结束前可随时取消。 + 'sevenDayTrial'.tr, // 对应中文:7天免费试用 onTap: () {}, ), if (_upgradeIndex == 0) diff --git a/lib/modules/meeting/views/mine/meeting_transcription_view.dart b/lib/modules/meeting/views/mine/meeting_transcription_view.dart index 3a4653f62..fca4c5e50 100644 --- a/lib/modules/meeting/views/mine/meeting_transcription_view.dart +++ b/lib/modules/meeting/views/mine/meeting_transcription_view.dart @@ -37,7 +37,7 @@ class MeetingTranscriptionView extends GetView { onPressed: () => Get.back(), ), title: Text( - '转写记录', + 'transcriptionRecord'.tr, // 对应中文:转写记录 style: TextStyle( fontSize: 17.sp, fontWeight: FontWeight.w600, diff --git a/lib/modules/meeting/views/tabs/overview_tab.dart b/lib/modules/meeting/views/tabs/overview_tab.dart index ca5f016bb..5d58d42ab 100644 --- a/lib/modules/meeting/views/tabs/overview_tab.dart +++ b/lib/modules/meeting/views/tabs/overview_tab.dart @@ -71,7 +71,7 @@ class _OverviewTabState extends State { Padding( padding: EdgeInsets.symmetric(vertical: 10.w), child: Text( - '分析出${_dataList.length}个关键事件。', + 'keyEventsAnalyzed'.trParams({'count': '${_dataList.length}'}), // 对应中文:分析出{count}个关键事件。 style: TextStyle( color: isDarkMode ? Colors.grey[400] : Colors.grey, fontSize: 12.sp, @@ -120,7 +120,7 @@ class _OverviewTabState extends State { width: 150.w, child: _button( Icons.auto_awesome, - '生成', + 'generate'.tr, // 对应中文:生成 () { Get.bottomSheet( const GenerateBottomSheet(), @@ -210,7 +210,7 @@ class _OverviewTabState extends State { ), ), Text( - '概览', + 'overview'.tr, // 对应中文:概览 style: TextStyle( color: MeetingUIUtils.getTextColor(isDarkMode), fontSize: 18.sp, @@ -218,7 +218,7 @@ class _OverviewTabState extends State { ), ), Text( - 'AI分析识别录音中的关键事件,让你选择重要事件进行AI生成。', + 'aiAnalysisDesc'.tr, // 对应中文:AI分析识别录音中的关键事件,让你选择重要事件进行AI生成。 style: TextStyle( color: MeetingUIUtils.getSecondaryTextColor(isDarkMode), fontSize: 14.sp, diff --git a/lib/modules/meeting/views/tabs/speech_tab.dart b/lib/modules/meeting/views/tabs/speech_tab.dart index d0f2fa9ea..b42d9af49 100644 --- a/lib/modules/meeting/views/tabs/speech_tab.dart +++ b/lib/modules/meeting/views/tabs/speech_tab.dart @@ -256,7 +256,7 @@ class SpeechTab extends GetView { !controller.isSpeakerText.value) _button( Icons.edit, - '编辑', + 'editSpeaker'.tr, // 对应中文:编辑 () { controller.isSpeakerText.value = true; controller.dragOffset.value = 0; @@ -267,7 +267,7 @@ class SpeechTab extends GetView { !controller.isSpeakerText.value) _button( Icons.supervisor_account, - '命名发言者', + 'nameSpeaker'.tr, // 对应中文:命名发言者 () { Get.bottomSheet( const SpeakerAllBottomSheet(), @@ -304,7 +304,7 @@ class SpeechTab extends GetView { width: 150.w, child: _button( Icons.auto_awesome, - '生成', + 'generate'.tr, // 对应中文:生成 () { Get.bottomSheet( const GenerateBottomSheet(), diff --git a/lib/modules/meeting/views/tabs/summary_tab.dart b/lib/modules/meeting/views/tabs/summary_tab.dart index bd24e8c4f..5863fe14b 100644 --- a/lib/modules/meeting/views/tabs/summary_tab.dart +++ b/lib/modules/meeting/views/tabs/summary_tab.dart @@ -23,9 +23,9 @@ class _SummaryTabState extends State { late final Worker _personnelListener; - final String _addressPrefix = '地点:'; + final String _addressPrefix = '${'location'.tr}:'; // 对应中文:地点 String _addressText = ''; - final String _personnelPrefix = '与会人员:'; + final String _personnelPrefix = '${'attendees'.tr}:'; // 对应中文:与会人员 String _personnelText = ''; final TextEditingController _addressController = TextEditingController(); final TextEditingController _personnelController = TextEditingController(); @@ -57,11 +57,11 @@ class _SummaryTabState extends State { _addressController.text = _addressPrefix + (_controller.meetingDetails.value.address.isNotEmpty ? _controller.meetingDetails.value.address - : '[输入地点]'); + : '[${'inputLocation'.tr}]'); // 对应中文:输入地点 _personnelController.text = _personnelPrefix + (_controller.meetingDetails.value.personnel.isNotEmpty ? _controller.meetingDetails.value.personnel - : '[输入与会人员]'); + : '[${'inputAttendees'.tr}]'); // 对应中文:输入与会人员 final markdown = const ParchmentMarkdownCodec() .decode(_controller.meetingDetails.value.summary); setState(() { @@ -288,7 +288,7 @@ class _SummaryTabState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '日期和时间:${DateUtil.formatDateMs( + '${'dateAndTime'.tr}:${DateUtil.formatDateMs( _controller.meetingData.value.creationtime, format: DateFormats.y_mo_d_h_m, )}', @@ -346,12 +346,13 @@ class _SummaryTabState extends State { if (_controller.meetingDetails.value.tasktype >= 3) _button( Icons.supervisor_account, - '编辑发言者', + 'editSpeaker'.tr, // 对应中文:编辑发言者 () { Get.bottomSheet( const SpeakerAllBottomSheet(), isScrollControlled: true, - backgroundColor: isDarkMode ? Colors.grey[800] : Colors.grey[100], + backgroundColor: + isDarkMode ? Colors.grey[800] : Colors.grey[100], shape: RoundedRectangleBorder( borderRadius: BorderRadius.vertical( top: Radius.circular(12.r), @@ -368,7 +369,8 @@ class _SummaryTabState extends State { Get.bottomSheet( const AIBottomSheet(), isScrollControlled: true, - backgroundColor: isDarkMode ? Colors.grey[800] : Colors.white, + backgroundColor: + isDarkMode ? Colors.grey[800] : Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.vertical( top: Radius.circular(12.r), @@ -382,12 +384,14 @@ class _SummaryTabState extends State { width: 150.w, child: _button( Icons.auto_awesome, - '生成', + 'generate'.tr, // 对应中文:生成 () { Get.bottomSheet( const GenerateBottomSheet(), isScrollControlled: true, - backgroundColor: isDarkMode ? Colors.grey[800] : Colors.grey[100], + backgroundColor: isDarkMode + ? Colors.grey[800] + : Colors.grey[100], shape: RoundedRectangleBorder( borderRadius: BorderRadius.vertical( top: Radius.circular(12.r), diff --git a/lib/modules/meeting/views/template/template_view.dart b/lib/modules/meeting/views/template/template_view.dart index a1cccd0ff..2d77797fb 100644 --- a/lib/modules/meeting/views/template/template_view.dart +++ b/lib/modules/meeting/views/template/template_view.dart @@ -97,7 +97,7 @@ class _TemplateViewState extends State { onPressed: () => Get.back(), ), title: Text( - '选择总结模版', + 'selectSummaryTemplate'.tr, // 对应中文:选择总结模版 style: TextStyle( fontSize: 17.sp, fontWeight: FontWeight.w600, @@ -135,7 +135,7 @@ class _TemplateViewState extends State { borderRadius: BorderRadius.circular(12.r), ), child: Text( - '就用这个模版', + 'useThisTemplate'.tr, // 对应中文:就用这个模版 style: TextStyle( fontSize: 16.sp, color: Colors.white, @@ -304,7 +304,7 @@ class _TemplateViewState extends State { ), ), child: Text( - '上次使用', + 'lastUsed'.tr, // 对应中文:上次使用 style: TextStyle( color: Colors.white, fontSize: 12.sp, diff --git a/lib/modules/translation/models/translation_models.dart b/lib/modules/translation/models/translation_models.dart index 76acdad24..4f9679539 100644 --- a/lib/modules/translation/models/translation_models.dart +++ b/lib/modules/translation/models/translation_models.dart @@ -64,13 +64,13 @@ class TranslationItem { String get sourceLanguageName { final languageManager = Get.find(); return languageManager.getChineseNameByAsrCode(sourceLanguageCode) ?? - '未知语言'; + 'meetingUnknownLanguage'.tr; // 对应中文:未知语言 } - + /// 获取目标语言的中文名称 String get targetLanguageName { final languageManager = Get.find(); return languageManager.getChineseNameByAsrCode(targetLanguageCode) ?? - '未知语言'; + 'meetingUnknownLanguage'.tr; // 对应中文:未知语言 } } \ No newline at end of file