Browse Source

fix:修复系列bug

kailen 1 week ago
parent
commit
f57fe7c33a
33 changed files with 307 additions and 54 deletions
  1. BIN
      AIEmoji/Assets.xcassets/.DS_Store
  2. 23 0
      AIEmoji/Assets.xcassets/Common/ic_creation_empty_bg.imageset/Contents.json
  3. BIN
      AIEmoji/Assets.xcassets/Common/ic_creation_empty_bg.imageset/ic_creation_empty_bg@1x.png
  4. BIN
      AIEmoji/Assets.xcassets/Common/ic_creation_empty_bg.imageset/ic_creation_empty_bg@2x.png
  5. BIN
      AIEmoji/Assets.xcassets/Common/ic_creation_empty_bg.imageset/ic_creation_empty_bg@3x.png
  6. BIN
      AIEmoji/Assets.xcassets/Discover/.DS_Store
  7. 23 0
      AIEmoji/Assets.xcassets/DiyVideo/ic_diy_upload_rect.imageset/Contents.json
  8. BIN
      AIEmoji/Assets.xcassets/DiyVideo/ic_diy_upload_rect.imageset/ic_diy_upload_rect@1x.png
  9. BIN
      AIEmoji/Assets.xcassets/DiyVideo/ic_diy_upload_rect.imageset/ic_diy_upload_rect@2x.png
  10. BIN
      AIEmoji/Assets.xcassets/DiyVideo/ic_diy_upload_rect.imageset/ic_diy_upload_rect@3x.png
  11. 1 1
      AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/View/TSPromptTextView.swift
  12. 1 1
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextGeneralPictureVC/ViewModel/TSTextGeneralPictureVM.swift
  13. 22 19
      AIEmoji/Business/VIewTool/TSPageNullView.swift
  14. 5 3
      AIEmoji/Business2/DIYVideo/Elements/TSBaseSegementElementView.swift
  15. 1 1
      AIEmoji/Business2/DIYVideo/Elements/TSDiyStyleElementView.swift
  16. 4 0
      AIEmoji/Business2/DIYVideo/Elements/TSDiyVideoUploadImageView.swift
  17. 1 1
      AIEmoji/Business2/DIYVideo/Elements/TSSegementElements.swift
  18. 7 7
      AIEmoji/Business2/DIYVideo/TSAIDiyVideoPTVVC/TSAIDiyVideoPTVVC.swift
  19. 1 1
      AIEmoji/Business2/DIYVideo/TSAIDiyVideoTTVVC/TSAIDiyVideoTTBaseVC.swift
  20. 9 8
      AIEmoji/Business2/DIYVideo/TSAIDiyVideoTTVVC/TSAIDiyVideoTTVVC.swift
  21. 10 8
      AIEmoji/Business2/DIYVideo/ViewModel/TSAIDiyVideoTTBaseViewModel.swift
  22. 1 1
      AIEmoji/Business2/DisCover/TSDiscoverVC/Cell/TSDiscoverBannerCell.swift
  23. 1 2
      AIEmoji/Business2/DisCover/TSPTPUploadImageVC/View/TSUploadImageView.swift
  24. 3 1
      AIEmoji/Common/NetworkManager/TSNetWork/TSNetWork+Business.swift
  25. 21 0
      AIEmoji/de.lproj/Localizable.strings
  26. 25 0
      AIEmoji/en.lproj/Localizable.strings
  27. 21 0
      AIEmoji/es.lproj/Localizable.strings
  28. 21 0
      AIEmoji/ja.lproj/Localizable.strings
  29. 21 0
      AIEmoji/ko.lproj/Localizable.strings
  30. 21 0
      AIEmoji/pt-BR.lproj/Localizable.strings
  31. 21 0
      AIEmoji/pt-PT.lproj/Localizable.strings
  32. 22 0
      AIEmoji/zh-Hans.lproj/Localizable.strings
  33. 21 0
      AIEmoji/zh-Hant.lproj/Localizable.strings

BIN
AIEmoji/Assets.xcassets/.DS_Store


+ 23 - 0
AIEmoji/Assets.xcassets/Common/ic_creation_empty_bg.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Common/ic_creation_empty_bg.imageset/ic_creation_empty_bg@1x.png


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


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


BIN
AIEmoji/Assets.xcassets/Discover/.DS_Store


+ 23 - 0
AIEmoji/Assets.xcassets/DiyVideo/ic_diy_upload_rect.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/DiyVideo/ic_diy_upload_rect.imageset/ic_diy_upload_rect@1x.png


