Explorar o código

合并国际化版本。

jsonwang %!s(int64=3) %!d(string=hai) anos
pai
achega
23b4ee0eb2
Modificáronse 33 ficheiros con 311 adicións e 67 borrados
  1. 50 10
      Introduce.xcodeproj/project.pbxproj
  2. 8 0
      Introduce/Aarchitecture/AppDelegate.swift
  3. BIN=BIN
      Introduce/Assets.xcassets/Export/export_saveall_h.imageset/export_saveall_h.png
  4. BIN=BIN
      Introduce/Assets.xcassets/Export/export_saveall_h.imageset/export_saveall_h@2x.png
  5. BIN=BIN
      Introduce/Assets.xcassets/Export/export_saveall_h.imageset/export_saveall_h@3x.png
  6. BIN=BIN
      Introduce/Assets.xcassets/Export/export_saveall_n.imageset/export_saveall_n.png
  7. BIN=BIN
      Introduce/Assets.xcassets/Export/export_saveall_n.imageset/export_saveall_n@2x.png
  8. BIN=BIN
      Introduce/Assets.xcassets/Export/export_saveall_n.imageset/export_saveall_n@3x.png
  9. BIN=BIN
      Introduce/Assets.xcassets/Export/export_saveonly_h.imageset/export_saveonly_h.png
  10. BIN=BIN
      Introduce/Assets.xcassets/Export/export_saveonly_h.imageset/export_saveonly_h@2x.png
  11. BIN=BIN
      Introduce/Assets.xcassets/Export/export_saveonly_h.imageset/export_saveonly_h@3x.png
  12. BIN=BIN
      Introduce/Assets.xcassets/Export/export_saveonly_n.imageset/export_saveonly_n.png
  13. BIN=BIN
      Introduce/Assets.xcassets/Export/export_saveonly_n.imageset/export_saveonly_n@2x.png
  14. BIN=BIN
      Introduce/Assets.xcassets/Export/export_saveonly_n.imageset/export_saveonly_n@3x.png
  15. 6 6
      Introduce/Record/INIntroduceController.swift
  16. 10 10
      Introduce/Record/INPhotoVideosController.swift
  17. 23 17
      Introduce/Record/INRecorderController.swift
  18. 69 24
      Introduce/Record/INVideoExportController.swift
  19. 13 0
      Introduce/en.lproj/InfoPlist.strings
  20. 1 0
      Introduce/en.lproj/LaunchScreen.strings
  21. 15 0
      Introduce/en.lproj/Main.strings
  22. 13 0
      Introduce/ja.lproj/InfoPlist.strings
  23. 1 0
      Introduce/ja.lproj/LaunchScreen.strings
  24. 15 0
      Introduce/ja.lproj/Main.strings
  25. 13 0
      Introduce/ko-KR.lproj/InfoPlist.strings
  26. 1 0
      Introduce/ko-KR.lproj/LaunchScreen.strings
  27. 15 0
      Introduce/ko-KR.lproj/Main.strings
  28. 13 0
      Introduce/vi.lproj/InfoPlist.strings
  29. 1 0
      Introduce/vi.lproj/LaunchScreen.strings
  30. 15 0
      Introduce/vi.lproj/Main.strings
  31. 13 0
      Introduce/zh-Hans.lproj/InfoPlist.strings
  32. 1 0
      Introduce/zh-Hans.lproj/LaunchScreen.strings
  33. 15 0
      Introduce/zh-Hans.lproj/Main.strings

+ 50 - 10
Introduce.xcodeproj/project.pbxproj

@@ -10,6 +10,7 @@
 		2D80D52B2773528C00D24520 /* INAppConfigUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D80D52A2773528C00D24520 /* INAppConfigUtil.swift */; };
 		415C49D22763022900814766 /* Resources.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 415C49D12763022900814766 /* Resources.bundle */; };
 		41A112792766E12C0093BBF0 /* PQConfig.plist in Resources */ = {isa = PBXBuildFile; fileRef = 41A112782766E12C0093BBF0 /* PQConfig.plist */; };
+		41AA02822795579600597954 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 41AA02842795579600597954 /* InfoPlist.strings */; };
 		4A426DDD275484DF00B3733B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A426DDC275484DF00B3733B /* AppDelegate.swift */; };
 		4A426DE4275484DF00B3733B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4A426DE2275484DF00B3733B /* Main.storyboard */; };
 		4A426DE6275484E000B3733B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4A426DE5275484E000B3733B /* Assets.xcassets */; };
@@ -28,12 +29,24 @@
 		3051DB0957784182F3E1AAD3 /* Pods-Introduce.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Introduce.release.xcconfig"; path = "Target Support Files/Pods-Introduce/Pods-Introduce.release.xcconfig"; sourceTree = "<group>"; };
 		3D67E85C017389B87957100F /* Pods_Introduce.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Introduce.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		415C49D12763022900814766 /* Resources.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Resources.bundle; path = Aarchitecture/Resources.bundle; sourceTree = "<group>"; };
+		4198337927955CCB00A430BC /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Main.strings; sourceTree = "<group>"; };
+		4198337A27955CCB00A430BC /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
+		4198337B27955CCB00A430BC /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		4198338C2795651400A430BC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		4198338D2795663800A430BC /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
+		4198338F2795663A00A430BC /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		419833912795683400A430BC /* ko-KR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ko-KR"; path = "ko-KR.lproj/Main.strings"; sourceTree = "<group>"; };
+		419833922795683400A430BC /* ko-KR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ko-KR"; path = "ko-KR.lproj/LaunchScreen.strings"; sourceTree = "<group>"; };
+		419833932795683500A430BC /* ko-KR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ko-KR"; path = "ko-KR.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
 		41A112782766E12C0093BBF0 /* PQConfig.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = PQConfig.plist; sourceTree = "<group>"; };
+		41AA027E2795572300597954 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = "<group>"; };
+		41AA027F2795572300597954 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
+		41AA0286279557C300597954 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = "<group>"; };
+		41AA0287279557C300597954 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = "<group>"; };
 		4A426DD9275484DF00B3733B /* Introduce.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Introduce.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		4A426DDC275484DF00B3733B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		4A426DE3275484DF00B3733B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
 		4A426DE5275484E000B3733B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
-		4A426DEA275484E000B3733B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		4A426DF12754A1E300B3733B /* INTabbarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = INTabbarController.swift; sourceTree = "<group>"; };
 		4A426DF42754A27D00B3733B /* INRecorderController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = INRecorderController.swift; sourceTree = "<group>"; };
 		4A426DF92754A47700B3733B /* INPhotoVideosController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = INPhotoVideosController.swift; sourceTree = "<group>"; };
@@ -93,7 +106,7 @@
 				4A426DE5275484E000B3733B /* Assets.xcassets */,
 				41A112782766E12C0093BBF0 /* PQConfig.plist */,
 				415C49D12763022900814766 /* Resources.bundle */,
