Răsfoiți Sursa

3.6.17(1)提测

100Years 3 ore în urmă
părinte
comite
08df328f92
30 a modificat fișierele cu 459 adăugiri și 112 ștergeri
  1. 3 0
      TSLiveWallpaper/AppDelegate.swift
  2. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Adult.imageset/alistHome_age_Adult@2x.png
  3. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Adult.imageset/alistHome_age_Adult@3x.png
  4. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_MiddleAge.imageset/alistHome_age_MiddleAge@2x.png
  5. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_MiddleAge.imageset/alistHome_age_MiddleAge@3x.png
  6. 7 6
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM+Dic.swift
  7. 2 2
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM.swift
  8. 1 1
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/View/TSAIUploadPhotoVideoStyleView.swift
  9. 1 1
      TSLiveWallpaper/Business/TSAIListVC/TSEffectPreviewPageVC/View/TSEffectPreviewStyleView.swift
  10. 1 0
      TSLiveWallpaper/Business/TSMineVC/TSMineVC.swift
  11. 11 5
      TSLiveWallpaper/Business/TSMineVC/View/TSMineTopView.swift
  12. 1 1
      TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseRroPageView/TSPurchaseRroPageVM.swift
  13. 1 0
      TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift
  14. 3 3
      TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseVipProAlertVC/TSPurchaseVipProAlertVC.swift
  15. 3 2
      TSLiveWallpaper/Common/Purchase/TSPurchaseBusiness.swift
  16. 128 83
      TSLiveWallpaper/Common/Purchase/TSPurchaseManager.swift
  17. 1 1
      TSLiveWallpaper/Common/TSConfig.swift
  18. 9 2
      TSLiveWallpaper/Common/TSNetWork/TSNetWork+Business.swift
  19. 1 5
      TSLiveWallpaper/Data/OperationQueue/TSBaseOperationQueue.swift
  20. 26 0
      TSLiveWallpaper/ar.lproj/Localizable.strings
  21. 26 0
      TSLiveWallpaper/de.lproj/Localizable.strings
  22. 26 0
      TSLiveWallpaper/en.lproj/Localizable.strings
  23. 26 0
      TSLiveWallpaper/es.lproj/Localizable.strings
  24. 26 0
      TSLiveWallpaper/fr.lproj/Localizable.strings
  25. 26 0
      TSLiveWallpaper/it.lproj/Localizable.strings
  26. 26 0
      TSLiveWallpaper/ja.lproj/Localizable.strings
  27. 26 0
      TSLiveWallpaper/ko.lproj/Localizable.strings
  28. 26 0
      TSLiveWallpaper/pt-BR.lproj/Localizable.strings
  29. 26 0
      TSLiveWallpaper/pt-PT.lproj/Localizable.strings
  30. 26 0
      TSLiveWallpaper/zh-Hant.lproj/Localizable.strings

+ 3 - 0
TSLiveWallpaper/AppDelegate.swift

@@ -99,6 +99,9 @@ extension AppDelegate {
         dePrint("TSRMShared.aiListDB.listModels.count=\(TSRMShared.aiListDB.listModels.count)")//提前预热数据库
         TSColorConfigShared.themeColor = .themeColor
         TSColorConfigShared.naviMianTextColor = .white//设置基类颜色
+        TSColorConfigShared.mainBg = .mainBg
+        
+        
 //        _ = TSImageDataCenter.shared
         
         handleKingfisher()

BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Adult.imageset/alistHome_age_Adult@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_Adult.imageset/alistHome_age_Adult@3x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_MiddleAge.imageset/alistHome_age_MiddleAge@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/home/age/alistHome_age_MiddleAge.imageset/alistHome_age_MiddleAge@3x.png


+ 7 - 6
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM+Dic.swift

@@ -549,10 +549,10 @@ extension TSAIListDataVM {
         ]
     }
     
