Browse Source

3.6.2(1)
1.改变图片增强提示词为:”提高上传图片的清晰度,不要改变任何"
2.首页 more 改 see all
3.增加机器人限制(未启用)
4.文生图新增比例尺寸
5.更改 app 名称为AI Image

100Years 1 month ago
parent
commit
3d3c2a2fab
39 changed files with 343 additions and 104 deletions
  1. 16 4
      AIEmoji.xcodeproj/project.pbxproj
  2. 22 0
      AIEmoji/Assets.xcassets/Common/launch_AI_Image.imageset/Contents.json
  3. BIN
      AIEmoji/Assets.xcassets/Common/launch_AI_Image.imageset/launch_AIImage@2x.png
  4. BIN
      AIEmoji/Assets.xcassets/Common/launch_AI_Image.imageset/launch_AIImage@3x.png
  5. 22 0
      AIEmoji/Assets.xcassets/Common/red_warning.imageset/Contents.json
  6. BIN
      AIEmoji/Assets.xcassets/Common/red_warning.imageset/red_warning@2x.png
  7. BIN
      AIEmoji/Assets.xcassets/Common/red_warning.imageset/red_warning@3x.png
  8. 3 3
      AIEmoji/Base.lproj/LaunchScreen.storyboard
  9. 1 2
      AIEmoji/Business/TSAILIstVC/TSAIChangeEmoteVC/ViewModel/TSAIChangeEmoteVM.swift
  10. 1 1
      AIEmoji/Business/TSAILIstVC/TSAIExpandImageVC/TSAIExpandImageVM.swift
  11. 1 2
      AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoGeneratorBaseVM/TSAIListPhotoGeneratorBaseVM.swift
  12. 1 2
      AIEmoji/Business/TSGenmojiVC/TSGenmojiGennerateVC/TSGenmojiGennerateViewModel.swift
  13. 1 1
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiColSectionView.swift
  14. 2 2
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiItemCell.swift
  15. 106 0
      AIEmoji/Business/TSPTPGeneratorVC/TSAbnormalPopUpAlertVC/TSAbnormalPopUpAlertVC.swift
  16. 2 3
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/TSPTPGeneratorVC.swift
  17. 1 3
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/VM/TSPTPGeneratorVM.swift
  18. 1 0
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/TSPTPInputVC.swift
  19. 3 3
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/VM/TSPTPInputVM.swift
  20. 1 0
      AIEmoji/Business/TSPTPGeneratorVC/TSPhotoToPhotoVC/M/TSPTPStyleModel.swift
  21. 1 1
      AIEmoji/Business/TSSetingVC/SetingVC/TSSetingViewModel.swift
  22. 10 15
      AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/TSTTPInputVC.swift
  23. 28 10
      AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/VM/TSTTPInputVM.swift
  24. 27 28
      AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/View/TSTTPRatioView.swift
  25. 1 1
      AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/View/TSTitleView.swift
  26. 7 8
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVC.swift
  27. 18 7
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVM.swift
  28. 1 2
      AIEmoji/Common/NetworkManager/TSNetWork/TSNetWork+Business.swift
  29. 20 4
      AIEmoji/Common/NetworkManager/TSNetWork/TSNetworkManager.swift
  30. 1 2
      AIEmoji/Common/Tool/OperationQueue/TSGenerateBaseOperation/TSGeneratePosterOperation.swift
  31. 5 0
      AIEmoji/de.lproj/Localizable.strings
  32. 5 0
      AIEmoji/en.lproj/Localizable.strings
  33. 5 0
      AIEmoji/es.lproj/Localizable.strings
  34. 5 0
      AIEmoji/ja.lproj/Localizable.strings
  35. 5 0
      AIEmoji/ko.lproj/Localizable.strings
  36. 5 0
      AIEmoji/pt-BR.lproj/Localizable.strings
  37. 5 0
      AIEmoji/pt-PT.lproj/Localizable.strings
  38. 5 0
      AIEmoji/zh-Hans.lproj/Localizable.strings
  39. 5 0
      AIEmoji/zh-Hant.lproj/Localizable.strings

+ 16 - 4
AIEmoji.xcodeproj/project.pbxproj

@@ -16,6 +16,7 @@
 		A80327C52D81584500AF7878 /* TSGeneralBtnView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80327C42D81582F00AF7878 /* TSGeneralBtnView.swift */; };
 		A804B9812DBF500E00C494C7 /* SwiftUIX in Frameworks */ = {isa = PBXBuildFile; productRef = A804B9802DBF500E00C494C7 /* SwiftUIX */; };
 		A804B98F2DC0F0F700C494C7 /* TSTTPRatioView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A804B98E2DC0F0D800C494C7 /* TSTTPRatioView.swift */; };
+		A804B9922DC1CD1800C494C7 /* TSAbnormalPopUpAlertVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A804B9912DC1CD1700C494C7 /* TSAbnormalPopUpAlertVC.swift */; };
 		A80E721A2D3F393A00C64288 /* DiyStickerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80E72192D3F393500C64288 /* DiyStickerModel.swift */; };
 		A80E721E2D3F3A7500C64288 /* DiyElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80E721D2D3F3A7500C64288 /* DiyElement.swift */; };
 		A80E72202D3F3A8600C64288 /* DiyElementBaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80E721F2D3F3A8600C64288 /* DiyElementBaseView.swift */; };
