100Years vor 1 Woche
Ursprung
Commit
16ecec3468
68 geänderte Dateien mit 1412 neuen und 247 gelöschten Zeilen
  1. 85 6
      AIEmoji.xcodeproj/project.pbxproj
  2. 55 47
      AIEmoji/AppDelegate.swift
  3. BIN
      AIEmoji/Assets.xcassets/PTP/ptp_upload_example.imageset/ptp_upload_example@2x.png
  4. BIN
      AIEmoji/Assets.xcassets/PTP/ptp_upload_example.imageset/ptp_upload_example@3x.png
  5. BIN
      AIEmoji/Assets.xcassets/PTP/textToEmoji_banner.imageset/textToEmoji_banner@2x.png
  6. BIN
      AIEmoji/Assets.xcassets/PTP/textToEmoji_banner.imageset/textToEmoji_banner@3x.png
  7. 1 1
      AIEmoji/Assets.xcassets/PTP/textToPhoto_banner.imageset/Contents.json
  8. BIN
      AIEmoji/Assets.xcassets/PTP/textToPhoto_banner.imageset/textToEmoji_banner@3x.png
  9. BIN
      AIEmoji/Assets.xcassets/PTP/textToPhoto_banner.imageset/textToPhoto_banner@2x.png
  10. BIN
      AIEmoji/Assets.xcassets/PTP/textToPhoto_banner.imageset/textToPhoto_banner@3x.png
  11. 1 1
      AIEmoji/Business/AIChat/TSAIChatHistoryVC/VM/TSAIChatHistoryVM.swift
  12. 1 1
      AIEmoji/Business/AIChat/TSChatViewController/TSChatInputBarVC/TSChatInputBarVC.swift
  13. 1 1
      AIEmoji/Business/AIChat/TSChatViewController/TSChatInputBarVC/TSChatInputFullScreenVC.swift
  14. 4 0
      AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+ChatDelegate.swift
  15. 3 2
      AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+SendMsg.swift
  16. 1 1
      AIEmoji/Business/AIChat/TSChatViewController/ViewModel/TSAIChatVM.swift
  17. 1 1
      AIEmoji/Business/General/TSBigIconBrowseVC/TSBigIconBrowseVC.swift
  18. 1 1
      AIEmoji/Business/General/TSSmallIconBrowseVC/TSSmallIconBrowseVC.swift
  19. 1 1
      AIEmoji/Business/LaunchVC/TSBootPageVC.swift
  20. 36 30
      AIEmoji/Business/LaunchVC/TSLaunchVC.swift
  21. 3 3
      AIEmoji/Business/TSGenmojiVC/TSGenmojiGennerateVC/TSGenmojiGennerateVC.swift
  22. 1 6
      AIEmoji/Business/TSGenmojiVC/TSGenmojiGennerateVC/TSGenmojiGennerateViewModel.swift
  23. 0 1
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/TSGenmojiVC.swift
  24. 3 3
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiGennerateCell.swift
  25. 1 1
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiItemCell.swift
  26. 2 2
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/TSPTPGeneratorVC.swift
  27. 3 7
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/VM/TSPTPGeneratorVM.swift
  28. 1 1
      AIEmoji/Business/TSPTPGeneratorVC/TSPhotoToPhotoVC/Cell/TSPTPSelectStyleCell.swift
  29. 11 3
      AIEmoji/Business/TSPTPGeneratorVC/TSPhotoToPhotoVC/Cell/TSPTPUploadCell.swift
  30. 69 12
      AIEmoji/Business/TSPTPGeneratorVC/TSPhotoToPhotoVC/TSPhotoToPhotoVC.swift
  31. 19 17
      AIEmoji/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift
  32. 6 5
      AIEmoji/Business/TSSetingVC/SetingVC/View/SettingPurchaseTopView.swift
  33. 1 1
      AIEmoji/Business/TSSetingVC/SetingVC/View/TSSettingListView.swift
  34. 2 2
      AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/View/TSPromptTextView.swift
  35. 3 17
      AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/View/TSTTPStyleView.swift
  36. 1 1
      AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/View/TSTitleView.swift
  37. 1 1
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextGeneralPictureVC/TSTextGeneralPictureVC.swift
  38. 1 1
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextGeneralPictureVC/View/TSTTPSelectStyleCell.swift
  39. 2 2
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVC.swift
  40. 2 6
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVM.swift
  41. 1 1
      AIEmoji/Business/VIewTool/TSCommonloadingView.swift
  42. 8 7
      AIEmoji/Common/GlobalImports/GlobalImports.swift
  43. 31 0
      AIEmoji/Common/Tool/TSPhotoSizeHelper.swift
  44. 40 40
      AIEmoji/Common/View/TSPhotoPickerManager/TSPhotoPickerManager.swift
  45. 0 6
      AIEmoji/Res/photo_to_photo_style.json
  46. 2 8
      AIEmoji/Res/text_to_photo_style.json
  47. 10 0
      AIEmoji/de.lproj/InfoPlist.strings
  48. 1 0
      AIEmoji/de.lproj/LaunchScreen.strings
  49. 116 0
      AIEmoji/de.lproj/Localizable.strings
  50. 10 0
      AIEmoji/en.lproj/InfoPlist.strings
  51. 116 0
      AIEmoji/en.lproj/Localizable.strings
  52. 10 0
      AIEmoji/es.lproj/InfoPlist.strings
  53. 1 0
      AIEmoji/es.lproj/LaunchScreen.strings
  54. 116 0
      AIEmoji/es.lproj/Localizable.strings
  55. 10 0
      AIEmoji/ja.lproj/InfoPlist.strings
  56. 1 0
      AIEmoji/ja.lproj/LaunchScreen.strings
  57. 116 0
      AIEmoji/ja.lproj/Localizable.strings
  58. 10 0
      AIEmoji/ko.lproj/InfoPlist.strings
  59. 1 0
      AIEmoji/ko.lproj/LaunchScreen.strings
  60. 116 0
      AIEmoji/ko.lproj/Localizable.strings
  61. 10 0
      AIEmoji/pt-BR.lproj/InfoPlist.strings
  62. 1 0
      AIEmoji/pt-BR.lproj/LaunchScreen.strings
  63. 117 0
      AIEmoji/pt-BR.lproj/Localizable.strings
  64. 1 0
      AIEmoji/pt-PT.lproj/LaunchScreen.strings
  65. 117 0
      AIEmoji/pt-PT.lproj/Localizable.strings
  66. 10 0
      AIEmoji/zh-Hans.lproj/InfoPlist.strings
  67. 1 0
      AIEmoji/zh-Hans.lproj/LaunchScreen.strings
  68. 116 0
      AIEmoji/zh-Hans.lproj/Localizable.strings

+ 85 - 6
AIEmoji.xcodeproj/project.pbxproj

@@ -99,6 +99,9 @@
 		A83404D92D9D34ED00C140E4 /* Kelsi-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = A83404D72D9D34ED00C140E4 /* Kelsi-Regular.otf */; };
 		A83404DB2D9D382200C140E4 /* AccentURW-Reg.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A83404DA2D9D382200C140E4 /* AccentURW-Reg.ttf */; };
 		A83404DD2D9E1D8C00C140E4 /* ImagesAnimateScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83404DC2D9E1D8C00C140E4 /* ImagesAnimateScrollView.swift */; };
+		A83404FE2DA35BFE00C140E4 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A83404FC2DA35BFE00C140E4 /* Localizable.strings */; };
+		A83405032DA35CB700C140E4 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = A83405012DA35CB700C140E4 /* InfoPlist.strings */; };
+		A83405202DA3ADA900C140E4 /* TSPhotoSizeHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = A834051F2DA3ADA600C140E4 /* TSPhotoSizeHelper.swift */; };
 		A85E478F2D67115A0018D62D /* TSTextGeneralPictureVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85E478E2D6711590018D62D /* TSTextGeneralPictureVC.swift */; };
 		A85E47922D6728A00018D62D /* TSTextGeneralPictureVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85E47912D67289F0018D62D /* TSTextGeneralPictureVM.swift */; };
 		A85E47962D672ADA0018D62D /* TSTextPicGennerateVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85E47952D672AD90018D62D /* TSTextPicGennerateVC.swift */; };
@@ -299,6 +302,30 @@
 		A83404D72D9D34ED00C140E4 /* Kelsi-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Kelsi-Regular.otf"; sourceTree = "<group>"; };
 		A83404DA2D9D382200C140E4 /* AccentURW-Reg.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "AccentURW-Reg.ttf"; sourceTree = "<group>"; };
 		A83404DC2D9E1D8C00C140E4 /* ImagesAnimateScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagesAnimateScrollView.swift; sourceTree = "<group>"; };
+		A83404FD2DA35BFE00C140E4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
+		A83405022DA35CB700C140E4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		A83405052DA3717300C140E4 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = "<group>"; };
+		A83405062DA3717300C140E4 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
+		A83405072DA3717300C140E4 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
+		A83405092DA381A100C140E4 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
+		A834050A2DA381A100C140E4 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		A834050B2DA381A100C140E4 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = "<group>"; };
+		A834050C2DA381AD00C140E4 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
+		A834050D2DA381AE00C140E4 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		A834050E2DA381AE00C140E4 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; };
+		A834050F2DA3826000C140E4 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/LaunchScreen.strings"; sourceTree = "<group>"; };
+		A83405102DA3826000C140E4 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
+		A83405112DA3826000C140E4 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = "<group>"; };
+		A83405122DA3826600C140E4 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/LaunchScreen.strings"; sourceTree = "<group>"; };
+		A83405132DA3826600C140E4 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
+		A83405142DA3826600C140E4 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = "<group>"; };
+		A83405152DA3827C00C140E4 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
+		A83405162DA3827C00C140E4 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		A83405172DA3827C00C140E4 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = "<group>"; };
+		A83405182DA3828E00C140E4 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
+		A83405192DA3828E00C140E4 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		A834051A2DA3828E00C140E4 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; };
+		A834051F2DA3ADA600C140E4 /* TSPhotoSizeHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPhotoSizeHelper.swift; sourceTree = "<group>"; };
 		A85E478E2D6711590018D62D /* TSTextGeneralPictureVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTextGeneralPictureVC.swift; sourceTree = "<group>"; };
 		A85E47912D67289F0018D62D /* TSTextGeneralPictureVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTextGeneralPictureVM.swift; sourceTree = "<group>"; };
 		A85E47952D672AD90018D62D /* TSTextPicGennerateVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTextPicGennerateVC.swift; sourceTree = "<group>"; };
@@ -1233,6 +1260,8 @@
 				A8F774812D38E8B700AA6E93 /* AppDelegate.swift */,
 				A8F774822D38E8B700AA6E93 /* Assets.xcassets */,
 				A8F774832D38E8B700AA6E93 /* Info.plist */,
+				A83405012DA35CB700C140E4 /* InfoPlist.strings */,
+				A83404FC2DA35BFE00C140E4 /* Localizable.strings */,
 				A8F774852D38E8B700AA6E93 /* LaunchScreen.storyboard */,
 			);
 			path = AIEmoji;
@@ -1297,6 +1326,7 @@
 				A8F774C82D38EA8C00AA6E93 /* TSCommonTool */,
 				A8F774CA2D38EA8C00AA6E93 /* TSFileManagerTool.swift */,
 				A8F7754F2D39ECED00AA6E93 /* PhotoManager.swift */,
+				A834051F2DA3ADA600C140E4 /* TSPhotoSizeHelper.swift */,
 				A8F774CB2D38EA8C00AA6E93 /* TSNetworkTool.swift */,
 				A8F774CD2D38EA8C00AA6E93 /* WindowHelper.swift */,
 			);
@@ -1659,6 +1689,13 @@
 			knownRegions = (
 				en,
 				Base,
+				"zh-Hans",
+				ko,
+				es,
+				"pt-BR",
+				"pt-PT",
+				ja,
+				de,
 			);
 			mainGroup = A8F774602D38E8B000AA6E93;
 			minimizedProjectReferenceProxies = 1;
@@ -1694,11 +1731,13 @@
 				A8EEADE72D3E76860032C5A0 /* Drink🥤.json in Resources */,
 				A83404DB2D9D382200C140E4 /* AccentURW-Reg.ttf in Resources */,
 				A80EDE082D700395003CD332 /* rotatingAnimation.gif in Resources */,
+				A83404FE2DA35BFE00C140E4 /* Localizable.strings in Resources */,
 				A8FB02D12D3E6B2A0031A396 /* Cat🐱.json in Resources */,
 				A80E72462D3F4EED00C64288 /* sticker.json in Resources */,
 				A80EDDFD2D6EF34F003CD332 /* photo_to_photo_style.json in Resources */,
 				A8EEADD62D3E6CD80032C5A0 /* Fish🐠.json in Resources */,
 				A8EEADE22D3E76110032C5A0 /* Dog🐕.json in Resources */,
+				A83405032DA35CB700C140E4 /* InfoPlist.strings in Resources */,
 				A8EEADD82D3E74D20032C5A0 /* Pink🩷.json in Resources */,
 				A80E723F2D3F4D3700C64288 /* Universe🌍.json in Resources */,
 				A8EEADDE2D3E75610032C5A0 /* Fruit🍊.json in Resources */,
@@ -1906,6 +1945,7 @@
 				A80EDDE22D6EB8D8003CD332 /* TSPTPUploadCell.swift in Sources */,
 				A80EDDF62D6EC1ED003CD332 /* TSPhotoToPhotoVM.swift in Sources */,
 				A80E72382D3F473B00C64288 /* DiyPaperProtocol.swift in Sources */,
+				A83405202DA3ADA900C140E4 /* TSPhotoSizeHelper.swift in Sources */,
 				A8F775382D390C3C00AA6E93 /* TSNetworkManager.swift in Sources */,
 				A80EDDE72D6EBFC1003CD332 /* TSPTPGeneratorVM.swift in Sources */,
 				A85E47982D672AE70018D62D /* TSTextPicGennerateVM.swift in Sources */,
@@ -1925,10 +1965,47 @@
 /* End PBXSourcesBuildPhase section */
 
 /* Begin PBXVariantGroup section */