-    var ptp_ageMiddleAge:[String:Any]{
+    var ptp_ageAdult:[String:Any]{
         [
-            imageName: "alistHome_age_MiddleAge",
-            imageText: "Middle Age",
+            imageName: "alistHome_age_Adult",
+            imageText: "Adult",
             prompt:"Transform the person of uploaded photo into 35 years old",
             isVip: false,
             unionType: ageUnionType,
@@ -560,10 +560,11 @@ extension TSAIListDataVM {
         ]
     }
     
-    var ptp_ageAdult:[String:Any]{
+    
+    var ptp_ageMiddleAge:[String:Any]{
         [
-            imageName: "alistHome_age_Adult",
-            imageText: "Adult",
+            imageName: "alistHome_age_MiddleAge",
+            imageText: "Middle Age",
             prompt:"Transform the person of uploaded photo into 50 years old",
             isVip: false,
             unionType: ageUnionType,

+ 2 - 2
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM.swift

@@ -185,10 +185,10 @@ class TSAIListDataVM {
                                 generateModel: TSGenerateModel(json: ptp_ageYouth)),
             TSDiscoverItemModel(style: .ptp,
                                 viewModel: TSDiscoverBaseItemVM(uiStyle: .changeAge),
-                                generateModel: TSGenerateModel(json: ptp_ageMiddleAge)),
+                                generateModel: TSGenerateModel(json: ptp_ageAdult)),
             TSDiscoverItemModel(style: .ptp,
                                 viewModel: TSDiscoverBaseItemVM(uiStyle: .changeAge),
-                                generateModel: TSGenerateModel(json: ptp_ageAdult)),
+                                generateModel: TSGenerateModel(json: ptp_ageMiddleAge)),
             TSDiscoverItemModel(style: .ptp,
                                 viewModel: TSDiscoverBaseItemVM(uiStyle: .changeAge),
                                 generateModel: TSGenerateModel(json: ptp_ageSenior)),

+ 1 - 1
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/View/TSAIUploadPhotoVideoStyleView.swift

@@ -113,7 +113,7 @@ class TSAIUploadPhotoMoreStyleViewCell: TSBaseCollectionCell {
         selectedView.layer.borderWidth = 1.0
         selectedView.layer.borderColor = UIColor.themeColor.cgColor
         
-        let imageView = UIImageView.createImageView(imageName:"check_color")
+        let imageView = UIImageView.createImageView(imageName:"check_color",autoMirrored: false)
         selectedView.addSubview(imageView)
         
         imageView.snp.makeConstraints { make in

+ 1 - 1
TSLiveWallpaper/Business/TSAIListVC/TSEffectPreviewPageVC/View/TSEffectPreviewStyleView.swift

@@ -116,7 +116,7 @@ class TSEffectPreviewStyleViewBaseCell: TSBaseCollectionCell {
         selectedView.layer.borderWidth = 1.0
         selectedView.layer.borderColor = UIColor.themeColor.cgColor
 
-        let imageView = UIImageView.createImageView(imageName:"check_color")
+        let imageView = UIImageView.createImageView(imageName:"check_color",autoMirrored: false)
         selectedView.addSubview(imageView)
 
         imageView.snp.makeConstraints { make in

+ 1 - 0
TSLiveWallpaper/Business/TSMineVC/TSMineVC.swift

@@ -27,6 +27,7 @@ class TSMineVC: TSBaseVC {
         simpleTableView.reuseClass = ["TSMineCell"]
         simpleTableView.dataArray = viewModel.dataArray
         simpleTableView.tableView.tableHeaderView = headerView
+        simpleTableView.tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: k_Height_TabBar + 10, right: 0)
         return simpleTableView
     }()
 

+ 11 - 5
TSLiveWallpaper/Business/TSMineVC/View/TSMineTopView.swift

@@ -11,10 +11,8 @@ private let titleColor:UIColor = "#FFF3DD".uiColor
 class TSMineTopVipMaxLevelView: TSBaseView {
 
     lazy var vipTitleLabel: UILabel = {
-        let titleLabel = UILabel.createLabel(text: kAppName + " PRO⁺", font: .font(name: .ZillaSlabBoldItalic,size: 32,weight: .bold), textColor: .mainText)
-        kMainAsync {
-            titleLabel.applyGradient(colors: ["#F1D3AB".uiColor,"#E4A858".uiColor])
-        }
+//        let titleLabel = UILabel.createLabel(text: kAppName + " " + getLevelName(vipType: kPurchaseBusiness.vipType), font: .font(name: .ZillaSlabBoldItalic,size: 32,weight: .bold), textColor: "#E4A858".uiColor)
+        let titleLabel = UILabel.createLabel(text: kAppName + " PRO⁺", font: .font(name: .ZillaSlabBoldItalic,size: 32,weight: .bold), textColor: "#E4A858".uiColor)
         return titleLabel
     }()
     
@@ -36,7 +34,7 @@ class TSMineTopVipMaxLevelView: TSBaseView {
         
         contentView.addSubview(vipTitleLabel)
         vipTitleLabel.snp.makeConstraints { make in
-            make.top.equalTo(28)
+            make.top.equalTo(36)
             make.leading.equalTo(20)
         }
 
@@ -56,6 +54,7 @@ class TSMineTopVipMaxLevelView: TSBaseView {
             make.edges.equalToSuperview()
         }
     }
+
 }
 
 class TSMineTopVipNoLevelView: TSBaseView {
@@ -239,6 +238,13 @@ class TSMineTopView: TSBaseView {
         subView.snp.makeConstraints { make in
             make.edges.equalToSuperview()
         }
+
+        if let maxLevelView = subView as? TSMineTopVipMaxLevelView {
+            maxLevelView.layoutCompleted {
+                maxLevelView.vipTitleLabel.applyGradient(colors: ["#F1D3AB".uiColor,"#E4A858".uiColor])
+            }
+        }
+
     }
 }
 

+ 1 - 1
TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseRroPageView/TSPurchaseRroPageVM.swift

@@ -68,7 +68,7 @@ class TSPurchaseRroPageVM {
         
         return [
             TSPurchaseRroPageModel(imageNamed: "purchase_icon_unlimited", attributedString: NSAttributedString.highlightSubstring(in: "Unlimited Photo".localized, highlightColor:highlightColor, defaultColor:defaultColor, defaultFont: defaultFont)),
-            TSPurchaseRroPageModel(imageNamed: "purchase_icon_lock", attributedString: NSAttributedString.highlightSubstring(in: String(format: "%d Yearly Video".localized,vipType.creatVideoMaxNum), substring: "\(vipType.creatVideoMaxNum)", highlightColor:highlightColor, defaultColor:defaultColor, defaultFont: defaultFont)),
+            TSPurchaseRroPageModel(imageNamed: "purchase_icon_lock", attributedString: NSAttributedString.highlightSubstring(in: String(format: "%d Videos".localized,vipType.creatVideoMaxNum), substring: "\(vipType.creatVideoMaxNum)", highlightColor:highlightColor, defaultColor:defaultColor, defaultFont: defaultFont)),
             TSPurchaseRroPageModel(imageNamed: "purchase_icon_bgTask", attributedString: NSAttributedString.highlightSubstring(in: String(format: "%d Background Task".localized,vipType.maxConcurrentOperationCount), substring: "\(vipType.maxConcurrentOperationCount)", highlightColor:highlightColor, defaultColor:defaultColor, defaultFont: defaultFont)),
             TSPurchaseRroPageModel(imageNamed: "purchase_icon_noWatermark", attributedString: NSAttributedString.highlightSubstring(in: "No Watermark".localized, highlightColor:highlightColor, defaultColor:defaultColor, defaultFont: defaultFont))
         ]

+ 1 - 0
TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift

@@ -192,6 +192,7 @@ class TSPurchaseVC: TSBaseVC {
         closePageBlock?()
         TSToastShared.hideLoading()
         self.dismiss(animated: true)
+        purchaseManager.clearPaymentProductIdentifier()
     }
     
     

+ 3 - 3
TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseVipProAlertVC/TSPurchaseVipProAlertVC.swift

@@ -70,7 +70,7 @@ class TSPurchaseVipProAlertVC: TSBaseVC {
     
     
         let maxConcurrentOperationCount = PremiumPeriod.year(.yearPro).maxConcurrentOperationCount
-        let titleLabel:UILabel = UILabel.createLabel()
+        let titleLabel:UILabel = UILabel.createLabel(textAlignment: .center)
         titleLabel.attributedText = NSAttributedString.highlightSubstring(in: String(format: "Upgrade to Pro+ to run %d tasks simultaneously".localized, maxConcurrentOperationCount),substring: "\(maxConcurrentOperationCount)",highlightColor: "#FF2B2B".uiColor,defaultColor: UIColor.themeColor,highlightFont:.font(name: .ZillaSlabBoldItalic,size: 28,weight: .bold),defaultFont: .font(name: .ZillaSlabBoldItalic,size: 20,weight: .bold))
         alertContentView.addSubview(titleLabel)
         titleLabel.snp.makeConstraints { make in
@@ -88,7 +88,7 @@ class TSPurchaseVipProAlertVC: TSBaseVC {
             make.centerX.equalToSuperview()
         }
     
-        let taskLabel1 = UILabel.createLabel(text: String(format: "%d task", 1),font: .font(size: 12),textColor: "#FFF3DD".uiColor)
+        let taskLabel1 = UILabel.createLabel(text: String(format: "%d task".localized, 1),font: .font(size: 12),textColor: "#FFF3DD".uiColor,textAlignment: .center)
         alertContentView.addSubview(taskLabel1)
         taskLabel1.snp.makeConstraints { make in
             make.top.equalTo(imageView.snp.bottom).offset(12)
@@ -97,7 +97,7 @@ class TSPurchaseVipProAlertVC: TSBaseVC {
             make.height.equalTo(12)
         }
         
-        let taskLabel2 = UILabel.createLabel(text: String(format: "%d task", maxConcurrentOperationCount),font: .font(size: 12),textColor: "#FFF3DD".uiColor)
+        let taskLabel2 = UILabel.createLabel(text: String(format: "%d task".localized, maxConcurrentOperationCount),font: .font(size: 12),textColor: "#FFF3DD".uiColor,textAlignment: .center)
         alertContentView.addSubview(taskLabel2)
         taskLabel2.snp.makeConstraints { make in
             make.top.equalTo(imageView.snp.bottom).offset(12)

+ 3 - 2
TSLiveWallpaper/Common/Purchase/TSPurchaseBusiness.swift

@@ -150,14 +150,15 @@ extension TSPurchaseBusiness{
     func launchPrchase() {
         PurchaseManager.default.password = "155c8104e2b041c0abae43ace199124c"
         PurchaseManager.default.purchaseProducts = [
-            PurchaseProduct(productId: "1001", period:.month),
-            PurchaseProduct(productId: "003", period:.lifetime),
+//            PurchaseProduct(productId: "1001", period:.month),
+//            PurchaseProduct(productId: "003", period:.lifetime),
             PurchaseProduct(productId: "1006", period:.week(.week)),
             PurchaseProduct(productId: "1007", period:.week(.weekPro)),
             PurchaseProduct(productId: "1002", period:.year(.year)),
             PurchaseProduct(productId: "1008", period:.year(.yearPro)),
         ]
         
+        PurchaseManager.default.purchaseNumProducts = []
         PurchaseManager.default.requestProducts()
     }
 }

+ 128 - 83
TSLiveWallpaper/Common/Purchase/TSPurchaseManager.swift

@@ -19,6 +19,9 @@ public class PurchaseManager: NSObject {
     
     //商品信息
     public var purchaseProducts:[PurchaseProduct] = []
+    
+    //购买次数的商品
+    public var purchaseNumProducts: [String] = []
 
     struct Config {
         static let verifyUrl = "https://buy.itunes.apple.com/verifyReceipt"
@@ -26,7 +29,7 @@ public class PurchaseManager: NSObject {
     }
 
     lazy var products: [SKProduct] = []
-
+    var paymentProductIdentifier:String?
     var onPurchaseStateChanged: PurchaseStateChangeHandler?
 
     // 会员信息
@@ -34,6 +37,15 @@ public class PurchaseManager: NSObject {
     //原始订单交易id dict
     var originalTransactionIdentifierDict:[String:String] = [:]
 
+    private lazy var onceVerifyPayResult: Void = {
+        dePrint("这段代码只会执行一次")
+#if DEBUG
+    verifyPayResult(transaction: SKPaymentTransaction(), useSandBox: true,uiBlock:nil)
+#else
+    verifyPayResult(transaction: SKPaymentTransaction(), useSandBox: false,uiBlock:nil)
+#endif
+    }()
+    
     override init() {
         super.init()
 
@@ -42,14 +54,6 @@ public class PurchaseManager: NSObject {
         if let info = UserDefaults.standard.object(forKey: kPremiumExpiredInfoKey) as? [String: Any] {
             vipInformation = info
         }
-        
-#if DEBUG
-    verifyPayResult(transaction: SKPaymentTransaction(), useSandBox: true)
-#else
-    verifyPayResult(transaction: SKPaymentTransaction(), useSandBox: false)
-#endif
-        
-      
     }
 
     public var expiredDate: Date? {
@@ -73,9 +77,6 @@ public class PurchaseManager: NSObject {
             if let expDate = expiredDate {
                 return dateformat.string(from: expDate)
             } else {
-#if DEBUG
-                return dateformat.string(from: Date())
-#endif
                 return "--"
             }
         }
@@ -105,9 +106,9 @@ public class PurchaseManager: NSObject {
 
     public var vipType: PremiumPeriod {
     #if DEBUG
-            return .none
+//            return .none
 //            return .year(.year)
-//            return .year(.yearPro)
+            return .year(.yearPro)
 //            return .week(.week)
 //            return .week(.weekPro)
     #endif
@@ -252,10 +253,10 @@ extension PurchaseManager {
     ///请求商品
     public func requestProducts() {
         if !products.isEmpty {
-            purchase(self, didChaged: .loadSuccess, object: nil)
+            purchase(self, didChaged: .loadSuccess, object: nil,transaction: nil)
         }
 
-        purchase(self, didChaged: .loading, object: nil)
+        purchase(self, didChaged: .loading, object: nil,transaction: nil)
         let productIdentifiers = Set(purchaseProducts.map({ $0.productId }))
         debugPrint("PurchaseManager requestProducts = \(productIdentifiers)")
         let request = SKProductsRequest(productIdentifiers: productIdentifiers)
@@ -263,33 +264,61 @@ extension PurchaseManager {
         request.start()
     }
 
-    public func restorePremium() {
-        purchase(self, didChaged: .restoreing, object: nil)
+    public func restorePremium(showUI:Bool = true) {
+        if showUI {
+            paymentProductIdentifier = "restoreCompletedTransactions"
+        }
+        
+        purchase(self, didChaged: .restoreing, object: nil,transaction: nil)
         SKPaymentQueue.default().restoreCompletedTransactions()
-        debugPrint("PurchaseManager restoreCompletedTransactions")
+        debugPrint("PurchaseManager restoreCompletedTransactions restorePremium")
     }
 
     /// 购买支付
     public func pay(for period: PremiumPeriod) {
+        if let product = product(for: period){
+            paymentProductIdentifier = product.productIdentifier
+        }
+        
         guard SKPaymentQueue.canMakePayments() else {
-            purchase(self, didChaged: .payFail, object: "Payment failed, please check your payment account")
+            purchase(self, didChaged: .payFail, object: "Payment failed, please check your payment account",transaction: nil)
+            debugPrint("PurchaseManager payFail pay failed, please check your payment account")
             return
         }
 
         guard SKPaymentQueue.default().transactions.count <= 0 else {
-            purchase(self, didChaged: .payFail, object: "You have outstanding orders that must be paid for before a new subscription can be placed.")
-            restorePremium()
+//            purchase(self, didChaged: .payFail, object: "You have outstanding orders that must be paid for before a new subscription can be placed.",transaction: nil)
+            debugPrint("PurchaseManager paymentQueue transactions.count SKPaymentQueue= \(SKPaymentQueue.default().transactions.count)")
+            debugPrint("PurchaseManager payFail pay period restorePremium = \(period)")
+            if isPurchaseTimes(productId:paymentProductIdentifier) == false{ //是否是购买次数的商品
+                restorePremium()
+            }
             return
         }
         if let product = product(for: period) {
-            purchase(self, didChaged: .paying, object: nil)
+            purchase(self, didChaged: .paying, object: nil,transaction: nil)
             let payment = SKPayment(product: product)
+            debugPrint("PurchaseManager payFail  pay product = \(product.localizedDescription)")
             SKPaymentQueue.default().add(payment)
-            debugPrint("PurchaseManager pay period = \(period)")
+            debugPrint("PurchaseManager payFail  pay period = \(period)")
         }else{
-            purchase(self, didChaged: .payFail, object: "Payment failed, no this item")
+            debugPrint("PurchaseManager payFail  pay 找不到要买的商品 = \(period)")
+            purchase(self, didChaged: .payFail, object: "Payment failed, no this item",transaction: nil)
         }
     }
+    
+    
+    func clearPaymentProductIdentifier(){
+        paymentProductIdentifier = nil
+    }
+    
+    //是否是购买次数的商品
+    func isPurchaseTimes(productId:String?) -> Bool{
+        if let productId = productId,purchaseNumProducts.contains(productId) == true{
+            return true
+        }
+        return false
+    }
 }
 
 // MARK: 商品回调
@@ -298,17 +327,18 @@ extension PurchaseManager: SKProductsRequestDelegate {
     public func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
         let products = response.products
         self.products = products
-        purchase(self, didChaged: .loadSuccess, object: nil)
-        
-        debugPrint("PurchaseManager productsRequest didReceive = \(products)")
-        DispatchQueue.main.async {
-            NotificationCenter.default.post(name: .kPurchasePrepared, object: nil)
-        }
+        purchase(self, didChaged: .loadSuccess, object: nil,transaction: nil)
+        NotificationCenter.default.post(name: .kPurchasePrepared, object: nil)
+        dePrint("PurchaseManager productsRequest didReceive = \(products)")
+
+        //拿到商品后,主动拉取一次苹果订单,处理会员
+        _ = onceVerifyPayResult
+        dePrint("PurchaseManager onceVerifyPayResult")
     }
 
     public func request(_ request: SKRequest, didFailWithError error: Error) {
         debugPrint("PurchaseManager productsRequest error = \(error)")
-        purchase(self, didChaged: .loadFail, object: error.localizedDescription)
+        purchase(self, didChaged: .loadFail, object: error.localizedDescription,transaction: nil)
         
     }
 }
@@ -331,7 +361,7 @@ extension PurchaseManager: SKPaymentTransactionObserver {
             switch transaction.transactionState {
             case .purchasing:
                 // Transaction is being added to the server queue.
-                purchase(self, didChaged: .paying, object: nil)
+                purchase(self, didChaged: .paying, object: nil,transaction: transaction)
 
             case .purchased:
                 SKPaymentQueue.default().finishTransaction(transaction)
@@ -342,19 +372,19 @@ extension PurchaseManager: SKPaymentTransactionObserver {
                 
                 // Transaction is in queue, user has been charged.  Client should complete the transaction.
                 #if DEBUG
-                    verifyPayResult(transaction: transaction, useSandBox: true)
+                    verifyPayResult(transaction: transaction, useSandBox: true,uiBlock: purchase(_:didChaged:object:transaction:))
                 #else
-                    verifyPayResult(transaction: transaction, useSandBox: false)
+                    verifyPayResult(transaction: transaction, useSandBox: false,uiBlock: purchase(_:didChaged:object:transaction:))
                 #endif
                 
                 
             case .failed:
                 
                 SKPaymentQueue.default().finishTransaction(transaction)
-                // Transaction was cancelled or failed before being added to the server queue.
-                
-                
-                if let error = transaction.error as NSError? {
+
+                //对于不包含次数购买的商品,(也就是订阅续费类),做特殊报错处理
+                if isPurchaseTimes(productId:transaction.payment.productIdentifier) == false,
+                    let error = transaction.error as NSError? {
                     // 1. 检查内层错误
                     if let underlyingError = error.userInfo[NSUnderlyingErrorKey] as? NSError {
                         if underlyingError.domain == "ASDServerErrorDomain" && underlyingError.code == 3532 {
@@ -374,13 +404,17 @@ extension PurchaseManager: SKPaymentTransactionObserver {
                     }
                 }
                 
-                var message = "Payment Failed".localized
+                var message = "Payment Failed"
                 if let error = transaction.error as? SKError{
                     if error.code == SKError.paymentCancelled {
-                        message = "The subscription was canceled".localized
+                        message = "The subscription was canceled"
+                    }else{
+                        message = error.localizedDescription
                     }
+                    //error.errorCode == 3532 //用户已订阅,禁止重复购买
                 }
-                purchase(self, didChaged: .payFail, object: message)
+                dePrint("PurchaseManager payFail failed  message = \(message)")
+                purchase(self, didChaged: .payFail, object: message,transaction: transaction)
 
             case .restored:
                 SKPaymentQueue.default().finishTransaction(transaction)
@@ -393,12 +427,12 @@ extension PurchaseManager: SKPaymentTransactionObserver {
                 if let original = transaction.original,
                    original.transactionState == .purchased {
                     #if DEBUG
-                        verifyPayResult(transaction: transaction, useSandBox: true)
+                        verifyPayResult(transaction: transaction, useSandBox: true,uiBlock: purchase(_:didChaged:object:transaction:))
                     #else
-                        verifyPayResult(transaction: transaction, useSandBox: false)
+                        verifyPayResult(transaction: transaction, useSandBox: false,uiBlock: purchase(_:didChaged:object:transaction:))
                     #endif
                 } else {
-                    purchase(self, didChaged: .restoreFail, object: "Failed to restore subscribe, please try again")
+                    purchase(self, didChaged: .restoreFail, object: "Failed to restore subscribe, please try again",transaction: transaction)
                 }
                 
             case .deferred: // The transaction is in the queue, but its final status is pending external action.
@@ -410,14 +444,14 @@ extension PurchaseManager: SKPaymentTransactionObserver {
     }
 
     public func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) {
-        purchase(self, didChaged: .restoreFail, object: nil)
+        purchase(self, didChaged: .restoreFail, object: nil,transaction: nil)
     }
 
     public func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
         if let trans = queue.transactions.first(where: { $0.transactionState == .purchased }) {
-            verifyPayResult(transaction: trans, useSandBox: false)
+            verifyPayResult(transaction: trans, useSandBox: false,uiBlock: purchase(_:didChaged:object:transaction:))
         } else if queue.transactions.isEmpty {
-            purchase(self, didChaged: .restoreFail, object: "You don't have an active subscription")
+            purchase(self, didChaged: .restoreFail, object: "You don't have an active subscription",transaction: nil)
         }
     }
     
@@ -434,13 +468,13 @@ extension PurchaseManager: SKPaymentTransactionObserver {
 }
 
 extension PurchaseManager {
-    func verifyPayResult(transaction: SKPaymentTransaction, useSandBox: Bool) {
-        purchase(self, didChaged: .verifying, object: nil)
+    func verifyPayResult(transaction: SKPaymentTransaction, useSandBox: Bool, uiBlock:((PurchaseManager,PremiumRequestState,Any?,SKPaymentTransaction?)->Void)?) {
+        uiBlock?(self,.verifying,nil,transaction)
 
         guard let url = Bundle.main.appStoreReceiptURL,
               let receiptData = try? Data(contentsOf: url) else {
-//            purchase(self, didChaged: .verifyFail, object: "凭证文件为空")
-            purchase(self, didChaged: .verifyFail, object: "")
+            debugPrint("凭证文件为空")
+            uiBlock?(self,.verifyFail,"凭证文件为空",transaction)
             return
         }
 
@@ -449,8 +483,8 @@ extension PurchaseManager {
             "password": password,
         ]
         guard let requestData = try? JSONSerialization.data(withJSONObject: requestContents) else {
-//            purchase(self, didChaged: .verifyFail, object: "凭证文件为空")
-            purchase(self, didChaged: .verifyFail, object: "")
+            debugPrint("凭证文件为空")
+            uiBlock?(self,.verifyFail,"凭证文件为空",transaction)
             return
         }
 
@@ -462,18 +496,18 @@ extension PurchaseManager {
                 debugPrint("PurchaseManager verifyPayResult = \(jsonResponse)")
                 let status = jsonResponse["status"]
                 if let status = status as? String, status == "21007" {
-                    self.verifyPayResult(transaction: transaction, useSandBox: true)
+                    self.verifyPayResult(transaction: transaction, useSandBox: true,uiBlock: uiBlock)
                 } else if let status = status as? Int, status == 21007 {
-                    self.verifyPayResult(transaction: transaction, useSandBox: true)
+                    self.verifyPayResult(transaction: transaction, useSandBox: true,uiBlock: uiBlock)
                 } else if let status = status as? String, status == "0" {
-                    self.handlerPayResult(transaction: transaction, resp: jsonResponse)
+                    self.handlerPayResult(transaction: transaction, resp: jsonResponse,uiBlock: uiBlock)
                 } else if let status = status as? Int, status == 0 {
-                    self.handlerPayResult(transaction: transaction, resp: jsonResponse)
+                    self.handlerPayResult(transaction: transaction, resp: jsonResponse,uiBlock: uiBlock)
                 } else {
-                    self.purchase(self, didChaged: .verifyFail, object: "验证结果状态码错误:\(status.debugDescription)")
+                    uiBlock?(self,.verifyFail,"验证结果状态码错误:\(status.debugDescription)",transaction)
                 }
             } else {
-                self.purchase(self, didChaged: .verifyFail, object: "验证结果为空")
+                uiBlock?(self,.verifyFail,"验证结果为空",transaction)
                 debugPrint("PurchaseManager 验证结果为空")
             }
         }
@@ -490,26 +524,26 @@ extension PurchaseManager {
           */
     }
 
-    func handlerPayResult(transaction: SKPaymentTransaction, resp: [String: Any]) {
+    func handlerPayResult(transaction: SKPaymentTransaction, resp: [String: Any], uiBlock:((PurchaseManager,PremiumRequestState,Any?,SKPaymentTransaction?)->Void)?) {
         var isLifetime = false
-        // 终生会员
-        if let receipt = resp["receipt"] as? [String: Any],
-           let in_app = receipt["in_app"] as? [[String: Any]] {
-            if let lifetimeProductId = purchaseProducts.first(where: { $0.period == .lifetime })?.productId,
-               let _ = in_app.filter({ ($0["product_id"] as? String) == lifetimeProductId }).first(where: { item in
-                   if let purchase_date = item["purchase_date"] as? String,
-                      !purchase_date.isEmpty {
-                       return true
-                   } else if let purchase_date_ms = item["purchase_date_ms"] as? String,
-                             !purchase_date_ms.isEmpty {
-                       return true
-                   }
-                   return false
-               }) {
-                updateExpireTime(lifetimeExpireTime, for: lifetimeProductId)
-                isLifetime = true
-            }
-        }
+        // 终生会员//这个项目中没有终生会员
+//        if let receipt = resp["receipt"] as? [String: Any],
+//           let in_app = receipt["in_app"] as? [[String: Any]] {
+//            if let lifetimeProductId = purchaseProducts.first(where: { $0.period == .lifetime })?.productId,
+//               let _ = in_app.filter({ ($0["product_id"] as? String) == lifetimeProductId }).first(where: { item in
+//                   if let purchase_date = item["purchase_date"] as? String,
+//                      !purchase_date.isEmpty {
+//                       return true
+//                   } else if let purchase_date_ms = item["purchase_date_ms"] as? String,
+//                             !purchase_date_ms.isEmpty {
+//                       return true
+//                   }
+//                   return false
+//               }) {
+//                updateExpireTime(lifetimeExpireTime, for: lifetimeProductId)
+//                isLifetime = true
+//            }
+//        }
 
         if !isLifetime {
             let info = resp["latest_receipt_info"] as? [[String: Any]]
@@ -522,9 +556,9 @@ extension PurchaseManager {
 
         DispatchQueue.main.async {
             if transaction.transactionState == .restored {
-                self.purchase(self, didChaged: .restoreSuccess, object: nil)
+                uiBlock?(self, .restoreSuccess, nil, transaction)
             } else {
-                self.purchase(self, didChaged: .paySuccess, object: nil)
+                uiBlock?(self, .paySuccess, nil, transaction)
             }
         }
     }
@@ -545,8 +579,19 @@ public extension PurchaseManager {
         return isVip
     }
     
-    func purchase(_ manager: PurchaseManager, didChaged state: PremiumRequestState, object: Any?){
-        onPurchaseStateChanged?(manager,state,object)
+    func purchase(_ manager: PurchaseManager, didChaged state: PremiumRequestState, object: Any?,transaction:SKPaymentTransaction?) {
+        dePrint("transaction.payment.productIdentifier=\(transaction?.payment.productIdentifier),paymentProductIdentifier=\(paymentProductIdentifier)")
+        
+        if let paymentProductIdentifier = paymentProductIdentifier {
+            if transaction == nil{
+                onPurchaseStateChanged?(manager, state, object)
+            }else if let productIdentifier = transaction?.payment.productIdentifier, productIdentifier == paymentProductIdentifier {
+                onPurchaseStateChanged?(manager, state, object)
+            }else if transaction?.transactionState == .restored,paymentProductIdentifier == "restoreCompletedTransactions"{
+                onPurchaseStateChanged?(manager, state, object)
+            }
+        }
+
     }
 }
 

+ 1 - 1
TSLiveWallpaper/Common/TSConfig.swift

@@ -7,7 +7,7 @@
 
 extension UIColor {
     /// 背景色
-    static let mainBg = "#010101".uiColor
+    static let mainBg = "#121212".uiColor
     
     /// 主色调
     static let themeColor = "#E4A858".uiColor

+ 9 - 2
TSLiveWallpaper/Common/TSNetWork/TSNetWork+Business.swift

@@ -256,9 +256,16 @@ extension TSNetworkManager {
             completion(.failure(NSError(domain: "", code: TSNetWorkCode.generateTooMuch.rawValue)))
             return nil
         }
-        
+
         let urlString = urlType.getUrlString()
-        return request(method: .post, urlString: urlString, parameters:parameters) { result in
+        var finalParams = parameters
+        
+        if var params = finalParams,params["appId"] == nil {
+            params["appId"] = appBundleID()
+            finalParams = params
+        }
+
+        return request(method: .post, urlString: urlString, parameters:finalParams) { result in
             completion(result)
         }
     }

+ 1 - 5
TSLiveWallpaper/Data/OperationQueue/TSBaseOperationQueue.swift

@@ -28,11 +28,7 @@ class TSBaseOperationQueue {
     }
 
     init(maxConcurrentOperationCount: Int = 1) {
-        var maxCount = maxConcurrentOperationCount
-//#if DEBUG
-//        maxCount = 6
-//#endif
-        queue.maxConcurrentOperationCount = maxCount
+        queue.maxConcurrentOperationCount = maxConcurrentOperationCount
         dePrint("TSBaseOperationQueue operationCountObservation")
         // 监听 operationCount 的变化
            operationCountObservation = queue.observe(\.operationCount, options: [.new]) { [weak self] (queue, change) in

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

@@ -231,3 +231,29 @@
 "Plush Toy" = "لعبة قطيفة";
 "Music Box" = "صندوق الموسيقى";
 "Photo Filter" = "فلتر الصور";
+
+"Age Transformation" = "تحول العمر";
+"Baby" = "طفل";
+"Child" = "طفل";
+"Teen" = "مراهق";
+"Youth" = "شباب";
+"Adult" = "بالغ";
+"Middle Age" = "منتصف العمر";
+"Senior" = "كبير";
+"Customize" = "تخصيص";
+"Please enter the age you want to change..." = "الرجاء إدخال العمر الذي تريد تغييره...";
+"Magic Text" = "نص سحري";
+"Describe what you want to change..." = "صف ما تريد تغييره...";
+"Me in a Famous Painting" = "أنا في لوحة شهيرة";
+"Unlimited Photo" = "صور غير محدودة";
+"%d Videos" = "%d فيديو";
+"%d Background Task" = "%d مهمة خلفية";
+"No Watermark" = "لا يوجد علامة مائية";
+"Weekly Pro" = "برو الاسبوعي";
+"Weekly Pro+" = "برو+ الأسبوعي";
+"Yearly Pro" = "برو السنوي";
+"Yearly Pro+" = "برو+ السنوي";
+"Upgrade to Yearly" = "الترقية إلى سنوية";
+"Upgrade to Pro+" = "الترقية إلى Pro+";
+"Upgrade to Pro+ to run %d tasks simultaneously" = "الترقية إلى Pro+ لتشغيل %d مهمة في وقت واحد";
+"%d task" = "%d مهمة";

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

@@ -222,3 +222,29 @@
 "Plush Toy" = "Plüschtier";
 "Music Box" = "Spieluhr";
 "Photo Filter" = "Foto filter";
+
+"Age Transformation" = "Alterstransformation";
+"Baby" = "Baby";
+"Child" = "Kind";
+"Teen" = "Teenager";
+"Youth" = "Jugend";
+"Adult" = "Erwachsene";
+"Middle Age" = "Mittelalter";
+"Senior" = "Senior";
+"Customize" = "Anpassen";
+"Please enter the age you want to change..." = "Bitte geben Sie das Alter ein, das Sie ändern möchten...";
+"Magic Text" = "Magischer Text";
+"Describe what you want to change..." = "Beschreiben Sie, was Sie ändern möchten ...";
+"Me in a Famous Painting" = "Ich in einem berühmten Gemälde";
+"Unlimited Photo" = "Unbegrenztes Foto";
+"%d Videos" = "%d Videos";
+"%d Background Task" = "%d Hintergrundaufgabe";
+"No Watermark" = "Kein Wasserzeichen";
+"Weekly Pro" = "Weekly Pro";
+"Weekly Pro+" = "Wöchentliches Pro+";
+"Yearly Pro" = "Jährlich Pro";
+"Yearly Pro+" = "Jährlich Pro+";
+"Upgrade to Yearly" = "Upgrade auf Jährlich";
+"Upgrade to Pro+" = "Upgrade auf Pro+";
+"Upgrade to Pro+ to run %d tasks simultaneously" = "Aktualisieren Sie auf Pro+, um %d Aufgaben gleichzeitig auszuführen";
+"%d task" = "%d Aufgabe";

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

@@ -231,3 +231,29 @@
 "Plush Toy" = "Plush Toy";
 "Music Box" = "Music Box";
 "Photo Filter" = "Photo Filter";
+
+"Age Transformation" = "Age Transformation";
+"Baby" = "Baby";
+"Child" = "Child";
+"Teen" = "Teen";
+"Youth" = "Youth";
+"Adult" = "Adult";
+"Middle Age" = "Middle Age";
+"Senior" = "Senior";
+"Customize" = "Customize";
+"Please enter the age you want to change..." = "Please enter the age you want to change...";
+"Magic Text" = "Magic Text";
+"Describe what you want to change..." = "Describe what you want to change...";
+"Me in a Famous Painting" = "Me in a Famous Painting";
+"Unlimited Photo" = "Unlimited Photo";
+"%d Videos" = "%d Videos";
+"%d Background Task" = "%d Background Task";
+"No Watermark" = "No Watermark";
+"Weekly Pro" = "Weekly Pro";
+"Weekly Pro+" = "Weekly Pro+";
+"Yearly Pro" = "Yearly Pro";
+"Yearly Pro+" = "Yearly Pro+";
+"Upgrade to Yearly" = "Upgrade to Yearly";
+"Upgrade to Pro+" = "Upgrade to Pro+";
+"Upgrade to Pro+ to run %d tasks simultaneously" = "Upgrade to Pro+ to run %d tasks simultaneously";
+"%d task" = "%d task";

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

@@ -235,3 +235,29 @@
 "Plush Toy" = "Juguete de peluche";
 "Music Box" = "Caja de música";
 "Photo Filter" = "Filtro de fotos";
+
+"Age Transformation" = "Transformación de la edad";
+"Baby" = "Bebé";
+"Child" = "Niño";
+"Teen" = "Adolescente";
+"Youth" = "Juventud";
+"Adult" = "Adulto";
+"Middle Age" = "Edad Media";
+"Senior" = "Sénior";
+"Customize" = "Personalizar";
+"Please enter the age you want to change..." = "Por favor ingrese la edad que desea cambiar...";
+"Magic Text" = "Texto mágico";
+"Describe what you want to change..." = "Describe lo que quieres cambiar...";
+"Me in a Famous Painting" = "Yo en un cuadro famoso";
+"Unlimited Photo" = "Foto ilimitada";
+"%d Videos" = "%d vídeos";
+"%d Background Task" = "%d Tarea en segundo plano";
+"No Watermark" = "Sin marca de agua";
+"Weekly Pro" = "Pro semanal";
+"Weekly Pro+" = "Pro+ semanal";
+"Yearly Pro" = "Pro anual";
+"Yearly Pro+" = "Pro+ anual";
+"Upgrade to Yearly" = "Actualizar a anual";
+"Upgrade to Pro+" = "Actualizar a Pro+";
+"Upgrade to Pro+ to run %d tasks simultaneously" = "Actualice a Pro+ para ejecutar %d tareas simultáneamente";
+"%d task" = "%d tarea";

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

@@ -223,3 +223,29 @@
 "Plush Toy" = "Jouet en peluche";
 "Music Box" = "Boîte à musique";
 "Photo Filter" = "Filtre photo";
+
+"Age Transformation" = "Transformation de l'âge";
+"Baby" = "Bébé";
+"Child" = "Enfant";
+"Teen" = "Adolescent";
+"Youth" = "Jeunesse";
+"Adult" = "Adulte";
+"Middle Age" = "Moyen Âge";
+"Senior" = "Senior";
+"Customize" = "Personnaliser";
+"Please enter the age you want to change..." = "Veuillez saisir l'âge que vous souhaitez modifier...";
+"Magic Text" = "Texte magique";
+"Describe what you want to change..." = "Décrivez ce que vous souhaitez changer...";
+"Me in a Famous Painting" = "Moi dans un tableau célèbre";
+"Unlimited Photo" = "Photo illimitée";
+"%d Videos" = "%d vidéos";
+"%d Background Task" = "%d tâche en arrière-plan";
+"No Watermark" = "Pas de filigrane";
+"Weekly Pro" = "Pro hebdomadaire";
+"Weekly Pro+" = "Pro+ hebdomadaire";
+"Yearly Pro" = "Pro annuel";
+"Yearly Pro+" = "Pro+ annuel";
+"Upgrade to Yearly" = "Mise à niveau vers un abonnement annuel";
+"Upgrade to Pro+" = "Passez à Pro+";
+"Upgrade to Pro+ to run %d tasks simultaneously" = "Passez à Pro+ pour exécuter %d tâches simultanément";
+"%d task" = "%d tâche";

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

@@ -232,3 +232,29 @@
 "Plush Toy" = "Peluche";
 "Music Box" = "Carillon";
 "Photo Filter" = "Filtro fotografico";
+
+"Age Transformation" = "Trasformazione dell'età";
+"Baby" = "Bambino";
+"Child" = "Bambino";
+"Teen" = "Adolescente";
+"Youth" = "Gioventù";
+"Adult" = "Adulto";
+"Middle Age" = "Mezza età";
+"Senior" = "Senior";
+"Customize" = "Personalizza";
+"Please enter the age you want to change..." = "Inserisci l'età che vuoi modificare...";
+"Magic Text" = "Testo magico";
+"Describe what you want to change..." = "Descrivi cosa vuoi cambiare...";
+"Me in a Famous Painting" = "Io in un dipinto famoso";
+"Unlimited Photo" = "Foto illimitate";
+"%d Videos" = "%d video";
+"%d Background Task" = "%d Attività in background";
+"No Watermark" = "Nessuna filigrana";
+"Weekly Pro" = "Settimanale Pro";
+"Weekly Pro+" = "Settimanale Pro+";
+"Yearly Pro" = "Annuale Pro";
+"Yearly Pro+" = "Annuale Pro+";
+"Upgrade to Yearly" = "Aggiorna ad annuale";
+"Upgrade to Pro+" = "Passa a Pro+";
+"Upgrade to Pro+ to run %d tasks simultaneously" = "Passa a Pro+ per eseguire %d attività contemporaneamente";
+"%d task" = "%d attività";

+ 26 - 0
TSLiveWallpaper/ja.lproj/Localizable.strings

@@ -229,3 +229,29 @@
 "Plush Toy" = "ぬいぐるみ";
 "Music Box" = "オルゴール";
 "Photo Filter" = "写真フィルター";
+
+"Age Transformation" = "年齢変更";
+"Baby" = "乳児";
+"Child" = "幼児";
+"Teen" = "少年";
+"Youth" = "青年";
+"Adult" = "成人";
+"Middle Age" = "中年";
+"Senior" = "高齢者";
+"Customize" = "カスタム";
+"Please enter the age you want to change..." = "変更したい年齢を入力してください...";
+"Magic Text" = "魔法の文字";
+"Describe what you want to change..." = "変更したい内容を記述してください...";
+"Me in a Famous Painting" = "名画の中の私";
+"Unlimited Photo" = "無限に写真を生成";
+"%d Videos" = "%d 本のビデオ";
+"%d Background Task" = "%d 個のバックグラウンドタスク";
+"No Watermark" = "ウォーターマークなし";
+"Weekly Pro" = "週会員";
+"Weekly Pro+" = "週プレミアム会員";
+"Yearly Pro" = "年会員";
+"Yearly Pro+" = "年プレミアム会員";
+"Upgrade to Yearly" = "年会員にアップグレード";
+"Upgrade to Pro+" = "プレミアム会員にアップグレード";
+"Upgrade to Pro+ to run %d tasks simultaneously" = "プレミアム会員にアップグレードして、バックグラウンドで %d 個のタスクを同時に生成";
+"%d task" = "%d 個のタスク";

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

@@ -229,3 +229,29 @@
 "Plush Toy" = "봉제 장난감";
 "Music Box" = "오르골";
 "Photo Filter" = "사진 필터";
+
+"Age Transformation" = "연령 변환";
+"Baby" = "아기";
+"Child" = "어린이";
+"Teen" = "청소년";
+"Youth" = "청년";
+"Adult" = "성인";
+"Middle Age" = "중년";
+"Senior" = "노인";
+"Customize" = "맞춤 설정";
+"Please enter the age you want to change..." = "변환하려는 연령을 입력해 주세요...";
+"Magic Text" = "매직 텍스트";
+"Describe what you want to change..." = "변경하고 싶은 내용을 설명해 주세요...";
+"Me in a Famous Painting" = "유명한 그림 속의 나";
+"Unlimited Photo" = "무제한 사진";
+"%d Videos" = "%d개의 비디오";
+"%d Background Task" = "%d 배경 작업";
+"No Watermark" = "워터마크 없음";
+"Weekly Pro" = "주간 프로";
+"Weekly Pro+" = "주간 프로+";
+"Yearly Pro" = "연간 프로";
+"Yearly Pro+" = "연간 프로+";
+"Upgrade to Yearly" = "연간으로 업그레이드";
+"Upgrade to Pro+" = "프로+로 업그레이드";
+"Upgrade to Pro+ to run %d tasks simultaneously" = "프로+로 업그레이드하여 %d 작업을 동시에 실행";
+"%d task" = "%d 작업";

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

@@ -223,3 +223,29 @@
 "Plush Toy" = "Brinquedo de pelúcia";
 "Music Box" = "Caixa de música";
 "Photo Filter" = "Filtro de fotos";
+
+"Age Transformation" = "Transformação da Idade";
+"Baby" = "Bebê";
+"Child" = "Criança";
+"Teen" = "Adolescente";
+"Youth" = "Juventude";
+"Adult" = "Adulto";
+"Middle Age" = "Idade Média";
+"Senior" = "Sênior";
+"Customize" = "Personalizar";
+"Please enter the age you want to change..." = "Por favor, insira a idade que deseja alterar...";
+"Magic Text" = "Texto Mágico";
+"Describe what you want to change..." = "Descreva o que você quer mudar...";
+"Me in a Famous Painting" = "Eu em uma pintura famosa";
+"Unlimited Photo" = "Foto ilimitada";
+"%d Videos" = "%d Vídeos";
+"%d Background Task" = "%d Tarefa em segundo plano";
+"No Watermark" = "Sem marca d'água";
+"Weekly Pro" = "Pro Semanal";
+"Weekly Pro+" = "Pro+ semanal";
+"Yearly Pro" = "Anual Pro";
+"Yearly Pro+" = "Pro+ anual";
+"Upgrade to Yearly" = "Atualizar para anual";
+"Upgrade to Pro+" = "Atualize para Pro+";
+"Upgrade to Pro+ to run %d tasks simultaneously" = "Atualize para Pro+ para executar %d tarefas simultaneamente";
+"%d task" = "tarefa %d";

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

@@ -223,3 +223,29 @@
 "Plush Toy" = "Brinquedo de pelúcia";
 "Music Box" = "Caixa de música";
 "Photo Filter" = "Filtro de fotos";
+
+"Age Transformation" = "Transformação da Idade";
+"Baby" = "Bebê";
+"Child" = "Criança";
+"Teen" = "Adolescente";
+"Youth" = "Juventude";
+"Adult" = "Adulto";
+"Middle Age" = "Idade Média";
+"Senior" = "Sênior";
+"Customize" = "Personalizar";
+"Please enter the age you want to change..." = "Por favor, insira a idade que deseja alterar...";
+"Magic Text" = "Texto Mágico";
+"Describe what you want to change..." = "Descreva o que você quer mudar...";
+"Me in a Famous Painting" = "Eu em uma pintura famosa";
+"Unlimited Photo" = "Foto ilimitada";
+"%d Videos" = "%d Vídeos";
+"%d Background Task" = "%d Tarefa em segundo plano";
+"No Watermark" = "Sem marca d'água";
+"Weekly Pro" = "Pro Semanal";
+"Weekly Pro+" = "Pro+ semanal";
+"Yearly Pro" = "Anual Pro";
+"Yearly Pro+" = "Pro+ anual";
+"Upgrade to Yearly" = "Atualizar para anual";
+"Upgrade to Pro+" = "Atualize para Pro+";
+"Upgrade to Pro+ to run %d tasks simultaneously" = "Atualize para Pro+ para executar %d tarefas simultaneamente";
+"%d task" = "tarefa %d";

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

@@ -229,3 +229,29 @@
 "Plush Toy" = "絨毛玩具";
 "Music Box" = "音樂盒";
 "Photo Filter" = "照片濾鏡";
+
+"Age Transformation" = "年齡變化";
+"Baby" = "嬰兒";
+"Child" = "孩童";
+"Teen" = "少年";
+"Youth" = "青年";
+"Adult" = "成年";
+"Middle Age" = "中年";
+"Senior" = "老年";
+"Customize" = "自定義";
+"Please enter the age you want to change..." = "請輸入您想要更改的年齡...";
+"Magic Text" = "魔法文字";
+"Describe what you want to change..." = "描述你想改變的內容...";
+"Me in a Famous Painting" = "名畫中的我";
+"Unlimited Photo" = "無限生成照片";
+"%d Videos" = "%d 個視頻";
+"%d Background Task" = "%d 個後臺任務";
+"No Watermark" = "無浮水印";
+"Weekly Pro" = "周會員";
+"Weekly Pro+" = "周高級會員";
+"Yearly Pro" = "年會員";
+"Yearly Pro+" = "年高級會員";
+"Upgrade to Yearly" = "陞級到年度會員";
+"Upgrade to Pro+" = "陞級成為高級會員";
+"Upgrade to Pro+ to run %d tasks simultaneously" = "陞級到高級會員以同時在後臺生成 %d 個任務";
+"%d task" = "%d 個任務";