Browse Source

fix:3.6.6(6)提审

100Years 2 months ago
parent
commit
53e8c99417
24 changed files with 120 additions and 69 deletions
  1. 2 2
      TSLiveWallpaper.xcodeproj/project.pbxproj
  2. 12 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVideoPlayerVC/TSAIListVideoPlayerVC.swift
  3. 2 1
      TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC+Video.swift
  4. 3 1
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+Image.swift
  5. 2 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+Video.swift
  6. 2 1
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+View.swift
  7. 1 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC.swift
  8. 1 1
      TSLiveWallpaper/Business/TSBusinessWebVC/TSBusinessWebVC.swift
  9. 40 6
      TSLiveWallpaper/Business/TSMineVC/TSMineVM.swift
  10. 1 3
      TSLiveWallpaper/Business/TSMineVC/View/TSMineTopView.swift
  11. 1 1
      TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift
  12. 8 0
      TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSViewTool/PhotoManager.swift
  13. 3 3
      TSLiveWallpaper/Common/Purchase/TSPurchaseManager.swift
  14. 1 3
      TSLiveWallpaper/Data/Model/TSActionInfoModel.swift
  15. 1 2
      TSLiveWallpaper/Data/OperationQueue/TSGenerateBaseOperation/TSGenerateBaseOperation.swift
  16. 29 36
      TSLiveWallpaper/Data/OperationQueue/TSGenerateBaseOperation/TSGenerateBasePhotoOperation.swift
  17. 0 4
      TSLiveWallpaper/Data/TSDBManager/TSDBActionInfoModel.swift
  18. 1 1
      TSLiveWallpaper/Data/TSDBManager/TSDBManager.swift
  19. 2 1
      TSLiveWallpaper/ar.lproj/Localizable.strings
  20. 1 0
      TSLiveWallpaper/en.lproj/Localizable.strings
  21. 2 1
      TSLiveWallpaper/es.lproj/Localizable.strings
  22. 2 1
      TSLiveWallpaper/ja.lproj/Localizable.strings
  23. 2 1
      TSLiveWallpaper/ko.lproj/Localizable.strings
  24. 1 0
      TSLiveWallpaper/zh-Hant.lproj/Localizable.strings

+ 2 - 2
TSLiveWallpaper.xcodeproj/project.pbxproj

@@ -1434,7 +1434,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 3;
+				CURRENT_PROJECT_VERSION = 6;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
@@ -1474,7 +1474,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 3;
+				CURRENT_PROJECT_VERSION = 6;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;

+ 12 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIListVideoPlayerVC/TSAIListVideoPlayerVC.swift