-				4A426DEA275484E000B3733B /* Info.plist */,
+				41AA02842795579600597954 /* InfoPlist.strings */,
 			);
 			path = Introduce;
 			sourceTree = "<group>";
@@ -190,6 +203,10 @@
 			knownRegions = (
 				en,
 				Base,
+				ja,
+				"zh-Hans",
+				vi,
+				"ko-KR",
 			);
 			mainGroup = 4A426DD0275484DF00B3733B;
 			productRefGroup = 4A426DDA275484DF00B3733B /* Products */;
@@ -207,6 +224,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				41A112792766E12C0093BBF0 /* PQConfig.plist in Resources */,
+				41AA02822795579600597954 /* InfoPlist.strings in Resources */,
 				4A426DE6275484E000B3733B /* Assets.xcassets in Resources */,
 				4A426DE4275484DF00B3733B /* Main.storyboard in Resources */,
 				4AFE6042277DCF500068BB5F /* LaunchScreen.storyboard in Resources */,
@@ -293,10 +311,26 @@
 /* End PBXSourcesBuildPhase section */
 
 /* Begin PBXVariantGroup section */
+		41AA02842795579600597954 /* InfoPlist.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				4198337B27955CCB00A430BC /* vi */,
+				4198338C2795651400A430BC /* en */,
+				4198338D2795663800A430BC /* zh-Hans */,
+				4198338F2795663A00A430BC /* ja */,
+				419833932795683500A430BC /* ko-KR */,
+			);
+			name = InfoPlist.strings;
+			sourceTree = "<group>";
+		};
 		4A426DE2275484DF00B3733B /* Main.storyboard */ = {
 			isa = PBXVariantGroup;
 			children = (
 				4A426DE3275484DF00B3733B /* Base */,
+				41AA027E2795572300597954 /* ja */,
+				41AA0286279557C300597954 /* zh-Hans */,
+				4198337927955CCB00A430BC /* vi */,
+				419833912795683400A430BC /* ko-KR */,
 			);
 			name = Main.storyboard;
 			sourceTree = "<group>";
@@ -305,6 +339,10 @@
 			isa = PBXVariantGroup;
 			children = (
 				4AFE6041277DCF500068BB5F /* Base */,
+				41AA027F2795572300597954 /* ja */,
+				41AA0287279557C300597954 /* zh-Hans */,
+				4198337A27955CCB00A430BC /* vi */,
+				419833922795683400A430BC /* ko-KR */,
 			);
 			name = LaunchScreen.storyboard;
 			sourceTree = "<group>";
@@ -316,6 +354,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
@@ -377,6 +416,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
@@ -438,7 +478,7 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 6;
+				CURRENT_PROJECT_VERSION = 16;
 				DEVELOPMENT_TEAM = UH52C8A7SN;
 				ENABLE_BITCODE = NO;
 				EXCLUDED_ARCHS = "";
@@ -448,8 +488,8 @@
 				INFOPLIST_KEY_NSCameraUsageDescription = "点击\"允许\",可进行拍摄录制";
 				INFOPLIST_KEY_NSLocalNetworkUsageDescription = "点击\"允许\",可联网生成字幕";
 				INFOPLIST_KEY_NSMicrophoneUsageDescription = "点击\"允许\",可进行录制配音";
-				INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = " 点击\"允许\",可进入相册选取视频";
-				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = " 点击\"允许\",可进入相册选取视频";
+				INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "点击\"允许\",可进入相册选取视频";
+				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "点击\"允许\",可进入相册选取视频";
 				INFOPLIST_KEY_NSUserTrackingUsageDescription = "请放心,开启权限不会获取你在其他站点的隐私信息,该权限仅用于标识设备并保障服务安全与提升浏览体验";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
@@ -462,7 +502,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.0.0;
+				MARKETING_VERSION = 1.1.0;
 				PRODUCT_BUNDLE_IDENTIFIER = com.piaoquan.introduce;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
@@ -484,7 +524,7 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 6;
+				CURRENT_PROJECT_VERSION = 16;
 				DEVELOPMENT_TEAM = UH52C8A7SN;
 				ENABLE_BITCODE = NO;
 				EXCLUDED_ARCHS = "";
@@ -494,8 +534,8 @@
 				INFOPLIST_KEY_NSCameraUsageDescription = "点击\"允许\",可进行拍摄录制";
 				INFOPLIST_KEY_NSLocalNetworkUsageDescription = "点击\"允许\",可联网生成字幕";
 				INFOPLIST_KEY_NSMicrophoneUsageDescription = "点击\"允许\",可进行录制配音";
-				INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = " 点击\"允许\",可进入相册选取视频";
-				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = " 点击\"允许\",可进入相册选取视频";
+				INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "点击\"允许\",可进入相册选取视频";
+				INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "点击\"允许\",可进入相册选取视频";
 				INFOPLIST_KEY_NSUserTrackingUsageDescription = "请放心,开启权限不会获取你在其他站点的隐私信息,该权限仅用于标识设备并保障服务安全与提升浏览体验";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
@@ -508,7 +548,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.0.0;
+				MARKETING_VERSION = 1.1.0;
 				PRODUCT_BUNDLE_IDENTIFIER = com.piaoquan.introduce;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";

+ 8 - 0
Introduce/Aarchitecture/AppDelegate.swift

@@ -8,6 +8,7 @@
 import BFCommonKit
 import BFMaterialKit
 import UIKit
+import AppTrackingTransparency
 
 @main
 class AppDelegate: UIResponder, UIApplicationDelegate {
@@ -55,5 +56,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
             INAppConfigUtil.appLaunchReportUpload(isHotLaunch: true)
             isEnterBack = false
         }
+        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
+            if #available(iOS 14, *) {
+                ATTrackingManager.requestTrackingAuthorization { status in
+                    
+                }
+            }
+        }
     }
 }

BIN=BIN
Introduce/Assets.xcassets/Export/export_saveall_h.imageset/export_saveall_h.png


BIN=BIN
Introduce/Assets.xcassets/Export/export_saveall_h.imageset/export_saveall_h@2x.png


BIN=BIN
Introduce/Assets.xcassets/Export/export_saveall_h.imageset/export_saveall_h@3x.png


BIN=BIN
Introduce/Assets.xcassets/Export/export_saveall_n.imageset/export_saveall_n.png


BIN=BIN
Introduce/Assets.xcassets/Export/export_saveall_n.imageset/export_saveall_n@2x.png


BIN=BIN
Introduce/Assets.xcassets/Export/export_saveall_n.imageset/export_saveall_n@3x.png