BIN
AIEmoji/Assets.xcassets/DiyVideo/ic_diy_upload_rect.imageset/ic_diy_upload_rect@2x.png


BIN
AIEmoji/Assets.xcassets/DiyVideo/ic_diy_upload_rect.imageset/ic_diy_upload_rect@3x.png


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

@@ -76,7 +76,7 @@ class TSPromptTextView: TSBaseView {
         AIView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickAIView)))
 
         let iconImageView = UIImageView.createImageView(imageName: "deepseek_icon")
-        let aiInfoLabel = UILabel.createLabel(text: "Prompt Optimization", font: .font(size: 14), textColor: "#4D6BFE".uiColor, textAlignment: .left, numberOfLines: 1)
+        let aiInfoLabel = UILabel.createLabel(text: "Prompt Optimization".localized, font: .font(size: 14), textColor: "#4D6BFE".uiColor, textAlignment: .left, numberOfLines: 1)
         let arrowImageView = UIImageView.createImageView(imageName: "blue_down_arrow")
 
         AIView.addSubview(iconImageView)

+ 1 - 1
AIEmoji/Business/TSTextGeneralPictureVC/TSTextGeneralPictureVC/ViewModel/TSTextGeneralPictureVM.swift

@@ -28,7 +28,7 @@ let kRandomImageToVideoArray:[String] = [
     "Extreme sports action: a skateboarder performing tricks in slow motion, dust flying, with dramatic lighting and energetic pacing — dynamic and intense.",
     "A peaceful village with cherry blossoms falling, wind gently moving clotheslines, warm pastel colors — inspired by Studio Ghibli visual storytelling.",
     "A desolate alien planet with a cracked surface, twin moons in the sky, a lone explorer in a space suit walking slowly — dark, eerie, cinematic style.",
-    "Vaporwave city with grid floors, purple skies, palm trees and a glowing sunset — synthwave color palette with nostalgic retro-futuristic vibes.",
+    "A vibrant 1980s retro aesthetic city at night, glowing neon lights, purple and pink color palette, vintage cars driving on wet reflective streets, VHS filter, synthwave atmosphere, cyberpunk elements, palm trees swaying, chrome surfaces reflecting neon signs, cinematic lighting, 80s-style fashion, lo-fi grain",
     "A bustling urban street through time-lapse: people rushing by, clouds racing overhead, lights turning on at night — documentary and modern style.",
     "Floating islands drifting in the sky, upside-down waterfalls, and glowing whales flying through clouds — vivid colors, surreal and imaginative tone.",
 ]

+ 22 - 19
AIEmoji/Business/VIewTool/TSPageNullView.swift

@@ -5,41 +5,44 @@
 //  Created by 100Years on 2025/2/13.
 //
 
-
 class TSPageNullView: TSBaseView {
-
     lazy var imageView: UIImageView = {
-        return UIImageView.createImageView(imageName: "pageNull")
+        UIImageView.createImageView(imageName: "ic_creation_empty_bg")
     }()
-    
+     
     lazy var titleLabel: UILabel = {
-        let titleLabel = UILabel.createLabel(text:"No record".localized ,font:.font(size: 14.0),textColor: .white,textAlignment: .center,numberOfLines: 0)
+        let titleLabel = UILabel.createLabel(text: "No Creation yet".localized, font: .font(size: 16.0,weight: .medium), textColor: .white, textAlignment: .center, numberOfLines: 0)
+        return titleLabel
+    }()
+    lazy var detailLabel: UILabel = {
+        let titleLabel = UILabel.createLabel(text: "Your creations will be listed here".localized, font: .font(size: 14.0), textColor: .white.withAlphaComponent(0.6), textAlignment: .center, numberOfLines: 0)
         return titleLabel
     }()
-    
-    
+
 
     override func creatUI() {
-        
-        self.frame = CGRectMake(0, 0, k_ScreenWidth, k_ScreenHeight - k_Nav_Height)
-        
+        frame = CGRectMake(0, 0, k_ScreenWidth, k_ScreenHeight - k_Nav_Height)
         contentView.addSubview(imageView)
         imageView.snp.makeConstraints { make in
-            make.top.equalTo(151)
-            make.centerX.equalToSuperview()
-            make.width.height.equalTo(120)
+            make.top.equalToSuperview().offset(20)
+            make.horizontalEdges.equalToSuperview().inset(16)
+            make.height.equalTo(imageView.snp.width).multipliedBy(456.0 / 343.0)
         }
 
-        contentView.addSubview(titleLabel)
+        imageView.addSubview(titleLabel)
         titleLabel.snp.makeConstraints { make in
-            make.top.equalTo(imageView.snp.bottom)
+            make.centerX.equalToSuperview()
+            make.centerY.equalToSuperview().offset(-20)
             make.leading.equalTo(16)
             make.trailing.equalTo(-16)
-            make.height.equalTo(20)
         }
+        
+        imageView.addSubview(detailLabel)
+        detailLabel.snp.makeConstraints { make in
+            make.top.equalTo(titleLabel.snp.bottom).offset(12)
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
 
+        }
     }
-    
-    
-    
 }

