Prechádzať zdrojové kódy

3.1(1)打包,改变年龄提测

100Years 6 dní pred
rodič
commit
b628c48f61
31 zmenil súbory, kde vykonal 738 pridanie a 41 odobranie
  1. 26 6
      AIEmoji.xcodeproj/project.pbxproj
  2. 22 0
      AIEmoji/Assets.xcassets/Common/launch_Ghiblimage.imageset/Contents.json
  3. BIN
      AIEmoji/Assets.xcassets/Common/launch_Ghiblimage.imageset/launch_Ghiblimage@2x.png
  4. BIN
      AIEmoji/Assets.xcassets/Common/launch_Ghiblimage.imageset/launch_Ghiblimage@3x.png
  5. 22 0
      AIEmoji/Assets.xcassets/Common/privacy_shield.imageset/Contents.json
  6. BIN
      AIEmoji/Assets.xcassets/Common/privacy_shield.imageset/privacy_shield@2x.png
  7. BIN
      AIEmoji/Assets.xcassets/Common/privacy_shield.imageset/privacy_shield@3x.png
  8. 3 3
      AIEmoji/Base.lproj/LaunchScreen.storyboard
  9. 2 1
      AIEmoji/Business/TSAILIstVC/TSAIAgeImageHintVC/TSAIListHintBaseVC.swift
  10. 2 1
      AIEmoji/Business/TSAILIstVC/TSAILIstVC/TSAILIstCell.swift
  11. 2 13
      AIEmoji/Business/TSAILIstVC/TSAILIstVC/TSAILIstVC.swift
  12. 19 6
      AIEmoji/Business/TSAILIstVC/TSAIListHistoryBaseVC/TSAIListHistoryBaseVC.swift
  13. 1 1
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPImageHintVC/TSPTPImageHintVC.swift
  14. 2 1
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/TSPTPInputVC.swift
  15. 187 0
      AIEmoji/Business/TSPTPGeneratorVC/TSUploadPhotoPrivacyAlertVC/TSUploadPhotoPrivacyAlertVC.swift
  16. 7 5
      AIEmoji/Business/TSSetingVC/SetingVC/TSSetingModel.swift
  17. 8 2
      AIEmoji/Business/TSSetingVC/SetingVC/TSSetingVC.swift
  18. 14 0
      AIEmoji/Business/TSSetingVC/SetingVC/TSSetingViewModel.swift
  19. 121 0
      AIEmoji/Business/TSSetingVC/TSAboutDataVC.swift
  20. 1 1
      AIEmoji/Business/TSSetingVC/TSBusinessWebVC/TSBusinessWebVC.swift
  21. 1 1
      AIEmoji/Common/Tool/TSCommonTool/TSCommonTool.swift
  22. 181 0
      AIEmoji/Common/View/UILabel/TSClickableLinkLabel.swift
  23. 13 0
      AIEmoji/de.lproj/Localizable.strings
  24. 13 0
      AIEmoji/en.lproj/Localizable.strings
  25. 13 0
      AIEmoji/es.lproj/Localizable.strings
  26. 13 0
      AIEmoji/ja.lproj/Localizable.strings
  27. 13 0
      AIEmoji/ko.lproj/Localizable.strings
  28. 13 0
      AIEmoji/pt-BR.lproj/Localizable.strings
  29. 13 0
      AIEmoji/pt-PT.lproj/Localizable.strings
  30. 13 0
      AIEmoji/zh-Hans.lproj/Localizable.strings
  31. 13 0
      AIEmoji/zh-Hant.lproj/Localizable.strings

+ 26 - 6
AIEmoji.xcodeproj/project.pbxproj

@@ -173,6 +173,9 @@
 		A8EEADE22D3E76110032C5A0 /* Dog🐕.json in Resources */ = {isa = PBXBuildFile; fileRef = A8EEADE12D3E760C0032C5A0 /* Dog🐕.json */; };
 		A8EEADE72D3E76860032C5A0 /* Drink🥤.json in Resources */ = {isa = PBXBuildFile; fileRef = A8EEADE62D3E767E0032C5A0 /* Drink🥤.json */; };
 		A8EEADE92D3E76D90032C5A0 /* Beauty👸.json in Resources */ = {isa = PBXBuildFile; fileRef = A8EEADE82D3E76D30032C5A0 /* Beauty👸.json */; };
+		A8F4134A2DA75863001E715A /* TSUploadPhotoPrivacyAlertVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F413482DA75863001E715A /* TSUploadPhotoPrivacyAlertVC.swift */; };
+		A8F4134C2DA75893001E715A /* TSClickableLinkLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F4134B2DA75893001E715A /* TSClickableLinkLabel.swift */; };
+		A8F4134E2DA75E9E001E715A /* TSAboutDataVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F4134D2DA75E92001E715A /* TSAboutDataVC.swift */; };
 		A8F7748B2D38E8B700AA6E93 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F774812D38E8B700AA6E93 /* AppDelegate.swift */; };
 		A8F7748E2D38E8B700AA6E93 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A8F774822D38E8B700AA6E93 /* Assets.xcassets */; };
 		A8F774902D38E8B700AA6E93 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A8F774852D38E8B700AA6E93 /* LaunchScreen.storyboard */; };