+		A83404FC2DA35BFE00C140E4 /* Localizable.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				A83404FD2DA35BFE00C140E4 /* en */,
+				A83405072DA3717300C140E4 /* zh-Hans */,
+				A834050B2DA381A100C140E4 /* ko */,
+				A834050E2DA381AE00C140E4 /* es */,
+				A83405112DA3826000C140E4 /* pt-BR */,
+				A83405142DA3826600C140E4 /* pt-PT */,
+				A83405172DA3827C00C140E4 /* ja */,
+				A834051A2DA3828E00C140E4 /* de */,
+			);
+			name = Localizable.strings;
+			sourceTree = "<group>";
+		};
+		A83405012DA35CB700C140E4 /* InfoPlist.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				A83405022DA35CB700C140E4 /* en */,
+				A83405062DA3717300C140E4 /* zh-Hans */,
+				A834050A2DA381A100C140E4 /* ko */,
+				A834050D2DA381AE00C140E4 /* es */,
+				A83405102DA3826000C140E4 /* pt-BR */,
+				A83405132DA3826600C140E4 /* pt-PT */,
+				A83405162DA3827C00C140E4 /* ja */,
+				A83405192DA3828E00C140E4 /* de */,
+			);
+			name = InfoPlist.strings;
+			sourceTree = "<group>";
+		};
 		A8F774852D38E8B700AA6E93 /* LaunchScreen.storyboard */ = {
 			isa = PBXVariantGroup;
 			children = (
 				A8F774842D38E8B700AA6E93 /* Base */,
+				A83405052DA3717300C140E4 /* zh-Hans */,
+				A83405092DA381A100C140E4 /* ko */,
+				A834050C2DA381AD00C140E4 /* es */,
+				A834050F2DA3826000C140E4 /* pt-BR */,
+				A83405122DA3826600C140E4 /* pt-PT */,
+				A83405152DA3827C00C140E4 /* ja */,
+				A83405182DA3828E00C140E4 /* de */,
 			);
 			name = LaunchScreen.storyboard;
 			sourceTree = "<group>";
@@ -1944,13 +2021,13 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = AIEmoji/Info.plist;
 				INFOPLIST_KEY_CFBundleDisplayName = Ghiblix;
-				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Allow us to access Photos in order to save emoji to your device.";
+				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Allow us to access photos to upload your photos to generate new styles.";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
 				INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
@@ -1960,7 +2037,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 2.8;
+				MARKETING_VERSION = 2.9;
 				PRODUCT_BUNDLE_IDENTIFIER = com.girl.music.wallpaper;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
@@ -1983,13 +2060,13 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = AIEmoji/Info.plist;
 				INFOPLIST_KEY_CFBundleDisplayName = Ghiblix;
-				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Allow us to access Photos in order to save emoji to your device.";
+				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Allow us to access photos to upload your photos to generate new styles.";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
 				INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
@@ -1999,7 +2076,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 2.8;
+				MARKETING_VERSION = 2.9;
 				PRODUCT_BUNDLE_IDENTIFIER = com.girl.music.wallpaper;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
@@ -2018,6 +2095,7 @@
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
@@ -2081,6 +2159,7 @@
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";

+ 55 - 47
AIEmoji/AppDelegate.swift

@@ -18,7 +18,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         window?.backgroundColor = UIColor.white
         window?.makeKeyAndVisible()
         initPlatform()
-        goToLoadVC()
+        //首次安装需要等待网络权限弹窗
+        if AppDelegate.isFirstInstallApp() {
+            goToLoadVC()
+        }else{
+            PurchaseManager.default.requestProducts()
+            JudgmentSkipPage()
+        }
+
         return true
     }
 