+ 5 - 3
AIEmoji/Business2/DIYVideo/Elements/TSBaseSegementElementView.swift

@@ -37,7 +37,9 @@ class TSBaseSegementElementView: UIView, TSDiyVideoElement {
             frame: .zero,
             segments:
             LabelSegment.segments(
-                withTitles: type.getModelConfigSegments(aiModel: .ViduQ1),
+                withTitles: type.getModelConfigSegments(aiModel: .ViduQ1).map({
+                    $0.localized
+                }),
                 normalFont: .font(size: 12.0),
                 normalTextColor: .white.withAlphaComponent(0.8),
                 selectedFont: .font(size: 12.0, weight: .medium),
@@ -47,7 +49,7 @@ class TSBaseSegementElementView: UIView, TSDiyVideoElement {
                       .indicatorViewBorderWidth(1),
                       .indicatorViewBorderColor(UIColor.themeColor),
                       .indicatorViewInset(2),
-                      .cornerRadius(20),
+                      .cornerRadius(22),
                       .animationSpringDamping(1.0)]
         )
         segmentedView.addTarget(self, action: #selector(segmentedControlValueChanged(_:)), for: .valueChanged)
@@ -110,7 +112,7 @@ class TSBaseSegementElementView: UIView, TSDiyVideoElement {
         segmentedView.snp.makeConstraints { make in
             make.horizontalEdges.equalToSuperview().inset(10)
             make.top.equalTo(titleLabel.snp.bottom).offset(12)
-            make.height.equalTo(40)
+            make.height.equalTo(44)
             make.bottom.equalToSuperview()
         }
     }

+ 1 - 1
AIEmoji/Business2/DIYVideo/Elements/TSDiyStyleElementView.swift

@@ -100,7 +100,7 @@ class TSDiyStyleElementItem: UIView {
     var type: TSDiyStyleType
     lazy var bgImageView: UIImageView = .init(image: UIImage(named: type.imgName))
     lazy var maskBottom: UIView = .creatColor(color: .black.withAlphaComponent(0.5))
-    lazy var titleLabel: UILabel = .createLabel(text: type.rawValue, font: .font(size: 12), textColor: .white)
+    lazy var titleLabel: UILabel = .createLabel(text: type.rawValue.localized, font: .font(size: 12), textColor: .white)
     var isSelected: Bool = false {
         didSet {
             updateSelected()

+ 4 - 0
AIEmoji/Business2/DIYVideo/Elements/TSDiyVideoUploadImageView.swift

@@ -8,6 +8,10 @@
 import Foundation
 
 class TSDiyVideoUploadImageView: TSUploadImageView {
+    override func creatUI() {
+        super.creatUI()
+        self.bgImageView.image = .icDiyUploadRect
+    }
     override func makeConstraints() {
         let itemWidth = k_ScreenWidth - 56
         let itemHeight = itemWidth * (230.0 / 320.0)

+ 1 - 1
AIEmoji/Business2/DIYVideo/Elements/TSSegementElements.swift

@@ -29,7 +29,7 @@ class TSMovementElementView: TSBaseSegementElementView {
     }
     
     override var tipString: String {
-        "Auto: Fits your prompt automatically Small / Medium / Large: Manual amplitude selection"
+        "Auto: Fits your prompt automatically\nSmall / Medium / Large: Manual amplitude selection".localized
     }
     
     override var param: String {

+ 7 - 7
AIEmoji/Business2/DIYVideo/TSAIDiyVideoPTVVC/TSAIDiyVideoPTVVC.swift

@@ -6,7 +6,7 @@
 //
 
 class TSAIDiyVideoPTVVC: TSAIDiyVideoTTBaseVC, UIPopoverPresentationControllerDelegate {
-    lazy var aiModelView = TSAIModelElementView(frame: .zero)
+//    lazy var aiModelView = TSAIModelElementView(frame: .zero)
 
     lazy var promptTextView: TSDiyVideoPromptElementView = {
         let promptTextView = TSDiyVideoPromptElementView(randomTextArray: kRandomImageToVideoArray) { [weak self] _ in
@@ -43,9 +43,9 @@ class TSAIDiyVideoPTVVC: TSAIDiyVideoTTBaseVC, UIPopoverPresentationControllerDe
         return promptTextView
     }()
 
-    lazy var resolution = TSResolutionElementView(aiType: viewModel.selectedAiModelType)
-    lazy var length = TSVideoLengthElementView(aiType: viewModel.selectedAiModelType)
-    lazy var movement = TSMovementElementView(aiType: viewModel.selectedAiModelType)
+    lazy var resolution = TSResolutionElementView(aiType: .ViduQ1)
+    lazy var length = TSVideoLengthElementView(aiType: .ViduQ1)
+    lazy var movement = TSMovementElementView(aiType: .ViduQ1)
     lazy var aiVc : TSChatViewController = {
         let vc = TSChatViewController()
         vc.viewModel.uiStyle = .perfectHint
@@ -61,7 +61,7 @@ class TSAIDiyVideoPTVVC: TSAIDiyVideoTTBaseVC, UIPopoverPresentationControllerDe
 
     override var videoGenerateModel: TSAIDiyVideoGenerateModel {
         let model = TSAIDiyVideoGenerateModel()
-        model.model = aiModelView.param
+        model.model = TSDiyAiModelType.ViduQ1.param
         model.duration = Int(length.param) ?? 0
         model.movement = movement.param
         model.resolution = resolution.param
@@ -71,7 +71,7 @@ class TSAIDiyVideoPTVVC: TSAIDiyVideoTTBaseVC, UIPopoverPresentationControllerDe
 
     override var elements: [any TSDiyVideoElement] {
         [
-            aiModelView,
+//            aiModelView,
             promptTextView,
             resolution,
             length,
@@ -87,7 +87,7 @@ class TSAIDiyVideoPTVVC: TSAIDiyVideoTTBaseVC, UIPopoverPresentationControllerDe
 
     func addObservers() {
         viewModel.$selectedAiModelType.receive(on: DispatchQueue.main).sink { [weak self] type in
-            self?.aiModelView.updateType(type: type)
+//            self?.aiModelView.updateType(type: type)
             self?.length.updateAiModelType(aitype: type)
             self?.resolution.updateAiModelType(aitype: type)
         }.store(in: &cancellable)

+ 1 - 1
AIEmoji/Business2/DIYVideo/TSAIDiyVideoTTVVC/TSAIDiyVideoTTBaseVC.swift

@@ -14,7 +14,7 @@ class TSAIDiyVideoTTBaseVC: TSBaseVC {
 
     lazy var cusStackView: TSCustomStackView = {
         let cusStackView = TSCustomStackView(axis: .vertical, alignment: .center, spacing: 0)
-        cusStackView.scrollView.contentInset = .init(top: 0, left: 0, bottom: k_Height_safeAreaInsetsBottom() + 68, right: 0)
+        cusStackView.scrollView.contentInset = .init(top: 8, left: 0, bottom: k_Height_safeAreaInsetsBottom() + 68, right: 0)
         return cusStackView
     }()
 

+ 9 - 8
AIEmoji/Business2/DIYVideo/TSAIDiyVideoTTVVC/TSAIDiyVideoTTVVC.swift

@@ -6,7 +6,7 @@
 //
 
 class TSAIDiyVideoTTVVC: TSAIDiyVideoTTBaseVC, UIPopoverPresentationControllerDelegate {
-    lazy var aiModelView = TSAIModelElementView(frame: .zero)
+//    lazy var aiModelView = TSAIModelElementView(frame: .zero)
 
     lazy var promptTextView: TSDiyTextPromptElementView = {
         let promptTextView = TSDiyTextPromptElementView(randomTextArray: kRandomImageToVideoArray) { [weak self] _ in
@@ -48,16 +48,17 @@ class TSAIDiyVideoTTVVC: TSAIDiyVideoTTBaseVC, UIPopoverPresentationControllerDe
     }()
 
     lazy var style = TSDiyStyleElementView()
-    lazy var resolution = TSResolutionElementView(aiType: viewModel.selectedAiModelType)
-    lazy var length = TSVideoLengthElementView(aiType: viewModel.selectedAiModelType)
-    lazy var movement = TSMovementElementView(aiType: viewModel.selectedAiModelType)
-    lazy var aspectRadio = TSAspectRatioElementView(aiType: viewModel.selectedAiModelType)
+    lazy var resolution = TSResolutionElementView(aiType: .ViduQ1)
+    lazy var length = TSVideoLengthElementView(aiType: .ViduQ1)
+    lazy var movement = TSMovementElementView(aiType: .ViduQ1)
+    lazy var aspectRadio = TSAspectRatioElementView(aiType:  .ViduQ1)
 
     var viewModel: TSAIDiyVideoTTVViewModel = .init()
 
     override var videoGenerateModel: TSAIDiyVideoGenerateModel {
         let model = TSAIDiyVideoGenerateModel()
-        model.model = aiModelView.param
+//        model.model = aiModelView.param
+        model.model = TSDiyAiModelType.ViduQ1.param
         model.duration = Int(length.param) ?? 0
         model.movement = movement.param
         model.resolution = resolution.param
@@ -69,7 +70,7 @@ class TSAIDiyVideoTTVVC: TSAIDiyVideoTTBaseVC, UIPopoverPresentationControllerDe
 
     override var elements: [any TSDiyVideoElement] {
         [
-            aiModelView,
+//            aiModelView,
             promptTextView,
             style,
             resolution,
@@ -90,7 +91,7 @@ class TSAIDiyVideoTTVVC: TSAIDiyVideoTTBaseVC, UIPopoverPresentationControllerDe
 
     func addObservers() {
         viewModel.$selectedAiModelType.receive(on: DispatchQueue.main).sink { [weak self] type in
-            self?.aiModelView.updateType(type: type)
+//            self?.aiModelView.updateType(type: type)
             self?.length.updateAiModelType(aitype: type)
             self?.resolution.updateAiModelType(aitype: type)
         }.store(in: &cancellable)

+ 10 - 8
AIEmoji/Business2/DIYVideo/ViewModel/TSAIDiyVideoTTBaseViewModel.swift

@@ -13,22 +13,24 @@ class TSAIDiyVideoPTVViewModel {
     @Published var uploadImage: UIImage?
     @Published var prompt: String = ""
     @Published var didFinishEdit: Bool = false
-    
-    
+
     func judgeWasFinishedEdit() {
-        didFinishEdit = (uploadImage != nil && !prompt.isEmpty)
+        // 去除prompt前后的空白字符(包括空格、换行等),再判断是否为空
+        let trimmedPrompt = prompt.trimmingCharacters(in: .whitespacesAndNewlines)
+        // 只有当上传图片存在,且处理后的prompt不为空时,才视为完成编辑
+        didFinishEdit = (uploadImage != nil && !trimmedPrompt.isEmpty)
     }
-    
-   
 }
 
 class TSAIDiyVideoTTVViewModel {
     @Published var selectedAiModelType: TSDiyAiModelType = .ViduQ1
     @Published var prompt: String = ""
     @Published var didFinishEdit: Bool = false
-    
-    
+
     func judgeWasFinishedEdit() {
-        didFinishEdit = !prompt.isEmpty
+        // 去除prompt前后的空白字符(包括空格、换行等),再判断是否为空
+        let trimmedPrompt = prompt.trimmingCharacters(in: .whitespacesAndNewlines)
+        // 处理后的prompt不为空时,视为完成编辑
+        didFinishEdit = !trimmedPrompt.isEmpty
     }
 }

+ 1 - 1
AIEmoji/Business2/DisCover/TSDiscoverVC/Cell/TSDiscoverBannerCell.swift

@@ -257,7 +257,7 @@ class TSDiscoverBannerViewImageCell: TSBaseCollectionCell {
         textLabel.snp.makeConstraints { make in
             make.leading.equalTo(16)
             make.trailing.equalTo(-111)
-            make.bottom.equalTo(-65)//58
+            make.bottom.equalTo(-75)//58
             make.height.equalTo(52)
         }
 

+ 1 - 2
AIEmoji/Business2/DisCover/TSPTPUploadImageVC/View/TSUploadImageView.swift

@@ -79,13 +79,12 @@ class TSUploadImageView: TSBaseView {
         return uploadImageView
     }()
     
+    lazy var bgImageView = UIImageView.createImageView(image: .discoverUploadBg,contentMode: .scaleToFill)
     
     lazy var uploadImageBgView: UIView = {
         
         let bgView = UIView()
         bgView.addGestureRecognizer(UITapGestureRecognizer(target: self, action:#selector(clickBgView)))
-        
-        let bgImageView = UIImageView.createImageView(image: .discoverUploadBg,contentMode: .scaleToFill)
         bgView.addSubview(bgImageView)
         bgImageView.snp.makeConstraints { make in
             make.leading.bottom.trailing.top.equalTo(0)

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

@@ -103,7 +103,9 @@ enum TSNetWorkCode : Int {
     case generateToMax = -221211   //会员成次次数超限
     var errorMsg:String {
         switch self {
-        case .textSensitive,.imageSensitive:
+        case .textSensitive:
+            return "Your prompt may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy, please replace the photo and try again.".localized
+        case .imageSensitive:
             return "Your photo may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy, please replace the photo and try again.".localized
         case .networkError:
             return "No network, please check your network and try again.".localized

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

@@ -556,3 +556,24 @@
 "Invalid photo size, covered face, not a single person" = "Ungültige Fotogröße, verdecktes Gesicht, keine einzelne Person";
 
 "%d Video Effects & Video Generations" = "%d Videoeffekte und Videogenerationen";
+
+"Image to Video" = "Bild zu Video";
+"Text to Video" = "Text zu Video";
+"AI Model" = "KI-Modell";
+"Image&Prompt" = "Bild & Eingabeaufforderung";
+"Prompt" = "Prompt";
+"Resolution" = "Auflösung";
+"Video Length" = "Videolänge";
+"Style Preference" = "Stilpräferenz";
+"Movement Amplitude" = "Bewegungsamplitude";
+"Auto" = "Auto";
+"Small" = "Klein";
+"Medium" = "Medium";
+"Large" = "Groß";
+"General" = "Allgemein";
+"Animation" = "Animation";
+"Auto: Fits your prompt automatically\nSmall / Medium / Large: Manual amplitude selection" = "Auto: passt sich automatisch an Ihre Schlüsselwörter an \nKlein/Mittel/Groß: manuelle Auswahl";
+"Prompt Optimization" = "Schnelle Optimierung";
+"No Creation yet" = "Noch keine Kreation";
+"Your creations will be listed here" = "Ihre Kreationen werden hier aufgelistet";
+"Your prompt may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy." = "Ihre Eingabeaufforderung kann Urheberrechtsverletzungen, Nacktheit, Blut oder Gewalt enthalten, die nicht den Gesundheitsrichtlinien entsprechen.";

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

@@ -555,3 +555,28 @@
 "Invalid photo size, covered face, not a single person" = "Invalid photo size, covered face, not a single person";
 
 "%d Video Effects & Video Generations" = "%d Video Effects & Video Generations";
+
+"Image to Video" = "Image to Video";
+"Text to Video" = "Text to Video";
+"AI Model" =  "AI Model";
+"Image&Prompt" = "Image&Prompt";
+"Prompt" = "Prompt";
+"Resolution" = "Resolution";
+"Video Length" = "Video Length";
+"Style Preference" = "Style Preference";
+"Movement Amplitude" = "Movement Amplitude";
+"Auto" = "Auto";
+"Small" = "Small";
+"Medium" = "Medium";
+"Large" = "Large";
+"General" = "General";
+"Animation" = "Animation";
+"Auto: Fits your prompt automatically Small / Medium / Large: Manual amplitude selection" = "Auto: Fits your prompt automatically\n 
+Small / Medium / Large: Manual amplitude selection ";
+"Prompt Optimization" = "Prompt Optimization";
+"General" = "General";
+"Animation" = "Animation";
+
+"No Creation yet" = "No Creation yet";
+"Your creations will be listed here" = "Your creations will be listed here";
+"Your prompt may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy." = "Your prompt may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy.";

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

@@ -554,3 +554,24 @@
 "Invalid photo size, covered face, not a single person" = "Tamaño de foto no válido, cara cubierta, ni una sola persona";
 
 "%d Video Effects & Video Generations" = "%d Efectos de vídeo y generaciones de vídeo";
+
+"Image to Video" = "Imagen a vídeo";
+"Text to Video" = "Texto a vídeo";
+"AI Model" = "Modelo de IA";
+"Image&Prompt" = "Imagen y mensaje";
+"Prompt" = "Inmediato";
+"Resolution" = "Resolución";
+"Video Length" = "Duración del vídeo";
+"Style Preference" = "Preferencia de estilo";
+"Movement Amplitude" = "Amplitud de movimiento";
+"Auto" = "Auto";
+"Small" = "Pequeño";
+"Medium" = "Medio";
+"Large" = "Grande";
+"General" = "General";
+"Animation" = "Animación";
+"Auto: Fits your prompt automatically\nSmall / Medium / Large: Manual amplitude selection" = "Auto: se adapta automáticamente a sus palabras clave\nPequeño/Mediano/Grande: selección manual";
+"Prompt Optimization" = "Optimización rápida";
+"No Creation yet" = "Aún no hay creación";
+"Your creations will be listed here" = "Tus creaciones aparecerán aquí";
+"Your prompt may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy." = "Su mensaje puede contener infracciones de derechos de autor, desnudez, sangre o violencia que no cumpla con la Política de salud.";

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

@@ -553,3 +553,24 @@
 "Invalid photo size, covered face, not a single person" = "写真のサイズが無効、顔が隠れている、人物が写っていない";
 
 "%d Video Effects & Video Generations" = "%d 個のビデオ効果とビデオ生成";
+
+"Image to Video" = "図生動画";
+"Text to Video" = "文生動画";
+"AI Model" = "AI モデル";
+"Image&Prompt" = "画像&キーワード";
+"Prompt" = "キーワード";
+"Resolution" = "解像度";
+"Video Length" = "動画の長さ";
+"Style Preference" = "スタイルの好み";
+"Movement Amplitude" = "動きの幅";
+"Auto" = "自動";
+"Small" = "小";
+"Medium" = "中";
+"Large" = "大";
+"General" = "写実";
+"Animation" = "アニメーション";
+"Auto: Fits your prompt automatically\nSmall / Medium / Large: Manual amplitude selection" = "自動:キーワードに自動的に適応します\n小/中/大:手動で選択します";
+"Prompt Optimization" = "キーワード最適化";
+"No Creation yet" = "まだ創造はありません";
+"Your creations will be listed here" = "あなたの作品はここに掲載されます";
+"Your prompt may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy." = "プロンプトには、健康ポリシーに準拠していない著作権侵害、ヌード、流血、暴力が含まれる可能性があります。";

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

@@ -557,3 +557,24 @@
 "Invalid photo size, covered face, not a single person" = "잘못된 사진 크기, 얼굴 가려짐, 사람 한 명 없음";
 
 "%d Video Effects & Video Generations" = "%d 비디오 효과 및 비디오 생성";
+
+"Image to Video" = "이미지부터 동영상";
+"Text to Video" = "텍스트부터 동영상";
+"AI Model" = "AI 모델";
+"Image&Prompt" = "이미지 & 키워드";
+"Prompt" = "키워드";
+"Resolution" = "해상도";
+"Video Length" = "동영상 길이";
+"Style Preference" = "스타일 선호도";
+"Movement Amplitude" = "움직임 범위";
+"Auto" = "자동";
+"Small" = "작음";
+"Medium" = "중간";
+"Large" = "크기";
+"General" = "실사";
+"Animation" = "애니메이션";
+"Auto: Fits your prompt automatically\nSmall / Medium / Large: Manual amplitude selection" = "자동: 키워드에 자동으로 적응합니다\n소/중/대: 수동으로 선택합니다";
+"Prompt Optimization" = "키워드 최적화";
+"No Creation yet" = "아직 창조되지 않았습니다";
+"Your creations will be listed here" = "귀하의 창작물이 여기에 나열됩니다.";
+"Your prompt may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy." = "귀하의 프롬프트에는 건강 정책을 준수하지 않는 저작권 침해, 누드, 유혈 또는 폭력이 포함될 수 있습니다.";

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

@@ -553,3 +553,24 @@
 "Invalid photo size, covered face, not a single person" = "Tamanho de foto inválido, rosto coberto, nenhuma pessoa";
 
 "%d Video Effects & Video Generations" = "%d Efeitos de Vídeo e Gerações de Vídeo";
+
+"Image to Video" = "Imagem para vídeo";
+"Text to Video" = "Texto para vídeo";
+"AI Model" = "Modelo de IA";
+"Image&Prompt" = "Imagem e Prompt";
+"Prompt" = "Incitar";
+"Resolution" = "Resolução";
+"Video Length" = "Duração do vídeo";
+"Style Preference" = "Preferência de estilo";
+"Movement Amplitude" = "Amplitude de movimento";
+"Auto" = "Auto";
+"Small" = "Pequeno";
+"Medium" = "Médio";
+"Large" = "Grande";
+"General" = "Em geral";
+"Animation" = "Animação";
+"Auto: Fits your prompt automatically\nSmall / Medium / Large: Manual amplitude selection" = "Automático: adapta-se automaticamente às suas palavras-chave\nPequeno/Médio/Grande: seleção manual";
+"Prompt Optimization" = "Otimização rápida";
+"No Creation yet" = "Nenhuma criação ainda";
+"Your creations will be listed here" = "Suas criações serão listadas aqui";
+"Your prompt may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy." = "Seu prompt pode conter violação de direitos autorais, nudez, sangue ou violência que não estejam em conformidade com a Política de Saúde.";

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

@@ -552,3 +552,24 @@
 "Invalid photo size, covered face, not a single person" = "Tamanho de foto inválido, rosto coberto, nenhuma pessoa";
 
 "%d Video Effects & Video Generations" = "%d Efeitos de Vídeo e Gerações de Vídeo";
+
+"Image to Video" = "Imagem para vídeo";
+"Text to Video" = "Texto para vídeo";
+"AI Model" = "Modelo de IA";
+"Image&Prompt" = "Imagem e Prompt";
+"Prompt" = "Incitar";
+"Resolution" = "Resolução";
+"Video Length" = "Duração do vídeo";
+"Style Preference" = "Preferência de estilo";
+"Movement Amplitude" = "Amplitude de movimento";
+"Auto" = "Auto";
+"Small" = "Pequeno";
+"Medium" = "Médio";
+"Large" = "Grande";
+"General" = "Em geral";
+"Animation" = "Animação";
+"Auto: Fits your prompt automatically\nSmall / Medium / Large: Manual amplitude selection" = "Automático: adapta-se automaticamente às suas palavras-chave\nPequeno/Médio/Grande: seleção manual";
+"Prompt Optimization" = "Otimização rápida";
+"No Creation yet" = "Nenhuma criação ainda";
+"Your creations will be listed here" = "Suas criações serão listadas aqui";
+"Your prompt may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy." = "Seu prompt pode conter violação de direitos autorais, nudez, sangue ou violência que não estejam em conformidade com a Política de Saúde.";

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

@@ -554,3 +554,25 @@
 "Invalid photo size, covered face, not a single person" = "照片尺寸无效,脸部被遮住,不是单人照片";
 
 "%d Video Effects & Video Generations" = "%d 视频特效和视频生成";
+
+"Image to Video" = "图生视频";
+"Text to Video" = "文生视频";
+"AI Model" = "AI 模型";
+"Image&Prompt" = "图片&关键词";
+"Prompt" = "关键词";
+"Resolution" = "分辨率";
+"Video Length" = "视频长度";
+"Style Preference" = "风格偏好";
+"Movement Amplitude" = "运动幅度";
+"Auto" = "自动";
+"Small" = "小";
+"Medium" = "中";
+"Large" = "大";
+"General" = "写实";
+"Animation" = "动画";
+"Auto: Fits your prompt automatically\nSmall / Medium / Large: Manual amplitude selection" = "自动:自动适应您的关键词\n小/中/大:手动选择";
+"Prompt Optimization" = "关键词优化";
+
+"No Creation yet" = "尚未创建";
+"Your creations will be listed here" = "您的作品将在这里列出";
+"Your prompt may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy." = "您的提示可能包含不符合健康政策的版权侵权、裸体、血腥或暴力内容。";

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

@@ -543,3 +543,24 @@
 "Invalid photo size, covered face, not a single person" = "照片尺寸無效,臉部被遮住,不是單人照片";
 
 "%d Video Effects & Video Generations" = "%d視頻特效和視頻生成";
+
+"Image to Video" = "圖生視頻";
+"Text to Video" = "文生視頻";
+"AI Model" = "AI模型";
+"Image&Prompt" = "圖片&關鍵字";
+"Prompt" = "關鍵字";
+"Resolution" = "分辯率";
+"Video Length" = "視頻長度";
+"Style Preference" = "風格偏好";
+"Movement Amplitude" = "運動幅度";
+"Auto" = "自動";
+"Small" = "小";
+"Medium" = "中";
+"Large" = "大";
+"General" = "寫實";
+"Animation" = "動畫";
+"Auto: Fits your prompt automatically\nSmall / Medium / Large: Manual amplitude selection" = "自動:自動適應您的關鍵字\n小/中/大:手動選擇";
+"Prompt Optimization" = "關鍵字優化";
+"No Creation yet" = "尚未創建";
+"Your creations will be listed here" = "您的作品將在這裡列出";
+"Your prompt may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy." = "您的提示可能包含侵犯版權、裸體、血腥或不符合健康政策的暴力。";