BIN=BIN
Introduce/Assets.xcassets/Export/export_saveonly_h.imageset/export_saveonly_h.png


BIN=BIN
Introduce/Assets.xcassets/Export/export_saveonly_h.imageset/export_saveonly_h@2x.png


BIN=BIN
Introduce/Assets.xcassets/Export/export_saveonly_h.imageset/export_saveonly_h@3x.png


BIN=BIN
Introduce/Assets.xcassets/Export/export_saveonly_n.imageset/export_saveonly_n.png


BIN=BIN
Introduce/Assets.xcassets/Export/export_saveonly_n.imageset/export_saveonly_n@2x.png


BIN=BIN
Introduce/Assets.xcassets/Export/export_saveonly_n.imageset/export_saveonly_n@3x.png


+ 6 - 6
Introduce/Record/INIntroduceController.swift

@@ -66,14 +66,14 @@ class INIntroduceController: BFBaseViewController {
         leftButton(image: nil, imageName: nil, tintColor: .white)
 
         exportBtn.backgroundColor = UIColor.hexColor(hexadecimal: "#389AFF")
-        exportBtn.setTitle("导出", for: .normal)
+        exportBtn.setTitle("option_export".BFLocale, for: .normal)
         exportBtn.addCorner(corner: 4)
         exportBtn.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
         exportBtn.addTarget(self, action: #selector(exportAction), for: .touchUpInside)
         navHeadImageView?.addSubview(exportBtn)
         exportBtn.frame = CGRect(x: (navHeadImageView?.frame.width ?? 0) - 12 - 60, y: 0, width: 60, height: 36)
         exportBtn.center.y = backButton?.center.y ?? 0
-
+        exportBtn.titleLabel?.adjustsFontSizeToFitWidth = true
         addChild(recordScreenVC)
         recordScreenVC.view.frame = view.frame
         view.addSubview(recordScreenVC.view)
@@ -236,11 +236,11 @@ class INIntroduceController: BFBaseViewController {
 
     override func backBtnClick() {
   
-        let alertController = UIAlertController(title: "退出将不会保存当前操作",
+        let alertController = UIAlertController(title: "compose_tips_exit".BFLocale,
                        message: "", preferredStyle: .alert)
-        let cancelAction = UIAlertAction(title: "不退出", style: .default, handler: nil)
+        let cancelAction = UIAlertAction(title: "option_not exit".BFLocale, style: .default, handler: nil)
 
-        let okAction = UIAlertAction(title: "确认退出", style: .cancel, handler: {[weak self]
+        let okAction = UIAlertAction(title: "option_exit".BFLocale, style: .cancel, handler: {[weak self]
            action in
            self?.recordScreenVC.backBtnClick()
 //            self?.super_back()
@@ -264,7 +264,7 @@ class INIntroduceController: BFBaseViewController {
             model.voiceStickers.count + partialResult
         })
         if count == 0 {
-            cShowHUB(superView: nil, msg: "需要录制才可以导出")
+            cShowHUB(superView: nil, msg: "compose_tips_export".BFLocale)
             return
         }
         

+ 10 - 10
Introduce/Record/INPhotoVideosController.swift

@@ -18,7 +18,7 @@ class INPhotoVideosController: BFBaseViewController {
     // 按钮高
     let choseBtnH: CGFloat = cDefaultMargin * 3
     // 按钮宽
-    let choseBtnW: CGFloat = cDefaultMargin * 5
+    let choseBtnW: CGFloat = cDefaultMargin * 9
     // 间隔
     let margin: CGFloat = 12
     // 素材选择数量
@@ -49,7 +49,7 @@ class INPhotoVideosController: BFBaseViewController {
         let changeCollecBtn = UIButton(frame: CGRect(x: cDefaultMargin * 5, y: cDevice_iPhoneStatusBarHei, width: cScreenWidth - cDefaultMargin * 10, height: cDefaultMargin * 4))
         changeCollecBtn.titleLabel?.lineBreakMode = .byTruncatingTail
         changeCollecBtn.tintColor = BFConfig.shared.styleTitleColor
-        changeCollecBtn.setTitle("我的相册", for: .normal)
+        changeCollecBtn.setTitle("album_title".BFLocale, for: .normal)
         changeCollecBtn.setImage(UIImage.moduleImage(named: "icon_selected_down", moduleName: "BFMaterialKit", isAssets: false)?.withRenderingMode(.alwaysTemplate), for: .normal)
         changeCollecBtn.setImage(UIImage.moduleImage(named: "icon_selected_up", moduleName: "BFMaterialKit", isAssets: false)?.withRenderingMode(.alwaysTemplate), for: .selected)
         changeCollecBtn.setTitleColor(BFConfig.shared.styleTitleColor, for: .normal)
@@ -64,7 +64,7 @@ class INPhotoVideosController: BFBaseViewController {
         let choseLocalAllBtn = UIButton(frame: CGRect(x: (view.frame.width - choseBtnW * 3) / 4, y: cDevice_iPhoneNavBarAndStatusBarHei + margin, width: choseBtnW, height: choseBtnH))
         choseLocalAllBtn.setTitleColor(UIColor.hexColor(hexadecimal: "#999999"), for: .normal)
         choseLocalAllBtn.setTitleColor(BFConfig.shared.styleTitleColor, for: .selected)
-        choseLocalAllBtn.setTitle("全部", for: .normal)
+        choseLocalAllBtn.setTitle("album_all".BFLocale, for: .normal)
         choseLocalAllBtn.titleLabel?.font = UIFont.systemFont(ofSize: 17, weight: .medium)
         choseLocalAllBtn.addCorner(corner: 6)
         choseLocalAllBtn.tag = 10
@@ -77,7 +77,7 @@ class INPhotoVideosController: BFBaseViewController {
         let choseLocalVideoBtn = UIButton(frame: CGRect(x: choseLocalAllBtn.frame.maxX + (view.frame.width - choseBtnW * 3) / 4, y: choseLocalAllBtn.frame.minY, width: choseBtnW, height: choseBtnH))
         choseLocalVideoBtn.setTitleColor(UIColor.hexColor(hexadecimal: "#999999"), for: .normal)
         choseLocalVideoBtn.setTitleColor(BFConfig.shared.styleTitleColor, for: .selected)
-        choseLocalVideoBtn.setTitle("视频", for: .normal)
+        choseLocalVideoBtn.setTitle("album_video".BFLocale , for: .normal)
         choseLocalVideoBtn.titleLabel?.font = UIFont.systemFont(ofSize: 17, weight: .medium)
         choseLocalVideoBtn.addCorner(corner: 6)
         choseLocalVideoBtn.tag = 11
@@ -89,7 +89,7 @@ class INPhotoVideosController: BFBaseViewController {
         let choseLocalImageBtn = UIButton(frame: CGRect(x: choseLocalVideoBtn.frame.maxX + (view.frame.width - choseBtnW * 3) / 4, y: choseLocalAllBtn.frame.minY, width: choseBtnW, height: choseBtnH))
         choseLocalImageBtn.setTitleColor(UIColor.hexColor(hexadecimal: "#999999"), for: .normal)
         choseLocalImageBtn.setTitleColor(BFConfig.shared.styleTitleColor, for: .selected)
-        choseLocalImageBtn.setTitle("照片", for: .normal)
+        choseLocalImageBtn.setTitle("album_album".BFLocale, for: .normal)
         choseLocalImageBtn.titleLabel?.font = UIFont.systemFont(ofSize: 17, weight: .medium)
         choseLocalImageBtn.addCorner(corner: 6)
         choseLocalImageBtn.tag = 12
@@ -180,7 +180,7 @@ class INPhotoVideosController: BFBaseViewController {
         let nextBtn = UIButton(type: .custom)
         nextBtn.frame = CGRect(x: cScreenWidth - 94, y: 10, width: 78, height: 36)
         nextBtn.backgroundColor = UIColor.hexColor(hexadecimal: "#389AFF")
-        nextBtn.setTitle("下一步", for: .normal)
+        nextBtn.setTitle("option_next".BFLocale, for: .normal)
         nextBtn.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
         nextBtn.layer.cornerRadius = 4
         nextBtn.addTarget(self, action: #selector(nextBtnClick(sender:)), for: .touchUpInside)
@@ -232,7 +232,7 @@ class INPhotoVideosController: BFBaseViewController {
     func albumSelectedHandle(seletedData: PHAsset?) {
         changeCollecBtn.isSelected = false
         if seletedData != nil {
-            changeCollecBtn.setTitle(seletedData?.title ?? "全部", for: .normal)
+            changeCollecBtn.setTitle(seletedData?.title ?? "album_all".BFLocale, for: .normal)
             changeCollecBtn.imagePosition(at: PQButtonImageEdgeInsetsStyle.right, space: cDefaultMargin / 2)
             photoMaterialVc.assetCollection = seletedData!.assetCollection
         }
@@ -244,8 +244,8 @@ class INPhotoVideosController: BFBaseViewController {
                 let dur = (phasset.mediaType == .video) ?  phasset.duration : 0
                 return (partialResult ?? 0.0) + dur
             }), totalDura > 7200{
-                let alertController = UIAlertController(title: nil, message: "素材总时长不能超过2小时", preferredStyle: UIAlertController.Style.alert)
-                let cancelAction = UIAlertAction(title: "确定", style: .default, handler: nil)
+                let alertController = UIAlertController(title: nil, message: "album_tips_maxtime".BFLocale, preferredStyle: UIAlertController.Style.alert)
+                let cancelAction = UIAlertAction(title: "option_ok".BFLocale, style: .default, handler: nil)
                 alertController.addAction(cancelAction)
                 self.present(alertController, animated: true, completion: nil)
                 return
@@ -264,7 +264,7 @@ class INPhotoVideosController: BFBaseViewController {
                 navigationController?.pushViewController(vc, animated: true)
             }
         } else {
-            cShowHUB(superView: nil, msg: "需要选择一个视频")
+            cShowHUB(superView: nil, msg: "album_tips_least".BFLocale)
         }
     }
 

+ 23 - 17
Introduce/Record/INRecorderController.swift

@@ -14,10 +14,7 @@ import TYAttributedLabel
 import BFCommonKit
 import BFAnalyzeKit
 import Photos
-
-public let cUserProtocol = "https://weapppiccdn.yishihui.com/resources/agreements/shishuo/videoservice.html?type=20"
-/** 隐私政策 */
-public let cPrivacy = "https://weapppiccdn.yishihui.com/resources/agreements/shishuo/videoagreement.html?type=20"
+import AppTrackingTransparency
 
 class INRecorderController: BFBaseViewController {
     
@@ -30,6 +27,8 @@ class INRecorderController: BFBaseViewController {
         
         return l
     }()
+    var cUserProtocol:String = "https://weapppiccdn.yishihui.com/resources/agreements/shishuo/videoservice_\( BFLocalizedUtil.currentLanguage()).html"
+    var cPrivacy:String = "https://weapppiccdn.yishihui.com/resources/agreements/shishuo/videoagreement_\( BFLocalizedUtil.currentLanguage()).html"
     
     lazy var camaraBtn: UIButton = {
         let btn = UIButton(type: .custom)
@@ -84,9 +83,9 @@ class INRecorderController: BFBaseViewController {
     }()
     
     lazy var welcomeTitle:UILabel = {
-        
         let l = UILabel()
-        l.text = "欢迎使用"
+        l.text = "home_agreement_tittle".BFLocale
+
         l.textColor = .black
         l.font = UIFont.boldSystemFont(ofSize: 22)
         l.textAlignment = .center
@@ -105,21 +104,23 @@ class INRecorderController: BFBaseViewController {
     }()
  
     lazy var protocolLab: TYAttributedLabel = {
+   
+        
         let protocolLab = TYAttributedLabel()
         protocolLab.highlightedLinkBackgroundColor = UIColor.clear
         protocolLab.backgroundColor = UIColor.clear
         protocolLab.numberOfLines = 0
         protocolLab.delegate = self
         protocolLab.font = UIFont.systemFont(ofSize: 14)
-        protocolLab.text = "在您使用视说服务前,请认真阅读"
+        protocolLab.text = "home_agreement_begin".BFLocale
         protocolLab.textColor = UIColor(red: 0.262, green: 0.262, blue: 0.262, alpha: 1)
-        protocolLab.appendLink(withText: "《视说用户协议》、", linkFont: UIFont.systemFont(ofSize: 14), linkColor: UIColor.hexColor(hexadecimal: "#90a9d2"),  underLineStyle:CTUnderlineStyle(), linkData: cUserProtocol)
+        protocolLab.appendLink(withText: "home_agreement_service".BFLocale, linkFont: UIFont.systemFont(ofSize: 14), linkColor: UIColor.hexColor(hexadecimal: "#90a9d2"),  underLineStyle:CTUnderlineStyle(), linkData: cUserProtocol)
         
-        protocolLab.appendLink(withText: "《用户隐私政策》", linkFont: UIFont.systemFont(ofSize: 14), linkColor: UIColor.hexColor(hexadecimal: "#90a9d2"), underLineStyle:CTUnderlineStyle(), linkData: cPrivacy)
+        protocolLab.appendLink(withText: "home_agreement_privacy".BFLocale, linkFont: UIFont.systemFont(ofSize: 14), linkColor: UIColor.hexColor(hexadecimal: "#90a9d2"), underLineStyle:CTUnderlineStyle(), linkData: cPrivacy)
         
-        protocolLab.appendLink(withText: ",以了解用户权利义务和个人信息处理规则。\n\n", linkFont: UIFont.systemFont(ofSize: 14), linkColor: UIColor.hexColor(hexadecimal: "#434343"), underLineStyle: CTUnderlineStyle(), linkData: nil)
+        protocolLab.appendLink(withText: "\("home_agreement_remarks".BFLocale)\n\n", linkFont: UIFont.systemFont(ofSize: 14), linkColor: UIColor.hexColor(hexadecimal: "#434343"), underLineStyle: CTUnderlineStyle(), linkData: nil)
         
-        protocolLab.appendLink(withText: "点击同意表示您已阅读并且认可所有条款。", linkFont: UIFont.systemFont(ofSize: 14), linkColor: UIColor(red: 0.262, green: 0.262, blue: 0.262, alpha: 1), underLineStyle: CTUnderlineStyle(), linkData: nil)
+        protocolLab.appendLink(withText: "home_agreement_prompt".BFLocale, linkFont: UIFont.systemFont(ofSize: 14), linkColor: UIColor(red: 0.262, green: 0.262, blue: 0.262, alpha: 1), underLineStyle: CTUnderlineStyle(), linkData: nil)
         protocolLab.textAlignment = CTTextAlignment.left
         return protocolLab
     }()
@@ -127,7 +128,7 @@ class INRecorderController: BFBaseViewController {
     lazy var doneBtn:UIButton = {
         let doneBtn = UIButton()
         doneBtn.backgroundColor = UIColor.hexColor(hexadecimal: "#389AFF")
-        doneBtn.setTitle("同意", for: .normal)
+        doneBtn.setTitle("option_accept".BFLocale, for: .normal)
         doneBtn.titleLabel?.font = UIFont.systemFont(ofSize: 16)
         doneBtn.addTarget(self, action: #selector(doneAction), for: .touchUpInside)
         doneBtn.addCorner(corner: 4)
@@ -137,7 +138,7 @@ class INRecorderController: BFBaseViewController {
     lazy var cancleBtn:UIButton = {
         let cancleBtn = UIButton()
         cancleBtn.backgroundColor = UIColor.clear
-        cancleBtn.setTitle("不同意", for: .normal)
+        cancleBtn.setTitle("option_refuse".BFLocale, for: .normal)
         cancleBtn.setTitleColor( UIColor(red: 0.262, green: 0.262, blue: 0.262, alpha: 1), for: .normal)
         cancleBtn.titleLabel?.font = UIFont.systemFont(ofSize: 14)
         cancleBtn.addTarget(self, action: #selector(cancleAction), for: .touchUpInside)
@@ -156,7 +157,7 @@ class INRecorderController: BFBaseViewController {
     lazy var bottomView:UIView = {
         let bottomView = UIView(frame:CGRect.init(x: 0, y: view.frame.height - cSafeAreaHeight - 20 - 30, width: view.frame.width, height: 30))
         let userProBtn = UIButton.init(type: .custom)
-        userProBtn.setTitle("用户协议", for: .normal)
+        userProBtn.setTitle("hone_privacy".BFLocale, for: .normal)
         userProBtn.tag = 1
         userProBtn.titleLabel?.font = UIFont.systemFont(ofSize: 13)
         userProBtn.setTitleColor(UIColor.hexColor(hexadecimal: "6E7F9A"), for: .normal)
@@ -168,7 +169,7 @@ class INRecorderController: BFBaseViewController {
         lineLab.textColor = UIColor.hexColor(hexadecimal: "6E7F9A")
         
         let priProBtn = UIButton.init(type: .custom)
-        priProBtn.setTitle("隐私协议", for: .normal)
+        priProBtn.setTitle("hone_service".BFLocale, for: .normal)
         priProBtn.tag = 2
         priProBtn.titleLabel?.font = UIFont.systemFont(ofSize: 13)
         priProBtn.setTitleColor(UIColor.hexColor(hexadecimal: "6E7F9A"), for: .normal)
@@ -202,6 +203,11 @@ class INRecorderController: BFBaseViewController {
     }
     
     override func viewDidLoad() {
+        
+        if #available(iOS 14, *) {
+            ATTrackingManager.requestTrackingAuthorization { [weak self] _ in
+            }
+        }
         super.viewDidLoad()
         view.backgroundColor = .black
         view.addSubview(bgView)
@@ -214,7 +220,7 @@ class INRecorderController: BFBaseViewController {
 
         view.addSubview(centerView)
         centerView.snp.makeConstraints { make in
-            make.width.equalToSuperview()
+            make.width.equalTo(140)
             make.height.equalTo(209)
             make.center.equalToSuperview()
         }
@@ -260,7 +266,7 @@ class INRecorderController: BFBaseViewController {
             
             welcomeTitle.snp.makeConstraints{ make in
                 make.centerX.equalToSuperview()
-                make.width.equalTo(120)
+                make.width.equalToSuperview()
                 make.top.equalToSuperview().offset(30)
                 make.height.equalTo(31)
             }

+ 69 - 24
Introduce/Record/INVideoExportController.swift

@@ -90,6 +90,16 @@ class INVideoExportController: BFBaseViewController {
         btn.addTarget(self, action: #selector(saveAllAction(btn:)), for: .touchUpInside)
         return btn
     }()
+    
+    lazy var saveAllBtnTips: UILabel = {
+        let la = UILabel()
+        la.textColor = .white
+        la.textAlignment = .center
+        la.text = "savemode_all".BFLocale
+        la.font = UIFont.systemFont(ofSize: 14)
+        return la
+    }()
+    
 
     lazy var saveOnlyBtn: UIButton = {
         let btn = UIButton()
@@ -98,10 +108,19 @@ class INVideoExportController: BFBaseViewController {
         btn.addTarget(self, action: #selector(saveOnlyAction(btn:)), for: .touchUpInside)
         return btn
     }()
+    lazy var saveOnlyBtnTips: UILabel = {
+        let la = UILabel()
+        la.textColor = .white
+        la.textAlignment = .center
+        la.text = "savemode_onlyrecord".BFLocale
+        la.font = UIFont.systemFont(ofSize: 14)
+        return la
+    }()
+    
 
     lazy var completeBtn: UIButton = {
         let btn = UIButton()
-        btn.setTitle("回到首页", for: .normal)
+        btn.setTitle("option_Finish".BFLocale, for: .normal)
         btn.titleLabel?.font = UIFont.systemFont(ofSize: 14)
         btn.setTitleColor(UIColor.hexColor(hexadecimal: "#6B6B6B"), for: .normal)
         btn.setTitleColor(.gray, for: .disabled)
@@ -112,7 +131,7 @@ class INVideoExportController: BFBaseViewController {
 
     lazy var saveToPhotoBtn: UIButton = {
         let btn = UIButton()
-        btn.setTitle(" 保存到相册", for: .normal)
+        btn.setTitle(" \("compose_save".BFLocale)", for: .normal)
         btn.setTitleColor(.white, for: .normal)
         btn.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
         btn.setImage(UIImage(named: "export_btn"), for: .normal)
@@ -142,14 +161,14 @@ class INVideoExportController: BFBaseViewController {
         errbackV.isHidden = true
         
         let titleL = UILabel()
-        titleL.text = "合成失败"
+        titleL.text = "compose_fail_compose".BFLocale
         titleL.font = UIFont.systemFont(ofSize: 36)
         titleL.textColor = .white
         titleL.textAlignment = .center
         errbackV.addSubview(titleL)
         
         let subTitleL = UILabel()
-        subTitleL.text = "请重新尝试"
+        subTitleL.text = "compose_retry4".BFLocale
         subTitleL.tag = 33000
         subTitleL.font = UIFont.systemFont(ofSize: 24)
         subTitleL.textColor = UIColor.hexColor(hexadecimal: "#A6A6A6")
@@ -160,7 +179,7 @@ class INVideoExportController: BFBaseViewController {
         
         let retryBtn = UIButton()
         retryBtn.backgroundColor = ThemeStyleColor
-        retryBtn.setTitle("重试", for: .normal)
+        retryBtn.setTitle("compose_retry".BFLocale, for: .normal)
         retryBtn.tag = 33001
         retryBtn.setTitleColor(.white, for: .normal)
         retryBtn.addCorner(corner:5)
@@ -269,17 +288,17 @@ class INVideoExportController: BFBaseViewController {
                     if let l = wself.errorView.viewWithTag(33000) as? UILabel, let err = error as NSError?,let b = wself.errorView.viewWithTag(33001) as? UIButton {
                         switch err.code {
                         case ExportError.FileNotExist.rawValue :
-                            l.text = "原视频/图片文件被删除"
-                            b.setTitle("重新制作", for: .normal)
+                            l.text = "compose_fail_delete".BFLocale
+                            b.setTitle("compose_retry2".BFLocale, for: .normal)
                         case ExportError.DiskNoSpace.rawValue :
-                            l.text = "存储空间不足:" + (err.userInfo["msg"] as! String)
-                            b.setTitle("重试", for: .normal)
+                            l.text = "compose_fail_storage".BFLocale + (err.userInfo["msg"] as! String)
+                            b.setTitle("compose_retry".BFLocale, for: .normal)
                         case ExportError.VoiceLost.rawValue :
-                            l.text = "手机录音文件丢失"
-                            b.setTitle("重试", for: .normal)
+                            l.text = "compose_fail_records".BFLocale
+                            b.setTitle("compose_retry".BFLocale, for: .normal)
                         default:
-                            l.text = "请重新尝试"
-                            b.setTitle("重试", for: .normal)
+                            l.text = "compose_retry4".BFLocale
+                            b.setTitle("compose_retry".BFLocale, for: .normal)
                         }
                         l.sizeToFit()
                     }
@@ -368,7 +387,7 @@ class INVideoExportController: BFBaseViewController {
 
     override func backBtnClick() {
         if isExporting {
-            whetherCancelExport (msg: "正在合成中,是否取消?"){
+            whetherCancelExport (msg: "savemode_changes".BFLocale){
                 self.export.cancelExport()
                 super.backBtnClick()
             }
@@ -415,8 +434,11 @@ class INVideoExportController: BFBaseViewController {
         backV.addSubview(progressL)
         
         bottomView.addSubview(saveAllBtn)
+        saveAllBtn.addSubview(saveAllBtnTips)
         bottomView.addSubview(saveOnlyBtn)
+        saveOnlyBtn.addSubview(saveOnlyBtnTips)
         bottomView.addSubview(saveToPhotoBtn)
+        
         bottomView.addSubview(completeBtn)
         
         errorView.snp.makeConstraints { make in
@@ -481,6 +503,11 @@ class INVideoExportController: BFBaseViewController {
             make.top.equalTo(28)
             make.centerX.equalToSuperview().offset(-82 - 6.5)
         }
+        saveAllBtnTips.snp.makeConstraints { make in
+            make.bottom.equalToSuperview().offset(-7)
+            make.left.equalToSuperview().offset(2)
+            make.right.equalToSuperview().offset(-2)
+        }
 
         saveOnlyBtn.snp.makeConstraints { make in
 //            make.left.equalTo(saveAllBtn.snp.right).offset(16)
@@ -488,6 +515,12 @@ class INVideoExportController: BFBaseViewController {
             make.left.equalTo(saveAllBtn.snp.right).offset(13)
             make.right.equalTo(completeBtn)
         }
+        
+        saveOnlyBtnTips.snp.makeConstraints { make in
+            make.bottom.equalToSuperview().offset(-7)
+            make.left.equalToSuperview().offset(2)
+            make.right.equalToSuperview().offset(-2)
+        }
 
 //        DispatchQueue.main.asyncAfter(deadline: .now() + 0) { [weak self] in
 //            guard let wself = self else {
@@ -558,7 +591,7 @@ class INVideoExportController: BFBaseViewController {
     }
     // MARK: - 按钮事件
     @objc func retryAction(sender:UIButton){
-        if sender.currentTitle == "重新制作" {
+        if sender.currentTitle == "compose_retry2".BFLocale {
             export.cancelExport()
             navigationController?.popToRootViewController(animated: true)
         } else {
@@ -569,7 +602,7 @@ class INVideoExportController: BFBaseViewController {
     
     func exportNow() {
         if isExporting {
-            cShowHUB(superView: nil, msg: "正在合成中。。。")
+            cShowHUB(superView: nil, msg: "compose_loading".BFLocale)
             return
         }
         isExporting = true
@@ -582,10 +615,15 @@ class INVideoExportController: BFBaseViewController {
 //            saveAllBtn.setImage(UIImage(named: "export_saveall_h"), for: .disabled)
             saveAllBtn.setImage(UIImage(named: "export_saveall_h"), for: .normal)
             saveOnlyBtn.setImage(UIImage(named: "export_saveonly_n"), for: .normal)
+            saveAllBtnTips.textColor = UIColor.hexColor(hexadecimal: "#389AFF")
+            saveOnlyBtnTips.textColor = UIColor(red: 0.696, green: 0.696, blue: 0.696, alpha: 1)
         }else{
 //            saveAllBtn.setImage(UIImage(named: "export_saveall_n"), for: .disabled)
             saveAllBtn.setImage(UIImage(named: "export_saveall_n"), for: .normal)
             saveOnlyBtn.setImage(UIImage(named: "export_saveonly_h"), for: .normal)
+            
+            saveOnlyBtnTips.textColor = UIColor.hexColor(hexadecimal: "#389AFF")
+            saveAllBtnTips.textColor = UIColor(red: 0.696, green: 0.696, blue: 0.696, alpha: 1)
         }
         
         saveToPhotoBtn.isEnabled = false
@@ -608,7 +646,7 @@ class INVideoExportController: BFBaseViewController {
 
     @objc func saveToPhotoNow() {
         if (saveAllBtn.isSelected && hasSaveAll) || saveOnlyBtn.isSelected && hasSaveOnly {
-            cShowHUB(superView: nil, msg: "已保存过了")
+            cShowHUB(superView: nil, msg: "compose_tips_saved".BFLocale)
             return
         }
         if let url = (avplayer.currentItem?.asset as? AVURLAsset)?.url {
@@ -620,7 +658,7 @@ class INVideoExportController: BFBaseViewController {
                 }
                 if isFinished {
                     DispatchQueue.main.async {
-                        cShowHUB(superView: nil, msg: "保存成功", style: 1)
+                        cShowHUB(superView: nil, msg: "compose_tips_successfully".BFLocale, style: 1)
                     }
                     if wself.saveAllBtn.isSelected {
                         wself.hasSaveAll = true
@@ -650,6 +688,10 @@ class INVideoExportController: BFBaseViewController {
         
         btn.isSelected = true
         saveOnlyBtn.isSelected = false
+        
+        saveAllBtnTips.textColor = UIColor.hexColor(hexadecimal: "#389AFF")
+        saveOnlyBtnTips.textColor = UIColor(red: 0.696, green: 0.696, blue: 0.696, alpha: 1)
+        
         avplayer.pause()
         
         if !hasExportAll {
@@ -682,6 +724,8 @@ class INVideoExportController: BFBaseViewController {
         
         btn.isSelected = true
         saveAllBtn.isSelected = false
+        saveOnlyBtnTips.textColor = UIColor.hexColor(hexadecimal: "#389AFF")
+        saveAllBtnTips.textColor = UIColor(red: 0.696, green: 0.696, blue: 0.696, alpha: 1)
         avplayer.pause()
         if !hasExportOnly {
             exportNow()
@@ -717,12 +761,13 @@ class INVideoExportController: BFBaseViewController {
         if (!hasSaveOnly && !saveOnlyUlr.absoluteString.contains("aaa"))
             || (!hasSaveAll && !saveAllUlr.absoluteString.contains("aaa")) {
             
-            let alertController = UIAlertController(title: "你还未保存视频哦,是否确定离开?",
+            let alertController = UIAlertController(title: "compose_tips_changes".BFLocale,
                            message: "", preferredStyle: .alert)
-            let cancelAction = UIAlertAction(title: "取消", style: .default){_ in
+            let cancelAction = UIAlertAction(title: "option_cancel".BFLocale, style: .default){_ in
                
             }
-            let okAction = UIAlertAction(title: "确定离开", style: .default) {[weak self] action in
+ 
+            let okAction = UIAlertAction(title: "option_confirm".BFLocale, style: .default) {[weak self] action in
                 guard let wself = self else {
                     return
                 }
@@ -785,11 +830,11 @@ class INVideoExportController: BFBaseViewController {
         }
     }
 
-    func whetherCancelExport(msg:String = "正在合成中,是否切换?", comfirm: (() -> Void)?) {
+    func whetherCancelExport(msg:String = "savemode_changes2".BFLocale, comfirm: (() -> Void)?) {
         let alertController = UIAlertController(title: msg,
                        message: "", preferredStyle: .alert)
-        let cancelAction = UIAlertAction(title: "取消", style: .default, handler: nil)
-        let okAction = UIAlertAction(title: "确定", style: .default) {[weak self] action in
+        let cancelAction = UIAlertAction(title: "option_cancel".BFLocale, style: .default, handler: nil)
+        let okAction = UIAlertAction(title: "option_ok".BFLocale, style: .default) {[weak self] action in
             guard let wself = self else {
                 return
             }

+ 13 - 0
Introduce/en.lproj/InfoPlist.strings

@@ -0,0 +1,13 @@
+/* 
+  InfoPlist.strings
+  Introduce
+
+  Created by ak on 2022/1/17.
+  Copyright © 2022 BytesFlow. All rights reserved.
+*/
+CFBundleDisplayName = "DubDub";
+NSCameraUsageDescription = "For recording";
+NSLocalNetworkUsageDescription = "For generate subtitles";
+NSMicrophoneUsageDescription = "For dubbing";
+NSPhotoLibraryAddUsageDescription =  "For select photos";
+NSPhotoLibraryUsageDescription =  "For select photos";

+ 1 - 0
Introduce/en.lproj/LaunchScreen.strings

@@ -0,0 +1 @@
+

+ 15 - 0
Introduce/en.lproj/Main.strings

@@ -0,0 +1,15 @@
+
+/* Class = "UITabBarItem"; title = "开讲"; ObjectID = "0YV-OH-Tw2"; */
+"0YV-OH-Tw2.title" = "开讲";
+
+/* Class = "UITabBarItem"; title = "消息"; ObjectID = "3sG-lJ-pRE"; */
+"3sG-lJ-pRE.title" = "消息";
+
+/* Class = "UITabBarItem"; title = "开讲"; ObjectID = "Rav-Yf-tVB"; */
+"Rav-Yf-tVB.title" = "开讲";
+
+/* Class = "UITabBarItem"; title = "云空间"; ObjectID = "Sq5-q7-WSB"; */
+"Sq5-q7-WSB.title" = "云空间";
+
+/* Class = "UITabBarItem"; title = "开讲"; ObjectID = "bmj-6g-rLa"; */
+"bmj-6g-rLa.title" = "开讲";

+ 13 - 0
Introduce/ja.lproj/InfoPlist.strings

@@ -0,0 +1,13 @@
+/* 
+  InfoPlist.strings
+  Introduce
+
+  Created by ak on 2022/1/17.
+  Copyright © 2022 BytesFlow. All rights reserved.
+*/
+CFBundleDisplayName = "DubDub";
+NSCameraUsageDescription = "撮影録画用";
+NSLocalNetworkUsageDescription = "インターネットによる字幕の生成";
+NSMicrophoneUsageDescription = "ダビング用";
+NSPhotoLibraryAddUsageDescription =  "アルバムに入ってビデオを選択";
+NSPhotoLibraryUsageDescription =  "アルバムに入ってビデオを選択";

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

@@ -0,0 +1 @@
+

+ 15 - 0
Introduce/ja.lproj/Main.strings

@@ -0,0 +1,15 @@
+
+/* Class = "UITabBarItem"; title = "开讲"; ObjectID = "0YV-OH-Tw2"; */
+"0YV-OH-Tw2.title" = "开讲";
+
+/* Class = "UITabBarItem"; title = "消息"; ObjectID = "3sG-lJ-pRE"; */
+"3sG-lJ-pRE.title" = "消息";
+
+/* Class = "UITabBarItem"; title = "开讲"; ObjectID = "Rav-Yf-tVB"; */
+"Rav-Yf-tVB.title" = "开讲";
+
+/* Class = "UITabBarItem"; title = "云空间"; ObjectID = "Sq5-q7-WSB"; */
+"Sq5-q7-WSB.title" = "云空间";
+
+/* Class = "UITabBarItem"; title = "开讲"; ObjectID = "bmj-6g-rLa"; */
+"bmj-6g-rLa.title" = "开讲";

+ 13 - 0
Introduce/ko-KR.lproj/InfoPlist.strings

@@ -0,0 +1,13 @@
+/* 
+  InfoPlist.strings
+  Introduce
+
+  Created by ak on 2022/1/17.
+  Copyright © 2022 BytesFlow. All rights reserved.
+*/
+CFBundleDisplayName = "DubDub";
+NSCameraUsageDescription = "촬영을 하기 위해서";
+NSLocalNetworkUsageDescription = "인터넷을 위한 자막 생성";
+NSMicrophoneUsageDescription = "더빙을 하기 위해서";
+NSPhotoLibraryAddUsageDescription =  "영상을 고르기 위해서 더빙을 하겠습니다";
+NSPhotoLibraryUsageDescription =  "영상을 고르기 위해서 더빙을 하겠습니다";

+ 1 - 0
Introduce/ko-KR.lproj/LaunchScreen.strings

@@ -0,0 +1 @@
+

+ 15 - 0
Introduce/ko-KR.lproj/Main.strings

@@ -0,0 +1,15 @@
+
+/* Class = "UITabBarItem"; title = "开讲"; ObjectID = "0YV-OH-Tw2"; */
+"0YV-OH-Tw2.title" = "开讲";
+
+/* Class = "UITabBarItem"; title = "消息"; ObjectID = "3sG-lJ-pRE"; */
+"3sG-lJ-pRE.title" = "消息";
+
+/* Class = "UITabBarItem"; title = "开讲"; ObjectID = "Rav-Yf-tVB"; */
+"Rav-Yf-tVB.title" = "开讲";
+
+/* Class = "UITabBarItem"; title = "云空间"; ObjectID = "Sq5-q7-WSB"; */
+"Sq5-q7-WSB.title" = "云空间";
+
+/* Class = "UITabBarItem"; title = "开讲"; ObjectID = "bmj-6g-rLa"; */
+"bmj-6g-rLa.title" = "开讲";

+ 13 - 0
Introduce/vi.lproj/InfoPlist.strings

@@ -0,0 +1,13 @@
+/* 
+  InfoPlist.strings
+  Introduce
+
+  Created by ak on 2022/1/17.
+  Copyright © 2022 BytesFlow. All rights reserved.
+*/
+CFBundleDisplayName = "DubDub";
+NSCameraUsageDescription = "Để chọn đoạn video cần lồng";
+NSLocalNetworkUsageDescription = "Không cho phép vi điện thoại. Hãy bật nó trong thiết lập";
+NSMicrophoneUsageDescription = "Không cho phép vi điện thoại. Hãy bật nó trong thiết lập";
+NSPhotoLibraryAddUsageDescription =  "Không cho phép vi điện thoại. Hãy bật nó trong thiết lập";
+NSPhotoLibraryUsageDescription =  "Không cho phép vi điện thoại. Hãy bật nó trong thiết lập";

+ 1 - 0
Introduce/vi.lproj/LaunchScreen.strings

@@ -0,0 +1 @@
+

+ 15 - 0
Introduce/vi.lproj/Main.strings

@@ -0,0 +1,15 @@
+
+/* Class = "UITabBarItem"; title = "开讲"; ObjectID = "0YV-OH-Tw2"; */
+"0YV-OH-Tw2.title" = "开讲";
+
+/* Class = "UITabBarItem"; title = "消息"; ObjectID = "3sG-lJ-pRE"; */
+"3sG-lJ-pRE.title" = "消息";
+
+/* Class = "UITabBarItem"; title = "开讲"; ObjectID = "Rav-Yf-tVB"; */
+"Rav-Yf-tVB.title" = "开讲";
+
+/* Class = "UITabBarItem"; title = "云空间"; ObjectID = "Sq5-q7-WSB"; */
+"Sq5-q7-WSB.title" = "云空间";
+
+/* Class = "UITabBarItem"; title = "开讲"; ObjectID = "bmj-6g-rLa"; */
+"bmj-6g-rLa.title" = "开讲";

+ 13 - 0
Introduce/zh-Hans.lproj/InfoPlist.strings

@@ -0,0 +1,13 @@
+/* 
+  InfoPlist.strings
+  Introduce
+
+  Created by ak on 2022/1/17.
+  Copyright © 2022 BytesFlow. All rights reserved.
+*/
+CFBundleDisplayName = "视说";
+NSCameraUsageDescription = "点击\"允许\",可进行拍摄录制";
+NSLocalNetworkUsageDescription = "点击\"允许\",可联网生成字幕";
+NSMicrophoneUsageDescription = "点击\"允许\",可进行录制配音";
+NSPhotoLibraryAddUsageDescription =  "点击\"允许\",可进入相册选取视频";
+NSPhotoLibraryUsageDescription =  "点击\"允许\",可进入相册选取视频";

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

@@ -0,0 +1 @@
+

+ 15 - 0
Introduce/zh-Hans.lproj/Main.strings

@@ -0,0 +1,15 @@
+
+/* Class = "UITabBarItem"; title = "开讲"; ObjectID = "0YV-OH-Tw2"; */
+"0YV-OH-Tw2.title" = "开讲";
+
+/* Class = "UITabBarItem"; title = "消息"; ObjectID = "3sG-lJ-pRE"; */
+"3sG-lJ-pRE.title" = "消息";
+
+/* Class = "UITabBarItem"; title = "开讲"; ObjectID = "Rav-Yf-tVB"; */
+"Rav-Yf-tVB.title" = "开讲";
+
+/* Class = "UITabBarItem"; title = "云空间"; ObjectID = "Sq5-q7-WSB"; */
+"Sq5-q7-WSB.title" = "云空间";
+
+/* Class = "UITabBarItem"; title = "开讲"; ObjectID = "bmj-6g-rLa"; */
+"bmj-6g-rLa.title" = "开讲";