diff --git a/Veloria.xcodeproj/project.pbxproj b/Veloria.xcodeproj/project.pbxproj index ee3076c..a7be765 100644 --- a/Veloria.xcodeproj/project.pbxproj +++ b/Veloria.xcodeproj/project.pbxproj @@ -1607,7 +1607,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.1; PRODUCT_BUNDLE_IDENTIFIER = com.qjwl168.veloria.ios; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1648,7 +1648,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.1; PRODUCT_BUNDLE_IDENTIFIER = com.qjwl168.veloria.ios; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/Veloria/Class/Home/Controller/VPHomeListViewController.swift b/Veloria/Class/Home/Controller/VPHomeListViewController.swift index c046b98..598976d 100644 --- a/Veloria/Class/Home/Controller/VPHomeListViewController.swift +++ b/Veloria/Class/Home/Controller/VPHomeListViewController.swift @@ -35,6 +35,7 @@ class VPHomeListViewController: VPViewController, WMZPageProtocol { collectionView.vp_addRefreshBackFooter(insetBottom: 0) { [weak self] in self?.handleFooterRefresh(nil) } + collectionView.vp_addNormalEmpty() collectionView.register(VPHomeListCell.self, forCellWithReuseIdentifier: "cell") return collectionView }() diff --git a/Veloria/Class/Me/Controller/VPMeViewController.swift b/Veloria/Class/Me/Controller/VPMeViewController.swift index 3b1c93a..0e379dd 100644 --- a/Veloria/Class/Me/Controller/VPMeViewController.swift +++ b/Veloria/Class/Me/Controller/VPMeViewController.swift @@ -168,6 +168,10 @@ extension VPMeViewController: UITableViewDelegate, UITableViewDataSource { let vc = VPFeedbackViewController() self.navigationController?.pushViewController(vc, animated: true) + case .orderRecord: + let vc = VPWalletViewController() + self.navigationController?.pushViewController(vc, animated: true) + default: break } @@ -204,15 +208,16 @@ extension VPMeViewController { ] var cellArr: [VPMeItem] = [] + cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_07"), title: "Order Record".localized, type: .orderRecord, cellKey: .normal)) // cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_05"), title: "Language".localized, type: .language, cellKey: .normal)) + if VPLoginManager.manager.userInfo?.is_tourist == false { + cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_06"), title: "Delete Account".localized, type: .deleteAccount, cellKey: .normal)) + } cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_01"), title: "Privacy Policy".localized, type: .privacyPolicy, cellKey: .normal)) cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_02"), title: "User Agreement".localized, type: .userAgreement, cellKey: .normal)) - cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_04"), title: "Help Center".localized, type: .feedback, cellKey: .normal)) + cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_04"), title: "Feedback".localized, type: .feedback, cellKey: .normal)) cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_03"), title: "About Us".localized, type: .aboutUs, cellKey: .normal)) - if VPLoginManager.manager.userInfo?.is_tourist == false { - cellArr.append(VPMeItem(icon: UIImage(named: "me_item_icon_06"), title: "Delet Account".localized, type: .deleteAccount, cellKey: .normal)) - } dataArr.append(cellArr) diff --git a/Veloria/Class/Me/Model/VPMeItem.swift b/Veloria/Class/Me/Model/VPMeItem.swift index 4470055..78abea7 100644 --- a/Veloria/Class/Me/Model/VPMeItem.swift +++ b/Veloria/Class/Me/Model/VPMeItem.swift @@ -14,6 +14,7 @@ struct VPMeItem { case aboutUs case feedback case deleteAccount + case orderRecord case informationProtection case civizatioConvention case informationSharing diff --git a/Veloria/Class/Me/View/VPMeUserInfoCell.swift b/Veloria/Class/Me/View/VPMeUserInfoCell.swift index fba0641..c5cf6a0 100644 --- a/Veloria/Class/Me/View/VPMeUserInfoCell.swift +++ b/Veloria/Class/Me/View/VPMeUserInfoCell.swift @@ -94,7 +94,7 @@ extension VPMeUserInfoCell { contentView.addSubview(avatarImageView) contentView.addSubview(nicknameLabel) contentView.addSubview(idLabel) - contentView.addSubview(loginButton) +// contentView.addSubview(loginButton) avatarImageView.snp.makeConstraints { make in make.left.equalToSuperview() @@ -114,11 +114,11 @@ extension VPMeUserInfoCell { make.bottom.equalTo(avatarImageView).offset(-3) } - loginButton.snp.makeConstraints { make in - make.centerY.equalTo(avatarImageView) - make.right.equalToSuperview() - make.height.equalTo(34) - } +// loginButton.snp.makeConstraints { make in +// make.centerY.equalTo(avatarImageView) +// make.right.equalToSuperview() +// make.height.equalTo(34) +// } } diff --git a/Veloria/Class/Player/Controller/VPVideoPlayerViewController.swift b/Veloria/Class/Player/Controller/VPVideoPlayerViewController.swift index 45cdcd0..0882fa6 100644 --- a/Veloria/Class/Player/Controller/VPVideoPlayerViewController.swift +++ b/Veloria/Class/Player/Controller/VPVideoPlayerViewController.swift @@ -190,7 +190,7 @@ class VPVideoPlayerViewController: VPViewController { CATransaction.setCompletionBlock { [weak self] in guard let self = self else { return } if !animated { - if self.currentIndexPath != indexPath { + if self.currentIndexPath != indexPath, indexPath.row < self.getDataCount() { self.skip(indexPath: indexPath) } else { self.play() diff --git a/Veloria/Class/Player/Model/VPShortModel.swift b/Veloria/Class/Player/Model/VPShortModel.swift index 1fedf60..e435b95 100644 --- a/Veloria/Class/Player/Model/VPShortModel.swift +++ b/Veloria/Class/Player/Model/VPShortModel.swift @@ -47,7 +47,7 @@ class VPShortModel: VPModel, SmartCodable { static func mappingForKey() -> [SmartKeyTransformer]? { return [ - CodingKeys.vp_description <--- ["description"], + CodingKeys.vp_description <--- ["description", "short_video_description"], CodingKeys.name <--- ["short_video_title", "name"] ] } diff --git a/Veloria/Class/Player/View/VPPlayerCoinBuyView.swift b/Veloria/Class/Player/View/VPPlayerCoinBuyView.swift index ad4265b..1e2bd4b 100644 --- a/Veloria/Class/Player/View/VPPlayerCoinBuyView.swift +++ b/Veloria/Class/Player/View/VPPlayerCoinBuyView.swift @@ -20,7 +20,7 @@ class VPPlayerCoinBuyView: UIView { var videoId: String? var buyFinishBlock: (() -> Void)? - private lazy var selectedIndex = 0 + private var selectedIndex: Int? private lazy var collectionViewLayout: UICollectionViewFlowLayout = { diff --git a/Veloria/Class/Player/View/VPPlayerVipBuyView.swift b/Veloria/Class/Player/View/VPPlayerVipBuyView.swift index bc1df61..cc2ace7 100644 --- a/Veloria/Class/Player/View/VPPlayerVipBuyView.swift +++ b/Veloria/Class/Player/View/VPPlayerVipBuyView.swift @@ -20,7 +20,7 @@ class VPPlayerVipBuyView: UIView { var buyFinishBlock: (() -> Void)? - private lazy var currentIndex: Int = 0 + private var currentIndex: Int? private lazy var collectionViewLayout: UICollectionViewFlowLayout = { let layout = UICollectionViewFlowLayout() diff --git a/Veloria/Class/Player/View/VPVideoPlayerCell.swift b/Veloria/Class/Player/View/VPVideoPlayerCell.swift index cffeb80..cea8018 100644 --- a/Veloria/Class/Player/View/VPVideoPlayerCell.swift +++ b/Veloria/Class/Player/View/VPVideoPlayerCell.swift @@ -95,8 +95,6 @@ class VPVideoPlayerCell: VPCollectionViewCell, VPPlayerProtocol { didSet { controlView.isCurrent = isCurrent if !isCurrent { -// self.player.replay() -// self.player.seekToTime(toTime: 0) self.coverImageView.isHidden = false } } @@ -210,6 +208,7 @@ extension VPVideoPlayerCell: VPPlayerDelegate { func vp_playerReadyToPlay(_ player: VPPlayer) { self.seekToTime(toTime: (videoInfo?.play_seconds ?? 0) / 1000) + player.rate = self.viewModel?.rateModel.rate.getRate() ?? 1 } private func updateCoverShowState() { diff --git a/Veloria/Class/Player/View/VPVideoPlayerControlView.swift b/Veloria/Class/Player/View/VPVideoPlayerControlView.swift index 59cce59..631b613 100644 --- a/Veloria/Class/Player/View/VPVideoPlayerControlView.swift +++ b/Veloria/Class/Player/View/VPVideoPlayerControlView.swift @@ -201,11 +201,27 @@ extension VPVideoPlayerControlView { } @objc private func handleCollectButton() { - guard let shortPlayId = self.videoInfo?.short_play_id else { return } - guard let videoId = self.videoInfo?.short_play_video_id else { return } + let isCollect = !(self.shortModel?.is_collect ?? false) + if isCollect { + self.collectShort(isCollect: isCollect) + } else { + let alert = VPAlertView(title: "kUnFavoritesAlertTitle".localized, subtitle: "kUnFavoritesAlertText".localized, icon: UIImage(named: "alert_icon_03"), normalButtonText: nil, highlightButtonText: "Confirm".localized) + alert.show() + + alert.clickHighlightButton = { [weak self] in + self?.collectShort(isCollect: isCollect) + } + } + + } + + private func collectShort(isCollect: Bool) { + guard let shortPlayId = self.videoInfo?.short_play_id else { return } + guard let videoId = self.videoInfo?.short_play_video_id else { return } + VPVideoAPI.requestCollectShort(isCollect: isCollect, shortPlayId: shortPlayId, videoId: videoId) { [weak self] in guard let self = self else { return } var count = self.shortModel?.collect_total ?? 0 diff --git a/Veloria/Class/Wallet/Controller/VPCoinsViewController.swift b/Veloria/Class/Wallet/Controller/VPCoinsViewController.swift index 7f14fe9..15e64c0 100644 --- a/Veloria/Class/Wallet/Controller/VPCoinsViewController.swift +++ b/Veloria/Class/Wallet/Controller/VPCoinsViewController.swift @@ -16,7 +16,7 @@ class VPCoinsViewController: VPViewController { } } - private lazy var selectedIndex = 0 + private var selectedIndex: Int? //MARK: UI属性 private lazy var scrollView: UIScrollView = { diff --git a/Veloria/Class/Wallet/Controller/VPGiveCoinRecordsViewController.swift b/Veloria/Class/Wallet/Controller/VPGiveCoinRecordsViewController.swift index d9fe269..e8fec84 100644 --- a/Veloria/Class/Wallet/Controller/VPGiveCoinRecordsViewController.swift +++ b/Veloria/Class/Wallet/Controller/VPGiveCoinRecordsViewController.swift @@ -29,6 +29,7 @@ class VPGiveCoinRecordsViewController: VPViewController { tableView.vp_addRefreshBackFooter(insetBottom: tableView.contentInset.bottom) { [weak self] in self?.handleFooterRefresh(nil) } + tableView.vp_addNormalEmpty() tableView.register(VPGiveCoinRecordsCell.self, forCellReuseIdentifier: "cell") return tableView }() diff --git a/Veloria/Class/Wallet/Controller/VPVipViewController.swift b/Veloria/Class/Wallet/Controller/VPVipViewController.swift index 1bd7f32..1ed5cfa 100644 --- a/Veloria/Class/Wallet/Controller/VPVipViewController.swift +++ b/Veloria/Class/Wallet/Controller/VPVipViewController.swift @@ -16,7 +16,7 @@ class VPVipViewController: VPViewController { } } - private lazy var currentIndex: Int = 0 + private var currentIndex: Int? private lazy var scrollView: UIScrollView = { let scrollView = VPScrollView() diff --git a/Veloria/Class/Wallet/View/VPCoinRecordCell.swift b/Veloria/Class/Wallet/View/VPCoinRecordCell.swift index 99c43da..1758284 100644 --- a/Veloria/Class/Wallet/View/VPCoinRecordCell.swift +++ b/Veloria/Class/Wallet/View/VPCoinRecordCell.swift @@ -13,6 +13,7 @@ class VPCoinRecordCell: VPWalletBaseCell { didSet { coinCountLabel.text = "+\(model?.value ?? "0")" timeLabel.text = model?.created_at + titleLabel.text = model?.type } } @@ -21,7 +22,7 @@ class VPCoinRecordCell: VPWalletBaseCell { let label = UILabel() label.font = .fontRegular(ofSize: 14) label.textColor = .colorFFFFFF(alpha: 0.9) - label.text = "Recharge Coins".localized + return label }() diff --git a/Veloria/Class/Wallet/View/VPCoinsBuyCell.swift b/Veloria/Class/Wallet/View/VPCoinsBuyCell.swift index 29dbb2b..d918b09 100644 --- a/Veloria/Class/Wallet/View/VPCoinsBuyCell.swift +++ b/Veloria/Class/Wallet/View/VPCoinsBuyCell.swift @@ -23,11 +23,15 @@ class VPCoinsBuyCell: VPCollectionViewCell { if let sendCoins = item?.send_coins, sendCoins > 0, let coins = item?.coins { sendBgView.isHidden = false + sendCountLabel.isHidden = false + + sendCountLabel.text = String(format: "kBonusCoinCount".localized, "\(sendCoins)") let percent = CGFloat(sendCoins) / CGFloat(coins) * 100 sendLabel.text = String(format: "+%.0f%%".localized, percent) } else { sendBgView.isHidden = true + sendCountLabel.isHidden = true } } } @@ -59,6 +63,11 @@ class VPCoinsBuyCell: VPCollectionViewCell { return imageView }() + private lazy var coinBgView: UIView = { + let view = UIView() + return view + }() + private lazy var coinCountLabel: UILabel = { let label = UILabel() label.font = .fontMedium(ofSize: 16) @@ -71,6 +80,13 @@ class VPCoinsBuyCell: VPCollectionViewCell { return imageView }() + private lazy var sendCountLabel: UILabel = { + let label = UILabel() + label.font = .fontRegular(ofSize: 12) + label.textColor = .color05CEA0() + return label + }() + private lazy var priceLabel: UILabel = { let label = UILabel() label.font = .fontRegular(ofSize: 12) @@ -131,8 +147,10 @@ extension VPCoinsBuyCell { private func vp_setupUI() { contentView.addSubview(bgView) contentView.addSubview(selectedImageView) - contentView.addSubview(coinCountLabel) - contentView.addSubview(iconImageView) + contentView.addSubview(coinBgView) + coinBgView.addSubview(coinCountLabel) + coinBgView.addSubview(iconImageView) + contentView.addSubview(sendCountLabel) contentView.addSubview(priceLabel) contentView.addSubview(hotBgView) hotBgView.addSubview(hotLabel) @@ -148,14 +166,26 @@ extension VPCoinsBuyCell { make.bottom.right.equalToSuperview() } - coinCountLabel.snp.makeConstraints { make in + coinBgView.snp.makeConstraints { make in make.centerX.equalToSuperview() - make.top.equalToSuperview().offset(22) + make.top.equalToSuperview().offset(28) + } + + coinCountLabel.snp.makeConstraints { make in + make.left.equalToSuperview() + make.centerY.equalToSuperview() + } + + sendCountLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalTo(coinBgView.snp.bottom).offset(8) } iconImageView.snp.makeConstraints { make in - make.centerX.equalToSuperview() - make.top.equalToSuperview().offset(45) + make.left.equalTo(coinCountLabel.snp.right).offset(3) + make.right.equalToSuperview() + make.centerY.equalToSuperview() + make.top.equalToSuperview() } priceLabel.snp.makeConstraints { make in diff --git a/Veloria/Class/Wallet/View/VPVIPRecordCell.swift b/Veloria/Class/Wallet/View/VPVIPRecordCell.swift index c5c8fa2..59e5a86 100644 --- a/Veloria/Class/Wallet/View/VPVIPRecordCell.swift +++ b/Veloria/Class/Wallet/View/VPVIPRecordCell.swift @@ -13,6 +13,7 @@ class VPVIPRecordCell: VPWalletBaseCell { didSet { dayLabel.text = model?.value timeLabel.text = model?.created_at + titleLabel.text = model?.type } } diff --git a/Veloria/Libs/VPIAPManager/VPIAPManager.swift b/Veloria/Libs/VPIAPManager/VPIAPManager.swift index 0af0353..e42352e 100644 --- a/Veloria/Libs/VPIAPManager/VPIAPManager.swift +++ b/Veloria/Libs/VPIAPManager/VPIAPManager.swift @@ -180,6 +180,8 @@ extension VPIAPManager: JXIAPManagerDelegate { if code == .noProduct { VPToast.show(text: "kIapErrorToast02".localized) + } else if code == .cancelled { + VPToast.show(text: "kIapErrorToast04".localized) } self.completionHandler?(false) } diff --git a/Veloria/Source/Assets.xcassets/icon/alert_icon_03.imageset/Contents.json b/Veloria/Source/Assets.xcassets/icon/alert_icon_03.imageset/Contents.json new file mode 100644 index 0000000..d7583b3 --- /dev/null +++ b/Veloria/Source/Assets.xcassets/icon/alert_icon_03.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "通知图标-切图图层@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "通知图标-切图图层@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Veloria/Source/Assets.xcassets/icon/alert_icon_03.imageset/通知图标-切图图层@2x.png b/Veloria/Source/Assets.xcassets/icon/alert_icon_03.imageset/通知图标-切图图层@2x.png new file mode 100644 index 0000000..adcc69d Binary files /dev/null and b/Veloria/Source/Assets.xcassets/icon/alert_icon_03.imageset/通知图标-切图图层@2x.png differ diff --git a/Veloria/Source/Assets.xcassets/icon/alert_icon_03.imageset/通知图标-切图图层@3x.png b/Veloria/Source/Assets.xcassets/icon/alert_icon_03.imageset/通知图标-切图图层@3x.png new file mode 100644 index 0000000..8d73e48 Binary files /dev/null and b/Veloria/Source/Assets.xcassets/icon/alert_icon_03.imageset/通知图标-切图图层@3x.png differ diff --git a/Veloria/Source/Assets.xcassets/icon/coin_icon_04.imageset/金币1 3@2x.png b/Veloria/Source/Assets.xcassets/icon/coin_icon_04.imageset/金币1 3@2x.png index 9b6325f..84e40ba 100644 Binary files a/Veloria/Source/Assets.xcassets/icon/coin_icon_04.imageset/金币1 3@2x.png and b/Veloria/Source/Assets.xcassets/icon/coin_icon_04.imageset/金币1 3@2x.png differ diff --git a/Veloria/Source/Assets.xcassets/icon/coin_icon_04.imageset/金币1 3@3x.png b/Veloria/Source/Assets.xcassets/icon/coin_icon_04.imageset/金币1 3@3x.png index dff3fcd..75a3f57 100644 Binary files a/Veloria/Source/Assets.xcassets/icon/coin_icon_04.imageset/金币1 3@3x.png and b/Veloria/Source/Assets.xcassets/icon/coin_icon_04.imageset/金币1 3@3x.png differ diff --git a/Veloria/Source/Assets.xcassets/icon/me_item_icon_07.imageset/Contents.json b/Veloria/Source/Assets.xcassets/icon/me_item_icon_07.imageset/Contents.json new file mode 100644 index 0000000..5c4d3b1 --- /dev/null +++ b/Veloria/Source/Assets.xcassets/icon/me_item_icon_07.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Veloria/Source/Assets.xcassets/icon/me_item_icon_07.imageset/Frame@2x.png b/Veloria/Source/Assets.xcassets/icon/me_item_icon_07.imageset/Frame@2x.png new file mode 100644 index 0000000..4106e05 Binary files /dev/null and b/Veloria/Source/Assets.xcassets/icon/me_item_icon_07.imageset/Frame@2x.png differ diff --git a/Veloria/Source/Assets.xcassets/icon/me_item_icon_07.imageset/Frame@3x.png b/Veloria/Source/Assets.xcassets/icon/me_item_icon_07.imageset/Frame@3x.png new file mode 100644 index 0000000..0ea7cda Binary files /dev/null and b/Veloria/Source/Assets.xcassets/icon/me_item_icon_07.imageset/Frame@3x.png differ diff --git a/Veloria/Source/en.lproj/Localizable.strings b/Veloria/Source/en.lproj/Localizable.strings index 47b3cf7..6117338 100644 --- a/Veloria/Source/en.lproj/Localizable.strings +++ b/Veloria/Source/en.lproj/Localizable.strings @@ -31,7 +31,6 @@ "Explicit List of Personal Information Collection" = "Explicit List of Personal Information Collection"; "About Us" = "About Us"; "Visitor" = "Visitor"; -"Help Center" = "Help Center"; "Feedback History" = "Feedback History"; "Feedback" = "Feedback"; "Feedback Details" = "Feedback Details"; @@ -73,7 +72,7 @@ "Login with Facebook" = "Login with Facebook"; "Log In" = "Log In"; "Sign Out" = "Sign Out"; -"Delet Account" = "Delet Account"; +"Delete Account" = "Delete Account"; "Account Deletion" = "Account Deletion"; "Delete Account" = "Delete Account"; "Delete Forever" = "Delete Forever"; @@ -89,13 +88,17 @@ "Restore" = "Restore"; "Watch Now" = "Watch Now"; "More" = "More"; +"Confirm" = "Confirm"; +"Order Record" = "Order Record"; + +"kBonusCoinCount" = "+%@ Bonus"; "kEmptyTitle01" = "Nothing Here Yet"; "kEmptyDes01" = "Start exploring and add something!"; "kEmptyTitle02" = "Not Found"; "kEmptyDes02" = "Sorry, we couldn't find anything."; "kDetailRecommandTitle" = "Picked Just for You"; -"kHomeTitleText" = "10,000+ addictive shorts await!"; +"kHomeTitleText" = "10,000+ Addictive Shorts Await!"; "kSearchPlaceholderText1" = "Search dramas"; "kSearchPlaceholderText2" = "#Recersal of fate"; "kHomeMenuTitle" = "Select Categories"; @@ -123,6 +126,7 @@ "kIapErrorToast02" = "Invalid in-app purchase"; ///没有可恢复购买 "kIapErrorToast03" = "There are no in-app purchases to restore."; +"kIapErrorToast04" = "Payment has been cancelled."; ///请购买上一集 "kUnlockVideoErrorToast01" = "The prequel to this series is not unlocked. Please unlock the prequel before unlocking this series"; @@ -131,14 +135,16 @@ "kStoreTips" = "1. Coins are virtual items and cannot be refunded. Use it for this product. 2. Gold coins will never expire, the reward coins will expire 24 hours a day. 3. Coins will be used first when unlocking episodes. If the amount is insufficient, reward coins will automatically be used. -4. The purchase has not been credited, click torefresh. -5. For other questions, contact us via Profile>Help &feedback."; +4. The purchase has not been credited, click to refresh. +5. For other questions, contact us via Me>Feedback."; //请选择需要删除的短剧 "kToastText1" = "Please select the short plays that need to be deleted"; "kDeleteAccountAlertTitle" = "Confirm Account Deletion"; "kDeleteAccountAlertText" = "This action cannot be undone."; +"kUnFavoritesAlertTitle" = "UnFavorites"; +"kUnFavoritesAlertText" = "You may not find this collection after you uncollect it"; "kLogoutAlertTitle" = "Ready to Leave?"; "kLogoutAlertText" = "when you sign out, your watch history will not be synced to your account.";