@@ -414,6 +417,9 @@
 		A8EEADE12D3E760C0032C5A0 /* Dog🐕.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "Dog🐕.json"; sourceTree = "<group>"; };
 		A8EEADE62D3E767E0032C5A0 /* Drink🥤.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "Drink🥤.json"; sourceTree = "<group>"; };
 		A8EEADE82D3E76D30032C5A0 /* Beauty👸.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "Beauty👸.json"; sourceTree = "<group>"; };
+		A8F413482DA75863001E715A /* TSUploadPhotoPrivacyAlertVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSUploadPhotoPrivacyAlertVC.swift; sourceTree = "<group>"; };
+		A8F4134B2DA75893001E715A /* TSClickableLinkLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSClickableLinkLabel.swift; sourceTree = "<group>"; };
+		A8F4134D2DA75E92001E715A /* TSAboutDataVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAboutDataVC.swift; sourceTree = "<group>"; };
 		A8F774692D38E8B000AA6E93 /* AIEmoji.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AIEmoji.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		A8F774812D38E8B700AA6E93 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		A8F774822D38E8B700AA6E93 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
@@ -963,6 +969,7 @@
 		A80EDDDC2D6EB17D003CD332 /* TSPTPGeneratorVC */ = {
 			isa = PBXGroup;
 			children = (
+				A8F413492DA75863001E715A /* TSUploadPhotoPrivacyAlertVC */,
 				A8BA76502DA515F9000B6707 /* TSPTPImageHintVC */,
 				A8BA763D2DA4C8F9000B6707 /* TSPTPInputVC */,
 				A83404CF2D9D16E400C140E4 /* TSAIPhotoGeneratorBaseVC */,
@@ -1371,6 +1378,14 @@
 			path = TSAIListHistoryBaseVC;
 			sourceTree = "<group>";
 		};
+		A8F413492DA75863001E715A /* TSUploadPhotoPrivacyAlertVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8F413482DA75863001E715A /* TSUploadPhotoPrivacyAlertVC.swift */,
+			);
+			path = TSUploadPhotoPrivacyAlertVC;
+			sourceTree = "<group>";
+		};
 		A8F774602D38E8B000AA6E93 = {
 			isa = PBXGroup;
 			children = (
@@ -1540,6 +1555,7 @@
 		A8F775152D38EB5D00AA6E93 /* TSSetingVC */ = {
 			isa = PBXGroup;
 			children = (
+				A8F4134D2DA75E92001E715A /* TSAboutDataVC.swift */,
 				A8F775482D3935D600AA6E93 /* TSBusinessWebVC */,
 				A8F775412D39344A00AA6E93 /* SetingVC */,
 			);
@@ -1674,6 +1690,7 @@
 		A8F776292D3A70AA00AA6E93 /* UILabel */ = {
 			isa = PBXGroup;
 			children = (
+				A8F4134B2DA75893001E715A /* TSClickableLinkLabel.swift */,
 				A8F7762A2D3A70AF00AA6E93 /* PaddedLabel.swift */,
 			);
 			path = UILabel;
@@ -1986,6 +2003,7 @@
 				A80EDD4D2D6C3F82003CD332 /* MarkdownStrikethrough.swift in Sources */,
 				A80EDD4E2D6C3F82003CD332 /* MarkdownUnescaping.swift in Sources */,
 				A80EDD4F2D6C3F82003CD332 /* MarkdownParser+UIKit.swift in Sources */,
+				A8F4134A2DA75863001E715A /* TSUploadPhotoPrivacyAlertVC.swift in Sources */,
 				A80EDD502D6C3F82003CD332 /* MarkdownFont+Traits.swift in Sources */,
 				A80EDD512D6C3F82003CD332 /* MarkdownCode.swift in Sources */,
 				A875870F2D81689A00286A66 /* TSPTPEnterView.swift in Sources */,
@@ -2008,6 +2026,7 @@
 				A80EDD5F2D6C3F82003CD332 /* MarkdownHeader+UIKit.swift in Sources */,
 				A80EDE062D6F3491003CD332 /* TSPTPBrowseVC.swift in Sources */,
 				A80EDD6A2D6C518E003CD332 /* TSChatMsgToolView.swift in Sources */,
+				A8F4134C2DA75893001E715A /* TSClickableLinkLabel.swift in Sources */,
 				A80EDD602D6C3F82003CD332 /* MarkdownElement.swift in Sources */,
 				A80EDD612D6C3F82003CD332 /* MarkdownLink+AppKit.swift in Sources */,
 				A80EDD622D6C3F82003CD332 /* MarkdownLink.swift in Sources */,
@@ -2034,6 +2053,7 @@
 				A80E72592D3FA67800C64288 /* TSWallpaperViewModel.swift in Sources */,
 				A89EA67D2D59F1AF000EB181 /* StreamPostRequest.swift in Sources */,
 				A80E722F2D3F3E1400C64288 /* TSDiyCanvasView.swift in Sources */,
+				A8F4134E2DA75E9E001E715A /* TSAboutDataVC.swift in Sources */,
 				A80E72672D409C7D00C64288 /* Template+More.swift in Sources */,
 				A89EA6AC2D5B3EFB000EB181 /* TSRealmManager.swift in Sources */,
 				A8BA76772DA68619000B6707 /* TSAIListHistoryBaseVM.swift in Sources */,
@@ -2182,12 +2202,12 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 4;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = AIEmoji/Info.plist;
-				INFOPLIST_KEY_CFBundleDisplayName = Ghiblii;
+				INFOPLIST_KEY_CFBundleDisplayName = Ghiblimage;
 				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Allow us to access photos to upload your photos to generate new styles.";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
@@ -2198,7 +2218,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 3.0;
+				MARKETING_VERSION = 3.1;
 				PRODUCT_BUNDLE_IDENTIFIER = com.girl.music.wallpaper;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
@@ -2221,12 +2241,12 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 4;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = AIEmoji/Info.plist;
-				INFOPLIST_KEY_CFBundleDisplayName = Ghiblii;
+				INFOPLIST_KEY_CFBundleDisplayName = Ghiblimage;
 				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Allow us to access photos to upload your photos to generate new styles.";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
@@ -2237,7 +2257,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 3.0;
+				MARKETING_VERSION = 3.1;
 				PRODUCT_BUNDLE_IDENTIFIER = com.girl.music.wallpaper;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";

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

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

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


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


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

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

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


BIN
AIEmoji/Assets.xcassets/Common/privacy_shield.imageset/privacy_shield@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_lab" translatesAutoresizingMaskIntoConstraints="NO" id="FfL-7D-71P">
-                                <rect key="frame" x="107.00000000000001" y="325" width="179.33333333333337" height="45.333333333333314"/>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="launch_Ghiblimage" translatesAutoresizingMaskIntoConstraints="NO" id="FfL-7D-71P">
+                                <rect key="frame" x="47.666666666666657" y="325" width="297.66666666666674" height="45.333333333333314"/>
                             </imageView>
                         </subviews>
                         <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
@@ -34,6 +34,6 @@
         </scene>
     </scenes>
     <resources>
-        <image name="launch_lab" width="179.33332824707031" height="45.333332061767578"/>
+        <image name="launch_Ghiblimage" width="297.66665649414062" height="45.333332061767578"/>
     </resources>
 </document>

+ 2 - 1
AIEmoji/Business/TSAILIstVC/TSAIAgeImageHintVC/TSAIListHintBaseVC.swift

@@ -28,11 +28,12 @@ class TSAIListHintBaseVC: TSBaseVC {
     
     
     lazy var noPromptsBtn: UIButton = {
-        let noPromptsBtn = UIButton.createButton(title: "No more prompts".localized,image: UIImage(named: "circle_unSelected"),font: .font(size: 11),titleColor: .white.withAlphaComponent(0.6)){ [weak self]  in
+        let noPromptsBtn = UIButton.createButton(title: "Do not show again".localized,image: UIImage(named: "circle_unSelected"),font: .font(size: 11),titleColor: .white.withAlphaComponent(0.6)){ [weak self]  in
             guard let self = self else { return }
             changeNoPromptsBtn()
         }
         noPromptsBtn.setImage(UIImage(named: "circle_selected"), for: .selected)
+//        noPromptsBtn.setTitleImageSpace(spacing: 4)
         return noPromptsBtn
     }()
     override func createView() {

+ 2 - 1
AIEmoji/Business/TSAILIstVC/TSAILIstVC/TSAILIstCell.swift

@@ -31,7 +31,8 @@ class TSAILIstCell: TSBaseCollectionCell {
     
     
     lazy var shadowImageView: UIImageView = {
-        let shadowImageView = UIImageView.createImageView(imageName: "alList_shadow")
+        let shadowImageView = UIImageView.createImageView(imageName: "alList_shadow",contentMode: .scaleToFill)
+        shadowImageView.alpha = 0.7
         return shadowImageView
     }()
     

+ 2 - 13
AIEmoji/Business/TSAILIstVC/TSAILIstVC/TSAILIstVC.swift

@@ -28,7 +28,7 @@ class TSAILIstVC: TSBaseVC {
             createItemModel(
                 leftImageName:"ailist_child",
                 leftTitle: "Back to Baby".localized,
-                leftSubTitle: "AI helps you go back to being a baby.".localized,
+                leftSubTitle: "AI helps you go back to being a baby".localized,
                 rightViewStyle: 0,
                 tapBlock: { [weak self] model, _, _ in
                    guard let self = self else { return }
@@ -62,21 +62,10 @@ class TSAILIstVC: TSBaseVC {
            make.left.equalTo(16)
        }
        
-       let keyboardBtn = UIButton.createButton(image: UIImage(named: "keyboard")) { [weak self]  in
-           guard let self = self else { return }
-           kPresentModalVC(target: self, modelVC: TSWallpaperVC())
-       }
-       navBarView.barView.addSubview(keyboardBtn)
-        keyboardBtn.snp.makeConstraints { make in
-           make.centerY.equalToSuperview()
-           make.trailing.equalTo(-16)
-           make.width.height.equalTo(24)
-       }
-       
        navBarView.barView.addSubview(vipBtn)
        vipBtn.snp.makeConstraints { make in
            make.centerY.equalToSuperview()
-           make.trailing.equalTo(-60)
+           make.trailing.equalTo(-16)
            make.width.height.equalTo(24)
        }
        

+ 19 - 6
AIEmoji/Business/TSAILIstVC/TSAIListHistoryBaseVC/TSAIListHistoryBaseVC.swift

@@ -68,10 +68,16 @@ class TSAIListHistoryBaseVC: TSBaseVC {
         return cp
     }()
     
+    lazy var pageNullView: TSPageNullView = {
+        let pageNullView = TSPageNullView()
+        pageNullView.isHidden = true
+        return pageNullView
+    }()
+    
     override func createData() {
         
     }
-    
+    var navRightBtn = UIButton()
     override func createView() {
         
         addNormalNavBarView()
@@ -81,23 +87,30 @@ class TSAIListHistoryBaseVC: TSBaseVC {
             titleString = title
         }
         setPageTitle(titleString)
-        _ = setNavigationItem("", imageName: "delete_white", direction: .right, action: #selector(clickNavRight))
-        
-        
+        navRightBtn = setNavigationItem("", imageName: "delete_white", direction: .right, action: #selector(clickNavRight))
+   
+        contentView.addSubview(pageNullView)
         contentView.addSubview(collectionComponent.collectionView)
         collectionComponent.collectionView.snp.makeConstraints { make in
             make.edges.equalToSuperview()
         }
         
+        updateView()
+    }
+    
+    
+    func updateView() {
         collectionComponent.clear()
         collectionComponent.reloadView(with:viewModel.colDataArray)
+        
+        navRightBtn.isHidden = viewModel.colDataArray.count <= 0
+        pageNullView.isHidden = viewModel.colDataArray.count > 0
     }
     
     @objc func clickNavRight() {
         showCustomAlert(message: "Are you sure to delete".localized, deleteHandler:  {
             self.viewModel.removeAllHistoryList()
-            self.collectionComponent.clear()
-            self.collectionComponent.reloadView(with: self.viewModel.colDataArray)
+            self.updateView()
         })
     }
     

+ 1 - 1
AIEmoji/Business/TSPTPGeneratorVC/TSPTPImageHintVC/TSPTPImageHintVC.swift

@@ -151,7 +151,7 @@ class TSPTPImageHintVC: TSBaseVC {
         }
         
         set {
-            UserDefaults.standard.set(newValue ? "1" : nil, forKey: "isFirstUploadImagePTP")
+            UserDefaults.standard.set(newValue ? nil : "1" , forKey: "isFirstUploadImagePTP")
             UserDefaults.standard.synchronize()
         }
     }

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

@@ -149,8 +149,8 @@ class TSPTPInputVC: TSBaseVC {
                 viewModel.upLoadImage = nil
                 uploadView.upLoadImage = nil
             }else{//添加
-                
                 if TSPTPImageHintVC.isShowUploadImageHint{
+                    TSPTPImageHintVC.isShowUploadImageHint = false
                     presentModalHintVC()
                 }else {
                     pickSinglePhoto()
@@ -435,6 +435,7 @@ extension TSPTPInputVC {
         }
         kPresentModalVC(target: self, modelVC: vc,transitionStyle: .crossDissolve)
     }
+    
     func setUpCusStackView(){
         
         collectionComponent.collectionView.addSubview(cusStackView)

+ 187 - 0
AIEmoji/Business/TSPTPGeneratorVC/TSUploadPhotoPrivacyAlertVC/TSUploadPhotoPrivacyAlertVC.swift

@@ -0,0 +1,187 @@
+//
+//  TSUploadPhotoPrivacyAlertVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/4/8.
+//
+
+class TSUploadPhotoPrivacyAlertVC: TSBaseVC {
+    
+    var clickHandle:(()->Void)?
+    lazy var cusStackView: TSCustomStackView = {
+        let cusStackView = TSCustomStackView(axis: .vertical,spacing: 0)
+        return cusStackView
+    }()
+    
+    
+    lazy var submitBtn: UIButton = {
+        let submitBtn = kCreateNormalSubmitBtn(title: "Accept".localized) { [weak self]  in
+            guard let self = self else { return }
+            dismiss()
+            clickHandle?()
+        }
+        submitBtn.cornerRadius = 24.0
+        return submitBtn
+    }()
+    
+    lazy var topImageTtileView: UIView = {
+        let topImageTtileView = UIView()
+        
+        let imageView:UIImageView = UIImageView.createImageView(imageName: "privacy_shield")
+        topImageTtileView.addSubview(imageView)
+        imageView.snp.makeConstraints { make in
+            make.trailing.equalTo(-23)
+            make.centerY.equalToSuperview()
+            make.width.equalTo(85)
+            make.height.equalTo(98)
+            make.top.bottom.equalTo(0)
+        }
+        
+        let textLabel = UILabel.createLabel(text: "We Value Your Privacy".localized,font: .font(name: .PoppinsBlackItalic,size: 24),textColor: .white,numberOfLines: 0)
+        topImageTtileView.addSubview(textLabel)
+        textLabel.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.trailing.equalTo(imageView.snp.leading).offset(-10)
+            make.centerY.equalToSuperview()
+        }
+        return topImageTtileView
+    }()
+    
+    
+    override func createView() {
+        setNavBarViewHidden(true)
+        
+        contentView.addSubview(submitBtn)
+        submitBtn.snp.makeConstraints { make in
+            make.centerX.equalToSuperview()
+            make.width.equalTo(250*kDesignScale)
+            make.height.equalTo(48)
+            make.bottom.equalTo(-10-k_Height_safeAreaInsetsBottom())
+        }
+        
+        contentView.addSubview(cusStackView)
+        cusStackView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.leading.trailing.equalToSuperview()
+            make.bottom.equalTo(submitBtn.snp.top).offset(-10)
+        }
+        
+
+        setUpUI()
+    }
+    
+    let lineSpacing = 6.0
+    func setUpUI(){
+        
+        cusStackView.addSpacing(height: 28+k_Height_StatusBar)
+        cusStackView.addSubviewToStack(topImageTtileView)
+        cusStackView.addSpacing(height: 23)
+        
+        let textLabel = UILabel.createLabel(text: "We need your consent to use this feature:".localized,font: .font(size: 16),textColor: .white,numberOfLines: 0)
+        textLabel.setLineSpacing(8)
+        cusStackView.addSubviewToStack(textLabel)
+        textLabel.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-35)
+        }
+        cusStackView.addSpacing(height: 16)
+        addTextInfo()
+        cusStackView.addSpacing(height: 16)
+        addTextPrivacy()
+    }
+
+    func addTextInfo(){
+        cusStackView.addSubviewToStack(getTextInfoCell(text: "This App is photo or video editors that allow you to edit portraits with highly realistic facial transformations. We do not use photos or videos you provide when you use the Apps for any reason other than to provide you with the editing functionality of the Apps.".localized))
+        
+        cusStackView.addSpacing(height: lineSpacing)
+        
+        cusStackView.addSubviewToStack(getTextInfoCell(text: "Every photo you select for editing will be encrypted and temporarily cached on cloud servers for image processing and face transformation.".localized))
+        
+        cusStackView.addSpacing(height: lineSpacing)
+        
+        cusStackView.addSubviewToStack(getTextInfoCell(text: "We use third-party cloud providers - Amazon Web Services - to process and edit photos and videos.".localized))
+        
+        cusStackView.addSpacing(height: lineSpacing)
+        
+        cusStackView.addSubviewToStack(getTextInfoCell(text: "Photos or videos only remain in the cloud for a maximum limited period of 24 to 48 hours, for improved performance and lower bandwidth allowing additional changes to recently selected photos or videos in an optimal manner.".localized))
+    }
+    
+    func getTextInfoCell(text:String) -> UIView {
+        
+        let bgView = UIView()
+        let pointView = UIView()
+        pointView.backgroundColor = .white.withAlphaComponent(0.7)
+        pointView.cornerRadius = 2
+        bgView.addSubview(pointView)
+        pointView.snp.makeConstraints { make in
+            make.top.equalTo(7)
+            make.leading.equalTo(22)
+            make.width.height.equalTo(4)
+        }
+        
+        let textLabel1 = UILabel.createLabel(text: text,font: .font(size: 14),textColor: .white.withAlphaComponent(0.7),numberOfLines: 0)
+        textLabel1.setLineSpacing(lineSpacing)
+        bgView.addSubview(textLabel1)
+        textLabel1.snp.makeConstraints { make in
+            make.top.bottom.equalToSuperview()
+            make.leading.equalTo(16+16)
+            make.trailing.equalTo(-16)
+        }
+        return bgView
+    }
+    
+    func addTextPrivacy(){
+        let bgView = UIView()
+        let fullText = "By clicking \"Accept\", you give explicit consent that our Privacy Policy. To learn more about how we handle your personal data and our third-party partners, please refer to our Privacy Policy."
+        let label = TSClickableLinkLabel()
+        label.translatesAutoresizingMaskIntoConstraints = false
+        label.setText(
+                    fullText,
+                    linkTexts: ["Privacy Policy"],
+                    highlightLastOccurrence: true, // 关键参数,只高亮最后一个匹配项
+                    lineSpacing: lineSpacing, // 设置行间距为8点
+                    normalAttributes: [
+                        .foregroundColor: UIColor.white.withAlphaComponent(0.8),
+                        .font: UIFont.font(size: 14)
+                    ],
+                    linkAttributes: [
+                        .foregroundColor: "#4E89FF".uiColor,
+                        .underlineStyle: NSUnderlineStyle.single.rawValue,
+                        .font: UIFont.font(size: 14)
+                    ]) { [weak self] linkText in
+                        guard let self = self else { return }
+                        print("Link tapped: \(linkText)")
+                        // 处理点击事件,例如打开隐私政策页面
+                        
+                        let vc = TSBusinessWebVC(urlType: .privacy)
+                        kPresentModalVC(target: self, modelVC: vc,transitionStyle:.crossDissolve)
+                    }
+ 
+        cusStackView.addSubviewToStack(bgView)
+        bgView.snp.makeConstraints { make in
+            make.leading.equalTo(0)
+            make.trailing.equalTo(0)
+        }
+
+        bgView.addSubview(label)
+        label.snp.makeConstraints { make in
+            make.top.bottom.equalToSuperview()
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+        }
+    }
+    
+    
+    static var isShowUploadImagePrivacyHint:Bool{
+        get {
+            return UserDefaults.standard.string(forKey: "isFirstUploadPhotoPrivacy") == nil
+        }
+        
+        set {
+            UserDefaults.standard.set(newValue ? nil : "1", forKey: "isFirstUploadPhotoPrivacy")
+            UserDefaults.standard.synchronize()
+        }
+    }
+
+}
+

+ 7 - 5
AIEmoji/Business/TSSetingVC/SetingVC/TSSetingModel.swift

@@ -6,12 +6,14 @@
 //
 
 enum SettingType: String, CaseIterable {
-    case howToUse = "How to add emojis to iMessages?"
-    case update = "Update Version"
-    case shareus = "Share us"
+    case AboutData = "About Data"
+    case removeCloudData = "Remove Cloud Data"
     case rateus = "Rate us"
-    case agreement = "Terms of Service"
+    case shareus = "Share us"
+    case update = "Update Version"
     case privacy = "Privacy Policy"
-//    case about = "About us"
+    case agreement = "Terms of Service"
     
+//    case about = "About us"
+//case howToUse = "How to add emojis to iMessages?"
 }

+ 8 - 2
AIEmoji/Business/TSSetingVC/SetingVC/TSSetingVC.swift

@@ -53,8 +53,8 @@ class TSSetingVC: TSBaseVC {
             }
             
             switch type {
-            case .howToUse:
-                viewModel.pushTutorials(parent: self)
+//            case .howToUse:
+//                viewModel.pushTutorials(parent: self)
             case .shareus:
                 viewModel.shareApp(parent: self)
             case .agreement:
@@ -64,6 +64,12 @@ class TSSetingVC: TSBaseVC {
             case .update:
                 viewModel.updateApp(parent: self)
                 break
+            case .removeCloudData:
+                viewModel.removeCloudData(parent: self)
+                break
+            case .AboutData:
+                viewModel.AboutData(parent: self)
+                break
 //            case .about:
 //                break
             case .rateus:

+ 14 - 0
AIEmoji/Business/TSSetingVC/SetingVC/TSSetingViewModel.swift

@@ -92,6 +92,20 @@ class TSSetingViewModel: ObservableObject {
             isViper = PurchaseManager.default.isVip
         }
     }
+    
+    func removeCloudData(parent: UIViewController) {
+        TSToastShared.showLoading(containerView: parent.view)
+        kDelayOnMainThread(5) {
+            TSToastShared.hideLoading()
+            kSavePhotoSuccesswShared.show(atView: parent.view,text: "Removed Successfully".localized,showViewBtn: false)
+        }
+    }
+    
+    func AboutData(parent: UIViewController) {
+        let vc = TSAboutDataVC()
+        vc.hidesBottomBarWhenPushed = true
+        parent.navigationController?.pushViewController(vc, animated: true)
+    }
 }
 
 extension UIImage {

+ 121 - 0
AIEmoji/Business/TSSetingVC/TSAboutDataVC.swift

@@ -0,0 +1,121 @@
+//
+//  TSAboutDataVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/4/9.
+//
+
+class TSAboutDataVC: TSBaseVC {
+    
+    var clickHandle:(()->Void)?
+    lazy var cusStackView: TSCustomStackView = {
+        let cusStackView = TSCustomStackView(axis: .vertical,spacing: 0)
+        return cusStackView
+    }()
+    
+    override func createView() {
+        addNormalNavBarView()
+        setPageTitle("About Data".localized)
+
+        contentView.addSubview(cusStackView)
+        cusStackView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.leading.trailing.equalToSuperview()
+            make.bottom.equalTo(0)
+        }
+
+        setUpUI()
+    }
+    
+    let lineSpacing = 6.0
+    func setUpUI(){
+        
+        cusStackView.addSpacing(height: 20)
+        addTextInfo()
+        cusStackView.addSpacing(height: 16)
+        addTextPrivacy()
+    }
+
+    func addTextInfo(){
+        cusStackView.addSubviewToStack(getTextInfoCell(text: "This App is photo or video editors that allow you to edit portraits with highly realistic facial transformations. We do not use photos or videos you provide when you use the Apps for any reason other than to provide you with the editing functionality of the Apps.".localized))
+        
+        cusStackView.addSpacing(height: lineSpacing)
+        
+        cusStackView.addSubviewToStack(getTextInfoCell(text: "Every photo you select for editing will be encrypted and temporarily cached on cloud servers for image processing and face transformation.".localized))
+        
+        cusStackView.addSpacing(height: lineSpacing)
+        
+        cusStackView.addSubviewToStack(getTextInfoCell(text: "We use third-party cloud providers - Amazon Web Services - to process and edit photos and videos.".localized))
+        
+        cusStackView.addSpacing(height: lineSpacing)
+        
+        cusStackView.addSubviewToStack(getTextInfoCell(text: "Photos or videos only remain in the cloud for a maximum limited period of 24 to 48 hours, for improved performance and lower bandwidth allowing additional changes to recently selected photos or videos in an optimal manner.".localized))
+    }
+    
+    func getTextInfoCell(text:String) -> UIView {
+        
+        let bgView = UIView()
+        let pointView = UIView()
+        pointView.backgroundColor = .white
+        pointView.cornerRadius = 2
+        bgView.addSubview(pointView)
+        pointView.snp.makeConstraints { make in
+            make.top.equalTo(7)
+            make.leading.equalTo(22)
+            make.width.height.equalTo(4)
+        }
+        
+        let textLabel1 = UILabel.createLabel(text: text,font: .font(size: 14),textColor: .white,numberOfLines: 0)
+        textLabel1.setLineSpacing(lineSpacing)
+        bgView.addSubview(textLabel1)
+        textLabel1.snp.makeConstraints { make in
+            make.top.bottom.equalToSuperview()
+            make.leading.equalTo(16+16)
+            make.trailing.equalTo(-16)
+        }
+        return bgView
+    }
+    
+    func addTextPrivacy(){
+        let bgView = UIView()
+        let fullText = "By clicking \"Accept\", you give explicit consent that our Privacy Policy. To learn more about how we handle your personal data and our third-party partners, please refer to our Privacy Policy."
+        let label = TSClickableLinkLabel()
+        label.translatesAutoresizingMaskIntoConstraints = false
+        label.setText(
+                    fullText,
+                    linkTexts: ["Privacy Policy"],
+                    highlightLastOccurrence: true, // 关键参数,只高亮最后一个匹配项
+                    lineSpacing: lineSpacing, // 设置行间距为8点
+                    normalAttributes: [
+                        .foregroundColor: UIColor.white.withAlphaComponent(0.8),
+                        .font: UIFont.font(size: 14)
+                    ],
+                    linkAttributes: [
+                        .foregroundColor: "#4E89FF".uiColor,
+                        .underlineStyle: NSUnderlineStyle.single.rawValue,
+                        .font: UIFont.font(size: 14)
+                    ]) { [weak self] linkText in
+                        guard let self = self else { return }
+                        print("Link tapped: \(linkText)")
+                        // 处理点击事件,例如打开隐私政策页面
+                        
+                        let vc = TSBusinessWebVC(urlType: .privacy)
+                        kPresentModalVC(target: self, modelVC: vc,transitionStyle:.crossDissolve)
+                    }
+ 
+        cusStackView.addSubviewToStack(bgView)
+        bgView.snp.makeConstraints { make in
+            make.leading.equalTo(0)
+            make.trailing.equalTo(0)
+        }
+
+        bgView.addSubview(label)
+        label.snp.makeConstraints { make in
+            make.top.bottom.equalToSuperview()
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+        }
+    }
+    
+}
+

+ 1 - 1
AIEmoji/Business/TSSetingVC/TSBusinessWebVC/TSBusinessWebVC.swift

@@ -10,7 +10,7 @@ import WebKit
 class TSBusinessWebVC: TSBaseVC , WKNavigationDelegate {
     
     enum UrlType:String {
-        case privacy = "http://100yearslater.com/AI-Chat-Privacy-Policy.html"
+        case privacy = "http://100yearslater.com/Privacy.html"
         case terms = "https://doc-hosting.flycricket.io/hahaemoji-terms-of-use/7488c423-9bb6-480e-9a38-f52fba511335/terms"
 
         func getTitle() -> String {

+ 1 - 1
AIEmoji/Common/Tool/TSCommonTool/TSCommonTool.swift

@@ -221,4 +221,4 @@ func kExecuteOnMainThread(_ block: @escaping () -> Void) {
     }
 }
 
-let kAppName:String = "Ghiblii"
+let kAppName:String = "Ghiblimage" //Ghiblii

+ 181 - 0
AIEmoji/Common/View/UILabel/TSClickableLinkLabel.swift

@@ -0,0 +1,181 @@
+//
+//  TSClickableLinkLabel.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/4/8.
+//
+
+import UIKit
+
+class TSClickableLinkLabel: UILabel {
+    
+    // MARK: - Properties
+    private var tapHandler: ((String) -> Void)?
+    private var linkRanges: [NSRange] = []
+    private var linkAttributes: [NSAttributedString.Key: Any] = [
+        .foregroundColor: UIColor.blue,
+        .underlineStyle: NSUnderlineStyle.single.rawValue
+    ]
+    private var normalAttributes: [NSAttributedString.Key: Any] = [
+        .foregroundColor: UIColor.black,
+        .font: UIFont.systemFont(ofSize: 16)
+    ]
+    private var lineSpacing: CGFloat = 0
+    
+    // MARK: - Initialization
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        setup()
+    }
+    
+    required init?(coder: NSCoder) {
+        super.init(coder: coder)
+        setup()
+    }
+    
+    private func setup() {
+        isUserInteractionEnabled = true
+        numberOfLines = 0
+        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
+        addGestureRecognizer(tapGesture)
+    }
+    
+    // MARK: - Public Methods
+    func setText(_ text: String,
+                 linkTexts: [String],
+                 highlightLastOccurrence: Bool = false,
+                 lineSpacing: CGFloat = 0,
+                 normalAttributes: [NSAttributedString.Key: Any]? = nil,
+                 linkAttributes: [NSAttributedString.Key: Any]? = nil,
+                 tapHandler: ((String) -> Void)? = nil) {
+        
+        self.lineSpacing = lineSpacing
+        
+        if let normalAttrs = normalAttributes {
+            self.normalAttributes = normalAttrs
+        }
+        
+        if let linkAttrs = linkAttributes {
+            self.linkAttributes = linkAttrs
+        }
+        
+        self.tapHandler = tapHandler
+        self.linkRanges.removeAll()
+        
+        // 创建段落样式,设置行间距
+        let paragraphStyle = NSMutableParagraphStyle()
+        paragraphStyle.lineSpacing = lineSpacing
+        
+        // 将段落样式添加到普通文本属性
+        var finalNormalAttributes = self.normalAttributes
+        finalNormalAttributes[.paragraphStyle] = paragraphStyle
+        
+        let attributedString = NSMutableAttributedString(string: text, attributes: finalNormalAttributes)
+        
+        // 查找并设置所有链接文本的样式
+        for linkText in linkTexts {
+            let ranges = rangesOfString(linkText, in: text)
+            
+            if highlightLastOccurrence, let lastRange = ranges.last {
+                // 只标记最后一个匹配项
+                var finalLinkAttributes = self.linkAttributes
+                finalLinkAttributes[.paragraphStyle] = paragraphStyle
+                attributedString.addAttributes(finalLinkAttributes, range: lastRange)
+                linkRanges.append(lastRange)
+            } else {
+                // 标记所有匹配项(原始行为)
+                for range in ranges {
+                    var finalLinkAttributes = self.linkAttributes
+                    finalLinkAttributes[.paragraphStyle] = paragraphStyle
+                    attributedString.addAttributes(finalLinkAttributes, range: range)
+                    linkRanges.append(range)
+                }
+            }
+        }
+        
+        attributedText = attributedString
+    }
+    
+    // 查找字符串中所有匹配的范围
+    private func rangesOfString(_ substring: String, in string: String) -> [NSRange] {
+        var ranges: [NSRange] = []
+        var searchRange = NSRange(location: 0, length: string.utf16.count)
+        
+        while searchRange.location < string.utf16.count {
+            let foundRange = (string as NSString).range(of: substring, options: [], range: searchRange)
+            if foundRange.location != NSNotFound {
+                ranges.append(foundRange)
+                searchRange.location = foundRange.location + foundRange.length
+                searchRange.length = string.utf16.count - searchRange.location
+            } else {
+                break
+            }
+        }
+        
+        return ranges
+    }
+    
+    // MARK: - Tap Handling
+    @objc private func handleTap(_ gesture: UITapGestureRecognizer) {
+        guard gesture.state == .ended else { return }
+        
+        let layoutManager = NSLayoutManager()
+        let textContainer = NSTextContainer(size: bounds.size)
+        let textStorage = NSTextStorage(attributedString: attributedText ?? NSAttributedString())
+        
+        layoutManager.addTextContainer(textContainer)
+        textStorage.addLayoutManager(layoutManager)
+        
+        textContainer.lineFragmentPadding = 0
+        textContainer.lineBreakMode = lineBreakMode
+        textContainer.maximumNumberOfLines = numberOfLines
+        
+        let location = gesture.location(in: self)
+        let textBoundingBox = layoutManager.usedRect(for: textContainer)
+        let textContainerOffset = CGPoint(
+            x: (bounds.width - textBoundingBox.width) * 0.5 - textBoundingBox.minX,
+            y: (bounds.height - textBoundingBox.height) * 0.5 - textBoundingBox.minY
+        )
+        
+        let locationInTextContainer = CGPoint(
+            x: location.x - textContainerOffset.x,
+            y: location.y - textContainerOffset.y
+        )
+        
+        let characterIndex = layoutManager.characterIndex(
+            for: locationInTextContainer,
+            in: textContainer,
+            fractionOfDistanceBetweenInsertionPoints: nil
+        )
+        
+        // 检查点击是否在链接范围内
+        for range in linkRanges {
+            if NSLocationInRange(characterIndex, range) {
+                let linkText = (textStorage.string as NSString).substring(with: range)
+                tapHandler?(linkText)
+                return
+            }
+        }
+    }
+    
+    // MARK: - 计算带行间距的文本高度
+    func calculateTextHeight(width: CGFloat) -> CGFloat {
+        guard let text = text else { return 0 }
+        
+        let paragraphStyle = NSMutableParagraphStyle()
+        paragraphStyle.lineSpacing = lineSpacing
+        
+        let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
+        let boundingBox = text.boundingRect(
+            with: constraintRect,
+            options: [.usesLineFragmentOrigin, .usesFontLeading],
+            attributes: [
+                .font: font ?? UIFont.systemFont(ofSize: 17),
+                .paragraphStyle: paragraphStyle
+            ],
+            context: nil
+        )
+        
+        return ceil(boundingBox.height)
+    }
+}

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

@@ -132,3 +132,16 @@
 "Bad photo examples" = "Beispiele für schlechte Fotos";
 "Group photos, covered faces, nudes" = "Gruppenfoto, verdecktes Gesicht, Nacktaufnahmen";
 "No Style" = "Kein Stil";
+
+"Remove Cloud Data" = "Cloud-Daten entfernen";
+"Removed Successfully" = "Erfolgreich entfernt";
+"Do not show again" = "Nicht mehr anzeigen";
+
+"No group photos, covered faces, nudes" = "Gesicht nicht verdecken. Gruppen- und Nacktfotos nicht erlaubt";
+"Single photo with face fully visible" = "Einzelfoto mit vollständig sichtbarem Gesicht";
+"Size ≤ 5mb" = "Größe ≤5MB";
+"AI helps you go back to being a baby" = "KI zeigt Ihr Baby-Ich";
+"Back to Baby" = "Zum Baby werden";
+"AI predicts what you look like in your old age." = "KI sagt Ihr Aussehen im Alter voraus";
+"Predicting Old Age" = "Alter vorhersagen";
+"About Data" = "Über Daten";

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

@@ -132,3 +132,16 @@
 "Bad photo examples" = "Bad photo examples";
 "Group photos, covered faces, nudes" = "Group photos, covered faces, nudes";
 "No Style" = "No Style";
+
+"Remove Cloud Data" = "Remove Cloud Data";
+"Removed Successfully" = "Removed Successfully";
+"Do not show again" = "Do not show again";
+
+"No group photos, covered faces, nudes" = "No group photos, covered faces, nudes";
+"Single photo with face fully visible" = "Single photo with face fully visible";
+"Size ≤ 5mb" = "Size ≤ 5MB";
+"AI helps you go back to being a baby" = "AI helps you go back to being a baby";
+"Back to Baby" = "Back to Baby";
+"AI predicts what you look like in your old age." = "AI predicts what you look like in your old age.";
+"Predicting Old Age" = "Predicting Old Age";
+"About Data" = "About Data";

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

@@ -132,3 +132,16 @@
 "Bad photo examples" = "Ejemplos de malas fotos";
 "Group photos, covered faces, nudes" = "Foto grupal, rostro cubierto, desnudo";
 "No Style" = "Sin estilo";
+
+"Remove Cloud Data" = "Eliminar datos de la nube";
+"Removed Successfully" = "Eliminado con éxito";
+"Do not show again" = "No volver a mostrar";
+
+"No group photos, covered faces, nudes" = "No cubras el rostro. Fotos grupales y desnudos no permitidos";
+"Single photo with face fully visible" = "Foto individual con el rostro completamente visible";
+"Size ≤ 5mb" = "Tamaño ≤5MB";
+"AI helps you go back to being a baby" = "La IA te devuelve a tu etapa de bebé";
+"Back to Baby" = "Convertir en bebé";
+"AI predicts what you look like in your old age." = "La IA predice tu apariencia en la vejez";
+"Predicting Old Age" = "Predecir vejez";
+"About Data" = "Acerca de los datos";

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

@@ -132,3 +132,16 @@
 "Bad photo examples" = "悪い写真の例";
 "Group photos, covered faces, nudes" = "集合写真、顔が隠れている、裸体";
 "No Style" = "スタイルがありません";
+
+"Remove Cloud Data" = "クラウドデータの削除";
+"Removed Successfully" = "正常に削除されました";
+"Do not show again" = "ヒントはもういらない";
+
+"No group photos, covered faces, nudes" = "顔を隠さないでください。集合写真・ヌード写真不可";
+"Single photo with face fully visible" = "顔全体がはっきり写った単身写真";
+"Size ≤ 5mb" = "サイズ≤5MB";
+"AI helps you go back to being a baby" = "AIがあなたを赤ちゃん時代に変身";
+"Back to Baby" = "ベイビーに戻る";
+"AI predicts what you look like in your old age." = "AIが予測する老後姿";
+"Predicting Old Age" = "老後予測";
+"About Data" = "データについて";

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

@@ -132,3 +132,16 @@
 "Bad photo examples" = "나쁜 사진 예시";
 "Group photos, covered faces, nudes" = "단체 사진, 얼굴 가려짐, 노출";
 "No Style" = "스타일 없음";
+
+"Remove Cloud Data" = "클라우드 데이터 제거";
+"Removed Successfully" = "성공적으로 제거되었습니다";
+"Do not show again" = "다시 표시하지 않음";
+
+"No group photos, covered faces, nudes" = "얼굴을 가리지 마세요. 단체 사진 및 누드 사진 불가";
+"Single photo with face fully visible" = "얼굴 전체가 선명하게 보이는 단독 사진";
+"Size ≤ 5mb" = "용량 ≤5MB";
+"AI helps you go back to being a baby" = "AI가 당신을 아기 시절로 돌려드립니다";
+"Back to Baby" = "아기로 변신";
+"AI predicts what you look like in your old age." = "AI가 예측하는 당신의 노년 모습";
+"Predicting Old Age" = "노년 모습 예측";
+"About Data" = "데이터에 대하여";

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

@@ -132,3 +132,16 @@
 "Bad photo examples" = "Exemplos de más fotos";
 "Group photos, covered faces, nudes" = "Foto em grupo, rosto coberto, nudez";
 "No Style" = "Sem estilo";
+
+"Remove Cloud Data" = "Remover dados da nuvem";
+"Removed Successfully" = "Removido com sucesso";
+"Do not show again" = "Não mostre novamente";
+
+"No group photos, covered faces, nudes" = "Não cubra o rosto. Fotos em grupo e nudez não permitidas";
+"Single photo with face fully visible" = "Foto individual com o rosto totalmente visível";
+"Size ≤ 5mb" = "Tamanho ≤5MB";
+"AI helps you go back to being a baby" = "IA recria sua aparência de bebê";
+"Back to Baby" = "Transformar em bebê";
+"AI predicts what you look like in your old age." = "IA prevê sua aparência na velhice";
+"Predicting Old Age" = "Prever velhice";
+"About Data" = "Sobre dados";

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

@@ -132,3 +132,16 @@
 "Bad photo examples" = "Exemplos de más fotos";
 "Group photos, covered faces, nudes" = "Foto em grupo, rosto coberto, nudez";
 "No Style" = "Sem estilo";
+
+"Remove Cloud Data" = "Remover dados da nuvem";
+"Removed Successfully" = "Removido com sucesso";
+"Do not show again" = "Não mostre novamente";
+
+"No group photos, covered faces, nudes" = "Não cubra o rosto. Fotos em grupo e nudez não permitidas";
+"Single photo with face fully visible" = "Foto individual com o rosto totalmente visível";
+"Size ≤ 5mb" = "Tamanho ≤5MB";
+"AI helps you go back to being a baby" = "IA recria sua aparência de bebê";
+"Back to Baby" = "Transformar em bebê";
+"AI predicts what you look like in your old age." = "IA prevê sua aparência na velhice";
+"Predicting Old Age" = "Prever velhice";
+"About Data" = "Sobre dados";

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

@@ -132,3 +132,16 @@
 "Bad photo examples" = "糟糕照片示例";
 "Group photos, covered faces, nudes" = "多人集体照、脸部遮挡、裸体";
 "No Style" = "无风格";
+
+"Remove Cloud Data" = "删除云数据";
+"Removed Successfully" = "删除成功";
+"Do not show again" = "不再提示";
+
+"No group photos, covered faces, nudes" = "不要遮挡脸部、集体照和裸体照";
+"Single photo with face fully visible" = "脸部完全清晰可见的单人照片";
+"Size ≤ 5mb" = "大小≤5MB";
+"AI helps you go back to being a baby" = "AI 帮你回到婴儿时期";
+"Back to Baby" = "变回婴儿";
+"AI predicts what you look like in your old age." = "AI 预测你晚年的模样";
+"Predicting Old Age" = "预测晚年";
+"About Data" = "关于数据";

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

@@ -128,3 +128,16 @@
 "Hyperrealistic macro view of dewdrops on spiderweb, morning sunlight creating rainbow spectra, blurred forest background with bokeh effects" = "蜘蛛網上露珠的超現實宏觀視圖、晨光創造彩虹光譜、模糊的森林背景與散景效果";
 "Cybernetic wildlife sanctuary at dawn, solar-panel trees powering force fields, robotic caretakers feeding holographic animals in savanna simulation" = "黎明時分的控制論野生動物保護區,太陽能電池板樹為力場提供動力,機器人看護者在稀樹草原類比中餵養全息動物";
 "Minimalist geometric landscape with gradient-colored pyramids, clean lines intersecting with organic cloud formations, symmetrical composition" = "極簡主義幾何景觀,漸變色金字塔,乾淨的線條與有機雲層相交,對稱的構圖";
+
+"Remove Cloud Data" = "刪除雲端數據";
+"Removed Successfully" = "刪除成功";
+"Do not show again" = "不再提示";
+
+"No group photos, covered faces, nudes" = "不要遮擋臉部、團體照和裸體照";
+"Single photo with face fully visible" = "臉部完全清晰可見的單人照片";
+"Size ≤ 5mb" = "大小≤5MB";
+"AI helps you go back to being a baby" = "AI 幫你回到嬰兒時期";
+"Back to Baby" = "變回嬰兒";
+"AI predicts what you look like in your old age." = "AI 預測你晚年的模樣";
+"Predicting Old Age" = "預測晚年";
+"About Data" = "關於數據";