Sfoglia il codice sorgente

3.6.12(4)修改 bug ,增加订阅时次数提醒

100Years 1 settimana fa
parent
commit
740bdb2af2
42 ha cambiato i file con 524 aggiunte e 96 eliminazioni
  1. 2 2
      TSLiveWallpaper.xcodeproj/project.pbxproj
  2. 1 1
      TSLiveWallpaper.xcodeproj/xcshareddata/xcschemes/TSLiveWallpaper.xcscheme
  3. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/ailist_bannerl_shaow.imageset/ailist_bannerl_shaow@2x.png
  4. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/ailist_bannerl_shaow.imageset/ailist_bannerl_shaow@3x.png
  5. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/switch_original_picture.imageset/switch_original_picture@2x.png
  6. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/switch_original_picture.imageset/switch_original_picture@3x.png
  7. BIN
      TSLiveWallpaper/Assets.xcassets/Purchase/purchase_icon_lock.imageset/purchase_icon_lock@2x.png
  8. BIN
      TSLiveWallpaper/Assets.xcassets/Purchase/purchase_icon_lock.imageset/purchase_icon_lock@3x.png
  9. BIN
      TSLiveWallpaper/Assets.xcassets/Purchase/purchase_icon_unlimited.imageset/purchase_icon_unlimited@2x.png
  10. BIN
      TSLiveWallpaper/Assets.xcassets/Purchase/purchase_icon_unlimited.imageset/purchase_icon_unlimited@3x.png
  11. 2 2
      TSLiveWallpaper/Business/BusinessView/TSImageIPanComparisonView.swift
  12. 1 1
      TSLiveWallpaper/Business/TSAIListVC/TSAIList+Enmu.swift
  13. 2 2
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListStyleMoreVC/TSAIListStyleMoreVC.swift
  14. 17 4
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListVC.swift
  15. 3 1
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataModel.swift
  16. 11 14
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM.swift
  17. 18 2
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/View/TSAIListHeaderView.swift
  18. 1 3
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIPhotoRemoveVC/TSAIPhotoRemoveVC.swift
  19. 1 1
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIRemovePhotlVC/TSAIRemovePhotlVC.swift
  20. 2 2
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+Style.swift
  21. 10 3
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC.swift
  22. 11 5
      TSLiveWallpaper/Business/TSAIResultsFrameVC/TSAIUsedPhotoVC/TSAIUsedPhotoVC.swift
  23. 9 5
      TSLiveWallpaper/Business/TSMineVC/TSChangeLanguageVC/TSChangeLanguageVC.swift
  24. 1 2
      TSLiveWallpaper/Business/TSMineVC/TSMineCell.swift
  25. 2 2
      TSLiveWallpaper/Business/TSMineVC/TSMineVM.swift
  26. 4 4
      TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift
  27. 20 6
      TSLiveWallpaper/Common/Purchase/TSPurchaseBusiness+Limit.swift
  28. 3 3
      TSLiveWallpaper/Common/Purchase/TSPurchaseManager.swift
  29. 1 1
      TSLiveWallpaper/Common/TSNetWork/TSNetWork+Business.swift
  30. 5 1
      TSLiveWallpaper/Common/Tool/LanguageManager.swift
  31. 40 28
      TSLiveWallpaper/Common/ViewTool/TSPhotoPickerManager/TSPhotoPickerManager.swift
  32. 32 0
      TSLiveWallpaper/ar.lproj/Localizable.strings
  33. 32 0
      TSLiveWallpaper/de.lproj/Localizable.strings
  34. 32 0
      TSLiveWallpaper/en.lproj/Localizable.strings
  35. 36 0
      TSLiveWallpaper/es.lproj/Localizable.strings
  36. 32 0
      TSLiveWallpaper/fr.lproj/Localizable.strings
  37. 32 0
      TSLiveWallpaper/it.lproj/Localizable.strings
  38. 33 1
      TSLiveWallpaper/ja.lproj/Localizable.strings
  39. 32 0
      TSLiveWallpaper/ko.lproj/Localizable.strings
  40. 32 0
      TSLiveWallpaper/pt-BR.lproj/Localizable.strings
  41. 32 0
      TSLiveWallpaper/pt-PT.lproj/Localizable.strings
  42. 32 0
      TSLiveWallpaper/zh-Hant.lproj/Localizable.strings

+ 2 - 2
TSLiveWallpaper.xcodeproj/project.pbxproj

@@ -1445,7 +1445,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 4;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
@@ -1486,7 +1486,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 4;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;

+ 1 - 1
TSLiveWallpaper.xcodeproj/xcshareddata/xcschemes/TSLiveWallpaper.xcscheme

@@ -31,7 +31,7 @@
       shouldAutocreateTestPlan = "YES">
    </TestAction>
    <LaunchAction
-      buildConfiguration = "Debug"
+      buildConfiguration = "Release"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       launchStyle = "0"

BIN
TSLiveWallpaper/Assets.xcassets/AIList/ailist_bannerl_shaow.imageset/ailist_bannerl_shaow@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/ailist_bannerl_shaow.imageset/ailist_bannerl_shaow@3x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/switch_original_picture.imageset/switch_original_picture@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/switch_original_picture.imageset/switch_original_picture@3x.png


BIN
TSLiveWallpaper/Assets.xcassets/Purchase/purchase_icon_lock.imageset/purchase_icon_lock@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Purchase/purchase_icon_lock.imageset/purchase_icon_lock@3x.png


BIN
TSLiveWallpaper/Assets.xcassets/Purchase/purchase_icon_unlimited.imageset/purchase_icon_unlimited@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Purchase/purchase_icon_unlimited.imageset/purchase_icon_unlimited@3x.png


+ 2 - 2
TSLiveWallpaper/Business/BusinessView/TSImageIPanComparisonView.swift

