From: liangzhenying <867174124@qq.com> Date: Thu, 13 Nov 2025 03:05:59 +0000 (+0800) Subject: 同声传译支持语言修改 X-Git-Tag: 1.0.2~70 X-Git-Url: http://git.snicker.com.cn/sitemap.xml?a=commitdiff_plain;h=0c66d3bce1fb5b3ecaf3ff0b0a7248723e275da5;p=mirrors%2FShenYin.git 同声传译支持语言修改 --- diff --git a/ShenYin/ShenYin/UI/Home/Dialog/DialogRecordBar.swift b/ShenYin/ShenYin/UI/Home/Dialog/DialogRecordBar.swift index 9246e6d..70204a0 100644 --- a/ShenYin/ShenYin/UI/Home/Dialog/DialogRecordBar.swift +++ b/ShenYin/ShenYin/UI/Home/Dialog/DialogRecordBar.swift @@ -56,7 +56,7 @@ class DialogRecordBar: BaseView { make.width.equalToSuperview() make.top.equalTo(recordView.snp.bottom) make.left.equalToSuperview() -// make.height.equalTo(60) + make.height.equalTo(60) } } @@ -257,7 +257,7 @@ class DialogRecordBar: BaseView { } func setupViews() { -// backgroundColor = .red +// backgroundColor = .yellow addSubviews([leftItem,rightItem]) leftItem.do { (v) in diff --git a/ShenYin/ShenYin/UI/Home/HistoryRecord/RecordSearchBar.swift b/ShenYin/ShenYin/UI/Home/HistoryRecord/RecordSearchBar.swift new file mode 100644 index 0000000..b945972 --- /dev/null +++ b/ShenYin/ShenYin/UI/Home/HistoryRecord/RecordSearchBar.swift @@ -0,0 +1,96 @@ +// +// RecordSearchBar.swift +// ShenYin +// +// Created by liangshi on 2025/11/12. +// + +@objc protocol RecordSearchBarDelegate { + func searchBarTextDidChange(_ toolBar:RecordSearchBar,_ text:String) +} + +class RecordSearchBar:BaseView{ + let bgView = UIView() + let textField = UITextField() + let icon = UIImageView(image: UIImage(named: "search_2"), ) + let cancelBtn = UIButton(type: .custom) + + weak var delegate:RecordSearchBarDelegate? + override init(frame: CGRect) { + super.init(frame: frame) + } + + override func setupViews() { + backgroundColor = .color(.bgColor) + + cancelBtn.do { v in + v.setTitle("取消".l10n, for: .normal) + v.setTitleColor(.rgb(0x666666), for: .normal) + v.titleLabel?.font = .regular(14) + v.addTarget(self, action: #selector(cancelAction), for: .touchUpInside) +// v.backgroundColor = .yellow + } + + + bgView.do { v in + v.yc.setCornerRadius(8) + v.backgroundColor = .white + } + + textField.do { v in + v.clearButtonMode = .whileEditing + v.backgroundColor = .clear + v.placeholder = "搜索".l10n + v.returnKeyType = .done + v.delegate = self + v.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged) + } + + addSubviews([bgView,cancelBtn]) + bgView.addSubview(icon) + bgView.addSubview(textField) + } + override func setupLayout() { + cancelBtn.snp.makeConstraints { make in + make.right.equalToSuperview() + make.bottom.equalToSuperview().inset(5) + make.height.equalTo(34) + make.width.equalTo(57) + } + bgView.snp.makeConstraints { make in + make.right.equalTo(cancelBtn.snp.left) + make.left.equalToSuperview().inset(18) + make.bottom.equalToSuperview().inset(5) + make.height.equalTo(34) + } + icon.snp.makeConstraints { make in + make.size.equalTo(18) + make.centerY.equalToSuperview() + make.left.equalToSuperview().inset(12) + } + textField.snp.makeConstraints { make in + make.left.equalToSuperview().inset(34) + make.top.bottom.equalToSuperview() + make.right.equalToSuperview() + } + } + + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @objc func textFieldDidChange(_ textField:UITextField){ + delegate?.searchBarTextDidChange(self, textField.text ?? "") + } + @objc func cancelAction(){ + App.shared.popPage(animated: true) + } + +} +extension RecordSearchBar:UITextFieldDelegate{ + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + textField.resignFirstResponder() + return false + } +} diff --git a/ShenYin/ShenYin/UI/Home/HistoryRecord/VC/HistoryRecordVC.swift b/ShenYin/ShenYin/UI/Home/HistoryRecord/VC/HistoryRecordVC.swift index 64ff1d3..4835d11 100644 --- a/ShenYin/ShenYin/UI/Home/HistoryRecord/VC/HistoryRecordVC.swift +++ b/ShenYin/ShenYin/UI/Home/HistoryRecord/VC/HistoryRecordVC.swift @@ -24,8 +24,8 @@ class HistoryRecordVC: BaseVC{ override func setupViews() { navBar.do { v in v.title = "历史记录".l10n -// let items = [NavigationRightItem(image: UIImage(named: "filter"),target: self, action: #selector(filterAction)),NavigationRightItem(image: UIImage(named: "search"), target: self,action: #selector(searchAction))] - let items = [NavigationRightItem(image: UIImage(named: "filter"),target: self, action: #selector(filterAction))] + let items = [NavigationRightItem(image: UIImage(named: "filter"),target: self, action: #selector(filterAction)),NavigationRightItem(image: UIImage(named: "search"), target: self,action: #selector(searchAction))] +// let items = [NavigationRightItem(image: UIImage(named: "filter"),target: self, action: #selector(filterAction))] v.setupRightViews(items) } @@ -62,7 +62,15 @@ class HistoryRecordVC: BaseVC{ tableView.reloadData() } @objc func searchAction(){ - + let vc = HistorySearchVC() + vc.deleteCallback = { [weak self] deleteList in + guard let self = self else{return} + for item in deleteList{ + list.removeAll(where: {$0.createTime == item.createTime}) + } + tableView.reloadData() + } + App.shared.goToPage(vc) } @objc func filterAction(){ let list = FiltterRecordType.alls.map({$0.title}) @@ -149,7 +157,13 @@ extension HistoryRecordVC:UITableViewDelegate,UITableViewDataSource { } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let data = list[indexPath.row] - App.shared.goToPage(RecordDetailVC(record: data,needFrontVC:true)) + let vc = RecordDetailVC(record: data,needFrontVC:true) + vc.delegateCallback = {[weak self] in + guard let self = self else { return } + list.removeAll(where: {$0.createTime == data.createTime}) + tableView.reloadData() + } + App.shared.goToPage(vc) } func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { diff --git a/ShenYin/ShenYin/UI/Home/HistoryRecord/VC/HistorySearchVC.swift b/ShenYin/ShenYin/UI/Home/HistoryRecord/VC/HistorySearchVC.swift index c452bd0..72f1d37 100644 --- a/ShenYin/ShenYin/UI/Home/HistoryRecord/VC/HistorySearchVC.swift +++ b/ShenYin/ShenYin/UI/Home/HistoryRecord/VC/HistorySearchVC.swift @@ -5,3 +5,129 @@ // Created by liangshi on 2025/11/10. // +import UIKit +class HistorySearchVC: BaseVC{ + let searchBar = RecordSearchBar() + let tableView = UITableView(frame: .zero, style: .plain) + var orginList = [RecordDetailModel]() + var searchList = [RecordDetailModel]() + var deleteCallback:((_ list:[RecordDetailModel])->Void)? +// init(data:[RecordDetailModel]) { +// list = data +// super.init() +// } + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view. + } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + tableView.reloadData() + } + override func setupViews() { + navBar.addSubview(searchBar) + view.addSubviews([tableView]) + + searchBar.do { v in + v.delegate = self + } + + + tableView.do { v in + v.backgroundColor = .rgb(0xF7F7F7) + v.delegate = self + v.dataSource = self + v.estimatedRowHeight = 84 + v.separatorStyle = .none + // v.isEditing = true + v.register(HistoryRecordCell.self, forCellReuseIdentifier: HistoryRecordCell.reuseID) + } + + } + override func setupLayout() { + searchBar.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + tableView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.top.equalTo(kNavBtm) + make.bottom.equalToSuperview() + } + } + override func setupData() { + var cacheList = RecordCache.shared.getList() + cacheList = cacheList.sorted(by: {$0.createTime > $1.createTime}) + orginList = cacheList + searchList = orginList + tableView.reloadData() + } + @objc func searchAction(){ + + } +} + +extension HistorySearchVC:UITableViewDelegate,UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return searchList.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = HistoryRecordCell.cell(withTableView: tableView, indexPath: indexPath) + cell.localModel = searchList[indexPath.row] + return cell + } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let model = searchList[indexPath.row] + let vc = RecordDetailVC(record: model,needFrontVC:true) + vc.delegateCallback = {[weak self] in + guard let self = self else { return } + deleteCallback?([model]) +// RecordCache.shared.remove(model) + searchList.remove(at: indexPath.row) + orginList.removeAll(where: {$0 === model}) + tableView.reloadData() + } + App.shared.goToPage(vc) + } + func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { + if editingStyle == .delete { + CustomAlert.showWith(title: "您要删除这条录音吗?".l10n, messgage: "删除后,这些记录将无法恢复。".l10n, cancelCallback: {}) {[weak self] in + guard let self = self else{return} + let model = searchList[indexPath.row] + deleteCallback?([model]) + RecordCache.shared.remove(model) + searchList.remove(at: indexPath.row) + orginList.removeAll(where: {$0 === model}) + tableView.deleteRows(at: [indexPath], with:.fade) + } + + } + } + func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { + return true + } + func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? { + return "删除".l10n + } + +} +extension HistorySearchVC:RecordSearchBarDelegate{ + func searchBarTextDidChange(_ toolBar: RecordSearchBar, _ text: String) { + if text.isEmpty { + searchList = orginList + } + else{ + var list = [RecordDetailModel]() + for item in orginList { + if item.name.uppercased() .contains(text.uppercased()) { + list.append(item) + } + } + searchList = list + } + tableView.reloadData() + } + + +} diff --git a/ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailVC.swift b/ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailVC.swift index 35aef70..badeb45 100644 --- a/ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailVC.swift +++ b/ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailVC.swift @@ -22,6 +22,7 @@ class RecordDetailVC:BaseVC{ var remoteData:RecordHistoryModel? var needFrontVC = false var delegateCallback:(()->Void)? + var isDelete = false init(record model: RecordDetailModel,needFrontVC:Bool = false) { self.data = model @@ -60,6 +61,9 @@ class RecordDetailVC:BaseVC{ // } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) + if isDelete { + return + } if remoteData == nil,let localData = data { RecordCache.shared.add(localData) } @@ -301,10 +305,11 @@ extension RecordDetailVC:RecordDetailTopBarDelegate{ extension RecordDetailVC:RecordDetailBarDelegate{ func recordDetailBarTranstlateAction(_ bar: RecordDetailBar) { var list = AiSupportLanguage.translate.map{$0.title} - list = list.filter { $0 != data!.from.title } +// list = list.filter { $0 != data!.from.title } let v = CustomPicker(title: "请选择语言".l10n, list:list ) v.selectedIndex = list.firstIndex(where: {data!.to.title == $0})! + v.disableTitle = data!.from.title v.show() v.didSelected = {[weak self] (index,value) in guard let self = self else { return } @@ -368,7 +373,8 @@ extension RecordDetailVC:RecordDetailBarDelegate{ guard let self = self else { return } - CustomAlert.showWith(title: "您要删除这条录音吗?".l10n, messgage: "删除后,此记录将无法恢复".l10n, cancelCallback: {}) { + CustomAlert.showWith(title: "您要删除这条录音吗?".l10n, messgage: "删除后,此记录将无法恢复".l10n, cancelCallback: {}) { [weak self] in + guard let self = self else{return} if let data = self.remoteData{ let api = CommomApi.deleteVoiceRecord(recordId: data.id) HttpClient.request(api) {(model:ResponseBaseModel,res) in @@ -377,6 +383,10 @@ extension RecordDetailVC:RecordDetailBarDelegate{ } } else{ + if let model = data{ + RecordCache.shared.remove(model) + } + isDelete = true self.delegateCallback?() App.shared.popPage() } diff --git a/ShenYin/ShenYin/UI/Home/RecordTranslateVC.swift b/ShenYin/ShenYin/UI/Home/RecordTranslateVC.swift index 60f0451..4490938 100644 --- a/ShenYin/ShenYin/UI/Home/RecordTranslateVC.swift +++ b/ShenYin/ShenYin/UI/Home/RecordTranslateVC.swift @@ -28,7 +28,7 @@ class RecordTranslateVC:BaseVC{ v.backgroundColor = .clear v.delegate = self v.recordBtn.activeView.backgroundColor = .hexString("#F7F7F7") - toolBar.rightItem.valueLabel.text = "手机".l10n + toolBar.leftItem.valueLabel.text = "手机".l10n } view.backgroundColor = .hexString("#F7F7F7") diff --git a/ShenYin/ShenYin/UI/common/pop/CustomPicker.swift b/ShenYin/ShenYin/UI/common/pop/CustomPicker.swift index b08cef7..ef3150c 100644 --- a/ShenYin/ShenYin/UI/common/pop/CustomPicker.swift +++ b/ShenYin/ShenYin/UI/common/pop/CustomPicker.swift @@ -11,6 +11,11 @@ class CustomPicker: BasePresentView { private let btn = UIButton(type: .custom) private let tableView = UITableView(frame: .zero, style: .plain) var list:[String] = [] + var disableTitle:String = ""{ + didSet{ + tableView.reloadData() + } + } var selectedIndex = 0{ didSet{ tableView.reloadData() @@ -89,9 +94,13 @@ extension CustomPicker:UITableViewDelegate,UITableViewDataSource { let cell = CustomButton.SelectCell.cell(withTableView: tableView, indexPath: indexPath) cell.titleLabel.text = list[indexPath.row] cell.selectedIcon.isHidden = selectedIndex != indexPath.row + cell.enable = list[indexPath.row] != disableTitle return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if list[indexPath.row] == disableTitle { + return + } selectedIndex = indexPath.row tableView.reloadData() didSelected?(selectedIndex,list[selectedIndex]) @@ -99,7 +108,7 @@ extension CustomPicker:UITableViewDelegate,UITableViewDataSource { } } -extension CustomButton { +fileprivate extension CustomButton { class SelectCell: BaseTableViewCell { let bgView = UIView() let titleLabel = UILabel() @@ -118,7 +127,16 @@ extension CustomButton { } } - + var enable:Bool = true{ + didSet{ + if enable{ + titleLabel.textColor = .rgb(0x121212) + } + else{ + titleLabel.textColor = .rgb(0x999999) + } + } + } override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) } diff --git a/ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguagePickerView.swift b/ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguagePickerView.swift index 7e02c2e..b00fe06 100644 --- a/ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguagePickerView.swift +++ b/ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguagePickerView.swift @@ -104,9 +104,30 @@ extension LanguagePickerView:UITableViewDelegate,UITableViewDataSource { let cell = LanguagePickerView.SelectCell.cell(withTableView: tableView, indexPath: indexPath) cell.titleLabel.text = list[indexPath.row].title cell.selectedIcon.isHidden = selectedIndex != indexPath.row + if segView.isRight && list[indexPath.row] == segView.leftLabel.language{ + cell.enable = false + } + else if !segView.isRight && list[indexPath.row] == segView.rightLabel.language{ + cell.enable = false + } + else{ + cell.enable = true + } + return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if segView.isRight { + if list[indexPath.row] == segView.leftLabel.language { + return + } + } + else{ + if list[indexPath.row] == segView.rightLabel.language { + return + } + } + selectedIndex = indexPath.row tableView.reloadData() didSelected?(segView.isRight ? 1:0 ,list[selectedIndex]) @@ -114,7 +135,7 @@ extension LanguagePickerView:UITableViewDelegate,UITableViewDataSource { } } -extension LanguagePickerView { +fileprivate extension LanguagePickerView { class SelectCell: BaseTableViewCell { let bgView = UIView() let titleLabel = UILabel() @@ -132,6 +153,16 @@ extension LanguagePickerView { titleLabel.text = shareType.title } } + var enable:Bool = true{ + didSet{ + if enable{ + titleLabel.textColor = .rgb(0x121212) + } + else{ + titleLabel.textColor = .rgb(0x999999) + } + } + } override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {