From: liangzhenying <867174124@qq.com> Date: Wed, 25 Mar 2026 09:25:53 +0000 (+0800) Subject: 优化了字幕翻译 X-Git-Url: http://git.snicker.com.cn/sitemap.xml?a=commitdiff_plain;h=d08ce691d3ec6c8213851a2cbfba3e1f962c7f38;p=mirrors%2FShenYin.git 优化了字幕翻译 --- diff --git a/ShenYin/ShenYin.xcodeproj/project.pbxproj b/ShenYin/ShenYin.xcodeproj/project.pbxproj index 89833d6..9df6c43 100644 --- a/ShenYin/ShenYin.xcodeproj/project.pbxproj +++ b/ShenYin/ShenYin.xcodeproj/project.pbxproj @@ -1011,6 +1011,7 @@ "$(PROJECT_DIR)/ShenYin/Sdk/JoySdk", "$(PROJECT_DIR)/ShenYin/Sdk/JoySdk/tool", "$(PROJECT_DIR)/ShenYin/Channel/DeepChords/JoySdk/tool", + "$(PROJECT_DIR)/ShenYin/Channel/DeepChords/Sdk", ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = ShenYin/Channel/PLAYBOY/PLAYBOY.plist; @@ -1068,6 +1069,7 @@ "$(PROJECT_DIR)/ShenYin/Sdk/JoySdk/tool", "$(PROJECT_DIR)/DeepChordsSdk", "$(PROJECT_DIR)/ShenYin/Channel/DeepChords/JoySdk/tool", + "$(PROJECT_DIR)/ShenYin/Channel/DeepChords/Sdk", ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = ShenYin/Channel/PLAYBOY/PLAYBOY.plist; diff --git a/ShenYin/ShenYin/Cache/SubTitleCache.swift b/ShenYin/ShenYin/Cache/SubTitleCache.swift index 794accb..1af6607 100644 --- a/ShenYin/ShenYin/Cache/SubTitleCache.swift +++ b/ShenYin/ShenYin/Cache/SubTitleCache.swift @@ -45,18 +45,26 @@ enum SubTitleFontType:Int,HandyJSONEnum{ enum SubTitleSoureType:Int,HandyJSONEnum{ case mic = 0 case phone = 1 + + static var all:[SubTitleSoureType] = [.mic,.phone] var title:String{ switch self { case .mic: - return "麦克风".l10n + return "耳机外部声音".l10n case .phone: - return "仅手机内部".l10n + return "耳机内部声音".l10n } } - var font:UIFont{ - return .regular(CGFloat(self.rawValue)) + var des:String{ + switch self { + case .mic: + return "适用于参加现场讲座、会议等线下场景".l10n + case .phone: + return "适用于看视频时实时翻译字幕".l10n + } } + } class SubTitleCacheModel:NSObject,HandyJSON,NSCoding { diff --git a/ShenYin/ShenYin/UI/Home/SubTitle/PipContentVC.swift b/ShenYin/ShenYin/UI/Home/SubTitle/PipContentVC.swift index 93687ac..7bcb035 100644 --- a/ShenYin/ShenYin/UI/Home/SubTitle/PipContentVC.swift +++ b/ShenYin/ShenYin/UI/Home/SubTitle/PipContentVC.swift @@ -21,7 +21,13 @@ class PipManager:NSObject,AVPictureInPictureControllerDelegate{ } contentVC = PipContentVC() - contentVC.preferredContentSize = CGSizeMake(kScreenWid, 200) + let cache = SubTitleCache.shared.get() + if cache.showType == .all { + contentVC.preferredContentSize = CGSizeMake(kScreenWid, 100) + } + else{ + contentVC.preferredContentSize = CGSizeMake(kScreenWid, 50) + } let contentSource = AVPictureInPictureController.ContentSource( activeVideoCallSourceView:soureceView , contentViewController: contentVC @@ -29,7 +35,7 @@ class PipManager:NSObject,AVPictureInPictureControllerDelegate{ pipController = AVPictureInPictureController(contentSource: contentSource) pipController?.delegate = self - pipController?.canStartPictureInPictureAutomaticallyFromInline = false +// pipController?.canStartPictureInPictureAutomaticallyFromInline = false } @objc func startPictureInPicture(){ @@ -80,83 +86,113 @@ class PipManager:NSObject,AVPictureInPictureControllerDelegate{ func pictureInPictureControllerDidStopPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) { print("🛑 画中画已结束") } - } - - - - // 画中画内容视图控制器 @available(iOS 15.0, *) class PipContentVC : AVPictureInPictureVideoCallViewController { - var textView = UITextView() - var translateTextView = UITextView() + var textView = UILabel() + var translateTextView = UILabel() + var line = UIView() override func viewDidLoad() { super.viewDidLoad() - view.addSubviews([textView,translateTextView]) + view.addSubviews([textView,translateTextView,line]) view.backgroundColor = .black reset() } func updateRaw(_ text: String) { textView.text = text - textView.scrollRangeToVisible(NSRange(location: textView.text.count, length: 0)) +// textView.scrollRangeToVisible(NSRange(location: textView.text.count, length: 0)) } func updateTrans(_ text : String) { translateTextView.text = text - translateTextView.scrollRangeToVisible(NSRange(location: translateTextView.text.count, length: 0)) +// translateTextView.scrollRangeToVisible(NSRange(location: translateTextView.text.count, length: 0)) } func reset(){ + +// setClearView() + if (textView.superview == nil) { return } let cache = SubTitleCache.shared.get() + if cache.showType == .all { + preferredContentSize = CGSizeMake(kScreenWid, 100) + } + else{ + preferredContentSize = CGSizeMake(kScreenWid, 50) + } textView.do { v in v.textColor = .rgb(0xD8D8D8) v.font = cache.fontType.font v.backgroundColor = .clear + v.adjustsFontSizeToFitWidth = true + v.numberOfLines = 0 } translateTextView.do { v in v.textColor = .white v.font = cache.fontType.font v.backgroundColor = .clear + v.adjustsFontSizeToFitWidth = true + v.numberOfLines = 0 } + line.backgroundColor = .color(.separateLine).withAlphaComponent(0.5) + if cache.showType == .all { textView.snp.remakeConstraints { make in - make.top.equalToSuperview().inset(50) + make.top.equalToSuperview().inset(10) make.leading.trailing.equalToSuperview().inset(16) make.bottom.equalTo(view.snp.centerY) } translateTextView.snp.remakeConstraints { make in make.leading.trailing.equalToSuperview().inset(16) make.top.equalTo(textView.snp.bottom).offset(2) - make.bottom.equalToSuperview().inset(16) + make.bottom.equalToSuperview().inset(10) + } + line.snp.remakeConstraints { make in + make.bottom.equalTo(textView.snp.bottom) + make.leading.trailing.equalToSuperview().inset(16) + make.height.equalTo(0.5) } textView.isHidden = false translateTextView.isHidden = false + line.isHidden = false } else if cache.showType == .from { textView.snp.remakeConstraints { make in - make.top.bottom.equalToSuperview().inset(50) + make.top.bottom.equalToSuperview().inset(10) make.leading.trailing.equalToSuperview().inset(16) } textView.isHidden = false translateTextView.isHidden = true + line.isHidden = true } else { translateTextView.snp.remakeConstraints { make in - make.top.bottom.equalToSuperview().inset(50) + make.top.bottom.equalToSuperview().inset(10) make.leading.trailing.equalToSuperview().inset(16) } textView.isHidden = true translateTextView.isHidden = false + line.isHidden = true + } + } + func setClearView(){ + for window in UIApplication.shared.windows { + finedView(window) + } + } + func finedView(_ sView:UIView){ + sView.backgroundColor = .clear + for v in sView.subviews { + finedView(v) } } } diff --git a/ShenYin/ShenYin/UI/Home/SubTitle/PipManager2.swift b/ShenYin/ShenYin/UI/Home/SubTitle/PipManager2.swift new file mode 100644 index 0000000..e5fdd2a --- /dev/null +++ b/ShenYin/ShenYin/UI/Home/SubTitle/PipManager2.swift @@ -0,0 +1,169 @@ +//// +//// Untitled.swift +//// ShenYin +//// +//// Created by liangshi on 2026/3/23. +//// +// +//// +//// Untitled.swift +//// ShenYin +//// +//// Created by liangshi on 2026/3/5. +//// +// +//import AVKit +//import UIKit +// +//@available(iOS 15.0, *) +//class PipManager:NSObject,AVPictureInPictureControllerDelegate{ +// var pipController: AVPictureInPictureController? +// var contentVC: PipContentVC! +// +// +// func setupPictureInPicture(soureceView:UIView) { +// guard AVPictureInPictureController.isPictureInPictureSupported() else { +// print("❌ 设备不支持画中画") +// return +// } +// +// contentVC = PipContentVC() +// contentVC.preferredContentSize = CGSizeMake(kScreenWid, 200) +// let contentSource = AVPictureInPictureController.ContentSource( +// activeVideoCallSourceView:soureceView , +// contentViewController: contentVC +// ) +// +// pipController = AVPictureInPictureController(contentSource: contentSource) +// pipController?.delegate = self +// pipController?.canStartPictureInPictureAutomaticallyFromInline = false +// } +// +// @objc func startPictureInPicture(){ +// guard let pipController = pipController else { +// print("❌ pipController 未初始化,无法启动画中画") +// return +// } +// +// if pipController.isPictureInPicturePossible { +// print("✅ 画中画可以启动,准备开始...") +// pipController.startPictureInPicture() +// contentVC?.reset() +// } else { +// print("❌ 画中画当前无法启动") +// } +// } +// @objc func stopPictureInPicture() { +// guard let pipController = pipController else { +// print("❌ pipController 未初始化,无法停止画中画") +// return +// } +// +// if pipController.isPictureInPictureActive { +// print("✅ 画中画正在显示,准备停止...") +// pipController.stopPictureInPicture() +// print("✅ 画中画已停止") +// } else { +// print("⚠️ 画中画当前未显示") +// } +// } +// +// func pictureInPictureControllerWillStartPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) { +// print("画中画即将开始") +// } +// +// func pictureInPictureControllerDidStartPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) { +// print("✅ 画中画已开始") +// } +// +// func pictureInPictureController(_ pictureInPictureController: AVPictureInPictureController, failedToStartPictureInPictureWithError error: Error) { +// print("❌ 画中画启动失败: \(error)") +// } +// +// func pictureInPictureControllerWillStopPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) { +// print("⏹️ 画中画即将结束") +// } +// +// func pictureInPictureControllerDidStopPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) { +// print("🛑 画中画已结束") +// } +// +//} +// +// +// +// +// +// +// +//// 画中画内容视图控制器 +//@available(iOS 15.0, *) +//class PipContentVC : AVPictureInPictureVideoCallViewController { +// var textView = UITextView() +// var translateTextView = UITextView() +// +// override func viewDidLoad() { +// super.viewDidLoad() +// view.addSubviews([textView,translateTextView]) +// view.backgroundColor = .black +// reset() +// } +// +// func updateRaw(_ text: String) { +// textView.text = text +// textView.scrollRangeToVisible(NSRange(location: textView.text.count, length: 0)) +// } +// +// func updateTrans(_ text : String) { +// translateTextView.text = text +// translateTextView.scrollRangeToVisible(NSRange(location: translateTextView.text.count, length: 0)) +// } +// func reset(){ +// if (textView.superview == nil) { +// return +// } +// let cache = SubTitleCache.shared.get() +// +// textView.do { v in +// v.textColor = .rgb(0xD8D8D8) +// v.font = cache.fontType.font +// v.backgroundColor = .clear +// } +// +// translateTextView.do { v in +// v.textColor = .white +// v.font = cache.fontType.font +// v.backgroundColor = .clear +// } +// +// if cache.showType == .all { +// textView.snp.remakeConstraints { make in +// make.top.equalToSuperview().inset(50) +// make.leading.trailing.equalToSuperview().inset(16) +// make.bottom.equalTo(view.snp.centerY) +// } +// translateTextView.snp.remakeConstraints { make in +// make.leading.trailing.equalToSuperview().inset(16) +// make.top.equalTo(textView.snp.bottom).offset(2) +// make.bottom.equalToSuperview().inset(16) +// } +// textView.isHidden = false +// translateTextView.isHidden = false +// } +// else if cache.showType == .from { +// textView.snp.remakeConstraints { make in +// make.top.bottom.equalToSuperview().inset(50) +// make.leading.trailing.equalToSuperview().inset(16) +// } +// textView.isHidden = false +// translateTextView.isHidden = true +// } else { +// translateTextView.snp.remakeConstraints { make in +// make.top.bottom.equalToSuperview().inset(50) +// make.leading.trailing.equalToSuperview().inset(16) +// } +// textView.isHidden = true +// translateTextView.isHidden = false +// } +// } +//} diff --git a/ShenYin/ShenYin/UI/Home/SubTitle/SubTitleSetVC.swift b/ShenYin/ShenYin/UI/Home/SubTitle/SubTitleSetVC.swift index cf9f7a8..8eaf70d 100644 --- a/ShenYin/ShenYin/UI/Home/SubTitle/SubTitleSetVC.swift +++ b/ShenYin/ShenYin/UI/Home/SubTitle/SubTitleSetVC.swift @@ -97,13 +97,14 @@ extension SubTitleSetVC{ @objc func sourceTypeAction(){ let cache = SubTitleCache.shared.get() - let list:[SubTitleSoureType] = [.mic,.phone] - let picker = CustomPicker(title: "声音源".l10n, list: list.map{$0.title}) + let list:[SubTitleSoureType] = SubTitleSoureType.all + let dataList = [CustomPickerModel(title: list[0].title,detail: list[0].des),CustomPickerModel(title: list[1].title,detail: list[1].des)] + let picker = CustomPicker4(title: "声音源".l10n, list: dataList) picker.selectedIndex = list.firstIndex(where: {cache.sourceType.title == $0.title})! picker.show() picker.didSelected = {[weak self] (index,value) in guard let self = self else { return } - cache.sourceType = list.first(where: {$0.title == value})! + cache.sourceType = list.first(where: {$0.title == value.title})! SubTitleCache.shared.save(cache) tableView.reloadData() soureChanged?()