Ver código fonte

照片融合开发完毕

100Years 3 semanas atrás
pai
commit
953a75028e
24 arquivos alterados com 263 adições e 68 exclusões
  1. 4 4
      TSLiveWallpaper.xcodeproj/project.pbxproj
  2. 22 0
      TSLiveWallpaper/Assets.xcassets/AIList/tips.imageset/Contents.json
  3. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/tips.imageset/tips@2x.png
  4. BIN
      TSLiveWallpaper/Assets.xcassets/AIList/tips.imageset/tips@3x.png
  5. 27 20
      TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/TSAIListHistoryVC.swift
  6. 2 3
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM.swift
  7. 13 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsBrowserCell.swift
  8. 5 18
      TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC+Image.swift
  9. 1 1
      TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC.swift
  10. 73 19
      TSLiveWallpaper/Business/TSAIListVC/TSFusionImageVC/TSFusionImageVC.swift
  11. 1 0
      TSLiveWallpaper/Business/TSMineVC/TSChangeLanguageVC/TSChangeLanguageVC.swift
  12. 19 1
      TSLiveWallpaper/Common/Tool/LanguageManager.swift
  13. 8 2
      TSLiveWallpaper/Common/ViewTool/TSPhotoPickerManager/TSPhotoPickerManager.swift
  14. 8 0
      TSLiveWallpaper/ar.lproj/Localizable.strings
  15. 8 0
      TSLiveWallpaper/de.lproj/Localizable.strings
  16. 8 0
      TSLiveWallpaper/en.lproj/Localizable.strings
  17. 8 0
      TSLiveWallpaper/es.lproj/Localizable.strings
  18. 8 0
      TSLiveWallpaper/fr.lproj/Localizable.strings
  19. 8 0
      TSLiveWallpaper/it.lproj/Localizable.strings
  20. 8 0
      TSLiveWallpaper/ja.lproj/Localizable.strings
  21. 8 0
      TSLiveWallpaper/ko.lproj/Localizable.strings
  22. 8 0
      TSLiveWallpaper/pt-BR.lproj/Localizable.strings
  23. 8 0
      TSLiveWallpaper/pt-PT.lproj/Localizable.strings
  24. 8 0
      TSLiveWallpaper/zh-Hant.lproj/Localizable.strings

+ 4 - 4
TSLiveWallpaper.xcodeproj/project.pbxproj

@@ -1597,7 +1597,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 3;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
@@ -1615,7 +1615,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 3.6.9;
+				MARKETING_VERSION = 3.6.10;
 				PRODUCT_BUNDLE_IDENTIFIER = musicplayer.offline.com;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1638,7 +1638,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 3;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
@@ -1656,7 +1656,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 3.6.9;
+				MARKETING_VERSION = 3.6.10;
 				PRODUCT_BUNDLE_IDENTIFIER = musicplayer.offline.com;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";

+ 22 - 0
TSLiveWallpaper/Assets.xcassets/AIList/tips.imageset/Contents.json

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

BIN
TSLiveWallpaper/Assets.xcassets/AIList/tips.imageset/tips@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/AIList/tips.imageset/tips@3x.png


+ 27 - 20
TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/TSAIListHistoryVC.swift

@@ -181,27 +181,34 @@ extension TSAIListHistoryVC: UICollectionViewDataSource ,UICollectionViewDelegat
 
         if let dbModel = listModelArray.safeObj(At:indexPath.row){
             
-            let isVip = kPurchaseBusiness.isVip
-            //多个浏览
-            var dataModelArray: [TSActionInfoModel] = []
-            for itemModel in listModelArray {
-                if itemModel.status == "success" || itemModel.modelType == .example {
-                    if isVip == false,itemModel.isVideo {
-                    }else{
-                        dataModelArray.append(itemModel)
-                    }
-                }
-            }
+//            let isVip = kPurchaseBusiness.isVip
+//            //多个浏览
+//            var dataModelArray: [TSActionInfoModel] = []
+//            for itemModel in listModelArray {
+//                if itemModel.status == "success" || itemModel.modelType == .example {
+//                    if isVip == false,itemModel.isVideo {
+//                    }else{
+//                        dataModelArray.append(itemModel)
+//                    }
+//                }
+//            }
+//            
+//            let vc = TSAIPhotoDetailsBrowserVC()
+//            vc.currentIndex = dataModelArray.firstIndex(of: dbModel) ?? 0
+//            vc.dataModelArray = dataModelArray
+//            vc.deleteBlock = { [weak self]  model in
+//                guard let self = self else { return }
+//                TSRMShared.aiListDB.deleteListModel(id: model.id)
+//                updateDataView()
+//            }
+//            kPresentModalVC(target: self, modelVC: vc)
+            
+            let cyModel = dbModel
+            let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel: TSAIListPhotoGeneratorModel(upLoadImage: UIImage(), generatorStyle: cyModel.request.generatorStyle),infoModel: cyModel) { model in }
+            gennerateVC.modalPresentationStyle = .overFullScreen
+            gennerateVC.modalTransitionStyle = .crossDissolve
+            self.present(gennerateVC, animated: true)
             