@@ -84,6 +84,18 @@ class TSAIListVideoPlayerVC: UIViewController {
         super.viewDidLoad()
         setupUI()
         setupPlayer()
+        
+        
+        dealThings()
+    }
+    
+    func dealThings() {
+        // 监听应用生命周期事件
+        NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: .main) { _ in
+            self.playPause()
+            self.setControlsView(isHidden: false)
+        }
+        NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, queue: .main) { _ in }
     }
     
     override func viewDidLayoutSubviews() {

+ 2 - 1
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC+Video.swift

@@ -14,8 +14,9 @@ extension TSAIPhotoDetailsVC {
     }
     
     func setVideoURL(){
-        self.panComparisonView.isHidden = true
         guard let infoModel = infoModel else { return }
+        self.panComparisonView.isHidden = true
+        self.videoPlayerVC.view.removeFromSuperview()
         self.videoPlayerVC = TSAIListVideoPlayerVC(videoURL: infoModel.response.videoURL)
         self.addChild(self.videoPlayerVC)
         self.videoPlayerVC.view.frame = self.contentView.bounds

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

@@ -8,11 +8,13 @@
 extension TSAIUploadPhotoVC {
     
     func setUpImageUploadView(){
+        
+        uploadImageViewMaxHeight = k_ScreenHeight-76-k_Height_safeAreaInsetsBottom()-k_Nav_Height
         //添加上传一大块
         cusStackView.addSubviewToStack(uploadImageBgView)
         uploadImageBgView.snp.makeConstraints { make in
             make.width.equalTo(k_ScreenWidth)
-            make.height.equalTo(k_ScreenHeight-76-k_Height_safeAreaInsetsBottom()-k_Nav_Height)
+            make.height.equalTo(uploadImageViewMaxHeight)
         }
         
     }

+ 2 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC+Video.swift

@@ -20,6 +20,8 @@ extension TSAIUploadPhotoVC {
 
 extension TSAIUploadPhotoVC {
     func setUpVideoUploadView(){
+        uploadImageViewMaxHeight = k_ScreenHeight-212-k_Height_safeAreaInsetsBottom()-k_Nav_Height
+        
         cusStackView.addSubviewToStack(uploadImageBgView)
         uploadImageBgView.snp.makeConstraints { make in
             make.width.equalTo(k_ScreenWidth)

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

@@ -43,8 +43,9 @@ extension TSAIUploadPhotoVC {
 
     func updateUploadImageViewFrame() {
         if let image = upLoadImage {
+            let height = min(uploadImageViewMaxHeight, kGetScaleHeight(originalSize: image.size, width: k_ScreenWidth))
             uploadImageView.snp.updateConstraints { make in
-                make.height.equalTo(kGetScaleHeight(originalSize: image.size, width: k_ScreenWidth))
+                make.height.equalTo(height)
             }
         }else{
             uploadImageView.snp.updateConstraints { make in

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

@@ -39,6 +39,7 @@ class TSAIUploadPhotoVC: TSBaseVC {
     lazy var deleteBtn: UIButton = creatDeleteBtn()
     
     //###### 数据区 ######
+    var uploadImageViewMaxHeight:CGFloat = k_ScreenHeight-76-k_Height_safeAreaInsetsBottom()-k_Nav_Height
     let lineSpacing = 6.0
     lazy var photoPickerManager: TSPhotoPickerManager = TSPhotoPickerManager(viewController: self)
     var hintBaseVC:TSAIListHintBaseVC = TSAIListHintBaseVC(config: .colorizeConfig)

+ 1 - 1
TSLiveWallpaper/Business/TSBusinessWebVC/TSBusinessWebVC.swift

@@ -10,7 +10,7 @@ import WebKit
 class TSBusinessWebVC: TSBaseVC , WKNavigationDelegate {
     
     enum UrlType:String {
-        case privacy = "https://doc-hosting.flycricket.io/livelive-privacy-policy/10cde0be-3dae-4f7a-9e60-c5f92382ff21/privacy"
+        case privacy = "http://100yearslater.com/Privacy.html"
         case terms = "https://doc-hosting.flycricket.io/livelive-terms-of-use/7ec53e98-eb9d-49e0-b01d-bf315ba4384b/terms"
 
         func getTitle() -> String {

+ 40 - 6
TSLiveWallpaper/Business/TSMineVC/TSMineVM.swift

@@ -4,7 +4,7 @@
 //
 //  Created by 100Years on 2025/6/16.
 //
-
+import StoreKit
 class TSMineVM {
     
     var target:UIViewController
@@ -74,11 +74,13 @@ class TSMineVM {
                 tapBlock: { [weak self] _, _, _ in
 
                     guard let self = self else { return }
-                    let appStoreLink = "itms-apps://itunes.apple.com/app/id\(appid)"
-                    if let url = URL(string: appStoreLink + "?action=write-review"),
-                       UIApplication.shared.canOpenURL(url) {
-                        UIApplication.shared.open(url)
-                    }
+//                    let appStoreLink = "itms-apps://itunes.apple.com/app/id\(appid)"
+//                    if let url = URL(string: appStoreLink + "?action=write-review"),
+//                       UIApplication.shared.canOpenURL(url) {
+//                        UIApplication.shared.open(url)
+//                    }
+                    
+                    Self.kRateAction()
                 }))
         
         sectionModel.addSubItemModel(
@@ -125,6 +127,38 @@ class TSMineVM {
     }()
 }
 
+extension TSMineVM {
+    
+    //评价 App
+    static func kRateAction() {
+        let countKey = "kProcessCompletedCountKey"
+        // If the app doesn't store the count, this returns 0.
+        var count = UserDefaults.standard.integer(forKey: countKey)
+        count += 1
+        UserDefaults.standard.set(count, forKey: countKey)
+        /// 如果当前版本 弹过一次 那么下一次就走url,如果当前版本 没弹过,那就弹
+        if count >= 4 {
+            let openStr = "itms-apps://itunes.apple.com/app/\(appid)?action=write-review"
+            if let url = URL(string: openStr), UIApplication.shared.canOpenURL(url) {
+                UIApplication.shared.open(url, options: [:], completionHandler: nil)
+            }
+        } else {
+            SKStoreReviewController.requestReview()
+        }
+    }
+    
+    //首次点击保存弹出系统评分弹窗
+    static func kFirstSaveRateAction(){
+        if UserDefaults.standard.string(forKey: "iskFirstSaveRateAction") == nil {
+            kDelayOnMainThread(0.5) {
+                Self.kRateAction()
+            }
+            UserDefaults.standard.set("1", forKey: "iskFirstSaveRateAction")
+            UserDefaults.standard.synchronize()
+        }
+    }
+}
+
 
 extension TSMineVM {
     func createItemModel(

+ 1 - 3
TSLiveWallpaper/Business/TSMineVC/View/TSMineTopView.swift

@@ -55,14 +55,12 @@ class TSMineTopView: TSBaseView {
         contentView.addSubview(titleLabel)
         titleLabel.snp.makeConstraints { make in
             make.leading.equalTo(16)
-            make.top.equalTo(20)
-            make.height.equalTo(18)
+            make.top.equalTo(15)
         }
 
         contentView.addSubview(timeLabel)
         timeLabel.snp.makeConstraints { make in
             make.leading.equalTo(16)
-//            make.top.equalTo(titleLabel.snp.bottom).offset(18)
             make.bottom.equalTo(upgradeBtn.snp.top).offset(-14)
         }
 

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

@@ -391,7 +391,7 @@ struct TSVipRecView: View {
     var body: some View {
         HStack(spacing: 4) {
 //            Image("upvote_black").resizable().frame(width: 16, height: 16)
-            Text("Save".localized  + " " + save ).font(.font(size: 12,weight: .medium)).foregroundColor(.hex("#111111"))
+            Text("Save-Vip".localized  + " " + save ).font(.font(size: 12,weight: .medium)).foregroundColor(.hex("#111111"))
         }
         .padding(EdgeInsets(top: 6, leading: 6, bottom: 6, trailing: 6))
 //        .background(Color.hex("#FECB34"))

+ 8 - 0
TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSViewTool/PhotoManager.swift

@@ -141,6 +141,10 @@ class PhotoManager {
         }) { success, error in
             DispatchQueue.main.async {
                 completion(success, error)
+                
+                if success {
+                    TSMineVM.kFirstSaveRateAction()
+                }
             }
         }
     }
@@ -182,6 +186,10 @@ extension PhotoManager {
         }) { success, error in
             DispatchQueue.main.async {
                 completion(success, error)
+                
+                if success {
+                    TSMineVM.kFirstSaveRateAction()
+                }
             }
         }
     }

+ 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 - 3
TSLiveWallpaper/Data/Model/TSActionInfoModel.swift

@@ -36,7 +36,6 @@ class TSActionInfoModel: TSBaseModel {
     var costTime:Int = 0
     var percent:Float = 0.0
     var actionStatus:ActionStatus = .failed
-    var generateStyle:String = ""//生成的类型
 
 
     override func mapping(map: ObjectMapper.Map) {
@@ -52,7 +51,6 @@ class TSActionInfoModel: TSBaseModel {
         percent     <- map["percent"]
         actionStatus      <- map["actionStatus"]
         actionStatus = ActionStatus.from(status)
-        generateStyle      <- map["generateStyle"]
 
         uuid      <- map["uuid"]
     }
@@ -60,7 +58,7 @@ class TSActionInfoModel: TSBaseModel {
 
 extension TSActionInfoModel {
     var isVideo:Bool{
-        return generateStyle == TSGeneratorImageStyle.creatVideo.rawValue
+        return request.generatorStyle == TSGeneratorImageStyle.creatVideo
     }
 
     var upImageURLExpired:Bool{

+ 1 - 2
TSLiveWallpaper/Data/OperationQueue/TSGenerateBaseOperation/TSGenerateBaseOperation.swift

@@ -60,7 +60,6 @@ class TSGenerateBaseOperationQueue: TSBaseOperationQueue {
 }
 
 class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
-    var generateStyleModel:TSAIListPhotoGeneratorModel?
     var actionInfoDict:[String:Any]{
         return [:]
     }
@@ -191,7 +190,7 @@ class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
             return
         }
    
-        if generateStyleModel?.generatorStyle == .creatVideo {
+        if currentActionInfoModel.request.generatorStyle == .creatVideo {
             let group = DispatchGroup()
             //下载视频源
             group.enter()

+ 29 - 36
TSLiveWallpaper/Data/OperationQueue/TSGenerateBaseOperation/TSGenerateBasePhotoOperation.swift

@@ -47,6 +47,7 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
     override func replaceSaveInfoModel(model:TSActionInfoModel){
         model.uuid = uuid
         model.request.imageUrlTimestamp = currentActionInfoModel.request.imageUrlTimestamp
+        model.request.generatorStyle = currentActionInfoModel.request.generatorStyle
         if isSaveProcessToDB {
             saveDataDB()
         }
@@ -59,49 +60,42 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
         if currentActionInfoModel.id == 0 {
             return
         }
-        
-        if let generateStyleModel = generateStyleModel {
-            currentActionInfoModel.generateStyle = generateStyleModel.generatorStyle.rawValue
-        }
-
         TSRMShared.aiListDB.updateData(currentActionInfoModel,uuid: uuid)
     }
     override func handleGenerateSuccess() {
 //        kPurchaseBusiness.useOnceForFree(type: .general)
         saveDataDB()
-        if isShowSuccessView == false {
-            return
-        }
-        
-        if let generateStyleModel = generateStyleModel {
-            //生成成功后,不再提示用户上传规则弹窗
-            UserDefaults.standard.set("1", forKey: generateStyleModel.generatorStyle.userDefaultsKey)
-            UserDefaults.standard.synchronize()
-        }
- 
-        guard let window = WindowHelper.getKeyWindow() else {
-            debugPrint("getKeyWindow nil")
-            return
-        }
-        
-        guard let rootVC = WindowHelper.topViewController() else {
-            debugPrint("handleGenerateSuccess topViewController nil")
-            return
-        }
+
+        //生成成功后,不再提示用户上传规则弹窗
+        UserDefaults.standard.set("1", forKey: currentActionInfoModel.request.generatorStyle.userDefaultsKey)
+        UserDefaults.standard.synchronize()
         
-        let copyModel = self.currentActionInfoModel.copy()
-        if let cyModel = copyModel as? TSActionInfoModel {
-            let topY = k_Nav_Height+10
-            debugPrint("topY=\(topY)")
-            kSaveSuccesswShared.show(atView: window,text: "Process successfully".localized,deadline: 5.0) {
-                let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel: TSAIListPhotoGeneratorModel(upLoadImage: UIImage(), generatorStyle: cyModel.request.generatorStyle),infoModel: cyModel) { model in }
-                gennerateVC.modalPresentationStyle = .overFullScreen
-                gennerateVC.modalTransitionStyle = .crossDissolve
-                rootVC.present(gennerateVC, animated: true)
+        if isShowSuccessView  {
+            guard let window = WindowHelper.getKeyWindow() else {
+                debugPrint("getKeyWindow nil")
+                return
+            }
+            
+            guard let rootVC = WindowHelper.topViewController() else {
+                debugPrint("handleGenerateSuccess topViewController nil")
+                return
+            }
+            
+            let copyModel = self.currentActionInfoModel.copy()
+            if let cyModel = copyModel as? TSActionInfoModel {
+                let topY = k_Nav_Height+10
+                debugPrint("topY=\(topY)")
+                kSaveSuccesswShared.show(atView: window,text: "Process successfully".localized,deadline: 5.0) {
+                    let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel: TSAIListPhotoGeneratorModel(upLoadImage: UIImage(), generatorStyle: cyModel.request.generatorStyle),infoModel: cyModel) { model in }
+                    gennerateVC.modalPresentationStyle = .overFullScreen
+                    gennerateVC.modalTransitionStyle = .crossDissolve
+                    rootVC.present(gennerateVC, animated: true)
+                }
+            }else{
+                debugPrint("copyModel as? TSActionInfoModel error")
             }
-        }else{
-            debugPrint("copyModel as? TSActionInfoModel error")
         }
+
     }
     
 
@@ -118,7 +112,6 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
     private var creatRequest:Request?
     
     func createActionInfoModel(generateStyleModel:TSAIListPhotoGeneratorModel) -> TSActionInfoModel? {
-        self.generateStyleModel = generateStyleModel
         guard let upLoadImageUrl = generateStyleModel.upLoadImageUrl else { return nil }
 
         let infoModel = TSActionInfoModel()

+ 0 - 4
TSLiveWallpaper/Data/TSDBManager/TSDBActionInfoModel.swift

@@ -13,8 +13,6 @@ class TSDBActionInfoModel: Object {
     @Persisted(primaryKey: true) var primaryKey: String = UUID().uuidString
     @Persisted var createdAt: Date = Date()
     
-    @Persisted var generateStyle:String    //储存的业务类型
-
     @Persisted var modelType:Int = 0
     @Persisted var id:Int = 0
     @Persisted var actionType:String = ""
@@ -38,7 +36,6 @@ class TSDBActionInfoModel: Object {
         self.modelType = infoModel.modelType.rawValue
         self.id = infoModel.id
         self.actionType = infoModel.actionType
-        self.generateStyle = infoModel.generateStyle
         
         self.comments = infoModel.comments
 
@@ -60,7 +57,6 @@ class TSDBActionInfoModel: Object {
         infoModel.id = self.id
         infoModel.actionType = self.actionType
         infoModel.comments = self.comments
-        infoModel.generateStyle = self.generateStyle
         
         infoModel.createdTimestamp = self.createdTimestamp
         infoModel.status = self.status

+ 1 - 1
TSLiveWallpaper/Data/TSDBManager/TSDBManager.swift

@@ -162,7 +162,7 @@ extension TSRealmManager {
         model.request.imageUrl = oldImageName
         model.response.resultUrl = newImageName
         model.status = "success"
-        model.generateStyle = generateStyle.rawValue
+        model.request.generatorStyle = generateStyle
         return model
     }
     

+ 2 - 1
TSLiveWallpaper/ar.lproj/Localizable.strings

@@ -40,7 +40,7 @@
 "Try" = "يحاول";
 "Colorize" = "تلوين";
 "Add colors to black-and-white photos" = "إضافة الألوان إلى الصور بالأبيض والأسود";
-"Descratch" = "ديسكراتش";
+"Descratch" = "إزالة الخدوش";
 "Remove scratches and dirt" = "إزالة الخدوش والأوساخ";
 "Enhance Tips" = "نصائح التحسين";
 "Suitable" = "مناسب";
@@ -139,3 +139,4 @@
 "Update now to unlock the best experience" = "قم بالتحديث الآن لتستمتع بأفضل تجربة";
 "Update" = "تحديث";
 "Adjust Light Tips" = "نصائح لضبط الإضاءة";
+"Update to PRO" = "التحديث إلى PRO";

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

@@ -138,3 +138,4 @@
 "Update now to unlock the best experience" = "Update now to unlock the best experience";
 "Update" = "Update";
 "Adjust Light Tips" = "Adjust Light Tips";
+"Update to PRO" = "Update to PRO";

+ 2 - 1
TSLiveWallpaper/es.lproj/Localizable.strings

@@ -40,7 +40,7 @@
 "Try" = "Intentar";
 "Colorize" = "Colorear";
 "Add colors to black-and-white photos" = "Añadir colores a fotos en blanco y negro";
-"Descratch" = "Descratch";
+"Descratch" = "Eliminar arañazos";
 "Remove scratches and dirt" = "Eliminar arañazos y suciedad";
 "Enhance Tips" = "Consejos para mejorar";
 "Suitable" = "Adecuado";
@@ -139,3 +139,4 @@
 "Update now to unlock the best experience" = "Actualiza ahora para disfrutar de la mejor experiencia";
 "Update" = "Actualizar";
 "Adjust Light Tips" = "Consejos para ajustar la luz";
+"Update to PRO" = "Actualización a PRO";

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

@@ -81,7 +81,7 @@
 "Try" = "試す";
 "Colorize" = "カラー化";
 "Add colors to black-and-white photos" = "白黒写真に色を追加";
-"Descratch" = "傷除去";
+"Descratch" = "傷を消す";
 "Remove scratches and dirt" = "傷や汚れを削除";
 "Enhance Tips" = "強化のヒント";
 "Suitable" = "適している";
@@ -137,3 +137,4 @@
 "Failed to validate receipt" = "領収書の検証に失敗しました";
 "%d%" = "%d%%";
 "Adjust Light Tips" = "光調整のヒント";
+"Update to PRO" = "PROにアップデート";

+ 2 - 1
TSLiveWallpaper/ko.lproj/Localizable.strings

@@ -81,7 +81,7 @@
 "Try" = "시도";
 "Colorize" = "색상 추가";
 "Add colors to black-and-white photos" = "흑백 사진에 색상 추가";
-"Descratch" = "스크래치 제거";
+"Descratch" = "긁힘 제거";
 "Remove scratches and dirt" = "스크래치 및 먼지 제거";
 "Enhance Tips" = "강화 팁";
 "Suitable" = "적합";
@@ -137,3 +137,4 @@
 "Failed to validate receipt" = "영수증 확인에 실패했습니다.";
 "%d%" = "%d%%";
 "Adjust Light Tips" = "조명 조절 팁";
+"Update to PRO" = "PRO로 업데이트";

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

@@ -137,3 +137,4 @@
 "Failed to validate receipt" = "無法驗證收據";
 "%d%" = "%d%%";
 "Adjust Light Tips" = "光線調整提示";
+"Update to PRO" = "升級成為會員";