@@ -37,7 +44,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
     
 
     func JudgmentSkipPage() {
-        if UserDefaults.standard.string(forKey: "isFirstInstallApp") == nil {
+        if AppDelegate.isFirstInstallApp() {
             let bootPageVC  = TSBootPageVC { [weak self]  in
                 guard let self = self else { return }
                 UserDefaults.standard.set("1", forKey: "isFirstInstallApp")
@@ -89,7 +96,7 @@ extension AppDelegate {
     }
     
     func applicationWillEnterForeground(_ application: UIApplication) {
-        handleShowEveryDayPopPurchase()
+//        handleShowEveryDayPopPurchase()
         checkAppConfig()
     }
 }
@@ -97,52 +104,53 @@ extension AppDelegate {
 
 extension AppDelegate {
     
-    func handleShowEveryDayPopPurchase() {
-        AppDelegate.showEveryDayPopPurchase { vc in
-            if let vc = vc ,let rootvc = self.window?.rootViewController {
-                vc.modalPresentationStyle = .fullScreen
-                rootvc.present(vc, animated: true)
-            }
-        }
-    }
-    
-    static func showEveryDayPopPurchase(showVCHandle:@escaping (UIViewController?)->Void) {
-        
-        if UserDefaults.standard.string(forKey: "isFirstInstallApp") == nil || kPurchaseDefault.isVip {
-            //启动页->引导图->会员购买
-            showVCHandle(nil)
-            return
-        }
-        
-        //启动页->会员购买
-        // 1. 获取当前日期
-        let currentDate = Date()
-        let dateFormatter = DateFormatter()
-        dateFormatter.dateFormat = "yyyyMMdd"
-        let currentDateString = dateFormatter.string(from: currentDate)
-        
-        // 2. 获取上次弹窗的日期
-        let userDefaults = UserDefaults.standard
-        let lastGreetingDateString = userDefaults.string(forKey: "kEveryDayPopPurchase")
-        
-        // 3. 检查是否需要显示弹窗 "20250319"
-        if lastGreetingDateString != currentDateString {
-            
-            // 4. 弹窗付费引导
-            let vc = TSPurchaseVC()
-            vc.closePageBlock = {
-                showVCHandle(nil)
-            }
-
-            showVCHandle(vc)
-            // 5. 更新上次弹窗的日期
-            userDefaults.set(currentDateString, forKey: "kEveryDayPopPurchase")
-        }else{
-            showVCHandle(nil)
-        }
+    static func isFirstInstallApp() -> Bool{
+        return UserDefaults.standard.string(forKey: "isFirstInstallApp") == nil
     }
     
-    
+//    func handleShowEveryDayPopPurchase() {
+//        AppDelegate.showEveryDayPopPurchase { vc in
+//            if let vc = vc ,let rootvc = self.window?.rootViewController {
+//                vc.modalPresentationStyle = .fullScreen
+//                rootvc.present(vc, animated: true)
+//            }
+//        }
+//    }
+//    static func showEveryDayPopPurchase(showVCHandle:@escaping (UIViewController?)->Void) {
+//        
+//        if Self.isFirstInstallApp() || kPurchaseDefault.isVip {
+//            //启动页->引导图->会员购买
+//            showVCHandle(nil)
+//            return
+//        }
+//        
+//        //启动页->会员购买
+//        // 1. 获取当前日期
+//        let currentDate = Date()
+//        let dateFormatter = DateFormatter()
+//        dateFormatter.dateFormat = "yyyyMMdd"
+//        let currentDateString = dateFormatter.string(from: currentDate)
+//        
+//        // 2. 获取上次弹窗的日期
+//        let userDefaults = UserDefaults.standard
+//        let lastGreetingDateString = userDefaults.string(forKey: "kEveryDayPopPurchase")
+//        
+//        // 3. 检查是否需要显示弹窗 "20250319"
+//        if lastGreetingDateString != currentDateString {
+//            
+//            // 4. 弹窗付费引导
+//            let vc = TSPurchaseVC()
+//            vc.closePageBlock = {
+//                showVCHandle(nil)
+//            }
+//
+//            showVCHandle(vc)
+//            // 5. 更新上次弹窗的日期
+//            userDefaults.set(currentDateString, forKey: "kEveryDayPopPurchase")
+//        }else{
+//            showVCHandle(nil)
+//        }
+//    }
     static func setsTopDayPopPurchase() {
         let currentDate = Date()
         let dateFormatter = DateFormatter()

BIN
AIEmoji/Assets.xcassets/PTP/ptp_upload_example.imageset/ptp_upload_example@2x.png


BIN
AIEmoji/Assets.xcassets/PTP/ptp_upload_example.imageset/ptp_upload_example@3x.png


BIN
AIEmoji/Assets.xcassets/PTP/textToEmoji_banner.imageset/textToEmoji_banner@2x.png


BIN
AIEmoji/Assets.xcassets/PTP/textToEmoji_banner.imageset/textToEmoji_banner@3x.png


+ 1 - 1
AIEmoji/Assets.xcassets/PTP/textToPhoto_banner.imageset/Contents.json

@@ -10,7 +10,7 @@
       "scale" : "2x"
     },
     {
-      "filename" : "textToPhoto_banner@3x.png",
+      "filename" : "textToEmoji_banner@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }

BIN
AIEmoji/Assets.xcassets/PTP/textToPhoto_banner.imageset/textToEmoji_banner@3x.png


BIN
AIEmoji/Assets.xcassets/PTP/textToPhoto_banner.imageset/textToPhoto_banner@2x.png


BIN
AIEmoji/Assets.xcassets/PTP/textToPhoto_banner.imageset/textToPhoto_banner@3x.png


+ 1 - 1
AIEmoji/Business/AIChat/TSAIChatHistoryVC/VM/TSAIChatHistoryVM.swift

@@ -55,7 +55,7 @@ class TSAIChatHistoryVM {
         }
         
         if yesterdayDates.count > 0 {
-            result.append(TSAIChatHistoryModel(title: "1 Days".localized, chatList: yesterdayDates))
+            result.append(TSAIChatHistoryModel(title: "1 Day".localized, chatList: yesterdayDates))
         }
         
         if withinWeekDates.count > 0 {

+ 1 - 1
AIEmoji/Business/AIChat/TSChatViewController/TSChatInputBarVC/TSChatInputBarVC.swift

@@ -87,7 +87,7 @@ class TSChatInputBarVC: TSBaseVC, UITextViewDelegate {
         textView.isScrollEnabled = false
         textView.tintColor = .themeColor
         textView.returnKeyType = .send
-        textView.placeholder = "Message chat".localized
+        textView.placeholder = "Send a message".localized
         textView.placeholderColor = .white.withAlphaComponent(0.4)
         textView.placeholderLabel.font = .font(size: 16.0)
         textView.textInsets = UIEdgeInsets(top: 18, left: 16, bottom: 14, right: 0)

+ 1 - 1
AIEmoji/Business/AIChat/TSChatViewController/TSChatInputBarVC/TSChatInputFullScreenVC.swift

@@ -55,7 +55,7 @@ class TSChatInputFullScreenVC: TSBaseVC, UITextViewDelegate {
         textView.isScrollEnabled = false
         textView.tintColor = .themeColor
         textView.returnKeyType = .send
-        textView.placeholder = "Message chat".localized
+        textView.placeholder = "Send a message".localized
         textView.placeholderColor = .white.withAlphaComponent(0.4)
         textView.placeholderLabel.font = .font(size: 16.0)
         textView.textInsets = UIEdgeInsets(top: 5, left: 0, bottom: 5, right: 0)

+ 4 - 0
AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+ChatDelegate.swift

@@ -245,11 +245,15 @@ extension TSChatViewController: MessageCellDelegate {
             UIView.performWithoutAnimation {
                 messagesCollectionView.reloadItems(at: [indexPath])
             }
+
         case .refreshColView:
             messagesCollectionView.reloadData()
         default:
             break
         }
+        kDelayMainShort {
+            self.scrollViewDidScroll(self.messagesCollectionView)
+        }
     }
 }
 

+ 3 - 2
AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+SendMsg.swift

@@ -174,7 +174,7 @@ extension TSChatViewController{
         let thinkingModel = TSChatThinkingModel()
         thinkingModel.startStamp = Int.timestampInt()
         thinkingModel.thinkingName = "DeepSeek-R1"
-        thinkingModel.thinkingState = "Thinking..."
+        thinkingModel.thinkingState = "Thinking...".localized
         message.thinkingModel = thinkingModel
         
         let model = TSChatMessageUIBaseModel.creat(viewClass: "TSAIThinkingView", msgModel: message)
@@ -202,7 +202,8 @@ extension TSChatViewController{
                 if  thinkingModel.endStamp == 0{
                     thinkingModel.endStamp = Int.timestampInt()
                     let time = thinkingModel.endStamp - thinkingModel.startStamp
-                    thinkingModel.thinkingState = "Thought for \(time)s"
+//                    thinkingModel.thinkingState = "Thought for \(time)s"
+                    thinkingModel.thinkingState = String(format:"Thought for %ds".localized,time)
                 }
             }
             

+ 1 - 1
AIEmoji/Business/AIChat/TSChatViewController/ViewModel/TSAIChatVM.swift

@@ -173,7 +173,7 @@ extension TSAIChatVM {
         if uiStyle == .history {
             return self.dbAIChatList.getMessageList()
         }else {
-            let aiString = "I can tackle your questions, my skillset includes, but is not limited to:\n`📧 Composing high-quality emails`\n`🇺🇸 Facilitating language learning`\n`📑 Assisting in your studies`\n`💡Brainstorming ideas`\n`and much more!`"
+            let aiString = "I can tackle your questions, my skillset includes, but is not limited to:\n`📧 Composing high-quality emails`\n`🇺🇸 Facilitating language learning`\n`📑 Assisting in your studies`\n`💡Brainstorming ideas`\n`and much more!`".localized
             let msg = TSChatMessage(kind: .attributedText(kMDAttributedString(text: aiString)), user: kAIUser, messageId: "", date: Date())
             msg.messageType = .aiRobotWelcome
             msg.appendUIDict = [.topView:TSChatMessageUIBaseModel.creat(viewClass: "TSMSGAIDefaultHeaderView", msgModel: msg)]

+ 1 - 1
AIEmoji/Business/General/TSBigIconBrowseVC/TSBigIconBrowseVC.swift

@@ -122,7 +122,7 @@ class TSBigIconBrowseVC: TSBottomAlertVC {
         if let model = currentModel{
             //拷贝文字到截切板
             UIPasteboard.general.string = model.request.prompt
-            kSavePhotoSuccesswShared.show(atView: self.view,text: "Copy Successfully".localized,showViewBtn:false)
+            kSavePhotoSuccesswShared.show(atView: self.view,text: "Copyed Successfully".localized,showViewBtn:false)
         }else{
             kShowToastDataMissing()
         }

+ 1 - 1
AIEmoji/Business/General/TSSmallIconBrowseVC/TSSmallIconBrowseVC.swift

@@ -114,7 +114,7 @@ class TSSmallIconBrowseVC: TSBottomAlertVC {
   
         if let image = currentImage{
             UIDevice.copyImage(image: image)
-            kSavePhotoSuccesswShared.show(atView: self.view,text: "Copy Successfully".localized,showViewBtn:false)
+            kSavePhotoSuccesswShared.show(atView: self.view,text: "Copyed Successfully".localized,showViewBtn:false)
 //            closePage()
         }else{
             kShowToastDataMissing()

+ 1 - 1
AIEmoji/Business/LaunchVC/TSBootPageVC.swift

@@ -18,7 +18,7 @@ class TSBootPageVC: TSBaseVC {
         fatalError("init(coder:) has not been implemented")
     }
     var index:Int = 0
-    let titleStrings = ["Change image Styles".localized,"AI image generation".localized,"Ask AI anything".localized]
+    let titleStrings = ["Change image styles".localized,"AI image generation".localized,"Ask Ai anything".localized]
     let imageStrings = ["bootPage_0","bootPage_1","bootPage_2"]
 
     lazy var titleLabel: UILabel = {

+ 36 - 30
AIEmoji/Business/LaunchVC/TSLaunchVC.swift

@@ -15,17 +15,11 @@ class TSLaunchVC: UIViewController {
     private var timer: DispatchSourceTimer?
     // 闪屏页剩余显示时长
     #if DEBUG
-    private var remindTimeInterval: TimeInterval = 0.5
+    private var remindTimeInterval: TimeInterval = 2.0
     #else
         private var remindTimeInterval: TimeInterval = 2.0
     #endif
 
-    private var isStop: Bool = false
-
-    var showingAdViewController: Bool {
-        return presentedViewController != nil
-    }
-
     override func viewDidLoad() {
         super.viewDidLoad()
         setupLaunchScreenView()
@@ -38,34 +32,27 @@ class TSLaunchVC: UIViewController {
             switch status {
             case .reachable:
                 PurchaseManager.default.requestProducts()
-//                AppDelegate.requestAdTrack()
                 manager?.stopListening()
-//                self.initAdMob()
                 break
             default:
-//                AppDelegate.requestAdTrack()
-//                PurchaseManager.default.requestProducts()
-//                self.initAdMob()
+                PurchaseManager.default.requestProducts()
                 break
             }
         }
     }
 
-    func initAdMob() {
-//        GADMobileAds.sharedInstance().start { status in
-//            print("启动状态 == status === \(status.adapterStatusesByClassName)")
-//        }
-    }
-
     func enterApp() {
-        AppDelegate.showEveryDayPopPurchase { vc in
-            if let vc = vc {
-                self.navigationController?.pushViewController(vc, animated: true)
-            }else{
-                self.dismissHandler?()
-                
-            }
-        }
+        
+        dismissHandler?()
+        
+//        AppDelegate.showEveryDayPopPurchase { vc in
+//            if let vc = vc {
+////                self.navigationController?.pushViewController(vc, animated: true)
+//                self.present(vc, animated: true)
+//            }else{
+//                self.dismissHandler?()
+//            }
+//        }
         
 //        DispatchQueue.main.async {
 //            self.dismissHandler?()
@@ -76,26 +63,45 @@ class TSLaunchVC: UIViewController {
     
     private func startTimer() {
         if timer == nil {
+            
+            var maxTime:Int = 0 //200*10=2s 200 *10*3 =6s
             timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global())
             timer?.schedule(deadline: .now(), repeating: .milliseconds(200))
             timer?.setEventHandler(handler: { [weak self] in
                 // App活跃时,计时有效;如网络授权弹窗唤起时,计时失效
                 DispatchQueue.main.async {
-                    guard let self = self,
-                          UIApplication.shared.applicationState == .active,
-                          !self.showingAdViewController else {
+                    guard let self = self  else {
+                        
+                        return
+                    }
+                    
+                    guard UIApplication.shared.applicationState == .active
+                    else {
+                        dePrint("倒计时:!= active")
+                        maxTime += 1
+                        if maxTime > 30 {
+                            dePrint("超过最大倒计时进入 app")
+                            self.timer?.cancel()
+                            self.timer = nil
+                            self.enterApp()
+                        }
+                        
                         return
                     }
+                    
                     self.remindTimeInterval -= 0.2
-                    print("倒计时:\(self.remindTimeInterval)")
+                    dePrint("倒计时:\(self.remindTimeInterval)")
                     if self.remindTimeInterval <= 0 {
                         self.timer?.cancel()
+                        self.timer = nil
                         self.enterApp()
                     }
                 }
 
             })
             timer?.resume()
+        }else{
+            self.enterApp()
         }
     }
     

+ 3 - 3
AIEmoji/Business/TSGenmojiVC/TSGenmojiGennerateVC/TSGenmojiGennerateVC.swift

@@ -90,7 +90,7 @@ class TSGenmojiGennerateVC: TSBottomAlertVC {
     @objc override func clickCancelBtn(){
         if let image = getSuccessImage() {
             UIDevice.copyImage(image: image)
-            kSavePhotoSuccesswShared.show(atView: self.view,text: "Copy Successfully".localized,showViewBtn:false)
+            kSavePhotoSuccesswShared.show(atView: self.view,text: "Copyed Successfully".localized,showViewBtn:false)
         }
     }
     
@@ -157,7 +157,7 @@ extension TSGenmojiGennerateVC {
     
     func showLoading(){
         generateInView.isHidden = false
-        generateInView.showLoading(text: "Generating...".localized)
+        generateInView.showLoading(text: "Generating".localized + " ...")
         generateInView.isRotating = true
         submitBtn.isHidden = true
         cancelBtn.isHidden = true
@@ -167,7 +167,7 @@ extension TSGenmojiGennerateVC {
     }
     
     func showError(text:String?){
-        let msg = "Failed to Generate, please try later".localized
+        let msg = "Failed to generate, please try later".localized
 //        if let str = text{
 //            if str.count == 0 {
 //                msg = "Generation failed".localized

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

@@ -164,17 +164,12 @@ class TSGenmojiGennerateViewModel {
 
         //Generating 0%-100%
         var progressInt = Int(progress*100)
-
-        if generatingProgress >= progressInt{
-            return "Generating \(generatingProgress)%"
-        }
-
         if progressInt > 99 {
             progressInt = 99
         }
         
         generatingProgress = progressInt
-        return "Generating \(progressInt)%"
+        return "Generating".localized + " \(progressInt)%"
     }
 }
 

+ 0 - 1
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/TSGenmojiVC.swift

@@ -79,7 +79,6 @@ class TSGenmojiVC: TSBaseVC {
         let tapGesture = UITapGestureRecognizer(target: self, action: #selector(clickCollectionView))
         tapGesture.cancelsTouchesInView = false // 确保不影响其他点击事件
         collectionComponent.collectionView.addGestureRecognizer(tapGesture)
-        
         collectionComponent.clear()
         collectionComponent.reloadView(with:viewModel.colDataArray)
     }

+ 3 - 3
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/View/TSGenmojiGennerateCell.swift

@@ -26,7 +26,7 @@ class TSGenmojiGennerateCell : TSBaseCollectionCell{
     
     lazy var customTextView: TSPlaceholderTextView = {
         let customTextView = TSPlaceholderTextView(
-            placeholder: "Type your idea here.",
+            placeholder: "Type your idea here.".localized,
             text: "",
             font: .font(size: 14),
             textColor: .white,
@@ -140,7 +140,7 @@ class TSGenmojiGennerateCell : TSBaseCollectionCell{
     override func renderView(with object: Any?, component: TSCollectionViewComponent, attributes: [String : Any]?) {
         super.renderView(with: object, component: component, attributes: attributes)
         
-        var title = "Generate"
+        var title = "Generate".localized
         if let itemModel = object as? TSGenmojiCoLItemModel{
             if itemModel.style == .generate{
 //                title = "Generate (\(kPurchaseDefault.freeNum(type: .generatePic)))"
@@ -159,7 +159,7 @@ class TSGenmojiGennerateCell : TSBaseCollectionCell{
         }
         
         if kPurchaseDefault.isVip == true {
-            title = "Generate"
+            title = "Generate".localized
         }
         submitBtn.setTitle(title, for: .normal)
         

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

@@ -59,7 +59,7 @@ class TSGenmojiItemCell: TSBaseCollectionCell {
             if itemModel.dataModel.modelType == .example {
                 
                 if itemModel.style == .ptpPicHistory {
-                    textLabel.text = "Ghibli Style Example"
+                    textLabel.text = "Ghibli Style Example".localized
                 }
                 
                 exampleView.isHidden = false

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

@@ -158,7 +158,7 @@ extension TSPTPGeneratorVC {
     
     func showLoading(){
         generateInView.isHidden = false
-        generateInView.showLoading(text: "Generating...".localized)
+        generateInView.showLoading(text: "Generating".localized + " ...")
         generateInView.isRotating = true
 
         isClickTheBlankClosePage = false
@@ -167,7 +167,7 @@ extension TSPTPGeneratorVC {
     }
     
     func showError(text:String?){
-        let msg = "Failed to Generate, please try later".localized
+        let msg = "Failed to generate, please try later".localized
         generateInView.isHidden = false
         generateInView.showError(text: msg)
         generateInView.isRotating = false

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

@@ -114,7 +114,7 @@ class TSPTPGeneratorVM {
                                 guard let self = self else { return }
                         
                                 let progressInt = Int(progress*10.0)
-                                let progressString = "Generating \(90 + progressInt)%"
+                                let progressString = "Generating".localized + " \(90 + progressInt)%"
                                 stateDatauPblished = (.progressString(progressString),nil)
                                 dePrint("当前进度: \(progress)")
                             } completion: {[weak self] image in
@@ -190,7 +190,7 @@ class TSPTPGeneratorVM {
         if progressInt > 99 {
             progressInt = 99
         }
-        return "Uploading Photo \(progressInt)%"
+        return "Uploading Photo".localized + "\(progressInt)%"
     }
     
     func generating(progress:Float) -> String {
@@ -198,16 +198,12 @@ class TSPTPGeneratorVM {
         //Generating 0%-100%
         var progressInt = Int(progress*100)
 
-//        if generatingProgress >= progressInt{
-//            return "Generating \(generatingProgress)%"
-//        }
-
         if progressInt > 99 {
             progressInt = 99
         }
         
         generatingProgress = progressInt
-        return "Generating \(progressInt)%"
+        return "Generating".localized + " \(progressInt)%"
     }
 }
 

+ 1 - 1
AIEmoji/Business/TSPTPGeneratorVC/TSPhotoToPhotoVC/Cell/TSPTPSelectStyleCell.swift

@@ -115,7 +115,7 @@ class TSPTPSelectStyleCCell: TSBaseCollectionCell {
             }
         
             textLabel.attributedText = NSAttributedString(
-                string: itemModel.imageText,
+                string: itemModel.imageText.localized,
                 attributes: [
                     .strokeColor: strokeColor,       // 描边颜色
                     .strokeWidth: -4.0,                // 负值表示同时填充和描边(正值仅描边)

+ 11 - 3
AIEmoji/Business/TSPTPGeneratorVC/TSPhotoToPhotoVC/Cell/TSPTPUploadCell.swift

@@ -6,9 +6,7 @@
 //
 
 class TSPTPUploadCell : TSBaseCollectionCell{
-    
-    let ptpUploadExample:UIImage? = UIImage(named: "ptp_upload_example")
-    
+  
     var upLoadImage:UIImage? = nil {
         didSet{
             if let image = upLoadImage {
@@ -55,6 +53,16 @@ class TSPTPUploadCell : TSBaseCollectionCell{
         uploadExampleImageView.contentMode = .scaleAspectFill
         uploadExampleImageView.cornerRadius = 12
         uploadExampleImageView.isHidden = false
+        
+        let button = UIButton.createButton(title:"Tap to select photo".localized,backgroundColor:.black.withAlphaComponent(0.4),font: .font(size: 14),titleColor: .white,corner: 12)
+        button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 12, bottom: 0, right: 12)
+        uploadExampleImageView.addSubview(button)
+        button.snp.makeConstraints { make in
+            make.centerX.equalToSuperview()
+            make.bottom.equalTo(-20)
+            make.height.equalTo(24)
+        }
+        
         return uploadExampleImageView
     }()
     

+ 69 - 12
AIEmoji/Business/TSPTPGeneratorVC/TSPhotoToPhotoVC/TSPhotoToPhotoVC.swift

@@ -74,6 +74,24 @@ class TSPhotoToPhotoVC: TSBaseVC {
         let textToPhotoBannerBtn = UIButton.createButton(backgroundImage: UIImage(named: "textToPhoto_banner"))
         textToPhotoBannerBtn.addTarget(self, action: #selector(clickTextToPhoto), for: .touchUpInside)
         textToPhotoBannerBtn.frame = CGRect(x: 16, y: bannerY, width: bannerW, height: bannerH)
+    
+        let label = UILabel.createLabel(text: "Text ➡️ Photo".localized,font: .font(name:.PoppinsBlackItalic,size: 16),textColor: .white)
+        textToPhotoBannerBtn.addSubview(label)
+        label.snp.makeConstraints { make in
+            make.top.equalTo(12)
+            make.leading.equalTo(8)
+            make.height.equalTo(24)
+        }
+        
+        let button = UIButton.createButton(title:"Try Now".localized,backgroundColor:.white,font: .font(size: 11),titleColor: "#ED69AA".uiColor,corner: 9)
+        button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 6, bottom: 0, right: 6)
+        textToPhotoBannerBtn.addSubview(button)
+        button.snp.makeConstraints { make in
+            make.top.equalTo(44)
+            make.leading.equalTo(8)
+            make.height.equalTo(18)
+        }
+        
         return textToPhotoBannerBtn
     }()
 
@@ -82,13 +100,32 @@ class TSPhotoToPhotoVC: TSBaseVC {
         textToEmojiBannerBtn.addTarget(self, action: #selector(clickTextToEmoji), for: .touchUpInside)
         let x = textToPhotoBannerBtn.x + textToPhotoBannerBtn.width + 11.0
         textToEmojiBannerBtn.frame = CGRect(x: x, y: bannerY, width: bannerW, height: bannerH)
+        
+        let color:UIColor = "#7855D6".uiColor
+        let label = UILabel.createLabel(text: "Text ➡️ Emoji".localized,font: .font(name:.PoppinsBlackItalic,size: 16),textColor: color)
+        textToEmojiBannerBtn.addSubview(label)
+        label.snp.makeConstraints { make in
+            make.top.equalTo(12)
+            make.leading.equalTo(8)
+            make.height.equalTo(24)
+        }
+        
+        let button = UIButton.createButton(title:"Try Now".localized,backgroundColor:color,font: .font(size: 11),titleColor: "#D0D5FF".uiColor,corner: 9)
+        button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 6, bottom: 0, right: 6)
+        textToEmojiBannerBtn.addSubview(button)
+        button.snp.makeConstraints { make in
+            make.top.equalTo(44)
+            make.leading.equalTo(8)
+            make.height.equalTo(18)
+        }
+        
         return textToEmojiBannerBtn
     }()
-    
+    let collectionViewBtootm:CGFloat = 80
     lazy var collectionComponent: TSCollectionViewComponent = {
         let layout = UICollectionViewFlowLayout()
         let cp = TSCollectionViewComponent(frame: CGRect.zero, layout: layout, attributes: [:])
-        cp.collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: k_Height_TabBar, right: 0)
+        cp.collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: collectionViewBtootm, right: 0)
         
         //点击 cell中的某个按钮
         cp.itemActionHandler = { [weak self] cellCp, indexPath in
@@ -97,16 +134,29 @@ class TSPhotoToPhotoVC: TSBaseVC {
 
                 if let text = cellCp as? String{
                     if text == "add" {//选择图片
-                        photoPickerManager.pickSinglePhoto { [weak self] image in
+                        photoPickerManager.pickSinglePhoto { [weak self] image,phAsset in
                             guard let self = self else { return }
-                            if let image = image {
-                                if image.isLargerThan(byteSize: 10 * 1024 * 1024) {
+
+                            let maxSize = 10 * 1024 * 1024
+                            
+                            if let image = image,let phAsset = phAsset {
+                                // 方法2:异步获取详细大小(不阻塞主线程)
+                                TSPhotoSizeHelper.getImageFileSizeAsync(asset: phAsset) {[weak self] size in
+                                    guard let self = self else { return }
+                                    
+                                    let mbSize = Double(size) / (1024 * 1024)
+                                    print("精确大小: \(mbSize) MB,size = \(size)")
+                                    if size > maxSize {
+                                        TSToastShared.showToast(text: "Photo must be smaller than 10MB.".localized)
+                                    }else{
+                                        upDateUpLoadImage(image: image)
+                                    }
+                                }
+                            }else if let image = image {
+                                if image.isLargerThan(byteSize: maxSize) {
                                     TSToastShared.showToast(text: "Photo must be smaller than 10MB.".localized)
                                 }else{
-                                    viewModel.upLoadImage = image
-                                    UIView.performWithoutAnimation {
-                                        cp.collectionView.reloadSections(IndexSet(integer: 0))
-                                    }
+                                    upDateUpLoadImage(image: image)
                                 }
                             }
                         }
@@ -162,6 +212,13 @@ class TSPhotoToPhotoVC: TSBaseVC {
     }()
     
     
+    func upDateUpLoadImage(image:UIImage){
+        viewModel.upLoadImage = image
+        UIView.performWithoutAnimation {
+            collectionComponent.collectionView.reloadSections(IndexSet(integer: 0))
+        }
+    }
+    
     lazy var submitBtn: UIButton = {
         let submitBtn = kCreateNormalSubmitBtn(title: getVipText()) { [weak self]  in
             guard let self = self else { return }
@@ -205,7 +262,7 @@ class TSPhotoToPhotoVC: TSBaseVC {
 //        //顶部入口跳转按钮
 //        let vcViewH = bannerBtn.frame.origin.y+bannerBtn.frame.size.height
 //        collectionComponent.collectionView.addSubview(bannerBtn)
-//        collectionComponent.collectionView.contentInset = UIEdgeInsets(top: vcViewH, left: 0, bottom: 20, right: 0)
+//        collectionComponent.collectionView.contentInset = UIEdgeInsets(top: vcViewH, left: 0, bottom: collectionViewBtootm, right: 0)
 //        bannerBtn.y = -bannerBtn.frame.size.height
         
         
@@ -213,7 +270,7 @@ class TSPhotoToPhotoVC: TSBaseVC {
         let bannerBtn = textToPhotoBannerBtn
         let vcViewH = bannerBtn.frame.origin.y+bannerBtn.frame.size.height
         collectionComponent.collectionView.addSubview(bannerBtn)
-        collectionComponent.collectionView.contentInset = UIEdgeInsets(top: vcViewH, left: 0, bottom: 20, right: 0)
+        collectionComponent.collectionView.contentInset = UIEdgeInsets(top: vcViewH, left: 0, bottom: collectionViewBtootm, right: 0)
         bannerBtn.y = -bannerBtn.frame.size.height
 
         collectionComponent.collectionView.addSubview(textToEmojiBannerBtn)
@@ -299,7 +356,7 @@ extension TSPhotoToPhotoVC {
     
     
     func getVipText()->String{
-        return "Generate"
+        return "Generate".localized
 //        if kPurchaseDefault.isVip {
 //            return "Generate"
 //        }

+ 19 - 17
AIEmoji/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift

@@ -200,7 +200,7 @@ class TSPurchaseVC: TSBaseVC {
                     TSToastShared.hideLoading()
                 case .loadFail:
                     TSToastShared.hideLoading()
-                    let message = "Get price failure, Will automatically retry in 5 seconds".localized
+                    let message = "Failed to get the price, will automatically retry in 5 seconds".localized
                     TSToastShared.showToast(text: message)
                     DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
                         PurchaseManager.default.requestProducts()
@@ -250,7 +250,7 @@ class TSPurchaseVC: TSBaseVC {
                 case .verifyFail:
                 #if DEBUG
                     TSToastShared.hideLoading()
-                    let message = (object as? String) ?? "Verify receipt failed"
+                    let message = (object as? String) ?? "Failed to validate receipt".localized
                     TSToastShared.showToast(text:message)
 
                 #endif
@@ -314,11 +314,11 @@ struct PurchaseView :View {
             
             VStack {
          
-                customText(text: " \(kAppName) ",fontName: .KelsiFill,color:UIColor.themeColor.color).frame(height: 53*kDesignScale)
+                customText(text: "\(kAppName) ",fontName: .KelsiFill,color:UIColor.themeColor.color).frame(height: 53*kDesignScale)
                 
                 Spacer().frame(height: 16)
                 
-                Text("Premium")
+                Text("Premium".localized)
                     .font(.font(size: 16))
                     .padding(EdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 20))
                     .frame(height: 34)
@@ -337,22 +337,22 @@ struct PurchaseView :View {
                         
                         HStack(spacing: 12) {
                             Image("vip_feature_1").resizable().frame(width: 24, height: 24)
-                            Text("Unlimited AI image generation")
+                            Text("Unlimited AI image generation".localized)
                         }
                         
                         HStack(spacing: 12) {
                             Image("vip_feature_2").resizable().frame(width: 24, height: 24)
-                            Text("Change image styles")
+                            Text("Change image styles".localized)
                         }
                         
                         HStack(spacing: 12) {
                             Image("vip_feature_3").resizable().frame(width: 24, height: 24)
-                            Text("Unlimited AI chat").multilineTextAlignment(.leading)
+                            Text("Unlimited AI chat".localized).multilineTextAlignment(.leading)
                         }
                         
                         HStack(spacing: 12) {
                             Image("vip_feature_4").resizable().frame(width: 24, height: 24)
-                            Text("Ad-free experience").multilineTextAlignment(.leading)
+                            Text("Ad-free experience".localized).multilineTextAlignment(.leading)
                         }
                         
                     }.font(.font(size: 16)).foregroundColor(UIColor.white.color)
@@ -366,7 +366,7 @@ struct PurchaseView :View {
             VStack(spacing: 12) {
                 
                 ZStack(alignment: .topTrailing) {
-                    PurchaseItemView(title: "One Year", type: .year, selectedType: $viewModel.selectedType).onTapGesture {
+                    PurchaseItemView(title: "One Year".localized, type: .year, selectedType: $viewModel.selectedType).onTapGesture {
                         viewModel.selectedType = .year
                     }
                     TSVipRecView()
@@ -374,10 +374,10 @@ struct PurchaseView :View {
                 }
           
                 HStack {
-                    PurchaseItemView(title: "One Month", type: .month, selectedType: $viewModel.selectedType).onTapGesture {
+                    PurchaseItemView(title: "One Month".localized, type: .month, selectedType: $viewModel.selectedType).onTapGesture {
                         viewModel.selectedType = .month
                     }
-                    PurchaseItemView(title: "One Week", type: .week, selectedType: $viewModel.selectedType).onTapGesture {
+                    PurchaseItemView(title: "One Week".localized, type: .week, selectedType: $viewModel.selectedType).onTapGesture {
                         viewModel.selectedType = .week
                     }
                 }
@@ -396,28 +396,30 @@ struct PurchaseView :View {
                 }
                 
                 HStack {
-                    Text("Recurring billing, cancel anytime")
+                    Text("Recurring billing, cancel anytime".localized)
                         .foregroundColor(Color.hex("#FFBD59")) +
-                        Text(", Payment will be charged to your iTunes account at confirmation of purchase. Subscriptions automatically renew for the same applicable term and price, unless auto-renew is turned off at least 24 hours before the end of the current period.")
+                        Text(",Payment will be charged to your iTunes account at confirmation of purchase. Subscriptions automatically renew for the same applicable term and price, unless auto-renew is turned off at least 24 hours before the end of the current period.".localized)
                         .foregroundColor(UIColor.lesserText.color)
                 }
                 .multilineTextAlignment(.center).font(.font(size: 8))
                 .onTapGesture {
                     viewModel.privacyPublisher.send(true)
                 }
+                
+                Spacer().frame(height: 6.0)
 
                 HStack(spacing: 8) {
-                    Text("Terms of us")
+                    Text("Terms of us".localized)
                         .onTapGesture {
                             viewModel.termPublisher.send(true)
                         }
                     Text("|")
-                    Text("Privacy Policy")
+                    Text("Privacy Policy".localized)
                         .onTapGesture {
                             viewModel.privacyPublisher.send(true)
                         }
                     Text("|")
-                    Text("Restore")
+                    Text("Restore".localized)
                         .onTapGesture {
                             viewModel.restorePublisher.send(true)
                         }
@@ -481,7 +483,7 @@ struct TSVipRecView: View {
     
         HStack(spacing: 4) {
             Image("upvote_black").resizable().frame(width: 16, height: 16)
-            Text("Save 60%").font(.font(size: 12,weight: .medium)).foregroundColor(.hex("#111111"))
+            Text("Save-Vip".localized + "60%").font(.font(size: 12,weight: .medium)).foregroundColor(.hex("#111111"))
         }
         .padding(EdgeInsets(top: 6, leading: 6, bottom: 6, trailing: 6))
         .background(Color.hex("#FECB34"))

+ 6 - 5
AIEmoji/Business/TSSetingVC/SetingVC/View/SettingPurchaseTopView.swift

@@ -19,7 +19,7 @@ struct SettingPurchaseTopView: View {
                     Spacer().frame(height: 20)
                     
 //                    Image(.settingVip).resizable().frame(width: 210*kDesignScale, height: 50*kDesignScale)
-                    customGradientText(text: " \(kAppName) ",fontName: .KelsiFill).frame(height: 50*kDesignScale)
+                    customGradientText(text: "\(kAppName) ",fontName: .KelsiFill).frame(height: 50*kDesignScale)
                     Spacer()
                     
                     Text("Due Date:".localized + " \(PurchaseManager.default.expiredDateString)")
@@ -36,9 +36,9 @@ struct SettingPurchaseTopView: View {
                     
                     VStack(alignment: .leading,spacing: 12) {
 //                        Image(.settingNoVip).resizable().frame(width: 186*kDesignScale, height: 44*kDesignScale)
-                        customText(text: " \(kAppName) ",fontName: .KelsiFill,color:UIColor.white.color).frame(height: 50*kDesignScale)
+                        customText(text: "\(kAppName) ",fontName: .KelsiFill,color:UIColor.white.color).frame(height: 50*kDesignScale)
                         HStack {
-                            Text("Limited Time Discount")
+                            Text("Limited Time Discount".localized)
                                 .font(.font(size: 14))
                                 .frame(height: 14)
                                 .foregroundColor(UIColor.white.withAlphaComponent(0.6).color)
@@ -49,7 +49,7 @@ struct SettingPurchaseTopView: View {
                     
                     Spacer()
                     
-                    Text("Upgrade")
+                    Text("Upgrade".localized)
                         .font(.font(size: 14,weight: .medium))
                         .padding(EdgeInsets(top: 0, leading: 12, bottom: 0, trailing: 12))
                         .frame(height: 26) // 设置高度
@@ -73,7 +73,7 @@ struct SettingPurchaseTopView: View {
     func customText(text:String,fontName:FontName,color:Color) -> some View {
         let gorgeousColor = color //UIColor.themeColor.color
         return Text(text)
-            .font(.font(name: fontName,size: 48))
+            .font(.font(name: fontName,size: 36))
 //            .gradientForeground(
 //                colors: [gorgeousColor,gorgeousColor],
 //                startPoint: UnitPoint.leading,
@@ -82,6 +82,7 @@ struct SettingPurchaseTopView: View {
 //            .shadow(color: gorgeousColor.opacity(0.7), radius: 6, x: 0, y: 0)
             .foregroundColor(gorgeousColor)
             .frame(height: 20)
+//            .minimumScaleFactor(0.5) // 最小缩放比例(0.5表示最小可缩放到初始大小的50%)
     }
     
     func customGradientText(text:String,fontName:FontName) -> some View {

+ 1 - 1
AIEmoji/Business/TSSetingVC/SetingVC/View/TSSettingListView.swift

@@ -51,7 +51,7 @@ struct SettingListItemView: View {
         ZStack {
             Color.white.opacity(0.1)
             HStack {
-                Text(type.rawValue).font(.font(size: 16.0)).foregroundColor(.white)
+                Text(type.rawValue.localized).font(.font(size: 16.0)).foregroundColor(.white)
                 Spacer()
 //                if type != .about {
 //                    Image(.whiteRightArrow)

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

@@ -39,7 +39,7 @@ class TSPromptTextView : TSBaseView{
     
     lazy var customTextView: TSPlaceholderTextView = {
         let customTextView = TSPlaceholderTextView(
-            placeholder: "Type your idea here.",
+            placeholder: "Type your idea here.".localized,
             text: "",
             font: .font(size: 14),
             textColor: .white,
@@ -127,7 +127,7 @@ class TSPromptTextView : TSBaseView{
     }
 
     func getVipText()->String{
-        return "Generate"
+        return "Generate".localized
 //        if kPurchaseDefault.isVip {
 //            return "Generate"
 //        }

+ 3 - 17
AIEmoji/Business/TSTextGeneralPictureVC/TSTTPInputVC/View/TSTTPStyleView.swift

@@ -48,7 +48,7 @@ class TSTTPStyleView:TSBaseView {
     
     lazy var titleView: TSTitleView = {
         let titleView = TSTitleView()
-        titleView.titleLab.text = "Genre".localized
+        titleView.titleLab.text = "Select Style".localized
         return titleView
     }()
     
@@ -122,25 +122,11 @@ class TSPromptStyleViewCell: TSBaseCollectionCell {
     
             if itemModel.style == 1 {
                 hotImageView.isHidden = false
-                
-//                let font = UIFont.font(name:.PoppinsBlackItalic,size: 18)
-//                textLabel.font = font
-//                textLabel.attributedText = NSAttributedString(
-//                    string: itemModel.imageText,
-//                    attributes: [
-//                        .strokeColor: "#FFB73C".uiColor,       // 描边颜色
-//                        .strokeWidth: -4.0,                // 负值表示同时填充和描边(正值仅描边)
-//                        .foregroundColor: UIColor.white,   // 文字填充色
-//                        .font: font
-//                    ]
-//                )
             }else{
                 hotImageView.isHidden = true
-//                textLabel.font = .font(size: 14)
-//                textLabel.attributedText = nil
-                
             }
-            textLabel.text = itemModel.imageText
+            
+            textLabel.text = itemModel.imageText.localized
         }
     }
     

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

@@ -12,7 +12,7 @@ class TSTitleView: TSBaseView {
     let viewH:Float = TSTitleView.viewH
     
     lazy var titleLab: UILabel = {
-        let titleLab = UILabel.createLabel(font: .font(size: 18),textColor: .white)
+        let titleLab = UILabel.createLabel(font: .font(size: 16,weight: .medium),textColor: .fromHex("FFFFFF"))
         return titleLab
     }()
     

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

@@ -62,7 +62,7 @@ class TSTextGeneralPictureVC: TSBaseVC {
     override func createView() {
 
         addNormalNavBarView()
-        setPageTitle("AI Photo Generator".localized)
+        setPageTitle("AI Text to Photo".localized)
         
         contentView.addSubview(collectionComponent.collectionView)
         collectionComponent.collectionView.snp.makeConstraints { make in

+ 1 - 1
AIEmoji/Business/TSTextGeneralPictureVC/TSTextGeneralPictureVC/View/TSTTPSelectStyleCell.swift

@@ -103,7 +103,7 @@ class TSTTPSelectStyleCCell: TSBaseCollectionCell {
     var itemModel:TSPTPStyleModel = TSPTPStyleModel(){
         didSet{
             imageView.image = UIImage(named: itemModel.imageName)
-            textLabel.text = itemModel.imageText
+            textLabel.text = itemModel.imageText.localized
         }
     }
     

+ 2 - 2
AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVC.swift

@@ -148,7 +148,7 @@ extension TSTextPicGennerateVC {
     
     func showLoading(){
         generateInView.isHidden = false
-        generateInView.showLoading(text: "Generating...".localized)
+        generateInView.showLoading(text: "Generating".localized + " ...".localized)
         generateInView.isRotating = true
         
         isClickTheBlankClosePage = false
@@ -157,7 +157,7 @@ extension TSTextPicGennerateVC {
     }
     
     func showError(text:String?){
-        let msg = "Failed to Generate, please try later".localized
+        let msg = "Failed to generate, please try later".localized
         generateInView.isHidden = false
         generateInView.showError(text: msg)
         generateInView.isRotating = false

+ 2 - 6
AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVM.swift

@@ -90,7 +90,7 @@ class TSTextPicGennerateVM {
                                 guard let self = self else { return }
                         
                                 let progressInt = Int(progress*10.0)
-                                let progressString = "Generating \(90 + progressInt)%"
+                                let progressString = "Generating".localized + " \(90 + progressInt)%"
                                 stateDatauPblished = (.progressString(progressString),nil)
                                 dePrint("当前进度: \(progress)")
                             } completion: {[weak self] image in
@@ -133,15 +133,11 @@ class TSTextPicGennerateVM {
         //Generating 0%-100%
         var progressInt = Int(progress*100)
 
-//        if generatingProgress >= progressInt{
-//            return "Generating \(generatingProgress)%"
-//        }
-
         if progressInt > 99 {
             progressInt = 99
         }
         
         generatingProgress = progressInt
-        return "Generating \(progressInt)%"
+        return "Generating".localized + " \(progressInt)%"
     }
 }

+ 1 - 1
AIEmoji/Business/VIewTool/TSCommonloadingView.swift

@@ -33,7 +33,7 @@ class TSCommonloadingView: TSBaseView {
     }()
     
     lazy var textLabel: UILabel = {
-        let textLabel = UILabel.createLabel(font: .font(size: 12),textColor: .fromHex("#FFFFFF",alpha: 0.6))
+        let textLabel = UILabel.createLabel(font: .font(size: 10),textColor: .fromHex("#FFFFFF",alpha: 0.8))
         return textLabel
     }()
     

+ 8 - 7
AIEmoji/Common/GlobalImports/GlobalImports.swift

@@ -148,10 +148,11 @@ func kPushVC(target:UIViewController,modelVC:UIViewController){
 }
 
 
-extension String {
-    
-    var localized:String {
-        return self
-    }
-    
-}
+//public extension String {
+//    
+//    var localized:String {
+//        return NSLocalizedString(self, comment: self)
+////        return self
+//    }
+//    
+//}

+ 31 - 0
AIEmoji/Common/Tool/TSPhotoSizeHelper.swift

@@ -0,0 +1,31 @@
+//
+//  TSPhotoSizeHelper.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/4/6.
+//
+
+import Photos
+
+// MARK: - 精准获取图片大小(单位:字节)
+struct TSPhotoSizeHelper {
+    /// 同步获取(适合快速判断)
+    static func getImageFileSizeSync(asset: PHAsset) -> Int {
+        let resources = PHAssetResource.assetResources(for: asset)
+        guard let resource = resources.first else { return 0 }
+        return Int(resource.value(forKey: "fileSize") as? Int64 ?? 0)
+    }
+    
+    /// 异步获取(推荐主线程使用)
+    static func getImageFileSizeAsync(asset: PHAsset, completion: @escaping (Int) -> Void) {
+        DispatchQueue.global(qos: .userInitiated).async {
+            let size = getImageFileSizeSync(asset: asset)
+            DispatchQueue.main.async { completion(size) }
+        }
+    }
+    
+    /// 快速判断是否超过10MB
+    static func isLargerThan10MB(asset: PHAsset) -> Bool {
+        return getImageFileSizeSync(asset: asset) > 10 * 1024 * 1024
+    }
+}

+ 40 - 40
AIEmoji/Common/View/TSPhotoPickerManager/TSPhotoPickerManager.swift

@@ -12,7 +12,7 @@ class TSPhotoPickerManager: NSObject {
     
     // MARK: - Properties
     private weak var viewController: UIViewController?
-    private var completionHandler: ((UIImage?) -> Void)?
+    private var completionHandler: ((UIImage?,PHAsset?) -> Void)?
     
     // MARK: - Initializers
     init(viewController: UIViewController) {
@@ -21,7 +21,7 @@ class TSPhotoPickerManager: NSObject {
     
     // MARK: - Public Methods
     /// 打开照片选择器,单选一张照片
-    func pickSinglePhoto(completion: @escaping (UIImage?) -> Void) {
+    func pickSinglePhoto(completion: @escaping (UIImage?,PHAsset?) -> Void) {
         self.completionHandler = completion
         
         // 检查相册权限
@@ -55,23 +55,23 @@ class TSPhotoPickerManager: NSObject {
     
     /// 打开照片选择器
     private func openPhotoPicker() {
-        if #available(iOS 14, *) {
-            var configuration = PHPickerConfiguration(photoLibrary: .shared())
-            configuration.selectionLimit = 1 // 只能选择一张照片
-            configuration.filter = .images // 只显示照片,不显示视频
-            configuration.preferredAssetRepresentationMode = .current // 使用高质量图片
-            
-            let picker = PHPickerViewController(configuration: configuration)
-            picker.delegate = self
-            viewController?.present(picker, animated: true, completion: nil)
-        } else {
+//        if #available(iOS 14, *) {
+//            var configuration = PHPickerConfiguration(photoLibrary: .shared())
+//            configuration.selectionLimit = 1 // 只能选择一张照片
+//            configuration.filter = .images // 只显示照片,不显示视频
+//            configuration.preferredAssetRepresentationMode = .current // 使用高质量图片
+//            
+//            let picker = PHPickerViewController(configuration: configuration)
+//            picker.delegate = self
+//            viewController?.present(picker, animated: true, completion: nil)
+//        } else {
             // iOS 14 以下使用旧的 UIImagePickerController
             let imagePicker = UIImagePickerController()
             imagePicker.sourceType = .photoLibrary
             imagePicker.delegate = self
             imagePicker.mediaTypes = ["public.image"] // 只选择照片
             viewController?.present(imagePicker, animated: true, completion: nil)
-        }
+//        }
     }
     
     /// 显示权限提示
@@ -91,40 +91,40 @@ class TSPhotoPickerManager: NSObject {
     }
 }
 
-// MARK: - PHPickerViewControllerDelegate (iOS 14+)
-@available(iOS 14, *)
-extension TSPhotoPickerManager: PHPickerViewControllerDelegate {
-    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
-        picker.dismiss(animated: true) {
-            guard let result = results.first else {
-                self.completionHandler?(nil)
-                return
-            }
-            
-            // 获取选中的图片
-            result.itemProvider.loadObject(ofClass: UIImage.self) { [weak self] (object, error) in
-                if let image = object as? UIImage {
-                    DispatchQueue.main.async {
-                        self?.completionHandler?(image)
-                    }
-                } else {
-                    DispatchQueue.main.async {
-                        self?.completionHandler?(nil)
-                    }
-                }
-            }
-        }
-    }
-}
+//// MARK: - PHPickerViewControllerDelegate (iOS 14+)
+//@available(iOS 14, *)
+//extension TSPhotoPickerManager: PHPickerViewControllerDelegate {
+//    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
+//        picker.dismiss(animated: true) {
+//            guard let result = results.first else {
+//                self.completionHandler?(nil,nil)
+//                return
+//            }
+//            
+//            // 获取选中的图片
+//            result.itemProvider.loadObject(ofClass: UIImage.self) { [weak self] (object, error) in
+//                if let image = object as? UIImage {
+//                    DispatchQueue.main.async {
+//                        self?.completionHandler?(image)
+//                    }
+//                } else {
+//                    DispatchQueue.main.async {
+//                        self?.completionHandler?(nil,nil)
+//                    }
+//                }
+//            }
+//        }
+//    }
+//}
 
 // MARK: - UIImagePickerControllerDelegate & UINavigationControllerDelegate (iOS 14 以下)
 extension TSPhotoPickerManager: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
     func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
         picker.dismiss(animated: true) {
             if let image = info[.originalImage] as? UIImage {
-                self.completionHandler?(image)
+                self.completionHandler?(image,info[.phAsset] as? PHAsset )
             } else {
-                self.completionHandler?(nil)
+                self.completionHandler?(nil,nil)
             }
         }
     }

+ 0 - 6
AIEmoji/Res/photo_to_photo_style.json

@@ -60,11 +60,5 @@
         "imageText": "Vaporwave",
         "prompt":"Vaporwave aesthetic conversion:  Memphis Group pattern infusion (density 30%)  CRT magenta/cyan shift (ΔE 12-15)  Marble texture x digital grid fusion  1980s CGI primitive modeling (32-poly limit)  Palm tree/PVC column hybrid elements  VHS tracking error simulation (VHS-C NTSC)",
         "isVip": false
-    },
-    {
-        "imageName": "ptp_style_5",
-        "imageText": "Abstract Expressionism",
-        "prompt":"Abstract art transformation, non-representational geometric forms intersecting with organic fluid shapes, dynamic color field transitions from cobalt blue to burnt sienna, Kandinsky-inspired compositional balance, textured impasto surfaces with visible brushwork, Mondrian-esque grid structures dissolving into Pollock-like drips, high-contrast chromatic vibrations, ambiguous spatial depth with layered transparency effects, experimental mixed-media texture (acrylic/collage/digital glitch), emotional tension between order and chaos. Maintain original composition's structural essence while reinterpreting elements through fractured perspectives and symbolic color relationships. Style intensity: 88% --v 5.4 --stylize 950",
-        "isVip": false
     }
 ]

+ 2 - 8
AIEmoji/Res/text_to_photo_style.json

@@ -24,21 +24,15 @@
         "prompt":"Cyberpunk dystopian cityscape, neon-lit rainy streets with holographic advertisements, cyborgs with glowing cybernetic implants, towering megastructures in chrome and matte black, Blade Runner 2049 cinematic lighting --stylize 900 --ar 21:9",
         "isVip": false
     },
-    {
-        "imageName": "ttp_style_3",
-        "imageText": "Abstract",
-        "prompt":"Abstract expressionist painting, Jackson Pollock-inspired drips and splatters of cadmium red and Prussian blue, dynamic impasto brushstrokes on raw canvas, chaotic yet balanced composition --stylize 750 --ar 1:1",
-        "isVip": false
-    },
     {
         "imageName": "ttp_style_4",
-        "imageText": "Retro Americana",
+        "imageText": "Retro Anime",
         "prompt":"1950s American retro travel poster, vintage palette of mustard yellow and seafoam green, Route 66 highway with classic Chevrolet convertible, stylized typography 'Visit California', linen paper texture --stylize 700 --ar 4:3",
         "isVip": false
     },
     {
         "imageName": "ttp_style_5",
-        "imageText": "Lowbrow Art",
+        "imageText": "Art",
         "prompt":"Lowbrow pop surrealism, tattoo-inspired design of a pin-up girl with octopus tentacles, hot rod flames and dice motifs, saturated colors with black outlines, Robert Williams comic grotesque style --stylize 820 --ar 2:1",
         "isVip": false
     },

+ 10 - 0
AIEmoji/de.lproj/InfoPlist.strings

@@ -0,0 +1,10 @@
+/* 
+  InfoPlist.strings
+  AIEmoji
+
+  Created by 100Years on 2025/4/6.
+  
+*/
+
+
+NSPhotoLibraryUsageDescription = "Erlauben Sie uns den Zugriff auf Fotos, um Ihre Fotos hochzuladen und neue Stile zu generieren.";

+ 1 - 0
AIEmoji/de.lproj/LaunchScreen.strings

@@ -0,0 +1 @@
+

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

@@ -0,0 +1,116 @@
+/* 
+  Localizable.strings
+  AIEmoji
+
+  Created by 100Years on 2025/4/6.
+  
+*/
+
+"Before" = "Vorher";
+"After" = "Nachher";
+"Change image styles" = "Bildstil ändern";
+"AI image generation" = "KI-generiertes Bild";
+"Ask Ai anything" = "All-in-One KI-Chat-Assistent";
+"Continue" = "Weiter";
+"Premium" = "Mitgliedschaft";
+"Unlimited AI image generation" = "Unbegrenzte KI-Bildgenerierung";
+"Change image styles" = "Bildstil ändern";
+"Unlimited AI chat" = "All-in-One KI-Chat-Assistent";
+"Ad-free experience" = "Werbefreies Erlebnis";
+"One Year" = "Jährlich";
+"One Month" = "Monatlich";
+"One Week" = "Wöchentlich";
+"Recurring billing, cancel anytime" = "Regelmäßige Zahlung, jederzeit kündbar";
+",Payment will be charged to your iTunes account at confirmation of purchase. Subscriptions automatically renew for the same applicable term and price, unless auto-renew is turned off at least 24 hours before the end of the current period." = ",Die Zahlung wird nach Bestätigung von Ihrem iTunes-Konto abgebucht. Das Abonnement verlängert sich automatisch zu gleichen Konditionen, es sei denn, die automatische Verlängerung wird mindestens 24 Stunden vor Periodenende deaktiviert.";
+"Terms of us" = "Nutzungsbedingungen";
+"Privacy Policy" = "Datenschutzrichtlinie";
+"Restore" = "Kauf wiederherstellen";
+"Purchasing now" = "Jetzt kaufen";
+"Congratulation you have become VIP" = "Herzlichen Glückwunsch zum VIP-Status!";
+"Finish" = "Beenden";
+"Restoring now" = "Abonnement wird wiederhergestellt...";
+"Couldn't Restore Subscription" = "Abonnementwiederherstellung fehlgeschlagen";
+"Getting price" = "Preis wird abgerufen";
+"Failed to get the price, will automatically retry in 5 seconds" = "Preisabfrage fehlgeschlagen, Neuvorlage in 5 Sekunden";
+"Failed to restore subscribe, please try again" = "Wiederherstellung fehlgeschlagen, bitte erneut versuchen";
+"Verifying receipt..." = "Beleg wird überprüft...";
+"Failed to validate receipt" = "Belegüberprüfung fehlgeschlagen";
+"Photo" = "Foto";
+"Text ➡️ Photo" = "Text➡Foto";
+"Text ➡️ Emoji" = "Text➡Emoji";
+"Try Now" = "Ausprobieren";
+"Upload Photo" = "Foto hochladen";
+"(Size ≤ 10MB)" = "(Größe ≤10MB)";
+"Photo must be smaller than 10MB." = "Foto muss unter 10MB sein";
+"Tap to select photo" = "Zum Auswählen tippen";
+"Select Style" = "Stil auswählen";
+"Ghibli" = "Ghibli";
+"Fantasy Illustration" = "Hochwertige Illustration";
+"Retro Anime" = "Retro-Anime";
+"Classical Painting" = "Klassische Malerei";
+"Cyberpunk" = "Cyberpunk";
+"Pop Art" = "Pop-Art";
+"Retrofuturism" = "Retrofuturismus";
+"Photorealism" = "Realismus";
+"Modern Digital Art" = "Moderne Digitalkunst";
+"Vaporwave" = "Vaporwave";
+"Abstract Expressionism" = "Abstrakter Expressionismus";
+"History" = "Verlauf";
+"Example" = "Beispiel";
+"Generate" = "Jetzt generieren";
+"Save-Vip" = "Sparen";
+"Type your idea here." = "Geben Sie hier Ihre Ideen ein";
+"Hint Inspiration" = "Inspiration";
+"Graffiti" = "Skizze";
+"Abstract" = "Abstrakt";
+"Retro Americana" = "Retroamerikanisch";
+"Art" = "Kunst";
+"Comic" = "Comic";
+"Social Realism" = "Sozialer Realismus";
+"Regenerate" = "Neu generieren";
+"As you leave, your generation will be interrupted and no result." = "Beim Verlassen wird die Generierung abgebrochen";
+"Leave" = "Verlassen";
+"Wait" = "Warten";
+"Failed to generate, please try later" = "Generierung fehlgeschlagen, bitte später versuchen";
+"Greetings! Curious about\nwhat I can do?" = "Hallo! Wie kann ich Ihnen helfen?";
+"I can tackle your questions, my skillset includes, but is not limited to:\n`📧 Composing high-quality emails`\n`🇺🇸 Facilitating language learning`\n`📑 Assisting in your studies`\n`💡Brainstorming ideas`\n`and much more!`" = "Meine Fähigkeiten umfassen:\n📧 Professionelle E-Mails verfassen\n🇺🇸 Mehrsprachenlernen\n📑 Akademische Unterstützung\n💡Inspiration liefern\nUnd mehr!";
+"Send a message" = "Nachricht senden";
+"No record" = "Kein Verlauf";
+"Emoji" = "Emoji";
+"Copy" = "Kopieren";
+"Setting" = "Einstellungen";
+"Upgrade" = "Upgrade";
+"Limited Time Discount" = "Zeitbegrenztes Angebot";
+"Due Date:" = "Ablaufzeit:";
+"How to add emojis to iMessages?" = "Wie füge ich Emojis zu iMessage hinzu?";
+"Update Version" = "Version aktualisieren";
+"Share us" = "Teilen";
+"Rate us" = "Bewerten Sie uns";
+"Terms of Service" = "Nutzungsbedingungen";
+"Privacy Policy" = "Datenschutzrichtlinie";
+"Allow us to access Photos in order to save emoji to your device." = "Erlauben Sie Foto-Zugriff zum Speichern von Bildern";
+"Chat" = "Chat";
+
+"View" = "Überprüfen";
+"Are you sure to delete" = "Sind Sie sicher, dass Sie es löschen möchten?";
+"Cancel" = "Stornieren";
+"Delete" = "Löschen";
+"Allow us to access photos to upload your photos to generate new styles." = "Erlauben Sie uns den Zugriff auf Fotos, um Ihre Fotos hochzuladen und neue Stile zu generieren.";
+"Send a message" = "Nachricht senden";
+"Art" = "Kunst";
+"Generating" = "Wird generiert";
+"Uploading Photo" = "Foto wird hochgeladen";
+"Try Again" = "Erneut versuchen";
+"Save" = "Speichern";
+"AI Text to Emoji" = "KI-Text zu Emoji";
+"AI Text to Photo" = "KI-Fotogenerator";
+"Ghibli Style Example" = "Ghibli-Stil-Beispiel";
+
+"Today" = "Heute";
+"1 Day" = "1 Tag";
+"7 Days" = "7 Tage";
+"30 Days" = "30 Tage";
+"Thinking..." = "denken...";
+"Thought for %ds" = "%d Sekunden lang nachgedacht";
+"Copyed Successfully" = "Erfolgreich kopiert";
+"Save Successfully" = "Erfolgreich speichern";

+ 10 - 0
AIEmoji/en.lproj/InfoPlist.strings

@@ -0,0 +1,10 @@
+/* 
+  InfoPlist.strings
+  AIEmoji
+
+  Created by 100Years on 2025/4/6.
+  
+*/
+
+
+NSPhotoLibraryUsageDescription = "Allow us to access photos to upload your photos to generate new styles.";

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

@@ -0,0 +1,116 @@
+/* 
+  Localizable.strings
+  AIEmoji
+
+  Created by 100Years on 2025/4/6.
+  
+*/
+
+"Before" = "Before";
+"After" = "After";
+"Change image styles" = "Change image styles";
+"AI image generation" = "AI image generation";
+"Ask Ai anything" = "Ask Ai anything";
+"Continue" = "Continue";
+"Premium" = "Premium";
+"Unlimited AI image generation" = "Unlimited AI image generation";
+"Change image styles" = "Change image styles";
+"Unlimited AI chat" = "Unlimited AI chat";
+"Ad-free experience" = "Ad-free experience";
+"One Year" = "One Year";
+"One Month" = "One Month";
+"One Week" = "One Week";
+"Recurring billing, cancel anytime" = "Recurring billing, cancel anytime";
+",Payment will be charged to your iTunes account at confirmation of purchase. Subscriptions automatically renew for the same applicable term and price, unless auto-renew is turned off at least 24 hours before the end of the current period." = ",Payment will be charged to your iTunes account at confirmation of purchase. Subscriptions automatically renew for the same applicable term and price, unless auto-renew is turned off at least 24 hours before the end of the current period.";
+"Terms of us" = "Terms of us";
+"Privacy Policy" = "Privacy Policy";
+"Restore" = "Restore";
+"Purchasing now" = "Purchasing now";
+"Congratulation you have become VIP" = "Congratulation you have become VIP";
+"Finish" = "Finish";
+"Restoring now" = "Restoring now";
+"Couldn't Restore Subscription" = "Couldn't Restore Subscription";
+"Getting price" = "Getting price";
+"Failed to get the price, will automatically retry in 5 seconds" = "Failed to get the price, will automatically retry in 5 seconds";
+"Failed to restore subscribe, please try again" = "Failed to restore subscribe, please try again";
+"Verifying receipt..." = "Verifying receipt...";
+"Failed to validate receipt" = "Failed to validate receipt";
+"Photo" = "Photo";
+"Text ➡️ Photo" = "Text ➡️ Photo";
+"Text ➡️ Emoji" = "Text ➡️ Emoji";
+"Try Now" = "Try Now";
+"Upload Photo" = "Upload Photo";
+"(Size ≤ 10MB)" = "(Size ≤ 10MB)";
+"Photo must be smaller than 10MB." = "Photo must be smaller than 10MB.";
+"Tap to select photo" = "Tap to select photo";
+"Select Style" = "Select Style";
+"Ghibli" = "Ghibli";
+"Fantasy Illustration" = "Fantasy Illustration";
+"Retro Anime" = "Retro Anime";
+"Classical Painting" = "Classical Painting";
+"Cyberpunk" = "Cyberpunk";
+"Pop Art" = "Pop Art";
+"Retrofuturism" = "Retrofuturism";
+"Photorealism" = "Photorealism";
+"Modern Digital Art" = "Modern Digital Art";
+"Vaporwave" = "Vaporwave";
+"Abstract Expressionism" = "Abstract Expressionism";
+"History" = "History";
+"Example" = "Example";
+"Generate" = "Generate";
+"Save-Vip" = "Save";
+"Type your idea here." = "Type your idea here.";
+"Hint Inspiration" = "Hint Inspiration";
+"Graffiti" = "Graffiti";
+"Abstract" = "Abstract";
+"Retro Americana" = "Retro Americana";
+"Art" = "Art";
+"Comic" = "Comic";
+"Social Realism" = "Social Realism";
+"Regenerate" = "Regenerate";
+"As you leave, your generation will be interrupted and no result." = "As you leave, your generation will be interrupted and no result.";
+"Leave" = "Leave";
+"Wait" = "Wait";
+"Failed to generate, please try later" = "Failed to generate, please try later";
+"Greetings! Curious about\nwhat I can do?" = "Greetings! Curious about\nwhat I can do?";
+"I can tackle your questions, my skillset includes, but is not limited to:\n`📧 Composing high-quality emails`\n`🇺🇸 Facilitating language learning`\n`📑 Assisting in your studies`\n`💡Brainstorming ideas`\n`and much more!`" = "I can tackle your questions, my skillset includes, but is not limited to:\n`📧 Composing high-quality emails`\n`🇺🇸 Facilitating language learning`\n`📑 Assisting in your studies`\n`💡Brainstorming ideas`\n`and much more!`";
+"Send a message" = "Send a message";
+"No record" = "No record";
+"Emoji" = "Emoji";
+"Copy" = "Copy";
+"Setting" = "Setting";
+"Upgrade" = "Upgrade";
+"Limited Time Discount" = "Limited Time Discount";
+"Due Date:" = "Due Date:";
+"How to add emojis to iMessages?" = "How to add emojis to iMessages?";
+"Update Version" = "Update Version";
+"Share us" = "Share us";
+"Rate us" = "Rate us";
+"Terms of Service" = "Terms of Service";
+"Privacy Policy" = "Privacy Policy";
+"Allow us to access Photos in order to save emoji to your device." = "Allow us to access Photos in order to save emoji to your device.";
+"Chat" = "Chat";
+
+"View" = "View";
+"Are you sure to delete" = "Are you sure to delete";
+"Cancel" = "Cancel";
+"Delete" = "Delete";
+"Allow us to access photos to upload your photos to generate new styles." = "Allow us to access photos to upload your photos to generate new styles.";
+"Send a message" = "Send a message";
+"Art" = "Art";
+"Generating" = "Generating";
+"Uploading Photo" = "Uploading Photo";
+"Try Again" = "Try Again";
+"Save" = "Save";
+"AI Text to Emoji" = "AI Text to Emoji";
+"AI Text to Photo" = "AI Text to Photo";
+"Ghibli Style Example" = "Ghibli Style Example";
+
+"Today" = "Today";
+"1 Day" = "1 Day";
+"7 Days" = "7 Days";
+"30 Days" = "30 Days";
+"Thinking..." = "Thinking...";
+"Thought for %ds" = "Thought for %ds";
+"Copyed Successfully" = "Copyed Successfully";
+"Save Successfully" = "Save Successfully";

+ 10 - 0
AIEmoji/es.lproj/InfoPlist.strings

@@ -0,0 +1,10 @@
+/* 
+  InfoPlist.strings
+  AIEmoji
+
+  Created by 100Years on 2025/4/6.
+  
+*/
+
+
+NSPhotoLibraryUsageDescription = "Permítanos acceder a las fotos para cargar sus fotos y generar nuevos estilos.";

+ 1 - 0
AIEmoji/es.lproj/LaunchScreen.strings

@@ -0,0 +1 @@
+

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

@@ -0,0 +1,116 @@
+/* 
+  Localizable.strings
+  AIEmoji
+
+  Created by 100Years on 2025/4/6.
+  
+*/
+
+"Before" = "Anterior";
+"After" = "Posterior";
+"Change image styles" = "Cambiar estilo de imagen";
+"AI image generation" = "Imagen generada por IA";
+"Ask Ai anything" = "Asistente de diálogo IA todo en uno";
+"Continue" = "Continuar";
+"Premium" = "Membresía";
+"Unlimited AI image generation" = "Generación ilimitada de imágenes IA";
+"Change image styles" = "Cambiar estilo de imagen";
+"Unlimited AI chat" = "Asistente de diálogo IA todo en uno";
+"Ad-free experience" = "Experiencia sin anuncios";
+"One Year" = "Anualmente";
+"One Month" = "Mensualmente";
+"One Week" = "Semanalmente";
+"Recurring billing, cancel anytime" = "Facturación periódica, cancelación en cualquier momento";
+",Payment will be charged to your iTunes account at confirmation of purchase. Subscriptions automatically renew for the same applicable term and price, unless auto-renew is turned off at least 24 hours before the end of the current period." = ",El pago se cargará en su cuenta de iTunes tras la confirmación de compra. La suscripción se renovará automáticamente con los mismos términos y precio aplicables, a menos que se desactive la renovación automática al menos 24 horas antes del final del período actual.";
+"Terms of us" = "Términos de servicio";
+"Privacy Policy" = "Política de privacidad";
+"Restore" = "Restaurar compras";
+"Purchasing now" = "Comprar ahora";
+"Congratulation you have become VIP" = "¡Felicidades por ser VIP!";
+"Finish" = "Finalizar";
+"Restoring now" = "Restaurando suscripción...";
+"Couldn't Restore Subscription" = "No se pudo restaurar la suscripción";
+"Getting price" = "Obteniendo precio";
+"Failed to get the price, will automatically retry in 5 seconds" = "Error al obtener precio, reintentando en 5 segundos";
+"Failed to restore subscribe, please try again" = "Error al restaurar suscripción, intente de nuevo";
+"Verifying receipt..." = "Verificando recibo...";
+"Failed to validate receipt" = "Error al verificar recibo";
+"Photo" = "Foto";
+"Text ➡️ Photo" = "Texto➡Foto";
+"Text ➡️ Emoji" = "Texto➡Emoji";
+"Try Now" = "Probar";
+"Upload Photo" = "Subir foto";
+"(Size ≤ 10MB)" = "(Tamaño ≤10MB)";
+"Photo must be smaller than 10MB." = "La foto debe ser menor a 10MB";
+"Tap to select photo" = "Toca para seleccionar foto";
+"Select Style" = "Seleccionar estilo";
+"Ghibli" = "Ghibli";
+"Fantasy Illustration" = "Ilustración exquisita";
+"Retro Anime" = "Anime retro";
+"Classical Painting" = "Pintura clásica";
+"Cyberpunk" = "Cyberpunk";
+"Pop Art" = "Arte pop";
+"Retrofuturism" = "Retrofuturismo";
+"Photorealism" = "Realismo";
+"Modern Digital Art" = "Arte digital moderno";
+"Vaporwave" = "Vaporwave";
+"Abstract Expressionism" = "Expresionismo abstracto";
+"History" = "Historial";
+"Example" = "Ejemplo";
+"Generate" = "Generar ahora";
+"Save-Vip" = "Ahorrar";
+"Type your idea here." = "Ingresa tus ideas aquí";
+"Hint Inspiration" = "Inspiración";
+"Graffiti" = "Garabato";
+"Abstract" = "Abstracto";
+"Retro Americana" = "Estilo retro americano";
+"Art" = "Arte";
+"Comic" = "Cómic";
+"Social Realism" = "Realismo social";
+"Regenerate" = "Regenerar";
+"As you leave, your generation will be interrupted and no result." = "Si sales, la generación se interrumpirá";
+"Leave" = "Salir";
+"Wait" = "Esperando";
+"Failed to generate, please try later" = "Error de generación, intente más tarde";
+"Greetings! Curious about\nwhat I can do?" = "¡Hola! ¿Qué puedo hacer por ti?";
+"I can tackle your questions, my skillset includes, but is not limited to:\n`📧 Composing high-quality emails`\n`🇺🇸 Facilitating language learning`\n`📑 Assisting in your studies`\n`💡Brainstorming ideas`\n`and much more!`" = "Puedo resolver tus problemas. Mis habilidades incluyen:\n📧 Redactar emails profesionales\n🇺🇸 Aprender idiomas\n📑 Ayuda académica\n💡Brindar inspiración\n¡Y más!";
+"Send a message" = "Enviar mensaje";
+"No record" = "Sin registros";
+"Emoji" = "Emoji";
+"Copy" = "Copiar";
+"Setting" = "Configuración";
+"Upgrade" = "Mejorar";
+"Limited Time Discount" = "Oferta por tiempo limitado";
+"Due Date:" = "Expira:";
+"How to add emojis to iMessages?" = "¿Cómo agregar emojis a iMessage?";
+"Update Version" = "Actualizar versión";
+"Share us" = "Compartirnos";
+"Rate us" = "Calificarnos";
+"Terms of Service" = "Términos de servicio";
+"Privacy Policy" = "Política de privacidad";
+"Allow us to access Photos in order to save emoji to your device." = "Permitir acceso a fotos para guardar imágenes en tu dispositivo";
+"Chat" = "Chat";
+
+"View" = "Controlar";
+"Are you sure to delete" = "¿Estás seguro de eliminar?";
+"Cancel" = "Cancelar";
+"Delete" = "Borrar";
+"Allow us to access photos to upload your photos to generate new styles." = "Permítanos acceder a las fotos para cargar sus fotos y generar nuevos estilos.";
+"Send a message" = "Enviar mensaje";
+"Art" = "Arte";
+"Generating" = "Generando";
+"Uploading Photo" = "Subiendo foto";
+"Try Again" = "Reintentar";
+"Save" = "Guardar";
+"AI Text to Emoji" = "Texto a emoji con IA";
+"AI Text to Photo" = "Generador de imágenes IA";
+"Ghibli Style Example" = "Ejemplo de estilo Ghibli";
+
+"Today" = "Hoy";
+"1 Day" = "1 día";
+"7 Days" = "7 dias";
+"30 Days" = "30 dias";
+"Thinking..." = "pensar...";
+"Thought for %ds" = "Pensé durante %d segundos";
+"Copyed Successfully" = "Copiado exitosamente";
+"Save Successfully" = "Guardar con éxito";

+ 10 - 0
AIEmoji/ja.lproj/InfoPlist.strings

@@ -0,0 +1,10 @@
+/* 
+  InfoPlist.strings
+  AIEmoji
+
+  Created by 100Years on 2025/4/6.
+  
+*/
+
+
+NSPhotoLibraryUsageDescription = "写真にアクセスして写真をアップロードし、新しいスタイルを生成できるようにします。";

+ 1 - 0
AIEmoji/ja.lproj/LaunchScreen.strings

@@ -0,0 +1 @@
+

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

@@ -0,0 +1,116 @@
+/* 
+  Localizable.strings
+  AIEmoji
+
+  Created by 100Years on 2025/4/6.
+  
+*/
+
+"Before" = "前";
+"After" = "後";
+"Change image styles" = "画像スタイルを変更";
+"AI image generation" = "AI生成画像";
+"Ask Ai anything" = "万能AI対話アシスタント";
+"Continue" = "続ける";
+"Premium" = "プレミアム会員";
+"Unlimited AI image generation" = "無制限AI画像生成";
+"Change image styles" = "画像スタイルを変更";
+"Unlimited AI chat" = "万能AI対話アシスタント";
+"Ad-free experience" = "広告なし体験";
+"One Year" = "年間";
+"One Month" = "月額";
+"One Week" = "週間";
+"Recurring billing, cancel anytime" = "定期課金、いつでも解約";
+",Payment will be charged to your iTunes account at confirmation of purchase. Subscriptions automatically renew for the same applicable term and price, unless auto-renew is turned off at least 24 hours before the end of the current period." = ",購入確認後、iTunesアカウントから料金が引き落とされます。自動更新を現在の期間終了24時間前までにオフにしない限り、同じ条件・価格で自動更新されます。";
+"Terms of us" = "利用規約";
+"Privacy Policy" = "プライバシーポリシー";
+"Restore" = "購入を復元";
+"Purchasing now" = "今すぐ購入";
+"Congratulation you have become VIP" = "VIP登録おめでとうございます";
+"Finish" = "終了";
+"Restoring now" = "サブスクリプション復元中...";
+"Couldn't Restore Subscription" = "サブスクリプション復元失敗";
+"Getting price" = "価格取得中";
+"Failed to get the price, will automatically retry in 5 seconds" = "価格取得失敗、5秒後再試行";
+"Failed to restore subscribe, please try again" = "サブスクリプション復元失敗、再試行してください";
+"Verifying receipt..." = "領収書検証中...";
+"Failed to validate receipt" = "領収書検証失敗";
+"Photo" = "写真";
+"Text ➡️ Photo" = "テキスト➡写真";
+"Text ➡️ Emoji" = "テキスト➡絵文字";
+"Try Now" = "試してみる";
+"Upload Photo" = "写真をアップロード";
+"(Size ≤ 10MB)" = "(サイズ≤10MB)";
+"Photo must be smaller than 10MB." = "10MB以下の写真が必要";
+"Tap to select photo" = "タップして写真を選択";
+"Select Style" = "スタイル選択";
+"Ghibli" = "ジブリ";
+"Fantasy Illustration" = "精美イラスト";
+"Retro Anime" = "レトロアニメ";
+"Classical Painting" = "古典油絵";
+"Cyberpunk" = "サイバーパンク";
+"Pop Art" = "ポップアート";
+"Retrofuturism" = "レトロフューチャリズム";
+"Photorealism" = "リアリズム";
+"Modern Digital Art" = "現代デジタルアート";
+"Vaporwave" = "ヴェイパーウェーブ";
+"Abstract Expressionism" = "抽象表現主義";
+"History" = "履歴";
+"Example" = "サンプル";
+"Generate" = "今すぐ生成";
+"Save-Vip" = "節約";
+"Type your idea here." = "ここにアイデアを入力";
+"Hint Inspiration" = "インスピレーション";
+"Graffiti" = "落書き";
+"Abstract" = "抽象";
+"Retro Americana" = "レトロアメリカン";
+"Art" = "美術";
+"Comic" = "コミック";
+"Social Realism" = "社会リアリズム";
+"Regenerate" = "再生成";
+"As you leave, your generation will be interrupted and no result." = "画面を離れると生成が中断されます";
+"Leave" = "離れる";
+"Wait" = "待機中";
+"Failed to generate, please try later" = "生成失敗、後ほど再試行";
+"Greetings! Curious about\nwhat I can do?" = "こんにちは!何をお手伝いしましょうか?";
+"I can tackle your questions, my skillset includes, but is not limited to:\n`📧 Composing high-quality emails`\n`🇺🇸 Facilitating language learning`\n`📑 Assisting in your studies`\n`💡Brainstorming ideas`\n`and much more!`" = "私の能力は多岐にわたります:\n📧 高品質メール作成\n🇺🇸 多言語学習\n📑 学業サポート\n💡インスピレーション提供\nその他多数!";
+"Send a message" = "メッセージを送信";
+"No record" = "履歴なし";
+"Emoji" = "絵文字";
+"Copy" = "コピー";
+"Setting" = "設定";
+"Upgrade" = "アップグレード";
+"Limited Time Discount" = "期間限定割引";
+"Due Date:" = "有効期限:";
+"How to add emojis to iMessages?" = "iMessageに絵文字を追加する方法";
+"Update Version" = "バージョン更新";
+"Share us" = "共有する";
+"Rate us" = "評価する";
+"Terms of Service" = "利用規約";
+"Privacy Policy" = "プライバシーポリシー";
+"Allow us to access Photos in order to save emoji to your device." = "デバイスに画像を保存するための写真アクセス許可";
+"Chat" = "チャット";
+
+"View" = "チェック";
+"Are you sure to delete" = "削除してもよろしいですか";
+"Cancel" = "キャンセル";
+"Delete" = "消去";
+"Allow us to access photos to upload your photos to generate new styles." = "写真にアクセスして写真をアップロードし、新しいスタイルを生成できるようにします。";
+"Send a message" = "メッセージを送信";
+"Art" = "美術";
+"Generating" = "生成中";
+"Uploading Photo" = "写真をアップロード中";
+"Try Again" = "再試行";
+"Save" = "保存";
+"AI Text to Emoji" = "AIテキスト→絵文字";
+"AI Text to Photo" = "AI画像ジェネレーター";
+"Ghibli Style Example" = "ジブリスタイルの例";
+
+"Today" = "今日";
+"1 Day" = "1日";
+"7 Days" = "7日間";
+"30 Days" = "30日";
+"Thinking..." = "考える...";
+"Thought for %ds" = "%d 秒間考えました";
+"Copyed Successfully" = "正常にコピーされました";
+"Save Successfully" = "正常に保存されました";

+ 10 - 0
AIEmoji/ko.lproj/InfoPlist.strings

@@ -0,0 +1,10 @@
+/* 
+  InfoPlist.strings
+  AIEmoji
+
+  Created by 100Years on 2025/4/6.
+  
+*/
+
+
+NSPhotoLibraryUsageDescription = "새로운 스타일을 생성하기 위해 사진에 액세스하여 사진을 업로드할 수 있도록 허용해 주세요.";

+ 1 - 0
AIEmoji/ko.lproj/LaunchScreen.strings

@@ -0,0 +1 @@
+

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

@@ -0,0 +1,116 @@
+/* 
+  Localizable.strings
+  AIEmoji
+
+  Created by 100Years on 2025/4/6.
+  
+*/
+
+"Before" = "이전";
+"After" = "이후";
+"Change image styles" = "이미지 스타일 변경하기";
+"AI image generation" = "AI 이미지 생성";
+"Ask Ai anything" = "올인원 AI 대화 도우미";
+"Continue" = "계속하기";
+"Premium" = "회원";
+"Unlimited AI image generation" = "무제한 AI 이미지 생성";
+"Change image styles" = "이미지 스타일 변경";
+"Unlimited AI chat" = "올인원 AI 어시스턴트";
+"Ad-free experience" = "광고 없는 경험";
+"One Year" = "연간";
+"One Month" = "월간";
+"One Week" = "주간";
+"Recurring billing, cancel anytime" = "정기 결제, 언제든 취소 가능";
+",Payment will be charged to your iTunes account at confirmation of purchase. Subscriptions automatically renew for the same applicable term and price, unless auto-renew is turned off at least 24 hours before the end of the current period." = "결제는 구매 확인 시 iTunes 계정으로 청구됩니다. 구독은 현재 기간 종료 24시간 전까지 자동 갱신을 해제하지 않을 경우 동일 조건/가격으로 자동 갱신됩니다.";
+"Terms of us" = "이용약관";
+"Privacy Policy" = "개인정보 보호정책";
+"Restore" = "구매 복원";
+"Purchasing now" = "지금 구매";
+"Congratulation you have become VIP" = "VIP 가입을 축하합니다";
+"Finish" = "종료";
+"Restoring now" = "구독 복원 중";
+"Couldn't Restore Subscription" = "구독 복원 불가";
+"Getting price" = "가격 확인 중";
+"Failed to get the price, will automatically retry in 5 seconds" = "가격 확인 실패, 5초 후 자동 재시도";
+"Failed to restore subscribe, please try again" = "구독 복원 실패, 다시 시도해 주세요";
+"Verifying receipt..." = "영수증 검증 중...";
+"Failed to validate receipt" = "영수증 검증 실패";
+"Photo" = "사진";
+"Text ➡️ Photo" = "텍스트➡️사진";
+"Text ➡️ Emoji" = "텍스트➡️이모티콘";
+"Try Now" = "시도해보기";
+"Upload Photo" = "사진 업로드";
+"(Size ≤ 10MB)" = "(크기≤10MB)";
+"Photo must be smaller than 10MB." = "10MB 미만 사진만 가능";
+"Tap to select photo" = "사진 선택을 눌러주세요";
+"Select Style" = "스타일 선택";
+"Ghibli" = "지브리";
+"Fantasy Illustration" = "정교한 일러스트";
+"Retro Anime" = "레트로 애니메";
+"Classical Painting" = "고전 유화";
+"Cyberpunk" = "사이버펑크";
+"Pop Art" = "팝아트";
+"Retrofuturism" = "레트로퓨처리즘";
+"Photorealism" = "사실주의";
+"Modern Digital Art" = "현대 디지털 아트";
+"Vaporwave" = "뉴웨이브";
+"Abstract Expressionism" = "추상표현주의";
+"History" = "기록";
+"Example" = "예시";
+"Generate" = "즉시 생성";
+"Save-Vip" = "절약";
+"Type your idea here." = "여기에 아이디어 입력";
+"Hint Inspiration" = "영감 프롬프트";
+"Graffiti" = "스케치";
+"Abstract" = "추상";
+"Retro Americana" = "레트로 아메리칸";
+"Art" = "미술";
+"Comic" = "만화";
+"Social Realism" = "사회적 리얼리즘";
+"Regenerate" = "재생성";
+"As you leave, your generation will be interrupted and no result." = "페이지 이탈 시 이미지 생성이 중단되어 결과물이 나오지 않습니다";
+"Leave" = "나가기";
+"Wait" = "대기 중";
+"Failed to generate, please try later" = "생성 실패, 잠시 후 다시 시도해 주세요";
+"Greetings! Curious about\nwhat I can do?" = "안녕하세요! 궁금하신\n제가 무엇을 할 수 있을까요?";
+"I can tackle your questions, my skillset includes, but is not limited to:\n`📧 Composing high-quality emails`\n`🇺🇸 Facilitating language learning`\n`📑 Assisting in your studies`\n`💡Brainstorming ideas`\n`and much more!`" = "고품질 이메일 작성부터\n🇺🇸 다국어 학습 지원\n📑 학업 도움\n💡 영감 제공\n등 다양한 작업이 가능합니다";
+"Send a message" = "메시지 보내기";
+"No record" = "기록 없음";
+"Emoji" = "이모티콘";
+"Copy" = "복사";
+"Setting" = "설정";
+"Upgrade" = "업그레이드";
+"Limited Time Discount" = "한정 할인";
+"Due Date:" = "만료 시간:";
+"How to add emojis to iMessages?" = "iMessage에 이모티콘을 추가하는 방법?";
+"Update Version" = "버전 업데이트";
+"Share us" = "공유하기";
+"Rate us" = "평가하기";
+"Terms of Service" = "이용약관";
+"Privacy Policy" = "개인정보 보호정책";
+"Allow us to access Photos in order to save emoji to your device." = "기기에 스티커 이미지 등을 저장하기 위해 사진 접근 권한 허용";
+"Chat" = "채팅";
+
+"View" = "확인하다";
+"Are you sure to delete" = "삭제하시겠습니까?";
+"Cancel" = "취소";
+"Delete" = "삭제";
+"Allow us to access photos to upload your photos to generate new styles." = "새로운 스타일을 생성하기 위해 사진에 액세스하여 사진을 업로드할 수 있도록 허용해 주세요.";
+"Send a message" = "메시지 보내기";
+"Art" = "미술";
+"Generating" = "생성 중";
+"Uploading Photo" = "사진 업로드 중";
+"Try Again" = "다시 시도";
+"Save" = "저장";
+"AI Text to Emoji" = "AI 텍스트→이모지";
+"AI Text to Photo" = "AI 이미지 생성기";
+"Ghibli Style Example" = "지브리 스타일 예시";
+
+"Today" = "오늘";
+"1 Day" = "1일";
+"7 Days" = "7일";
+"30 Days" = "30일";
+"Thinking..." = "생각하다...";
+"Thought for %ds" = "%d초 동안 생각함";
+"Copyed Successfully" = "성공적으로 복사되었습니다";
+"Save Successfully" = "성공적으로 저장되었습니다";

+ 10 - 0
AIEmoji/pt-BR.lproj/InfoPlist.strings

@@ -0,0 +1,10 @@
+/* 
+  InfoPlist.strings
+  AIEmoji
+
+  Created by 100Years on 2025/4/6.
+  
+*/
+
+
+NSPhotoLibraryUsageDescription = "Permita-nos acessar fotos para fazer upload de suas fotos para gerar novos estilos.";

+ 1 - 0
AIEmoji/pt-BR.lproj/LaunchScreen.strings

@@ -0,0 +1 @@
+

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

@@ -0,0 +1,117 @@
+/* 
+  Localizable.strings
+  AIEmoji
+
+  Created by 100Years on 2025/4/6.
+  
+*/
+
+"Before" = "Anterior";
+"After" = "Posterior";
+"Change image styles" = "Alterar estilo da imagem";
+"AI image generation" = "Imagem gerada por IA";
+"Ask Ai anything" = "Assistente de diálogo IA completo";
+"Continue" = "Continuar";
+"Premium" = "Assinatura";
+"Unlimited AI image generation" = "Geração ilimitada de imagens IA";
+"Change image styles" = "Alterar estilo da imagem";
+"Unlimited AI chat" = "Assistente de diálogo IA completo";
+"Ad-free experience" = "Experiência sem anúncios";
+"One Year" = "Anual";
+"One Month" = "Mensal";
+"One Week" = "Semanal";
+"Recurring billing, cancel anytime" = "Cobrança periódica, cancele a qualquer momento";
+",Payment will be charged to your iTunes account at confirmation of purchase. Subscriptions automatically renew for the same applicable term and price, unless auto-renew is turned off at least 24 hours before the end of the current period." = ",O pagamento será debitado da sua conta do iTunes após confirmação da compra. A assinatura renova automaticamente com os mesmos termos e preço, a menos que a renovação automática seja desativada pelo menos 24 horas antes do final do período atual.";
+"Terms of us" = "Termos de uso";
+"Privacy Policy" = "Política de privacidade";
+"Restore" = "Restaurar compras";
+"Purchasing now" = "Comprar agora";
+"Congratulation you have become VIP" = "Parabéns por ser VIP!";
+"Finish" = "Concluir";
+"Restoring now" = "Restaurando assinatura...";
+"Couldn't Restore Subscription" = "Falha ao restaurar assinatura";
+"Getting price" = "Obtendo preço";
+"Failed to get the price, will automatically retry in 5 seconds" = "Falha ao obter preço, tentando em 5 segundos";
+"Failed to restore subscribe, please try again" = "Falha ao restaurar assinatura, tente novamente";
+"Verifying receipt..." = "Verificando recibo...";
+"Failed to validate receipt" = "Falha na verificação do recibo";
+"Photo" = "Foto";
+"Text ➡️ Photo" = "Texto➡Foto";
+"Text ➡️ Emoji" = "Texto➡Emoji";
+"Try Now" = "Experimentar";
+"Upload Photo" = "Carregar foto";
+"(Size ≤ 10MB)" = "(Tamanho ≤10MB)";
+"Photo must be smaller than 10MB." = "A foto deve ter menos de 10MB";
+"Tap to select photo" = "Toque para selecionar foto";
+"Select Style" = "Selecionar estilo";
+"Ghibli" = "Ghibli";
+"Fantasy Illustration" = "Ilustração requintada";
+"Retro Anime" = "Anime retrô";
+"Classical Painting" = "Pintura clássica";
+"Cyberpunk" = "Cyberpunk";
+"Pop Art" = "Arte pop";
+"Retrofuturism" = "Retrofuturismo";
+"Photorealism" = "Realismo";
+"Modern Digital Art" = "Arte digital moderna";
+"Vaporwave" = "Vaporwave";
+"Abstract Expressionism" = "Expressionismo abstrato";
+"History" = "Histórico";
+"Example" = "Exemplo";
+"Generate" = "Gerar agora";
+"Save-Vip" = "Economizar";
+"Type your idea here." = "Digite suas ideias aqui";
+"Hint Inspiration" = "Inspiração";
+"Graffiti" = "Rabisco";
+"Abstract" = "Abstrato";
+"Retro Americana" = "Estilo retrô americano";
+"Art" = "Arte";
+"Comic" = "Quadrinhos";
+"Social Realism" = "Realismo social";
+"Regenerate" = "Regenerar";
+"As you leave, your generation will be interrupted and no result." = "Sair interromperá a geração";
+"Leave" = "Sair";
+"Wait" = "Aguardando";
+"Failed to generate, please try later" = "Falha na geração, tente mais tarde";
+"Greetings! Curious about\nwhat I can do?" = "Olá! O que posso fazer por você?";
+"I can tackle your questions, my skillset includes, but is not limited to:\n`📧 Composing high-quality emails`\n`🇺🇸 Facilitating language learning`\n`📑 Assisting in your studies`\n`💡Brainstorming ideas`\n`and much more!`" = "Posso resolver seus problemas. Minhas habilidades incluem:\n📧 Escrever e-mails profissionais\n🇺🇸 Aprender idiomas\n📑 Ajuda acadêmica\n💡Fornecer inspiração\nE mais!";
+"Send a message" = "Enviar mensagem";
+"No record" = "Sem registros";
+"Emoji" = "Emoji";
+"Copy" = "Copiar";
+"Setting" = "Configurações";
+"Upgrade" = "Atualizar";
+"Limited Time Discount" = "Oferta por tempo limitado";
+"Due Date:" = "Expira em:";
+"How to add emojis to iMessages?" = "Como adicionar emojis ao iMessage?";
+"Update Version" = "Atualizar versão";
+"Share us" = "Compartilhar";
+"Rate us" = "Avaliar-nos";
+"Terms of Service" = "Termos de uso";
+"Privacy Policy" = "Política de privacidade";
+"Allow us to access Photos in order to save emoji to your device." = "Permitir acesso às fotos para salvar imagens no dispositivo";
+"Chat" = "Chat";
+
+"View" = "Verificar";
+"Are you sure to delete" = "Tem certeza de excluir";
+"Cancel" = "Cancelar";
+"Delete" = "Excluir";
+"Allow us to access photos to upload your photos to generate new styles." = "Permita-nos acessar fotos para fazer upload de suas fotos para gerar novos estilos.";
+"Send a message" = "Enviar mensagem";
+"Art" = "Arte";
+"Generating" = "Gerando";
+"Uploading Photo" = "Carregando foto";
+"Try Again" = "Tentar novamente";
+"Save" = "Salvar";
+"AI Text to Emoji" = "Texto para emoji com IA";
+"AI Text to Photo" = "Gerador de fotos IA";
+"Ghibli Style Example" = "Exemplo de estilo Ghibli";
+
+"Today" = "Hoje";
+"1 Day" = "1 dia";
+"7 Days" = "7 dias";
+"30 Days" = "30 dias";
+"Thinking..." = "pensar...";
+"Thought for %ds" = "Pensei por %d segundos";
+"Copyed Successfully" = "Copiado com sucesso";
+"Save Successfully" = "Salvar com sucesso";
+

+ 1 - 0
AIEmoji/pt-PT.lproj/LaunchScreen.strings

@@ -0,0 +1 @@
+

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

@@ -0,0 +1,117 @@
+/* 
+  Localizable.strings
+  AIEmoji
+
+  Created by 100Years on 2025/4/6.
+  
+*/
+
+"Before" = "Anterior";
+"After" = "Posterior";
+"Change image styles" = "Alterar estilo da imagem";
+"AI image generation" = "Imagem gerada por IA";
+"Ask Ai anything" = "Assistente de diálogo IA completo";
+"Continue" = "Continuar";
+"Premium" = "Assinatura";
+"Unlimited AI image generation" = "Geração ilimitada de imagens IA";
+"Change image styles" = "Alterar estilo da imagem";
+"Unlimited AI chat" = "Assistente de diálogo IA completo";
+"Ad-free experience" = "Experiência sem anúncios";
+"One Year" = "Anual";
+"One Month" = "Mensal";
+"One Week" = "Semanal";
+"Recurring billing, cancel anytime" = "Cobrança periódica, cancele a qualquer momento";
+",Payment will be charged to your iTunes account at confirmation of purchase. Subscriptions automatically renew for the same applicable term and price, unless auto-renew is turned off at least 24 hours before the end of the current period." = ",O pagamento será debitado da sua conta do iTunes após confirmação da compra. A assinatura renova automaticamente com os mesmos termos e preço, a menos que a renovação automática seja desativada pelo menos 24 horas antes do final do período atual.";
+"Terms of us" = "Termos de uso";
+"Privacy Policy" = "Política de privacidade";
+"Restore" = "Restaurar compras";
+"Purchasing now" = "Comprar agora";
+"Congratulation you have become VIP" = "Parabéns por ser VIP!";
+"Finish" = "Concluir";
+"Restoring now" = "Restaurando assinatura...";
+"Couldn't Restore Subscription" = "Falha ao restaurar assinatura";
+"Getting price" = "Obtendo preço";
+"Failed to get the price, will automatically retry in 5 seconds" = "Falha ao obter preço, tentando em 5 segundos";
+"Failed to restore subscribe, please try again" = "Falha ao restaurar assinatura, tente novamente";
+"Verifying receipt..." = "Verificando recibo...";
+"Failed to validate receipt" = "Falha na verificação do recibo";
+"Photo" = "Foto";
+"Text ➡️ Photo" = "Texto➡Foto";
+"Text ➡️ Emoji" = "Texto➡Emoji";
+"Try Now" = "Experimentar";
+"Upload Photo" = "Carregar foto";
+"(Size ≤ 10MB)" = "(Tamanho ≤10MB)";
+"Photo must be smaller than 10MB." = "A foto deve ter menos de 10MB";
+"Tap to select photo" = "Toque para selecionar foto";
+"Select Style" = "Selecionar estilo";
+"Ghibli" = "Ghibli";
+"Fantasy Illustration" = "Ilustração requintada";
+"Retro Anime" = "Anime retrô";
+"Classical Painting" = "Pintura clássica";
+"Cyberpunk" = "Cyberpunk";
+"Pop Art" = "Arte pop";
+"Retrofuturism" = "Retrofuturismo";
+"Photorealism" = "Realismo";
+"Modern Digital Art" = "Arte digital moderna";
+"Vaporwave" = "Vaporwave";
+"Abstract Expressionism" = "Expressionismo abstrato";
+"History" = "Histórico";
+"Example" = "Exemplo";
+"Generate" = "Gerar agora";
+"Save-Vip" = "Economizar";
+"Type your idea here." = "Digite suas ideias aqui";
+"Hint Inspiration" = "Inspiração";
+"Graffiti" = "Rabisco";
+"Abstract" = "Abstrato";
+"Retro Americana" = "Estilo retrô americano";
+"Art" = "Arte";
+"Comic" = "Quadrinhos";
+"Social Realism" = "Realismo social";
+"Regenerate" = "Regenerar";
+"As you leave, your generation will be interrupted and no result." = "Sair interromperá a geração";
+"Leave" = "Sair";
+"Wait" = "Aguardando";
+"Failed to generate, please try later" = "Falha na geração, tente mais tarde";
+"Greetings! Curious about\nwhat I can do?" = "Olá! O que posso fazer por você?";
+"I can tackle your questions, my skillset includes, but is not limited to:\n`📧 Composing high-quality emails`\n`🇺🇸 Facilitating language learning`\n`📑 Assisting in your studies`\n`💡Brainstorming ideas`\n`and much more!`" = "Posso resolver seus problemas. Minhas habilidades incluem:\n📧 Escrever e-mails profissionais\n🇺🇸 Aprender idiomas\n📑 Ajuda acadêmica\n💡Fornecer inspiração\nE mais!";
+"Send a message" = "Enviar mensagem";
+"No record" = "Sem registros";
+"Emoji" = "Emoji";
+"Copy" = "Copiar";
+"Setting" = "Configurações";
+"Upgrade" = "Atualizar";
+"Limited Time Discount" = "Oferta por tempo limitado";
+"Due Date:" = "Expira em:";
+"How to add emojis to iMessages?" = "Como adicionar emojis ao iMessage?";
+"Update Version" = "Atualizar versão";
+"Share us" = "Compartilhar";
+"Rate us" = "Avaliar-nos";
+"Terms of Service" = "Termos de uso";
+"Privacy Policy" = "Política de privacidade";
+"Allow us to access Photos in order to save emoji to your device." = "Permitir acesso às fotos para salvar imagens no dispositivo";
+"Chat" = "Chat";
+
+"View" = "Verificar";
+"Are you sure to delete" = "Tem certeza de excluir";
+"Cancel" = "Cancelar";
+"Delete" = "Excluir";
+"Allow us to access photos to upload your photos to generate new styles." = "Permita-nos acessar fotos para fazer upload de suas fotos para gerar novos estilos.";
+"Send a message" = "Enviar mensagem";
+"Art" = "Arte";
+"Generating" = "Gerando";
+"Uploading Photo" = "Carregando foto";
+"Try Again" = "Tentar novamente";
+"Save" = "Salvar";
+"AI Text to Emoji" = "Texto para emoji com IA";
+"AI Text to Photo" = "Gerador de fotos IA";
+"Ghibli Style Example" = "Exemplo de estilo Ghibli";
+
+"Today" = "Hoje";
+"1 Day" = "1 dia";
+"7 Days" = "7 dias";
+"30 Days" = "30 dias";
+"Thinking..." = "pensar...";
+"Thought for %ds" = "Pensei por %d segundos";
+"Copyed Successfully" = "Copiado com sucesso";
+"Save Successfully" = "Salvar com sucesso";
+

+ 10 - 0
AIEmoji/zh-Hans.lproj/InfoPlist.strings

@@ -0,0 +1,10 @@
+/* 
+  InfoPlist.strings
+  AIEmoji
+
+  Created by 100Years on 2025/4/6.
+  
+*/
+
+
+NSPhotoLibraryUsageDescription = "允许我们访问照片以上传您的照片以生成新的样式。";

+ 1 - 0
AIEmoji/zh-Hans.lproj/LaunchScreen.strings

@@ -0,0 +1 @@
+

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

@@ -0,0 +1,116 @@
+/* 
+  Localizable.strings
+  AIEmoji
+
+  Created by 100Years on 2025/4/6.
+  
+*/
+
+"Before" = "前";
+"After" = "后";
+"Change image styles" = "改变图像风格";
+"AI image generation" = "AI 生成图像";
+"Ask Ai anything" = "全能 AI 对话助手";
+"Continue" = "继续";
+"Premium" = "会员";
+"Unlimited AI image generation" = "无限次 AI 图像生成";
+"Change image styles" = "改变图像风格";
+"Unlimited AI chat" = "全能 AI 对话助手";
+"Ad-free experience" = "无广告体验";
+"One Year" = "每年";
+"One Month" = "每月";
+"One Week" = "每周";
+"Recurring billing, cancel anytime" = "定期计费,随时取消";
+",Payment will be charged to your iTunes account at confirmation of purchase. Subscriptions automatically renew for the same applicable term and price, unless auto-renew is turned off at least 24 hours before the end of the current period." = ",付款将在确认购买时从您的 iTunes 帐户中扣除。订阅会自动续订相同的适用条款和价格,除非在当前期间结束前至少 24 小时关闭自动续订。";
+"Terms of us" = "用户协议";
+"Privacy Policy" = "隐私协议";
+"Restore" = "恢复购买";
+"Purchasing now" = "立即购买";
+"Congratulation you have become VIP" = "恭喜您成为 VIP";
+"Finish" = "结束";
+"Restoring now" = "正在恢复订阅中";
+"Couldn't Restore Subscription" = "无法恢复订阅";
+"Getting price" = "获取价格中";
+"Failed to get the price, will automatically retry in 5 seconds" = "获取价格失败,5秒后自动重试";
+"Failed to restore subscribe, please try again" = "恢复订阅失败,请重试";
+"Verifying receipt..." = "正在验证收据...";
+"Failed to validate receipt" = "验证收据失败";
+"Photo" = "照片";
+"Text ➡️ Photo" = "文字➡️图像";
+"Text ➡️ Emoji" = "文字➡️表情";
+"Try Now" = "试一试";
+"Upload Photo" = "上传照片";
+"(Size ≤ 10MB)" = "(大小≤10MB)";
+"Photo must be smaller than 10MB." = "照片必须小于 10MB";
+"Tap to select photo" = "点击以选择照片";
+"Select Style" = "选择风格";
+"Ghibli" = "吉卜力";
+"Fantasy Illustration" = "精美插画";
+"Retro Anime" = "复古动漫";
+"Classical Painting" = "古典油画";
+"Cyberpunk" = "赛博朋克";
+"Pop Art" = "波普艺术";
+"Retrofuturism" = "复古未来主义";
+"Photorealism" = "写实主义";
+"Modern Digital Art" = "现代数字艺术";
+"Vaporwave" = "蒸汽波";
+"Abstract Expressionism" = "抽象表现主义";
+"History" = "历史记录";
+"Example" = "示例";
+"Generate" = "立刻生成";
+"Save-Vip" = "节省";
+"Type your idea here." = "在此输入您的想法";
+"Hint Inspiration" = "灵感提示";
+"Graffiti" = "涂鸦";
+"Abstract" = "抽象";
+"Retro Americana" = "复古美式";
+"Art" = "艺术";
+"Comic" = "漫画";
+"Social Realism" = "社会现实主义";
+"Regenerate" = "重新生成";
+"As you leave, your generation will be interrupted and no result." = "一旦离开,你的图像生成就会中断导致没有结果";
+"Leave" = "离开";
+"Wait" = "等待";
+"Failed to generate, please try later" = "生成失败,请稍后再试";
+"Greetings! Curious about\nwhat I can do?" = "你好!好奇我能做什么?";
+"I can tackle your questions, my skillset includes, but is not limited to:\n`📧 Composing high-quality emails`\n`🇺🇸 Facilitating language learning`\n`📑 Assisting in your studies`\n`💡Brainstorming ideas`\n`and much more!`" = "我可以解决您的问题,我的技能包括但不限于:\n`📧 撰写高质量的电子邮件`\n`🇺🇸 学习多语言`\n`📑 协助您的学业`\n`💡为你提供灵感`\n`等等!`";
+"Send a message" = "发消息试试吧";
+"No record" = "无记录";
+"Emoji" = "表情";
+"Copy" = "复制";
+"Setting" = "设置";
+"Upgrade" = "升级";
+"Limited Time Discount" = "限时折扣";
+"Due Date:" = "过期时间:";
+"How to add emojis to iMessages?" = "如何将表情符号添加到 iMessage 中?";
+"Update Version" = "更新版本";
+"Share us" = "分享我们";
+"Rate us" = "评价我们";
+"Terms of Service" = "用户协议";
+"Privacy Policy" = "隐私协议";
+"Allow us to access Photos in order to save emoji to your device." = "允许我们访问照片权限以便将表情图片等保存到您的设备中";
+"Chat" = "聊天";
+
+"View" = "查看";
+"Are you sure to delete" = "您确定要删除吗";
+"Cancel" = "取消";
+"Delete" = "删除";
+"Allow us to access photos to upload your photos to generate new styles." = "允许我们访问照片以上传您的照片以生成新的样式。";
+"Send a message" = "发消息试试吧";
+"Art" = "艺术";
+"Generating" = "生成中";
+"Uploading Photo" = "上传照片";
+"Try Again" = "重试";
+"Save" = "保存";
+"AI Text to Emoji" = "AI 文字转表情";
+"AI Text to Photo" = "AI 文字转图像";
+"Ghibli Style Example" = "吉卜力风格示例";
+
+"Today" = "今天";
+"1 Day" = "1 天";
+"7 Days" = "7天";
+"30 Days" = "30天";
+"Thinking..." = "思考...";
+"Thought for %ds" = "已思考 %d 秒";
+"Copyed Successfully" = "复制成功";
+"Save Successfully" = "保存成功";