-            let vc = TSAIPhotoDetailsBrowserVC()
-            vc.currentIndex = dataModelArray.firstIndex(of: dbModel) ?? 0
-            vc.dataModelArray = dataModelArray
-            vc.deleteBlock = { [weak self]  model in
-                guard let self = self else { return }
-                TSRMShared.aiListDB.deleteListModel(id: model.id)
-                updateDataView()
-            }
-            kPresentModalVC(target: self, modelVC: vc)
             
         }
     }

+ 2 - 3
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/VM/TSAIListDataVM.swift

@@ -182,11 +182,10 @@ class TSAIListDataVM {
         return [
             videoSection,
             portraitSection,
-            colorizeSection,
+            RecreateSection,
             Descratchection,
-//            creatVideoSection,
+            colorizeSection,
             enhanceSection,
-            RecreateSection,
             enlightenSection,
             removeSection,
         ]

+ 13 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsBrowserCell.swift

@@ -12,8 +12,13 @@ class TSAIPhotoDetailsBrowserCell: TSBaseCollectionCell {
             if model.isVideo {
                 panComparisonView.isHidden = true
                 addVideoView()
+            }else if model.isShowSingleImage {
+                netWorkImageView.isHidden = false
+                panComparisonView.isHidden = true
+                netWorkImageView.setAsyncImage(urlString: model.response.resultUrl)
             }else{
                 panComparisonView.isHidden = false
+                netWorkImageView.isHidden = true
                 uploadPanComparisonView()
             }
         }
@@ -21,6 +26,7 @@ class TSAIPhotoDetailsBrowserCell: TSBaseCollectionCell {
     
     lazy var panComparisonView : TSImageIPanComparisonView = TSImageIPanComparisonView()
     var videoPlayerVC: TSAIListVideoPlayerVC?
+    lazy var netWorkImageView: UIImageView = UIImageView.createImageView()
     
     override func creatUI() {
         bgContentView.addSubview(panComparisonView)
@@ -29,6 +35,13 @@ class TSAIPhotoDetailsBrowserCell: TSBaseCollectionCell {
             make.leading.trailing.equalTo(0)
             make.centerY.equalToSuperview()
         }
+        
+        netWorkImageView.isHidden = true
+        bgContentView.addSubview(netWorkImageView)
+        netWorkImageView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
     }
     
     

+ 5 - 18
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC/TSAIPhotoDetailsVC+Image.swift

@@ -8,30 +8,17 @@
 
 
 extension TSAIPhotoDetailsVC {
-    
-    func creatNetWorkImageView() -> UIImageView {
-        let netWorkImageView = UIImageView(frame: CGRectMake(0, 0, k_ScreenWidth, k_ScreenHeight-bottomViewH))
-        netWorkImageView.backgroundColor = "#111111".uiColor
-        netWorkImageView.contentMode = .scaleAspectFit
-        netWorkImageView.isUserInteractionEnabled = true
-        return netWorkImageView
-    }
-    
-    
-    func setUpNetWorkImageView(){
+    func updateNetWorkImageView(){
+        guard let infoModel = infoModel else { return }
+        self.panComparisonView.isHidden = true
+        netWorkImageView.removeFromSuperview()
         contentView.addSubview(netWorkImageView)
         netWorkImageView.snp.makeConstraints { make in
             make.height.equalTo(k_ScreenHeight)
             make.leading.trailing.equalTo(0)
             make.centerY.equalToSuperview()
         }
-    }
-    
-    
-    
-    func updateNetWorkImageView(){
-        guard let infoModel = infoModel else { return }
-        self.netWorkImageView.setAsyncImage(urlString: infoModel.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
+        netWorkImageView.setAsyncImage(urlString: infoModel.response.resultUrl)
     }
 }
 

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

@@ -17,7 +17,7 @@ class TSAIPhotoDetailsVC: TSBaseVC {
     lazy var panComparisonView : TSImageIPanComparisonView = TSImageIPanComparisonView()
     var videoPlayerVC: TSAIListVideoPlayerVC = TSAIListVideoPlayerVC(videoURL: URL(string: "www.baidu.com")!)
     lazy var expandAreaView: TSAIExpandChangeView = TSAIExpandChangeView()
-    lazy var netWorkImageView: UIImageView = creatNetWorkImageView()//图片生成
+    lazy var netWorkImageView: UIImageView = UIImageView.createImageView()//图片生成
     
     lazy var shareBtn: TSVerticalButton = creatShareBtn()
     lazy var saveBtn: UIButton = creatSaveBtn()

+ 73 - 19
TSLiveWallpaper/Business/TSAIListVC/TSFusionImageVC/TSFusionImageVC.swift

@@ -37,14 +37,14 @@ class TSFusionImageVC: TSBaseVC{
     lazy var photoPickerManager: TSPhotoPickerManager = TSPhotoPickerManager(viewController: self)
     
     //###### UI ######
-    lazy var cusStackView: TSCustomStackView = TSCustomStackView(axis: .vertical,spacing: 0)
-    
-    //##############################上传图片##############################
-    lazy var imageStackView: TSCustomStackView = {
-        let imageStackView = TSCustomStackView(axis: .horizontal,alignment: .center,spacing: 0.0)
-        return imageStackView
+    lazy var cusStackView: UIStackView = {
+        let cusStackView = UIStackView()
+        cusStackView.axis = .vertical
+        cusStackView.distribution = .fill
+        cusStackView.alignment = .center
+        return cusStackView
     }()
-    
+
     lazy var photo1UploadView: TSAISmallUploadView = {
         let photo1UploadView = TSAISmallUploadView()
         photo1UploadView.tag = 0
@@ -69,6 +69,33 @@ class TSFusionImageVC: TSBaseVC{
         }
         return photo2UploadView
     }()
+    
+    
+    lazy var tipsView: UIView = {
+        
+        let tipsView = UIView()
+        tipsView.backgroundColor = .white.withAlphaComponent(0.1)
+        let imageView = UIImageView.createImageView(image:.tips)
+        tipsView.addSubview(imageView)
+        
+        let lab = UILabel.createLabel(text: "Choose photos with a clear and visible front face for the best effect".localized,font: .font(size: 14),textColor: .white.withAlphaComponent(0.7))
+        tipsView.addSubview(lab)
+        
+        imageView.snp.makeConstraints { make in
+            make.width.height.equalTo(16)
+            make.leading.equalTo(8)
+            make.top.equalTo(12)
+        }
+        
+        lab.snp.makeConstraints { make in
+            make.leading.equalTo(32)
+            make.trailing.equalTo(-8)
+            make.top.equalTo(12)
+            make.bottom.equalTo(-12)
+        }
+
+        return tipsView
+    }()
 
     //##############################按钮##############################
     lazy var submitBtn: UIButton = {
@@ -96,24 +123,51 @@ class TSFusionImageVC: TSBaseVC{
         cusStackView.snp.makeConstraints { make in
             make.top.equalTo(0)
             make.leading.trailing.equalToSuperview()
-            make.bottom.equalTo(submitBtn.snp.top).offset(-16)
         }
+
+        setCusStackView()
+        let a = upLoadImages
+        upLoadImages = a
+    }
+
+    
+    func setCusStackView(){
         
-        let upImageW = (k_ScreenWidth - 32.0 - 10.0) / 2.0
+        let upImageW = (k_ScreenWidth - 32.0 - 15.0) / 2.0
         let upImageH = photo1UploadView.viewH
+
+        let imageStackView = UIView()
+        cusStackView.addArrangedSubview(imageStackView)
+        imageStackView.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.height.equalTo(upImageH)
+            make.top.equalTo(0)
+        }
         
-        cusStackView.addSubviewToStack(imageStackView,length: upImageH)
-        imageStackView.addSpacing(length: 16.0)
-        imageStackView.addSubviewToStack(photo1UploadView,length: upImageW)
-        imageStackView.addSpacing(length: 10.0)
-        imageStackView.addSubviewToStack(photo2UploadView,length: upImageW)
-        cusStackView.addSpacing(length: 24.0)
-        
+        imageStackView.addSubview(photo1UploadView)
+        photo1UploadView.snp.makeConstraints { make in
+            make.leading.equalTo(0)
+            make.width.equalTo(upImageW)
+            make.height.equalTo(upImageH)
+        }
+
+        imageStackView.addSubview(photo2UploadView)
+        photo2UploadView.snp.makeConstraints { make in
+            make.trailing.equalTo(0)
+            make.width.equalTo(upImageW)
+            make.height.equalTo(upImageH)
+        }
+
+        cusStackView.addSpacing(length: 25.0)
         
-        let a = upLoadImages
-        upLoadImages = a
+        cusStackView.addArrangedSubview(tipsView)
+        tipsView.snp.remakeConstraints{ make in
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.bottom.equalToSuperview()
+        }
     }
-
     override func dealThings() {
         Publishers.CombineLatest(
             photo1UploadView.$upLoadImage,

+ 1 - 0
TSLiveWallpaper/Business/TSMineVC/TSChangeLanguageVC/TSChangeLanguageVC.swift

@@ -49,6 +49,7 @@ class TSChangeLanguageVC: TSBaseVC {
         AppDelegate.shared?.goToTab()
     }
 }
+import HXPhotoPicker
 extension TSChangeLanguageVC : UITableViewDataSource, UITableViewDelegate {
     
     public func numberOfSections(in tableView: UITableView) -> Int {

+ 19 - 1
TSLiveWallpaper/Common/Tool/LanguageManager.swift

@@ -20,7 +20,7 @@ class MainLocalizationProvider: LocalizationProvider {
     }
 }
 
-
+import HXPhotoPicker
 class LanguageManager {
     static let shared = LanguageManager()
     
@@ -69,6 +69,21 @@ class LanguageManager {
             case .pt: return "🇧🇷"
             }
         }
+        
+        var languageType:LanguageType{
+            switch self {
+            case .en: return .english
+            case .ja: return .japanese
+            case .ar: return .arabic
+            case .zhHant: return .traditionalChinese
+            case .es: return .spanish
+            case .ko: return .korean
+            case .fr: return .french
+            case .de: return .german
+            case .it: return .english
+            case .pt: return .portuguese
+            }
+        }
     }
     
     var isArabic:Bool {
@@ -140,6 +155,9 @@ class LanguageManager {
         let value = value ?? key
         return bundle?.localizedString(forKey: key, value: value, table: nil) ?? Bundle.main.localizedString(forKey: key, value: value, table: nil)
     }
+    
+    
+
 }
 
 // 语言变更通知

+ 8 - 2
TSLiveWallpaper/Common/ViewTool/TSPhotoPickerManager/TSPhotoPickerManager.swift

@@ -12,6 +12,7 @@ class TSPhotoPickerManager: NSObject {
     lazy var config: PickerConfiguration = {
         var config = PickerConfiguration()
         config.modalPresentationStyle = .automatic
+        config.themeColor = .themeColor
         config.selectOptions = .photo
         config.selectMode = .single
         config.isSelectedOriginal = true
@@ -20,7 +21,7 @@ class TSPhotoPickerManager: NSObject {
         config.photoList.finishSelectionAfterTakingPhoto = true
         config.photoList.isSaveSystemAlbum = false
         config.photoList.takePictureCompletionToSelected = true
-        
+        config.appearanceStyle = .dark
         var cameraConfig = SystemCameraConfiguration()
         cameraConfig.allowsEditing = false
         config.photoList.cameraType = .system(cameraConfig)
@@ -31,6 +32,7 @@ class TSPhotoPickerManager: NSObject {
     lazy var multipleConfig: PickerConfiguration = {
         var config = PickerConfiguration()
         config.modalPresentationStyle = .automatic
+        config.themeColor = .themeColor
         config.selectOptions = .photo
         config.selectMode = .multiple
         config.maximumSelectedCount = 2
@@ -42,6 +44,7 @@ class TSPhotoPickerManager: NSObject {
         config.photoList.takePictureCompletionToSelected = true
         var cameraConfig = SystemCameraConfiguration()
         cameraConfig.allowsEditing = false
+        config.appearanceStyle = .dark
         config.photoList.cameraType = .system(cameraConfig)
         return config
     }()
@@ -99,7 +102,10 @@ class TSPhotoPickerManager: NSObject {
             config = multipleConfig
             config.maximumSelectedCount = maxSelected
         }
-
+        
+        config.languageType = LanguageManager.shared.currentLanguage.languageType
+        config.customLanguages = [CustomLanguage(language: "it", bundle: Bundle(path: Bundle.main.path(forResource: "it", ofType: "lproj")!)!)]
+        
         let picker = PhotoPickerController(splitPicker: config)
         picker.pickerDelegate = self
         picker.autoDismiss = false

+ 8 - 0
TSLiveWallpaper/ar.lproj/Localizable.strings

@@ -155,3 +155,11 @@
 
 "Change Language" = "تغيير اللغة";
 "Unlock Result" = "فتح النتيجة";
+
+"Photo 1" = "الصورة 1";
+"Photo 2" = "الصورة 2";
+"Merge two portraits into one unique image seamlessly" = "دمج صورتين في صورة واحدة فريدة بسلاسة";
+"Portrait Fusion" = "بورتريه فيوجن";
+"Select %d photos" = "حدد %d صورة";
+"Fusion" = "الاندماج";
+"Choose photos with a clear and visible front face for the best effect" = "اختر صورًا ذات واجهة أمامية واضحة ومرئيّة للحصول على أفضل تأثير";

+ 8 - 0
TSLiveWallpaper/de.lproj/Localizable.strings

@@ -146,3 +146,11 @@
 
 "Change Language" = "Sprache ändern";
 "Unlock Result" = "Ergebnis freischalten";
+
+"Photo 1" = "Foto 1";
+"Photo 2" = "Foto 2";
+"Merge two portraits into one unique image seamlessly" = "Zwei Porträts nahtlos zu einem einzigen Bild zusammenfügen";
+"Portrait Fusion" = "Portrait Fusion";
+"Select %d photos" = "Wählen Sie %d Fotos aus";
+"Fusion" = "Fusion";
+"Choose photos with a clear and visible front face for the best effect" = "Wählen Sie für die beste Wirkung Fotos mit einer klaren und sichtbaren Vorderseite";

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

@@ -154,3 +154,11 @@
 
 "Change Language" = "Change Language";
 "Unlock Result" = "Unlock Result";
+
+"Photo 1" = "Photo 1";
+"Photo 2" = "Photo 2";
+"Merge two portraits into one unique image seamlessly" = "Merge two portraits into one unique image seamlessly";
+"Portrait Fusion" = "Portrait Fusion";
+"Select %d photos" = "Select %d photos";
+"Fusion" = "Fusion";
+"Choose photos with a clear and visible front face for the best effect" = "Choose photos with a clear and visible front face for the best effect";

+ 8 - 0
TSLiveWallpaper/es.lproj/Localizable.strings

@@ -155,3 +155,11 @@
 
 "Change Language" = "Cambiar idioma";
 "Unlock Result" = "Desbloquear resultado";
+
+"Photo 1" = "Foto 1";
+"Photo 2" = "Foto 2";
+"Merge two portraits into one unique image seamlessly" = "Fusiona dos retratos en una imagen única sin problemas";
+"Portrait Fusion" = "Fusión de retratos";
+"Select %d photos" = "Seleccione %d fotos";
+"Fusion" = "Fusión";
+"Choose photos with a clear and visible front face for the best effect" = "Elija fotos con una cara frontal clara y visible para obtener el mejor efecto.";

+ 8 - 0
TSLiveWallpaper/fr.lproj/Localizable.strings

@@ -147,3 +147,11 @@
 
 "Change Language" = "Changer de langue";
 "Unlock Result" = "Résultat du déverrouillage";
+
+"Photo 1" = "Photo 1";
+"Photo 2" = "Photo 2";
+"Merge two portraits into one unique image seamlessly" = "Fusionnez deux portraits en une seule image unique de manière transparente";
+"Portrait Fusion" = "Portrait Fusion";
+"Select %d photos" = "Sélectionnez %d photos";
+"Fusion" = "Fusion";
+"Choose photos with a clear and visible front face for the best effect" = "Choisissez des photos avec une face avant claire et visible pour un meilleur effet";

+ 8 - 0
TSLiveWallpaper/it.lproj/Localizable.strings

@@ -147,3 +147,11 @@
 
 "Change Language" = "Cambia lingua";
 "Unlock Result" = "Sblocca il risultato";
+
+"Photo 1" = "Foto 1";
+"Photo 2" = "Foto 2";
+"Merge two portraits into one unique image seamlessly" = "Unisci due ritratti in un'unica immagine senza soluzione di continuità";
+"Portrait Fusion" = "Fusione di ritratti";
+"Select %d photos" = "Seleziona %d foto";
+"Fusion" = "Fusione";
+"Choose photos with a clear and visible front face for the best effect" = "Scegli foto con una parte frontale chiara e visibile per ottenere il miglior effetto";

+ 8 - 0
TSLiveWallpaper/ja.lproj/Localizable.strings

@@ -153,3 +153,11 @@
 
 "Change Language" = "言語を変更";
 "Unlock Result" = "結果のロックを解除";
+
+"Photo 1" = "写真1";
+"Photo 2" = "写真2";
+"Merge two portraits into one unique image seamlessly" = "2枚の肖像画を1枚のユニークな画像にシームレスに結合します";
+"Portrait Fusion" = "ポートレートフュージョン";
+"Select %d photos" = "%d枚の写真を選択";
+"Fusion" = "融合";
+"Choose photos with a clear and visible front face for the best effect" = "最良の効果を得るには、正面の顔がはっきりと写っている写真を選択してください";

+ 8 - 0
TSLiveWallpaper/ko.lproj/Localizable.strings

@@ -153,3 +153,11 @@
 
 "Change Language" = "언어 변경";
 "Unlock Result" = "잠금 해제 결과";
+
+"Photo 1" = "사진 1";
+"Photo 2" = "사진 2";
+"Merge two portraits into one unique image seamlessly" = "두 개의 초상화를 하나의 독특한 이미지로 매끄럽게 병합";
+"Portrait Fusion" = "포트레이트 퓨전";
+"Select %d photos" = "%d개의 사진을 선택하세요";
+"Fusion" = "퓨전";
+"Choose photos with a clear and visible front face for the best effect" = "가장 좋은 효과를 위해 앞면이 선명하고 잘 보이는 사진을 선택하세요.";

+ 8 - 0
TSLiveWallpaper/pt-BR.lproj/Localizable.strings

@@ -147,3 +147,11 @@
 
 "Change Language" = "Alterar idioma";
 "Unlock Result" = "Resultado de desbloqueio";
+
+"Photo 1" = "Foto 1";
+"Photo 2" = "Foto 2";
+"Merge two portraits into one unique image seamlessly" = "Mescle dois retratos em uma imagem única perfeitamente";
+"Portrait Fusion" = "Fusão de retratos";
+"Select %d photos" = "Selecione %d fotos";
+"Fusion" = "Fusão";
+"Choose photos with a clear and visible front face for the best effect" = "Escolha fotos com a face frontal clara e visível para obter o melhor efeito";

+ 8 - 0
TSLiveWallpaper/pt-PT.lproj/Localizable.strings

@@ -147,3 +147,11 @@
 
 "Change Language" = "Alterar idioma";
 "Unlock Result" = "Resultado de desbloqueio";
+
+"Photo 1" = "Foto 1";
+"Photo 2" = "Foto 2";
+"Merge two portraits into one unique image seamlessly" = "Mescle dois retratos em uma imagem única perfeitamente";
+"Portrait Fusion" = "Fusão de retratos";
+"Select %d photos" = "Selecione %d fotos";
+"Fusion" = "Fusão";
+"Choose photos with a clear and visible front face for the best effect" = "Escolha fotos com a face frontal clara e visível para obter o melhor efeito";

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

@@ -153,3 +153,11 @@
 
 "Change Language" = "更改語言";
 "Unlock Result" = "解鎖結果";
+
+"Photo 1" = "照片 1";
+"Photo 2" = "照片 2";
+"Merge two portraits into one unique image seamlessly" = "將兩幅肖像無縫合併為一幅獨特的圖像";
+"Portrait Fusion" = "人像融合";
+"Select %d photos" = "選擇 %d 張照片";
+"Fusion" = "融合";
+"Choose photos with a clear and visible front face for the best effect" = "選擇正面清晰可見的照片以獲得最佳效果";