diff --git a/lib/data/services/db/database_helper.dart b/lib/data/services/db/database_helper.dart index 34941efbe..8c3945a7a 100644 --- a/lib/data/services/db/database_helper.dart +++ b/lib/data/services/db/database_helper.dart @@ -94,7 +94,8 @@ class DatabaseHelper { batch.execute(''' CREATE TABLE IF NOT EXISTS meetingcategorytemplate ( id INTEGER PRIMARY KEY, - name TEXT + name TEXT, + language TEXT ) '''); // 商务会议助手模版 @@ -107,7 +108,8 @@ class DatabaseHelper { tag TEXT, desc TEXT, outline TEXT, - prompt TEXT + prompt TEXT, + language TEXT ) '''); batch.insert('user', { diff --git a/lib/data/services/db/sqflite_api.dart b/lib/data/services/db/sqflite_api.dart index 8481cf800..b26ce9911 100644 --- a/lib/data/services/db/sqflite_api.dart +++ b/lib/data/services/db/sqflite_api.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import '/core/utils/logger.dart'; import 'database_helper.dart'; @@ -182,6 +183,42 @@ class SqfliteApi { }); } + static String _getMeetingTemplateLanguageCode() { + final locale = Get.locale ?? Get.deviceLocale; + if (locale == null) { + return 'en-US'; + } + final code = locale.languageCode.toLowerCase(); + switch (code) { + case 'zh': + return 'zh-CN'; + case 'en': + return 'en-US'; + case 'ja': + return 'ja-JP'; + case 'ko': + return 'ko-KR'; + case 'fr': + return 'fr-FR'; + case 'de': + return 'de-DE'; + case 'es': + return 'es-ES'; + case 'it': + return 'it-IT'; + case 'pt': + return 'pt-BR'; + case 'ru': + return 'ru-RU'; + case 'ar': + return 'ar-SA'; + case 'hi': + return 'hi-IN'; + default: + return 'en-US'; + } + } + // 获取商务会议助手Ask AI列表 static Future getMeetingAiList(int id) async { final db = await DatabaseHelper().database; @@ -223,6 +260,7 @@ class SqfliteApi { 'desc': item['description'], 'outline': item['outline'], 'prompt': item['template'], + 'language': item['language'], }; if (result != null) { result['templates'].add(template); @@ -230,6 +268,7 @@ class SqfliteApi { categoryList.add({ 'name': item['ttype'], 'templates': [template], + 'language': item['language'], }); } } @@ -252,6 +291,7 @@ class SqfliteApi { await txn.insert('meetingcategorytemplate', { 'id': categoryId, 'name': item['name'], + 'language': item['language'], }); for (var j = 0; j < item['templates'].length; j++) { Map template = item['templates'][j]; @@ -264,6 +304,7 @@ class SqfliteApi { 'desc': template['desc'], 'outline': template['outline'], 'prompt': template['prompt'], + 'language': template['language'], }); } } @@ -272,15 +313,22 @@ class SqfliteApi { // 获取商务会议助手所有分类模版列表 static Future getMeetingCategoryTemplateList() async { + final language = _getMeetingTemplateLanguageCode(); + Logger.info('language: $language'); final db = await DatabaseHelper().database; - List categorytemplateList = await db.query('meetingcategorytemplate'); + List categorytemplateList = await db.query( + 'meetingcategorytemplate', + where: '(language = ? OR language IS NULL OR language = "")', + whereArgs: [language], + ); + Logger.info('categorytemplateList: $categorytemplateList'); final dataList = categorytemplateList.map((item) => Map.from(item)).toList(); for (var element in dataList) { final List templateList = await db.query( 'meetingtemplate', limit: 4, - where: 'categoryid = ?', + where: 'categoryid = ? ', whereArgs: [element['id']], orderBy: 'id ${element['name'] == '自定义' ? 'DESC' : 'ASC'}', ); @@ -296,11 +344,13 @@ class SqfliteApi { // 获取商务会议助手模版列表 static Future getMeetingTemplateList(int id, {bool isCustom = false}) async { + final language = _getMeetingTemplateLanguageCode(); + Logger.info('language: $language'); final db = await DatabaseHelper().database; return await db.query( 'meetingtemplate', - where: 'categoryid = ?', - whereArgs: [id], + where: 'categoryid = ? AND language = ?', + whereArgs: [id, language], orderBy: 'id ${isCustom ? 'DESC' : 'ASC'}', ); } diff --git a/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart index 62a127112..d1f66d982 100644 --- a/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart @@ -93,285 +93,288 @@ class _GenerateBottomSheetState extends State { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container( - padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.w), - child: Row( - children: [ - Icon( - Icons.audio_file_outlined, - color: Colors.grey, - size: 32.w, - ), - 5.horizontalSpace, - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - _controller.meetingData.value.title, - style: TextStyle( - fontSize: 16.sp, - color: Colors.black87, + Container( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.w), + child: Row( + children: [ + Icon( + Icons.audio_file_outlined, + color: Colors.grey, + size: 32.w, + ), + 5.horizontalSpace, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + _controller.meetingData.value.title, + style: TextStyle( + fontSize: 16.sp, + color: Colors.black87, + ), ), - ), - Text( - '${_controller.meetingData.value.seconds}s', - style: TextStyle( - fontSize: 12.sp, - color: Colors.grey, + Text( + '${_controller.meetingData.value.seconds}s', + style: TextStyle( + fontSize: 12.sp, + color: Colors.grey, + ), ), - ), - ], - ), - ), - GestureDetector( - onTap: () => Get.back(), - child: Container( - width: 26.w, - height: 26.w, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(26.r), - ), - child: Icon( - Icons.close, - size: 18.w, - color: Colors.grey[400], - ), - ), - ) - ], - ), - ), - Container( - padding: EdgeInsets.symmetric(horizontal: 12.w), - margin: EdgeInsets.only(bottom: 10.w), - child: Divider( - height: 1, - color: Colors.grey[300], - ), - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.w), - child: Row( - children: [ - Expanded( - child: Text( - 'selectSummaryTemplate'.tr, // 对应中文:选择总结模版 - style: TextStyle( - fontSize: 14.sp, - color: Colors.black87, + ], ), ), - ), - GestureDetector( - onTap: () async { - var result = await Get.to( - () => TemplateView( - _templateData, - _lastTemplateData['id'] ?? 0, + GestureDetector( + onTap: () => Get.back(), + child: Container( + width: 26.w, + height: 26.w, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(26.r), ), - preventDuplicates: false, - ); - if (result != null) { - _scrollController.jumpTo(0); - List list = List.from(_originalTemplate); - int index = list - .indexWhere((element) => element['id'] == result['id']); - if (index != -1) { - Map itemToMove = list.removeAt(index); - list.insert(0, itemToMove); - } else { - list.insert(0, result); - } - setState(() { - _templateData = result; - _templateList = list; - }); - } - if (_controller.editTemplate.isNotEmpty) { - Map? editMap = _templateList.firstWhere( - (element) => - element['id'] == _controller.editTemplate['id'], - orElse: () => null); - if (editMap != null) { - editMap['name'] = _controller.editTemplate['name']; - editMap['desc'] = _controller.editTemplate['desc']; - editMap['prompt'] = _controller.editTemplate['prompt']; - } - if (_controller.editTemplate['id'] == _templateData['id']) { - _templateData['name'] = _controller.editTemplate['name']; - _templateData['desc'] = _controller.editTemplate['desc']; - _templateData['prompt'] = - _controller.editTemplate['prompt']; - } - setState(() {}); - } - if (_controller.deleteTemplateId != 0) { - _templateList.removeWhere((element) => - element['id'] == _controller.deleteTemplateId); - if (_controller.deleteTemplateId == _templateData['id']) { - _templateData = _templateList[0]; - } - setState(() {}); - _storage.write("meeting_last_template_Data", {}); - _storage.write("meeting_template_list", _templateList); - } - }, - child: Row( - children: [ - Text( - 'viewAll'.tr, // 对应中文:查看全部 - style: TextStyle( - fontSize: 12.sp, - color: Colors.grey, - ), + child: Icon( + Icons.close, + size: 18.w, + color: Colors.grey[400], ), - const Icon( - Icons.keyboard_arrow_right, - color: Colors.grey, - ) - ], - ), - ), - ], - ), - ), - Container( - height: 130.w, - margin: EdgeInsets.only(bottom: 16.w), - child: ListView.builder( - controller: _scrollController, - itemCount: _templateList.length, - scrollDirection: Axis.horizontal, - padding: EdgeInsets.symmetric(horizontal: 4.w), - itemBuilder: (BuildContext context, int index) { - Map data = _templateList[index]; - return _item(data); - }, + ), + ) + ], + ), ), - ), - if (!widget.isSummarizeAgain) Container( - margin: EdgeInsets.symmetric(horizontal: 12.w), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8.r), + padding: EdgeInsets.symmetric(horizontal: 12.w), + margin: EdgeInsets.only(bottom: 10.w), + child: Divider( + height: 1, + color: Colors.grey[300], ), - child: Column( + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.w), + child: Row( children: [ - _row( - 'speakerIdentification'.tr, // 对应中文:区分说话人 - widget: Transform.scale( - scale: 0.8, - alignment: Alignment.centerRight, - child: Switch( - value: _isSpeaker, - onChanged: (bool value) { - setState(() { - _isSpeaker = value; - }); - }, + Expanded( + child: Text( + 'selectSummaryTemplate'.tr, // 对应中文:选择总结模版 + style: TextStyle( + fontSize: 14.sp, + color: Colors.black87, ), ), ), - _row( - 'recordingLanguage'.tr, // 对应中文:录音语言 - value: _formlanguageText, - onTap: () { - Get.bottomSheet( - RecordLanguageBottomSheet(_formlanguage), - isScrollControlled: true, - backgroundColor: Colors.grey[100], - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.vertical( - top: Radius.circular(12.r), - ), + GestureDetector( + onTap: () async { + var result = await Get.to( + () => TemplateView( + _templateData, + _lastTemplateData['id'] ?? 0, ), - ).then((value) { - if (value != null) { - setState(() { - _formlanguageText = value['name']; - _formlanguage = value['value']; - }); + preventDuplicates: false, + ); + if (result != null) { + _scrollController.jumpTo(0); + List list = List.from(_originalTemplate); + int index = list.indexWhere( + (element) => element['id'] == result['id']); + if (index != -1) { + Map itemToMove = list.removeAt(index); + list.insert(0, itemToMove); + } else { + list.insert(0, result); + } + setState(() { + _templateData = result; + _templateList = list; + }); + } + if (_controller.editTemplate.isNotEmpty) { + Map? editMap = _templateList.firstWhere( + (element) => + element['id'] == _controller.editTemplate['id'], + orElse: () => null); + if (editMap != null) { + editMap['name'] = _controller.editTemplate['name']; + editMap['desc'] = _controller.editTemplate['desc']; + editMap['prompt'] = _controller.editTemplate['prompt']; + } + if (_controller.editTemplate['id'] == + _templateData['id']) { + _templateData['name'] = + _controller.editTemplate['name']; + _templateData['desc'] = + _controller.editTemplate['desc']; + _templateData['prompt'] = + _controller.editTemplate['prompt']; + } + setState(() {}); + } + if (_controller.deleteTemplateId != 0) { + _templateList.removeWhere((element) => + element['id'] == _controller.deleteTemplateId); + if (_controller.deleteTemplateId == _templateData['id']) { + _templateData = _templateList[0]; } - }); + setState(() {}); + _storage.write("meeting_last_template_Data", {}); + _storage.write("meeting_template_list", _templateList); + } }, - ), - _row( - 'targetLanguage'.tr, // 对应中文:目标语言 - value: _tolanguageText, - isBorder: false, - onTap: () { - Get.bottomSheet( - RecordLanguageBottomSheet(_tolanguage), - isScrollControlled: true, - backgroundColor: Colors.grey[100], - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.vertical( - top: Radius.circular(12.r), + child: Row( + children: [ + Text( + 'viewAll'.tr, // 对应中文:查看全部 + style: TextStyle( + fontSize: 12.sp, + color: Colors.grey, ), ), - ).then((value) { - if (value != null) { - setState(() { - _tolanguageText = value['name']; - _tolanguage = value['value']; - }); - } - }); - }, + const Icon( + Icons.keyboard_arrow_right, + color: Colors.grey, + ) + ], + ), ), ], ), ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), - child: GestureDetector( - onTap: () { - if (User.isLoggedIn() && User.instance.meetintegral <= 0) { - showRechargeDialog('meeting'); - return; - } - if (_templateData['id'] != _templateList[0]['id']) { - int index = _templateList - .indexWhere((v) => v['id'] == _templateData['id']); - if (index != -1) { - Map itemToMove = _templateList.removeAt(index); - _templateList.insert(0, itemToMove); - } - } - _storage.write("meeting_last_template_Data", _templateData); - _storage.write("meeting_template_list", _templateList); - Get.back(); - if (widget.isSummarizeAgain) { - _controller.refreshSummary(_templateData['id']); - } else { - _controller.summaryCreate( - _formlanguage, - _tolanguage, - _isSpeaker, - _templateData['id'], - ); - } - }, - child: Container( - height: 48.w, - alignment: Alignment.center, + Container( + height: 130.w, + margin: EdgeInsets.only(bottom: 16.w), + child: ListView.builder( + controller: _scrollController, + itemCount: _templateList.length, + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: 4.w), + itemBuilder: (BuildContext context, int index) { + Map data = _templateList[index]; + return _item(data); + }, + ), + ), + if (!widget.isSummarizeAgain) + Container( + margin: EdgeInsets.symmetric(horizontal: 12.w), decoration: BoxDecoration( - color: Colors.black, - borderRadius: BorderRadius.circular(12.r), + color: Colors.white, + borderRadius: BorderRadius.circular(8.r), ), - child: Text( - 'meetingGenerateNow'.tr, // 对应中文:立即生成 - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, + child: Column( + children: [ + _row( + 'speakerIdentification'.tr, // 对应中文:区分说话人 + widget: Transform.scale( + scale: 0.8, + alignment: Alignment.centerRight, + child: Switch( + value: _isSpeaker, + onChanged: (bool value) { + setState(() { + _isSpeaker = value; + }); + }, + ), + ), + ), + _row( + 'recordingLanguage'.tr, // 对应中文:录音语言 + value: _formlanguageText, + onTap: () { + Get.bottomSheet( + RecordLanguageBottomSheet(_formlanguage), + isScrollControlled: true, + backgroundColor: Colors.grey[100], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(12.r), + ), + ), + ).then((value) { + if (value != null) { + setState(() { + _formlanguageText = value['name']; + _formlanguage = value['value']; + }); + } + }); + }, + ), + _row( + 'targetLanguage'.tr, // 对应中文:目标语言 + value: _tolanguageText, + isBorder: false, + onTap: () { + Get.bottomSheet( + RecordLanguageBottomSheet(_tolanguage), + isScrollControlled: true, + backgroundColor: Colors.grey[100], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(12.r), + ), + ), + ).then((value) { + if (value != null) { + setState(() { + _tolanguageText = value['name']; + _tolanguage = value['value']; + }); + } + }); + }, + ), + ], + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), + child: GestureDetector( + onTap: () { + if (User.isLoggedIn() && User.instance.meetintegral <= 0) { + showRechargeDialog('meeting'); + return; + } + if (_templateData['id'] != _templateList[0]['id']) { + int index = _templateList + .indexWhere((v) => v['id'] == _templateData['id']); + if (index != -1) { + Map itemToMove = _templateList.removeAt(index); + _templateList.insert(0, itemToMove); + } + } + _storage.write("meeting_last_template_Data", _templateData); + _storage.write("meeting_template_list", _templateList); + Get.back(); + if (widget.isSummarizeAgain) { + _controller.refreshSummary(_templateData['id']); + } else { + _controller.summaryCreate( + _formlanguage, + _tolanguage, + _isSpeaker, + _templateData['id'], + ); + } + }, + child: Container( + height: 48.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.black, + borderRadius: BorderRadius.circular(12.r), + ), + child: Text( + 'meetingGenerateNow'.tr, // 对应中文:立即生成 + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + ), ), ), ), ), - ), ], ), );