@@ -40,12 +40,12 @@ class TSImageIPanComparisonView: UIView , UIGestureRecognizerDelegate{
     // MARK: - 视图设置
     private func setupViews() {
         // 旧图片视图(初始显示)
-        oldImageView.contentMode = .scaleAspectFit
+        oldImageView.contentMode = .scaleAspectFill
         oldImageView.clipsToBounds = true
         addSubview(oldImageView)
         
         // 新图片视图(初始隐藏)
-        newImageView.contentMode = .scaleAspectFit
+        newImageView.contentMode = .scaleAspectFill
         newImageView.clipsToBounds = true
         addSubview(newImageView)
         

+ 1 - 1
TSLiveWallpaper/Business/TSAIListVC/TSAIList+Enmu.swift

@@ -41,7 +41,7 @@ enum TSGeneratorImageStyle:String {
     
     var userDefaultsKey:String{
         switch self {
-        case .remove,.removeWatermark,.photoExpand:
+        case .remove,.removeWatermark,.photoExpand,.removeBg:
             return ""
         default:
             return self.rawValue

+ 2 - 2
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListStyleMoreVC/TSAIListStyleMoreVC.swift

@@ -59,7 +59,7 @@ class TSAIListStyleMoreVC: TSBaseVC {
             setNavBarViewHidden(true)
         }else{
             addNormalNavBarView()
-            setPageTitle(titleString)
+            setPageTitle(titleString.localized)
         }
   
         contentView.addSubview(collectionView)
@@ -264,7 +264,7 @@ class TSAILIstStyleMoreCrossDissolveCell: TSAILIstStyleMoreBaseCell {
             guard let model = model else { return }
             textLabel.text = model.name
             if let animationModel = model.viewModel as? TSDiscoverAnimationItemVM {
-                imageView.startImageTransitionAnimation(index: animationModel.index,datas: animationModel.imageNameds,interval:2.0) { [weak self] index,imageNamed in
+                imageView.startImageTransitionAnimation(index: animationModel.index,datas: animationModel.imageNameds) { [weak self] index,imageNamed in
                     guard let self = self else { return }
                     guard let imageNamed = imageNamed as? String else { return }
                     animationModel.index = index

+ 17 - 4
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListVC.swift

@@ -12,7 +12,7 @@ class TSAIListVC: TSBaseVC {
     
     //###################################### 导航栏 view ######################################
     lazy var vipBtn: UIButton = {
-        let vipBtn = UIButton.createButton(image: UIImage(named: "nav_vip")) { [weak self] in
+        let vipBtn = UIButton.createButton(image: UIImage(named: "nav_vip"),backgroundColor: "#010101".uiColor.withAlphaComponent(0.4),corner: 12) { [weak self] in
             guard let self = self else { return }
             TSPurchaseVC.show(target: self) {}
         }
@@ -23,6 +23,8 @@ class TSAIListVC: TSBaseVC {
         let navBarView = TSBaseNavContentBarView()
 
         let label = UILabel.createLabel(text: "Home".localized,font: .font(name: .Pacifico, size: 24))
+        label.textColor = .themeColor
+        label.addShadow(shadowColor: UIColor.black.cgColor, shadowOffset: CGSize(width: 2, height: 2), shadowRadius: 2, shadowOpacity: 0.3)
         navBarView.barView.addSubview(label)
         label.snp.makeConstraints { make in
             make.centerY.equalToSuperview()
@@ -36,9 +38,9 @@ class TSAIListVC: TSBaseVC {
             make.width.height.equalTo(32)
         }
         
-        kMainAsync {
-            label.applyGradient(colors: ["#F1D3AB".uiColor,"#E4A858".uiColor])
-        }
+//        kMainAsync {
+//            label.applyGradient(colors: ["#F1D3AB".uiColor,"#E4A858".uiColor])
+//        }
 
        return navBarView
     }()
@@ -98,6 +100,17 @@ class TSAIListVC: TSBaseVC {
         }
     }
 }
+
+extension TSAIListVC: UIScrollViewDelegate {
+    // 开始拖拽(用户开始滚动)
+    func scrollViewDidScroll(_ scrollView: UIScrollView) {
+        let height:CGFloat = 280-k_Nav_Height
+        let alpha = scrollView.contentOffset.y/height
+        navBarView.backgroundColor = .mainBg.withAlphaComponent(alpha)
+//        navBarView.backgroundColor = scrollView.contentOffset.y >= height ? .mainBg : .clear
+    }
+}
+
 extension TSAIListVC: UICollectionViewDataSource ,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout{
     
     func numberOfSections(in collectionView: UICollectionView) -> Int {

+ 3 - 1
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataModel.swift

@@ -80,12 +80,14 @@ class TSDiscoverAnimationItemVM:TSDiscoverBaseItemVM{
 let kDiscoverSectionH = 56.0
 
 class TSDiscoverSectionModel {
+    var imageNamed:String = ""
     var title:String = ""
     var style:TSDiscoverViewStyle = .styleMore
     var items:[Any] = []
     var sectionEdge:UIEdgeInsets = UIEdgeInsets(top: 10, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
 
-    func setTitle(title:String,style:TSDiscoverViewStyle = .styleMore) {
+    func setTitle(imageNamed:String = "",title:String,style:TSDiscoverViewStyle = .styleMore) {
+        self.imageNamed = imageNamed
         self.title = title
         self.style = style
     }

+ 11 - 14
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM.swift

@@ -20,19 +20,20 @@ class TSAIListDataVM {
         section.style = .banner
         section.sectionEdge =  UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
         section.items = [[
+            TSDiscoverItemModel(style: .enhance,
+                                viewModel: TSDiscoverAnimationItemVM(title: "Photo Enhance",style: .comparison, imageNameds: ["alistHome_0_PhotoEnhance","alistHome_1_PhotoEnhance"]),
+                                generateModel: TSGenerateModel(json: ptp_Enhance)),
             TSDiscoverItemModel(style: .portraitFusion,
                                 viewModel: TSDiscoverBaseItemVM(imageNamed: "alistHome_0_PortraitFusion"),
                                 generateModel: TSGenerateModel(json: ptp_PortraitFusion)),
-            TSDiscoverItemModel(style: .enhance,
-                                viewModel: TSDiscoverAnimationItemVM(title: "Photo Enhance",style: .comparison, imageNameds: ["alistHome_0_PhotoEnhance","alistHome_1_PhotoEnhance"]),
-                                generateModel: TSGenerateModel(json: ptp_Enhance))
+
         ]]
         return section
     }()
     
     lazy var restoreOldPhotoSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
-        section.setTitle(title: "Restore Old Photo")
+        section.setTitle(imageNamed: "✨",title: "Restore Old Photo")
         section.sectionEdge =  UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
         section.items = [[
             TSDiscoverItemModel(style: .recreate,
@@ -59,10 +60,9 @@ class TSAIListDataVM {
         return section
     }()
     
-
     lazy var oldPhotoAnimationSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
-        section.setTitle(title: "Old Photo Animation")
+        section.setTitle(imageNamed: "📽️",title: "Old Photo Animation")
         section.sectionEdge =  UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
         section.items = [[
             TSDiscoverItemModel(style: .creatVideo,
@@ -95,10 +95,10 @@ class TSAIListDataVM {
         ]]
         return section
     }()
-    
+
     lazy var loveScenesSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
-        section.setTitle(title: "Love Scenes")
+        section.setTitle(imageNamed: "💓",title: "Love Scenes")
         section.sectionEdge =  UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
         section.items = [[
             TSDiscoverItemModel(style: .creatVideo,
@@ -123,10 +123,9 @@ class TSAIListDataVM {
         return section
     }()
     
-    
     lazy var emotionSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
-        section.setTitle(title: "Emotion")
+        section.setTitle(imageNamed: "😊",title: "Emotion")
         section.sectionEdge =  UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: 0, right: kDiscoverSection.right)
         section.items = [[
             TSDiscoverItemModel(style: .creatVideo,
@@ -150,11 +149,10 @@ class TSAIListDataVM {
         ]]
         return section
     }()
-    
-    
+
     lazy var editPhotoSection: TSDiscoverSectionModel = {
         let section = TSDiscoverSectionModel()
-        section.setTitle(title: "Edit Photo")
+        section.setTitle(imageNamed: "🖌️",title: "Edit Old Photo")
         section.sectionEdge =  UIEdgeInsets(top: 0, left: kDiscoverSection.left, bottom: k_TabBar_Height+10, right: kDiscoverSection.right)
         section.items = [[
             TSDiscoverItemModel(style: .remove,
@@ -173,7 +171,6 @@ class TSAIListDataVM {
         return section
     }()
     
-
     lazy var listDatas: [TSDiscoverSectionModel] = {
         return [
             bannerSection,

+ 18 - 2
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/View/TSAIListHeaderView.swift

@@ -21,6 +21,7 @@ class TSAIListHeaderView: UICollectionReusableView {
     var clickBlock:((TSDiscoverSectionModel)->Void)?
     var sectionModel:TSDiscoverSectionModel = TSDiscoverSectionModel(){
         didSet{
+            imageLab.text = sectionModel.imageNamed
             titleLab.text = sectionModel.title.localized
 //            moreView.isHidden = sectionModel.style != .styleMore
         }
@@ -30,19 +31,27 @@ class TSAIListHeaderView: UICollectionReusableView {
     static let viewH:CGFloat = kSectionTitleViewH
     let viewH:CGFloat = kSectionTitleViewH
     
+    
+    lazy var imageLab: UILabel = {
+        let imageLab = UILabel.createLabel(font: .font(name: .ZillaSlab, size: 16,weight: .medium),textColor: .white)
+        return imageLab
+    }()
+    
     lazy var titleLab: UILabel = {
         let titleLab = UILabel.createLabel(font: .font(name: .ZillaSlab, size: 16,weight: .medium),textColor: .white)
         return titleLab
     }()
     
     lazy var imageView:UIImageView = {
-        let imageView = UIImageView.createImageView(image:.grayRightArrow)
+        let imageView = UIImageView.createImageView(image:.grayRightArrow.withRenderingMode(.alwaysTemplate))
+        imageView.tintColor = .themeColor
         return imageView
     }()
     
     
     lazy var rightLabel: UILabel = {
         let label = UILabel.createLabel(text: "See All".localized,font: .font(name: .ZillaSlab, size: 16),textColor: .white.withAlphaComponent(0.6))
+        label.textColor = .themeColor
         return label
     }()
     
@@ -64,9 +73,16 @@ class TSAIListHeaderView: UICollectionReusableView {
     }()
 
     func creatUI() {
+        
+        addSubview(imageLab)
+        imageLab.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.centerY.equalToSuperview().offset(kSectionTitleViewCenterYOffset)
+        }
+        
         addSubview(titleLab)
         titleLab.snp.makeConstraints { make in
-            make.leading.equalTo(16)
+            make.leading.equalTo(imageLab.snp.trailing).offset(4)
             make.centerY.equalToSuperview().offset(kSectionTitleViewCenterYOffset)
         }
         

+ 1 - 3
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIPhotoRemoveVC/TSAIPhotoRemoveVC.swift

@@ -212,9 +212,7 @@ class TSAIRemovePhotoBgVC: TSBaseVC {
     }
     
     func generatorOperation() {
-//        generatorNew()
-        generateInView.isHidden = true
-        
+        generatorNew()
     }
 }
 extension TSAIRemovePhotoBgVC {

+ 1 - 1
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIRemovePhotlVC/TSAIRemovePhotlVC.swift

@@ -154,7 +154,7 @@ class TSAIRemovePhotlVC: TSAIUploadPhotoVC {
         }
         cusStackView.addSubviewToStack(scrollView)
         cusStackView.scrollView.isScrollEnabled = false
-        // 移除所有点击手势(较粗暴)
+        // 移除所有点击手势
         uploadImageView.gestureRecognizers?.forEach {
             if $0 is UITapGestureRecognizer {
                 uploadImageView.removeGestureRecognizer($0)

+ 2 - 2
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+Style.swift

@@ -12,7 +12,7 @@ extension TSAIUploadPhotoVC {
         styleBarView.selsetedBlock = { [weak self] model in
             guard let self = self else { return }
             generateModel = model
-            setTitleText(model.imageText)
+            setTitleText(model.imageText.localized)
         }
         return styleBarView
     }
@@ -46,7 +46,7 @@ extension TSAIUploadPhotoVC {
         cusStackView.addSubviewToStack(self.styleBarView)
         
         if let generateModel = self.generateModel {
-            setTitleText(generateModel.imageText)
+            setTitleText(generateModel.imageText.localized)
         }
 
     }

+ 10 - 3
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC.swift

@@ -13,12 +13,14 @@ class TSAIUploadPhotoVC: TSBaseVC {
     var titleString:String
     var disCoverItemModel:TSDiscoverItemModel?
     var generateModel:TSGenerateModel?
-    init(titleString:String,upLoadImage:UIImage,generatorStyle:TSGeneratorImageStyle,disCoverItemModel:TSDiscoverItemModel? = nil) {
+    var isUsedPhoto:Bool = false
+    init(titleString:String,upLoadImage:UIImage,generatorStyle:TSGeneratorImageStyle,disCoverItemModel:TSDiscoverItemModel? = nil,isUsedPhoto:Bool = false) {
         self.titleString = titleString
         self.upLoadImage = upLoadImage
         self.generatorStyle = generatorStyle
         self.disCoverItemModel = disCoverItemModel
         self.generateModel = disCoverItemModel?.generateModel
+        self.isUsedPhoto = isUsedPhoto
         super.init()
     }
     
@@ -83,7 +85,13 @@ class TSAIUploadPhotoVC: TSBaseVC {
         
         addNormalNavBarView()
         setPageTitle(titleString)
-        _ = setNavigationItem("", imageName: "replace_photo", direction: .right, action: #selector(clickNavRight))
+        
+        if isUsedPhoto {
+            _ = setNavigationItem("", imageName: "ai_delete", direction: .right, action: #selector(clickNavDelete))
+        }else{
+            _ = setNavigationItem("", imageName: "replace_photo", direction: .right, action: #selector(clickNavRight))
+        }
+
         let tap = UITapGestureRecognizer(target: self, action: #selector(clickView))
         tap.cancelsTouchesInView = false
         view.addGestureRecognizer(tap)
@@ -183,7 +191,6 @@ class TSAIUploadPhotoVC: TSBaseVC {
 extension TSAIUploadPhotoVC {
     func setDeleteComplete(deleteComplete:@escaping ()->Void){
         self.deleteComplete = deleteComplete
-        _ = setNavigationItem("", imageName: "ai_delete", direction: .right, action: #selector(clickNavDelete))
     }
     
     @objc func clickNavDelete() {

+ 11 - 5
TSLiveWallpaper/Business/TSAIResultsFrameVC/TSAIUsedPhotoVC/TSAIUsedPhotoVC.swift

@@ -178,10 +178,12 @@ extension TSAIUsedPhotoVC: UICollectionViewDataSource ,UICollectionViewDelegate
                 guard let image = image else { return }
                 let itemModel = TSDiscoverItemModel(style: .colorize,viewModel: TSDiscoverAnimationItemVM(),generateModel: TSGenerateModel(json: TSAIListDataVM.shared.ptp_Colorize))
                 
-                let vc = TSAIUploadPhotoVC(titleString: "",upLoadImage: image, generatorStyle: .colorize,disCoverItemModel: itemModel)
+                let vc = TSAIUploadPhotoVC(titleString: "",upLoadImage: image, generatorStyle: .colorize,disCoverItemModel: itemModel,isUsedPhoto: true)
                 vc.setDeleteComplete { [weak self]  in
                     guard let self = self else { return }
-                    handelCellCmd(cmd: "delete", indexPath: indexPath)
+                    if let imageKey = listImageKeylArray.safeObj(At: indexPath.item){
+                        removeKey(imageKey: imageKey)
+                    }
                 }
                 self.push(vc,animated: true)
                 
@@ -194,7 +196,6 @@ extension TSAIUsedPhotoVC: UICollectionViewDataSource ,UICollectionViewDelegate
 extension TSAIUsedPhotoVC{
     func handelCellCmd(cmd:String,indexPath: IndexPath){
         if let imageKey = listImageKeylArray.safeObj(At: indexPath.item){
-
             if cmd == "delete" {
                 TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
                     message: "Are you sure to delete?".localized,
@@ -204,13 +205,18 @@ extension TSAIUsedPhotoVC{
                     confirmColor: .white,
                     cancelAction: { [weak self]  in
                         guard let self = self else { return }
-                        TSDBKeyManager.removeKey(imageKey)
-                        updateDataView()
+                        removeKey(imageKey: imageKey)
                     }
                 ))
             }
         }
     }
+    
+    func removeKey(imageKey:String){
+        TSDBKeyManager.removeKey(imageKey)
+        TSImageStoreTool.removeImage(urlString: (imageKey))
+        updateDataView()
+    }
 }
 
 extension TSAIUsedPhotoVC:TSTabBarControllerProtocol {

+ 9 - 5
TSLiveWallpaper/Business/TSMineVC/TSChangeLanguageVC/TSChangeLanguageVC.swift

@@ -20,11 +20,15 @@ class TSChangeLanguageVC: TSBaseVC {
 
     
     override func createData() {
-        let currentLanguage = LanguageManager.shared.currentLanguage
-        for (i,language) in dataArray.enumerated() {
-            if language == currentLanguage {
-                selectedIndex = i
-                break
+        if LanguageManager.shared.followSystem {
+            selectedIndex = 0
+        }else{
+            let currentLanguage = LanguageManager.shared.currentLanguage
+            for (i,language) in dataArray.enumerated() {
+                if language == currentLanguage {
+                    selectedIndex = i
+                    break
+                }
             }
         }
     }

+ 1 - 2
TSLiveWallpaper/Business/TSMineVC/TSMineCell.swift

@@ -20,10 +20,9 @@ class TSMineCell: TSSimpleTableViewCell {
     }()
     
     lazy var rightImageView: UIImageView = {
-        return UIImageView.createRightArrow()
+        return UIImageView.createImageView(image: .grayRightArrow)
     }()
     
-    
     lazy var dotView: UIView = {
         let view = UIView()
         view.backgroundColor = "#FF2B2B".uiColor

+ 2 - 2
TSLiveWallpaper/Business/TSMineVC/TSMineVM.swift

@@ -118,7 +118,7 @@ class TSMineVM {
         sectionModel.addSubItemModel(updateItem)
         
         
-//#if DEBUG
+#if DEBUG
         sectionModel.addSubItemModel(
             createItemModel(
                 leftImage: .mineCellPrivacy,
@@ -157,7 +157,7 @@ class TSMineVM {
                     UIAlertView(title: "", message: string, delegate: nil, cancelButtonTitle: "OK").show()
                     dePrint("所有的会员次数=\(string)")
                 }))
-//#endif
+#endif
         
         
         return dataArray

+ 4 - 4
TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift

@@ -236,10 +236,10 @@ struct PurchaseView :View {
                 Spacer().frame(height: 24)
                 
                 HStack(alignment: .center, spacing: 8*kDesignScale, content: {
-                    TSFeatureItemView(image: .purchaseIconUnlimited, text: "Unlimited Process".localized)
-                    TSFeatureItemView(image: .purchaseIconLock, text: "Unlock All Features".localized)
-                    TSFeatureItemView(image: .purchaseIconHd, text: "High Speed & Quality".localized)
-                    TSFeatureItemView(image: .purchaseIconAd, text: "100%\nNo Ads".localized)
+                    TSFeatureItemView(image: .purchaseIconUnlimited, text: "Unlimited Photo Edits".localized)
+                    TSFeatureItemView(image: .purchaseIconLock, text: String(format: "%d Video Generations".localized, viewModel.selectedType.creatVideoMaxNum))
+                    TSFeatureItemView(image: .purchaseIconHd, text: "Faster&Higher Quality".localized)
+                    TSFeatureItemView(image: .purchaseIconAd, text: "100% Ad-Free".localized)
                 }).multilineTextAlignment(.center).font(.font(size: 12)).foregroundColor(.white)
             }
             

+ 20 - 6
TSLiveWallpaper/Common/Purchase/TSPurchaseBusiness+Limit.swift

@@ -9,22 +9,36 @@ extension PremiumPeriod {
     
     /// 对应vip类型,可以每天限额次数
     var dayGeneratedNumber: Int {
-        return 3//50
+        return 50//50
     }
     /// 对应vip类型,可以每天限额视频次数
     var dayGeneratedVideoNumber: Int {
-        return 3//20
+        return 20//20
     }
     /// 对应vip类型,可以一共限额视频次数
     var creatVideoMaxNum:Int {
         switch self  {
+        case .lifetime:
+            return 300//300
         case .year:
-            return 2//200
+            return 200//200
+        case .month:
+            return 80//80
         default:
-            return 2//20
+            return 20//20
         }
     }
     
+    var limitMaxString:String{
+        switch self  {
+        case .year:
+            return "You've hit your yearly limit".localized
+        case .month:
+            return "You've hit your weekly limit".localized
+        default:
+            return "You've hit your limit".localized
+        }
+    }
 }
 
 let kDayGeneratedNumKey = "kDayGeneratedNumKey"
@@ -58,7 +72,7 @@ extension TSPurchaseBusiness {
         
         // 保存新的记录
         var dict: [String: [String: Any]] = [:]
-        if var saveDict = UserDefaults.standard.dictionary(forKey: kDayGeneratedNumKey) as? [String: [String: Any]]{
+        if let saveDict = UserDefaults.standard.dictionary(forKey: kDayGeneratedNumKey) as? [String: [String: Any]]{
             dict = saveDict
         }
         dict[type.rawValue] = ["date": Date().dateDayString, "times": dayNum]
@@ -111,7 +125,7 @@ extension TSPurchaseBusiness {
         dayNum = dayNum + 1
         // 保存新的记录
         var dict: [String: [String: Any]] = [:]
-        if var saveDict = UserDefaults.standard.dictionary(forKey: kVipGeneratedNumKey) as? [String: [String: Any]]{
+        if let saveDict = UserDefaults.standard.dictionary(forKey: kVipGeneratedNumKey) as? [String: [String: Any]]{
             dict = saveDict
         }
         dict[type.rawValue] = ["times": dayNum,"expireTime":expireTime]

+ 3 - 3
TSLiveWallpaper/Common/Purchase/TSPurchaseManager.swift

@@ -82,9 +82,9 @@ public class PurchaseManager: NSObject {
     }
 
     @objc public var isVip: Bool {
-        #if DEBUG
-        return true
-        #endif
+//        #if DEBUG
+//        return true
+//        #endif
         guard let expiresDate = expiredDate else {
             return false
         }

+ 1 - 1
TSLiveWallpaper/Common/TSNetWork/TSNetWork+Business.swift

@@ -83,7 +83,7 @@ enum TSNetWorkCode : Int {
         case .generateTooMuch:
             return "We've detected unusually high generation activity. You may be a bot. Please try again tomorrow.".localized
         case .generateToMax:
-            return kPurchaseBusiness.vipType == .week ? "You've hit your weekly limit".localized : "You've hit your yearly limit".localized
+            return kPurchaseBusiness.vipType.limitMaxString
         default:
             return "Sorry there was a slight problem with the image processing, please try again later.".localized
         }

+ 5 - 1
TSLiveWallpaper/Common/Tool/LanguageManager.swift

@@ -43,7 +43,7 @@ class LanguageManager {
         
         var displayName: String {
             switch self {
-            case .system: return "Follow System"
+            case .system: return "Follow System".localized
             case .en: return "English"
             case .ja: return "日本語"
             case .ar: return "العربية"
@@ -112,6 +112,10 @@ class LanguageManager {
         }
     }
     
+    var followSystem:Bool{
+        return UserDefaults.standard.string(forKey: userDefaultsKey) == nil ? true : false
+    }
+    
     // 初始化
     private init() {
         // 初始化时设置当前语言

+ 40 - 28
TSLiveWallpaper/Common/ViewTool/TSPhotoPickerManager/TSPhotoPickerManager.swift

@@ -37,6 +37,7 @@ class TSPhotoPickerManager: NSObject{
     var picker: PhotoPickerController?
     var multipleConfig: PickerConfiguration{
         var config = PickerConfiguration()
+        config.appearanceStyle = .dark
         config.modalPresentationStyle = .overFullScreen
         config.themeColor = .themeColor
         config.selectOptions = .photo
@@ -49,6 +50,10 @@ class TSPhotoPickerManager: NSObject{
         
         config.navigationTitleColor = .white
         config.navigationTitleDarkColor = .white
+        config.navigationTintColor = .white
+        config.navigationDarkTintColor = .white
+        config.albumList.albumNameColor = .white
+        config.albumList.albumNameDarkColor = .white
 
         config.albumShowMode = .normal
         config.photoList.takePictureCompletionToSelected = true
@@ -79,12 +84,11 @@ class TSPhotoPickerManager: NSObject{
         var customCameraConfig = CameraConfiguration()
         customCameraConfig.isSaveSystemAlbum = true
         customCameraConfig.sessionPreset = .hd1920x1080
-        customCameraConfig.aspectRatio = .fullScreen
         customCameraConfig.editor.toolsView = .init(toolOptions: [cropSize])
         customCameraConfig.editor.cropSize.aspectRatios = aspectRatios
         config.photoList.cameraType = .custom(customCameraConfig)
     
-        config.appearanceStyle = .dark
+
         config.languageType = LanguageManager.shared.currentLanguage.languageType
         config.customLanguages = [CustomLanguage(language: "it", bundle: Bundle(path: Bundle.main.path(forResource: "it", ofType: "lproj")!)!)]
         config.photoList.isShowFilterItem = false
@@ -138,13 +142,14 @@ class TSPhotoPickerManager: NSObject{
         checkVideoAuthorization { [weak self] authorized in
             guard let self = self else { return }
             if authorized {
-                
                 var customCameraConfig = CameraConfiguration()
                 customCameraConfig.isSaveSystemAlbum = true
                 customCameraConfig.sessionPreset = .hd1920x1080
-                customCameraConfig.aspectRatio = .fullScreen
                 customCameraConfig.editor.toolsView = .init(toolOptions: [cropSize])
                 customCameraConfig.editor.cropSize.aspectRatios = aspectRatios
+                customCameraConfig.languageType = LanguageManager.shared.currentLanguage.languageType
+                customCameraConfig.customLanguages = [CustomLanguage(language: "it", bundle: Bundle(path: Bundle.main.path(forResource: "it", ofType: "lproj")!)!)]
+
                 let cameraController = CameraController(config: customCameraConfig, type: .photo,delegate: self)
                 viewController?.present(cameraController, animated: true, completion: nil)
                 self.cameraController = cameraController
@@ -173,7 +178,8 @@ class TSPhotoPickerManager: NSObject{
         config.textManager.picker.albumCameraRollTitle = .custom("Used Photo".localized)
         config.textManager.picker.photoList.emptyTitle = .custom("")
         config.textManager.picker.photoList.emptySubTitle = .custom("No used photo. Select from Photos or take one to continue.".localized)
-
+        config.allowLoadPhotoLibrary = false
+  
         var photoAsset:[PhotoAsset] = []
         let allKeys = TSDBKeyManager.getAllKeys()
         for item in allKeys {
@@ -197,6 +203,7 @@ class TSPhotoPickerManager: NSObject{
         picker.modalTransitionStyle = .coverVertical
         viewController?.present(picker, animated: true, completion: nil)
         self.picker = picker
+
     }
     
 
@@ -207,17 +214,22 @@ class TSPhotoPickerManager: NSObject{
     /// 检查相册权限
     private func checkPhotoLibraryPermission(completion: @escaping (Bool) -> Void) {
         let status = PHPhotoLibrary.authorizationStatus()
-        switch status {
-        case .authorized:
-            completion(true)
-        case .notDetermined:
-            PHPhotoLibrary.requestAuthorization { newStatus in
+        
+        DispatchQueue.main.async {
+            switch status {
+            case .authorized:
+                completion(true)
+            case .notDetermined:
+                PHPhotoLibrary.requestAuthorization { newStatus in
+                    DispatchQueue.main.async {
+                        completion(newStatus == .authorized)
+                    }
+                }
+            default:
                 DispatchQueue.main.async {
-                    completion(newStatus == .authorized)
+                    completion(false)
                 }
             }
-        default:
-            completion(false)
         }
     }
     
@@ -225,21 +237,21 @@ class TSPhotoPickerManager: NSObject{
     /// 检查相机权限状态
        func checkVideoAuthorization(completion: @escaping (Bool) -> Void) {
            let status = AVCaptureDevice.authorizationStatus(for: .video)
-           
-           switch status {
-           case .authorized:
-               completion(true)
-           case .notDetermined:
-               AVCaptureDevice.requestAccess(for: .video) { granted in
-                     DispatchQueue.main.async {
-                         let currentStatus = AVCaptureDevice.authorizationStatus(for: .video)
-                         completion(granted)
-                     }
-                }
-           case .denied, .restricted:
-               completion(false)
-           @unknown default:
-               completion(false)
+           DispatchQueue.main.async {
+               switch status {
+               case .authorized:
+                    completion(true)
+               case .notDetermined:
+                   AVCaptureDevice.requestAccess(for: .video) { granted in
+                       DispatchQueue.main.async {
+                           completion(granted)
+                       }
+                   }
+               case .denied, .restricted:
+                   completion(false)
+               @unknown default:
+                   completion(false)
+               }
            }
        }
 

+ 32 - 0
TSLiveWallpaper/ar.lproj/Localizable.strings

@@ -185,3 +185,35 @@
 "Pray" = "يصلي";
 "Angry" = "غاضب";
 "Remove Watermark" = "إزالة العلامة المائية";
+
+"No used photo" = "لا توجد صورة مستخدمة";
+"Select from Photos or take one to continue." = "اختر من الصور أو التقط صورة للمتابعة.";
+"Photos are stored on your device for a safer, smoother experience." = "يتم تخزين الصور على جهازك للحصول على تجربة أكثر أمانًا وسلاسة.";
+"AI Expand Photo" = "توسيع الصورة بالذكاء الاصطناعي";
+"Expand" = "يوسع";
+"Photo Enhance" = "تحسين الصور";
+"Follow System" = "اتبع النظام";
+"You've hit your weekly limit" = "لقد وصلت إلى الحد الأسبوعي الخاص بك";
+"You've hit your yearly limit" = "لقد وصلت إلى الحد السنوي الخاص بك";
+"See All" = "انظر الكل";
+"No camera permission" = "لا يوجد إذن للكاميرا";
+"Please enable the camera permission in the Settings to take photos" = "يرجى تفعيل إذن الكاميرا في الإعدادات لالتقاط الصور";
+"You've hit your limit" = "لقد وصلت إلى الحد الأقصى الخاص بك";
+
+"Old Photo Animation" = "رسوم متحركة للصور القديمة";
+"Restore Old Photo" = "استعادة الصورة القديمة";
+"Love Scenes" = "مشاهد الحب";
+"Emotion" = "العاطفة";
+"Edit Old Photo" = "تعديل الصورة القديمة";
+"Choose from Photo" = "اختر من الصورة";
+"Take a Photo" = "التقط صورة";
+"Used Photo" = "صورة مستعملة";
+"Results" = "نتائج";
+"Process" = "عملية";
+"Jazz Dance" = "رقص الجاز";
+"View" = "يفحص";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "لقد رصدنا نشاطًا توليديًا مرتفعًا بشكل غير معتاد. قد تكون روبوتًا. يُرجى المحاولة مجددًا غدًا.";
+"Unlimited Photo Edits" = "تعديلات غير محدودة للصور";
+"%d Video Generations" = "%d جيلًا من الفيديو";
+"Faster&Higher Quality" = "أسرع وأعلى جودة";
+"100% Ad-Free" = "خالٍ من الإعلانات بنسبة 100%";

+ 32 - 0
TSLiveWallpaper/de.lproj/Localizable.strings

@@ -176,3 +176,35 @@
 "Pray" = "Beten";
 "Angry" = "Wütend";
 "Remove Watermark" = "Wasserzeichen entfernen";
+
+"No used photo" = "Kein verwendetes Foto";
+"Select from Photos or take one to continue." = "Wählen Sie aus Fotos aus oder nehmen Sie eins auf, um fortzufahren.";
+"Photos are stored on your device for a safer, smoother experience." = "Für ein sichereres und reibungsloseres Erlebnis werden die Fotos auf Ihrem Gerät gespeichert.";
+"AI Expand Photo" = "AI Foto vergrößern";
+"Expand" = "Expandieren";
+"Photo Enhance" = "Fotoverbesserung";
+"Follow System" = "Folgesystem";
+"You've hit your weekly limit" = "Sie haben Ihr Wochenlimit erreicht";
+"You've hit your yearly limit" = "Sie haben Ihr Jahreslimit erreicht";
+"See All" = "Alle anzeigen";
+"No camera permission" = "Keine Kameraberechtigung";
+"Please enable the camera permission in the Settings to take photos" = "Bitte aktivieren Sie in den Einstellungen die Kameraberechtigung zum Aufnehmen von Fotos";
+"You've hit your limit" = "Du hast dein Limit erreicht";
+
+"Old Photo Animation" = "Alte Fotoanimation";
+"Restore Old Photo" = "Altes Foto wiederherstellen";
+"Love Scenes" = "Liebesszenen";
+"Emotion" = "Emotion";
+"Edit Old Photo" = "Altes Foto bearbeiten";
+"Choose from Photo" = "Wählen Sie aus Foto";
+"Take a Photo" = "Machen Sie ein Foto";
+"Used Photo" = "Verwendetes Foto";
+"Results" = "Ergebnisse";
+"Process" = "Verfahren";
+"Jazz Dance" = "Jazztanz";
+"View" = "Überprüfen";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "Wir haben eine ungewöhnlich hohe Generierungsaktivität festgestellt. Möglicherweise handelt es sich um einen Bot. Bitte versuchen Sie es morgen erneut.";
+"Unlimited Photo Edits" = "Unbegrenzte Fotobearbeitungen";
+"%d Video Generations" = "%d Videogenerationen";
+"Faster&Higher Quality" = "Schneller und höhere Qualität";
+"100% Ad-Free" = "100 % werbefrei";

+ 32 - 0
TSLiveWallpaper/en.lproj/Localizable.strings

@@ -184,3 +184,35 @@
 "Pray" = "Pray";
 "Angry" = "Angry";
 "Remove Watermark" = "Remove Watermark";
+
+"No used photo" = "No used photo";
+"Select from Photos or take one to continue." = "Select from Photos or take one to continue.";
+"Photos are stored on your device for a safer, smoother experience." = "Photos are stored on your device for a safer, smoother experience.";
+"AI Expand Photo" = "AI Expand Photo";
+"Expand" = "Expand";
+"Photo Enhance" = "Photo Enhance";
+"Follow System" = "Follow System";
+"You've hit your weekly limit" = "You've hit your weekly limit";
+"You've hit your yearly limit" = "You've hit your yearly limit";
+"See All" = "See All";
+"No camera permission" = "No camera permission";
+"Please enable the camera permission in the Settings to take photos" = "Please enable the camera permission in the Settings to take photos";
+"You've hit your limit" = "You've hit your limit";
+
+"Old Photo Animation" = "Old Photo Animation";
+"Restore Old Photo" = "Restore Old Photo";
+"Love Scenes" = "Love Scenes";
+"Emotion" = "Emotion";
+"Edit Old Photo" = "Edit Old Photo";
+"Choose from Photo" = "Choose from Photo";
+"Take a Photo" = "Take a Photo";
+"Used Photo" = "Used Photo";
+"Results" = "Results";
+"Process" = "Process";
+"Jazz Dance" = "Jazz Dance";
+"View" = "View";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "We've detected unusually high generation activity. You may be a bot. Please try again tomorrow.";
+"Unlimited Photo Edits" = "Unlimited Photo Edits";
+"%d Video Generations" = "%d Video Generations";
+"Faster&Higher Quality" = "Faster&Higher Quality";
+"100% Ad-Free" = "100% Ad-Free";

+ 36 - 0
TSLiveWallpaper/es.lproj/Localizable.strings

@@ -185,3 +185,39 @@
 "Pray" = "Orar";
 "Angry" = "Enojado";
 "Remove Watermark" = "Eliminar marca de agua";
+
+"No used photo" = "No hay foto usada";
+"Select from Photos or take one to continue." = "Seleccione entre Fotos o tome una para continuar.";
+"Photos are stored on your device for a safer, smoother experience." = "Las fotos se almacenan en su dispositivo para una experiencia más segura y fluida.";
+"AI Expand Photo" = "Foto ampliada con IA";
+"Expand" = "Expandir";
+"Photo Enhance" = "Mejora de fotos";
+"Follow System" = "Seguir el sistema";
+"You've hit your weekly limit" = "Has alcanzado tu límite semanal";
+"You've hit your yearly limit" = "Has alcanzado tu límite anual";
+"See All" = "Ver todo";
+"No camera permission" = "Sin permiso de cámara";
+"Please enable the camera permission in the Settings to take photos" = "Habilite el permiso de la cámara en la Configuración para tomar fotos.";
+"You've hit your limit" = "Has llegado a tu límite";
+
+"Old Photo Animation" = "Animación de fotos antiguas";
+"Restore Old Photo" = "Restaurar foto antigua";
+"Love Scenes" = "Escenas de amor";
+"Emotion" = "Emoción";
+"Edit Old Photo" = "Editar foto antigua";
+"Choose from Photo" = "Elige entre Foto";
+"Take a Photo" = "Toma una foto";
+"Used Photo" = "Foto usada";
+"Results" = "Resultados";
+"Process" = "Proceso";
+"Jazz Dance" = "Danza jazz";
+"View" = "Controlar";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "Hemos detectado una actividad de generación inusualmente alta. Podrías ser un bot. Inténtalo de nuevo mañana.";
+"Unlimited Photo Edits" = "Ediciones de fotos ilimitadas";
+"%d Video Generations" = "%d generaciones de vídeo";
+"Faster&Higher Quality" = "Más rápido y de mayor calidad";
+"100% Ad-Free" = "100% libre de publicidad";
+"Unlimited Photo Edits" = "Ediciones de fotos ilimitadas";
+"%d Video Generations" = "%d generaciones de vídeo";
+"Faster&Higher Quality" = "Más rápido y de mayor calidad";
+"100% Ad-Free" = "100% libre de publicidad";

+ 32 - 0
TSLiveWallpaper/fr.lproj/Localizable.strings

@@ -177,3 +177,35 @@
 "Pray" = "Prier";
 "Angry" = "En colère";
 "Remove Watermark" = "Supprimer le filigrane";
+
+"No used photo" = "Aucune photo utilisée";
+"Select from Photos or take one to continue." = "Sélectionnez parmi les photos ou prenez-en une pour continuer.";
+"Photos are stored on your device for a safer, smoother experience." = "Les photos sont stockées sur votre appareil pour une expérience plus sûre et plus fluide.";
+"AI Expand Photo" = "IA Agrandir la photo";
+"Expand" = "Développer";
+"Photo Enhance" = "Amélioration des photos";
+"Follow System" = "Système de suivi";
+"You've hit your weekly limit" = "Vous avez atteint votre limite hebdomadaire";
+"You've hit your yearly limit" = "Vous avez atteint votre limite annuelle";
+"See All" = "Tout voir";
+"No camera permission" = "Pas d'autorisation de caméra";
+"Please enable the camera permission in the Settings to take photos" = "Veuillez activer l'autorisation de l'appareil photo dans les paramètres pour prendre des photos";
+"You've hit your limit" = "Vous avez atteint votre limite";
+
+"Old Photo Animation" = "Animation de photos anciennes";
+"Restore Old Photo" = "Restaurer une vieille photo";
+"Love Scenes" = "Scènes d'amour";
+"Emotion" = "Émotion";
+"Edit Old Photo" = "Modifier une vieille photo";
+"Choose from Photo" = "Choisissez parmi les photos";
+"Take a Photo" = "Prendre une photo";
+"Used Photo" = "Photo d'occasion";
+"Results" = "Résultats";
+"Process" = "Processus";
+"Jazz Dance" = "Danse jazz";
+"View" = "Vérifier";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "Nous avons détecté une activité de génération anormalement élevée. Vous êtes peut-être un robot. Veuillez réessayer demain.";
+"Unlimited Photo Edits" = "Retouches photo illimitées";
+"%d Video Generations" = "%d générations vidéo";
+"Faster&Higher Quality" = "Plus rapide et de meilleure qualité";
+"100% Ad-Free" = "100% sans publicité";

+ 32 - 0
TSLiveWallpaper/it.lproj/Localizable.strings

@@ -186,3 +186,35 @@
 "Pray" = "Pregare";
 "Angry" = "Arrabbiato";
 "Remove Watermark" = "Rimuovi filigrana";
+
+"No used photo" = "Nessuna foto utilizzata";
+"Select from Photos or take one to continue." = "Seleziona dalle foto o scattane una per continuare.";
+"Photos are stored on your device for a safer, smoother experience." = "Le foto vengono memorizzate sul tuo dispositivo per un'esperienza più sicura e fluida.";
+"AI Expand Photo" = "AI Espandi foto";
+"Expand" = "Espandere";
+"Photo Enhance" = "Miglioramento delle foto";
+"Follow System" = "Segui il sistema";
+"You've hit your weekly limit" = "Hai raggiunto il tuo limite settimanale";
+"You've hit your yearly limit" = "Hai raggiunto il tuo limite annuale";
+"See All" = "Vedi tutto";
+"No camera permission" = "Nessun permesso per la fotocamera";
+"Please enable the camera permission in the Settings to take photos" = "Abilita l'autorizzazione della fotocamera nelle Impostazioni per scattare foto";
+"You've hit your limit" = "Hai raggiunto il tuo limite";
+
+"Old Photo Animation" = "Vecchia animazione fotografica";
+"Restore Old Photo" = "Ripristina vecchia foto";
+"Love Scenes" = "Scene d'amore";
+"Emotion" = "Emozione";
+"Edit Old Photo" = "Modifica vecchia foto";
+"Choose from Photo" = "Scegli tra Foto";
+"Take a Photo" = "Scatta una foto";
+"Used Photo" = "Foto usata";
+"Results" = "Risultati";
+"Process" = "Processo";
+"Jazz Dance" = "Danza Jazz";
+"View" = "Controllo";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "Abbiamo rilevato un'attività di generazione insolitamente elevata. Potresti essere un bot. Riprova domani.";
+"Unlimited Photo Edits" = "Modifiche fotografiche illimitate";
+"%d Video Generations" = "%d Generazioni Video";
+"Faster&Higher Quality" = "Più veloce e di qualità superiore";
+"100% Ad-Free" = "100% senza pubblicità";

+ 33 - 1
TSLiveWallpaper/ja.lproj/Localizable.strings

@@ -173,7 +173,7 @@
 "Dance" = "ダンス";
 "Applaud" = "拍手";
 "Cheers" = "乾杯";
-"Salute" = "敬";
+"Salute" = "敬";
 "Send Rose" = "ローズを送る";
 "Surprise Kiss" = "サプライズキス";
 "Kiss in the Rain" = "雨の中のキス";
@@ -183,3 +183,35 @@
 "Pray" = "祈る";
 "Angry" = "怒り";
 "Remove Watermark" = "透かしを削除";
+
+"No used photo" = "使用済み写真なし";
+"Select from Photos or take one to continue." = "続行するには、写真から選択するか、写真を撮ってください。";
+"Photos are stored on your device for a safer, smoother experience." = "より安全でスムーズな体験を実現するために、写真はデバイスに保存されます。";
+"AI Expand Photo" = "AI写真拡大";
+"Expand" = "拡大する";
+"Photo Enhance" = "写真の強化";
+"Follow System" = "フォローシステム";
+"You've hit your weekly limit" = "週の制限に達しました";
+"You've hit your yearly limit" = "年間の上限に達しました";
+"See All" = "すべてを見る";
+"No camera permission" = "カメラの許可なし";
+"Please enable the camera permission in the Settings to take photos" = "写真を撮るには設定でカメラの許可を有効にしてください";
+"You've hit your limit" = "限界に達しました";
+
+"Old Photo Animation" = "古い写真アニメーション";
+"Restore Old Photo" = "古い写真を復元する";
+"Love Scenes" = "ラブシーン";
+"Emotion" = "感情";
+"Edit Old Photo" = "古い写真を編集する";
+"Choose from Photo" = "写真から選択";
+"Take a Photo" = "写真を撮る";
+"Used Photo" = "使用写真";
+"Results" = "結果";
+"Process" = "プロセス";
+"Jazz Dance" = "ジャズダンス";
+"View" = "チェック";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "異常に高い生成アクティビティが検出されました。ボットの可能性があります。明日もう一度お試しください。";
+"Unlimited Photo Edits" = "無制限の写真編集";
+"%d Video Generations" = "%d ビデオ世代";
+"Faster&Higher Quality" = "より速く、より高品質";
+"100% Ad-Free" = "100%広告なし";

+ 32 - 0
TSLiveWallpaper/ko.lproj/Localizable.strings

@@ -183,3 +183,35 @@
 "Pray" = "기도하다";
 "Angry" = "화난";
 "Remove Watermark" = "워터마크 제거";
+
+"No used photo" = "사용된 사진 없음";
+"Select from Photos or take one to continue." = "사진에서 선택하거나 사진을 찍어 계속하세요.";
+"Photos are stored on your device for a safer, smoother experience." = "더욱 안전하고 원활한 경험을 위해 사진이 귀하의 기기에 저장됩니다.";
+"AI Expand Photo" = "AI 사진 확장";
+"Expand" = "확장하다";
+"Photo Enhance" = "사진 향상";
+"Follow System" = "팔로우 시스템";
+"You've hit your weekly limit" = "주간 한도에 도달했습니다.";
+"You've hit your yearly limit" = "연간 한도에 도달했습니다.";
+"See All" = "모두 보기";
+"No camera permission" = "카메라 허가 없음";
+"Please enable the camera permission in the Settings to take photos" = "사진 촬영을 위해서는 설정에서 카메라 권한을 활성화해 주세요.";
+"You've hit your limit" = "당신은 한계에 도달했습니다";
+
+"Old Photo Animation" = "오래된 사진 애니메이션";
+"Restore Old Photo" = "오래된 사진 복원";
+"Love Scenes" = "러브신";
+"Emotion" = "감정";
+"Edit Old Photo" = "오래된 사진 편집";
+"Choose from Photo" = "사진에서 선택";
+"Take a Photo" = "사진을 찍다";
+"Used Photo" = "사용된 사진";
+"Results" = "결과";
+"Process" = "프로세스";
+"Jazz Dance" = "재즈 댄스";
+"View" = "확인하다";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "비정상적으로 높은 생성 활동이 감지되었습니다. 봇일 가능성이 있습니다. 내일 다시 시도해 주세요.";
+"Unlimited Photo Edits" = "무제한 사진 편집";
+"%d Video Generations" = "%d개의 비디오 세대";
+"Faster&Higher Quality" = "더 빠르고 더 높은 품질";
+"100% Ad-Free" = "100% 광고 없음";

+ 32 - 0
TSLiveWallpaper/pt-BR.lproj/Localizable.strings

@@ -177,3 +177,35 @@
 "Pray" = "Rezar";
 "Angry" = "Nervoso";
 "Remove Watermark" = "Remover marca d'água";
+
+"No used photo" = "Nenhuma foto usada";
+"Select from Photos or take one to continue." = "Selecione uma das fotos ou tire uma para continuar.";
+"Photos are stored on your device for a safer, smoother experience." = "As fotos são armazenadas no seu dispositivo para uma experiência mais segura e tranquila.";
+"AI Expand Photo" = "AI Expandir Foto";
+"Expand" = "Expandir";
+"Photo Enhance" = "Melhorar foto";
+"Follow System" = "Siga o sistema";
+"You've hit your weekly limit" = "Você atingiu seu limite semanal";
+"You've hit your yearly limit" = "Você atingiu seu limite anual";
+"See All" = "Ver tudo";
+"No camera permission" = "Sem permissão para câmera";
+"Please enable the camera permission in the Settings to take photos" = "Por favor, habilite a permissão da câmera nas Configurações para tirar fotos";
+"You've hit your limit" = "Você atingiu seu limite";
+
+"Old Photo Animation" = "Animação de foto antiga";
+"Restore Old Photo" = "Restaurar foto antiga";
+"Love Scenes" = "Cenas de Amor";
+"Emotion" = "Emoção";
+"Edit Old Photo" = "Editar foto antiga";
+"Choose from Photo" = "Escolha entre fotos";
+"Take a Photo" = "Tire uma foto";
+"Used Photo" = "Foto usada";
+"Results" = "Resultados";
+"Process" = "Processo";
+"Jazz Dance" = "Dança Jazz";
+"View" = "Verificar";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "Detectamos uma atividade de geração anormalmente alta. Você pode ser um bot. Tente novamente amanhã.";
+"Unlimited Photo Edits" = "Edições de fotos ilimitadas";
+"%d Video Generations" = "%d Gerações de Vídeo";
+"Faster&Higher Quality" = "Mais rápido e com mais qualidade";
+"100% Ad-Free" = "100% sem anúncios";

+ 32 - 0
TSLiveWallpaper/pt-PT.lproj/Localizable.strings

@@ -177,3 +177,35 @@
 "Pray" = "Rezar";
 "Angry" = "Nervoso";
 "Remove Watermark" = "Remover marca d'água";
+
+"No used photo" = "Nenhuma foto usada";
+"Select from Photos or take one to continue." = "Selecione uma das fotos ou tire uma para continuar.";
+"Photos are stored on your device for a safer, smoother experience." = "As fotos são armazenadas no seu dispositivo para uma experiência mais segura e tranquila.";
+"AI Expand Photo" = "AI Expandir Foto";
+"Expand" = "Expandir";
+"Photo Enhance" = "Melhorar foto";
+"Follow System" = "Siga o sistema";
+"You've hit your weekly limit" = "Você atingiu seu limite semanal";
+"You've hit your yearly limit" = "Você atingiu seu limite anual";
+"See All" = "Ver tudo";
+"No camera permission" = "Sem permissão para câmera";
+"Please enable the camera permission in the Settings to take photos" = "Por favor, habilite a permissão da câmera nas Configurações para tirar fotos";
+"You've hit your limit" = "Você atingiu seu limite";
+
+"Old Photo Animation" = "Animação de foto antiga";
+"Restore Old Photo" = "Restaurar foto antiga";
+"Love Scenes" = "Cenas de Amor";
+"Emotion" = "Emoção";
+"Edit Old Photo" = "Editar foto antiga";
+"Choose from Photo" = "Escolha entre fotos";
+"Take a Photo" = "Tire uma foto";
+"Used Photo" = "Foto usada";
+"Results" = "Resultados";
+"Process" = "Processo";
+"Jazz Dance" = "Dança Jazz";
+"View" = "Verificar";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "Detectamos uma atividade de geração anormalmente alta. Você pode ser um bot. Tente novamente amanhã.";
+"Unlimited Photo Edits" = "Edições de fotos ilimitadas";
+"%d Video Generations" = "%d Gerações de Vídeo";
+"Faster&Higher Quality" = "Mais rápido e com mais qualidade";
+"100% Ad-Free" = "100% sem anúncios";

+ 32 - 0
TSLiveWallpaper/zh-Hant.lproj/Localizable.strings

@@ -183,3 +183,35 @@
 "Pray" = "祈禱";
 "Angry" = "生氣";
 "Remove Watermark" = "刪除浮水印";
+
+"No used photo" = "沒有使用過的照片";
+"Select from Photos or take one to continue." = "從照片中選擇或拍攝一張以繼續。";
+"Photos are stored on your device for a safer, smoother experience." = "照片儲存在您的裝置上,以獲得更安全、更流暢的體驗。";
+"AI Expand Photo" = "AI 擴圖";
+"Expand" = "擴圖";
+"Photo Enhance" = "照片增強";
+"Follow System" = "跟隨系統";
+"You've hit your weekly limit" = "您已達到每週限額";
+"You've hit your yearly limit" = "您已達到年度限額";
+"See All" = "查看全部";
+"No camera permission" = "沒有相機權限";
+"Please enable the camera permission in the Settings to take photos" = "請在設定中啟用相機權限才能拍照";
+"You've hit your limit" = "您已達到限額";
+
+"Old Photo Animation" = "老照片動畫";
+"Restore Old Photo" = "恢復舊照片";
+"Love Scenes" = "愛情場景";
+"Emotion" = "情緒";
+"Edit Old Photo" = "編輯舊照片";
+"Choose from Photo" = "從照片中選擇";
+"Take a Photo" = "拍照";
+"Used Photo" = "使用過的照片";
+"Results" = "結果";
+"Process" = "過程";
+"Jazz Dance" = "爵士舞";
+"View" = "查看";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "我們偵測到異常高的生成活動。您可能是機器人。請明天再試。";
+"Unlimited Photo Edits" = "無限照片編輯";
+"%d Video Generations" = "%d 代視頻";
+"Faster&Higher Quality" = "更快、更高品質";
+"100% Ad-Free" = "100% 無廣告";