@@ -263,6 +264,7 @@
 		A80327C22D81580800AF7878 /* TSTTPStyleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTTPStyleView.swift; sourceTree = "<group>"; };
 		A80327C42D81582F00AF7878 /* TSGeneralBtnView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGeneralBtnView.swift; sourceTree = "<group>"; };
 		A804B98E2DC0F0D800C494C7 /* TSTTPRatioView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTTPRatioView.swift; sourceTree = "<group>"; };
+		A804B9912DC1CD1700C494C7 /* TSAbnormalPopUpAlertVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAbnormalPopUpAlertVC.swift; sourceTree = "<group>"; };
 		A80E72192D3F393500C64288 /* DiyStickerModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiyStickerModel.swift; sourceTree = "<group>"; };
 		A80E721D2D3F3A7500C64288 /* DiyElement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiyElement.swift; sourceTree = "<group>"; };
 		A80E721F2D3F3A8600C64288 /* DiyElementBaseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiyElementBaseView.swift; sourceTree = "<group>"; };
@@ -600,6 +602,14 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		A804B9902DC1CCE600C494C7 /* TSAbnormalPopUpAlertVC */ = {
+			isa = PBXGroup;
+			children = (
+				A804B9912DC1CD1700C494C7 /* TSAbnormalPopUpAlertVC.swift */,
+			);
+			path = TSAbnormalPopUpAlertVC;
+			sourceTree = "<group>";
+		};
 		A80E72182D3F390A00C64288 /* DiySticker */ = {
 			isa = PBXGroup;
 			children = (
@@ -1033,6 +1043,7 @@
 		A80EDDDC2D6EB17D003CD332 /* TSPTPGeneratorVC */ = {
 			isa = PBXGroup;
 			children = (
+				A804B9902DC1CCE600C494C7 /* TSAbnormalPopUpAlertVC */,
 				A88508B42DBF1408000FBCEC /* TSGennertatorSelectStyleVC */,
 				A885088B2DBCE7B8000FBCEC /* TSPTPHistoryVC */,
 				A8F413492DA75863001E715A /* TSUploadPhotoPrivacyAlertVC */,
@@ -2355,6 +2366,7 @@
 				A8F7748B2D38E8B700AA6E93 /* AppDelegate.swift in Sources */,
 				A8F4135D2DA8E6CA001E715A /* TSAIChangeEmoteStyleView.swift in Sources */,
 				A80327B02D813A0200AF7878 /* TSTTPSelectStyleCell.swift in Sources */,
+				A804B9922DC1CD1800C494C7 /* TSAbnormalPopUpAlertVC.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2420,7 +2432,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 8;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -2436,7 +2448,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 3.6.1;
+				MARKETING_VERSION = 3.6.2;
 				PRODUCT_BUNDLE_IDENTIFIER = com.girl.music.wallpaper;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
@@ -2459,7 +2471,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 8;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -2475,7 +2487,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 3.6.1;
+				MARKETING_VERSION = 3.6.2;
 				PRODUCT_BUNDLE_IDENTIFIER = com.girl.music.wallpaper;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";

+ 22 - 0
AIEmoji/Assets.xcassets/Common/launch_AI_Image.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "launch_AIImage@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "launch_AIImage@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIEmoji/Assets.xcassets/Common/launch_AI_Image.imageset/launch_AIImage@2x.png


BIN
AIEmoji/Assets.xcassets/Common/launch_AI_Image.imageset/launch_AIImage@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/Common/red_warning.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "red_warning@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "red_warning@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
AIEmoji/Assets.xcassets/Common/red_warning.imageset/red_warning@2x.png


BIN
AIEmoji/Assets.xcassets/Common/red_warning.imageset/red_warning@3x.png


+ 3 - 3
AIEmoji/Base.lproj/LaunchScreen.storyboard

@@ -16,8 +16,8 @@
                         <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
-                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="launch_Chibii" highlighted="YES" translatesAutoresizingMaskIntoConstraints="NO" id="FfL-7D-71P">
-                                <rect key="frame" x="123" y="325" width="147" height="45.333333333333314"/>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="launch_AI_Image" highlighted="YES" translatesAutoresizingMaskIntoConstraints="NO" id="FfL-7D-71P">
+                                <rect key="frame" x="86.666666666666671" y="325" width="219.66666666666663" height="45.333333333333314"/>
                             </imageView>
                         </subviews>
                         <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
@@ -34,6 +34,6 @@
         </scene>
     </scenes>
     <resources>
-        <image name="launch_Chibii" width="147" height="45.333332061767578"/>
+        <image name="launch_AI_Image" width="219.66667175292969" height="45.333332061767578"/>
     </resources>
 </document>

+ 1 - 2
AIEmoji/Business/TSAILIstVC/TSAIChangeEmoteVC/ViewModel/TSAIChangeEmoteVM.swift

@@ -108,8 +108,7 @@ extension TSAIChangeEmoteVM {
         creatRequest = TSNetworkShared.post(urlType: urlType,parameters:postDict) { [weak self] data,error in
             guard let self = self else { return }
             
-            if let dataDict = data as? [String:Any] ,
-               dataDict.safeInt(forKey: "code") == 200,
+            if let dataDict = kNetWorkCodeSuccess(data: data),
                let actionId = dataDict["actionId"] as? Int{
                 if stopNetwork == false {
                     self.getActionInfo(action_id:actionId)

+ 1 - 1
AIEmoji/Business/TSAILIstVC/TSAIExpandImageVC/TSAIExpandImageVM.swift

@@ -86,7 +86,7 @@ extension AspectRatio {
         }
     }
     
-    static func ttpDataArray()->[AspectRatio]{
+    static var ttpRatioDataArray:[AspectRatio]{
         return AspectRatio.allCases
     }
 }

+ 1 - 2
AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoGeneratorBaseVM/TSAIListPhotoGeneratorBaseVM.swift

@@ -161,8 +161,7 @@ class TSAIListPhotoGeneratorBaseVM {
         creatRequest = TSNetworkShared.post(urlType: urlType,parameters: postDict) { [weak self] data,error in
             guard let self = self else { return }
             
-            if let dataDict = data as? [String:Any] ,
-               dataDict.safeInt(forKey: "code") == 200,
+            if let dataDict = kNetWorkCodeSuccess(data: data),
                let actionId = dataDict["actionId"] as? Int{
                 if stopNetwork == false {
                     self.getActionInfo(action_id:actionId)

+ 1 - 2
AIEmoji/Business/TSGenmojiVC/TSGenmojiGennerateVC/TSGenmojiGennerateViewModel.swift

@@ -123,8 +123,7 @@ class TSGenmojiGennerateViewModel {
         creatRequest = TSNetworkShared.post(urlType: .imageEmoji,parameters: ["prompt":text,"device":getUserInfoJsonString()]) { [weak self] data,error in
             guard let self = self else { return }
             
-            if let dataDict = data as? [String:Any] ,
-               dataDict.safeInt(forKey: "code") == 200,
+            if let dataDict = kNetWorkCodeSuccess(data: data),
                let actionId = dataDict["actionId"] as? Int{
                 if stopNetwork == false {
                     self.getActionInfo(action_id:actionId)

+ 1 - 1
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiColSectionView.swift

@@ -51,7 +51,7 @@ class TSGenmojiColSectionView: TSBaseCollectionnReusableView {
         let moreView = UIView()
         moreView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickMoreView)))
         
-        let label = UILabel.createLabel(text: "More".localized,font: .font(size: 12),textColor: .white.withAlphaComponent(0.4))
+        let label = UILabel.createLabel(text: "See all".localized,font: .font(size: 12),textColor: .white.withAlphaComponent(0.4))
         moreView.addSubview(label)
         label.snp.makeConstraints { make in
             make.leading.top.bottom.equalTo(0)

+ 2 - 2
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiItemCell.swift

@@ -90,7 +90,7 @@ class TSGenmojiItemCell: TSBaseCollectionCell ,TSSimpleConfigurableView {
     }()
     
     override func creatUI() {
-        debugPrint("TSGenmojiItemCell creatUI")
+        //debugPrint("TSGenmojiItemCell creatUI")
         contentView.cornerRadius = 16.0
         contentView.addSubview(showImageView)
         showImageView.snp.makeConstraints { make in
@@ -125,7 +125,7 @@ class TSGenmojiItemCell: TSBaseCollectionCell ,TSSimpleConfigurableView {
             model.actionStatus = .success
         }
         showImageView.image = nil
-        dePrint("updataActionInfoModelView model.actionStatus 收到 = \(model.actionStatus)")
+        //dePrint("updataActionInfoModelView model.actionStatus 收到 = \(model.actionStatus)")
         switch model.actionStatus {
         case .pending,.running:
             generateView.isHidden = false

+ 106 - 0
AIEmoji/Business/TSPTPGeneratorVC/TSAbnormalPopUpAlertVC/TSAbnormalPopUpAlertVC.swift

@@ -0,0 +1,106 @@
+//
+//  TSAbnormalPopUpAlertVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/4/29.
+//
+
+class TSAbnormalPopUpAlertVC: TSBaseVC {
+    
+    static let shared = TSAbnormalPopUpAlertVC()
+    
+    var text:String = "" {
+        didSet{
+            textLab.text = text
+            textLab.setLineSpacing(6.0, alignment: .center)
+        }
+    }
+    var isAddView:Bool = false
+//    init(text: String,isAddView:Bool = false) {
+//        self.text = text
+//        self.isAddView = isAddView
+//        super.init()
+//    }
+    
+//    @MainActor required init?(coder: NSCoder) {
+//        fatalError("init(coder:) has not been implemented")
+//    }
+    
+    
+    lazy var alertView: UIView = {
+        let alertView = UIView()
+        alertView.cornerRadius = 20
+        alertView.backgroundColor = .popupColor
+        alertView.isUserInteractionEnabled = true
+        return alertView
+    }()
+    
+    
+    lazy var textLab: UILabel = {
+        let textLab = UILabel.createLabel(text: text,font: .font(size: 16),textColor: .white,textAlignment: .center,numberOfLines: 0)
+        textLab.setLineSpacing(6.0, alignment: .center)
+        return textLab
+    }()
+    lazy var submitBtn: UIButton = {
+        let submitBtn = UIButton.createButton(title: "Got it".localized,backgroundColor: .white.withAlphaComponent(0.2),font: .font(size: 16,weight: .medium),corner: 24.0){ [weak self]  in
+            guard let self = self else { return }
+            if isAddView {
+                self.view.removeFromSuperview()
+            }else{
+                self.dismiss()
+            }
+        }
+        return submitBtn
+    }()
+    
+    
+    override func createView() {
+        setNavBarViewHidden(true)
+        view.backgroundColor = .black.withAlphaComponent(0.5)
+        contentView.addSubview(alertView)
+        alertView.snp.makeConstraints { make in
+            make.center.equalToSuperview()
+            make.leading.equalTo(36.0)
+            make.trailing.equalTo(-36.0)
+        }
+
+        alertView.addSubview(textLab)
+        textLab.snp.makeConstraints { make in
+            make.top.equalTo(44.0)
+            make.leading.equalTo(16.0)
+            make.trailing.equalTo(-16.0)
+        }
+        
+        alertView.addSubview(submitBtn)
+        submitBtn.snp.makeConstraints { make in
+            make.top.equalTo(textLab.snp.bottom).offset(16.0)
+            make.leading.equalTo(27.0)
+            make.trailing.equalTo(-27.0)
+            make.height.equalTo(48)
+            make.bottom.equalTo(-20)
+        }
+        
+        let topImageView = UIImageView.createImageView(imageName: "red_warning")
+        contentView.addSubview(topImageView)
+        topImageView.snp.makeConstraints { make in
+            make.bottom.equalTo(alertView.snp.top).offset(28.0)
+            make.centerX.equalToSuperview()
+            make.width.height.equalTo(56)
+        }
+
+    }
+}
+
+extension TSAbnormalPopUpAlertVC {
+    static func showRobotWarning() {
+        guard let window = WindowHelper.getKeyWindow() else { return }
+        shared.view.frame = window.bounds
+        shared.text = "We've detected unusually high generation activity. You may be a bot. Please try again tomorrow.".localized
+        shared.isAddView = true
+        
+        UIView.animate(withDuration: 0.3){
+            window.addSubview(shared.view)
+        }
+
+    }
+}

+ 2 - 3
AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/TSPTPGeneratorVC.swift

@@ -124,9 +124,8 @@ class TSPTPGeneratorVC: TSAIPhotoGeneratorBaseVC {
         self.operation.isSaveDB = true //后台生成,让数据库保存数据
         if let model = infoModel {
             TSRMShared.ptpDBHistory.updateData(model)
-            DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
-                NotificationCenter.default.post(name: .kPTPDataChanged, object: nil)
-            }
+            debugPrint("图生图进入后台,保存数据listModels.first=\(TSRMShared.ptpDBHistory.listModels.first)")
+            NotificationCenter.default.post(name: .kPTPDataChanged, object: nil)
         }else{
             debugPrint("进入后台,但是没有新数据")
         }

+ 1 - 3
AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/VM/TSPTPGeneratorVM.swift

@@ -163,9 +163,7 @@ class TSPTPGeneratorVM {
                                                  "advance": generateStyleModel.advance
                                                 ]) { [weak self] data,error in
             guard let self = self else { return }
-            
-            if let dataDict = data as? [String:Any] ,
-               dataDict.safeInt(forKey: "code") == 200,
+            if let dataDict = kNetWorkCodeSuccess(data: data),
                let actionId = dataDict["actionId"] as? Int{
                 if stopNetwork == false {
                     self.getActionInfo(action_id:actionId)

+ 1 - 0
AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/TSPTPInputVC.swift

@@ -348,6 +348,7 @@ class TSPTPInputVC: TSBaseVC {
         NotificationCenter.default.addObserver(forName: .kPTPDataChanged, object: nil, queue: nil) { [weak self] notification in
             guard let self = self else { return }
             DispatchQueue.main.async {
+                debugPrint("kPTPDataChanged listModels.first=\(self.viewModel.listModels.first?.toJSONString())")
                 self.updataCollectionView()
             }
         }

+ 3 - 3
AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/VM/TSPTPInputVM.swift

@@ -39,11 +39,11 @@ class TSPTPInputVM {
         return ptpStyleModels
     }()
     
-    
+
     var listModels:[TSActionInfoModel]{
-        debugPrint("listModels.count = 前")
+//        debugPrint("listModels.count = 前")
         let array = TSRMShared.ptpDBHistory.getModelList(count: 50)
-        debugPrint("listModels.count = \(array.count)")
+//        debugPrint("listModels.count = \(array.count)")
         return array
     }
     

+ 1 - 0
AIEmoji/Business/TSPTPGeneratorVC/TSPhotoToPhotoVC/M/TSPTPStyleModel.swift

@@ -37,5 +37,6 @@ class TSGenerateStyleModel: TSBaseModel {
     var inputText:String = ""   //用户自己补充的风格文字
     var upLoadImage:UIImage?    //上传的图片
     var upLoadImageUrl:String?    //上传的图片的 url
+    var generateSize:CGSize?    //生成图片的尺寸
 }
 

+ 1 - 1
AIEmoji/Business/TSSetingVC/SetingVC/TSSetingViewModel.swift

@@ -101,7 +101,7 @@ class TSSetingViewModel: ObservableObject {
         }
     
 #if DEBUG
-        
+//        TSAbnormalPopUpAlertVC.showRobotWarning()
 //        guard let window = WindowHelper.getKeyWindow() else {
 //            debugPrint("getKeyWindow nil")
 //            return

+ 10 - 15
AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/TSTTPInputVC.swift

@@ -12,7 +12,7 @@ class TSTTPInputVC: TSBaseVC {
             if cusStackView.viewH > 0{
                 return cusStackView.viewH
             }
-            return 489.0
+            return 489.0+136.0
         }
     }
     
@@ -28,7 +28,7 @@ class TSTTPInputVC: TSBaseVC {
     
     //###################################### cusStackView ######################################
     lazy var cusStackView: TSCustomStackView = {
-        let cusStackView = TSCustomStackView(axis: .vertical,spacing: 8)
+        let cusStackView = TSCustomStackView(axis: .vertical,spacing: 0)
         cusStackView.scrollView.isScrollEnabled = false
         return cusStackView
     }()
@@ -64,11 +64,11 @@ class TSTTPInputVC: TSBaseVC {
     //###################################### 尺寸类型 ######################################
     lazy var ratioStyleView: TSTTPRatioView = {
         let ratioStyleView = TSTTPRatioView()
-        ratioStyleView.currentIndexPath = IndexPath(item: viewModel.selectedStyleIndex, section: 0)
-        ratioStyleView.dataArray = viewModel.ptpStyleModels
+        ratioStyleView.selectRatio = viewModel.selectRatio //一定要放在dataArray设置前
+        ratioStyleView.dataArray = viewModel.ttpRatioDataArray
         ratioStyleView.selectedValueBlock = { [weak self] model in
             guard let self = self else { return }
-            viewModel.selectPromptModel = model
+            viewModel.selectRatio = model
             updateVipView()
         }
         return ratioStyleView
@@ -107,9 +107,9 @@ class TSTTPInputVC: TSBaseVC {
         }
 
         cusStackView.addSubviewToStack(promptTextView)
-        
         cusStackView.addSubviewToStack(promptStyleView)
-
+        cusStackView.addSubviewToStack(ratioStyleView)
+        
         cusStackView.addSubviewToStack(creatBtnView)
         creatBtnView.snp.makeConstraints { make in
             make.height.equalTo(creatBtnView.viewH)
@@ -149,20 +149,15 @@ class TSTTPInputVC: TSBaseVC {
 extension TSTTPInputVC {
     func generateImage() {
         
-        guard let selectPromptModel = viewModel.selectPromptModel else { return }
+        guard let generateStyleModel = viewModel.generateStyleModel else { return }
         
         var isVip = kPurchaseDefault.freeNumAvailable(type: .textGeneratePic) == false
         if viewModel.selectPromptModel?.isVip == true {
             isVip = true
         }
         
-        //判断 vip
-        if kJudgeVip(externalBool: isVip, vc: self) { [weak self] in
-            guard let self = self else { return }
-        }{ return }
-        
-       
-        let gennerateVC = TSTextPicGennerateVC(aiText: viewModel.prompt,style: selectPromptModel.style) {[weak self] model in
+        if kJudgeVip(externalBool: isVip, vc: self) { return } //判断 vip
+        let gennerateVC = TSTextPicGennerateVC(generateStyleModel: generateStyleModel) {[weak self] model in
             guard let self = self else { return }
             model.request.promptSort = viewModel.promptText
             viewModel.saveModel(model: model)

+ 28 - 10
AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/VM/TSTTPInputVM.swift

@@ -21,7 +21,14 @@ let kRandomTextToRintone:[String] = [
 ]
 
 class TSTTPInputVM {
+    //###################################### 样式选择 ######################################
     var selectedStyleIndex:Int = 0
+    //选择的 prompt 类型
+    var selectPromptModel:TSGenerateStyleModel?{
+        didSet{
+            isCanGennerateBlock?(isCanGennerate)
+        }
+    }
     //选择 prompt 类型组
     lazy var ptpStyleModels: [TSGenerateStyleModel] = {
         var ptpStyleModels = [TSGenerateStyleModel]()
@@ -36,28 +43,39 @@ class TSTTPInputVM {
         return ptpStyleModels
     }()
     
-    lazy var <#property name#>: [AspectRatio] = {
-        <#statements#>
-        return <#value#>
-    }()
-    
-    //输入框内容
-    var promptText:String = "" {
+    //###################################### 比例选择 ######################################
+    //选择的 Ratio 类型
+    var selectRatio:AspectRatio = AspectRatio.ratio9_16{
         didSet{
             isCanGennerateBlock?(isCanGennerate)
         }
     }
+    lazy var ttpRatioDataArray: [AspectRatio] = {
+        let ttpRatioDataArray = AspectRatio.ttpRatioDataArray
+        return ttpRatioDataArray
+    }()
     
-
-    //选择的 prompt 类型
-    var selectPromptModel:TSGenerateStyleModel?{
+    //输入框内容
+    var promptText:String = "" {
         didSet{
             isCanGennerateBlock?(isCanGennerate)
         }
     }
     
+
     //可生成状态变化 block
     var isCanGennerateBlock:((Bool)->Void)?
+    
+    
+    //用户生成图片的TSGenerateStyleModel
+    var generateStyleModel:TSGenerateStyleModel?{
+        if let selectPromptModel = selectPromptModel {
+            selectPromptModel.generateSize = selectRatio.ttpSize
+            selectPromptModel.prompt = prompt
+            return selectPromptModel
+        }
+        return nil
+    }
 }
 
 

+ 27 - 28
AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/View/TSTTPRatioView.swift

@@ -5,15 +5,19 @@
 //  Created by 100Years on 2025/4/29.
 //
 
+
+private let itemW = 68.0
+private let itemH = 80.0
+
 class TSTTPRatioView:TSBaseView {
     
-    var selectedValueBlock:((TSGenerateStyleModel)->Void)?
-    
-    var dataArray: [TSGenerateStyleModel] = [TSGenerateStyleModel](){
+    var selectedValueBlock:((AspectRatio)->Void)?
+    var selectRatio:AspectRatio?
+    var dataArray: [AspectRatio] = [AspectRatio](){
         didSet{
             styleCollectionView.reloadData()
-            if dataArray.count > 0 {
-                self.styleCollectionView.selectItem(at: self.currentIndexPath, animated: false, scrollPosition: .centeredHorizontally)
+            if let selectRatio = selectRatio,let selectedIndex = dataArray.firstIndex(of: selectRatio) {
+                self.styleCollectionView.selectItem(at: IndexPath(item: selectedIndex, section: 0), animated: false, scrollPosition: .centeredHorizontally)
             }
         }
     }
@@ -21,9 +25,9 @@ class TSTTPRatioView:TSBaseView {
     lazy var layout: UICollectionViewFlowLayout = {
         let layout = UICollectionViewFlowLayout()
         layout.scrollDirection = .horizontal
-        layout.itemSize = CGSize(width: 68, height: 80)
-        layout.minimumInteritemSpacing = 12.0
-        layout.minimumLineSpacing = 0.0
+        layout.itemSize = CGSize(width: itemW, height: itemH)
+        layout.minimumInteritemSpacing = 0.0
+        layout.minimumLineSpacing = 12.0
         layout.sectionInset = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 16)
         return layout
     }()
@@ -43,12 +47,9 @@ class TSTTPRatioView:TSBaseView {
         return collectionView
     }()
 
-    var currentIndexPath:IndexPath = IndexPath(item: 0, section: 0)
-    
-    
     lazy var titleView: TSTitleView = {
         let titleView = TSTitleView()
-        titleView.titleLab.text = "Ratio".localized
+        titleView.titleLab.text = "Aspect Ratio".localized
         return titleView
     }()
     
@@ -63,20 +64,15 @@ class TSTTPRatioView:TSBaseView {
             make.height.equalTo(titleViewH)
         }
         
-        currentIndexPath = IndexPath(item: 0, section: 0)
         contentView.addSubview(styleCollectionView)
         styleCollectionView.snp.makeConstraints { make in
             make.top.equalTo(titleView.snp.bottom)
             make.leading.trailing.equalTo(0)
-            make.height.equalTo(110)
+            make.height.equalTo(itemH)
             make.bottom.equalTo(0)
         }
     }
-    
-    func unCheck(){
-        styleCollectionView.deselectItem(at: currentIndexPath, animated: true)
-    }
-    
+
 }
 
 extension TSTTPRatioView: UICollectionViewDataSource ,UICollectionViewDelegate {
@@ -100,7 +96,6 @@ extension TSTTPRatioView: UICollectionViewDataSource ,UICollectionViewDelegate {
 
     public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
         if let model = dataArray.safeObj(At: indexPath.item){
-            currentIndexPath = indexPath
             selectedValueBlock?(model)
         }
     }
@@ -116,14 +111,15 @@ class TSTTPRatioViewCell: TSBaseCollectionCell {
         }
     }
     
-    var itemModel:TSGenerateStyleModel = TSGenerateStyleModel(){
+    var itemModel:AspectRatio = AspectRatio.ratio9_16{
         didSet{
-            imageView.image = UIImage(named: itemModel.imageName)
+            imageView.image = UIImage(named: itemModel.ttpImageNamed)
         }
     }
 
     lazy var boardImageView: UIImageView = {
-        let boardImageView = UIImageView.createImageView(imageName: "ttp_selected_border")
+        let boardImageView = UIImageView()
+        boardImageView.cornerRadius = 16
         boardImageView.isHidden = true
         return boardImageView
     }()
@@ -131,27 +127,30 @@ class TSTTPRatioViewCell: TSBaseCollectionCell {
     
     lazy var imageView: UIImageView = {
         let imageView = UIImageView()
-        imageView.cornerRadius = 40.0
+        boardImageView.cornerRadius = 16
         return imageView
     }()
     
 
     override func creatUI() {
-        //cell 100*110
    
         bgContentView.addSubview(imageView)
         imageView.snp.makeConstraints { make in
             make.top.equalTo(0)
             make.centerX.equalToSuperview()
-            make.width.height.equalTo(80)
+            make.width.equalTo(itemW)
+            make.height.equalTo(itemH)
         }
-        
 
-        
         imageView.addSubview(boardImageView)
         boardImageView.snp.makeConstraints { make in
             make.top.bottom.leading.trailing.equalTo(0)
         }
+        
+        boardImageView.setNeedsLayout()
+        DispatchQueue.main.async {
+            self.boardImageView.addGradientBorder(colors: ["#FA794F".uiColor,"#F8C32A".uiColor,"#FEFBF4".uiColor],width: 1.5,startPoint: CGPoint(x: 0, y: 1),endPoint: CGPoint(x: 1, y: 0))
+        }
 
     }
     

+ 1 - 1
AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/View/TSTitleView.swift

@@ -54,7 +54,7 @@ class TSTitleMoreView: TSTitleView {
         let moreView = UIView()
         moreView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickMoreView)))
         
-        let label = UILabel.createLabel(text: "More".localized,font: .font(size: 12),textColor: .white.withAlphaComponent(0.4))
+        let label = UILabel.createLabel(text: "See all".localized,font: .font(size: 12),textColor: .white.withAlphaComponent(0.4))
         moreView.addSubview(label)
         label.snp.makeConstraints { make in
             make.leading.top.bottom.equalTo(0)

+ 7 - 8
AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVC.swift

@@ -9,17 +9,16 @@ class TSTextPicGennerateVC: TSAIPhotoGeneratorBaseVC {
     
     var imageModel:TSActionInfoModel?
     var complete:((TSActionInfoModel)->Void)
-    var aiText:String
-    var style:String
+
+    var viewModel:TSTextPicGennerateVM = TSTextPicGennerateVM(generateStyleModel: TSGenerateStyleModel())
     var progressState = TSProgressState.none
-    init(aiText: String,style: String,complete:@escaping ((TSActionInfoModel)->Void)) {
-        self.aiText = aiText
-        self.style = style
+    init(generateStyleModel: TSGenerateStyleModel,complete:@escaping ((TSActionInfoModel)->Void)) {
+        viewModel = TSTextPicGennerateVM(generateStyleModel: generateStyleModel)
         self.complete = complete
         super.init()
     }
     
-    var viewModel:TSTextPicGennerateVM = TSTextPicGennerateVM()
+  
     @MainActor required init?(coder: NSCoder) {
         fatalError("init(coder:) has not been implemented")
     }
@@ -83,7 +82,7 @@ class TSTextPicGennerateVC: TSAIPhotoGeneratorBaseVC {
             guard let self = self else { return }
         }{ return }
         
-        viewModel.creatImageEmoji(text:aiText,style: style)
+        viewModel.creatImageEmoji()
     }
     
 
@@ -101,7 +100,7 @@ class TSTextPicGennerateVC: TSAIPhotoGeneratorBaseVC {
     }
     
     override func dealThings() {
-        viewModel.creatImageEmoji(text: self.aiText,style: style)
+        viewModel.creatImageEmoji()
         viewModel.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self]  (state,model) in
             guard let self = self else { return }
             self.upDateView(state: state, model: model)

+ 18 - 7
AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVM.swift

@@ -19,9 +19,14 @@ class TSTextPicGennerateVM {
     var stopNetwork = false
    
     @Published var stateDatauPblished:(TSProgressState,TSActionInfoModel?) = (TSProgressState.none,nil)
-    var aiText:String = ""
     var generatingProgress = 0
     
+    
+    var generateStyleModel: TSGenerateStyleModel
+    init(generateStyleModel: TSGenerateStyleModel) {
+        self.generateStyleModel = generateStyleModel
+    }
+    
 //    //模拟数据
 //    //width 和 height 必须是 32 的倍数
 //    func creatImageEmoji(text:String,width:Int = Int(kTextPicW) ,height:Int = Int(kTextPicH)) {
@@ -53,22 +58,28 @@ class TSTextPicGennerateVM {
 //    }
     
     //width 和 height 必须是 32 的倍数
-    func creatImageEmoji(text:String,style:String,width:Int = Int(kTextPicW) ,height:Int = Int(kTextPicH)) {
+    func creatImageEmoji() {
         generatingProgress = 0
-        aiText = text
+    
+        var width = 800.0
+        var height = 1440.0
+        if let size = self.generateStyleModel.generateSize {
+            width = size.width
+            height = size.height
+        }
+
         let postDict:[String : Any] = [
-            "prompt":text,
+            "prompt":self.generateStyleModel.prompt,
             "width":width,
             "height":height,
-            "style":style,
+            "style":self.generateStyleModel.style,
             "device":getUserInfoJsonString()
         ]
         stateDatauPblished = (.start,nil)
         stateDatauPblished = (.progressString(generating(progress: 0.0)),nil)
         creatRequest = TSNetworkShared.post(urlType: .textPicCreate,parameters: postDict) { [weak self] data,error in
             guard let self = self else { return }
-            if let dataDict = data as? [String:Any] ,
-               dataDict.safeInt(forKey: "code") == 200,
+            if let dataDict = kNetWorkCodeSuccess(data: data),
                let actionId = dataDict["actionId"] as? Int{
                 if stopNetwork == false {
                     self.getActionInfo(action_id:actionId)

+ 1 - 2
AIEmoji/Common/NetworkManager/TSNetWork/TSNetWork+Business.swift

@@ -191,8 +191,7 @@ extension TSNetworkManager {
             guard let self = self else { return }
             switch result {
             case .success(let data):
-                if let dataDict = data as? [String:Any] ,
-                   dataDict.safeInt(forKey: "code") == 200,
+                if let dataDict = kNetWorkCodeSuccess(data: data),
                    let picUrl = dataDict["result"] as? String{
                     completion(picUrl,nil)
                 }else{

+ 20 - 4
AIEmoji/Common/NetworkManager/TSNetWork/TSNetworkManager.swift

@@ -336,13 +336,29 @@ extension TSNetworkManager {
 
 
 
+func kNetWorkCodeSuccess(data:Any?) -> [String:Any]? {
+    guard let data = data else { return nil }
+    if let dataDict = data as? [String:Any]{
+        let code = dataDict.safeInt(forKey: "code")
+        
+        switch code {
+        case 200://成功
+            return dataDict
+//        case 400://机器人提示
+//            TSAbnormalPopUpAlertVC.showRobotWarning()
+//            return nil
+        default:
+            return nil
+        }
+    }
+    return nil
+}
+
 
 
 func kNetWorkResultSuccess(data:Any?) -> [String:Any]? {
-    guard let data = data else { return nil }
-    if let dataDict = data as? [String:Any] ,
-       dataDict.safeInt(forKey: "code") == 200,
-       let result = dataDict["result"] as? [String:Any]{
+    guard let dataDict = kNetWorkCodeSuccess(data: data) else { return nil }
+    if let result = dataDict["result"] as? [String:Any]{
         return result
     }
     return nil

+ 1 - 2
AIEmoji/Common/Tool/OperationQueue/TSGenerateBaseOperation/TSGeneratePosterOperation.swift

@@ -199,8 +199,7 @@ class TSGeneratePTPOperation: TSGenerateBaseOperation , @unchecked Sendable{
                                                 ]) { [weak self] data,error in
             guard let self = self else { return }
             
-            if let dataDict = data as? [String:Any] ,
-               dataDict.safeInt(forKey: "code") == 200,
+            if let dataDict = kNetWorkCodeSuccess(data: data),
                let actionId = dataDict["actionId"] as? Int{
                 if stopNetwork == false {
                     self.stateDatauPblished = (.pending,nil) //通知首页进行更新

+ 5 - 0
AIEmoji/de.lproj/Localizable.strings

@@ -287,3 +287,8 @@
 "Chibi" = "Chibi";
 "Photo Enhancer" = "Foto-Enhancer";
 "Successfully generated" = "Erfolgreich generiert";
+
+"See all" = "Alle anzeigen";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "Es wurde ungewöhnlich hohe Generierungsaktivität festgestellt. Sie könnten ein Bot sein. Bitte versuchen Sie es morgen erneut.";
+"Got it" = "Verstanden";
+"Aspect Ratio" = "Seitenverhältnis";

+ 5 - 0
AIEmoji/en.lproj/Localizable.strings

@@ -284,3 +284,8 @@
 "Chibi" = "Chibi";
 "Photo Enhancer" = "Photo Enhancer";
 "Successfully generated" = "Successfully generated";
+
+"See all" = "See all";
+"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.";
+"Got it" = "Got it";
+"Aspect Ratio" = "Aspect Ratio";

+ 5 - 0
AIEmoji/es.lproj/Localizable.strings

@@ -284,3 +284,8 @@
 "Chibi" = "Chibi";
 "Photo Enhancer" = "Mejorador de fotos";
 "Successfully generated" = "Generado con éxito";
+
+"See all" = "Ver todos";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "Se ha detectado una frecuencia de generación inusualmente alta. Podría ser un bot. Por favor, inténtelo de nuevo mañana.";
+"Got it" = "Entendido";
+"Aspect Ratio" = "Relación de aspecto";

+ 5 - 0
AIEmoji/ja.lproj/Localizable.strings

@@ -283,3 +283,8 @@
 "Chibi" = "ちび";
 "Photo Enhancer" = "フォトエンハンサー";
 "Successfully generated" = "正常に生成されました";
+
+"See all" = "全て見る";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "生成頻度が異常に高いと検知されました。ボットの可能性があります。明日再度お試しください。";
+"Got it" = "了解しました";
+"Aspect Ratio" = "アスペクト比";

+ 5 - 0
AIEmoji/ko.lproj/Localizable.strings

@@ -289,3 +289,8 @@
 "Chibi" = "치비";
 "Photo Enhancer" = "사진 향상제";
 "Successfully generated" = "성공적으로 생성됨";
+
+"See all" = "모두 보기";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "생성 빈도가 비정상적으로 높게 감지되었습니다. 봇일 가능성이 있습니다. 내일 다시 시도해 주세요.";
+"Got it" = "확인했습니다";
+"Aspect Ratio" = "종횡비";

+ 5 - 0
AIEmoji/pt-BR.lproj/Localizable.strings

@@ -283,3 +283,8 @@
 "Chibi" = "Chibi";
 "Photo Enhancer" = "Melhorador de fotos";
 "Successfully generated" = "Gerado com sucesso";
+
+"See all" = "Ver todos";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "Detectamos uma frequência de geração anormalmente alta. Você pode ser um bot. Por favor, tente novamente amanhã.";
+"Got it" = "Entendido";
+"Aspect Ratio" = "Proporção";

+ 5 - 0
AIEmoji/pt-PT.lproj/Localizable.strings

@@ -283,3 +283,8 @@
 "Chibi" = "Chibi";
 "Photo Enhancer" = "Melhorador de fotos";
 "Successfully generated" = "Gerado com sucesso";
+
+"See all" = "Ver todos";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "Detectamos uma frequência de geração anormalmente alta. Você pode ser um bot. Por favor, tente novamente amanhã.";
+"Got it" = "Entendido";
+"Aspect Ratio" = "Proporção";

+ 5 - 0
AIEmoji/zh-Hans.lproj/Localizable.strings

@@ -284,3 +284,8 @@
 "Chibi" = "Q版";
 "Photo Enhancer" = "图片增强";
 "Successfully generated" = "生成成功";
+
+"See all" = "查看全部";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "检测到您的生成频率过高,您可能是机器人,请明日再来";
+"Got it" = "知道了";
+"Aspect Ratio" = "宽高比";

+ 5 - 0
AIEmoji/zh-Hant.lproj/Localizable.strings

@@ -275,3 +275,8 @@
 "Chibi" = "Q版";
 "Photo Enhancer" = "照片增強";
 "Successfully generated" = "生成成功";
+
+"See all" = "查看全部";
+"We've detected unusually high generation activity. You may be a bot. Please try again tomorrow." = "檢測到您的生成頻率過高,您可能是機器人,請明日再來";
+"Got it" = "知道了";
+"Aspect Ratio" = "寬高比";