增加多语言支持
authorliangzhenying <867174124@qq.com>
Tue, 11 Nov 2025 08:06:39 +0000 (16:06 +0800)
committerliangzhenying <867174124@qq.com>
Tue, 11 Nov 2025 08:06:39 +0000 (16:06 +0800)
135 files changed:
ShenYin/ShenYin.xcodeproj/project.pbxproj
ShenYin/ShenYin/Api/Config.swift
ShenYin/ShenYin/Api/HttpClient.swift
ShenYin/ShenYin/Api/HttpClient2.swift
ShenYin/ShenYin/Api/ResponseBaseModel.swift
ShenYin/ShenYin/Cache/LanuageCache.swift [new file with mode: 0644]
ShenYin/ShenYin/Cache/RecordDetailModel.swift
ShenYin/ShenYin/Cache/UserInfo.swift
ShenYin/ShenYin/Tools/TimerButton/YLTimerButton.m
ShenYin/ShenYin/UI/Base/BaseTC.swift
ShenYin/ShenYin/UI/Base/WebView/BaseWebViewController.swift
ShenYin/ShenYin/UI/Customer/CustomerHeaderView.swift
ShenYin/ShenYin/UI/Customer/CustomerVC.swift
ShenYin/ShenYin/UI/Home/CallingRecordVC.swift
ShenYin/ShenYin/UI/Home/Chat/ChatCell.swift
ShenYin/ShenYin/UI/Home/Chat/ChatHeaderView.swift
ShenYin/ShenYin/UI/Home/Chat/ChatRecordBar.swift
ShenYin/ShenYin/UI/Home/Chat/IntelligentVC.swift
ShenYin/ShenYin/UI/Home/Chat/NavigationBarItem.swift
ShenYin/ShenYin/UI/Home/Chat/RoleListVC.swift
ShenYin/ShenYin/UI/Home/Chinese2English/Chinese2EnglishVC.swift
ShenYin/ShenYin/UI/Home/Device/HomeDeviceCell.swift
ShenYin/ShenYin/UI/Home/Device/HomeDeviceVC.swift
ShenYin/ShenYin/UI/Home/Device/HomeHeadInfoView.swift
ShenYin/ShenYin/UI/Home/Dialog/DialogRecordBar.swift
ShenYin/ShenYin/UI/Home/Dialog/DialogTranlateVC.swift
ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordBar.swift
ShenYin/ShenYin/UI/Home/FieldRecording/FieldRecordingVC.swift
ShenYin/ShenYin/UI/Home/FieldRecording/RecordBar.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/HistoryBottonView.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/SelecteCell.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/VC/CloudRecordVC.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/VC/HistoryRecordVC.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/VC/RecordFontVC.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/VC/RecordShareVC.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/search/CloudSelectedVC.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/search/HistorySearchBottomView.swift
ShenYin/ShenYin/UI/Home/HistoryRecord/search/HistorySelectedVC.swift
ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailBar.swift
ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailTopBar.swift
ShenYin/ShenYin/UI/Home/RecordDetail/RecordDetailVC.swift
ShenYin/ShenYin/UI/Home/RecordTranslateVC.swift
ShenYin/ShenYin/UI/Home/Root/HomeBottomView.swift
ShenYin/ShenYin/UI/Home/Root/HomeFunctionView.swift
ShenYin/ShenYin/UI/Home/Root/HomeHeadView.swift
ShenYin/ShenYin/UI/Home/Root/HomeVC.swift
ShenYin/ShenYin/UI/Home/Scan/AddDeviceVC.swift
ShenYin/ShenYin/UI/Home/Scan/QrVC.swift
ShenYin/ShenYin/UI/Home/TextTranslate/TextTranslateVC.swift
ShenYin/ShenYin/UI/Launch/AppLaunch.swift
ShenYin/ShenYin/UI/Launch/LanConfig.swift [deleted file]
ShenYin/ShenYin/UI/Mine/AboutVC.swift
ShenYin/ShenYin/UI/Mine/AccountSetVC.swift
ShenYin/ShenYin/UI/Mine/Device/DeviceInfoVC.swift
ShenYin/ShenYin/UI/Mine/Device/MyDeviceListVC.swift
ShenYin/ShenYin/UI/Mine/Feedback/Commit/FeedbackCommitVC.swift
ShenYin/ShenYin/UI/Mine/Feedback/Commit/FeedbackContactView.swift
ShenYin/ShenYin/UI/Mine/Feedback/Commit/FeedbackInputView.swift
ShenYin/ShenYin/UI/Mine/Feedback/Commit/FeedbackTypeView.swift
ShenYin/ShenYin/UI/Mine/Feedback/FeedbackBottomView.swift
ShenYin/ShenYin/UI/Mine/Feedback/FeedbackHistoryVC.swift
ShenYin/ShenYin/UI/Mine/Feedback/FeekbackVC.swift
ShenYin/ShenYin/UI/Mine/Instructions/InstructionsDetailVC.swift
ShenYin/ShenYin/UI/Mine/Instructions/InstructionsVC.swift
ShenYin/ShenYin/UI/Mine/Instructions/SearchBar.swift
ShenYin/ShenYin/UI/Mine/LanguageVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/ContryListVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/ForgetVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/LoginVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/RegisterVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/SetEmailVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/SetPasswordVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/SetPhoneVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/SmsLoginVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/VerifyCodeVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/VerifyEmailVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/VerifyPhoneVC.swift
ShenYin/ShenYin/UI/Mine/Login/View/AgreeView.swift
ShenYin/ShenYin/UI/Mine/Login/View/CodeView.swift
ShenYin/ShenYin/UI/Mine/Login/View/CustomInputView.swift
ShenYin/ShenYin/UI/Mine/Login/View/OthersLoginView.swift
ShenYin/ShenYin/UI/Mine/Login/View/PasswordView.swift
ShenYin/ShenYin/UI/Mine/Login/View/RegionView.swift
ShenYin/ShenYin/UI/Mine/Login/ViewModel/IASignWithWeChat.swift
ShenYin/ShenYin/UI/Mine/LoginManager/DeviceLoginDetailVC.swift
ShenYin/ShenYin/UI/Mine/LoginManager/DeviceLoginVC.swift
ShenYin/ShenYin/UI/Mine/MoreSetVC.swift
ShenYin/ShenYin/UI/Mine/RevokeCodeVC.swift
ShenYin/ShenYin/UI/Mine/RevokeVC.swift
ShenYin/ShenYin/UI/Mine/Root/MineCell.swift
ShenYin/ShenYin/UI/Mine/Root/MineHeaderView.swift
ShenYin/ShenYin/UI/Mine/Root/MineVC.swift
ShenYin/ShenYin/UI/Mine/Update/AppUpdateVM.swift
ShenYin/ShenYin/UI/Mine/Update/BleUpdateVM.swift
ShenYin/ShenYin/UI/Mine/Update/UpdateVC.swift
ShenYin/ShenYin/UI/Mine/UserInfo/AreaVC.swift
ShenYin/ShenYin/UI/Mine/UserInfo/CustomCell1.swift
ShenYin/ShenYin/UI/Mine/UserInfo/GenderVC.swift
ShenYin/ShenYin/UI/Mine/UserInfo/NickNameVC.swift
ShenYin/ShenYin/UI/Mine/UserInfo/UserInfoVC.swift
ShenYin/ShenYin/UI/Mine/UserManagerVC.swift
ShenYin/ShenYin/UI/Mode/CustomEqVC.swift
ShenYin/ShenYin/UI/Mode/FindVC.swift
ShenYin/ShenYin/UI/Mode/ModeControView.swift
ShenYin/ShenYin/UI/Mode/ModeEffectsView.swift
ShenYin/ShenYin/UI/Mode/ModeFindView.swift
ShenYin/ShenYin/UI/Sleep/SleepCell.swift
ShenYin/ShenYin/UI/Sleep/SleepVC.swift
ShenYin/ShenYin/UI/common/CustomAlert.swift
ShenYin/ShenYin/UI/common/SendToolBar.swift
ShenYin/ShenYin/UI/common/YLprogressHUD.swift
ShenYin/ShenYin/UI/common/pop/ConnectPopView.swift
ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguagePickerTitle.swift
ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguagePickerView.swift
ShenYin/ShenYin/UI/common/pop/LanguagePicker/LanguageSelectItem.swift
ShenYin/ShenYin/UI/common/pop/PopCloudView.swift
ShenYin/ShenYin/UI/common/pop/PopMenu.swift
ShenYin/ShenYin/UI/common/pop/PopPlayView.swift
ShenYin/ShenYin/UI/common/pop/PopTextField.swift
ShenYin/ShenYin/UI/common/pop/RecordPopView.swift
ShenYin/ShenYin/UI/common/pop/RecordTipsView.swift
ShenYin/ShenYin/lan/AiSupportLanguage.swift [moved from ShenYin/ShenYin/UI/Launch/AiSupportLanguage.swift with 86% similarity]
ShenYin/ShenYin/lan/LanConfig.swift [new file with mode: 0644]
ShenYin/ShenYin/lan/TraditionalChinese.swift [new file with mode: 0644]
ShenYin/ShenYin/lan/Vietnam.swift [new file with mode: 0644]
ShenYin/ShenYin/lan/chinese.swift [new file with mode: 0644]
ShenYin/ShenYin/lan/english.swift [new file with mode: 0644]
ShenYin/ShenYin/lan/french.swift [new file with mode: 0644]
ShenYin/ShenYin/lan/indonesian.swift [new file with mode: 0644]
ShenYin/ShenYin/lan/japanese.swift [new file with mode: 0644]
ShenYin/ShenYin/lan/korean.swift [new file with mode: 0644]
ShenYin/ShenYin/lan/malay.swift [new file with mode: 0644]
ShenYin/ShenYin/lan/russian.swift [new file with mode: 0644]
ShenYin/ShenYin/lan/spanish.swift [new file with mode: 0644]
ShenYin/ShenYin/lan/thai.swift [new file with mode: 0644]

index 361a9b9..de57f90 100644 (file)
@@ -88,6 +88,7 @@
                        children = (
                                3F8F58282EBCA2B800FFC00B /* PrivacyInfo.xcprivacy */,
                                3F887B9E2E38D8DC00C98658 /* ShenYin */,
+                               3F8F68802EC1F25700FFC00B /* New Group */,
                                3F887B9D2E38D8DC00C98658 /* Products */,
                                34A14A83ECF09370871C891F /* Pods */,
                                676B86A4BA2639E8694D56B4 /* Frameworks */,
                        name = Products;
                        sourceTree = "<group>";
                };
+               3F8F68802EC1F25700FFC00B /* New Group */ = {
+                       isa = PBXGroup;
+                       children = (
+                       );
+                       path = "New Group";
+                       sourceTree = "<group>";
+               };
                676B86A4BA2639E8694D56B4 /* Frameworks */ = {
                        isa = PBXGroup;
                        children = (
index aebce50..ef5d632 100644 (file)
@@ -6,7 +6,7 @@
 //
 
 class DCConfig{
-    static var appLanguage = AppSupportLanguage.china
+    static var appLanguage = AppSupportLanguage.english
 }
 
 class DCGlobal {    
index 1e4ecc1..cf2cac3 100644 (file)
 //                completionHandler(T(),"解析请求失败")
 //                break
 //            case .failure(let error):
-//                completionHandler(T(),"请求失败")
+//                completionHandler(T(),"请求失败".l10n)
 //                Logger.debug("***************\n网络连接失败!\n\(error)\n********************")
 //            }
 //        }
index 68339ee..d7d9818 100644 (file)
@@ -572,7 +572,7 @@ extension HttpClient{
     private static func handleResponse<T: HandyJSON>(_ response: Response, completionHandler: @escaping ((T, String) -> Void)) {
         DispatchQueue.main.sync {
             guard let dict = receiveData(response) else{
-                completionHandler(T(),"请求失败")
+                completionHandler(T(),"请求失败".l10n)
                 return
             }
             let responseStr = response.data.string ?? ""
@@ -585,7 +585,7 @@ extension HttpClient{
                 completionHandler(res,responseStr)
                 return
             }
-            completionHandler(T(),"请求失败")
+            completionHandler(T(),"请求失败".l10n)
 
         }
     }
@@ -593,16 +593,16 @@ extension HttpClient{
         DispatchQueue.main.sync {
             if let error = error {
                 Logger.debug(error)
-                completionHandler(T(),"请求失败")
+                completionHandler(T(),"请求失败".l10n)
                 return
             }
             guard let data = data else{
-                completionHandler(T(),"请求失败")
+                completionHandler(T(),"请求失败".l10n)
                 return
             }
             Logger.debug(data.string ?? "")
             guard let dict = data.jsonObject() as? NSDictionary else{
-                completionHandler(T(),"请求失败")
+                completionHandler(T(),"请求失败".l10n)
                 return
             }
             let responseStr = data.string ?? ""
@@ -610,7 +610,7 @@ extension HttpClient{
                 completionHandler(res,responseStr)
                 return
             }
-            completionHandler(T(),"请求失败")
+            completionHandler(T(),"请求失败".l10n)
 //            if let code = dict["code"] as? Int,code == 50001{
 //                YLprogressHUD.showAutoHiden(text: "当前账号已经退出登录"){
 //                    CacheManager.shared.user.logout()
index 2265a97..3c84544 100644 (file)
@@ -11,7 +11,7 @@ public class ResponseBaseModel: HandyJSON {
     required public init() { }
 
     public var code = -1
-    public var msg = "请求失败"
+    public var msg = "请求失败".l10n
     public var success = false
 
     public var isSuccess: Bool { return success}
diff --git a/ShenYin/ShenYin/Cache/LanuageCache.swift b/ShenYin/ShenYin/Cache/LanuageCache.swift
new file mode 100644 (file)
index 0000000..68437ca
--- /dev/null
@@ -0,0 +1,64 @@
+//
+//  LanuageCache.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/11/11.
+//
+
+class LanuageCache{
+    static let key = "LanuageCache"
+    static func save(lan:AppSupportLanguage){
+        UserDefaults.standard.set(lan.title, forKey: key)
+        UserDefaults.standard.synchronize()
+    }
+    static func get()->AppSupportLanguage{
+        if let value = UserDefaults.standard.value(forKey: key),let text = value as? String {
+            for item in AppSupportLanguage.all {
+                if item.title == text{
+                    return item
+                }
+            }
+        }
+        
+        
+        //手机设置的语言
+        let list = NSLocale.preferredLanguages
+        Logger.debug(list)
+        guard let item = list.first else{
+            return .chinse
+        }
+        
+        if item.contains("zh-Hans") {
+            return .chinse
+        }else if  item.contains("zh-Hant") {
+            return .Traditional_Chinese
+        }else if item.hasPrefix("en") {
+            return .english
+        }else if item.hasPrefix("ja") {
+            return .japanese
+        }else if item.hasSuffix("fr") {
+            return .french
+        }else if item == "es" {
+            return .english
+        }
+        else if item == "vi" {
+            return .vietnam
+        }
+        else if item == "th" {
+            return .thai
+        }
+        else if item == "ms" {
+            return .malay
+        }
+        else if item == "tl" {
+            return .Filipino
+        }
+        else if item == "id" {
+            return .indonesian
+        }
+        else if item == "ru" {
+            return .russian
+        }
+        return .english
+    }
+}
index 04e0f1a..b1cdcd7 100644 (file)
@@ -16,15 +16,15 @@ enum FiltterRecordType:String,HandyJSONEnum{
     var title:String{
         switch self {
         case .present:
-            return "现场录音"
+            return "现场录音".l10n
         case .phone:
-            return "通话录音"
+            return "通话录音".l10n
         case .translate:
-            return "同传听译"
+            return "同传听译".l10n
         case .all:
-            return "全部录音"
+            return "全部录音".l10n
         case .colletion:
-            return "收藏录音"
+            return "收藏录音".l10n
         }
     }
     static var alls:[FiltterRecordType]{
@@ -40,11 +40,11 @@ enum RecordType:String,HandyJSONEnum{
     var title:String{
         switch self {
         case .present:
-            return "现场录音"
+            return "现场录音".l10n
         case .phone:
-            return "通话录音"
+            return "通话录音".l10n
         case .translate:
-            return "同传听译"
+            return "同传听译".l10n
         }
     }
 }
index 4514eea..8d61a2f 100644 (file)
@@ -13,11 +13,11 @@ enum GenderType:String,HandyJSONEnum{
     var title:String{
         switch self {
         case .man:
-            return "男"
+            return "男".l10n
         case .female:
-            return "女"
+            return "女".l10n
         case .unnkown:
-            return "保密"
+            return "保密".l10n
         }
     }
 }
index 6f68f09..92699a8 100644 (file)
@@ -52,7 +52,7 @@
     self.enabled = NO;
     self.second = self.maxCount;
     self.label.textColor = [UIColor colorWithRed:67/255.0f green:155/255.0f blue:255/255.0f alpha:1.0f];
-    self.label.text = [NSString stringWithFormat:@"%ld秒",self.second];
+    self.label.text = [NSString stringWithFormat:@"%ldS",self.second];
     self.timer = [NSTimer scheduledTimerWithTimeInterval:1
                                                   target:self
                                                 selector:@selector(count)
index 2b03d61..e0c99ab 100644 (file)
@@ -24,23 +24,23 @@ class BaseTC:UITabBarController{
 
     func setupUI(){
        
-        let item0 = UITabBarItem(title: "AI智能", image: UIImage(named: "tab_0_normal")?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: "tab_0_selected")?.withRenderingMode(.alwaysOriginal))
+        let item0 = UITabBarItem(title: "AI" + "智能".l10n, image: UIImage(named: "tab_0_normal")?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: "tab_0_selected")?.withRenderingMode(.alwaysOriginal))
         let nc0 = BaseNC(rootViewController: homeVC)
         nc0.tabBarItem = item0
         
-        let item1 = UITabBarItem(title: "模式", image: UIImage(named: "tab_1_normal")?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: "tab_1_selected")?.withRenderingMode(.alwaysOriginal))
+        let item1 = UITabBarItem(title: "模式".l10n, image: UIImage(named: "tab_1_normal")?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: "tab_1_selected")?.withRenderingMode(.alwaysOriginal))
         let nc1 = BaseNC(rootViewController: modeVC)
         nc1.tabBarItem = item1
         
-        let item2 = UITabBarItem(title: "睡眠", image: UIImage(named: "tab_2_normal")?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: "tab_2_selected")?.withRenderingMode(.alwaysOriginal))
+        let item2 = UITabBarItem(title: "睡眠".l10n, image: UIImage(named: "tab_2_normal")?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: "tab_2_selected")?.withRenderingMode(.alwaysOriginal))
         let nc2 = BaseNC(rootViewController: sleepVC)
         nc2.tabBarItem = item2
         
-        let item3 = UITabBarItem(title: "客服", image: UIImage(named: "tab_3_normal")?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: "tab_3_selected")?.withRenderingMode(.alwaysOriginal))
+        let item3 = UITabBarItem(title: "客服".l10n, image: UIImage(named: "tab_3_normal")?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: "tab_3_selected")?.withRenderingMode(.alwaysOriginal))
         let nc3 = BaseNC(rootViewController: customerVC)
         nc3.tabBarItem = item3
         
-        let item4 = UITabBarItem(title: "我的", image: UIImage(named: "tab_4_normal")?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: "tab_4_selected")?.withRenderingMode(.alwaysOriginal))
+        let item4 = UITabBarItem(title: "我的".l10n, image: UIImage(named: "tab_4_normal")?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: "tab_4_selected")?.withRenderingMode(.alwaysOriginal))
         let nc4 = BaseNC(rootViewController: mineVC)
         nc4.tabBarItem = item4
         
@@ -55,6 +55,6 @@ class BaseTC:UITabBarController{
         self.tabBar.backgroundColor = .white
         view.backgroundColor = .color(.bgColor)
 
-//        self.selectedIndex = 2
+        self.selectedIndex = 4
     }
 }
index d7a8f3e..dc3e6a0 100644 (file)
@@ -40,7 +40,7 @@ final class BaseWebViewController: BaseVC {
         
         navBar.title = initData.title
         navBar.rightView.isHidden = false
-        navBar.rightView.setTitle("关闭", for: .normal)
+        navBar.rightView.setTitle("关闭".l10n, for: .normal)
         
         view.backgroundColor = .color(.bgColor)
         
index abad918..55f795e 100644 (file)
@@ -19,7 +19,7 @@ class CustomerHeaderView: BaseView {
             v.yc.setCornerRadius(12)
         }
         titleLabel.do { (v) in
-            v.data = FeedbackContentModel(content: "你好,请问有什么我可以帮助到您?",isSend: false)
+            v.data = FeedbackContentModel(content: "你好,请问有什么我可以帮助到您".l10n,isSend: false)
         }
         
         
@@ -46,7 +46,7 @@ class CustomerHeaderView: BaseView {
         bgView.removeSubviews()
         var totalHeight = 0.0
         let titleLabel = UILabel()
-        titleLabel.text = "猜你想问"
+        titleLabel.text = "猜你想问".l10n
         titleLabel.textColor = .hexString("#121212")
         titleLabel.font = .bold(16)
         titleLabel.sizeToFit()
index 2ca35b6..025e1ea 100644 (file)
@@ -16,7 +16,7 @@ class CustomerVC:BaseVC{
         super.viewDidLoad()
     }
     override func setupViews() {
-        self.navBar.title = "客服"
+        self.navBar.title = "客服".l10n
 //        navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal)
         
         view.addSubviews([scrollView])
@@ -36,7 +36,7 @@ class CustomerVC:BaseVC{
         toolBar.do { v in
             v.textField.text = ""
             v.delegate = self
-            v.textField.placeholder = "请用一句话简单描述下您的问题~"
+            v.textField.placeholder = "请用一句话简单描述下您的问题~".l10n
 //            v.backgroundColor = .green
         }
         qaView.do { v in
@@ -121,7 +121,7 @@ extension CustomerVC:SendToolBarDelegate{
     func sendToolBar(_ toolBar: SendToolBar, _ text: String) {
         toolBar.textField.resignFirstResponder()
         dataList.append(FeedbackContentModel(content: text,isSend: true))
-        dataList.append(FeedbackContentModel(content: "请加企业客服微信具体解答您的问题!",isSend: false))
+        dataList.append(FeedbackContentModel(content: "请加企业客服微信具体解答您的问题!".l10n,isSend: false))
         dataList.append(UIImage(named: "server_qr")!)
         
         refreshData()
index f6e5c66..9f406d2 100644 (file)
@@ -25,7 +25,7 @@ class CallingRecordVC:BaseVC{
         super.viewDidLoad()
     }
     override func setupViews() {
-        navBar.title = "通话录音"
+        navBar.title = "通话录音".l10n
         toolBar.delegate = self
         toolBar.hasRightItem = false
         navBar.backgroundColor = .white
@@ -76,7 +76,7 @@ class CallingRecordVC:BaseVC{
     }
     override func navleftViewTapped() {
         if toolBar.recordBtn.isSelected {
-            CustomAlert.showWith(title: "提示", messgage: "当前正在录音,确定放弃当前录音吗?", cancelCallback: {}) {[unowned self] in
+            CustomAlert.showWith(title: "提示".l10n, messgage: "当前正在录音,确定放弃当前录音吗?".l10n, cancelCallback: {}) {[unowned self] in
                 self.rhythView.stopTimer()
                 JoyGemCallManager.shared().stop()
                 PcmSound.sharedInstance().stopAudioUnit()
index 4c30c65..245c57b 100644 (file)
@@ -27,7 +27,7 @@ class ChatCell:BaseTableViewCell{
             v.backgroundColor = .white
         }
         originalLabel.do { v in
-            v.text = "你好,欢迎使用AI翻译,点击下方按钮立即开始咱们的对话吧"
+            v.text = "你好,欢迎使用AI翻译,点击下方按钮立即开始咱们的对话吧".l10n
             v.font = .medium(14)
             v.textColor = .hexString("#606D80")
             v.numberOfLines = 0
index 6a89517..d5768d3 100644 (file)
@@ -13,7 +13,7 @@ class ChatHeaderView: BaseView {
     
     var role:JoyGemSpeaker!{
         didSet{
-            titleLabel.text = "嗨!我是" + role.name
+            titleLabel.text = "嗨!我是".l10n + role.name
             icon.image = UIImage(named: "role_" + role.role)
         }
     }
@@ -34,7 +34,7 @@ class ChatHeaderView: BaseView {
             v.font = .bold(18)
         }
         desLabel.do {v in
-            v.text = "我可以帮你搜索、答疑、写作,请把你的任务交给 我吧~"
+            v.text = "我可以帮你搜索、答疑、写作,请把你的任务交给 我吧~".l10n
             v.numberOfLines = 0
             v.textAlignment = .center
             v.textColor = .hexString("#666666")
index 9c163c2..189aed4 100644 (file)
@@ -27,7 +27,7 @@ class ChatRecordBar:BaseView{
                 animationBg.backgroundColor = .white
                 animationView.isHidden = true
                 animationView.isHidden = true
-                label.text = "按住说话"
+                label.text = "按住说话".l10n
             }
         }
     }
index b0665b0..60143be 100644 (file)
@@ -16,7 +16,7 @@ class IntelligentVC: BaseVC{
         // Do any additional setup after loading the view.
     }
     override func setupViews() {
-        self.navBar.title = "智能体"
+        self.navBar.title = "智能体".l10n
         tableView.do { v in
             v.backgroundColor = .rgb(0xF7F7F7)
             v.delegate = self
index 374589a..34999a3 100644 (file)
@@ -21,7 +21,7 @@ class NavigationBarItem: BaseView {
         titleLabel.do { v in
             v.textColor = .rgb(0x121212)
             v.font = .bold(14)
-            v.text = "智能体"
+            v.text = "智能体".l10n
             
         }
         isHidden = true
@@ -62,12 +62,12 @@ class ChatRoleItem: BaseView {
         titleLabel.do { v in
             v.textColor = .rgb(0x121212)
             v.font = .bold(14)
-            v.text = "智能体"
+            v.text = "智能体".l10n
         }
         deslabel.do { v in
             v.textColor = .rgb(0x9C9C9C)
             v.font = .regular(10)
-            v.text = "切换角色"
+            v.text = "切换角色".l10n
         }
     }
     
index 0584d3c..c791423 100644 (file)
@@ -25,7 +25,7 @@ class RoleListVC: BaseVC{
         // Do any additional setup after loading the view.
     }
     override func setupViews() {
-        self.navBar.title = "角色切换"
+        self.navBar.title = "角色切换".l10n
         tableView.do { v in
             v.backgroundColor = .rgb(0xF7F7F7)
             v.delegate = self
index 29aee02..fbb3713 100644 (file)
@@ -18,7 +18,7 @@ class Chinese2EnglishVC:BaseVC{
     var startIndex = 0//记录开始录音的次数,用于区分返回的数据
 
     override func setupViews() {
-        navBar.title = "中英互译"
+        navBar.title = "中英互译".l10n
         navBar.rightView.isHidden = false
         navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal)
         view.addSubview(tableView)
@@ -27,8 +27,8 @@ class Chinese2EnglishVC:BaseVC{
         
         toolBar.delegate = self
         toolBar.isChienseEnglish = true
-        toolBar.leftItem.valueLabel.text = "左耳"
-        toolBar.rightItem.valueLabel.text = "右耳"
+        toolBar.leftItem.valueLabel.text = "左耳".l10n
+        toolBar.rightItem.valueLabel.text = "右耳".l10n
         
         tableView.backgroundColor = .clear
         tableView.delegate = self
@@ -82,7 +82,7 @@ class Chinese2EnglishVC:BaseVC{
     }
     override func navleftViewTapped() {
         if toolBar.recordBtn.isSelected {
-            CustomAlert.showWith(title: "提示", messgage: "当前正在录音,确定放弃当前录音吗?", cancelCallback: {}) {
+            CustomAlert.showWith(title: "提示".l10n, messgage: "当前正在录音,确定放弃当前录音吗".l10n, cancelCallback: {}) {
                 JoyGemSIDeviceManager.shared().stop()
                 PcmSound.sharedInstance().stopAudioUnit()
                 PcmSound.sharedInstance().cleanup()
index 831e7a9..59c7821 100644 (file)
@@ -22,11 +22,11 @@ class HomeDeviceCell: BaseCollectionViewCell {
             icon.kf.setImage(with: model.image.yc.asUrl)
             
             if BleManager.shared.isConected(mac: model.mac) {
-                valueLabel.text =  "已连接"
+                valueLabel.text =  "已连接".l10n
                 bgView.alpha = 1
             }
             else{
-                valueLabel.text =  "未连接"
+                valueLabel.text =  "未连接".l10n
                 bgView.alpha = 0.5
             }
         }
@@ -89,7 +89,7 @@ class HomeDeviceCell: BaseCollectionViewCell {
     
     @objc func handleLongPress(_ gesture: UILongPressGestureRecognizer) {
         if gesture.state == .began {
-            CustomAlert.showWith(title: "提示", messgage: "确定要解绑该设备吗?", cancelCallback: {}) {[weak self] in
+            CustomAlert.showWith(title: "提示".l10n, messgage: "确定要解绑该设备吗?".l10n, cancelCallback: {}) {[weak self] in
                 guard let self = self else{return}
                 longPress?(model)
             }
index 8a68ff3..a6ed801 100644 (file)
@@ -87,7 +87,7 @@ class HomeDeviceVC:BaseVC{
                 BleManager.shared.cancel()
             }
             else{
-                YLprogressHUD.showAutoHiden("请求失败")
+                YLprogressHUD.showAutoHiden("请求失败".l10n)
             }
         }
     }
index 43009c9..9cf65c0 100644 (file)
@@ -30,7 +30,7 @@ class HomeHeadInfoView: BaseColletionSetionHeader {
             v.textColor = .hexString("#121212")
             v.font = .medium(22)
             v.textAlignment = .left
-            v.text = "设备"
+            v.text = "设备".l10n
         }
     }
     
@@ -56,6 +56,6 @@ class HomeHeadInfoView: BaseColletionSetionHeader {
     }
     func updateUI(){
         titleLabel.text = CacheManager.shared.user.info.userName
-        deviceLabel.text = "共\(DeviceVM.shared.dataList.count)个智能设备"
+        deviceLabel.text = "\(DeviceVM.shared.dataList.count)" + "个智能设备".l10n
     }
 }
index 23b82ff..9246e6d 100644 (file)
@@ -264,13 +264,13 @@ class DialogRecordBar: BaseView {
                 v.language = AiSupportLanguage.chinse
                 v.yc.addTap(target: self, action: #selector(leftLanguageAction))
                 v.language = .chinse
-                v.valueLabel.text = "耳机"
+                v.valueLabel.text = "耳机".l10n
             }
             rightItem.do { (v) in
                 v.language = AiSupportLanguage.english
                 v.yc.addTap(target: self, action: #selector(rightLanguageAction))
                 v.language = .english
-                v.valueLabel.text = "手机"
+                v.valueLabel.text = "手机".l10n
             }
         }
         
index 57dcd27..b04aa71 100644 (file)
@@ -26,7 +26,7 @@ class DialogTranslateVC:BaseVC{
     override func setupViews() {
         view.addSubviews([toolBar,tableView,splitView])
         
-        navBar.title = "对话翻译"
+        navBar.title = "对话翻译".l10n
         navBar.rightView.isHidden = false
         navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal)
         
index 79c095d..3aac513 100644 (file)
@@ -77,7 +77,7 @@ class FieldRecordBar: BaseView {
         }
         let list = AiSupportLanguage.record.map{$0.title}
         
-        let v = CustomPicker(title: "请选择语言", list:list )
+        let v = CustomPicker(title: "请选择语言".l10n, list:list )
         v.selectedIndex = list.firstIndex(where: {leftItem.language.title == $0})!
         v.show()
         v.didSelected = {[weak self] (index,value) in
@@ -162,15 +162,15 @@ class FieldRecordBar: BaseView {
         var state:RecordSate = .resume{
             didSet{
                 if state == .start {
-                    titleLabel.text = "暂停"
+                    titleLabel.text = "暂停".l10n
                     icon.image = UIImage(named: "record_pause")
                 }
                 else if state == .resume{
-                    titleLabel.text = "暂停"
+                    titleLabel.text = "暂停".l10n
                     icon.image = UIImage(named: "record_pause")
                 }
                 else if state == .pause{
-                    titleLabel.text = "继续"
+                    titleLabel.text = "继续".l10n
                     icon.image = UIImage(named: "record_play")
                 }
             }
index 5f010a7..7d427c6 100644 (file)
@@ -22,7 +22,7 @@ class FieldRecordingVC:BaseVC{
     }
 
     override func setupViews() {
-        navBar.title = "现场录音"
+        navBar.title = "现场录音".l10n
         navBar.backgroundColor = .white
         toolBar.delegate = self
         view.backgroundColor = .white
@@ -78,7 +78,7 @@ class FieldRecordingVC:BaseVC{
     }
     override func navleftViewTapped() {
         if toolBar.recordBtn.isSelected {
-            CustomAlert.showWith(title: "提示", messgage: "当前正在录音,确定放弃当前录音吗?", cancelCallback: {}) {[unowned self] in
+            CustomAlert.showWith(title: "提示", messgage: "当前正在录音,确定放弃当前录音吗?".l10n, cancelCallback: {}) {[unowned self] in
                 self.rhythView.stopTimer()
                 JoyGemRecordManager.shared().stop()
                 PcmSound.sharedInstance().stopAudioUnit()
index 59b0e38..c8022a9 100644 (file)
@@ -173,7 +173,7 @@ class RecordBar: BaseView {
             valueLabel.do { v in
                 v.textColor = .rgb(0x666666)
                 v.font = .regular(10)
-                v.text = "耳机"
+                v.text = "耳机".l10n
             }
         }
         
index 09023e1..80fa23a 100644 (file)
@@ -25,7 +25,7 @@ class HistoryBottonView: BaseView {
             attachment.bounds = CGRect(x: 0, y: 0, width: 12, height: 12)
             let attachmentString = NSAttributedString(attachment: attachment)
             
-            let text = " 由于录音文件存储在手机本地,因此软件卸载后,您的录音数据将全部丢失。耳机内置存储的录音文件可以通过APP下载到手机中,并支持备注和重命名等操作。"
+            let text = " 由于录音文件存储在手机本地,因此软件卸载后,您的录音数据将全部丢失。耳机内置存储的录音文件可以通过APP下载到手机中,并支持备注和重命名等操作。".l10n
             let textString = NSAttributedString(string: text)
             
             let mutableAttributedString = NSMutableAttributedString()
index 466399c..8df8170 100644 (file)
@@ -13,11 +13,11 @@ enum FontType:Int{
     var title:String{
         switch self {
         case .min:
-            return "小"
+            return "小".l10n
         case .stand:
-            return "标准"
+            return "标准".l10n
         case .big:
-            return "大"
+            return "大".l10n
         }
     }
     var font:UIFont{
@@ -42,11 +42,11 @@ enum ShareType:Int{
     var title:String{
         switch self {
         case .audio:
-            return "仅音频文件"
+            return "仅音频文件".l10n
         case .document:
-            return "仅文档"
+            return "仅文档".l10n
         case .audio_document:
-            return "音频文件+文档"
+            return "音频文件".l10n + "+" + "文档".l10n
         }
     }
 }
@@ -79,7 +79,11 @@ class SelectCell: BaseTableViewCell {
             titleLabel.text = country.name
         }
     }
-    
+    var lan:AppSupportLanguage = .chinse{
+        didSet{
+            titleLabel.text = lan.title
+        }
+    }
     override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
         super.init(style: style, reuseIdentifier: reuseIdentifier)
     }
index 55b6899..cdc1281 100644 (file)
@@ -23,7 +23,7 @@ class CloudRecordVC: BaseVC{
     }
     override func setupViews() {
         navBar.do { v in
-            v.title = "云存储空间"
+            v.title = "云存储空间".l10n
 //            let items = [NavigationRightItem(image: UIImage(named: "filter"),target: self, action: #selector(filterAction)),NavigationRightItem(image: UIImage(named: "search"), target: self,action: #selector(searchAction))]
             let items = [NavigationRightItem(image: UIImage(named: "filter"),target: self, action: #selector(filterAction))]
             v.setupRightViews(items)
@@ -56,7 +56,7 @@ class CloudRecordVC: BaseVC{
     }
     @objc func filterAction(){
         let list = FiltterRecordType.alls.map({$0.title})
-        let v = CustomPicker(title: "筛选录音", list:list )
+        let v = CustomPicker(title: "筛选录音".l10n, list:list )
         v.selectedIndex = list.firstIndex(where: {vm.type.title == $0})!
         v.show()
         v.didSelected = {[weak self] (index,value) in
@@ -108,9 +108,9 @@ class CloudRecordVC: BaseVC{
         }
         v.renameCallback = {[weak self] in
             let v = PopTextField()
-            v.titleLabel.text = "重命名"
+            v.titleLabel.text = "重命名".l10n
             v.textFiled.text = model.name
-            v.cancelButton.setTitle("取消", for: .normal)
+            v.cancelButton.setTitle("取消".l10n, for: .normal)
             v.show()
             v.cancelTap = {
                 
@@ -145,7 +145,7 @@ class CloudRecordVC: BaseVC{
         }
     }
     func deleteAction(_ model:RecordHistoryModel){
-        CustomAlert.showWith(title: "您要删除这条录音吗?", messgage: "删除后,此记录将无法恢复。", cancelCallback: {}) {[weak self] in
+        CustomAlert.showWith(title: "您要删除这条录音吗?".l10n, messgage: "删除后,这些记录将无法恢复。".l10n, cancelCallback: {}) {[weak self] in
             guard let self = self else{return}
             YLprogressHUD.hidden()
             vm.list.removeAll(where: {$0.id == model.id})
@@ -155,7 +155,7 @@ class CloudRecordVC: BaseVC{
         }
     }
     func deleteAction(indexPath:IndexPath){
-        CustomAlert.showWith(title: "您要删除这条录音吗?", messgage: "删除后,此记录将无法恢复。", cancelCallback: {}) {[weak self] in
+        CustomAlert.showWith(title: "您要删除这条录音吗?".l10n, messgage: "删除后,这些记录将无法恢复。".l10n, cancelCallback: {}) {[weak self] in
             guard let self = self else{return}
             let model = vm.list[indexPath.row]
             vm.list.removeAll(where: {$0.id == model.id})
index 0799459..64ff1d3 100644 (file)
@@ -23,7 +23,7 @@ class HistoryRecordVC: BaseVC{
     }
     override func setupViews() {
         navBar.do { v in
-            v.title = "历史记录"
+            v.title = "历史记录".l10n
 //            let items = [NavigationRightItem(image: UIImage(named: "filter"),target: self, action: #selector(filterAction)),NavigationRightItem(image: UIImage(named: "search"), target: self,action: #selector(searchAction))]
             let items = [NavigationRightItem(image: UIImage(named: "filter"),target: self, action: #selector(filterAction))]
             v.setupRightViews(items)
@@ -66,7 +66,7 @@ class HistoryRecordVC: BaseVC{
     }
     @objc func filterAction(){
         let list = FiltterRecordType.alls.map({$0.title})
-        let v = CustomPicker(title: "筛选录音", list:list )
+        let v = CustomPicker(title: "筛选录音".l10n, list:list )
         v.selectedIndex = list.firstIndex(where: {filtterType.title == $0})!
         v.show()
         v.didSelected = {[weak self] (index,value) in
@@ -94,9 +94,9 @@ class HistoryRecordVC: BaseVC{
         }
         v.renameCallback = {[weak self] in
             let v = PopTextField()
-            v.titleLabel.text = "重命名"
+            v.titleLabel.text = "重命名".l10n
             v.textFiled.text = model.name
-            v.cancelButton.setTitle("取消", for: .normal)
+            v.cancelButton.setTitle("取消".l10n, for: .normal)
             v.show()
             v.cancelTap = {
                 
@@ -125,7 +125,7 @@ class HistoryRecordVC: BaseVC{
         }
     }
     func deleteAction(_ model:RecordDetailModel){
-        CustomAlert.showWith(title: "您要删除这条录音吗?", messgage: "删除后,此记录将无法恢复。", cancelCallback: {}) {[weak self] in
+        CustomAlert.showWith(title: "您要删除这条录音吗?".l10n, messgage: "删除后,此记录将无法恢复。".l10n, cancelCallback: {}) {[weak self] in
             guard let self = self else{return}
             list.removeAll(where: {$0 === model})
             RecordCache.shared.remove(model)
@@ -153,7 +153,7 @@ extension HistoryRecordVC:UITableViewDelegate,UITableViewDataSource {
     }
     func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
         if editingStyle == .delete {
-            CustomAlert.showWith(title: "您要删除这条录音吗?", messgage: "删除后,此记录将无法恢复。", cancelCallback: {}) {[weak self] in
+            CustomAlert.showWith(title: "您要删除这条录音吗?".l10n, messgage: "删除后,这些记录将无法恢复。".l10n, cancelCallback: {}) {[weak self] in
                 guard let self = self else{return}
                 RecordCache.shared.remove(list[indexPath.row])
                 list.remove(at: indexPath.row)
@@ -166,7 +166,7 @@ extension HistoryRecordVC:UITableViewDelegate,UITableViewDataSource {
         return true
     }
     func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
-        return "删除"
+        return "删除".l10n
     }
 
 }
index af5ac80..abb9f8c 100644 (file)
@@ -17,7 +17,7 @@ class RecordFontVC: BaseVC{
         // Do any additional setup after loading the view.
     }
     override func setupViews() {
-        self.navBar.title = "调整字号"
+        self.navBar.title = "调整字号".l10n
         tableView.do { v in
             v.backgroundColor = .rgb(0xF7F7F7)
             v.delegate = self
@@ -29,7 +29,7 @@ class RecordFontVC: BaseVC{
         }
         view.addSubviews([tableView,btn])
         
-        btn.set(title: "设置", target: self, action: #selector(btnAction))
+        btn.set(title: "设置".l10n, target: self, action: #selector(btnAction))
     }
     override func setupLayout() {
         tableView.snp.makeConstraints { make in
index b21359f..bb19919 100644 (file)
@@ -28,7 +28,7 @@ class RecordShareVC: BaseVC{
         // Do any additional setup after loading the view.
     }
     override func setupViews() {
-        self.navBar.title = "分享"
+        self.navBar.title = "分享".l10n
         tableView.do { v in
             v.backgroundColor = .rgb(0xF7F7F7)
             v.delegate = self
@@ -41,7 +41,7 @@ class RecordShareVC: BaseVC{
         }
         view.addSubviews([tableView,btn])
         
-        btn.set(title: "导出", target: self, action: #selector(btnAction))
+        btn.set(title: "导出".l10n, target: self, action: #selector(btnAction))
     }
     override func setupLayout() {
         tableView.snp.makeConstraints { make in
@@ -171,7 +171,7 @@ class ShareHeaderView: BaseView {
             v.font = .regular(14)
             v.numberOfLines = 0
 
-            let text = "多个文件将压缩成一个.zip的文件以便于分享。请选择您需要导出的文件类型:"
+            let text = "多个文件将压缩成一个.zip的文件以便于分享。请选择您需要导出的文件类型:".l10n
             let textString = NSAttributedString(string: text)
             let mutableAttributedString = NSMutableAttributedString()
             mutableAttributedString.append(textString)
index 24e0fb5..2b4f78a 100644 (file)
@@ -57,7 +57,7 @@ class CloudSelectedVC: BaseVC{
             }
             
             let leftLabel = UILabel()
-            leftLabel.text = "全选"
+            leftLabel.text = "全选".l10n
             leftLabel.textColor = .hexString("#666666")
             leftLabel.yc.setBorder(width: 1, color: .hexString("#666666"), radius: 11)
             leftLabel.font = .regular(12)
@@ -72,7 +72,7 @@ class CloudSelectedVC: BaseVC{
             }
             let rightLabel = UILabel()
             rightLabel.textAlignment = .center
-            rightLabel.text = "完成"
+            rightLabel.text = "完成".l10n
             rightLabel.textColor = .white
             rightLabel.backgroundColor = .color(.theme)
             rightLabel.font = .regular(12)
@@ -151,7 +151,7 @@ class CloudSelectedVC: BaseVC{
         }
         deleteList = tempList
         remainDeleteList = tempList
-        CustomAlert.showWith(title: "您要删除这些录音吗?", messgage: "删除后,这些记录将无法恢复。", cancelCallback: {}) {[weak self] in
+        CustomAlert.showWith(title: "您要删除这些录音吗?".l10n, messgage: "删除后,这些记录将无法恢复。".l10n, cancelCallback: {}) {[weak self] in
             guard let self = self else{return}
             YLprogressHUD.showLoading()
             startDelete()
index 491c402..eab19a1 100644 (file)
@@ -15,11 +15,11 @@ class HistorySearchBottomView: BaseView {
         addSubviews([outItem,deleteItem])
         outItem.do { v in
             v.icon.image = UIImage(named: "output_icon")
-            v.titleLabel.text = "导出"
+            v.titleLabel.text = "导出".l10n
         }
         deleteItem.do { v in
             v.icon.image = UIImage(named: "delete_4")
-            v.titleLabel.text = "删除"
+            v.titleLabel.text = "删除".l10n
         }
     }
     override func setupLayout() {
index a564910..5d21bf2 100644 (file)
@@ -148,7 +148,7 @@ class HistorySelectedVC: BaseVC{
             return
         }
         
-        CustomAlert.showWith(title: "您要删除这些录音吗?", messgage: "删除后,这些记录将无法恢复。", cancelCallback: {}) {[weak self] in
+        CustomAlert.showWith(title: "您要删除这些录音吗?".l10n, messgage: "删除后,这些记录将无法恢复。".l10n, cancelCallback: {}) {[weak self] in
             guard let self = self else{return}
             for item in tempList{
                 list.removeAll(where: {$0.model.createTime == item.createTime})
index 005526e..be71f2f 100644 (file)
@@ -27,22 +27,22 @@ class RecordDetailBar: BaseView {
         tranlateItem.do {v in
             v.yc.addTap(target: self, action: #selector(tralateAction))
             v.image = UIImage(named: "record_translate")
-            v.title = "翻译"
+            v.title = "翻译".l10n
         }
         renameItem.do {v in
             v.yc.addTap(target: self, action: #selector(renameAction))
             v.image = UIImage(named: "record_rename")
-            v.title = "重命名"
+            v.title = "重命名".l10n
         }
         playItem.do {v in
             v.yc.addTap(target: self, action: #selector(playAction))
             v.image = UIImage(named: "record_play 1")
-            v.title = "播放录音"
+            v.title = "播放录音".l10n
         }
         moreItem.do {v in
             v.yc.addTap(target: self, action: #selector(moreAction))
             v.image = UIImage(named: "record_more")
-            v.title = "更多"
+            v.title = "更多".l10n
         }
     }
     
index c62bc20..3c6acc1 100644 (file)
@@ -24,17 +24,17 @@ class RecordDetailTopBar: BaseView {
         
         originItem.do {v in
             v.yc.addTap(target: self, action: #selector(originAction))
-            v.label.text = "原文"
+            v.label.text = "原文".l10n
             v.isSelected = true
         }
         tranlateItem.do {v in
             v.yc.addTap(target: self, action: #selector(tralateAction))
-            v.label.text = "译文"
+            v.label.text = "译文".l10n
             v.isSelected = false
         }
         summaryItem.do {v in
             v.yc.addTap(target: self, action: #selector(summaryAction))
-            v.label.text = "摘要"
+            v.label.text = "摘要".l10n
             v.isSelected = false
         }
     }
index 1099693..51c02c6 100644 (file)
@@ -86,15 +86,15 @@ class RecordDetailVC:BaseVC{
             v.text = data.createTime
         }
         originView.do { v in
-            v.title = "原文"
+            v.title = "原文".l10n
             v.content = data.origin
         }
         translateView.do { v in
-            v.title = "译文"
+            v.title = "译文".l10n
             v.content = data.translate
         }
         summaryView.do { v in
-            v.title = "摘要"
+            v.title = "摘要".l10n
             v.content = data.summary
         }
         view.addSubviews([timeLabel,topBar,originView,translateView,summaryView,toolBar])
@@ -118,7 +118,7 @@ class RecordDetailVC:BaseVC{
     }
 
     override func navRightViewTapped() {
-        CustomAlert.showWith(title: "云同步", messgage: "是否上传运存储空间备份?", cancelCallback: {}) {[weak self] in
+        CustomAlert.showWith(title: "云同步".l10n, messgage: "是否上传运存储空间备份".l10n, cancelCallback: {}) {[weak self] in
             self?.uploadToServer()
         }
     }
@@ -251,7 +251,7 @@ class RecordDetailVC:BaseVC{
             }
             else{
                 YLprogressHUD.hidden()
-//                YLprogressHUD.showAutoHiden("请求失败")
+//                YLprogressHUD.showAutoHiden("请求失败".l10n)
             }
         }
     }
@@ -302,7 +302,7 @@ extension RecordDetailVC:RecordDetailBarDelegate{
         var list = AiSupportLanguage.translate.map{$0.title}
         list = list.filter { $0 != data!.from.title }
         
-        let v = CustomPicker(title: "请选择语言", list:list )
+        let v = CustomPicker(title: "请选择语言".l10n, list:list )
         v.selectedIndex = list.firstIndex(where: {data!.to.title == $0})!
         v.show()
         v.didSelected = {[weak self] (index,value) in
@@ -314,9 +314,9 @@ extension RecordDetailVC:RecordDetailBarDelegate{
     
     func recordDetailBarRenameAction(_ bar: RecordDetailBar) {
         let v = PopTextField()
-        v.titleLabel.text = "重命名"
+        v.titleLabel.text = "重命名".l10n
         v.textFiled.text = data?.name ?? ""
-        v.cancelButton.setTitle("取消", for: .normal)
+        v.cancelButton.setTitle("取消".l10n, for: .normal)
         v.show()
         v.cancelTap = {
             
@@ -367,7 +367,7 @@ extension RecordDetailVC:RecordDetailBarDelegate{
             guard let self = self  else {
                 return
             }
-            CustomAlert.showWith(title: "您要删除这条录音吗?", messgage: "删除后,此记录将无法恢复", cancelCallback: {}) {
+            CustomAlert.showWith(title: "您要删除这条录音吗?".l10n, messgage: "删除后,此记录将无法恢复".l10n, cancelCallback: {}) {
                 if let data = self.remoteData{
                     let api = CommomApi.deleteVoiceRecord(recordId: data.id)
                     HttpClient.request(api) {(model:ResponseBaseModel,res) in
@@ -428,7 +428,7 @@ extension RecordDetailVC{
         startUploadFile(data!.path) {[weak self] fileId in
             guard let self = self else{return}
             guard let fid = fileId else{
-                YLprogressHUD.showAutoHiden("请求失败")
+                YLprogressHUD.showAutoHiden("请求失败".l10n)
                 return
             }
             commitToServer(fid)
@@ -451,7 +451,7 @@ extension RecordDetailVC{
                 self?.commitDetail(model.data)
             }
             else{
-                YLprogressHUD.showAutoHiden("请求失败")
+                YLprogressHUD.showAutoHiden("请求失败".l10n)
             }
         }
     }
@@ -477,7 +477,7 @@ extension RecordDetailVC{
                 self?.showUploadSuccess()
             }
             else{
-                YLprogressHUD.showAutoHiden("请求失败")
+                YLprogressHUD.showAutoHiden("请求失败".l10n)
             }
         }
     }
index 3e71230..601aea9 100644 (file)
@@ -20,7 +20,7 @@ class RecordTranslateVC:BaseVC{
     override func setupViews() {
         view.addSubviews([toolBar,textView,translateTextView])
         
-        navBar.title = "同传听译"
+        navBar.title = "同传听译".l10n
         navBar.rightView.isHidden = false
         navBar.rightView.setImage(UIImage(named: "help_icon"), for: .normal)
         
@@ -28,17 +28,17 @@ class RecordTranslateVC:BaseVC{
             v.backgroundColor = .clear
             v.delegate = self
             v.recordBtn.activeView.backgroundColor = .hexString("#F7F7F7")
-            toolBar.rightItem.valueLabel.text = "手机"
+            toolBar.rightItem.valueLabel.text = "手机".l10n
         }
         view.backgroundColor = .hexString("#F7F7F7")
         
         textView.do { v in
-            v.placeHolde = "此处将显示原文"
+            v.placeHolde = "此处将显示原文".l10n
             v.textView.textColor = .hexString("#666666")
         }
         translateTextView.do { v in
             v.textView.textColor = .hexString("#121212")
-            v.placeHolde = "此处将显示译文"
+            v.placeHolde = "此处将显示译文".l10n
             v.bgView.yc.addgradientLayer(colors: [.hexString("#0092E1"),.hexString("#F7F7F7")], direction: .top2down,rect: CGRect(x: 0, y: 0, width: kScreenWid, height: (kScreenHei - kNavBtm - 120 - 10)/2))
             v.bgView.alpha = 0.1
             v.yc.setCorners(withRoundedRect: CGRect(x: 0, y: 0, width: kScreenWid, height: (kScreenHei - kNavBtm - 120 - 10)/2), roundingCorners: [.topLeft,.topRight], cornerRadii: CGSize(width: 20, height: 20))
@@ -92,7 +92,7 @@ class RecordTranslateVC:BaseVC{
     }
     override func navleftViewTapped() {
         if toolBar.recordBtn.isSelected {
-            CustomAlert.showWith(title: "提示", messgage: "当前正在录音,确定放弃当前录音吗?", cancelCallback: {}) {
+            CustomAlert.showWith(title: "提示".l10n, messgage: "当前正在录音,确定放弃当前录音吗?".l10n, cancelCallback: {}) {
                 JoyGemSIDeviceManager.shared().stop()
                 PcmSound.sharedInstance().stopAudioUnit()
                 PcmSound.sharedInstance().cleanup()
index 6c3ba65..63ed8b1 100644 (file)
@@ -26,12 +26,12 @@ class HomeBottomView: BaseView {
         titleLabel.do { (v) in
             v.textColor = .rgb(0x313230)
             v.font = .bold(18)
-            v.text = "历史记录"
+            v.text = "历史记录".l10n
         }
         valueLabel.do { (v) in
             v.textColor = .rgb(0x8d8d8d)
             v.font = .regular(14)
-            v.text = "所有记录,一目了然"
+            v.text = "所有记录,一目了然".l10n
         }
         arrowIcon.image = UIImage(named: "arrow_2")
         yc.addTap(target: self, action: #selector(tapAction))
index 29a2849..b5fd27f 100644 (file)
@@ -19,33 +19,33 @@ public enum HomeCellType: Int {
     var title:String{
         switch self {
         case .fileRecord:
-            return "现场录音"
+            return "现场录音".l10n
         case .callRecord:
-            return "通话录音"
+            return "通话录音".l10n
         case .chinese2English:
-            return "中英互译"
+            return "中英互译".l10n
         case .recordTranslate:
-            return "同传听译"
+            return "同传听译".l10n
         case .dialogTranslate:
-            return "对话翻译"
+            return "对话翻译".l10n
         case .textTranslate:
-            return "文本翻译"
+            return "文本翻译".l10n
         }
     }
     var subTitle:String{
         switch self {
         case .fileRecord:
-            return "随时随地 一键开录"
+            return "随时随地,一键开录".l10n
         case .callRecord:
-            return "一键录音,翻译转写"
+            return "一键录音,翻译转写".l10n
         case .chinese2English:
-            return "实时对话,即时互译"
+            return "实时对话,即时互译".l10n
         case .recordTranslate:
-            return "一机一耳,面对面畅聊"
+            return "一机一耳,面对面畅聊".l10n
         case .dialogTranslate:
-            return "会议讲座,同步翻译"
+            return "会议讲座,同步翻译".l10n
         case .textTranslate:
-            return "即打即译,多语支持"
+            return "即打即译,多语支持".l10n
         }
     }
     var icon:String{
@@ -141,12 +141,12 @@ class HomeCell: BaseView {
         titleLabel.do { (v) in
             v.textColor = .rgb(0x313230)
             v.font = .bold(14)
-            v.text = "AI智能对话"
+            v.text = "AI" + "智能对话".l10n
         }
         valueLabel.do { (v) in
             v.textColor = .rgb(0x8d8d8d)
             v.font = .regular(10)
-            v.text = "随时随地 一键开录"
+            v.text = "随时随地,一键开录".l10n
         }
         arrowIcon.image = UIImage(named: "arrow_2")
         yc.addTap(target: self, action: #selector(tapAction))
index e336e7d..93ba790 100644 (file)
@@ -43,12 +43,12 @@ class HomeHeadView: BaseView {
         titleLabel.do { (v) in
             v.textColor = .rgb(0x313230)
             v.font = .bold(18)
-            v.text = "AI智能对话"
+            v.text = "AI" + "智能对话".l10n
         }
         valueLabel.do { (v) in
             v.textColor = .rgb(0x8d8d8d)
             v.font = .regular(14)
-            v.text = "AI伙伴,随叫随到"
+            v.text = "AI" + "伙伴,随叫随到".l10n
         }
         arrowIcon.image = UIImage(named: "arrow_2")
         self.enable = BleManager.shared.isConnetd
index 6a2ee52..8023d20 100644 (file)
@@ -72,7 +72,7 @@ class HomeVC:BaseVC{
 ////                SVProgressHUD.show(withStatus: "请求成功")
 //            }
 //            else{
-////                SVProgressHUD.show(withStatus: "请求失败")
+////                SVProgressHUD.show(withStatus: "请求失败".l10n)
 //            }
 //        }
     }
index 6e53290..9f9f2dc 100644 (file)
@@ -21,7 +21,7 @@ class AddDeviceVC:BaseVC{
 //        navBar.rightView.setImage(UIImage(named: "tips_cion"), for: .normal)
         view.addSubviews([titleLabel,addView,scanView])
         titleLabel.do { v in
-            v.text = "从这里选择一项用来添加设备"
+            v.text = "从这里选择一项用来添加设备".l10n
             v.textColor = .rgb(0x121212)
             v.font = .medium(14)
             v.textAlignment = .center
@@ -29,12 +29,12 @@ class AddDeviceVC:BaseVC{
         addView.do { v in
             v.icon.image = UIImage(named: "device_ble")
             v.yc.setCornerRadius(20)
-            v.btn.set(title: "添加设备",font: .regular(14),style: .theme1, target: self, action: #selector(addAction))
+            v.btn.set(title: "添加设备".l10n,font: .regular(14),style: .theme1, target: self, action: #selector(addAction))
         }
         scanView.do { v in
             v.icon.image = UIImage(named: "device_qr")
             v.yc.setCornerRadius(20)
-            v.btn.set(title: "扫码连接",font: .regular(14),style: .theme1, target: self, action: #selector(scanAction))
+            v.btn.set(title: "扫码连接".l10n,font: .regular(14),style: .theme1, target: self, action: #selector(scanAction))
         }
     }
     override func setupLayout() {
index eb10eb3..88dadfa 100644 (file)
@@ -95,10 +95,10 @@ class QrVC: LBXScanViewController {
         scanObj?.changeTorch()
         btnFlash.isSelected = !btnFlash.isSelected
         if btnFlash.isSelected {
-            closeLabel.text = "关灯"
+            closeLabel.text = "关灯".l10n
         }
         else{
-            closeLabel.text = "开灯"
+            closeLabel.text = "开灯".l10n
         }
     }
 }
index 9d0be73..e58eefe 100644 (file)
@@ -17,7 +17,7 @@ class TextTranlateVC:BaseVC{
         super.viewDidLoad()
     }
     override func setupViews() {
-        self.navBar.title = "文本翻译"
+        self.navBar.title = "文本翻译".l10n
         
         view.addSubviews([languageItem,scrollView])
         scrollView.addSubviews([toolBar,tableView])
index 2bede18..fcb749b 100644 (file)
@@ -11,6 +11,10 @@ import IQKeyboardManagerSwift
 class AppLaunch:NSObject{
     @MainActor static func start(){
 //        NFX.sharedInstance().start()
+        
+            DCConfig.appLanguage = LanuageCache.get()
+
+        
         IASignWithWeChat.shared.register()
         JoySdkManager.shared.setupSdk()
         setupKeyboard()
diff --git a/ShenYin/ShenYin/UI/Launch/LanConfig.swift b/ShenYin/ShenYin/UI/Launch/LanConfig.swift
deleted file mode 100644 (file)
index 05c96cb..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-//
-//  LangConfig.swift
-//  ShenYin
-//
-//  Created by liangshi on 2025/10/15.
-//
-
-enum AppSupportLanguage{
-    case china
-    case usa
-    case japan
-    case korea
-    case taiwan
-    case spani
-    case vietnam
-    case thailand
-    case malaysia
-    case philippines
-    case frence
-    case singapore
-    case indonesia
-    case russia
-    
-    static var all:[AppSupportLanguage]{
-        return [.china,.usa,.japan,.korea,.taiwan,.spani,.vietnam,.thailand,.malaysia,.philippines,.frence,.singapore,.indonesia,.russia]
-    }
-    var title:String{
-        switch self {
-        case .china:
-            return "中文"
-        case .usa:
-            return "美国"
-        case .japan:
-            return "日文"
-        case .korea:
-            return "韩文"
-        case .taiwan:
-            return "中国台湾"
-        case .spani:
-            return "西班牙"
-        case .vietnam:
-            return "越南"
-        case .thailand:
-            return "泰国"
-        case .malaysia:
-            return "马来西亚"
-        case .philippines:
-            return "菲律宾"
-        case .frence:
-            return "法国"
-        case .singapore:
-            return "新加坡"
-        case .russia:
-            return "俄罗斯"
-        case .indonesia:
-            return "印度尼西亚文"
-        }
-    }
-    var lanCode:String{
-        switch self {
-        case .china:
-            return "zh_CN"
-        case .usa:
-            return "en_US"
-        case .japan:
-            return "ja"
-        case .korea:
-            return "ko"
-        case .taiwan:
-            return "zh-TW"
-        case .spani:
-            return "es"
-        case .vietnam:
-            return "vi"
-        case .thailand:
-            return "th"
-        case .malaysia:
-            return "ms"
-        case .philippines:
-            return "tl"
-        case .frence:
-            return "fr"
-        case .singapore:
-            return "en"
-        case .russia:
-            return "ru"
-        case .indonesia:
-            return "id"
-        }
-    }
-    var map:[String:String]{
-        switch self {
-        case .china:
-            return englishMap
-        case .usa:
-            return englishMap
-        case .japan:
-            return englishMap
-        case .korea:
-            return englishMap
-        case .taiwan:
-            return englishMap
-        case .spani:
-            return englishMap
-        case .vietnam:
-            return englishMap
-        case .thailand:
-            return englishMap
-        case .malaysia:
-            return englishMap
-        case .philippines:
-            return englishMap
-        case .frence:
-            return englishMap
-        case .singapore:
-            return englishMap
-        case .russia:
-            return englishMap
-        case .indonesia:
-            return englishMap
-        }
-    }
-}
-
-let chineseMap:[String:String] = [
-    "登录" : "login",
-    "注册" : "register",
-]
-let englishMap:[String:String] = [
-    "登录" : "login",
-    "注册" : "register",
-]
-//let japaneseMap:[String:String] = [
-//    "登录" : "login",
-//    "注册" : "register",
-//]
-//let koreanMap:[String:String] = [
-//    "登录" : "login",
-//    "注册" : "register",
-//]
-//let frenchMap:[String:String] = [
-//    "登录" : "login",
-//    "注册" : "register",
-//]
-//let spanishMap:[String:String] = [
-//    "登录" : "login",
-//    "注册" : "register",
-//]
-//let portugueseMap:[String:String] = [
-//    "登录" : "login",
-//    "注册" : "register",
-//]
-//let indonesianMap:[String:String] = [
-//    "登录" : "login",
-//    "注册" : "register",
-//]
-//let russianMap:[String:String] = [
-//    "登录" : "login",
-//    "注册" : "register",
-//]
-//let malayMap:[String:String] = [
-//    "登录" : "login",
-//    "注册" : "register",
-//]
-
-extension String{
-    var l10n:String{
-        if let value = DCConfig.appLanguage.map[self] {
-            return value
-        }
-        else{
-            return self
-        }
-    }
-}
-
-
index c955d0e..d95bf08 100644 (file)
@@ -15,7 +15,7 @@ class AboutVC: BaseVC{
         // Do any additional setup after loading the view.
     }
     override func setupViews() {
-        self.navBar.title = "关于"
+        self.navBar.title = "关于".l10n
         tableView.do { v in
             v.backgroundColor = .color(.bgColor)
             v.delegate = self
@@ -111,7 +111,7 @@ class AboutHeaderView: BaseView {
             v.textColor = .hexString("#666666")
             v.font = .regular(14)
             v.textAlignment = .left
-            v.text = "当前版本:\(Bundle.main.appVersion ?? "") "
+            v.text = "当前版本".l10n + ":\(Bundle.main.appVersion ?? "") "
         }
 
     }
index dfffb97..de51dbc 100644 (file)
@@ -9,14 +9,14 @@ import UIKit
 class AccountSetVC: BaseVC{
     let header = AccountSetHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWid, height: 50))
     let tableView = UITableView(frame: .zero, style: .plain)
-    let list:[(title:String,list:[CustomCellType])] = [("登录方式",[.account,.phone,.email,]),("基本资料",[.loginManager]),]
+    let list:[(title:String,list:[CustomCellType])] = [("登录方式".l10n,[.account,.phone,.email,]),("基本资料".l10n,[.loginManager]),]
     
     override func viewDidLoad() {
         super.viewDidLoad()
         // Do any additional setup after loading the view.
     }
     override func setupViews() {
-        self.navBar.title = "账号设置"
+        self.navBar.title = "账号设置".l10n
         tableView.do { v in
             v.backgroundColor = .color(.bgColor)
             v.delegate = self
index 8a970a9..f69e4ea 100644 (file)
@@ -14,10 +14,10 @@ class DeviceInfoVC: BaseVC{
     init(device: HomeDeviceModel) {
         model = device
         list = [
-            MyDeviceListCellModel(title: "设备名称",value: model.productName),
-            MyDeviceListCellModel(title: "设备地址",value: model.mac),
-            MyDeviceListCellModel(title: "硬件版本",value: "1.0"),
-            MyDeviceListCellModel(title: "软件版本",value: model.version.isEmpty ? "--":model.version),
+            MyDeviceListCellModel(title: "设备名称".l10n,value: model.productName),
+            MyDeviceListCellModel(title: "设备地址".l10n,value: model.mac),
+            MyDeviceListCellModel(title: "硬件版本".l10n,value: "1.0"),
+            MyDeviceListCellModel(title: "软件版本".l10n,value: model.version.isEmpty ? "--":model.version),
             //        MyDeviceListCellModel(title: "剩余容量",value: "100MB"),
         ]
         super.init()
@@ -28,7 +28,7 @@ class DeviceInfoVC: BaseVC{
         // Do any additional setup after loading the view.
     }
     override func setupViews() {
-        self.navBar.title = "设备信息"
+        self.navBar.title = "设备信息".l10n
         tableView.do { v in
             v.backgroundColor = .color(.bgColor)
             v.delegate = self
@@ -154,7 +154,7 @@ fileprivate class FooterView: BaseView {
     override func setupViews() {
         addSubviews([btn])
         
-        btn.set(title: "移除设备", style: .theme4,target: self, action: #selector(btnAction))
+        btn.set(title: "移除设备".l10n, style: .theme4,target: self, action: #selector(btnAction))
 
     }
     override func setupLayout() {
@@ -166,7 +166,7 @@ fileprivate class FooterView: BaseView {
 
     }
     @objc func btnAction(){
-        CustomAlert.showWith(title: "提示", messgage: "确定要解绑该设备吗?", cancelCallback: {}) {[weak self] in
+        CustomAlert.showWith(title: "提示".l10n, messgage: "确定要解绑该设备吗?".l10n, cancelCallback: {}) {[weak self] in
             guard let self = self else{return}
             unbindActon()
         }
@@ -184,7 +184,7 @@ fileprivate class FooterView: BaseView {
             }
             else{
 //                YLprogressHUD.showAutoHiden(model.msg)
-                YLprogressHUD.showAutoHiden("请求失败")
+                YLprogressHUD.showAutoHiden("请求失败".l10n)
             }
         }
     }
index b33f68f..6acd7e2 100644 (file)
@@ -16,7 +16,7 @@ class MyDeviceListVC: BaseVC{
     }
     override func setupViews() {
         navBar.do { v in
-            v.title = "设备详情"
+            v.title = "设备详情".l10n
         }
         
         tableView.do { v in
index 9bf9893..b935782 100644 (file)
@@ -23,7 +23,7 @@ class FeedbackCommitVC:BaseVC{
         App.shared.goToPage(FeedbackHistoryVC())
     }
     override func setupViews() {
-        self.navBar.title = "帮助与反馈"
+        self.navBar.title = "帮助与反馈".l10n
         navBar.rightView.isHidden = false
         navBar.rightView.setImage(UIImage(named: "feedback_history"), for: .normal)
 
@@ -34,7 +34,7 @@ class FeedbackCommitVC:BaseVC{
             v.backgroundColor = .white
             v.yc.setCornerRadius(12)
         }
-        loginBtn.set(title: "确定",style: .theme1, target: self, action: #selector(loginAction))
+        loginBtn.set(title: "确定".l10n,style: .theme1, target: self, action: #selector(loginAction))
     }
     override func setupLayout() {
         bgView.snp.makeConstraints { make in
@@ -80,7 +80,7 @@ class FeedbackCommitVC:BaseVC{
     @objc func loginAction(){
         let content = contentView.textView.textView.text ?? ""
         if content.isEmpty && imgView.dataArray.count == 1 {
-            YLprogressHUD.showAutoHiden("内容不能为空")
+            YLprogressHUD.showAutoHiden("内容不能为空".l10n)
             return
         }
         
@@ -94,7 +94,7 @@ class FeedbackCommitVC:BaseVC{
                     startCommit(list)
                 }
                 else{
-                    YLprogressHUD.showAutoHiden("请求失败")
+                    YLprogressHUD.showAutoHiden("请求失败".l10n)
                 }
             }
         }
@@ -165,7 +165,7 @@ class FeedbackCommitVC:BaseVC{
                 }
             }
             else{
-                YLprogressHUD.showAutoHiden("请求失败")
+                YLprogressHUD.showAutoHiden("请求失败".l10n)
             }
         }
 
index f4854a2..5422552 100644 (file)
@@ -18,14 +18,14 @@ class FeedbackContactView: BaseView,UITextFieldDelegate {
             v.textAlignment = .center
             v.font = .bold(14)
             v.textColor = .hexString("#666666")
-            v.text = "联系方式"
+            v.text = "联系方式".l10n
         }
         bgView.do { v in
             v.backgroundColor = .hexString("#F7F8F9")
             v.yc.setCornerRadius(12)
         }
         textField.do { v in
-            v.placeholder = "请输入手机号或邮箱"
+            v.placeholder = "请输入手机号或邮箱".l10n
             v.font = .regular(14)
             v.returnKeyType = .done
             v.delegate = self
index 8c0f1f0..bcdd429 100644 (file)
@@ -19,14 +19,14 @@ class FeedbackInputView: BaseView {
             v.textAlignment = .center
             v.font = .bold(14)
             v.textColor = .hexString("#666666")
-            v.text = "问题描述或建议"
+            v.text = "问题描述或建议".l10n
         }
         bgView.do { v in
             v.backgroundColor = .hexString("#F7F8F9")
             v.yc.setCornerRadius(12)
         }
         textView.do {v in
-            v.placeHolde = "请至少用10个字描述问题,并添加截图,这有助于问题快速解决。"
+            v.placeHolde = "请至少用10个字描述问题,并添加截图,这有助于问题快速解决。".l10n
             v.backgroundColor = .clear
         }
     }
index 191180f..b41e659 100644 (file)
@@ -31,15 +31,15 @@ class FeedbackTypeView: BaseView {
             v.textAlignment = .center
             v.font = .bold(14)
             v.textColor = .hexString("#666666")
-            v.text = "问题类型"
+            v.text = "问题类型".l10n
         }
         errorItem.do { v in
-            v.titleLabel.text = "功能异常"
+            v.titleLabel.text = "功能异常".l10n
             v.yc.setCornerRadius(17)
             v.yc.addTap(target: self, action: #selector(errorAction))
         }
         adviceItem.do { v in
-            v.titleLabel.text = "意见与反馈"
+            v.titleLabel.text = "意见与反馈".l10n
             v.yc.setCornerRadius(17)
             v.yc.addTap(target: self, action: #selector(adviceAction))
         }
index 0067c0e..a8447e2 100644 (file)
@@ -17,7 +17,7 @@ class FeedbackBottomView: BaseView {
         addSubviews([feedbackItem,chatItem,line])
         feedbackItem.do { v in
             v.icon.image = UIImage(named: "feedback_edit")
-            v.titleLabel.text = "帮助与反馈"
+            v.titleLabel.text = "帮助与反馈".l10n
 //            v.backgroundColor = .green
         }
         line.do { v in
@@ -26,7 +26,7 @@ class FeedbackBottomView: BaseView {
         }
         chatItem.do { v in
             v.icon.image = UIImage(named: "feedback_chat")
-            v.titleLabel.text = "在线咨询"
+            v.titleLabel.text = "在线咨询".l10n
 //            v.backgroundColor = .red
         }
     }
index c6e3a5a..365f52b 100644 (file)
@@ -15,7 +15,7 @@ class FeedbackHistoryVC: BaseVC{
         // Do any additional setup after loading the view.
     }
     override func setupViews() {
-        self.navBar.title = "反馈历史"
+        self.navBar.title = "反馈历史".l10n
         
         tableView.do { v in
             v.backgroundColor = .color(.bgColor)
index 25a9e2f..ce6b72c 100644 (file)
@@ -18,7 +18,7 @@ class FeekbackVC:BaseVC{
         
     }
     override func setupViews() {
-        self.navBar.title = "帮助与反馈"
+        self.navBar.title = "帮助与反馈".l10n
         view.backgroundColor = .color(.bgColor)
         view.addSubviews([bottomView, tableView])
         
index c2a43c5..c187e5a 100644 (file)
@@ -21,7 +21,7 @@ final class InstructionsDetailVC: BaseVC {
     
     override func setupViews() {
         
-        navBar.title = "电子说明书"
+        navBar.title = "电子说明书".l10n
         
         view.addSubview(webView)
         webView.addSubview(progressView)
@@ -160,11 +160,11 @@ extension InstructionsDetailVC: WKUIDelegate {
             completionHandler()
             return
         }
-        let alert = UIAlertController(title: "提示", message: message, preferredStyle: .alert)
-        alert.addAction(UIAlertAction(title: "确定", style: .default, handler: { (_) -> Void in
+        let alert = UIAlertController(title: "提示".l10n, message: message, preferredStyle: .alert)
+        alert.addAction(UIAlertAction(title: "确定".l10n, style: .default, handler: { (_) -> Void in
             completionHandler()
         }))
-        alert.addAction(UIAlertAction(title: "取消", style: .cancel, handler: { (_) -> Void in
+        alert.addAction(UIAlertAction(title: "取消".l10n, style: .cancel, handler: { (_) -> Void in
             completionHandler()
         }))
         self.present(alert, animated: true, completion: nil)
@@ -172,11 +172,11 @@ extension InstructionsDetailVC: WKUIDelegate {
     
     // js 信息的交流
     func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
-        let alert = UIAlertController(title: "提示", message: message, preferredStyle: .alert)
-        alert.addAction(UIAlertAction(title: "确定", style: .default, handler: { (_) -> Void in
+        let alert = UIAlertController(title: "提示".l10n, message: message, preferredStyle: .alert)
+        alert.addAction(UIAlertAction(title: "确定".l10n, style: .default, handler: { (_) -> Void in
             completionHandler(true)
         }))
-        alert.addAction(UIAlertAction(title: "取消", style: .cancel, handler: { (_) -> Void in
+        alert.addAction(UIAlertAction(title: "取消".l10n, style: .cancel, handler: { (_) -> Void in
             completionHandler(false)
         }))
         self.present(alert, animated: true, completion: nil)
@@ -188,7 +188,7 @@ extension InstructionsDetailVC: WKUIDelegate {
         alert.addTextField { (textField: UITextField) -> Void in
             textField.textColor = UIColor.red
         }
-        alert.addAction(UIAlertAction(title: "确定", style: .default, handler: { (_) -> Void in
+        alert.addAction(UIAlertAction(title: "确定".l10n, style: .default, handler: { (_) -> Void in
             completionHandler(alert.textFields![0].text!)
         }))
         self.present(alert, animated: true, completion: nil)
index 0c1def9..08891d8 100644 (file)
@@ -17,7 +17,7 @@ class InstructionsVC: BaseVC{
         // Do any additional setup after loading the view.
     }
     override func setupViews() {
-        self.navBar.title = "电子说明书"
+        self.navBar.title = "电子说明书".l10n
         
         view.addSubviews([tableView,bar])
         bar.do { v in
index 4af4687..169f45c 100644 (file)
@@ -30,7 +30,7 @@ class SearchBar:UIView{
         textField.do { v in
             v.clearButtonMode = .whileEditing
             v.backgroundColor = .clear
-            v.placeholder = "è¾\93å\85¥å\9e\8bå\8f·æ\9f¥è¯¢"
+            v.placeholder = "请è¾\93å\85¥å\9e\8bå\8f·æ\9f¥è¯¢".l10n
             v.returnKeyType = .done
             v.delegate = self
             v.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
index 6afbf03..b622780 100644 (file)
@@ -8,15 +8,14 @@
 import UIKit
 class LanguageVC: BaseVC{
     let tableView = UITableView(frame: .zero, style: .plain)
-    var currentType = CountryModel()
-    var didSelected:((_ model:CountryModel)->Void)?
+    let list = AppSupportLanguage.all
     
     override func viewDidLoad() {
         super.viewDidLoad()
         // Do any additional setup after loading the view.
     }
     override func setupViews() {
-        self.navBar.title = "语言设置"
+        self.navBar.title = "语言设置".l10n
         tableView.do { v in
             v.backgroundColor = .rgb(0xF7F7F7)
             v.delegate = self
@@ -44,12 +43,12 @@ class LanguageVC: BaseVC{
 
 extension LanguageVC:UITableViewDelegate,UITableViewDataSource {
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
-        return LoginVM.shared.countryList.count
+        return list.count
     }
     
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
         let cell = SelectCell.cell(withTableView: tableView, indexPath: indexPath)
-        cell.country = LoginVM.shared.countryList[indexPath.row]
+        cell.lan = list[indexPath.row]
         let rect = CGRect(x: 0, y: 0, width: kScreenWid - 36, height: 52)
         if indexPath.row == 0 {
             cell.bgView.yc.setCorners(withRoundedRect: rect, roundingCorners: [.topLeft,.topRight], cornerRadii: CGSize(width: 8, height: 8))
@@ -60,14 +59,18 @@ extension LanguageVC:UITableViewDelegate,UITableViewDataSource {
         else{
             cell.bgView.yc.setCorners(withRoundedRect: rect, roundingCorners: [.allCorners], cornerRadii: CGSize(width: 0, height: 0))
         }
-        cell.selectedIcon.isHidden = cell.country.id != currentType.id
+        cell.selectedIcon.isHidden = list[indexPath.row] != DCConfig.appLanguage
         return cell
     }
     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
-        let data = LoginVM.shared.countryList[indexPath.row]
-        currentType = data
-        tableView.reloadData()
-        didSelected?(data)
-        navigationController?.popViewController(animated: true)
+        let lan = list[indexPath.row]
+//        CustomAlert.showWith(title: "提示".l10n, messgage: "重启APP才会生效,是否立即重启?".l10n, cancelCallback: {}) {
+//
+//            }
+        DCConfig.appLanguage = lan
+        LanuageCache.save(lan: DCConfig.appLanguage)
+        App.shared.didLogin()
+        App.shared.tabController?.selectedIndex = 4
+        App.shared.goToPage(LanguageVC())
     }
 }
index f04a820..3aa3ab8 100644 (file)
@@ -16,7 +16,7 @@ class ContryListVC: BaseVC{
         // Do any additional setup after loading the view.
     }
     override func setupViews() {
-        self.navBar.title = "国家/地区"
+        self.navBar.title = "国家/地区".l10n
         tableView.do { v in
             v.backgroundColor = .rgb(0xF7F7F7)
             v.delegate = self
index d88bfff..d970497 100644 (file)
@@ -40,7 +40,7 @@ class ForgetVC:BaseVC{
             v.numberOfLines = 0
             v.font = .medium(22)
             v.textColor = .rgb(0x121212)
-            let text = "您好, \n欢迎使用DeepChords"
+            let text = "您好, \n欢迎使用DeepChords".l10n
             let stype = NSMutableParagraphStyle()
             stype.lineSpacing = 10
             let attrString = NSMutableAttributedString(string: text)
@@ -54,21 +54,21 @@ class ForgetVC:BaseVC{
             v.yc.setCorners(withRoundedRect: CGRect(x: 0, y: 0, width: kScreenWid, height: kScreenHei - 244), roundingCorners: [.topLeft,.topRight], cornerRadii: CGSize(width: 50, height: 50))
         }
         titleLabel.do { v in
-            v.text = self.type == .forget ? "忘记密码":"重置密码"
+            v.text = self.type == .forget ? "忘记密码".l10n:"重置密码".l10n
             v.font = .medium(18)
             v.textColor = .hexString("#121212")
         }
         phoneView.do { v in
-            v.textField.placeholder = "请输入手机号码/邮箱"
+            v.textField.placeholder = "请输入手机号码/邮箱".l10n
             v.textField.keyboardType = .emailAddress
         }
         codeView.do { v in
             v.codeButton.addTarget(self, action: #selector(codeButtonAction), for: .touchUpInside)
         }
         pwdView.do { v in
-            v.textField.placeholder = "请输入密码"
+            v.textField.placeholder = "请输入密码".l10n
         }
-        loginBtn.set(title: "确认",style: .theme1, target: self, action: #selector(loginAction))
+        loginBtn.set(title: "确认".l10n,style: .theme1, target: self, action: #selector(loginAction))
         agreeView.isHidden = true
         view.addSubviews([tipsLabel,bgView])
         bgView.addSubviews([titleLabel,phoneView,codeView,pwdView,loginBtn,agreeView])
@@ -119,7 +119,7 @@ class ForgetVC:BaseVC{
 extension ForgetVC{
     @objc func codeButtonAction(){
         guard let text = phoneView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入正确的手机号码")
+            YLprogressHUD.showAutoHiden("请输入正确的手机号码".l10n)
             return
         }
         YLprogressHUD.showLoading()
@@ -135,15 +135,15 @@ extension ForgetVC{
     }
     @objc func loginAction(){
         guard let phone = phoneView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入正确的手机号码")
+            YLprogressHUD.showAutoHiden("请输入正确的手机号码".l10n)
             return
         }
         guard let code = codeView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入验证码")
+            YLprogressHUD.showAutoHiden("请输入验证码".l10n)
             return
         }
         guard let pwd = pwdView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入密码")
+            YLprogressHUD.showAutoHiden("请输入密码".l10n)
             return
         }
         YLprogressHUD.showLoading()
index 0caefa9..61306ab 100644 (file)
@@ -30,7 +30,7 @@ class LoginVC:BaseVC{
             v.numberOfLines = 0
             v.font = .medium(22)
             v.textColor = .rgb(0x121212)
-            let text = "您好, \n欢迎使用DeepChords"
+            let text = "您好, \n欢迎使用DeepChords".l10n
             let stype = NSMutableParagraphStyle()
             stype.lineSpacing = 10
             let attrString = NSMutableAttributedString(string: text)
@@ -44,20 +44,20 @@ class LoginVC:BaseVC{
             v.yc.setCorners(withRoundedRect: CGRect(x: 0, y: 0, width: kScreenWid, height: kScreenHei - 244), roundingCorners: [.topLeft,.topRight], cornerRadii: CGSize(width: 50, height: 50))
         }
         titleLabel.do { v in
-            v.text = "用户登录"
+            v.text = "用户登录".l10n
             v.font = .medium(18)
             v.textColor = .hexString("#121212")
         }
         phoneView.do { v in
 //            v.textField.text = "13480939445"
-            v.textField.placeholder = "请输入手机号码/邮箱"
+            v.textField.placeholder = "请输入手机号码/邮箱".l10n
             v.textField.keyboardType = .emailAddress
         }
         pwdView.do { v in
-            v.textField.placeholder = "请输入密码"
+            v.textField.placeholder = "请输入密码".l10n
         }
         
-        loginBtn.set(title: "登录",style: .theme1, target: self, action: #selector(loginAction))
+        loginBtn.set(title: "登录".l10n,style: .theme1, target: self, action: #selector(loginAction))
         view.addSubviews([tipsLabel,bgView])
         bgView.addSubviews([titleLabel,phoneView,pwdView,loginBtn,agreeView,othersView])
         
@@ -111,15 +111,15 @@ extension LoginVC{
     @objc func loginAction(){
         self.view.endEditing(true)
         if !agreeView.isAgree {
-            YLprogressHUD.showAutoHiden("请阅读用户协议以及隐私政策并点击同意")
+            YLprogressHUD.showAutoHiden("请阅读用户协议以及隐私政策并点击同意".l10n)
             return
         }
         guard let phone = phoneView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入正确的手机号码")
+            YLprogressHUD.showAutoHiden("请输入正确的手机号码".l10n)
             return
         }
         guard let pwd = pwdView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入密码")
+            YLprogressHUD.showAutoHiden("请输入密码".l10n)
             return
         }
         YLprogressHUD.showLoading()
index 0113088..1125ae9 100644 (file)
@@ -31,7 +31,7 @@ class RegisterVC:BaseVC{
             v.numberOfLines = 0
             v.font = .medium(22)
             v.textColor = .rgb(0x121212)
-            let text = "您好, \n欢迎使用DeepChords"
+            let text = "您好, \n欢迎使用DeepChords".l10n
             let stype = NSMutableParagraphStyle()
             stype.lineSpacing = 10
             let attrString = NSMutableAttributedString(string: text)
@@ -45,7 +45,7 @@ class RegisterVC:BaseVC{
             v.yc.setCorners(withRoundedRect: CGRect(x: 0, y: 0, width: kScreenWid, height: kScreenHei - 244), roundingCorners: [.topLeft,.topRight], cornerRadii: CGSize(width: 50, height: 50))
         }
         titleLabel.do { v in
-            v.text = "用户注册"
+            v.text = "用户注册".l10n
             v.font = .medium(18)
             v.textColor = .hexString("#121212")
         }
@@ -64,7 +64,7 @@ class RegisterVC:BaseVC{
         phoneView.do { v in
 //            v.textField.text = "19276672101"
         }
-        registerBtn.set(title: "注册",style: .theme1, target: self, action: #selector(registerAction))
+        registerBtn.set(title: "注册".l10n,style: .theme1, target: self, action: #selector(registerAction))
         view.addSubviews([tipsLabel,bgView])
         bgView.addSubviews([titleLabel,regionView,phoneView,codeView,pwdView,registerBtn,agreeView])
         
@@ -114,11 +114,11 @@ class RegisterVC:BaseVC{
     }
     func updateLayout(){
         if regionView.region.isChinese{
-            phoneView.textField.placeholder = "请输入手机号码"
+            phoneView.textField.placeholder = "请输入手机号码".l10n
             phoneView.textField.keyboardType = .phonePad
         }
         else{
-            phoneView.textField.placeholder = "请输入邮箱"
+            phoneView.textField.placeholder = "请输入邮箱".l10n
             phoneView.textField.keyboardType = .emailAddress
         }
     }
@@ -127,7 +127,7 @@ class RegisterVC:BaseVC{
 extension RegisterVC{
     @objc func codeButtonAction(){
         guard let text = phoneView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入正确的手机号码")
+            YLprogressHUD.showAutoHiden("请输入正确的手机号码".l10n)
             return
         }
         YLprogressHUD.showLoading()
@@ -143,19 +143,19 @@ extension RegisterVC{
     }
     @objc func registerAction(){
         if !agreeView.isAgree {
-            YLprogressHUD.showAutoHiden("请阅读用户协议以及隐私政策并点击同意")
+            YLprogressHUD.showAutoHiden("请阅读用户协议以及隐私政策并点击同意".l10n)
             return
         }
         guard let phone = phoneView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入正确的手机号码")
+            YLprogressHUD.showAutoHiden("请输入正确的手机号码".l10n)
             return
         }
         guard let code = codeView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入验证码")
+            YLprogressHUD.showAutoHiden("请输入验证码".l10n)
             return
         }
         guard let pwd = pwdView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入密码")
+            YLprogressHUD.showAutoHiden("请输入密码".l10n)
             return
         }
         YLprogressHUD.showLoading()
index 88f286d..2470ceb 100644 (file)
@@ -17,18 +17,18 @@ class SetEmailVC:BaseVC{
         super.viewDidLoad()
     }
     override func setupViews(){
-        self.navBar.title = "修改安全邮箱"
+        self.navBar.title = "修改安全邮箱".l10n
         view.backgroundColor = .color(.bgColor)
         
         titleLabel.do { v in
-            v.text = "请输入新的安全邮箱地址"
+            v.text = "请输入新的安全邮箱地址".l10n
             v.font = .medium(18)
             v.textColor = .hexString("#121212")
         }
         phoneView.do { v in
-            v.textField.placeholder = "请输入邮箱地址"
+            v.textField.placeholder = "请输入邮箱地址".l10n
         }
-        loginBtn.set(title: "下一步",style: .theme1, target: self, action: #selector(loginAction))
+        loginBtn.set(title: "下一步".l10n,style: .theme1, target: self, action: #selector(loginAction))
         view.addSubviews([titleLabel,phoneView,loginBtn])
         
     }
index b91c3fb..4a328fa 100644 (file)
@@ -19,26 +19,26 @@ class SetPwdVC:BaseVC{
         super.viewDidLoad()
     }
     override func setupViews(){
-        self.navBar.title = "设置密码"
+        self.navBar.title = "设置密码".l10n
         view.backgroundColor = .color(.bgColor)
        
         titleLabel.do { v in
-            v.text = "新密码"
+            v.text = "新密码".l10n
             v.font = .medium(18)
             v.textColor = .hexString("#121212")
         }
         pwdView1.do { v in
-            v.textField.placeholder = "请输入密码"
+            v.textField.placeholder = "请输入密码".l10n
         }
         pwdView2.do { v in
-            v.textField.placeholder = "请输入确认密码"
+            v.textField.placeholder = "请输入确认密码".l10n
         }
         desLabel.do { v in
-            v.text = "密码长度8-16位,数字、字母、字符至少包含两种"
+            v.text = "密码长度8-16位,数字、字母、字符至少包含两种".l10n
             v.font = .regular(12)
             v.textColor = .hexString("#999999")
         }
-        loginBtn.set(title: "确定",style: .theme1, target: self, action: #selector(loginAction))
+        loginBtn.set(title: "确定".l10n,style: .theme1, target: self, action: #selector(loginAction))
         view.addSubviews([titleLabel,pwdView1,pwdView2,loginBtn,desLabel])
         
     }
@@ -73,11 +73,11 @@ extension SetPwdVC{
 
     @objc func loginAction(){
         guard let pwd1 = pwdView1.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入密码")
+            YLprogressHUD.showAutoHiden("请输入密码".l10n)
             return
         }
         guard let pwd2 = pwdView2.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入确认密码")
+            YLprogressHUD.showAutoHiden("请输入确认密码".l10n)
             return
         }
     }
index f58c79b..273e1c6 100644 (file)
@@ -17,18 +17,18 @@ class SetPhoneVC:BaseVC{
         super.viewDidLoad()
     }
     override func setupViews(){
-        self.navBar.title = "修改安全手机"
+        self.navBar.title = "修改安全手机".l10n
         view.backgroundColor = .color(.bgColor)
         
         titleLabel.do { v in
-            v.text = "请输入新的安全手机号码"
+            v.text = "请输入新的安全手机号码".l10n
             v.font = .medium(18)
             v.textColor = .hexString("#121212")
         }
         phoneView.do { v in
 
         }
-        loginBtn.set(title: "下一步",style: .theme1, target: self, action: #selector(loginAction))
+        loginBtn.set(title: "下一步".l10n,style: .theme1, target: self, action: #selector(loginAction))
         view.addSubviews([titleLabel,phoneView,loginBtn])
         
     }
@@ -56,7 +56,7 @@ class SetPhoneVC:BaseVC{
 extension SetPhoneVC{
     @objc func loginAction(){
         guard let phone = phoneView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入手机号码")
+            YLprogressHUD.showAutoHiden("请输入手机号码".l10n)
             return
         }
         App.shared.goToPage(VerifyPhoneVC(phone: phone))
index a2852a5..0ad0770 100644 (file)
@@ -29,7 +29,7 @@ class SmsLoginVC:BaseVC{
             v.numberOfLines = 0
             v.font = .medium(22)
             v.textColor = .rgb(0x121212)
-            let text = "您好, \n欢迎使用DeepChords"
+            let text = "您好, \n欢迎使用DeepChords".l10n
             let stype = NSMutableParagraphStyle()
             stype.lineSpacing = 10
             let attrString = NSMutableAttributedString(string: text)
@@ -43,7 +43,7 @@ class SmsLoginVC:BaseVC{
             v.yc.setCorners(withRoundedRect: CGRect(x: 0, y: 0, width: kScreenWid, height: kScreenHei - 244), roundingCorners: [.topLeft,.topRight], cornerRadii: CGSize(width: 50, height: 50))
         }
         titleLabel.do { v in
-            v.text = "验证码登录"
+            v.text = "验证码登录".l10n
             v.font = .medium(18)
             v.textColor = .hexString("#121212")
         }
@@ -62,8 +62,8 @@ class SmsLoginVC:BaseVC{
         phoneView.do { v in
 //            v.textField.text = "13480939445"
         }
-        loginBtn.set(title: "登录",style: .theme1, target: self, action: #selector(loginAction))
-        pwdBtn.set(title: "密码登录", style: .theme2,target: self, action: #selector(pwdAction))
+        loginBtn.set(title: "登录".l10n,style: .theme1, target: self, action: #selector(loginAction))
+        pwdBtn.set(title: "密码登录".l10n, style: .theme2,target: self, action: #selector(pwdAction))
         view.addSubviews([tipsLabel,bgView])
         bgView.addSubviews([titleLabel,regionView,phoneView,codeView,loginBtn,pwdBtn,agreeView])
         
@@ -114,11 +114,11 @@ class SmsLoginVC:BaseVC{
     }
     func updateLayout(){
         if regionView.region.isChinese{
-            phoneView.textField.placeholder = "请输入手机号码"
+            phoneView.textField.placeholder = "请输入手机号码".l10n
             phoneView.textField.keyboardType = .phonePad
         }
         else{
-            phoneView.textField.placeholder = "请输入邮箱"
+            phoneView.textField.placeholder = "请输入邮箱".l10n
             phoneView.textField.keyboardType = .emailAddress
         }
     }
@@ -130,7 +130,7 @@ extension SmsLoginVC{
     }
     @objc func codeButtonAction(){
         guard let text = phoneView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入正确的手机号码")
+            YLprogressHUD.showAutoHiden("请输入正确的手机号码".l10n)
             return
         }
         YLprogressHUD.showLoading()
@@ -154,15 +154,15 @@ extension SmsLoginVC{
     }
     func phoneLogin(){
         if !agreeView.isAgree {
-            YLprogressHUD.showAutoHiden("请阅读用户协议以及隐私政策并点击同意")
+            YLprogressHUD.showAutoHiden("请阅读用户协议以及隐私政策并点击同意".l10n)
             return
         }
         guard let phone = phoneView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入正确的手机号码")
+            YLprogressHUD.showAutoHiden("请输入正确的手机号码".l10n)
             return
         }
         guard let code = codeView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入验证码")
+            YLprogressHUD.showAutoHiden("请输入验证码".l10n)
             return
         }
         YLprogressHUD.showLoading()
@@ -186,11 +186,11 @@ extension SmsLoginVC{
     }
     func emailLogin(){
         guard let email = phoneView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入正确的邮箱")
+            YLprogressHUD.showAutoHiden("请输入正确的邮箱".l10n)
             return
         }
         guard let code = codeView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入验证码")
+            YLprogressHUD.showAutoHiden("请输入验证码".l10n)
             return
         }
         YLprogressHUD.showLoading()
index 61fdab7..050484e 100644 (file)
@@ -27,7 +27,7 @@ class VerifyCodeVC:BaseVC{
         super.viewDidLoad()
     }
     override func setupViews(){
-        self.navBar.title = "账号设置"
+        self.navBar.title = "账号设置".l10n
         view.backgroundColor = .color(.bgColor)
         
         titleLabel.do { v in
@@ -39,15 +39,15 @@ class VerifyCodeVC:BaseVC{
         codeView.do { v in
             v.codeButton.addTarget(self, action: #selector(codeButtonAction), for: .touchUpInside)
         }
-        loginBtn.set(title: "确定",style: .theme1, target: self, action: #selector(loginAction))
+        loginBtn.set(title: "确定".l10n,style: .theme1, target: self, action: #selector(loginAction))
         view.addSubviews([titleLabel,codeView,loginBtn])
         
         
         if CacheManager.shared.user.info.phone.isNotEmpty{
-            titleLabel.text = "请使用安全手机\(CacheManager.shared.user.info.phone)获取验证码短信"
+            titleLabel.text = "请使用安全手机".l10n + CacheManager.shared.user.info.phone + "获取验证码短信".l10n
         }
         else{
-            titleLabel.text = "请使用安全邮箱\(CacheManager.shared.user.info.email)获取验证码短信"
+            titleLabel.text = "请使用安全邮箱".l10n + CacheManager.shared.user.info.email + "获取验证码短信".l10n
         }
     }
     override func setupLayout(){
@@ -87,13 +87,13 @@ extension VerifyCodeVC{
                 YLprogressHUD.hidden()
             }
             else{
-                YLprogressHUD.showAutoHiden("请求失败")
+                YLprogressHUD.showAutoHiden("请求失败".l10n)
             }
         }
     }
     @objc func loginAction(){
         guard let code = codeView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入验证码")
+            YLprogressHUD.showAutoHiden("请输入验证码".l10n)
             return
         }
         let plainText = pwd
index ecfa7c2..a69339a 100644 (file)
@@ -23,7 +23,7 @@ class VerifyEmailVC:BaseVC{
         super.viewDidLoad()
     }
     override func setupViews(){
-        self.navBar.title = "账号设置"
+        self.navBar.title = "账号设置".l10n
         view.backgroundColor = .color(.bgColor)
         
         titleLabel.do { v in
@@ -35,10 +35,10 @@ class VerifyEmailVC:BaseVC{
         codeView.do { v in
             v.codeButton.addTarget(self, action: #selector(codeButtonAction), for: .touchUpInside)
         }
-        loginBtn.set(title: "确定",style: .theme1, target: self, action: #selector(loginAction))
+        loginBtn.set(title: "确定".l10n,style: .theme1, target: self, action: #selector(loginAction))
         view.addSubviews([titleLabel,codeView,loginBtn])
         
-        titleLabel.text = "请使用安全邮箱\(email)获取验证码短信"
+        titleLabel.text = "请使用安全邮箱\(email)获取验证码短信".l10n
     }
     override func setupLayout(){
         
@@ -77,7 +77,7 @@ extension VerifyEmailVC{
     }
     @objc func loginAction(){
         guard let code = codeView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入验证码")
+            YLprogressHUD.showAutoHiden("请输入验证码".l10n)
             return
         }
         YLprogressHUD.showLoading()
index 13a1785..4eb7cee 100644 (file)
@@ -23,7 +23,7 @@ class VerifyPhoneVC:BaseVC{
         super.viewDidLoad()
     }
     override func setupViews(){
-        self.navBar.title = "账号设置"
+        self.navBar.title = "账号设置".l10n
         view.backgroundColor = .color(.bgColor)
         
         titleLabel.do { v in
@@ -35,10 +35,10 @@ class VerifyPhoneVC:BaseVC{
         codeView.do { v in
             v.codeButton.addTarget(self, action: #selector(codeButtonAction), for: .touchUpInside)
         }
-        loginBtn.set(title: "确定",style: .theme1, target: self, action: #selector(loginAction))
+        loginBtn.set(title: "确定".l10n,style: .theme1, target: self, action: #selector(loginAction))
         view.addSubviews([titleLabel,codeView,loginBtn])
         
-        titleLabel.text = "请使用安全手机\(phone)获取验证码短信"
+        titleLabel.text = "请使用安全手机\(phone)获取验证码短信".l10n
     }
     override func setupLayout(){
         
@@ -77,7 +77,7 @@ extension VerifyPhoneVC{
     }
     @objc func loginAction(){
         guard let code = codeView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入验证码")
+            YLprogressHUD.showAutoHiden("请输入验证码".l10n)
             return
         }
         YLprogressHUD.showLoading()
index 726ef62..536d6d5 100644 (file)
@@ -27,26 +27,26 @@ class AgreeView: BaseView {
             v.textColor = .hexString("#666666")
             v.font = .regular(12)
             v.textAlignment = .left
-            v.text = "登录并同意"
+            v.text = "登录并同意".l10n
         }
         agreeValue.do { (v) in
             v.textColor = .hexString("#0092E1")
             v.font = .regular(12)
             v.textAlignment = .left
-            v.text = " 《隐私政策》"
+            v.text = "《隐私政策》".l10n
             v.add(target: self, action: #selector(agreementAction))
         }
         andlabel.do { (v) in
             v.textColor = .hexString("#666666")
             v.font = .regular(12)
             v.textAlignment = .left
-            v.text = " 和 "
+            v.text = " 和 ".l10n
         }
         useValue.do { (v) in
             v.textColor = .hexString("#0092E1")
             v.font = .regular(12)
             v.textAlignment = .left
-            v.text = "《用户协议》"
+            v.text = "《用户协议》".l10n
             v.add(target: self, action: #selector(useAction))
         }
         addSubviews([agreeBtn,agreeTitle,agreeValue,andlabel,useValue])
index fea608e..b601e9f 100644 (file)
@@ -15,13 +15,14 @@ class CodeView: BaseView {
         textField.do { v in
             v.textColor = .black
             v.keyboardType = .phonePad
-            v.placeholder = "请输入验证码"
+            v.placeholder = "请输入验证码".l10n
         }
         codeButton.do { (v) in
             v.maxCount = 20
             v.label.textColor = .color(.theme)
             v.backgroundColor = .clear
             v.addLine(height: 22)
+            v.label.text = "点击获取".l10n
         }
         
         inputBgView.backgroundColor = .rgb(0xF3F4F8)
index 424a6b0..90b4514 100644 (file)
@@ -14,7 +14,7 @@ class CustomInputView: BaseView {
         textField.do { v in
             v.textColor = .black
             v.keyboardType = .phonePad
-            v.placeholder = "请输入手机号码"
+            v.placeholder = "请输入手机号码".l10n
             
             let label = UILabel()
             label.textColor = .hexString("#666666")
index 2e73ff7..c6176f4 100644 (file)
@@ -25,21 +25,21 @@ class OthersLoginView: BaseView {
         line2.backgroundColor = .hexString("#666666")
         
         registerLabel.do { v in
-            v.text = "  注册"
+            v.text = "注册".l10n
             v.textColor = .hexString("#666666")
             v.font = .regular(12)
             v.textAlignment = .center
             v.yc.addTap(target: self, action: #selector(registerAction))
         }
         pwdLabel.do { v in
-            v.text = "忘记密码"
+            v.text = "忘记密码".l10n
             v.textColor = .hexString("#666666")
             v.font = .regular(12)
             v.textAlignment = .center
             v.yc.addTap(target: self, action: #selector(forgetAction))
         }
         smsLabel.do { v in
-            v.text = "验证码登录"
+            v.text = "验证码登录".l10n
             v.textColor = .hexString("#666666")
             v.font = .regular(12)
             v.textAlignment = .center
@@ -112,7 +112,7 @@ class ThirdLoginView: BaseView {
 
         
         label.do { v in
-            v.text = "其他登录方式"
+            v.text = "其他登录方式".l10n
             v.textColor = .hexString("#666666")
             v.font = .regular(12)
             v.textAlignment = .center
@@ -223,7 +223,7 @@ class ThirdLoginView: BaseView {
                 }
             }
             else{
-                YLprogressHUD.showAutoHiden("请求失败")
+                YLprogressHUD.showAutoHiden("请求失败".l10n)
             }
         }
     }
index 8a25815..6d3f69a 100644 (file)
@@ -16,7 +16,7 @@ class PasswordView: BaseView {
         textField.do { v in
             v.textColor = .black
             v.keyboardType = .default
-            v.placeholder = "请输入密码"
+            v.placeholder = "请输入密码".l10n
             v.isSecureTextEntry = true
 //            v.returnKeyType = .done
         }
index 603f629..1618534 100644 (file)
@@ -30,7 +30,7 @@ class RegionView: BaseView {
         inputBgView.layer.masksToBounds = true
         inputBgView.yc.addTap(target: self, action: #selector(tapAction))
         titleLabel.do { v in
-            v.text = "国家/地区"
+            v.text = "国家/地区".l10n
             v.textColor = .hexString("#666666")
             v.font = .medium(16)
             v.textAlignment = .center
index 772da2b..5a68c68 100644 (file)
@@ -69,7 +69,7 @@ extension IASignWithWeChat: WXApiDelegate {
         guard let authResp = resp as? SendAuthResp else { return }
         Logger.debug(authResp.errStr, authResp.errCode)
         
-        let error = ["成功", "普通错误类型", "用户取消授权", "发送失败", "授权失败", "当前微信版本不支持"][abs(Int(authResp.errCode))]
+        let error = ["成功".l10n, "普通错误类型".l10n, "用户取消授权".l10n, "发送失败".l10n, "授权失败".l10n, "当前微信版本不支持".l10n][abs(Int(authResp.errCode))]
         guard authResp.errCode == 0 else { return complete( error,nil) }
         complete(error,authResp.code)
     }
index ff1e05b..eba04f0 100644 (file)
@@ -16,9 +16,9 @@ class DeviceLoginDetailVC: BaseVC{
     init(record :DeviceLoginRecordModel){
         model = record
         list = [
-            CommonCellModel(title: "设备名称", value: model.deviceName),
-            CommonCellModel(title: "设备ID", value: model.deviceId),
-            CommonCellModel(title: "最近登录时间", value: model.updateTime),
+            CommonCellModel(title: "设备名称".l10n, value: model.deviceName),
+            CommonCellModel(title: "设备ID".l10n, value: model.deviceId),
+            CommonCellModel(title: "最近登录时间".l10n, value: model.updateTime),
         ]
         super.init()
     }
@@ -85,9 +85,9 @@ fileprivate class FooterView: BaseView {
     override func setupViews() {
         addSubviews([btn,label])
         
-        btn.set(title: "移除设备", style: .theme4,target: self, action: #selector(btnAction))
+        btn.set(title: "移除设备".l10n, style: .theme4,target: self, action: #selector(btnAction))
         label.do { v in
-            v.text = "移除设备后会同步退出账号,在此设备上将无法访问该账号的数据"
+            v.text = "移除设备后会同步退出账号,在此设备上将无法访问该账号的数据".l10n
             v.textAlignment = .left
             v.font = .regular(12)
             v.textColor = .hexString("#999999")
@@ -115,7 +115,7 @@ fileprivate class FooterView: BaseView {
                 }
             }
             else{
-                YLprogressHUD.showAutoHiden("请求失败")
+                YLprogressHUD.showAutoHiden("请求失败".l10n)
             }
         }
     }
index 57d5518..941230f 100644 (file)
@@ -17,7 +17,7 @@ class DeviceLoginVC: BaseVC{
     }
     override func setupViews() {
         navBar.do { v in
-            v.title = "登录设备管理"
+            v.title = "登录设备管理".l10n
         }
         
         tableView.do { v in
index ffd799c..5fdaff3 100644 (file)
@@ -20,7 +20,7 @@ class MoreSetVC: BaseVC{
         // Do any additional setup after loading the view.
     }
     override func setupViews() {
-        self.navBar.title = "更多设置"
+        self.navBar.title = "更多设置".l10n
         tableView.do { v in
             v.backgroundColor = .color(.bgColor)
             v.delegate = self
@@ -33,9 +33,9 @@ class MoreSetVC: BaseVC{
             v.bounces = false
         }
         
-        switchBtn.set(title: "切换账号",style: .theme3, target: self, action: #selector(swictAction))
-        logoutBtn.set(title: "退出登录",style: .theme3, target: self, action: #selector(logoutAction))
-        deactivateBtn.set(title: "注销账号",style: .theme3, target: self, action: #selector(deactivateAction))
+        switchBtn.set(title: "切换账号".l10n,style: .theme3, target: self, action: #selector(swictAction))
+        logoutBtn.set(title: "退出登录".l10n,style: .theme3, target: self, action: #selector(logoutAction))
+        deactivateBtn.set(title: "注销账号".l10n,style: .theme3, target: self, action: #selector(deactivateAction))
         
         view.addSubviews([tableView,switchBtn,logoutBtn,deactivateBtn])
         
@@ -64,17 +64,17 @@ class MoreSetVC: BaseVC{
         }
     }
     @objc func swictAction(){
-        CustomAlert.showWith(title: "提示", messgage: "确定要切换账号吗?", cancelCallback: {}) {
+        CustomAlert.showWith(title: "提示".l10n, messgage: "确定要切换账号吗?".l10n, cancelCallback: {}) {
             CacheManager.shared.user.logout()
         }
     }
     @objc func logoutAction(){
-        CustomAlert.showWith(title: "提示", messgage: "确定要退出登录吗?", cancelCallback: {}) {
+        CustomAlert.showWith(title: "提示".l10n, messgage: "确定要退出登录吗?".l10n, cancelCallback: {}) {
             CacheManager.shared.user.logout()
         }
     }
     @objc func deactivateAction(){
-        CustomAlert.showWith(title: "提示", messgage: "真的要注销账号吗?", cancelCallback: {}) {
+        CustomAlert.showWith(title: "提示".l10n, messgage: "真的要注销账号吗?".l10n, cancelCallback: {}) {
             HttpClient.request(.deactivate) { (result:ResponseBaseModel,res) in
                 if result.isSuccess{
                     YLprogressHUD.showSuccess {
@@ -82,7 +82,7 @@ class MoreSetVC: BaseVC{
                     }
                 }
                 else{
-                    YLprogressHUD.showAutoHiden("请求失败")
+                    YLprogressHUD.showAutoHiden("请求失败".l10n)
                 }
             }
         }
index 44c801d..279d520 100644 (file)
@@ -16,7 +16,7 @@ class RevokeCodeVC:BaseVC{
         super.viewDidLoad()
     }
     override func setupViews(){
-        self.navBar.title = "撤回同意"
+        self.navBar.title = "撤回同意".l10n
         view.backgroundColor = .color(.bgColor)
         
         titleLabel.do { v in
@@ -28,15 +28,15 @@ class RevokeCodeVC:BaseVC{
         codeView.do { v in
             v.codeButton.addTarget(self, action: #selector(codeButtonAction), for: .touchUpInside)
         }
-        loginBtn.set(title: "确认撤回", style: .theme4,target: self, action: #selector(loginAction))
+        loginBtn.set(title: "确认撤回".l10n, style: .theme4,target: self, action: #selector(loginAction))
         view.addSubviews([titleLabel,codeView,loginBtn])
         
         
         if CacheManager.shared.user.info.phone.isNotEmpty{
-            titleLabel.text = "请使用安全手机\(CacheManager.shared.user.info.phone)获取验证码短信"
+            titleLabel.text = "请使用安全手机\(CacheManager.shared.user.info.phone)获取验证码短信".l10n
         }
         else{
-            titleLabel.text = "请使用安全邮箱\(CacheManager.shared.user.info.email)获取验证码短信"
+            titleLabel.text = "请使用安全邮箱\(CacheManager.shared.user.info.email)获取验证码短信".l10n
         }
     }
     override func setupLayout(){
@@ -70,13 +70,13 @@ extension RevokeCodeVC{
                 YLprogressHUD.hidden()
             }
             else{
-                YLprogressHUD.showAutoHiden("请求失败")
+                YLprogressHUD.showAutoHiden("请求失败".l10n)
             }
         }
     }
     @objc func loginAction(){
         guard let code = codeView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入验证码")
+            YLprogressHUD.showAutoHiden("请输入验证码".l10n)
             return
         }
         
@@ -90,7 +90,7 @@ extension RevokeCodeVC{
                 }
             }
             else{
-                YLprogressHUD.showAutoHiden("请求失败")
+                YLprogressHUD.showAutoHiden("请求失败".l10n)
             }
             
         }
index 4bc55fc..8482459 100644 (file)
@@ -18,7 +18,7 @@ class RevokeVC:BaseVC{
         
     }
     override func setupViews() {
-        self.navBar.title = "撤回同意"
+        self.navBar.title = "撤回同意".l10n
         view.addSubview(bgView)
         bgView.addSubviews([label,btn])
         
@@ -26,7 +26,7 @@ class RevokeVC:BaseVC{
             v.font = .regular(14)
             v.textColor = .hexString("#666666")
             v.numberOfLines = 0
-            let text = "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!"
+            let text = "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!".l10n
             
             let attributedString = NSMutableAttributedString(string: text)
             let paragraphStyle = NSMutableParagraphStyle()
@@ -34,7 +34,7 @@ class RevokeVC:BaseVC{
             attributedString.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length))
             v.attributedText = attributedString
         }
-        btn.set(title: "确认撤回", style: .theme4,target: self, action: #selector(btnAction))
+        btn.set(title: "确认撤回".l10n, style: .theme4,target: self, action: #selector(btnAction))
     }
     override func setupLayout() {
         bgView.snp.makeConstraints { make in
index fa153f1..b9105a8 100644 (file)
@@ -18,17 +18,17 @@ public enum MineCellType: Int {
     var title:String{
         switch self {
         case .instructions:
-            return "电子说明书"
+            return "电子说明书".l10n
         case .update:
-            return "固件升级"
+            return "固件升级".l10n
         case .language:
-            return "语言设置"
+            return "语言设置".l10n
         case .more:
-            return "更多设置"
+            return "更多设置".l10n
         case .feeback:
-            return "帮助与反馈"
+            return "帮助与反馈".l10n
         case .about:
-            return "关于"
+            return "关于".l10n
         }
     }
     var icon:String{
index be69b2d..3f4b165 100644 (file)
@@ -99,7 +99,7 @@ class MineUserInfoView: BaseView {
             guard let self = self else {return}
             titleLabel.text = CacheManager.shared.user.info.userName
             icon.kf.setImage(with:CacheManager.shared.user.info.avatar.yc.asUrl )
-            deviceLabel.text = "共\(DeviceVM.shared.dataList.count)个智能设备"
+            deviceLabel.text = "\(DeviceVM.shared.dataList.count)" + "个智能设备".l10n
         }
 
 
@@ -153,7 +153,7 @@ class CloudStorageView: BaseView {
             v.textColor = .rgb(0x666666)
             v.font = .regular(14)
             v.textAlignment = .left
-            v.text = "云储存空间"
+            v.text = "云储存空间".l10n
         }
         progressView.do { v in
             v.yc.setCornerRadius(2)
index 2da7d41..8e73916 100644 (file)
@@ -7,7 +7,7 @@
 import UIKit
 class MineVC: BaseVC{
     let tableView = UITableView(frame: .zero, style: .plain)
-    let list:[MineCellType] = [.instructions,.update,.more,.feeback,.about]
+    let list:[MineCellType] = [.instructions,.update,.language,.more,.feeback,.about]
     let headerView =  MineHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWid, height: 327))
     
     override func viewDidLoad() {
index f139dde..4965f5c 100644 (file)
@@ -28,16 +28,16 @@ class AppUpdateVM:BaseVM{
                     }
                 }
                 else{
-                    YLprogressHUD.showAutoHiden("已经是最新版本")
+                    YLprogressHUD.showAutoHiden("已经是最新版本".l10n)
                 }
             }
             else{
-                YLprogressHUD.showAutoHiden("请求失败")
+                YLprogressHUD.showAutoHiden("请求失败".l10n)
             }
         }
     }
     func optionUpdate(){
-        CustomAlert.showWith(title: nil, messgage: "检测到新版本,是否前往更新") {
+        CustomAlert.showWith(title: nil, messgage: "检测到新版本,是否前往更新".l10n) {
             
         } okCallback: {
             guard let url = "https://www.baidu.com".yc.asUrl else{
@@ -48,7 +48,7 @@ class AppUpdateVM:BaseVM{
         
     }
     func forceUpdate(){
-        CustomAlert.showWith(title: nil, messgage: "检测到新版本", ok: "前往更新",cancelCallback: nil) {
+        CustomAlert.showWith(title: nil, messgage: "检测到新版本".l10n, ok: "前往更新".l10n,cancelCallback: nil) {
             guard let url = "https://www.baidu.com".yc.asUrl else{
                 return
             }
index 28bee8d..84e5b0b 100644 (file)
@@ -43,16 +43,16 @@ class BleUpdateVM:BaseVM{
                     }
                 }
                 else{
-                    YLprogressHUD.showAutoHiden("已是最新版本")
+                    YLprogressHUD.showAutoHiden("已是最新版本".l10n)
                 }
             }
             else{
-                YLprogressHUD.showAutoHiden("请求失败")
+                YLprogressHUD.showAutoHiden("请求失败".l10n)
             }
         }
     }
     func optionUpdate(){
-        CustomAlert.showWith(title: nil, messgage: "检测到新版本,是否开始更新?") {
+        CustomAlert.showWith(title: nil, messgage: "检测到新版本,是否开始更新?".l10n) {
             
         } okCallback: {
             guard let url = "https://www.baidu.com".yc.asUrl else{
@@ -63,7 +63,7 @@ class BleUpdateVM:BaseVM{
         
     }
     func forceUpdate(){
-        CustomAlert.showWith(title: nil, messgage: "检测到新版本", ok: "开始更新",cancelCallback: nil) {
+        CustomAlert.showWith(title: nil, messgage: "检测到新版本".l10n, ok: "开始更新".l10n,cancelCallback: nil) {
             guard let url = "https://www.baidu.com".yc.asUrl else{
                 return
             }
index cf18ff4..f0bd3dc 100644 (file)
@@ -18,16 +18,16 @@ class UpdateVC:BaseVC{
     }
     override func setupViews() {
         view.addSubviews([icon,versionLabel,btn])
-        self.navBar.title = "固件升级"
+        self.navBar.title = "固件升级".l10n
         versionLabel.do { v in
-            v.text = "当前版本\n"
+            v.text = "当前版本".l10n
             v.textAlignment = .center
             v.font = .regular(16)
             v.textColor = .hexString("#232323")
             v.numberOfLines = 0
         }
         btn.do { v in
-            v.setTitle("检查更新", for: .normal)
+            v.setTitle("检查更新".l10n, for: .normal)
             v.titleLabel?.font = .bold(14)
             v.setTitleColor(.color(.theme), for: .normal)
             v.addTarget(self, action: #selector(tapAction), for: .touchUpInside)
@@ -57,20 +57,20 @@ class UpdateVC:BaseVC{
         DeviceVM.getVersion {[weak self] version in
             guard let self = self else{return}
             let version = version ?? " --"
-            let allText = "当前版本\n" + "V\(version)"
+            let allText = "当前版本".l10n + "\nV\(version)"
             let attributedString = NSMutableAttributedString(string: allText)
             let paragraphStyle = NSMutableParagraphStyle()
             paragraphStyle.lineSpacing = 7
             attributedString.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length))
-            attributedString.addAttribute(.font, value: UIFont.bold(16), range: NSRange(location: 0, length: attributedString.length))
-            attributedString.addAttribute(.font, value: UIFont.bold(14), range: NSRange(location: 4, length: version.count + 1))
+//            attributedString.addAttribute(.font, value: UIFont.bold(16), range: NSRange(location: 0, length: attributedString.length))
+//            attributedString.addAttribute(.font, value: UIFont.bold(14), range: NSRange(location: 4, length: version.count + 2))
             versionLabel.attributedText = attributedString
             versionLabel.textAlignment = .center
         }
     }
     @objc func tapAction(){
         if !BleManager.shared.isConnetd{
-            YLprogressHUD.showAutoHiden("请先连接设备")
+            YLprogressHUD.showAutoHiden("请先连接设备".l10n)
             return
         }
         BleUpdateVM.shared.checkedUpdate()
index 535849a..cd3ed70 100644 (file)
@@ -16,7 +16,7 @@ class AreaVC: BaseVC{
         // Do any additional setup after loading the view.
     }
     override func setupViews() {
-        self.navBar.title = "性别"
+        self.navBar.title = "性别".l10n
         tableView.do { v in
             v.backgroundColor = .rgb(0xF7F7F7)
             v.delegate = self
index ca26da4..4f6866e 100644 (file)
@@ -32,45 +32,45 @@ public enum CustomCellType: Int {
     var title:String{
         switch self {
         case .avatar:
-            return "头像"
+            return "头像".l10n
         case .nickName:
-            return "昵称"
+            return "昵称".l10n
         case .gender:
-            return "性别"
+            return "性别".l10n
         case .area:
-            return "国家与地区"
+            return "国家与地区".l10n
             
         case .account:
-            return "账号密码"
+            return "账号密码".l10n
         case .phone:
-            return "安全手机"
+            return "安全手机".l10n
         case .email:
-            return "安全邮箱"
+            return "安全邮箱".l10n
         case .thirdLogin:
-            return "第三方账号"
+            return "第三方账号".l10n
         case .loginManager:
-            return "登录设备管理"
+            return "登录设备管理".l10n
             
         case .update:
-            return "检查更新"
+            return "检查更新".l10n
         case .userAgreement:
-            return "用户协议"
+            return "用户协议".l10n
         case .privacyPolicy:
-            return "隐私政策"
+            return "隐私政策".l10n
         case .personInfoList:
-            return "个人信息手机清单"
+            return "个人信息手机清单".l10n
         case .permissionList:
-            return "系统权限清单"
+            return "系统权限清单".l10n
         case .revoke:
-            return "撤回同意"
+            return "撤回同意".l10n
            
         case .notice:
-            return "系统消息通知"
+            return "系统消息通知".l10n
         case .system:
-            return "系统权限管理"
+            return "系统权限管理".l10n
             
         case .deregister:
-            return "注销账号"
+            return "注销账号".l10n
         }
     }
     
index 2cff9f3..279579e 100644 (file)
@@ -16,7 +16,7 @@ class GenderVC: BaseVC{
         // Do any additional setup after loading the view.
     }
     override func setupViews() {
-        self.navBar.title = "性别"
+        self.navBar.title = "性别".l10n
         tableView.do { v in
             v.backgroundColor = .rgb(0xF7F7F7)
             v.delegate = self
index ca597c6..9381df3 100644 (file)
@@ -17,14 +17,14 @@ class NickNameVC:BaseVC{
         super.viewDidLoad()
     }
     override func setupViews(){
-        self.navBar.title = "昵称"
+        self.navBar.title = "昵称".l10n
         view.backgroundColor = .color(.bgColor)
 
         phoneView.do { v in
-            v.textField.placeholder = "请输入昵称"
+            v.textField.placeholder = "请输入昵称".l10n
             v.textField.keyboardType = .default
         }
-        loginBtn.set(title: "确定",style: .theme1, target: self, action: #selector(loginAction))
+        loginBtn.set(title: "确定".l10n,style: .theme1, target: self, action: #selector(loginAction))
         view.addSubviews([phoneView,loginBtn])
         
     }
@@ -48,10 +48,25 @@ class NickNameVC:BaseVC{
 extension NickNameVC{
     @objc func loginAction(){
         guard let name = phoneView.textField.value else{
-            YLprogressHUD.showAutoHiden("请输入昵称")
+            YLprogressHUD.showAutoHiden("请输入昵称".l10n)
             return
         }
-        callBack?(name)
-        App.shared.popPage()
+        
+        YLprogressHUD.showLoading()
+        var params:[String:Any] = [:]
+        params["username"] = name
+        HttpClient.request(.updateUserInfo(param: params)) {[weak self] (model:ResponseBaseModel,res) in
+            guard let self = self else {return}
+            if model.isSuccess{
+                YLprogressHUD.hidden()
+                CacheManager.shared.user.info.userName = name
+                //        callBack?(name)
+                App.shared.popPage()
+            }
+            else{
+                YLprogressHUD.showAutoHiden(model.msg)
+            }
+        }
+
     }
 }
index 934fcff..1f399f5 100644 (file)
@@ -16,7 +16,7 @@ class UserInfoVC: BaseVC{
         // Do any additional setup after loading the view.
     }
     override func setupViews() {
-        self.navBar.title = "个人资料"
+        self.navBar.title = "个人资料".l10n
         tableView.do { v in
             v.backgroundColor = .color(.bgColor)
             v.delegate = self
@@ -155,7 +155,7 @@ extension UserInfoVC{
                 self?.refreshUI()
             }
             else{
-                YLprogressHUD.showAutoHiden("请求失败")
+                YLprogressHUD.showAutoHiden("请求失败".l10n)
             }
         }
     }
index d931a11..e8849d3 100644 (file)
@@ -15,7 +15,7 @@ class UserManagerVC:BaseVC{
         
     }
     override func setupViews() {
-        self.navBar.title = "用户管理"
+        self.navBar.title = "用户管理".l10n
     }
     override func setupLayout() {
         
index 610ca00..01861ba 100644 (file)
@@ -23,7 +23,7 @@ class CustomEqVC:BaseVC{
     }
     
     override func setupViews() {
-        self.navBar.title = "自定义音效"
+        self.navBar.title = "自定义音效".l10n
         navBar.backgroundColor = .clear
         view.addSubview(bgView)
         bgView.addSubviews([sliderBgView])
@@ -38,7 +38,7 @@ class CustomEqVC:BaseVC{
             v.transform = CGAffineTransform(rotationAngle: -CGFloat.pi / 2)
         }
         titleLabel.do { v in
-            v.text = "音效风格"
+            v.text = "音效风格".l10n
             v.textColor = .hexString("#121212")
             v.textAlignment = .left
             v.font = .regular(14)
index 6454255..3139a8c 100644 (file)
@@ -24,7 +24,7 @@ class FindVC:BaseVC{
     }
     
     override func setupViews() {
-        self.navBar.title = "查找耳机"
+        self.navBar.title = "查找耳机".l10n
         navBar.backgroundColor = .clear
         view.backgroundColor = .color(.bgColor)
         view.addSubviews([titleLabel,desLabel,leftRadar,rightRadar,leftBtn,rightBtn])
@@ -44,19 +44,19 @@ class FindVC:BaseVC{
             
         }
         desLabel.do { v in
-            v.text = "耳机在附近,可通过响铃进行查找。"
+            v.text = "耳机在附近,可通过响铃进行查找".l10n
             v.font = .regular(14)
             v.textColor = .hexString("#666666")
             
         }
         leftBtn.do { v in
-            v.titleLabel.text = "左耳机响铃"
+            v.titleLabel.text = "左耳机响铃".l10n
             v.valueLabel.text = "L"
             v.selected = false
             v.yc.addTap(target: self, action: #selector(leftAction))
         }
         rightBtn.do { v in
-            v.titleLabel.text = "右耳机响铃"
+            v.titleLabel.text = "右耳机响铃".l10n
             v.valueLabel.text = "R"
             v.selected = false
             v.yc.addTap(target: self, action: #selector(rightAction))
@@ -100,7 +100,7 @@ class FindVC:BaseVC{
     @objc func leftAction(){
         leftBtn.selected = !leftBtn.selected
         if leftBtn.selected {
-            CustomAlert.showWith(title: "音量警告", messgage: "为保护听力,请勿在佩戴耳机时使用此功能。", cancel: "取消", cancelCallback: {[weak self] in
+            CustomAlert.showWith(title: "音量警告".l10n, messgage: "为保护听力,请勿在佩戴耳机时使用此功能。".l10n, cancel: "取消".l10n, cancelCallback: {[weak self] in
                 self?.leftBtn.selected = false
             } ,okCallback: { [weak self] in
                 self?.leftRadar.start = true
@@ -115,7 +115,7 @@ class FindVC:BaseVC{
     @objc func rightAction(){
         rightBtn.selected = !rightBtn.selected
         if rightBtn.selected {
-            CustomAlert.showWith(title: "音量警告", messgage: "为保护听力,请勿在佩戴耳机时使用此功能。", cancel: "取消", cancelCallback: {[weak self] in
+            CustomAlert.showWith(title: "音量警告".l10n, messgage: "为保护听力,请勿在佩戴耳机时使用此功能。".l10n, cancel: "取消".l10n, cancelCallback: {[weak self] in
                 self?.rightBtn.selected = false
             } ,okCallback: { [weak self] in
                 self?.rightRadar.start = true
index 7874e36..53a47ea 100644 (file)
@@ -13,11 +13,11 @@ enum ModeContolType:Int{
     var title:String{
         switch self {
         case .anc:
-            return "降噪"
+            return "降噪".l10n
         case .environment:
-            return "环境感知"
+            return "环境感知".l10n
         case .free:
-            return "自由通话"
+            return "自由通话".l10n
         }
     }
     var img:String{
@@ -46,7 +46,7 @@ class ModeControView: BaseView {
         titleLabel.do { (v) in
             v.textColor = .rgb(0x121212)
             v.font = .bold(14)
-            v.text = "环境声音控制"
+            v.text = "环境声音控制".l10n
         }
         
         let w = 80
index caae25b..1b94ead 100644 (file)
@@ -19,17 +19,17 @@ enum ModeEffectsType:Int{
     var title:String{
         switch self {
         case .normal:
-            return "正常"
+            return "正常".l10n
         case .fashion:
-            return "流行"
+            return "流行".l10n
         case .classic:
-            return "经典"
+            return "经典".l10n
         case .rock:
-            return "摇滚"
+            return "摇滚".l10n
         case .jazz:
-            return "爵士"
+            return "爵士".l10n
         case .custom:
-            return "自定义"
+            return "自定义".l10n
         }
     }
     var img:String{
@@ -98,7 +98,7 @@ class ModeEffectsView: BaseView {
         titleLabel.do { (v) in
             v.textColor = .rgb(0x121212)
             v.font = .bold(14)
-            v.text = "EQ调音"
+            v.text = "EQ调音".l10n
         }
         
         let s = 11.0
index 0bd71ed..2bec8f4 100644 (file)
@@ -18,7 +18,7 @@ class ModeFindView: BaseView {
         
         icon.image = UIImage(named: "find_icon")
         titleLabel.do { v in
-            v.text = "查找耳机"
+            v.text = "查找耳机".l10n
             v.font = .bold(16)
             v.textColor = .hexString("#121212")
             
index f796259..0914fe5 100644 (file)
@@ -42,7 +42,7 @@ class SleepCell: BaseCollectionViewCell {
         
         titleLab.textColor = .white
         titleLab.font = .medium(16)
-        titleLab.text = "微光"
+        titleLab.text = "微光".l10n
         
         imgV.do { v in
             v.contentMode = .scaleAspectFill
index 4504830..d3c6722 100644 (file)
@@ -34,7 +34,7 @@ class SleepVC: BaseVC {
         view.addSubview(segmentedView)
         view.addSubview(listContainerView)
         
-        navBar.title = "白噪音"
+        navBar.title = "白噪音".l10n
         view.backgroundColor = .color(.bgColor)
         segmentedView.do { (v) in
             segmentedDataSource.titleNormalColor = .hexString("#999999")
index 35448b4..05dc4cc 100644 (file)
@@ -21,7 +21,7 @@ class CustomAlert {
 //        App.shared.topVC()?.present(vc, animated: true)
 //    }
    
-    static func showWith(title:String?,messgage:String,cancel:String = "取消",ok:String = "确定",cancelCallback: (()->Void)?,okCallback: (()->Void)?){
+    static func showWith(title:String?,messgage:String,cancel:String = "取消".l10n,ok:String = "确定".l10n,cancelCallback: (()->Void)?,okCallback: (()->Void)?){
         let vc = UIAlertController(title: title, message: messgage, preferredStyle: .alert)
         if cancelCallback != nil {
             let action0 = UIAlertAction(title: cancel, style: .cancel) { action in
index 20b3a8f..76d5c69 100644 (file)
@@ -30,7 +30,7 @@ class SendToolBar:UIView{
         
         textField.do { v in
             v.backgroundColor = .clear
-            v.placeholder = "请输入..."
+            v.placeholder = "请输入...".l10n
             v.returnKeyType = .done
             v.delegate = self
         }
index 79121ae..df7b2b3 100644 (file)
@@ -27,7 +27,7 @@ class YLprogressHUD {
         }
     }
     static func showSuccess(finished: @escaping () -> Void) {
-        showAutoHiden( "请求成功!")
+        showAutoHiden( "请求成功!".l10n)
         DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
             finished()
         }
@@ -35,12 +35,12 @@ class YLprogressHUD {
     
     /// 显示"加载中..." HUD
     static func showLoading() {
-        showWithStatus(status: "加载中...")
+        showWithStatus(status: "加载中...".l10n)
     }
     
     /// 显示"上传中..." HUD
     static func showUpLoading() {
-        showWithStatus(status: "上传中...")
+        showWithStatus(status: "上传中...".l10n)
     }
     
     /// 隐藏 HUD
index 8d982fd..63139d0 100644 (file)
@@ -15,11 +15,11 @@ enum ConnectPopState {
     var text:String{
         switch self {
         case .connecting:
-            return "连接中"
+            return "连接中".l10n
         case .connected:
-            return "连接成功"
+            return "连接成功".l10n
         case .failure:
-            return "连接失败"
+            return "连接失败".l10n
         }
     }
 }
index c2a2dc9..1ef12d3 100644 (file)
@@ -36,7 +36,7 @@ class LanguagePickerTitle: BaseView {
             v.textColor = .rgb(0x333333)
             v.font = .semiBold(16)
             v.textAlignment = .center
-            v.text = "请选择语言"
+            v.text = "请选择语言".l10n
         }
 
         bottonView.do { v in
index a89d4d5..7e02c2e 100644 (file)
@@ -19,7 +19,7 @@ class LanguagePickerView: BasePresentView {
     
     
     var didSelected: ((Int,AiSupportLanguage)->Void)?
-    private var title:String = "请选择语言"
+    private var title:String = "请选择语言".l10n
     
     init(languages:[AiSupportLanguage],isLeft:Bool,left:AiSupportLanguage,right:AiSupportLanguage) {
         list = languages
index 7eb87a3..9b661f1 100644 (file)
@@ -106,7 +106,7 @@ class LanguageSelectItem: BaseView {
 //                v.backgroundColor = .green
                 v.textColor = .hexString("#0092E1")
                 v.font = .medium(14)
-                v.text = "中文"
+                v.text = "中文".l10n
                 v.textAlignment = .center
             }
         }
index fe45a9c..72e7aff 100644 (file)
@@ -58,7 +58,7 @@ class PopCloudView: BasePresentView2 {
             v.textColor = .rgb(0x666666)
             v.font = .regular(14)
             v.textAlignment = .left
-            v.text = "云储存空间"
+            v.text = "云储存空间".l10n
         }
         progressView.do { v in
             v.yc.setCornerRadius(2)
@@ -120,7 +120,7 @@ class PopCloudView: BasePresentView2 {
             v.textColor = .rgb(0x121212)
             v.font = .bold(20)
             v.textAlignment = .center
-            v.text = "已成功更新到云储存空间"
+            v.text = "已成功更新到云储存空间".l10n
         }
         
     }
index 85577e2..f5a8219 100644 (file)
@@ -32,17 +32,17 @@ class PopMenu: BasePresentView2 {
         
         fontItem.do { v in
             v.icon.image = UIImage(named: "record_detail_font")
-            v.label.text = "字号"
+            v.label.text = "字号".l10n
             v.yc.addTap(target: self, action: #selector(fontAction))
         }
         sharedItem.do { v in
             v.icon.image = UIImage(named: "record_detail_share")
-            v.label.text = "分享"
+            v.label.text = "分享".l10n
             v.yc.addTap(target: self, action: #selector(sharedAction))
         }
         deleteItem.do { v in
             v.icon.image = UIImage(named: "record_detail_delete")
-            v.label.text = "删除"
+            v.label.text = "删除".l10n
             v.yc.addTap(target: self, action: #selector(deleteAction))
         }
     }
index d1e6aca..cd53588 100644 (file)
@@ -150,7 +150,7 @@ class PopPlayView: BasePresentView2 {
             v.textColor = .rgb(0x121212)
             v.font = .bold(20)
             v.textAlignment = .center
-            v.text = "播放录音"
+            v.text = "播放录音".l10n
         }
       
     }
index f55a2d4..a2ee8b0 100644 (file)
@@ -73,7 +73,7 @@ class PopTextField: BasePresentView2 {
             v.textColor = .rgb(0x121212)
             v.font = .bold(20)
             v.textAlignment = .center
-            v.text = "保存录音"
+            v.text = "保存录音".l10n
         }
         textFiledBg.do { v in
             v.yc.setBorder(width: 2, color: .hexString("#0092E1"), radius: 10)
@@ -81,13 +81,13 @@ class PopTextField: BasePresentView2 {
         }
         textFiled.do { v in
             v.text = Date().format(.full3)
-            v.placeholder = "请输入录音名字"
+            v.placeholder = "请输入录音名字".l10n
             v.font = .bold(16)
             v.textColor = .hexString("#121212")
 //            v.becomeFirstResponder()
         }
         cancelButton.do { (v) in
-            v.setTitle("取消", for: .normal)
+            v.setTitle("取消".l10n, for: .normal)
             v.titleLabel?.font = .bold(16)
             v.setTitleColor(.hexString("#121212"), for: .normal)
             v.backgroundColor = .hexString("#F7F7F7")
@@ -95,7 +95,7 @@ class PopTextField: BasePresentView2 {
             v.yc.setCornerRadius(12)
         }
         okButton.do { (v) in
-            v.setTitle("确定", for: .normal)
+            v.setTitle("确定".l10n, for: .normal)
             v.titleLabel?.font = .bold(16)
             v.setTitleColor(.white, for: .normal)
             v.backgroundColor =  UIColor.color(.theme)
index bfd329c..94df6b5 100644 (file)
@@ -39,19 +39,19 @@ class RecordPopView: BasePresentView2 {
         contentView.addSubviews([renameItem,sharedItem,deleteItem,selectedItem])
         
         renameItem.do { v in
-            v.label.text = "重命名"
+            v.label.text = "重命名".l10n
             v.yc.addTap(target: self, action: #selector(renameAction))
         }
         sharedItem.do { v in
-            v.label.text = "分享"
+            v.label.text = "分享".l10n
             v.yc.addTap(target: self, action: #selector(sharedAction))
         }
         deleteItem.do { v in
-            v.label.text = "删除"
+            v.label.text = "删除".l10n
             v.yc.addTap(target: self, action: #selector(deleteAction))
         }
         selectedItem.do { v in
-            v.label.text = "多选"
+            v.label.text = "多选".l10n
             v.yc.addTap(target: self, action: #selector(selectedAction))
         }
     }
index dd237b2..a983cf6 100644 (file)
@@ -16,11 +16,11 @@ enum RecordTipsType:Int{
     var title:String{
         switch self {
         case .dialog:
-            return "对话模式使用介绍"
+            return "对话模式使用介绍".l10n
         case .chinese2english:
-            return "中英互译模式使用介绍"
+            return "中英互译模式使用介绍".l10n
         case .tongchuan:
-            return "同传听译模式使用介绍"
+            return "同传听译模式使用介绍".l10n
         }
     }
     var icon:String{
@@ -36,21 +36,21 @@ enum RecordTipsType:Int{
     var des1:String{
         switch self {
         case .dialog:
-            return "一方手持手机,一方戴上耳机,对手机发言时,耳机播放译文,对耳机发言时,手机播放译文"
+            return "一方手持手机,一方戴上耳机,对手机发言时,耳机播放译文,对耳机发言时,手机播放译文".l10n
         case .chinese2english:
-            return "两人各佩戴一只耳机,选择源语言语种, 双方耳机中播放目标语言"
+            return "两人各佩戴一只耳机,选择源语言语种, 双方耳机中播放目标语言".l10n
         case .tongchuan:
-            return "手机靠近音源收音,佩戴耳机收听译文"
+            return "手机靠近音源收音,佩戴耳机收听译文".l10n
         }
     }
     var des2:String{
         switch self {
         case .dialog:
-            return "- 情景示例 -\n张张靠近手机讲中文,对方耳机播放英语"
+            return "- 情景示例 -\n张张靠近手机讲中文,对方耳机播放英语".l10n
         case .chinese2english:
-            return "- 情景示例 -\n张张戴一只耳机讲中文,双方耳机播放英文翻译 Lucy切换为英语发言后,双方耳机中播报中文翻译"
+            return "- 情景示例 -\n张张戴一只耳机讲中文,双方耳机播放英文翻译 Lucy切换为英语发言后,双方耳机中播报中文翻译".l10n
         case .tongchuan:
-            return "- 情景示例 -\nLisa对着手机讲英语,小徐耳机中播放中文"
+            return "- 情景示例 -\nLisa对着手机讲英语,小徐耳机中播放中文".l10n
         }
     }
 }
@@ -163,7 +163,7 @@ class RecordTipsView: BasePresentView {
         }
         actionbtn.do { v in
             v.backgroundColor = .hexString("#0092E1")
-            v.setTitle("开始体验", for: .normal)
+            v.setTitle("开始体验".l10n, for: .normal)
             v.titleLabel?.font = .regular(14)
             v.yc.setCornerRadius(12)
             v.setTitleColor(.white, for: .normal)
@@ -198,7 +198,7 @@ class RecordTipsView: BasePresentView {
                 v.textColor = .hexString("##999999")
                 v.font = .regular(12)
                 v.textAlignment = .left
-                v.text = "下次不再提示"
+                v.text = "下次不再提示".l10n
             }
 //            backgroundColor = .red
             addSubviews([agreeBtn,agreeTitle])
@@ -36,25 +36,25 @@ enum AiSupportLanguage:String{
     var title:String{
         switch self {
         case .chinse:
-            return "中文"
+            return "中文".l10n
         case .english:
-            return "英文"
+            return "英文".l10n
         case .japanese:
-            return "日文"
+            return "日文".l10n
         case .korean:
-            return "韩文"
+            return "韩文".l10n
         case .french:
-            return "法语"
+            return "法文".l10n
         case .spanish:
-            return "西班牙文"
+            return "西班牙文".l10n
         case .portuguese:
-            return "葡萄牙文"
+            return "葡萄牙文".l10n
         case .indonesian:
-            return "印度尼西亚文"
+            return "印度尼西亚文".l10n
         case .russian:
-            return "俄文"
+            return "俄文".l10n
         case .malay:
-            return "马来文"
+            return "马来文".l10n
         }
     }
     var value:String{
diff --git a/ShenYin/ShenYin/lan/LanConfig.swift b/ShenYin/ShenYin/lan/LanConfig.swift
new file mode 100644 (file)
index 0000000..a6af4b4
--- /dev/null
@@ -0,0 +1,142 @@
+//
+//  LangConfig.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/10/15.
+//
+
+enum AppSupportLanguage{
+    case chinse
+    case Traditional_Chinese
+    case english
+    case japanese
+    case korean
+    case french
+    case spanish
+    case vietnam
+    case thai
+    case indonesian
+    case russian
+    case malay
+    case Filipino
+    case Singlish
+    
+    static var all:[AppSupportLanguage]{
+        return [.chinse,.Traditional_Chinese,.english,.japanese,.korean,.spanish,.vietnam,.thai,.malay,.Filipino,.indonesian,.french,.spanish,.russian,]
+    }
+    var title:String{
+        switch self {
+        case .chinse:
+            return "简体中文"
+        case .Traditional_Chinese:
+            return "繁體中文"
+        case .english:
+            return "English"
+        case .japanese:
+            return "日本語"
+        case .korean:
+            return "한국어"
+        case .french:
+            return "français"
+        case .spanish:
+            return "español"
+        case .vietnam:
+            return "Việt Nam"
+        case .thai:
+            return "ภาษาไทย"
+        case .malay:
+            return "Bahasa Malaysia"
+        case .Filipino:
+            return "Filipino"
+        case .indonesian:
+            return "Bahasa Indonesia"
+        case .Singlish:
+            return "Singlish"
+        case .russian:
+            return "русский язык"
+        }
+    }
+    var lanCode:String{
+        switch self {
+        case .chinse:
+            return "zh-CN"
+        case .Traditional_Chinese:
+            return "zh-TW"
+        case .english:
+            return "en-US"
+        case .japanese:
+            return "ja"
+        case .korean:
+            return "ko"
+        case .french:
+            return "fr"
+        case .spanish:
+            return "es"
+        case .vietnam:
+            return "vi"
+        case .thai:
+            return "th"
+        case .malay:
+            return "ms"
+        case .Filipino:
+            return "tl"
+        case .indonesian:
+            return "id"
+        case .Singlish:
+            return "en"
+        case .russian:
+            return "ru"
+        }
+    }
+    var map:[String:String]{
+        switch self {
+        case .chinse:
+            return chineseMap
+        case .english:
+            return englishMap
+        case .japanese:
+            return japaneseMap
+        case .korean:
+            return koreanMap
+        case .french:
+            return frenchMap
+        case .indonesian:
+            return indonesianMap
+        case .russian:
+            return russianMap
+        case .malay:
+            return malayMap
+            
+        case .spanish:
+            return spanishMap
+        case .thai:
+            return thaiMap
+        case .Filipino:
+            return englishMap
+        case .Singlish:
+            return englishMap
+        case .Traditional_Chinese:
+            return traditionalChineseMap
+        case .vietnam:
+            return VietnamMap
+        }
+    }
+
+}
+
+
+extension String{
+    var l10n:String{
+        if DCConfig.appLanguage == .chinse{
+            return self
+        }
+        if let value = DCConfig.appLanguage.map[self] {
+            return value
+        }
+        else{
+            return self
+        }
+    }
+}
+
+
diff --git a/ShenYin/ShenYin/lan/TraditionalChinese.swift b/ShenYin/ShenYin/lan/TraditionalChinese.swift
new file mode 100644 (file)
index 0000000..76132fc
--- /dev/null
@@ -0,0 +1,230 @@
+//
+//  chinese.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/11/10.
+//
+
+
+
+
+let traditionalChineseMap:[String:String] =
+[
+    "智能" : "智能",
+    "模式" : "模式",
+    "睡眠" : "睡眠",
+    "客服" : "客服",
+    "我的" : "我的",
+    "设备":"設備",
+    "已连接" : "已連接",
+    "未连接" : "未連接",
+    
+    "现场录音" : "現場錄音",
+    "随时随地,一键开录" : "隨時隨地,一鍵開錄",
+    "通话录音" : "通話錄音",
+    "一键录音,翻译转写" : "一鍵錄音,翻譯轉寫",
+    "中英互译" : "中英互譯",
+    "实时对话,即时互译" : "即時對話,即時互譯",
+    "同传听译" : "同傳聽譯",
+    "一机一耳,面对面畅聊" : "一機一耳,面對面暢聊",
+    "对话翻译" : "對話翻譯",
+    "会议讲座,同步翻译" : "會議講座,同步翻譯",
+    "文本翻译" : "文本翻譯",
+    "即打即译,多语支持":"即打即譯,多語支持",
+    "历史记录" : "歷史記錄",
+    "所有记录,一目了然" : "所有記錄,一目瞭然",
+    "智能对话" : "智能對話",
+    "伙伴,随叫随到" : "伙伴,隨叫隨到",
+    "切换角色" : "切換角色",
+    "按住说话" : "按住說話",
+    "同传听译模式使用介绍":"同傳聽譯模式使用介紹",
+    "对话模式使用介绍" : "對話模式使用介紹",
+    "中英互译模式使用介绍" : "中英互譯模式使用介紹",
+    "一方手持手机,一方戴上耳机,对手机发言时,耳机播放译文,对耳机发言时,手机播放译文" : "一方手持手機,一方戴上耳機,對手機發言時,耳機播放譯文,對耳機發言時,手機播放譯文",
+    "两人各佩戴一只耳机,选择源语言语种, 双方耳机中播放目标语言" : "兩人各佩戴一隻耳機,選擇源語言語種,雙方耳機中播放目標語言",
+    "手机靠近音源收音,佩戴耳机收听译文" : "手機靠近音源收音,佩戴耳機收聽譯文",
+    "- 情景示例 -\n张张靠近手机讲中文,对方耳机播放英语" : "- 情景示例 -\n張張靠近手機講中文,對方耳機播放英語",
+    "- 情景示例 -\n张张戴一只耳机讲中文,双方耳机播放英文翻译 Lucy切换为英语发言后,双方耳机中播报中文翻译" : "- 情景示例 -\n張張戴一隻耳機講中文,雙方耳機播放英文翻譯 Lucy切換為英語發言後,雙方耳機中播報中文翻譯",
+    "- 情景示例 -\nLisa对着手机讲英语,小徐耳机中播放中文" : "- 情景示例 -\nLisa對着手機講英語,小徐耳機中播放中文",
+    "开始体验" : "開始體驗",
+    "下次不再提示":"下次不再提示",
+    "当前正在录音,确定放弃当前录音吗":"當前正在錄音,確定放棄當前錄音嗎",
+    "云同步":"雲同步",
+    "是否上传运存储空间备份":"是否上傳雲存儲空間備份",
+    
+    "请选择语言":"請選擇語言",
+    "中文" : "中文",
+    "英文" : "英文",
+    "日文" : "日文",
+    "韩文" : "韓文",
+    "法文" : "法文",
+    "西班牙文" : "西班牙文",
+    "葡萄牙文" : "葡萄牙文",
+    "印度尼西亚文" : "印度尼西亞文",
+    "俄文" : "俄文",
+    "马来文" : "馬來文",
+    
+    "保存录音" : "保存錄音",
+    "原文" : "原文",
+    "译文" : "譯文",
+    "摘要" : "摘要",
+    "翻译" : "翻譯",
+    "重命名" : "重新命名",
+    "播放录音" : "播放錄音",
+    "更多" : "更多",
+    "字号" : "字號",
+    "分享" : "分享",
+    "调整字号" : "調整字號",
+    "小" : "小",
+    "标准" : "標準",
+    "大" : "大",
+    "设置" : "設置",
+    "左耳" : "左耳",
+    "右耳" : "右耳",
+    "耳机" : "耳機",
+    "手机" : "手機",
+    "此处将显示原文" : "此處將顯示原文",
+    "此处将显示译文" : "此處將顯示譯文",
+    "请输入..." : "請輸入...",
+    "筛选录音" : "篩選錄音",
+    "全部录音":"全部錄音",
+    "收藏录音" : "收藏錄音",
+    "多选" : "多選",
+    "导出" : "導出",
+    "您要删除这些录音吗?" : "您要刪除這些錄音嗎?",
+    "删除后,这些记录将无法恢复。" : "刪除後,這些記錄將無法恢復。",
+    "删除后,此记录将无法恢复":"刪除後,此記錄將無法恢復",
+    "您要删除这条录音吗?":"您要刪除這條錄音嗎?",
+    
+    "多个文件将压缩成一个.zip的文件以便于分享。请选择您需要导出的文件类型:" : "多個文件將壓縮成一個.zip的文件以便於分享。請選擇您需要導出的文件類型:",
+    "仅音频文件" : "僅音頻文件",
+    "仅文档" : "僅文檔",
+    "音频文件" : "音頻文件",
+    "文档":"文檔",
+    
+    "白噪音":"白噪音",
+    "EQ调音":"EQ調音",
+    "正常":"正常",
+    "流行":"流行",
+    "经典":"經典",
+    "爵士":"爵士",
+    "摇滚":"搖滾",
+    "自定义":"自定義",
+    "查找耳机":"查找耳機",
+    "自定义音效":"自定義音效",
+    "音效风格":"音效風格",
+    "左耳机响铃":"左耳機響鈴",
+    "右耳机响铃":"右耳機響鈴",
+    "耳机在附近,可通过响铃进行查找":"耳機在附近,可通過響鈴進行查找",
+    
+    "个智能设备":"個智能設備",
+    "云储存空间" : "雲存儲空間",
+    "电子说明书" : "電子說明書",
+    "固件升级" : "固件升級",
+    "语言设置" : "語言設置",
+    "更多设置" : "更多設置",
+    "帮助与反馈" : "幫助與反饋",
+    "关于" : "關於",
+    "设备详情":"設備詳情",
+    "设备名称":"設備名稱",
+    "设备ID":"設備ID",
+    "最近登录时间":"最近登錄時間",
+    "移除设备":"移除設備",
+    "确定要解绑该设备吗?":"確定要解除綁定該設備嗎?",
+    "移除设备后会同步退出账号,在此设备上将无法访问该账号的数据":"移除設備後會同步退出賬號,在此設備上將無法訪問該賬號的數據",
+    "设备地址":"設備地址",
+    "硬件版本":"硬件版本",
+    "软件版本":"軟件版本",
+    "设备信息":"設備信息",
+    
+    "账号设置" : "賬號設置",
+    "登录方式" : "登錄方式",
+    "账号密码" : "賬號密碼",
+    "安全手机" : "安全手機",
+    "安全邮箱" : "安全郵箱",
+    "基本资料" : "基本資料",
+    "登录设备管理" : "登錄設備管理",
+    "头像" : "頭像",
+    "昵称" : "昵稱",
+    "性别" : "性別",
+    "国家与地区" : "國家與地區",
+    "请输入昵称" : "請輸入昵稱",
+    "男" : "男",
+    "女" : "女",
+    "保密" : "保密",
+    "国家/地区" : "國家/地區",
+    "请输入新的安全手机号码" : "請輸入新的安全手機號碼",
+    "请输入手机号码" : "請輸入手機號碼",
+    
+    "请输入新的安全邮箱地址" : "請輸入新的安全郵箱地址",
+    "请输入邮箱地址" : "請輸入郵箱地址",
+    "请使用安全手机":"請使用安全手機",
+    "请使用安全邮箱":"請使用安全郵箱",
+    "获取验证码短信":"獲取驗證碼短信",
+    "请输入型号查询" : "請輸入型號查詢",
+    "问题描述或建议" : "問題描述或建議",
+    "在线咨询" : "在線咨詢",
+    "问题类型" : "問題類型",
+    "功能异常" : "功能異常",
+    "意见与反馈" : "意見與反饋",
+    "联系方式" : "聯繫方式",
+    "请输入手机号或邮箱" : "請輸入手機號或郵箱",
+    "请至少用10个字描述问题,并添加截图,这有助于问题快速解决。" : "請至少用10個字描述問題,並添加截圖,這有助於問題快速解決。",
+    "反馈历史" : "反饋歷史",
+    "你好,请问有什么我可以帮助到您" : "你好,請問有什麼我可以幫助到您",
+    "请用一句话简单描述下您的问题~" : "請用一句話簡單描述下您的問題~",
+    "猜你想问" : "猜你想問",
+    
+    
+    "当前版本" : "當前版本",
+    "检查更新" : "檢查更新",
+    "系统权限管理" : "系統權限管理",
+    "切换账号" : "切換賬號",
+    "退出登录" : "退出登錄",
+    "注销账号" : "註銷賬號",
+    "提示" : "提示",
+    "确定" : "確定",
+    "确认" : "確認",
+    "取消" : "取消",
+    "删除" : "刪除",
+    "下一步" : "下一步",
+    "确定要切换账号吗?" : "確定要切換賬號嗎?",
+    "确定要退出登录吗?" : "確定要退出登錄嗎?",
+    "真的要注销账号吗?" : "真的要註銷賬號嗎?",
+    "用户协议" : "用戶協議",
+    "隐私政策" : "隱私政策",
+    "个人信息手机清单" : "個人信息手機清單",
+    "系统权限清单" : "系統權限清單",
+    "撤回同意" : "撤回同意",
+    "确认撤回" : "確認撤回",
+    "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!" : "請您確保您是有權進行本撤回同意隱私政策操作的相關當事人。撤回同意隱私政策,您將放棄以下資產或者權益:\n\n1.數據清空\n將會停止收集您的個人信息。您使用DeepChords應用過程中產生的數據將被清空;手機中DeepChords應用的緩存數據將被清除。\n\n2.設備解除綁定\nDeepChords賬號中,所有設備會與您當前登錄的賬號解除綁定,並清除設備之前存儲在服務器的數據。存儲在物理設備中的數據請通過人工本地物理重置來清除。如果您需要重新使用設備,需要您再次進行綁定並且重新授權。\n\n3.其他\n此舉還將撤回您對用戶協議的同意,並退出DeepChords應用。\n\n請您知悉,撤回同意隱私政策不代表撤回同意前的相關行為和責任得到豁免或減輕。若您需要重新在該賬號管理設備,需要您重新授權並綁定。請謹慎操作!",
+    "您好, \n欢迎使用DeepChords" : "您好, \n歡迎使用DeepChords",
+    "用户登录" : "用戶登錄",
+    "请输入密码" : "請輸入密碼",
+    "请输入手机号码/邮箱":"請輸入手機號碼/郵箱",
+    "登录并同意" : "登錄並同意",
+    "《隐私政策》" : "《隱私政策》",
+    " 和 " : " 和 ",
+    "《用户协议》" : "《用戶協議》",
+    "忘记密码" : "忘記密碼",
+    "验证码登录" : "驗證碼登錄",
+    "其他登录方式" : "其他登錄方式",
+    "用户注册" : "用戶註冊",
+    "请输入验证码" : "請輸入驗證碼",
+    "发送验证码":"發送驗證碼",
+    "点击获取" : "點擊獲取",
+    "登录" : "登錄",
+    "密码登录" : "密碼登錄",
+    "重置密码":"重置密碼",
+    "注册" : "註冊",
+    "请输入正确的手机号码" : "請輸入正確的手機號碼",
+    "请求失败" : "請求失敗",
+    "请求成功!":"請求成功!",
+    "加载中...":"加載中...",
+    "上传中...":"上傳中...",
+    "连接中":"連接中",
+    "连接成功":"連接成功",
+    "连接失败":"連接失敗",
+    "智能体":"智能體",
+    "已成功更新到云储存空间":"已成功更新到雲存儲空間",
+]
diff --git a/ShenYin/ShenYin/lan/Vietnam.swift b/ShenYin/ShenYin/lan/Vietnam.swift
new file mode 100644 (file)
index 0000000..35eaa6c
--- /dev/null
@@ -0,0 +1,227 @@
+//
+//  Untitled.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/11/11.
+//
+
+let VietnamMap:[String:String] =
+[
+    "智能" : "Thông minh",
+    "模式" : "Chế độ",
+    "睡眠" : "Ngủ",
+    "客服" : "Dịch vụ khách hàng",
+    "我的" : "Của tôi",
+    "设备":"Thiết bị",
+    "已连接" : "Đã kết nối",
+    "未连接" : "Chưa kết nối",
+    
+    "现场录音" : "Ghi âm trực tiếp",
+    "随时随地,一键开录" : "Bất cứ lúc nào, bất cứ đâu, bấm một nút để bắt đầu ghi",
+    "通话录音" : "Ghi âm cuộc gọi",
+    "一键录音,翻译转写" : "Ghi âm một nút, dịch và chuyển đổi",
+    "中英互译" : "Dịch sang tiếng Trung - Anh lẫn nhau",
+    "实时对话,即时互译" : "Đối thoại thực tế, dịch tức thời",
+    "同传听译" : "Dịch đồng thời khi nghe",
+    "一机一耳,面对面畅聊" : "Một máy một tai nghe, trò chuyện trực tiếp thoải mái",
+    "对话翻译" : "Dịch đối thoại",
+    "会议讲座,同步翻译" : "Hội nghị, buổi giảng, dịch đồng bộ",
+    "文本翻译" : "Dịch văn bản",
+    "即打即译,多语支持":"Dịch ngay khi gõ, hỗ trợ nhiều ngôn ngữ",
+    "历史记录" : "Lịch sử",
+    "所有记录,一目了然" : "Tất cả các bản ghi, rõ ràng ở một nhìn",
+    "智能对话" : "Đối thoại thông minh",
+    "伙伴,随叫随到" : "Đồng hành, đến kịp khi gọi",
+    "切换角色" : "Chuyển đổi vai trò",
+    "按住说话" : "Giữ để nói",
+    "同传听译模式使用介绍":"Giới thiệu cách sử dụng chế độ dịch đồng thời khi nghe",
+    "对话模式使用介绍" : "Giới thiệu cách sử dụng chế độ đối thoại",
+    "中英互译模式使用介绍" : "Giới thiệu cách sử dụng chế độ dịch Trung - Anh lẫn nhau",
+    "一方手持手机,一方戴上耳机,对手机发言时,耳机播放译文,对耳机发言时,手机播放译文" : "Một bên cầm điện thoại, một bên đeo tai nghe, khi nói vào điện thoại, tai nghe phát bản dịch; khi nói vào tai nghe, điện thoại phát bản dịch",
+    "两人各佩戴一只耳机,选择源语言语种, 双方耳机中播放目标语言" : "Mỗi người đeo một tai nghe, chọn ngôn ngữ nguồn, cả hai bên nghe được ngôn ngữ đích qua tai nghe",
+    "手机靠近音源收音,佩戴耳机收听译文" : "Điện thoại gần nguồn âm để thu âm, đeo tai nghe để nghe bản dịch",
+    "- 情景示例 -\n张张靠近手机讲中文,对方耳机播放英语" : "- Ví dụ tình huống -\nZhāng Zhāng nói tiếng Trung gần điện thoại, tai nghe của đối phương phát tiếng Anh",
+    "- 情景示例 -\n张张戴一只耳机讲中文,双方耳机播放英文翻译 Lucy切换为英语发言后,双方耳机中播报中文翻译" : "- Ví dụ tình huống -\nZhāng Zhāng đeo một tai nghe nói tiếng Trung, cả hai tai nghe phát bản dịch tiếng Anh. Sau khi Lucy chuyển sang nói tiếng Anh, cả hai tai nghe phát bản dịch tiếng Trung",
+    "- 情景示例 -\nLisa对着手机讲英语,小徐耳机中播放中文" : "- Ví dụ tình huống -\nLisa nói tiếng Anh vào điện thoại, tai nghe của Xiao Xu phát tiếng Trung",
+    "开始体验" : "Bắt đầu trải nghiệm",
+    "下次不再提示":"Không提示lại lần sau",
+    "当前正在录音,确定放弃当前录音吗":"Đang ghi âm, chắc chắn muốn bỏ qua bản ghi hiện tại?",
+    "云同步":"Tồng bộ đám mây",
+    "是否上传运存储空间备份":"Có muốn tải lên bộ nhớ đám mây để sao lưu không?",
+    
+    "请选择语言":"Vui lòng chọn ngôn ngữ",
+    "中文" : "Tiếng Trung",
+    "英文" : "Tiếng Anh",
+    "日文" : "Tiếng Nhật",
+    "韩文" : "Tiếng Hàn",
+    "法文" : "Tiếng Pháp",
+    "西班牙文" : "Tiếng Tây Ban Nha",
+    "葡萄牙文" : "Tiếng Bồ Đào Nha",
+    "印度尼西亚文" : "Tiếng Indonesia",
+    "俄文" : "Tiếng Nga",
+    "马来文" : "Tiếng Mã Lai",
+    
+    "保存录音" : "Lưu bản ghi âm",
+    "原文" : "Văn bản gốc",
+    "译文" : "Bản dịch",
+    "摘要" : "Tóm tắt",
+    "翻译" : "Dịch",
+    "重命名" : "Đổi tên",
+    "播放录音" : "Phát bản ghi âm",
+    "更多" : "Thêm",
+    "字号" : "Kích thước chữ",
+    "分享" : "Chia sẻ",
+    "调整字号" : "Điều chỉnh kích thước chữ",
+    "小" : "Nhỏ",
+    "标准" : "Chuẩn",
+    "大" : "Lớn",
+    "设置" : "Cài đặt",
+    "左耳" : "Tai trái",
+    "右耳" : "Tai phải",
+    "耳机" : "Tai nghe",
+    "手机" : "Điện thoại di động",
+    "此处将显示原文" : "Văn bản gốc sẽ được hiển thị ở đây",
+    "此处将显示译文" : "Bản dịch sẽ được hiển thị ở đây",
+    "请输入..." : "Vui lòng nhập...",
+    "筛选录音" : "Lọc bản ghi âm",
+    "全部录音":"Tất cả các bản ghi âm",
+    "收藏录音" : "Yêu thích bản ghi âm",
+    "多选" : "Chọn nhiều",
+    "导出" : "Xuất",
+    "您要删除这些录音吗?" : "Bạn có muốn xóa các bản ghi âm này không?",
+    "删除后,这些记录将无法恢复。" : "Sau khi xóa, các bản ghi này không thể khôi phục.",
+    "删除后,此记录将无法恢复":"Sau khi xóa, bản ghi này không thể khôi phục",
+    "您要删除这条录音吗?":"Bạn có muốn xóa bản ghi âm này không?",
+    
+    "多个文件将压缩成一个.zip的文件以便于分享。请选择您需要导出的文件类型:" : "Nhiều tệp sẽ được nén thành một tệp .zip để dễ dàng chia sẻ. Vui lòng chọn loại tệp bạn muốn xuất:",
+    "仅音频文件" : "Chỉ tệp âm thanh",
+    "仅文档" : "Chỉ tài liệu",
+    "音频文件" : "Tệp âm thanh",
+    "文档":"Tài liệu",
+    
+    "白噪音":"Nhạc nền trắng",
+    "EQ调音":"Điều chỉnh EQ",
+    "正常":"Bình thường",
+    "流行":"Trendy",
+    "经典":"Kinh điển",
+    "爵士":"Jazz",
+    "摇滚":"Rock",
+    "自定义":"Tùy chỉnh",
+    "查找耳机":"Tìm tai nghe",
+    "自定义音效":"Âm thanh tùy chỉnh",
+    "音效风格":"Phong cách âm thanh",
+    "左耳机响铃":"Tai nghe trái reo",
+    "右耳机响铃":"Tai nghe phải reo",
+    "耳机在附近,可通过响铃进行查找":"Tai nghe ở gần, có thể tìm kiếm qua tiếng reo",
+    
+    "个智能设备":"thiết bị thông minh",
+    "云储存空间" : "Khoảng trống lưu trữ đám mây",
+    "电子说明书" : "Hướng dẫn sử dụng điện tử",
+    "固件升级" : "Nâng cấp phần mềm",
+    "语言设置" : "Cài đặt ngôn ngữ",
+    "更多设置" : "Thêm cài đặt",
+    "帮助与反馈" : "Trợ giúp và phản hồi",
+    "关于" : "Về",
+    "设备详情":"Chi tiết thiết bị",
+    "设备名称":"Tên thiết bị",
+    "设备ID":"ID thiết bị",
+    "最近登录时间":"Thời gian đăng nhập gần nhất",
+    "移除设备":"Xóa thiết bị",
+    "确定要解绑该设备吗?":"Chắc chắn muốn hủy liên kết thiết bị này?",
+    "移除设备后会同步退出账号,在此设备上将无法访问该账号的数据":"Sau khi xóa thiết bị, sẽ đồng bộ đăng xuất tài khoản, không thể truy cập dữ liệu của tài khoản trên thiết bị này",
+    "设备地址":"Địa chỉ thiết bị",
+    "硬件版本":"Phiên bản phần cứng",
+    "软件版本":"Phiên bản phần mềm",
+    "设备信息":"Thông tin thiết bị",
+    
+    "账号设置" : "Cài đặt tài khoản",
+    "登录方式" : "Cách đăng nhập",
+    "账号密码" : "Mật khẩu tài khoản",
+    "安全手机" : "Điện thoại an toàn",
+    "安全邮箱" : "Email an toàn",
+    "基本资料" : "Thông tin cơ bản",
+    "登录设备管理" : "Quản lý thiết bị đăng nhập",
+    "头像" : "Ảnh đại diện",
+    "昵称" : "Biệt danh",
+    "性别" : "Giới tính",
+    "国家与地区" : "Quốc gia và vùng",
+    "请输入昵称" : "Vui lòng nhập biệt danh",
+    "男" : "Nam",
+    "女" : "Nữ",
+    "保密" : "Bảo mật",
+    "国家/地区" : "Quốc gia/vùng",
+    "请输入新的安全手机号码" : "Vui lòng nhập số điện thoại an toàn mới",
+    "请输入手机号码" : "Vui lòng nhập số điện thoại",
+    
+    "请输入新的安全邮箱地址" : "Vui lòng nhập địa chỉ email an toàn mới",
+    "请输入邮箱地址" : "Vui lòng nhập địa chỉ email",
+    "请使用安全手机":"Vui lòng sử dụng điện thoại an toàn",
+    "请使用安全邮箱":"Vui lòng sử dụng email an toàn",
+    "获取验证码短信":"Lấy tin nhắn mã xác thực",
+    "请输入型号查询" : "Vui lòng nhập型号 để查询",
+    "问题描述或建议" : "Mô tả vấn đề hoặc đề xuất",
+    "在线咨询" : "Tư vấn trực tuyến",
+    "问题类型" : "Loại vấn đề",
+    "功能异常" : "Lỗi chức năng",
+    "意见与反馈" : "Ý kiến và phản hồi",
+    "联系方式" : "Thông tin liên lạc",
+    "请输入手机号或邮箱" : "Vui lòng nhập số điện thoại hoặc email",
+    "请至少用10个字描述问题,并添加截图,这有助于问题快速解决。" : "Vui lòng mô tả vấn đề ít nhất 10 chữ, và thêm ảnh chụp màn hình, điều này sẽ giúp giải quyết vấn đề nhanh hơn.",
+    "反馈历史" : "Lịch sử phản hồi",
+    "你好,请问有什么我可以帮助到您" : "Xin chào, có gì tôi có thể giúp bạn không",
+    "请用一句话简单描述下您的问题~" : "Vui lòng mô tả vấn đề của bạn một cách ngắn gọn trong một câu~",
+    "猜你想问" : "Dự đoán bạn muốn hỏi",
+    
+    
+    "当前版本" : "Phiên bản hiện tại",
+    "检查更新" : "Kiểm tra cập nhật",
+    "系统权限管理" : "Quản lý quyền hệ thống",
+    "切换账号" : "Chuyển đổi tài khoản",
+    "退出登录" : "Đăng xuất",
+    "注销账号" : "Hủy tài khoản",
+    "提示" : "Thông báo",
+    "确定" : "Xác nhận",
+    "确认" : "Xác nhận",
+    "取消" : "Hủy",
+    "删除" : "Xóa",
+    "下一步" : "Bước tiếp theo",
+    "确定要切换账号吗?" : "Chắc chắn muốn chuyển đổi tài khoản?",
+    "确定要退出登录吗?" : "Chắc chắn muốn đăng xuất?",
+    "真的要注销账号吗?" : "Thật sự muốn hủy tài khoản?",
+    "用户协议" : "Quy định người dùng",
+    "隐私政策" : "Chính sách bảo mật",
+    "个人信息手机清单" : "Danh sách thu thập thông tin cá nhân",
+    "系统权限清单" : "Danh sách quyền hệ thống",
+    "撤回同意" : "Hủy đồng ý",
+    "确认撤回" : "Xác nhận hủy",
+    "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!" : "Vui lòng đảm bảo rằng bạn là bên liên quan có quyền thực hiện thao tác hủy đồng ý Chính sách bảo mật này. Khi hủy đồng ý Chính sách bảo mật, bạn sẽ từ bỏ các tài sản hoặc quyền lợi sau:\n\n1.Xóa dữ liệu\nSẽ ngừng thu thập thông tin cá nhân của bạn. Dữ liệu được tạo ra trong quá trình bạn sử dụng ứng dụng DeepChords sẽ được xóa; dữ liệu cache của ứng dụng DeepChords trên điện thoại sẽ được xóa.\n\n2.Hủy liên kết thiết bị\nTrong tài khoản DeepChords, tất cả các thiết bị sẽ bị hủy liên kết với tài khoản bạn đang đăng nhập và xóa dữ liệu thiết bị đã lưu trên máy chủ trước đó. Dữ liệu lưu trữ trên thiết bị vật lý vui lòng xóa thông qua đặt lại vật lý cục bộ thủ công. Nếu bạn cần sử dụng lại thiết bị, bạn cần liên kết lại và cấp quyền lại.\n\n3.Điều khác\nHành động này cũng sẽ hủy đồng ý của bạn với Quy định người dùng và đăng xuất khỏi ứng dụng DeepChords.\n\nVui lòng lưu ý rằng việc hủy đồng ý Chính sách bảo mật không có nghĩa là các hành vi và trách nhiệm liên quan trước khi hủy đồng ý được miễn trừ hoặc giảm nhẹ. Nếu bạn cần quản lý thiết bị trên tài khoản này lại, bạn cần cấp quyền lại và liên kết lại. Vui lòng thao tác cẩn thận!",
+    "您好, \n欢迎使用DeepChords" : "Xin chào, \nChào mừng bạn sử dụng DeepChords",
+    "用户登录" : "Đăng nhập người dùng",
+    "请输入密码" : "Vui lòng nhập mật khẩu",
+    "请输入手机号码/邮箱":"Vui lòng nhập số điện thoại/email",
+    "登录并同意" : "Đăng nhập và đồng ý",
+    "《隐私政策》" : "《Chính sách bảo mật》",
+    " 和 " : " và ",
+    "《用户协议》" : "《Quy định người dùng》",
+    "忘记密码" : "Quên mật khẩu",
+    "验证码登录" : "Đăng nhập bằng mã xác thực",
+    "其他登录方式" : "Cách đăng nhập khác",
+    "用户注册" : "Đăng ký người dùng",
+    "请输入验证码" : "Vui lòng nhập mã xác thực",
+    "发送验证码":"Gửi mã xác thực",
+    "点击获取" : "Nhấp để lấy",
+    "登录" : "Đăng nhập",
+    "密码登录" : "Đăng nhập bằng mật khẩu",
+    "重置密码":"Đặt lại mật khẩu",
+    "注册" : "Đăng ký",
+    "请输入正确的手机号码" : "Vui lòng nhập số điện thoại chính xác",
+    "请求失败" : "Yêu cầu thất bại",
+    "请求成功!":"Yêu cầu thành công!",
+    "加载中...":"Đang tải...",
+    "上传中...":"Đang tải lên...",
+    "连接中":"Đang kết nối",
+    "连接成功":"Kết nối thành công",
+    "连接失败":"Kết nối thất bại",
+    "智能体":"Thiết bị thông minh",
+    "已成功更新到云储存空间":"Đã cập nhật thành công lên kho lưu trữ đám mây",
+]
diff --git a/ShenYin/ShenYin/lan/chinese.swift b/ShenYin/ShenYin/lan/chinese.swift
new file mode 100644 (file)
index 0000000..04b9888
--- /dev/null
@@ -0,0 +1,228 @@
+//
+//  chinese.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/11/10.
+//
+
+let chineseMap:[String:String] =
+[
+    "智能" : "",
+    "模式" : "",
+    "睡眠" : "",
+    "客服" : "",
+    "我的" : "",
+    "设备":"",
+    "已连接" : "",
+    "未连接" : "",
+    
+    "现场录音" : "",
+    "随时随地,一键开录" : "",
+    "通话录音" : "",
+    "一键录音,翻译转写" : "",
+    "中英互译" : "",
+    "实时对话,即时互译" : "",
+    "同传听译" : "",
+    "一机一耳,面对面畅聊" : "",
+    "对话翻译" : "",
+    "会议讲座,同步翻译" : "",
+    "文本翻译" : "",
+    "即打即译,多语支持":"",
+    "历史记录" : "",
+    "所有记录,一目了然" : "",
+    "智能对话" : "",
+    "伙伴,随叫随到" : "",
+    "切换角色" : "",
+    "按住说话" : "",
+    "同传听译模式使用介绍":"",
+    "对话模式使用介绍" : "",
+    "中英互译模式使用介绍" : "",
+    "一方手持手机,一方戴上耳机,对手机发言时,耳机播放译文,对耳机发言时,手机播放译文" : "",
+    "两人各佩戴一只耳机,选择源语言语种, 双方耳机中播放目标语言" : "",
+    "手机靠近音源收音,佩戴耳机收听译文" : "",
+    "- 情景示例 -\n张张靠近手机讲中文,对方耳机播放英语" : "",
+    "- 情景示例 -\n张张戴一只耳机讲中文,双方耳机播放英文翻译 Lucy切换为英语发言后,双方耳机中播报中文翻译" : "",
+    "- 情景示例 -\nLisa对着手机讲英语,小徐耳机中播放中文" : "",
+    "开始体验" : "",
+    "下次不再提示":"",
+    "当前正在录音,确定放弃当前录音吗":"",
+    "云同步":"",
+    "是否上传运存储空间备份":"",
+    
+    "请选择语言":"",
+    "中文" : "",
+    "英文" : "",
+    "日文" : "",
+    "韩文" : "",
+    "法文" : "",
+    "西班牙文" : "",
+    "葡萄牙文" : "",
+    "印度尼西亚文" : "",
+    "俄文" : "",
+    "马来文" : "",
+    
+    "保存录音" : "",
+    "原文" : "",
+    "译文" : "",
+    "摘要" : "",
+    "翻译" : "",
+    "重命名" : "",
+    "播放录音" : "",
+    "更多" : "",
+    "字号" : "",
+    "分享" : "",
+    "调整字号" : "",
+    "小" : "",
+    "标准" : "",
+    "大" : "",
+    "设置" : "",
+    "左耳" : "",
+    "右耳" : "",
+    "耳机" : "",
+    "手机" : "",
+    "此处将显示原文" : "",
+    "此处将显示译文" : "",
+    "请输入..." : "",
+    "筛选录音" : "",
+    "全部录音":"",
+    "收藏录音" : "",
+    "多选" : "",
+    "导出" : "",
+    "您要删除这些录音吗?" : "",
+    "删除后,这些记录将无法恢复。" : "",
+    "删除后,此记录将无法恢复":"",
+    "您要删除这条录音吗?":"",
+    
+    "多个文件将压缩成一个.zip的文件以便于分享。请选择您需要导出的文件类型:" : "",
+    "仅音频文件" : "",
+    "仅文档" : "",
+    "音频文件" : "",
+    "文档":"",
+
+    "白噪音":"",
+    "EQ调音":"",
+    "正常":"",
+    "流行":"",
+    "经典":"",
+    "爵士":"",
+    "摇滚":"",
+    "自定义":"",
+    "查找耳机":"",
+    "自定义音效":"",
+    "音效风格":"",
+    "左耳机响铃":"",
+    "右耳机响铃":"",
+    "耳机在附近,可通过响铃进行查找":"",
+    
+    "个智能设备":"",
+    "云储存空间" : "",
+    "电子说明书" : "",
+    "固件升级" : "",
+    "语言设置" : "",
+    "更多设置" : "",
+    "帮助与反馈" : "",
+    "关于" : "",
+    "设备详情":"",
+    "设备名称":"",
+    "设备ID":"",
+    "最近登录时间":"",
+    "移除设备":"",
+    "确定要解绑该设备吗?":"",
+    "移除设备后会同步退出账号,在此设备上将无法访问该账号的数据":"",
+    "设备地址":"",
+    "硬件版本":"",
+    "软件版本":"",
+    "设备信息":"设备信息",
+    
+    "账号设置" : "",
+    "登录方式" : "",
+    "账号密码" : "",
+    "安全手机" : "",
+    "安全邮箱" : "",
+    "基本资料" : "",
+    "登录设备管理" : "",
+    "头像" : "",
+    "昵称" : "",
+    "性别" : "",
+    "国家与地区" : "",
+    "请输入昵称" : "",
+    "男" : "",
+    "女" : "",
+    "保密" : "",
+    "国家/地区" : "",
+    "请输入新的安全手机号码" : "",
+    "请输入手机号码" : "",
+    
+    "请输入新的安全邮箱地址" : "",
+    "请输入邮箱地址" : "",
+    "请使用安全手机":"",
+    "请使用安全邮箱":"",
+    "获取验证码短信":"",
+    "请输入型号查询" : "",
+    "问题描述或建议" : "",
+    "在线咨询" : "",
+    "问题类型" : "",
+    "功能异常" : "",
+    "意见与反馈" : "",
+    "联系方式" : "",
+    "请输入手机号或邮箱" : "",
+    "请至少用10个字描述问题,并添加截图,这有助于问题快速解决。" : "",
+    "反馈历史" : "",
+    "你好,请问有什么我可以帮助到您" : "",
+    "请用一句话简单描述下您的问题~" : "",
+    "猜你想问" : "",
+
+    
+    "当前版本" : "",
+    "检查更新" : "",
+    "系统权限管理" : "",
+    "切换账号" : "",
+    "退出登录" : "",
+    "注销账号" : "",
+    "提示" : "",
+    "确定" : "",
+    "确认" : "",
+    "取消" : "",
+    "删除" : "",
+    "下一步" : "",
+    "确定要切换账号吗?" : "",
+    "确定要退出登录吗?" : "",
+    "真的要注销账号吗?" : "",
+    "用户协议" : "",
+    "隐私政策" : "",
+    "个人信息手机清单" : "",
+    "系统权限清单" : "",
+    "撤回同意" : "",
+    "确认撤回" : "",
+    "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!" : "",
+    "您好, \n欢迎使用DeepChords" : "",
+    "用户登录" : "",
+    "请输入密码" : "",
+    "请输入手机号码/邮箱":"",
+    "登录并同意" : "",
+    "《隐私政策》" : "",
+    " 和 " : "",
+    "《用户协议》" : "",
+    "忘记密码" : "",
+    "验证码登录" : "",
+    "其他登录方式" : "",
+    "用户注册" : "",
+    "请输入验证码" : "",
+    "发送验证码":"",
+    "点击获取" : "",
+    "登录" : "",
+    "密码登录" : "",
+    "重置密码":"",
+    "注册" : "",
+    "请输入正确的手机号码" : "",
+    "请求失败" : "",
+    "请求成功!":"",
+    "加载中...":"",
+    "上传中...":"",
+    "连接中":"",
+    "连接成功":"",
+    "连接失败":"",
+    "智能体":"",
+    "已成功更新到云储存空间":"",
+]
+
diff --git a/ShenYin/ShenYin/lan/english.swift b/ShenYin/ShenYin/lan/english.swift
new file mode 100644 (file)
index 0000000..d44b77c
--- /dev/null
@@ -0,0 +1,227 @@
+//
+//  Untitled.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/11/10.
+//
+
+let englishMap:[String:String] =
+[
+    "智能" : "Smart",
+    "模式" : "Mode",
+    "睡眠" : "Sleep",
+    "客服" : "Customer Service",
+    "我的" : "Mine",
+    "设备":"Device",
+    "已连接" : "Connected",
+    "未连接" : "Disconnected",
+    
+    "现场录音" : "On-site Recording",
+    "随时随地,一键开录" : "Record anytime, anywhere with one click",
+    "通话录音" : "Call Recording",
+    "一键录音,翻译转写" : "One-click recording, translation and transcription",
+    "中英互译" : "Chinese-English Translation",
+    "实时对话,即时互译" : "Real-time conversation, instant translation",
+    "同传听译" : "Simultaneous Interpretation",
+    "一机一耳,面对面畅聊" : "One device, one earphone, face-to-face chat",
+    "对话翻译" : "Conversation Translation",
+    "会议讲座,同步翻译" : "Conferences and lectures, synchronous translation",
+    "文本翻译" : "Text Translation",
+    "即打即译,多语支持":"Instant typing and translation, multi-language support",
+    "历史记录" : "History",
+    "所有记录,一目了然" : "All records, clear at a glance",
+    "智能对话" : "Smart Conversation",
+    "伙伴,随叫随到" : "Partner, always available",
+    "切换角色" : "Switch Role",
+    "按住说话" : "Press to Talk",
+    "同传听译模式使用介绍":"Introduction to Simultaneous Interpretation Mode",
+    "对话模式使用介绍" : "Introduction to Conversation Mode",
+    "中英互译模式使用介绍" : "Introduction to Chinese-English Translation Mode",
+    "一方手持手机,一方戴上耳机,对手机发言时,耳机播放译文,对耳机发言时,手机播放译文" : "One person holds the phone, the other wears earphones. When speaking to the phone, the earphones play the translation; when speaking to the earphones, the phone plays the translation",
+    "两人各佩戴一只耳机,选择源语言语种, 双方耳机中播放目标语言" : "Two people each wear one earphone, select the source language, and the target language is played in both earphones",
+    "手机靠近音源收音,佩戴耳机收听译文" : "Place the phone close to the sound source to pick up audio, wear earphones to listen to the translation",
+    "- 情景示例 -\n张张靠近手机讲中文,对方耳机播放英语" : "- Scenario Example -\nZhang approaches the phone and speaks Chinese, the other party's earphones play English",
+    "- 情景示例 -\n张张戴一只耳机讲中文,双方耳机播放英文翻译 Lucy切换为英语发言后,双方耳机中播报中文翻译" : "- Scenario Example -\nZhang wears one earphone and speaks Chinese, both earphones play English translation. After Lucy switches to speaking English, both earphones broadcast Chinese translation",
+    "- 情景示例 -\nLisa对着手机讲英语,小徐耳机中播放中文" : "- Scenario Example -\nLisa speaks English into the phone, Xiao Xu's earphones play Chinese",
+    "开始体验" : "Start Experience",
+    "下次不再提示":"Do not prompt again",
+    "当前正在录音,确定放弃当前录音吗":"Currently recording, are you sure to abandon the current recording?",
+    "云同步":"Cloud Sync",
+    "是否上传运存储空间备份":"Do you want to upload to cloud storage for backup?",
+    
+    "请选择语言":"Please select language",
+    "中文" : "Chinese",
+    "英文" : "English",
+    "日文" : "Japanese",
+    "韩文" : "Korean",
+    "法文" : "French",
+    "西班牙文" : "Spanish",
+    "葡萄牙文" : "Portuguese",
+    "印度尼西亚文" : "Indonesian",
+    "俄文" : "Russian",
+    "马来文" : "Malay",
+    
+    "保存录音" : "Save Recording",
+    "原文" : "Original Text",
+    "译文" : "Translated Text",
+    "摘要" : "Summary",
+    "翻译" : "Translate",
+    "重命名" : "Rename",
+    "播放录音" : "Play Recording",
+    "更多" : "More",
+    "字号" : "Font Size",
+    "分享" : "Share",
+    "调整字号" : "Adjust Font Size",
+    "小" : "Small",
+    "标准" : "Standard",
+    "大" : "Large",
+    "设置" : "Settings",
+    "左耳" : "Left Ear",
+    "右耳" : "Right Ear",
+    "耳机" : "Earphone",
+    "手机" : "Phone",
+    "此处将显示原文" : "Original text will be displayed here",
+    "此处将显示译文" : "Translated text will be displayed here",
+    "请输入..." : "Please enter...",
+    "筛选录音" : "Filter Recordings",
+    "全部录音":"All Recordings",
+    "收藏录音" : "Favorite Recordings",
+    "多选" : "Multi-select",
+    "导出" : "Export",
+    "您要删除这些录音吗?" : "Do you want to delete these recordings?",
+    "删除后,这些记录将无法恢复。" : "After deletion, these records cannot be recovered.",
+    "删除后,此记录将无法恢复":"After deletion, this record cannot be recovered",
+    "您要删除这条录音吗?":"Do you want to delete this recording?",
+    
+    "多个文件将压缩成一个.zip的文件以便于分享。请选择您需要导出的文件类型:" : "Multiple files will be compressed into a .zip file for easy sharing. Please select the file type you need to export:",
+    "仅音频文件" : "Audio files only",
+    "仅文档" : "Documents only",
+    "音频文件" : "Audio files",
+    "文档":"Documents",
+    
+    "白噪音":"White Noise",
+    "EQ调音":"EQ Tuning",
+    "正常":"Normal",
+    "流行":"Pop",
+    "经典":"Classic",
+    "爵士":"Jazz",
+    "摇滚":"Rock",
+    "自定义":"Custom",
+    "查找耳机":"Find Earphones",
+    "自定义音效":"Custom Sound Effect",
+    "音效风格":"Sound Effect Style",
+    "左耳机响铃":"Left Earphone Ringing",
+    "右耳机响铃":"Right Earphone Ringing",
+    "耳机在附近,可通过响铃进行查找":"Earphones are nearby, can be found by ringing",
+    
+    "个智能设备":"smart devices",
+    "云储存空间" : "Cloud Storage Space",
+    "电子说明书" : "Electronic Manual",
+    "固件升级" : "Firmware Upgrade",
+    "语言设置" : "Language Settings",
+    "更多设置" : "More Settings",
+    "帮助与反馈" : "Help & Feedback",
+    "关于" : "About",
+    "设备详情":"Device Details",
+    "设备名称":"Device Name",
+    "设备ID":"Device ID",
+    "最近登录时间":"Last Login Time",
+    "移除设备":"Remove Device",
+    "确定要解绑该设备吗?":"Are you sure to unbind this device?",
+    "移除设备后会同步退出账号,在此设备上将无法访问该账号的数据":"Removing the device will synchronously log out of the account, and the account data will not be accessible on this device",
+    "设备地址":"Device Address",
+    "硬件版本":"Hardware Version",
+    "软件版本":"Software Version",
+    "设备信息":"Device Information",
+    
+    "账号设置" : "Account Settings",
+    "登录方式" : "Login Method",
+    "账号密码" : "Account Password",
+    "安全手机" : "Security Phone",
+    "安全邮箱" : "Security Email",
+    "基本资料" : "Basic Information",
+    "登录设备管理" : "Logged-in Device Management",
+    "头像" : "Avatar",
+    "昵称" : "Nickname",
+    "性别" : "Gender",
+    "国家与地区" : "Country/Region",
+    "请输入昵称" : "Please enter nickname",
+    "男" : "Male",
+    "女" : "Female",
+    "保密" : "Private",
+    "国家/地区" : "Country/Region",
+    "请输入新的安全手机号码" : "Please enter new security phone number",
+    "请输入手机号码" : "Please enter phone number",
+    
+    "请输入新的安全邮箱地址" : "Please enter new security email address",
+    "请输入邮箱地址" : "Please enter email address",
+    "请使用安全手机":"Please use security phone",
+    "请使用安全邮箱":"Please use security email",
+    "获取验证码短信":"Get verification code via SMS",
+    "请输入型号查询" : "Please enter model to query",
+    "问题描述或建议" : "Problem description or suggestion",
+    "在线咨询" : "Online Consultation",
+    "问题类型" : "Problem Type",
+    "功能异常" : "Function Abnormality",
+    "意见与反馈" : "Opinions & Feedback",
+    "联系方式" : "Contact Information",
+    "请输入手机号或邮箱" : "Please enter phone number or email",
+    "请至少用10个字描述问题,并添加截图,这有助于问题快速解决。" : "Please describe the problem in at least 10 words and add screenshots, which will help solve the problem quickly.",
+    "反馈历史" : "Feedback History",
+    "你好,请问有什么我可以帮助到您" : "Hello, how can I help you?",
+    "请用一句话简单描述下您的问题~" : "Please briefly describe your problem in one sentence~",
+    "猜你想问" : "You might want to ask",
+    
+    
+    "当前版本" : "Current Version",
+    "检查更新" : "Check for Updates",
+    "系统权限管理" : "System Permission Management",
+    "切换账号" : "Switch Account",
+    "退出登录" : "Log Out",
+    "注销账号" : "Cancel Account",
+    "提示" : "Prompt",
+    "确定" : "Confirm",
+    "确认" : "Confirm",
+    "取消" : "Cancel",
+    "删除" : "Delete",
+    "下一步" : "Next",
+    "确定要切换账号吗?" : "Are you sure to switch accounts?",
+    "确定要退出登录吗?" : "Are you sure to log out?",
+    "真的要注销账号吗?" : "Really want to cancel the account?",
+    "用户协议" : "User Agreement",
+    "隐私政策" : "Privacy Policy",
+    "个人信息手机清单" : "Personal Information Collection List",
+    "系统权限清单" : "System Permission List",
+    "撤回同意" : "Withdraw Consent",
+    "确认撤回" : "Confirm Withdrawal",
+    "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!" : "Please ensure that you are the relevant party authorized to withdraw consent to the privacy policy. By withdrawing consent to the privacy policy, you will forfeit the following assets or rights:\n\n1. Data Clearing\nCollection of your personal information will stop. Data generated during your use of the DeepChords app will be cleared; cache data of the DeepChords app on your phone will be cleared.\n\n2. Device Unbinding\nAll devices in your DeepChords account will be unbound from your currently logged-in account, and data previously stored on the server by the devices will be cleared. Data stored on physical devices should be cleared through manual local physical reset. If you need to reuse the devices, you will need to bind and re-authorize them again.\n\n3. Others\nThis action will also withdraw your consent to the user agreement and log you out of the DeepChords app.\n\nPlease note that withdrawing consent to the privacy policy does not mean that relevant actions and responsibilities before withdrawal are exempted or mitigated. If you need to manage devices with this account again, you need to re-authorize and bind them. Please operate with caution!",
+    "您好, \n欢迎使用DeepChords" : "Hello, \nWelcome to DeepChords",
+    "用户登录" : "User Login",
+    "请输入密码" : "Please enter password",
+    "请输入手机号码/邮箱":"Please enter phone number/email",
+    "登录并同意" : "Login and Agree",
+    "《隐私政策》" : "Privacy Policy",
+    " 和 " : " and ",
+    "《用户协议》" : "User Agreement",
+    "忘记密码" : "Forgot Password",
+    "验证码登录" : "Verification Code Login",
+    "其他登录方式" : "Other Login Methods",
+    "用户注册" : "User Registration",
+    "请输入验证码" : "Please enter verification code",
+    "发送验证码":"Send Verification Code",
+    "点击获取" : "Click to Get",
+    "登录" : "Login",
+    "密码登录" : "Password Login",
+    "重置密码":"Reset Password",
+    "注册" : "Register",
+    "请输入正确的手机号码" : "Please enter a valid phone number",
+    "请求失败" : "Request Failed",
+    "请求成功!":"Request Successful!",
+    "加载中...":"Loading...",
+    "上传中...":"Uploading...",
+    "连接中":"Connecting",
+    "连接成功":"Connection Successful",
+    "连接失败":"Connection Failed",
+    "智能体":"Intelligent Agent",
+    "已成功更新到云储存空间":"Successfully updated to cloud storage space",
+]
diff --git a/ShenYin/ShenYin/lan/french.swift b/ShenYin/ShenYin/lan/french.swift
new file mode 100644 (file)
index 0000000..2328a3e
--- /dev/null
@@ -0,0 +1,228 @@
+//
+//  Untitled.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/11/11.
+//
+
+
+let frenchMap:[String:String] =
+[
+    "智能" : "Intelligent",
+    "模式" : "Mode",
+    "睡眠" : "Sommeil",
+    "客服" : "Service client",
+    "我的" : "Mien",
+    "设备":"Appareil",
+    "已连接" : "Connecté",
+    "未连接" : "Non connecté",
+    
+    "现场录音" : "Enregistrement en direct",
+    "随时随地,一键开录" : "N'importe où, n'importe quand, enregistrez en un clic",
+    "通话录音" : "Enregistrement d'appel",
+    "一键录音,翻译转写" : "Enregistrement en un clic, traduction et transcription",
+    "中英互译" : "Traduction entre chinois et anglais",
+    "实时对话,即时互译" : "Conversation en temps réel, traduction instantanée",
+    "同传听译" : "Interprétation simultanée",
+    "一机一耳,面对面畅聊" : "Un appareil et un oreillette, conversation en face à face",
+    "对话翻译" : "Traduction de conversation",
+    "会议讲座,同步翻译" : "Conférences et conférences, traduction同步",
+    "文本翻译" : "Traduction de texte",
+    "即打即译,多语支持":"Traduction en temps réel, support multilingue",
+    "历史记录" : "Historique",
+    "所有记录,一目了然" : "Toutes les enregistrements, claires à première vue",
+    "智能对话" : "Conversation intelligente",
+    "伙伴,随叫随到" : "Partenaire, disponible à tout moment",
+    "切换角色" : "Changer de rôle",
+    "按住说话" : "Appuyer pour parler",
+    "同传听译模式使用介绍":"Introduction à l'utilisation du mode d'interprétation simultanée",
+    "对话模式使用介绍" : "Introduction à l'utilisation du mode conversation",
+    "中英互译模式使用介绍" : "Introduction à l'utilisation du mode de traduction entre chinois et anglais",
+    "一方手持手机,一方戴上耳机,对手机发言时,耳机播放译文,对耳机发言时,手机播放译文" : "Une personne tient le téléphone, l'autre porte des oreillettes. Lorsqu'on parle au téléphone, l'oreillette diffuse la traduction ; lorsqu'on parle à l'oreillette, le téléphone diffuse la traduction",
+    "两人各佩戴一只耳机,选择源语言语种, 双方耳机中播放目标语言" : "Deux personnes portent chacune une oreillette, choisissent la langue source, et la langue cible est diffusée dans les oreillettes des deux parties",
+    "手机靠近音源收音,佩戴耳机收听译文" : "Approchez le téléphone de la source sonore pour capter le son, portez des oreillettes pour écouter la traduction",
+    "- 情景示例 -\n张张靠近手机讲中文,对方耳机播放英语" : "- Exemple de scénario -\nZhang Zhang parle chinois près du téléphone, l'oreillette de l'autre personne diffuse de l'anglais",
+    "- 情景示例 -\n张张戴一只耳机讲中文,双方耳机播放英文翻译 Lucy切换为英语发言后,双方耳机中播报中文翻译" : "- Exemple de scénario -\nZhang Zhang porte une oreillette et parle chinois, les oreillettes des deux parties diffusent la traduction en anglais. Après que Lucy passe à l'anglais, les oreillettes des deux parties diffusent la traduction en chinois",
+    "- 情景示例 -\nLisa对着手机讲英语,小徐耳机中播放中文" : "- Exemple de scénario -\nLisa parle anglais au téléphone, l'oreillette de Xiao Xu diffuse du chinois",
+    "开始体验" : "Commencer l'expérience",
+    "下次不再提示":"Ne plus afficher la prochaine fois",
+    "当前正在录音,确定放弃当前录音吗":"Enregistrement en cours, êtes-vous sûr de vouloir abandonner l'enregistrement actuel ?",
+    "云同步":"Synchronisation cloud",
+    "是否上传运存储空间备份":"Voulez-vous télécharger une sauvegarde dans l'espace de stockage cloud ?",
+    
+    "请选择语言":"Veuillez choisir une langue",
+    "中文" : "Chinois",
+    "英文" : "Anglais",
+    "日文" : "Japonais",
+    "韩文" : "Coréen",
+    "法文" : "Français",
+    "西班牙文" : "Espagnol",
+    "葡萄牙文" : "Portugais",
+    "印度尼西亚文" : "Indonésien",
+    "俄文" : "Russe",
+    "马来文" : "Malais",
+    
+    "保存录音" : "Enregistrer l'enregistrement",
+    "原文" : "Texte original",
+    "译文" : "Texte traduit",
+    "摘要" : "Résumé",
+    "翻译" : "Traduire",
+    "重命名" : "Renommer",
+    "播放录音" : "Lire l'enregistrement",
+    "更多" : "Plus",
+    "字号" : "Taille de police",
+    "分享" : "Partager",
+    "调整字号" : "Ajuster la taille de police",
+    "小" : "Petit",
+    "标准" : "Standard",
+    "大" : "Grand",
+    "设置" : "Paramètres",
+    "左耳" : "Oreille gauche",
+    "右耳" : "Oreille droite",
+    "耳机" : "Oreillette",
+    "手机" : "Téléphone",
+    "此处将显示原文" : "Le texte original s'affichera ici",
+    "此处将显示译文" : "Le texte traduit s'affichera ici",
+    "请输入..." : "Veuillez entrer...",
+    "筛选录音" : "Filtrer les enregistrements",
+    "全部录音":"Tous les enregistrements",
+    "收藏录音" : "Enregistrements favoris",
+    "多选" : "Sélection multiple",
+    "导出" : "Exporter",
+    "您要删除这些录音吗?" : "Voulez-vous supprimer ces enregistrements ?",
+    "删除后,这些记录将无法恢复。" : "Après suppression, ces enregistrements ne peuvent pas être restaurés.",
+    "删除后,此记录将无法恢复":"Après suppression, cet enregistrement ne peut pas être restauré",
+    "您要删除这条录音吗?":"Voulez-vous supprimer cet enregistrement ?",
+    
+    "多个文件将压缩成一个.zip的文件以便于分享。请选择您需要导出的文件类型:" : "Plusieurs fichiers seront compressés en un fichier .zip pour faciliter le partage. Veuillez choisir le type de fichier que vous souhaitez exporter :",
+    "仅音频文件" : "Seulement les fichiers audio",
+    "仅文档" : "Seulement les documents",
+    "音频文件" : "Fichiers audio",
+    "文档":"Documents",
+    
+    "白噪音":"Bruit blanc",
+    "EQ调音":"Réglage EQ",
+    "正常":"Normal",
+    "流行":"Pop",
+    "经典":"Classique",
+    "爵士":"Jazz",
+    "摇滚":"Rock",
+    "自定义":"Personnalisé",
+    "查找耳机":"Rechercher les oreillettes",
+    "自定义音效":"Effets sonores personnalisés",
+    "音效风格":"Style d'effet sonore",
+    "左耳机响铃":"Ringtone de l'oreillette gauche",
+    "右耳机响铃":"Ringtone de l'oreillette droite",
+    "耳机在附近,可通过响铃进行查找":"Les oreillettes sont à proximité, vous pouvez les trouver par le ringtone",
+    
+    "个智能设备":"appareils intelligents",
+    "云储存空间" : "Espace de stockage cloud",
+    "电子说明书" : "Manuel électronique",
+    "固件升级" : "Mise à niveau du firmware",
+    "语言设置" : "Paramètres de langue",
+    "更多设置" : "Plus de paramètres",
+    "帮助与反馈" : "Aide et retour",
+    "关于" : "À propos",
+    "设备详情":"Détails de l'appareil",
+    "设备名称":"Nom de l'appareil",
+    "设备ID":"ID de l'appareil",
+    "最近登录时间":"Dernière heure de connexion",
+    "移除设备":"Supprimer l'appareil",
+    "确定要解绑该设备吗?":"Êtes-vous sûr de vouloir délier cet appareil ?",
+    "移除设备后会同步退出账号,在此设备上将无法访问该账号的数据":"Après suppression de l'appareil, vous vous déconnecterez automatiquement du compte et ne pourrez plus accéder aux données du compte sur cet appareil",
+    "设备地址":"Adresse de l'appareil",
+    "硬件版本":"Version du matériel",
+    "软件版本":"Version du logiciel",
+    "设备信息":"Informations sur l'appareil",
+    
+    "账号设置" : "Paramètres du compte",
+    "登录方式" : "Mode de connexion",
+    "账号密码" : "Mot de passe du compte",
+    "安全手机" : "Téléphone sécurisé",
+    "安全邮箱" : "Email sécurisé",
+    "基本资料" : "Informations de base",
+    "登录设备管理" : "Gestion des appareils connectés",
+    "头像" : "Photo de profil",
+    "昵称" : "Pseudonyme",
+    "性别" : "Sexe",
+    "国家与地区" : "Pays et région",
+    "请输入昵称" : "Veuillez entrer un pseudonyme",
+    "男" : "Homme",
+    "女" : "Femme",
+    "保密" : "Confidentiel",
+    "国家/地区" : "Pays/Région",
+    "请输入新的安全手机号码" : "Veuillez entrer un nouveau numéro de téléphone sécurisé",
+    "请输入手机号码" : "Veuillez entrer un numéro de téléphone",
+    
+    "请输入新的安全邮箱地址" : "Veuillez entrer une nouvelle adresse email sécurisée",
+    "请输入邮箱地址" : "Veuillez entrer une adresse email",
+    "请使用安全手机":"Veuillez utiliser le téléphone sécurisé",
+    "请使用安全邮箱":"Veuillez utiliser l'email sécurisé",
+    "获取验证码短信":"Obtenir un SMS de vérification",
+    "请输入型号查询" : "Veuillez entrer le modèle pour rechercher",
+    "问题描述或建议" : "Description du problème ou suggestion",
+    "在线咨询" : "Consultation en ligne",
+    "问题类型" : "Type de problème",
+    "功能异常" : "Fonctionnalité anormale",
+    "意见与反馈" : "Commentaires et retour",
+    "联系方式" : "Coordonnées",
+    "请输入手机号或邮箱" : "Veuillez entrer un numéro de téléphone ou un email",
+    "请至少用10个字描述问题,并添加截图,这有助于问题快速解决。" : "Veuillez décrire le problème avec au moins 10 caractères et ajouter une capture d'écran, cela aidera à résoudre le problème rapidement.",
+    "反馈历史" : "Historique de feedback",
+    "你好,请问有什么我可以帮助到您" : "Bonjour, puis-je vous aider ?",
+    "请用一句话简单描述下您的问题~" : "Veuillez décrire brièvement votre problème en une phrase ~",
+    "猜你想问" : "On pense que vous voulez demander",
+    
+    
+    "当前版本" : "Version actuelle",
+    "检查更新" : "Vérifier les mises à jour",
+    "系统权限管理" : "Gestion des autorisations système",
+    "切换账号" : "Changer de compte",
+    "退出登录" : "Se déconnecter",
+    "注销账号" : "Supprimer le compte",
+    "提示" : "Indication",
+    "确定" : "Confirmer",
+    "确认" : "Valider",
+    "取消" : "Annuler",
+    "删除" : "Supprimer",
+    "下一步" : "Suivant",
+    "确定要切换账号吗?" : "Êtes-vous sûr de vouloir changer de compte ?",
+    "确定要退出登录吗?" : "Êtes-vous sûr de vouloir vous déconnecter ?",
+    "真的要注销账号吗?" : "Voulez-vous vraiment supprimer le compte ?",
+    "用户协议" : "Contrat utilisateur",
+    "隐私政策" : "Politique de confidentialité",
+    "个人信息手机清单" : "Liste des informations personnelles sur le téléphone",
+    "系统权限清单" : "Liste des autorisations système",
+    "撤回同意" : "Rétractation de l'accord",
+    "确认撤回" : "Confirmer la rétractation",
+    "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!" : "Veuillez vous assurer que vous êtes la partie concernée autorisée à procéder à cette opération de rétractation de l'accord sur la politique de confidentialité. En rétractant votre accord sur la politique de confidentialité, vous renoncerez aux biens ou droits suivants :\n\n1. Vidage des données\nLa collecte de vos informations personnelles cessera. Les données générées lors de l'utilisation de l'application DeepChords seront vidées ; les données mises en cache de l'application DeepChords sur le téléphone seront supprimées.\n\n2. Déliaison des appareils\nTous les appareils associés au compte DeepChords seront déliés du compte que vous utilisez actuellement, et les données précédemment stockées sur le serveur seront supprimées. Les données stockées sur les appareils physiques doivent être effacées par une réinitialisation physique locale manuelle. Si vous souhaitez réutiliser les appareils, vous devrez les lier à nouveau et réautoriser.\n\n3. Autres\nCette action rétractera également votre accord sur le contrat utilisateur et vous déconnectera de l'application DeepChords.\n\nVeuillez noter que la rétractation de l'accord sur la politique de confidentialité n'implique pas que les actes et responsabilités antérieurs à la rétractation sont exonérés ou atténués. Si vous souhaitez gérer à nouveau des appareils avec ce compte, vous devez réautoriser et relier. Veuillez procéder avec prudence !",
+    "您好, \n欢迎使用DeepChords" : "Bonjour, \nBienvenue sur DeepChords",
+    "用户登录" : "Connexion utilisateur",
+    "请输入密码" : "Veuillez entrer le mot de passe",
+    "请输入手机号码/邮箱":"Veuillez entrer le numéro de téléphone/email",
+    "登录并同意" : "Se connecter et accepter",
+    "《隐私政策》" : "《Politique de confidentialité》",
+    " 和 " : " et ",
+    "《用户协议》" : "《Contrat utilisateur》",
+    "忘记密码" : "Mot de passe oublié",
+    "验证码登录" : "Connexion par code de vérification",
+    "其他登录方式" : "Autres modes de connexion",
+    "用户注册" : "Inscription utilisateur",
+    "请输入验证码" : "Veuillez entrer le code de vérification",
+    "发送验证码":"Envoyer le code de vérification",
+    "点击获取" : "Cliquez pour obtenir",
+    "登录" : "Connexion",
+    "密码登录" : "Connexion par mot de passe",
+    "重置密码":"Réinitialiser le mot de passe",
+    "注册" : "Inscription",
+    "请输入正确的手机号码" : "Veuillez entrer un numéro de téléphone valide",
+    "请求失败" : "Requête échouée",
+    "请求成功!":"Requête réussie !",
+    "加载中...":"Chargement...",
+    "上传中...":"Téléchargement...",
+    "连接中":"Connexion en cours",
+    "连接成功":"Connexion réussie",
+    "连接失败":"Connexion échouée",
+    "智能体":"Agent intelligent",
+    "已成功更新到云储存空间":"Mise à jour réussie dans l'espace de stockage cloud",
+]
diff --git a/ShenYin/ShenYin/lan/indonesian.swift b/ShenYin/ShenYin/lan/indonesian.swift
new file mode 100644 (file)
index 0000000..2d88d5c
--- /dev/null
@@ -0,0 +1,228 @@
+//
+//  Untitled 2.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/11/11.
+//
+
+let indonesianMap:[String:String] =
+
+[
+    "智能" : "Cerdas",
+    "模式" : "Mode",
+    "睡眠" : "Tidur",
+    "客服" : "Layanan Pelanggan",
+    "我的" : "Milikku",
+    "设备":"Perangkat",
+    "已连接" : "Terhubung",
+    "未连接" : "Tidak Terhubung",
+    
+    "现场录音" : "Rekaman Langsung",
+    "随时随地,一键开录" : "Dimanapun dan kapanpun, rekam dengan satu klik",
+    "通话录音" : "Rekaman Panggilan",
+    "一键录音,翻译转写" : "Rekam dengan satu klik, terjemahkan dan transkripsi",
+    "中英互译" : "Penerjemahan Cina-Inggris",
+    "实时对话,即时互译" : "Percakapan real-time, penerjemahan instan",
+    "同传听译" : "Penerjemahan同声传译 (Tong Sheng Chuan Yi - Penerjemahan Simultan)",
+    "一机一耳,面对面畅聊" : "Satu perangkat dan satu earphone, berbincang secara tatap muka",
+    "对话翻译" : "Penerjemahan Percakapan",
+    "会议讲座,同步翻译" : "Rapat dan kuliah, penerjemahan sinkron",
+    "文本翻译" : "Penerjemahan Teks",
+    "即打即译,多语支持":"Tulis dan terjemahkan secara instan, mendukung banyak bahasa",
+    "历史记录" : "Riwayat",
+    "所有记录,一目了然" : "Semua catatan, jelas terlihat",
+    "智能对话" : "Percakapan Cerdas",
+    "伙伴,随叫随到" : "Teman, siap saat dipanggil",
+    "切换角色" : "Ganti Peran",
+    "按住说话" : "Tekan dan bicara",
+    "同传听译模式使用介绍":"Pengenalan Penggunaan Mode Penerjemahan Simultan",
+    "对话模式使用介绍" : "Pengenalan Penggunaan Mode Percakapan",
+    "中英互译模式使用介绍" : "Pengenalan Penggunaan Mode Penerjemahan Cina-Inggris",
+    "一方手持手机,一方戴上耳机,对手机发言时,耳机播放译文,对耳机发言时,手机播放译文" : "Satu pihak memegang ponsel, pihak lain memakai earphone, saat berbicara ke ponsel, earphone memutar terjemahan, saat berbicara ke earphone, ponsel memutar terjemahan",
+    "两人各佩戴一只耳机,选择源语言语种, 双方耳机中播放目标语言" : "Dua orang masing-masing memakai satu earphone, pilih bahasa sumber, bahasa target diputar di earphone kedua pihak",
+    "手机靠近音源收音,佩戴耳机收听译文" : "Ponsel mendekati sumber suara untuk merekam, gunakan earphone untuk mendengar terjemahan",
+    "- 情景示例 -\n张张靠近手机讲中文,对方耳机播放英语" : "- Contoh Skenario -\nZhang Zhang mendekati ponsel dan berbicara dalam bahasa Cina, earphone pihak lain memutar bahasa Inggris",
+    "- 情景示例 -\n张张戴一只耳机讲中文,双方耳机播放英文翻译 Lucy切换为英语发言后,双方耳机中播报中文翻译" : "- Contoh Skenario -\nZhang Zhang memakai satu earphone dan berbicara dalam bahasa Cina, earphone kedua pihak memutar terjemahan bahasa Inggris. Setelah Lucy beralih berbicara dalam bahasa Inggris, earphone kedua pihak memutar terjemahan bahasa Cina",
+    "- 情景示例 -\nLisa对着手机讲英语,小徐耳机中播放中文" : "- Contoh Skenario -\nLisa berbicara dalam bahasa Inggris ke ponsel, earphone Xiao Xu memutar bahasa Cina",
+    "开始体验" : "Mulai Pengalaman",
+    "下次不再提示":"Jangan Beri Peringatan Lagi",
+    "当前正在录音,确定放弃当前录音吗":"Sedang merekam, yakin ingin membatalkan rekaman saat ini?",
+    "云同步":"Sinkronisasi Cloud",
+    "是否上传运存储空间备份":"Apakah akan mengunggah cadangan ke ruang penyimpanan cloud?",
+    
+    "请选择语言":"Silakan Pilih Bahasa",
+    "中文" : "Bahasa Cina",
+    "英文" : "Bahasa Inggris",
+    "日文" : "Bahasa Jepang",
+    "韩文" : "Bahasa Korea",
+    "法文" : "Bahasa Prancis",
+    "西班牙文" : "Bahasa Spanyol",
+    "葡萄牙文" : "Bahasa Portugis",
+    "印度尼西亚文" : "Bahasa Indonesia",
+    "俄文" : "Bahasa Rusia",
+    "马来文" : "Bahasa Melayu",
+    
+    "保存录音" : "Simpan Rekaman",
+    "原文" : "Teks Asli",
+    "译文" : "Teks Terjemahan",
+    "摘要" : "Ringkasan",
+    "翻译" : "Terjemahkan",
+    "重命名" : "Ganti Nama",
+    "播放录音" : "Putar Rekaman",
+    "更多" : "Lebih Banyak",
+    "字号" : "Ukuran Font",
+    "分享" : "Bagikan",
+    "调整字号" : "Sesuaikan Ukuran Font",
+    "小" : "Kecil",
+    "标准" : "Standar",
+    "大" : "Besar",
+    "设置" : "Pengaturan",
+    "左耳" : "Telinga Kiri",
+    "右耳" : "Telinga Kanan",
+    "耳机" : "Earphone",
+    "手机" : "Ponsel",
+    "此处将显示原文" : "Teks asli akan ditampilkan di sini",
+    "此处将显示译文" : "Teks terjemahan akan ditampilkan di sini",
+    "请输入..." : "Silakan masukkan...",
+    "筛选录音" : "Saring Rekaman",
+    "全部录音":"Semua Rekaman",
+    "收藏录音" : "Rekaman Favorit",
+    "多选" : "Pemilihan Ganda",
+    "导出" : "Ekspor",
+    "您要删除这些录音吗?" : "Apakah Anda ingin menghapus rekaman ini?",
+    "删除后,这些记录将无法恢复。" : "Setelah dihapus, catatan ini tidak dapat dipulihkan.",
+    "删除后,此记录将无法恢复":"Setelah dihapus, catatan ini tidak dapat dipulihkan",
+    "您要删除这条录音吗?":"Apakah Anda ingin menghapus rekaman ini?",
+    
+    "多个文件将压缩成一个.zip的文件以便于分享。请选择您需要导出的文件类型:" : "Beberapa file akan dikompres menjadi satu file .zip untuk memudahkan berbagi. Silakan pilih jenis file yang ingin Anda ekspor:",
+    "仅音频文件" : "Hanya File Audio",
+    "仅文档" : "Hanya Dokumen",
+    "音频文件" : "File Audio",
+    "文档":"Dokumen",
+    
+    "白噪音":"Suara Putih",
+    "EQ调音":"Penyetelan EQ",
+    "正常":"Normal",
+    "流行":"Pop",
+    "经典":"Klasik",
+    "爵士":"Jazz",
+    "摇滚":"Rock",
+    "自定义":"Kustom",
+    "查找耳机":"Cari Earphone",
+    "自定义音效":"Efek Suara Kustom",
+    "音效风格":"Gaya Efek Suara",
+    "左耳机响铃":"Earphone Kiri Berdering",
+    "右耳机响铃":"Earphone Kanan Berdering",
+    "耳机在附近,可通过响铃进行查找":"Earphone berada di dekat, dapat ditemukan melalui deringan",
+    
+    "个智能设备":"perangkat cerdas",
+    "云储存空间" : "Ruang Penyimpanan Cloud",
+    "电子说明书" : "Panduan Elektronik",
+    "固件升级" : "Peningkatan Firmware",
+    "语言设置" : "Pengaturan Bahasa",
+    "更多设置" : "Pengaturan Lebih Banyak",
+    "帮助与反馈" : "Bantuan dan Umpan Balik",
+    "关于" : "Tentang",
+    "设备详情":"Detail Perangkat",
+    "设备名称":"Nama Perangkat",
+    "设备ID":"ID Perangkat",
+    "最近登录时间":"Waktu Login Terakhir",
+    "移除设备":"Hapus Perangkat",
+    "确定要解绑该设备吗?":"Yakin ingin membatalkan ikatan perangkat ini?",
+    "移除设备后会同步退出账号,在此设备上将无法访问该账号的数据":"Setelah perangkat dihapus, akun akan keluar secara sinkron, dan data akun tidak dapat diakses di perangkat ini",
+    "设备地址":"Alamat Perangkat",
+    "硬件版本":"Versi Perangkat Keras",
+    "软件版本":"Versi Perangkat Lunak",
+    "设备信息":"Informasi Perangkat",
+    
+    "账号设置" : "Pengaturan Akun",
+    "登录方式" : "Cara Login",
+    "账号密码" : "Kata Sandi Akun",
+    "安全手机" : "HP Aman",
+    "安全邮箱" : "Email Aman",
+    "基本资料" : "Profil Dasar",
+    "登录设备管理" : "Manajemen Perangkat Login",
+    "头像" : "Foto Profil",
+    "昵称" : "Nama Panggilan",
+    "性别" : "Jenis Kelamin",
+    "国家与地区" : "Negara dan Wilayah",
+    "请输入昵称" : "Silakan masukkan nama panggilan",
+    "男" : "Laki-laki",
+    "女" : "Perempuan",
+    "保密" : "Rahasia",
+    "国家/地区" : "Negara/Wilayah",
+    "请输入新的安全手机号码" : "Silakan masukkan nomor HP aman baru",
+    "请输入手机号码" : "Silakan masukkan nomor HP",
+    
+    "请输入新的安全邮箱地址" : "Silakan masukkan alamat email aman baru",
+    "请输入邮箱地址" : "Silakan masukkan alamat email",
+    "请使用安全手机":"Silakan gunakan HP aman",
+    "请使用安全邮箱":"Silakan gunakan email aman",
+    "获取验证码短信":"Dapatkan SMS Kode Verifikasi",
+    "请输入型号查询" : "Silakan masukkan model untuk pencarian",
+    "问题描述或建议" : "Deskripsi Masalah atau Saran",
+    "在线咨询" : "Konsultasi Online",
+    "问题类型" : "Jenis Masalah",
+    "功能异常" : "Fungsi Tidak Normal",
+    "意见与反馈" : "Komentar dan Umpan Balik",
+    "联系方式" : "Kontak",
+    "请输入手机号或邮箱" : "Silakan masukkan nomor HP atau email",
+    "请至少用10个字描述问题,并添加截图,这有助于问题快速解决。" : "Silakan deskripsikan masalah dengan setidaknya 10 karakter dan tambahkan tangkapan layar, ini akan membantu memecahkan masalah dengan cepat.",
+    "反馈历史" : "Riwayat Umpan Balik",
+    "你好,请问有什么我可以帮助到您" : "Halo, ada yang bisa saya bantu?",
+    "请用一句话简单描述下您的问题~" : "Silakan deskripsikan masalah Anda dengan satu kalimat sederhana~",
+    "猜你想问" : "Mungkin Anda ingin bertanya",
+    
+    
+    "当前版本" : "Versi Saat Ini",
+    "检查更新" : "Periksa Pembaruan",
+    "系统权限管理" : "Manajemen Izin Sistem",
+    "切换账号" : "Ganti Akun",
+    "退出登录" : "Keluar dari Akun",
+    "注销账号" : "Hapus Akun",
+    "提示" : "Peringatan",
+    "确定" : "Ya",
+    "确认" : "Konfirmasi",
+    "取消" : "Batal",
+    "删除" : "Hapus",
+    "下一步" : "Langkah Selanjutnya",
+    "确定要切换账号吗?" : "Yakin ingin mengganti akun?",
+    "确定要退出登录吗?" : "Yakin ingin keluar dari akun?",
+    "真的要注销账号吗?" : "Benar-benar ingin menghapus akun?",
+    "用户协议" : "Perjanjian Pengguna",
+    "隐私政策" : "Kebijakan Privasi",
+    "个人信息手机清单" : "Daftar Pengumpulan Informasi Pribadi",
+    "系统权限清单" : "Daftar Izin Sistem",
+    "撤回同意" : "Batalkan Persetujuan",
+    "确认撤回" : "Konfirmasi Pembatalan",
+    "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!" : "Silakan pastikan Anda adalah pihak terkait yang berwenang untuk melakukan operasi pembatalan persetujuan kebijakan privasi ini. Dengan membatalkan persetujuan kebijakan privasi, Anda akan meninggalkan aset atau hak berikut:\n\n1. Penghapusan Data\nPengumpulan informasi pribadi Anda akan dihentikan. Data yang dihasilkan selama Anda menggunakan aplikasi DeepChords akan dihapus; data cache aplikasi DeepChords di ponsel akan dihapus.\n\n2. Pembatalan Ikatan Perangkat\nSemua perangkat dalam akun DeepChords akan dilepaskan dari akun yang Anda login saat ini, dan data perangkat yang sebelumnya disimpan di server akan dihapus. Data yang disimpan di perangkat fisik harus dihapus melalui reset fisik lokal secara manual. Jika Anda perlu menggunakan perangkat kembali, Anda perlu melakukan ikatan kembali dan otorisasi ulang.\n\n3. Lainnya\nTindakan ini juga akan membatalkan persetujuan Anda terhadap perjanjian pengguna, dan keluar dari aplikasi DeepChords.\n\nHarap diketahui bahwa pembatalan persetujuan kebijakan privasi tidak berarti perilaku dan tanggung jawab sebelum pembatalan persetujuan dikecualikan atau dikurangi. Jika Anda perlu mengelola perangkat kembali dalam akun ini, Anda perlu memberikan otorisasi ulang dan melakukan ikatan kembali. Harap berhati-hati dalam beroperasi!",
+    "您好, \n欢迎使用DeepChords" : "Halo, \nSelamat datang menggunakan DeepChords",
+    "用户登录" : "Login Pengguna",
+    "请输入密码" : "Silakan masukkan kata sandi",
+    "请输入手机号码/邮箱":"Silakan masukkan nomor HP/email",
+    "登录并同意" : "Login dan Setujui",
+    "《隐私政策》" : "Kebijakan Privasi",
+    " 和 " : " dan ",
+    "《用户协议》" : "Perjanjian Pengguna",
+    "忘记密码" : "Lupa Kata Sandi",
+    "验证码登录" : "Login dengan Kode Verifikasi",
+    "其他登录方式" : "Cara Login Lainnya",
+    "用户注册" : "Registrasi Pengguna",
+    "请输入验证码" : "Silakan masukkan kode verifikasi",
+    "发送验证码":"Kirim Kode Verifikasi",
+    "点击获取" : "Klik untuk Mendapatkan",
+    "登录" : "Login",
+    "密码登录" : "Login dengan Kata Sandi",
+    "重置密码":"Atur Ulang Kata Sandi",
+    "注册" : "Registrasi",
+    "请输入正确的手机号码" : "Silakan masukkan nomor HP yang benar",
+    "请求失败" : "Permintaan Gagal",
+    "请求成功!":"Permintaan Berhasil!",
+    "加载中...":"Memuat...",
+    "上传中...":"Mengunggah...",
+    "连接中":"Menyambungkan...",
+    "连接成功":"Koneksi Berhasil",
+    "连接失败":"Koneksi Gagal",
+    "智能体":"Agen Cerdas",
+    "已成功更新到云储存空间":"Berhasil diperbarui ke ruang penyimpanan cloud",
+]
diff --git a/ShenYin/ShenYin/lan/japanese.swift b/ShenYin/ShenYin/lan/japanese.swift
new file mode 100644 (file)
index 0000000..c6c4e8f
--- /dev/null
@@ -0,0 +1,243 @@
+//
+//  Untitled 2.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/11/10.
+//
+
+let japaneseMap:[String:String] =
+
+[
+    "智能" : "スマート",
+    "模式" : "モード",
+    "睡眠" : "睡眠",
+    "客服" : "カスタマーサービス",
+    "我的" : "マイページ",
+    "设备":"デバイス",
+    "已连接" : "接続済み",
+    "未连接" : "未接続",
+    
+    "现场录音" : "現場録音",
+    "随时随地,一键开录" : "いつでもどこでも、一つのボタンで録音開始",
+    "通话录音" : "通話録音",
+    "一键录音,翻译转写" : "一括録音、翻訳と文字起こし",
+    "中英互译" : "中日相互翻訳",
+    "实时对话,即时互译" : "リアルタイム会話、即時相互翻訳",
+    "同传听译" : "同時通訳",
+    "一机一耳,面对面畅聊" : "1台のデバイスと1つのイヤホンで、対面で楽しく会話",
+    "对话翻译" : "会話翻訳",
+    "会议讲座,同步翻译" : "会議や講演、同期翻訳",
+    "文本翻译" : "テキスト翻訳",
+    "即打即译,多语支持":"入力しながら翻訳、複数言語対応",
+    "历史记录" : "履歴記録",
+    "所有记录,一目了然" : "すべての記録が一目でわかる",
+    "智能对话" : "スマート会話",
+    "伙伴,随叫随到" : "相棒、いつでも呼べる",
+    "切换角色" : "役割切り替え",
+    "按住说话" : "長押しして話す",
+    "同传听译模式使用介绍":"同時通訳モード使用説明",
+    "对话模式使用介绍" : "会話モード使用説明",
+    "中英互译模式使用介绍" : "中日相互翻訳モード使用説明",
+    "一方手持手机,一方戴上耳机,对手机发言时,耳机播放译文,对耳机发言时,手机播放译文" : "一方が携帯電話を持ち、もう一方がイヤホンをつける。携帯電話に話しかけると、イヤホンから訳文が再生され、イヤホンに話しかけると、携帯電話から訳文が再生されます",
+    "两人各佩戴一只耳机,选择源语言语种, 双方耳机中播放目标语言" : "2人がそれぞれイヤホンを1つずつ着用し、原語を選択すると、両方のイヤホンから目標言語が再生されます",
+    "手机靠近音源收音,佩戴耳机收听译文" : "携帯電話を音源に近づけて収音し、イヤホンを着用して訳文を聴く",
+    "- 情景示例 -\n张张靠近手机讲中文,对方耳机播放英语" : "- シナリオ例 -\n張さんが携帯電話に近づいて中国語で話すと、相手のイヤホンから英語が再生されます",
+    "- 情景示例 -\n张张戴一只耳机讲中文,双方耳机播放英文翻译 Lucy切换为英语发言后,双方耳机中播报中文翻译" : "- シナリオ例 -\n張さんがイヤホンを1つ着用して中国語で話すと、両方のイヤホンから英語の翻訳が再生されます。ルーシーが英語で話すように切り替えた後、両方のイヤホンから中国語の翻訳が放送されます",
+    "- 情景示例 -\nLisa对着手机讲英语,小徐耳机中播放中文" : "- シナリオ例 -\nリサが携帯電話に向かって英語で話すと、徐さんのイヤホンから中国語が再生されます",
+    "开始体验" : "体験を開始",
+    "下次不再提示":"次回から提示しない",
+    "当前正在录音,确定放弃当前录音吗":"現在録音中ですが、現在の録音を破棄してもよろしいですか",
+    "云同步":"クラウド同期",
+    "是否上传运存储空间备份":"クラウドストレージにアップロードしてバックアップしますか",
+    
+    "请选择语言":"言語を選択してください",
+    "中文" : "中国語",
+    "英文" : "英語",
+    "日文" : "日本語",
+    "韩文" : "韓国語",
+    "法文" : "フランス語",
+    "西班牙文" : "スペイン語",
+    "葡萄牙文" : "ポルトガル語",
+    "印度尼西亚文" : "インドネシア語",
+    "俄文" : "ロシア語",
+    "马来文" : "マレー語",
+    
+    "保存录音" : "録音を保存",
+    "原文" : "原文",
+    "译文" : "訳文",
+    "摘要" : "概要",
+    "翻译" : "翻訳",
+    "重命名" : "名前を変更",
+    "播放录音" : "録音を再生",
+    "更多" : "もっと",
+    "字号" : "フォントサイズ",
+    "分享" : "共有",
+    "调整字号" : "フォントサイズを調整",
+    "小" : "小",
+    "标准" : "標準",
+    "大" : "大",
+    "设置" : "設定",
+    "左耳" : "左耳",
+    "右耳" : "右耳",
+    "耳机" : "イヤホン",
+    "手机" : "携帯電話",
+    "此处将显示原文" : "ここに原文が表示されます",
+    "此处将显示译文" : "ここに訳文が表示されます",
+    "请输入..." : "入力してください...",
+    "筛选录音" : "録音をフィルタリング",
+    "全部录音":"すべての録音",
+    "收藏录音" : "録音をお気に入り",
+    "多选" : "複数選択",
+    "导出" : "エクスポート",
+    "您要删除这些录音吗?" : "これらの録音を削除しますか?",
+    "删除后,这些记录将无法恢复。" : "削除後、これらの記録は復元できません。",
+    "删除后,此记录将无法恢复":"削除後、この記録は復元できません",
+    "您要删除这条录音吗?":"この録音を削除しますか?",
+    
+    "多个文件将压缩成一个.zip的文件以便于分享。请选择您需要导出的文件类型:" : "複数のファイルは共有しやすいように1つの.zipファイルに圧縮されます。エクスポートするファイルの種類を選択してください:",
+    "仅音频文件" : "オーディオファイルのみ",
+    "仅文档" : "ドキュメントのみ",
+    "音频文件" : "オーディオファイル",
+    "文档":"ドキュメント",
+    
+    "白噪音":"ホワイトノイズ",
+    "EQ调音":"EQ調整",
+    "正常":"通常",
+    "流行":"ポップ",
+    "经典":"クラシック",
+    "爵士":"ジャズ",
+    "摇滚":"ロック",
+    "自定义":"カスタム",
+    "查找耳机":"イヤホンを探す",
+    "自定义音效":"カスタムサウンドエフェクト",
+    "音效风格":"サウンドエフェクトスタイル",
+    "左耳机响铃":"左イヤホンが鳴る",
+    "右耳机响铃":"右イヤホンが鳴る",
+    "耳机在附近,可通过响铃进行查找":"イヤホンは近くにあり、鳴動で探すことができます",
+    
+    "个智能设备":"個のスマートデバイス",
+    "云储存空间" : "クラウドストレージスペース",
+    "电子说明书" : "電子取扱説明書",
+    "固件升级" : "ファームウェアアップグレード",
+    "语言设置" : "言語設定",
+    "更多设置" : "その他の設定",
+    "帮助与反馈" : "ヘルプとフィードバック",
+    "关于" : "について",
+    "设备详情":"デバイス詳細",
+    "设备名称":"デバイス名",
+    "设备ID":"デバイスID",
+    "最近登录时间":"最終ログイン時間",
+    "移除设备":"デバイスを削除",
+    "确定要解绑该设备吗?":"このデバイスのバインドを解除してもよろしいですか?",
+    "移除设备后会同步退出账号,在此设备上将无法访问该账号的数据":"デバイスを削除するとアカウントが同期してログアウトされ、このデバイスでは該当アカウントのデータにアクセスできなくなります",
+    "设备地址":"デバイスアドレス",
+    "硬件版本":"ハードウェアバージョン",
+    "软件版本":"ソフトウェアバージョン",
+    "设备信息":"デバイス情報",
+    
+    "账号设置" : "アカウント設定",
+    "登录方式" : "ログイン方法",
+    "账号密码" : "アカウントパスワード",
+    "安全手机" : "セキュリティ携帯電話",
+    "安全邮箱" : "セキュリティメール",
+    "基本资料" : "基本情報",
+    "登录设备管理" : "ログインデバイス管理",
+    "头像" : "アバター",
+    "昵称" : "ニックネーム",
+    "性别" : "性別",
+    "国家与地区" : "国と地域",
+    "请输入昵称" : "ニックネームを入力してください",
+    "男" : "男",
+    "女" : "女",
+    "保密" : "秘密",
+    "国家/地区" : "国/地域",
+    "请输入新的安全手机号码" : "新しいセキュリティ携帯電話番号を入力してください",
+    "请输入手机号码" : "携帯電話番号を入力してください",
+    
+    "请输入新的安全邮箱地址" : "新しいセキュリティメールアドレスを入力してください",
+    "请输入邮箱地址" : "メールアドレスを入力してください",
+    "请使用安全手机":"セキュリティ携帯電話を使用してください",
+    "请使用安全邮箱":"セキュリティメールを使用してください",
+    "获取验证码短信":"認証コードSMSを取得",
+    "请输入型号查询" : "型番を入力して検索してください",
+    "问题描述或建议" : "問題の説明または提案",
+    "在线咨询" : "オンライン相談",
+    "问题类型" : "問題の種類",
+    "功能异常" : "機能異常",
+    "意见与反馈" : "意見とフィードバック",
+    "联系方式" : "連絡先",
+    "请输入手机号或邮箱" : "携帯電話番号またはメールアドレスを入力してください",
+    "请至少用10个字描述问题,并添加截图,这有助于问题快速解决。" : "問題を少なくとも10文字で説明し、スクリーンショットを添付してください。これにより問題の迅速な解決に役立ちます。",
+    "反馈历史" : "フィードバック履歴",
+    "你好,请问有什么我可以帮助到您" : "こんにちは、何かお手伝いできることがありますか",
+    "请用一句话简单描述下您的问题~" : "一言で簡単に問題を説明してください~",
+    "猜你想问" : "お尋ねしたいかもしれないこと",
+    
+    
+    "当前版本" : "現在のバージョン",
+    "检查更新" : "更新を確認",
+    "系统权限管理" : "システム権限管理",
+    "切换账号" : "アカウントを切り替え",
+    "退出登录" : "ログアウト",
+    "注销账号" : "アカウントを削除",
+    "提示" : "ヒント",
+    "确定" : "確定",
+    "确认" : "確認",
+    "取消" : "キャンセル",
+    "删除" : "削除",
+    "下一步" : "次へ",
+    "确定要切换账号吗?" : "アカウントを切り替えてもよろしいですか?",
+    "确定要退出登录吗?" : "ログアウトしてもよろしいですか?",
+    "真的要注销账号吗?" : "本当にアカウントを削除しますか?",
+    "用户协议" : "ユーザー契約",
+    "隐私政策" : "プライバシーポリシー",
+    "个人信息手机清单" : "個人情報収集リスト",
+    "系统权限清单" : "システム権限リスト",
+    "撤回同意" : "同意を撤回",
+    "确认撤回" : "撤回を確認",
+    "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!" : "プライバシーポリシーへの同意を撤回する操作を行う権限がある関係者であることを確認してください。プライバシーポリシーへの同意を撤回すると、以下の資産または権益を放棄することになります:\n\n1.データの消去\n個人情報の収集を停止します。DeepChordsアプリを使用する過程で生成されたデータは消去され、携帯電話内のDeepChordsアプリのキャッシュデータも清除されます。\n\n2.デバイスのバインド解除\nDeepChordsアカウント内のすべてのデバイスは、現在ログインしているアカウントからバインドが解除され、サーバーに以前に保存されたデバイスのデータが清除されます。物理デバイスに保存されているデータは、手動でローカルリセットすることで清除してください。デバイスを再び使用する場合は、再度バインドして再授権する必要があります。\n\n3.その他\nこの操作により、ユーザー契約への同意も撤回され、DeepChordsアプリからログアウトされます。\n\n同意を撤回する前の関連行為と責任が免除または軽減されるものではないことをご承知ください。このアカウントで再度デバイスを管理する場合は、再授権と再バインドが必要です。慎重に操作してください!",
+    "您好, \n欢迎使用DeepChords" : "こんにちは、\nDeepChordsをご利用いただきありがとうございます",
+    "用户登录" : "ユーザーログイン",
+    "请输入密码" : "パスワードを入力してください",
+    "请输入手机号码/邮箱":"携帯電話番号/メールアドレスを入力してください",
+    "登录并同意" : "ログインして同意",
+    "《隐私政策》" : "「プライバシーポリシー」",
+    " 和 " : " 及び ",
+    "《用户协议》" : "「ユーザー契約」",
+    "忘记密码" : "パスワードを忘れた",
+    "验证码登录" : "認証コードでログイン",
+    "其他登录方式" : "その他のログイン方法",
+    "用户注册" : "ユーザー登録",
+    "请输入验证码" : "認証コードを入力してください",
+    "发送验证码":"認証コードを送信",
+    "点击获取" : "クリックして取得",
+    "登录" : "ログイン",
+    "密码登录" : "パスワードでログイン",
+    "重置密码":"パスワードをリセット",
+    "注册" : "登録",
+    "请输入正确的手机号码" : "正しい携帯電話番号を入力してください",
+    "请求失败" : "リクエストが失敗しました",
+    "请求成功!":"リクエストが成功しました!",
+    "加载中...":"読み込み中...",
+    "上传中...":"アップロード中...",
+    "连接中":"接続中",
+    "连接成功":"接続成功",
+    "连接失败":"接続失敗",
+    "智能体":"インテリジェントエージェント",
+    "已成功更新到云储存空间":"クラウドストレージスペースに正常に更新されました",
+]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ShenYin/ShenYin/lan/korean.swift b/ShenYin/ShenYin/lan/korean.swift
new file mode 100644 (file)
index 0000000..7ff345b
--- /dev/null
@@ -0,0 +1,227 @@
+//
+//  Untitled.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/11/11.
+//
+
+let koreanMap:[String:String] =
+[
+    "智能" : "지능형",
+    "模式" : "모드",
+    "睡眠" : "수면",
+    "客服" : "고객 서비스",
+    "我的" : "내 것",
+    "设备":"장치",
+    "已连接" : "연결됨",
+    "未连接" : "연결되지 않음",
+    
+    "现场录音" : "현장 녹음",
+    "随时随地,一键开录" : "언제 어디서나 한 번 클릭으로 녹음 시작",
+    "通话录音" : "통화 녹음",
+    "一键录音,翻译转写" : "한 번 클릭으로 녹음 및 번역 전사",
+    "中英互译" : "중영 상호 번역",
+    "实时对话,即时互译" : "실시간 대화, 즉시 상호 번역",
+    "同传听译" : "동시 통역 청취",
+    "一机一耳,面对面畅聊" : "한 기기와 한 귀걸이로 면대면 자유롭게 대화",
+    "对话翻译" : "대화 번역",
+    "会议讲座,同步翻译" : "회의 및 강의, 동기화 번역",
+    "文本翻译" : "텍스트 번역",
+    "即打即译,多语支持":"입력 즉시 번역, 다국어 지원",
+    "历史记录" : "이력 기록",
+    "所有记录,一目了然" : "모든 기록, 한눈에 보임",
+    "智能对话" : "지능형 대화",
+    "伙伴,随叫随到" : "동료, 언제나 부를 수 있음",
+    "切换角色" : "역할 전환",
+    "按住说话" : "눌러서 말하기",
+    "同传听译模式使用介绍":"동시 통역 청취 모드 사용 설명",
+    "对话模式使用介绍" : "대화 모드 사용 설명",
+    "中英互译模式使用介绍" : "중영 상호 번역 모드 사용 설명",
+    "一方手持手机,一方戴上耳机,对手机发言时,耳机播放译文,对耳机发言时,手机播放译文" : "한쪽은 휴대폰을 들고, 다른 한쪽은 이어폰을 쓰고, 휴대폰에 말하면 이어폰에서 번역문을 재생하고, 이어폰에 말하면 휴대폰에서 번역문을 재생",
+    "两人各佩戴一只耳机,选择源语言语种, 双方耳机中播放目标语言" : "두 사람이 각자 이어폰 하나씩 착용하고, 원본 언어를 선택하면 양쪽 이어폰에서 목표 언어가 재생됨",
+    "手机靠近音源收音,佩戴耳机收听译文" : "휴대폰을 음원에 가까이 가져가서 수음하고, 이어폰을 착용하여 번역문을 청취",
+    "- 情景示例 -\n张张靠近手机讲中文,对方耳机播放英语" : "- 시나리오 예시 -\n장장이 휴대폰에 가까이 가서 중국어로 말하면 상대방 이어폰에서 영어가 재생됨",
+    "- 情景示例 -\n张张戴一只耳机讲中文,双方耳机播放英文翻译 Lucy切换为英语发言后,双方耳机中播报中文翻译" : "- 시나리오 예시 -\n장장이 이어폰 하나를 쓰고 중국어로 말하면 양쪽 이어폰에서 영어 번역이 재생됨 Lucy가 영어로 전환하여 발언한 후, 양쪽 이어폰에서 중국어 번역이 방송됨",
+    "- 情景示例 -\nLisa对着手机讲英语,小徐耳机中播放中文" : "- 시나리오 예시 -\nLisa가 휴대폰에对着 영어로 말하면 소서 이어폰에서 중국어가 재생됨",
+    "开始体验" : "체험 시작",
+    "下次不再提示":"다음에는 다시提示하지 않음",
+    "当前正在录音,确定放弃当前录音吗":"현재 녹음 중입니다. 현재 녹음을 포기하시겠습니까",
+    "云同步":"클라우드 동기화",
+    "是否上传运存储空间备份":"클라우드 저장 공간에 백업을 업로드하시겠습니까",
+    
+    "请选择语言":"언어를 선택하세요",
+    "中文" : "중국어",
+    "英文" : "영어",
+    "日文" : "일본어",
+    "韩文" : "한국어",
+    "法文" : "프랑스어",
+    "西班牙文" : "스페인어",
+    "葡萄牙文" : "포르투갈어",
+    "印度尼西亚文" : "인도네시아어",
+    "俄文" : "러시아어",
+    "马来文" : "말레이어",
+    
+    "保存录音" : "녹음 저장",
+    "原文" : "원문",
+    "译文" : "번역문",
+    "摘要" : "요약",
+    "翻译" : "번역",
+    "重命名" : "이름 바꾸기",
+    "播放录音" : "녹음 재생",
+    "更多" : "더 보기",
+    "字号" : "글자 크기",
+    "分享" : "공유",
+    "调整字号" : "글자 크기 조정",
+    "小" : "작음",
+    "标准" : "표준",
+    "大" : "큼",
+    "设置" : "설정",
+    "左耳" : "왼쪽 귀",
+    "右耳" : "오른쪽 귀",
+    "耳机" : "이어폰",
+    "手机" : "휴대폰",
+    "此处将显示原文" : "여기에 원문이 표시됩니다",
+    "此处将显示译文" : "여기에 번역문이 표시됩니다",
+    "请输入..." : "입력하세요...",
+    "筛选录音" : "녹음 필터링",
+    "全部录音":"모든 녹음",
+    "收藏录音" : "녹음 즐겨찾기",
+    "多选" : "여러 개 선택",
+    "导出" : "내보내기",
+    "您要删除这些录音吗?" : "이 녹음들을 삭제하시겠습니까?",
+    "删除后,这些记录将无法恢复。" : "삭제 후에는 이러한 기록을 복구할 수 없습니다.",
+    "删除后,此记录将无法恢复":"삭제 후에는 이 기록을 복구할 수 없습니다",
+    "您要删除这条录音吗?":"이 녹음을 삭제하시겠습니까?",
+    
+    "多个文件将压缩成一个.zip的文件以便于分享。请选择您需要导出的文件类型:" : "여러 파일이 공유하기 쉽도록 .zip 파일로 압축됩니다. 내보낼 파일 유형을 선택하세요:",
+    "仅音频文件" : "오디오 파일만",
+    "仅文档" : "문서만",
+    "音频文件" : "오디오 파일",
+    "文档":"문서",
+    
+    "白噪音":"백색 소음",
+    "EQ调音":"EQ 음량 조정",
+    "正常":"보통",
+    "流行":"팝",
+    "经典":"클래식",
+    "爵士":"재즈",
+    "摇滚":"락",
+    "自定义":"사용자 정의",
+    "查找耳机":"이어폰 찾기",
+    "自定义音效":"사용자 정의 음效",
+    "音效风格":"음效 스타일",
+    "左耳机响铃":"왼쪽 이어폰 벨 울림",
+    "右耳机响铃":"오른쪽 이어폰 벨 울림",
+    "耳机在附近,可通过响铃进行查找":"이어폰이 근처에 있으면 벨소리를 통해 찾을 수 있습니다",
+    
+    "个智能设备":"개의 지능형 장치",
+    "云储存空间" : "클라우드 저장 공간",
+    "电子说明书" : "전자 설명서",
+    "固件升级" : "펌웨어 업그레이드",
+    "语言设置" : "언어 설정",
+    "更多设置" : "더 많은 설정",
+    "帮助与反馈" : "도움말 및 피드백",
+    "关于" : "정보",
+    "设备详情":"장치 세부 정보",
+    "设备名称":"장치 이름",
+    "设备ID":"장치 ID",
+    "最近登录时间":"최근 로그인 시간",
+    "移除设备":"장치 제거",
+    "确定要解绑该设备吗?":"이 장치의 바인딩을 해제하시겠습니까?",
+    "移除设备后会同步退出账号,在此设备上将无法访问该账号的数据":"장치를 제거하면 계정에서 동시에 로그아웃되며, 이 장치에서는 해당 계정의 데이터에 액세스할 수 없습니다",
+    "设备地址":"장치 주소",
+    "硬件版本":"하드웨어 버전",
+    "软件版本":"소프트웨어 버전",
+    "设备信息":"设备信息",
+    
+    "账号设置" : "계정 설정",
+    "登录方式" : "로그인 방식",
+    "账号密码" : "계정 비밀번호",
+    "安全手机" : "보안 휴대폰",
+    "安全邮箱" : "보안 이메일",
+    "基本资料" : "기본 정보",
+    "登录设备管理" : "로그인 장치 관리",
+    "头像" : "프로필 사진",
+    "昵称" : "별명",
+    "性别" : "성별",
+    "国家与地区" : "국가 및 지역",
+    "请输入昵称" : "별명을 입력하세요",
+    "男" : "남성",
+    "女" : "여성",
+    "保密" : "비공개",
+    "国家/地区" : "국가/지역",
+    "请输入新的安全手机号码" : "새로운 보안 휴대폰 번호를 입력하세요",
+    "请输入手机号码" : "휴대폰 번호를 입력하세요",
+    
+    "请输入新的安全邮箱地址" : "새로운 보안 이메일 주소를 입력하세요",
+    "请输入邮箱地址" : "이메일 주소를 입력하세요",
+    "请使用安全手机":"보안 휴대폰을 사용하세요",
+    "请使用安全邮箱":"보안 이메일을 사용하세요",
+    "获取验证码短信":"인증 코드 SMS 받기",
+    "请输入型号查询" : "모델 번호를 입력하여 검색하세요",
+    "问题描述或建议" : "문제 설명 또는 제안",
+    "在线咨询" : "온라인 상담",
+    "问题类型" : "문제 유형",
+    "功能异常" : "기능 이상",
+    "意见与反馈" : "의견 및 피드백",
+    "联系方式" : "연락처",
+    "请输入手机号或邮箱" : "휴대폰 번호 또는 이메일을 입력하세요",
+    "请至少用10个字描述问题,并添加截图,这有助于问题快速解决。" : "문제를 최소 10자 이상으로 설명하고 스크린샷을 추가하세요. 이는 문제를 빠르게 해결하는 데 도움이 됩니다.",
+    "反馈历史" : "피드백 기록",
+    "你好,请问有什么我可以帮助到您" : "안녕하세요, 무엇을 도와드릴까요",
+    "请用一句话简单描述下您的问题~" : "한 문장으로 간단히 문제를 설명해주세요~",
+    "猜你想问" : "궁금하실 만한 질문",
+    
+    
+    "当前版本" : "현재 버전",
+    "检查更新" : "업데이트 확인",
+    "系统权限管理" : "시스템 권한 관리",
+    "切换账号" : "계정 전환",
+    "退出登录" : "로그아웃",
+    "注销账号" : "계정 삭제",
+    "提示" : "알림",
+    "确定" : "확인",
+    "确认" : "확인",
+    "取消" : "취소",
+    "删除" : "삭제",
+    "下一步" : "다음 단계",
+    "确定要切换账号吗?" : "계정을 전환하시겠습니까?",
+    "确定要退出登录吗?" : "로그아웃하시겠습니까?",
+    "真的要注销账号吗?" : "정말로 계정을 삭제하시겠습니까?",
+    "用户协议" : "사용자 계약",
+    "隐私政策" : "개인 정보 보호 정책",
+    "个人信息手机清单" : "개인 정보 수집 목록",
+    "系统权限清单" : "시스템 권한 목록",
+    "撤回同意" : "동의 철회",
+    "确认撤回" : "철회 확인",
+    "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!" : "개인 정보 보호 정책에 대한 동의를 철회하는 작업을 수행할 권한이 있는 당사자임을 확인해 주세요. 개인 정보 보호 정책에 대한 동의를 철회하면 다음 자산 또는 권리를 포기하게 됩니다:\n\n1.데이터 삭제\n개인 정보 수집이 중단됩니다. DeepChords 앱을 사용하는 과정에서 생성된 데이터가 삭제되고; 휴대폰에 있는 DeepChords 앱의 캐시 데이터가 삭제됩니다.\n\n2.장치 바인딩 해제\nDeepChords 계정에서 모든 장치가 현재 로그인한 계정과의 바인딩이 해제되고, 서버에 저장된 장치의 이전 데이터가 삭제됩니다. 물리적 장치에 저장된 데이터는 수동으로 로컬 물리적 리셋을 통해 삭제해야 합니다. 장치를 다시 사용하려면 다시 바인딩하고 재승인해야 합니다.\n\n3.기타\n이 작업은 사용자 계약에 대한 동의도 철회하고 DeepChords 앱을 종료합니다.\n\n개인 정보 보호 정책에 대한 동의를 철회해도 동의 철회 전의 관련 행위와 책임이 면제되거나 경감되지 않음을 알려드립니다. 해당 계정에서 장치를 다시 관리하려면 다시 승인하고 바인딩해야 합니다. 신중하게操作해 주세요!",
+    "您好, \n欢迎使用DeepChords" : "안녕하세요, \nDeepChords를 사용해 주셔서 감사합니다",
+    "用户登录" : "사용자 로그인",
+    "请输入密码" : "비밀번호를 입력하세요",
+    "请输入手机号码/邮箱":"휴대폰 번호/이메일을 입력하세요",
+    "登录并同意" : "로그인하고 동의",
+    "《隐私政策》" : "《개인 정보 보호 정책》",
+    " 和 " : " 그리고 ",
+    "《用户协议》" : "《사용자 계약》",
+    "忘记密码" : "비밀번호 잊음",
+    "验证码登录" : "인증 코드로 로그인",
+    "其他登录方式" : "기타 로그인 방식",
+    "用户注册" : "사용자 등록",
+    "请输入验证码" : "인증 코드를 입력하세요",
+    "发送验证码":"인증 코드 보내기",
+    "点击获取" : "클릭하여 받기",
+    "登录" : "로그인",
+    "密码登录" : "비밀번호로 로그인",
+    "重置密码":"비밀번호 재설정",
+    "注册" : "등록",
+    "请输入正确的手机号码" : "올바른 휴대폰 번호를 입력하세요",
+    "请求失败" : "요청 실패",
+    "请求成功!":"요청 성공!",
+    "加载中...":"로딩 중...",
+    "上传中...":"업로드 중...",
+    "连接中":"연결 중",
+    "连接成功":"연결 성공",
+    "连接失败":"연결 실패",
+    "智能体":"지능체",
+    "已成功更新到云储存空间":"클라우드 저장 공간에 성공적으로 업데이트되었습니다",
+]
diff --git a/ShenYin/ShenYin/lan/malay.swift b/ShenYin/ShenYin/lan/malay.swift
new file mode 100644 (file)
index 0000000..1c371a9
--- /dev/null
@@ -0,0 +1,223 @@
+
+
+let malayMap:[String:String] =
+
+[
+    "智能" : "Pintar",
+    "模式" : "Mod",
+    "睡眠" : "Tidur",
+    "客服" : "Pelayanan Pelanggan",
+    "我的" : "Saya",
+    "设备":"Peranti",
+    "已连接" : "Telah Disambungkan",
+    "未连接" : "Tidak Disambungkan",
+    
+    "现场录音" : "Rekaman Langsung",
+    "随时随地,一键开录" : "Di mana sahaja dan bila sahaja, rekam dengan satu klik",
+    "通话录音" : "Rekaman Panggilan",
+    "一键录音,翻译转写" : "Rekam dengan satu klik, terjemahkan dan transkripsi",
+    "中英互译" : "Terjemahan antara Cina dan Inggeris",
+    "实时对话,即时互译" : "Perbualan segerak, terjemahan serta-merta",
+    "同传听译" : "Terjemahan同声传译 (Simultaneous Interpretation)",
+    "一机一耳,面对面畅聊" : "Satu telefon dan satu earphone, berbual secara berhadapan dengan lancar",
+    "对话翻译" : "Terjemahan Perbualan",
+    "会议讲座,同步翻译" : "Mesyuarat dan ceramah, terjemahan segerak",
+    "文本翻译" : "Terjemahan Teks",
+    "即打即译,多语支持":"Terjemahan serta-merta semasa menaip, sokongan pelbagai bahasa",
+    "历史记录" : "Rekod Sejarah",
+    "所有记录,一目了然" : "Semua rekod, jelas pada pandangan pertama",
+    "智能对话" : "Perbualan Pintar",
+    "伙伴,随叫随到" : "Rakan, sedia bila dipanggil",
+    "切换角色" : "Tukar Watak",
+    "按住说话" : "Tekan dan bercakap",
+    "同传听译模式使用介绍":"Panduan Penggunaan Mod Terjemahan Simultana",
+    "对话模式使用介绍" : "Panduan Penggunaan Mod Perbualan",
+    "中英互译模式使用介绍" : "Panduan Penggunaan Mod Terjemahan Cina-Inggeris",
+    "一方手持手机,一方戴上耳机,对手机发言时,耳机播放译文,对耳机发言时,手机播放译文" : "Satu pihak memegang telefon, satu pihak memakai earphone. Apabila bercakap kepada telefon, earphone memainkan terjemahan; apabila bercakap kepada earphone, telefon memainkan terjemahan",
+    "两人各佩戴一只耳机,选择源语言语种, 双方耳机中播放目标语言" : "Dua orang masing-masing memakai satu earphone, pilih bahasa sumber, dan kedua-dua earphone memainkan bahasa sasaran",
+    "手机靠近音源收音,佩戴耳机收听译文" : "Telefon menghampiri sumber bunyi untuk menerima bunyi, gunakan earphone untuk mendengar terjemahan",
+    "- 情景示例 -\n张张靠近手机讲中文,对方耳机播放英语" : "- Contoh Situasi -\nZhang Zhang menghampiri telefon dan bercakap dalam bahasa Cina, earphone pihak lain memainkan bahasa Inggeris",
+    "- 情景示例 -\n张张戴一只耳机讲中文,双方耳机播放英文翻译 Lucy切换为英语发言后,双方耳机中播报中文翻译" : "- Contoh Situasi -\nZhang Zhang memakai satu earphone dan bercakap dalam bahasa Cina, kedua-dua earphone memainkan terjemahan Inggeris. Selepas Lucy bertukar untuk bercakap dalam bahasa Inggeris, kedua-dua earphone memainkan terjemahan bahasa Cina",
+    "- 情景示例 -\nLisa对着手机讲英语,小徐耳机中播放中文" : "- Contoh Situasi -\nLisa bercakap dalam bahasa Inggeris kepada telefon, earphone Xiao Xu memainkan bahasa Cina",
+    "开始体验" : "Mula Pengalaman",
+    "下次不再提示":"Jangan Beri Petunjuk Lagi Selepas Ini",
+    "当前正在录音,确定放弃当前录音吗":"Sedang merekam sekarang, adakah anda pasti ingin meninggalkan rekaman semasa?",
+    "云同步":"Sinkronisasi Awan",
+    "是否上传运存储空间备份":"Adakah ingin memuat naik fail sandaran ke ruang penyimpanan awan?",
+    
+    "请选择语言":"Sila Pilih Bahasa",
+    "中文" : "Bahasa Cina",
+    "英文" : "Bahasa Inggeris",
+    "日文" : "Bahasa Jepun",
+    "韩文" : "Bahasa Korea",
+    "法文" : "Bahasa Perancis",
+    "西班牙文" : "Bahasa Sepanyol",
+    "葡萄牙文" : "Bahasa Portugis",
+    "印度尼西亚文" : "Bahasa Indonesia",
+    "俄文" : "Bahasa Rusia",
+    "马来文" : "Bahasa Melayu",
+    
+    "保存录音" : "Simpan Rekaman",
+    "原文" : "Teks Asli",
+    "译文" : "Teks Terjemahan",
+    "摘要" : "Ringkasan",
+    "翻译" : "Terjemah",
+    "重命名" : "Namakan Semula",
+    "播放录音" : "Mainkan Rekaman",
+    "更多" : "Lebih Banyak",
+    "字号" : "Saiz Font",
+    "分享" : "Kongsi",
+    "调整字号" : "Tukar Saiz Font",
+    "小" : "Kecil",
+    "标准" : "Standard",
+    "大" : "Besar",
+    "设置" : "Tetapan",
+    "左耳" : "Telinga Kiri",
+    "右耳" : "Telinga Kanan",
+    "耳机" : "Earphone",
+    "手机" : "Telefon",
+    "此处将显示原文" : "Teks asli akan dipaparkan di sini",
+    "此处将显示译文" : "Teks terjemahan akan dipaparkan di sini",
+    "请输入..." : "Sila masukkan...",
+    "筛选录音" : "Saring Rekaman",
+    "全部录音":"Semua Rekaman",
+    "收藏录音" : "Simpan Rekaman kegemaran",
+    "多选" : "Pilihan Berbilang",
+    "导出" : "Eksport",
+    "您要删除这些录音吗?" : "Adakah anda ingin memadamkan rekaman ini?",
+    "删除后,这些记录将无法恢复。" : "Selepas dipadam, rekod ini tidak boleh dipulihkan.",
+    "删除后,此记录将无法恢复":"Selepas dipadam, rekod ini tidak boleh dipulihkan",
+    "您要删除这条录音吗?":"Adakah anda ingin memadamkan rekaman ini?",
+    
+    "多个文件将压缩成一个.zip的文件以便于分享。请选择您需要导出的文件类型:" : "Pelbagai fail akan dimampatkan menjadi fail .zip untuk kemudahan perkongsian. Sila pilih jenis fail yang ingin anda eksport:",
+    "仅音频文件" : "Hanya Fail Audio",
+    "仅文档" : "Hanya Dokumen",
+    "音频文件" : "Fail Audio",
+    "文档":"Dokumen",
+    
+    "白噪音":"Hujan Putih (White Noise)",
+    "EQ调音":"Penalaan EQ",
+    "正常":"Normal",
+    "流行":"Pop",
+    "经典":"Klasik",
+    "爵士":"Jazz",
+    "摇滚":"Rock",
+    "自定义":"Tersuai",
+    "查找耳机":"Cari Earphone",
+    "自定义音效":"Efek Bunyi Tersuai",
+    "音效风格":"Gaya Efek Bunyi",
+    "左耳机响铃":"Loceng Earphone Kiri",
+    "右耳机响铃":"Loceng Earphone Kanan",
+    "耳机在附近,可通过响铃进行查找":"Earphone berada berdekatan, boleh dicari melalui loceng",
+    
+    "个智能设备":"peranti pintar",
+    "云储存空间" : "Ruang Penyimpanan Awan",
+    "电子说明书" : "Panduan Elektronik",
+    "固件升级" : "Pembaruan Firmware",
+    "语言设置" : "Tetapan Bahasa",
+    "更多设置" : "Tetapan Lainnya",
+    "帮助与反馈" : "Bantuan dan Maklum Balas",
+    "关于" : "Mengenai",
+    "设备详情":"Butiran Peranti",
+    "设备名称":"Nama Peranti",
+    "设备ID":"ID Peranti",
+    "最近登录时间":"Masa Log Masuk Terkini",
+    "移除设备":"Keluarkan Peranti",
+    "确定要解绑该设备吗?":"Adakah anda pasti ingin memutuskan pautan peranti ini?",
+    "移除设备后会同步退出账号,在此设备上将无法访问该账号的数据":"Selepas memadamkan peranti, akan keluar daripada akaun secara serentak, dan data akaun tidak boleh diakses pada peranti ini",
+    "设备地址":"Alamat Peranti",
+    "硬件版本":"Versi Perkakasan",
+    "软件版本":"Versi Perisian",
+    "设备信息":"Maklumat Peranti",
+    
+    "账号设置" : "Tetapan Akaun",
+    "登录方式" : "Cara Log Masuk",
+    "账号密码" : "Kata Laluan Akaun",
+    "安全手机" : "Telefon Keselamatan",
+    "安全邮箱" : "E-mel Keselamatan",
+    "基本资料" : "Maklumat Asas",
+    "登录设备管理" : "Pengurusan Peranti Log Masuk",
+    "头像" : "Ikon Profil",
+    "昵称" : "Nama Samaran",
+    "性别" : "Jantina",
+    "国家与地区" : "Negara dan Wilayah",
+    "请输入昵称" : "Sila masukkan nama samaran",
+    "男" : "Lelaki",
+    "女" : "Perempuan",
+    "保密" : "Rahsia",
+    "国家/地区" : "Negara/Wilayah",
+    "请输入新的安全手机号码" : "Sila masukkan nombor telefon keselamatan baru",
+    "请输入手机号码" : "Sila masukkan nombor telefon",
+    
+    "请输入新的安全邮箱地址" : "Sila masukkan alamat e-mel keselamatan baru",
+    "请输入邮箱地址" : "Sila masukkan alamat e-mel",
+    "请使用安全手机":"Sila gunakan telefon keselamatan",
+    "请使用安全邮箱":"Sila gunakan e-mel keselamatan",
+    "获取验证码短信":"Dapatkan SMS Kod Verifikasi",
+    "请输入型号查询" : "Sila masukkan model untuk carian",
+    "问题描述或建议" : "Penerangan Masalah atau Cadangan",
+    "在线咨询" : "Pertanyaan Dalam Talian",
+    "问题类型" : "Jenis Masalah",
+    "功能异常" : "Fungsi Tidak Normal",
+    "意见与反馈" : "Pendapat dan Maklum Balas",
+    "联系方式" : "Butiran Hubungan",
+    "请输入手机号或邮箱" : "Sila masukkan nombor telefon atau e-mel",
+    "请至少用10个字描述问题,并添加截图,这有助于问题快速解决。" : "Sila huraikan masalah dengan sekurang-kurangnya 10 aksara, dan tambahkan tangkapan skrin, ini akan membantu menyelesaikan masalah dengan cepat.",
+    "反馈历史" : "Sejarah Maklum Balas",
+    "你好,请问有什么我可以帮助到您" : "Halo, adakah terdapat apa yang boleh saya bantu?",
+    "请用一句话简单描述下您的问题~" : "Sila huraikan masalah anda dengan ringkas dalam satu ayat~",
+    "猜你想问" : "Mungkin anda ingin bertanya",
+    
+    
+    "当前版本" : "Versi Semasa",
+    "检查更新" : "Semak Kemas kini",
+    "系统权限管理" : "Pengurusan Kebenaran Sistem",
+    "切换账号" : "Tukar Akaun",
+    "退出登录" : "Log Keluar",
+    "注销账号" : "Padam Akaun",
+    "提示" : "Petunjuk",
+    "确定" : "Pasti",
+    "确认" : "Sahkan",
+    "取消" : "Batal",
+    "删除" : "Padam",
+    "下一步" : "Langkah Seterusnya",
+    "确定要切换账号吗?" : "Adakah anda pasti ingin menukar akaun?",
+    "确定要退出登录吗?" : "Adakah anda pasti ingin log keluar?",
+    "真的要注销账号吗?" : "Adakah anda benar-benar ingin memadamkan akaun?",
+    "用户协议" : "Perjanjian Pengguna",
+    "隐私政策" : "Dasar Privasi",
+    "个人信息手机清单" : "Senarai Pengumpulan Maklumat Peribadi",
+    "系统权限清单" : "Senarai Kebenaran Sistem",
+    "撤回同意" : "Batalkan Persetujuan",
+    "确认撤回" : "Sahkan Pembatalan",
+    "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!" : "Sila pastikan anda adalah pihak berkaitan yang berkuasa untuk melakukan operasi pembatalan persetujuan terhadap Dasar Privasi ini. Dengan membatalkan persetujuan terhadap Dasar Privasi, anda akan meninggalkan aset atau权益 berikut:\n\n1.Pemadam Data\nPengumpulan maklumat peribadi anda akan dihentikan. Data yang dihasilkan semasa anda menggunakan aplikasi DeepChords akan dipadam; data cache aplikasi DeepChords dalam telefon akan dibersihkan.\n\n2.Pemutusan Pautan Peranti\nSemua peranti dalam akaun DeepChords akan dilepaskan daripada akaun yang anda log masuk sekarang, dan data peranti yang disimpan dalam pelayan sebelum ini akan dipadam. Data yang disimpan dalam peranti fizikal perlu dibersihkan melalui penetapan semula fizikal tempatan secara manual. Jika anda perlu menggunakan peranti semula, anda perlu mengikat semula dan memberi kebenaran semula.\n\n3.Lain-lain\nTindakan ini juga akan membatalkan persetujuan anda terhadap Perjanjian Pengguna, dan keluar daripada aplikasi DeepChords.\n\nSila maklum bahawa pembatalan persetujuan terhadap Dasar Privasi tidak bermakna tingkah laku dan tanggungjawab sebelum pembatalan persetujuan diampuni atau dikurangkan. Jika anda perlu menguruskan peranti dalam akaun ini semula, anda perlu memberi kebenaran semula dan mengikat semula. Sila berhati-hati ketika beroperasi!",
+    "您好, \n欢迎使用DeepChords" : "Halo, \nSelamat datang menggunakan DeepChords",
+    "用户登录" : "Log Masuk Pengguna",
+    "请输入密码" : "Sila masukkan kata laluan",
+    "请输入手机号码/邮箱":"Sila masukkan nombor telefon/e-mel",
+    "登录并同意" : "Log Masuk dan Setuju",
+    "《隐私政策》" : "《Dasar Privasi》",
+    " 和 " : " dan ",
+    "《用户协议》" : "《Perjanjian Pengguna》",
+    "忘记密码" : "Lupa Kata Laluan",
+    "验证码登录" : "Log Masuk dengan Kod Verifikasi",
+    "其他登录方式" : "Cara Log Masuk Lainnya",
+    "用户注册" : "Pendaftaran Pengguna",
+    "请输入验证码" : "Sila masukkan kod verifikasi",
+    "发送验证码":"Hantar Kod Verifikasi",
+    "点击获取" : "Klik untuk mendapatkan",
+    "登录" : "Log Masuk",
+    "密码登录" : "Log Masuk dengan Kata Laluan",
+    "重置密码":"Tetapkan Semula Kata Laluan",
+    "注册" : "Daftar",
+    "请输入正确的手机号码" : "Sila masukkan nombor telefon yang betul",
+    "请求失败" : "Permintaan Gagal",
+    "请求成功!":"Permintaan Berjaya!",
+    "加载中...":"Memuatkan...",
+    "上传中...":"Memuat naik...",
+    "连接中":"Menyambung...",
+    "连接成功":"Penyambungan Berjaya",
+    "连接失败":"Penyambungan Gagal",
+    "智能体":"Agen Pintar",
+    "已成功更新到云储存空间":"Telah berjaya dikemas kini ke ruang penyimpanan awan",
+]
diff --git a/ShenYin/ShenYin/lan/russian.swift b/ShenYin/ShenYin/lan/russian.swift
new file mode 100644 (file)
index 0000000..0283622
--- /dev/null
@@ -0,0 +1,222 @@
+
+
+let russianMap:[String:String] =
+[
+    "智能" : "Интеллектуальный",
+    "模式" : "Режим",
+    "睡眠" : "Сон",
+    "客服" : "Клиентская поддержка",
+    "我的" : "Мой",
+    "设备":"Устройство",
+    "已连接" : "Подключено",
+    "未连接" : "Не подключено",
+    
+    "现场录音" : "Прямая запись",
+    "随时随地,一键开录" : "В любой момент и месте, одним нажатием начать запись",
+    "通话录音" : "Запись разговоров",
+    "一键录音,翻译转写" : "Одно нажатие для записи, перевода и транскрипции",
+    "中英互译" : "Перевод между китайским и английским",
+    "实时对话,即时互译" : "Реальное время разговор, мгновенный перевод",
+    "同传听译" : "Симультанальный перевод",
+    "一机一耳,面对面畅聊" : "Один телефон и одна гарнитура для свободного диалога лицом к лицу",
+    "对话翻译" : "Перевод диалогов",
+    "会议讲座,同步翻译" : "Совещания и лекции, синхронный перевод",
+    "文本翻译" : "Перевод текста",
+    "即打即译,多语支持":"Перевод при вводе, поддержка множества языков",
+    "历史记录" : "История",
+    "所有记录,一目了然" : "Все записи на виду",
+    "智能对话" : "Интеллектуальный диалог",
+    "伙伴,随叫随到" : "Партнер, всегда на связи",
+    "切换角色" : "Сменить роль",
+    "按住说话" : "Держите для записи",
+    "同传听译模式使用介绍":"Инструкция по использованию режима синхронного перевода",
+    "对话模式使用介绍" : "Инструкция по использованию режима диалога",
+    "中英互译模式使用介绍" : "Инструкция по использованию режима перевода между китайским и английским",
+    "一方手持手机,一方戴上耳机,对手机发言时,耳机播放译文,对耳机发言时,手机播放译文" : "Одна сторона держит телефон, другая надевает гарнитуру: при речи в телефон перевод воспроизводится в гарнитуре, при речи в гарнитуру перевод воспроизводится в телефоне",
+    "两人各佩戴一只耳机,选择源语言语种, 双方耳机中播放目标语言" : "Оба человека надевают по одной гарнитуре, выбирают исходный язык, и в обеих гарнитурах воспроизводится целевой язык",
+    "手机靠近音源收音,佩戴耳机收听译文" : "Телефон подносится к источнику звука для записи, а перевод слушается через гарнитуру",
+    "- 情景示例 -\n张张靠近手机讲中文,对方耳机播放英语" : "- Пример сценария -\nЧжан Чжан подходит к телефону и говорит по-китайски, в гарнитуре собеседника воспроизводится английский",
+    "- 情景示例 -\n张张戴一只耳机讲中文,双方耳机播放英文翻译 Lucy切换为英语发言后,双方耳机中播报中文翻译" : "- Пример сценария -\nЧжан Чжан носит одну гарнитуру и говорит по-китайски, в обеих гарнитурах воспроизводится английский перевод. После того как Люси переключается на английский, в обеих гарнитурах объявляется китайский перевод",
+    "- 情景示例 -\nLisa对着手机讲英语,小徐耳机中播放中文" : "- Пример сценария -\nЛиза говорит по-английски в телефон, в гарнитуре Сюяо воспроизводится китайский",
+    "开始体验" : "Начать использование",
+    "下次不再提示":"Больше не показывать",
+    "当前正在录音,确定放弃当前录音吗":"В данный момент идет запись, уверены, что хотите её отменить?",
+    "云同步":"Облачная синхронизация",
+    "是否上传运存储空间备份":"Хотите ли вы загрузить резервную копию в облачное хранилище?",
+    
+    "请选择语言":"Пожалуйста, выберите язык",
+    "中文" : "Китайский",
+    "英文" : "Английский",
+    "日文" : "Японский",
+    "韩文" : "Корейский",
+    "法文" : "Французский",
+    "西班牙文" : "Испанский",
+    "葡萄牙文" : "Португальский",
+    "印度尼西亚文" : "Индонезийский",
+    "俄文" : "Русский",
+    "马来文" : "Малайский",
+    
+    "保存录音" : "Сохранить запись",
+    "原文" : "Оригинальный текст",
+    "译文" : "Переведенный текст",
+    "摘要" : "Сводка",
+    "翻译" : "Перевод",
+    "重命名" : "Переименовать",
+    "播放录音" : "Воспроизвести запись",
+    "更多" : "Больше",
+    "字号" : "Размер шрифта",
+    "分享" : "Поделиться",
+    "调整字号" : "Изменить размер шрифта",
+    "小" : "Маленький",
+    "标准" : "Стандартный",
+    "大" : "Большой",
+    "设置" : "Настройки",
+    "左耳" : "Левое ухо",
+    "右耳" : "Правое ухо",
+    "耳机" : "Гарнитура",
+    "手机" : "Телефон",
+    "此处将显示原文" : "Здесь будет отображаться оригинальный текст",
+    "此处将显示译文" : "Здесь будет отображаться переведенный текст",
+    "请输入..." : "Пожалуйста, введите...",
+    "筛选录音" : "Фильтровать записи",
+    "全部录音":"Все записи",
+    "收藏录音" : "Закладки записей",
+    "多选" : "Множественный выбор",
+    "导出" : "Экспортировать",
+    "您要删除这些录音吗?" : "Хотите ли вы удалить эти записи?",
+    "删除后,这些记录将无法恢复。" : "После удаления эти записи нельзя будет восстановить.",
+    "删除后,此记录将无法恢复":"После удаления эта запись нельзя будет восстановить",
+    "您要删除这条录音吗?":"Хотите ли вы удалить эту запись?",
+    
+    "多个文件将压缩成一个.zip的文件以便于分享。请选择您需要导出的文件类型:" : "Несколько файлов будут сжаты в один .zip-файл для удобного обмена. Пожалуйста, выберите тип файлов для экспорта:",
+    "仅音频文件" : "Только аудиофайлы",
+    "仅文档" : "Только документы",
+    "音频文件" : "Аудиофайлы",
+    "文档":"Документы",
+    
+    "白噪音":"Белый шум",
+    "EQ调音":"Настройка эквалайзера",
+    "正常":"Обычный",
+    "流行":"Поп",
+    "经典":"Классика",
+    "爵士":"Джаз",
+    "摇滚":"Рок",
+    "自定义":"Пользовательский",
+    "查找耳机":"Найти гарнитуру",
+    "自定义音效":"Пользовательские звуковые эффекты",
+    "音效风格":"Стиль звуковых эффектов",
+    "左耳机响铃":"Звонок в левую гарнитуру",
+    "右耳机响铃":"Звонок в правую гарнитуру",
+    "耳机在附近,可通过响铃进行查找":"Гарнитура поблизости, можно найти через звонок",
+    
+    "个智能设备":"интеллектуальных устройств",
+    "云储存空间" : "Облачное хранилище",
+    "电子说明书" : "Электронная инструкция",
+    "固件升级" : "Обновление прошивки",
+    "语言设置" : "Настройки языка",
+    "更多设置" : "Дополнительные настройки",
+    "帮助与反馈" : "Помощь и обратная связь",
+    "关于" : "О программе",
+    "设备详情":"Детали устройства",
+    "设备名称":"Название устройства",
+    "设备ID":"ID устройства",
+    "最近登录时间":"Время последнего входа",
+    "移除设备":"Удалить устройство",
+    "确定要解绑该设备吗?":"Уверены, что хотите отвязать это устройство?",
+    "移除设备后会同步退出账号,在此设备上将无法访问该账号的数据":"После удаления устройства вы автоматически выйдете из аккаунта, и на этом устройстве не будет доступа к данным аккаунта",
+    "设备地址":"Адрес устройства",
+    "硬件版本":"Версия аппаратного обеспечения",
+    "软件版本":"Версия программного обеспечения",
+    "设备信息":"Информация об устройстве",
+    
+    "账号设置" : "Настройки аккаунта",
+    "登录方式" : "Способ входа",
+    "账号密码" : "Пароль аккаунта",
+    "安全手机" : "Безопасный телефон",
+    "安全邮箱" : "Безопасная почта",
+    "基本资料" : "Базовая информация",
+    "登录设备管理" : "Управление устройствами для входа",
+    "头像" : "Аватар",
+    "昵称" : "Псевдоним",
+    "性别" : "Пол",
+    "国家与地区" : "Страна и регион",
+    "请输入昵称" : "Пожалуйста, введите псевдоним",
+    "男" : "Мужской",
+    "女" : "Женский",
+    "保密" : "Секретно",
+    "国家/地区" : "Страна/регион",
+    "请输入新的安全手机号码" : "Пожалуйста, введите новый безопасный номер телефона",
+    "请输入手机号码" : "Пожалуйста, введите номер телефона",
+    
+    "请输入新的安全邮箱地址" : "Пожалуйста, введите новый адрес безопасной почты",
+    "请输入邮箱地址" : "Пожалуйста, введите адрес почты",
+    "请使用安全手机":"Пожалуйста, используйте безопасный телефон",
+    "请使用安全邮箱":"Пожалуйста, используйте безопасную почту",
+    "获取验证码短信":"Получить СМС с кодом подтверждения",
+    "请输入型号查询" : "Пожалуйста, введите модель для поиска",
+    "问题描述或建议" : "Описание проблемы или предложение",
+    "在线咨询" : "Онлайн-консультация",
+    "问题类型" : "Тип проблемы",
+    "功能异常" : "Неисправность функции",
+    "意见与反馈" : "Комментарии и обратная связь",
+    "联系方式" : "Контактная информация",
+    "请输入手机号或邮箱" : "Пожалуйста, введите номер телефона или почту",
+    "请至少用10个字描述问题,并添加截图,这有助于问题快速解决。" : "Пожалуйста, опишите проблему не менее чем в 10 словах и добавьте скриншот, это поможет быстро решить проблему.",
+    "反馈历史" : "История обратной связи",
+    "你好,请问有什么我可以帮助到您" : "Здравствуйте, чем я могу вам помочь?",
+    "请用一句话简单描述下您的问题~" : "Пожалуйста, кратко опишите вашу проблему в одном предложении~",
+    "猜你想问" : "Допустим, вы хотите спросить",
+    
+    
+    "当前版本" : "Текущая версия",
+    "检查更新" : "Проверить обновления",
+    "系统权限管理" : "Управление системными разрешениями",
+    "切换账号" : "Сменить аккаунт",
+    "退出登录" : "Выйти из аккаунта",
+    "注销账号" : "Удалить аккаунт",
+    "提示" : "Подсказка",
+    "确定" : "Ок",
+    "确认" : "Подтвердить",
+    "取消" : "Отмена",
+    "删除" : "Удалить",
+    "下一步" : "Далее",
+    "确定要切换账号吗?" : "Уверены, что хотите сменить аккаунт?",
+    "确定要退出登录吗?" : "Уверены, что хотите выйти из аккаунта?",
+    "真的要注销账号吗?" : "Действительно хотите удалить аккаунт?",
+    "用户协议" : "Пользовательское соглашение",
+    "隐私政策" : "Политика конфиденциальности",
+    "个人信息手机清单" : "Список сбора личной информации",
+    "系统权限清单" : "Список системных разрешений",
+    "撤回同意" : "Отозвать согласие",
+    "确认撤回" : "Подтвердить отзыв",
+    "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!" : "Пожалуйста, убедитесь, что у вас есть право на отзыв согласия с политикой конфиденциальности. При отзыве согласия с политикой конфиденциальности вы утратите следующие активы или права:\n\n1. Очистка данных\nСбор вашей личной информации будет прекращен. Данные, созданные при использовании приложения DeepChords, будут удалены; кэш данных приложения DeepChords на телефоне будет очищен.\n\n2. Отвязка устройств\nВсе устройства в аккаунте DeepChords будут отвязаны от вашего текущего аккаунта, и данные устройств, хранящиеся на сервере, будут удалены. Данные, хранящиеся на физическом устройстве, необходимо очищать вручную через локальный сброс. Если вы захотите снова использовать устройство, вам нужно будет повторно привязать его и получить авторизацию.\n\n3. Другое\nЭто действие также отзовет ваше согласие с пользовательским соглашением и вы выйдете из приложения DeepChords.\n\nПожалуйста, учтите, что отзыв согласия с политикой конфиденциальности не освобождает вас от ответственности за действия, совершенные до отзыва согласия. Если вы захотите снова управлять устройствами через этот аккаунт, вам нужно будет повторно получить авторизацию и привязать устройства. Пожалуйста, действуйте осторожно!",
+    "您好, \n欢迎使用DeepChords" : "Здравствуйте, \nДобро пожаловать в DeepChords",
+    "用户登录" : "Вход пользователя",
+    "请输入密码" : "Пожалуйста, введите пароль",
+    "请输入手机号码/邮箱":"Пожалуйста, введите номер телефона/почту",
+    "登录并同意" : "Войти и согласиться",
+    "《隐私政策》" : "«Политика конфиденциальности»",
+    " 和 " : " и ",
+    "《用户协议》" : "«Пользовательское соглашение»",
+    "忘记密码" : "Забыли пароль",
+    "验证码登录" : "Вход по коду подтверждения",
+    "其他登录方式" : "Другие способы входа",
+    "用户注册" : "Регистрация пользователя",
+    "请输入验证码" : "Пожалуйста, введите код подтверждения",
+    "发送验证码":"Отправить код подтверждения",
+    "点击获取" : "Нажмите для получения",
+    "登录" : "Войти",
+    "密码登录" : "Вход по паролю",
+    "重置密码":"Сбросить пароль",
+    "注册" : "Зарегистрироваться",
+    "请输入正确的手机号码" : "Пожалуйста, введите правильный номер телефона",
+    "请求失败" : "Запрос не удался",
+    "请求成功!":"Запрос успешен!",
+    "加载中...":"Загрузка...",
+    "上传中...":"Загрузка...",
+    "连接中":"Подключение...",
+    "连接成功":"Подключено",
+    "连接失败":"Ошибка подключения",
+    "智能体":"Интеллектуальный агент",
+    "已成功更新到云储存空间":"Успешно обновлено в облачное хранилище",
+]
diff --git a/ShenYin/ShenYin/lan/spanish.swift b/ShenYin/ShenYin/lan/spanish.swift
new file mode 100644 (file)
index 0000000..3e3222f
--- /dev/null
@@ -0,0 +1,228 @@
+//
+//  spanish.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/11/11.
+//
+
+
+let spanishMap:[String:String] =
+[
+    "智能" : "Inteligente",
+    "模式" : "Modo",
+    "睡眠" : "Sueño",
+    "客服" : "Servicio al cliente",
+    "我的" : "Mi",
+    "设备":"Dispositivo",
+    "已连接" : "Conectado",
+    "未连接" : "Desconectado",
+    
+    "现场录音" : "Grabación en vivo",
+    "随时随地,一键开录" : "Grabación con un clic en cualquier momento y lugar",
+    "通话录音" : "Grabación de llamadas",
+    "一键录音,翻译转写" : "Grabación con un clic, traducción y transcripción",
+    "中英互译" : "Traducción entre chino e inglés",
+    "实时对话,即时互译" : "Conversación en tiempo real, traducción instantánea",
+    "同传听译" : "Traducción simultánea auditiva",
+    "一机一耳,面对面畅聊" : "Un dispositivo y un auricular para charlar cara a cara",
+    "对话翻译" : "Traducción de conversaciones",
+    "会议讲座,同步翻译" : "Conferencias y charlas, traducción同步",
+    "文本翻译" : "Traducción de texto",
+    "即打即译,多语支持":"Traducción instantánea al escribir, soporte multilingüe",
+    "历史记录" : "Historial",
+    "所有记录,一目了然" : "Todos los registros, claros a primera vista",
+    "智能对话" : "Conversación inteligente",
+    "伙伴,随叫随到" : "Compañero, siempre disponible",
+    "切换角色" : "Cambiar de rol",
+    "按住说话" : "Mantener presionado para hablar",
+    "同传听译模式使用介绍":"Introducción al uso del modo de traducción simultánea auditiva",
+    "对话模式使用介绍" : "Introducción al uso del modo de conversación",
+    "中英互译模式使用介绍" : "Introducción al uso del modo de traducción entre chino e inglés",
+    "一方手持手机,一方戴上耳机,对手机发言时,耳机播放译文,对耳机发言时,手机播放译文" : "Una persona sostiene el teléfono, la otra usa auriculares. Al hablar al teléfono, los auriculares reproducen la traducción; al hablar a los auriculares, el teléfono reproduce la traducción",
+    "两人各佩戴一只耳机,选择源语言语种, 双方耳机中播放目标语言" : "Ambas personas usan un auricular cada una, seleccionan el idioma de origen y ambos auriculares reproducen el idioma objetivo",
+    "手机靠近音源收音,佩戴耳机收听译文" : "Acercar el teléfono a la fuente de sonido para grabar, usar auriculares para escuchar la traducción",
+    "- 情景示例 -\n张张靠近手机讲中文,对方耳机播放英语" : "- Ejemplo de situación -\nZhang Zhang habla chino cerca del teléfono, los auriculares del otro reproducen inglés",
+    "- 情景示例 -\n张张戴一只耳机讲中文,双方耳机播放英文翻译 Lucy切换为英语发言后,双方耳机中播报中文翻译" : "- Ejemplo de situación -\nZhang Zhang usa un auricular y habla chino, ambos auriculares reproducen la traducción al inglés. Después de que Lucy cambie a hablar en inglés, ambos auriculares anuncian la traducción al chino",
+    "- 情景示例 -\nLisa对着手机讲英语,小徐耳机中播放中文" : "- Ejemplo de situación -\nLisa habla inglés al teléfono, los auriculares de Xiao Xu reproducen chino",
+    "开始体验" : "Empezar la experiencia",
+    "下次不再提示":"No volver a mostrar",
+    "当前正在录音,确定放弃当前录音吗":"Actualmente se está grabando, ¿está seguro de abandonar la grabación actual?",
+    "云同步":"Sincronización en nube",
+    "是否上传运存储空间备份":"¿Desea subir una copia de seguridad al almacenamiento en nube?",
+    
+    "请选择语言":"Por favor, seleccione un idioma",
+    "中文" : "Chino",
+    "英文" : "Inglés",
+    "日文" : "Japonés",
+    "韩文" : "Coreano",
+    "法文" : "Francés",
+    "西班牙文" : "Español",
+    "葡萄牙文" : "Portugués",
+    "印度尼西亚文" : "Indonesio",
+    "俄文" : "Ruso",
+    "马来文" : "Malayo",
+    
+    "保存录音" : "Guardar grabación",
+    "原文" : "Texto original",
+    "译文" : "Texto traducido",
+    "摘要" : "Resumen",
+    "翻译" : "Traducir",
+    "重命名" : "Cambiar nombre",
+    "播放录音" : "Reproducir grabación",
+    "更多" : "Más",
+    "字号" : "Tamaño de fuente",
+    "分享" : "Compartir",
+    "调整字号" : "Ajustar tamaño de fuente",
+    "小" : "Pequeño",
+    "标准" : "Estándar",
+    "大" : "Grande",
+    "设置" : "Configuración",
+    "左耳" : "Oído izquierdo",
+    "右耳" : "Oído derecho",
+    "耳机" : "Auriculares",
+    "手机" : "Teléfono móvil",
+    "此处将显示原文" : "Aquí se mostrará el texto original",
+    "此处将显示译文" : "Aquí se mostrará el texto traducido",
+    "请输入..." : "Por favor, ingrese...",
+    "筛选录音" : "Filtrar grabaciones",
+    "全部录音":"Todas las grabaciones",
+    "收藏录音" : "Grabaciones favoritas",
+    "多选" : "Selección múltiple",
+    "导出" : "Exportar",
+    "您要删除这些录音吗?" : "¿Desea eliminar estas grabaciones?",
+    "删除后,这些记录将无法恢复。" : "Después de eliminar, estos registros no se podrán recuperar.",
+    "删除后,此记录将无法恢复":"Después de eliminar, este registro no se podrá recuperar",
+    "您要删除这条录音吗?":"¿Desea eliminar esta grabación?",
+    
+    "多个文件将压缩成一个.zip的文件以便于分享。请选择您需要导出的文件类型:" : "Varios archivos se comprimirán en un archivo .zip para facilitar el intercambio. Por favor, seleccione el tipo de archivo que desea exportar:",
+    "仅音频文件" : "Solo archivos de audio",
+    "仅文档" : "Solo documentos",
+    "音频文件" : "Archivos de audio",
+    "文档":"Documentos",
+    
+    "白噪音":"Ruido blanco",
+    "EQ调音":"Ajuste de EQ",
+    "正常":"Normal",
+    "流行":"Pop",
+    "经典":"Clásico",
+    "爵士":"Jazz",
+    "摇滚":"Rock",
+    "自定义":"Personalizado",
+    "查找耳机":"Buscar auriculares",
+    "自定义音效":"Efecto de sonido personalizado",
+    "音效风格":"Estilo de efecto de sonido",
+    "左耳机响铃":"Timbre del auricular izquierdo",
+    "右耳机响铃":"Timbre del auricular derecho",
+    "耳机在附近,可通过响铃进行查找":"Los auriculares están cerca, se pueden encontrar mediante el timbre",
+    
+    "个智能设备":"dispositivos inteligentes",
+    "云储存空间" : "Espacio de almacenamiento en nube",
+    "电子说明书" : "Manual electrónico",
+    "固件升级" : "Actualización de firmware",
+    "语言设置" : "Configuración de idioma",
+    "更多设置" : "Más configuraciones",
+    "帮助与反馈" : "Ayuda y comentarios",
+    "关于" : "Acerca de",
+    "设备详情":"Detalles del dispositivo",
+    "设备名称":"Nombre del dispositivo",
+    "设备ID":"ID del dispositivo",
+    "最近登录时间":"Último tiempo de inicio de sesión",
+    "移除设备":"Eliminar dispositivo",
+    "确定要解绑该设备吗?":"¿Está seguro de desvincular este dispositivo?",
+    "移除设备后会同步退出账号,在此设备上将无法访问该账号的数据":"Después de eliminar el dispositivo, se cerrará la sesión同步 y no se podrá acceder a los datos de la cuenta en este dispositivo",
+    "设备地址":"Dirección del dispositivo",
+    "硬件版本":"Versión de hardware",
+    "软件版本":"Versión de software",
+    "设备信息":"Información del dispositivo",
+    
+    "账号设置" : "Configuración de cuenta",
+    "登录方式" : "Método de inicio de sesión",
+    "账号密码" : "Contraseña de cuenta",
+    "安全手机" : "Teléfono seguro",
+    "安全邮箱" : "Correo electrónico seguro",
+    "基本资料" : "Datos básicos",
+    "登录设备管理" : "Gestión de dispositivos de inicio de sesión",
+    "头像" : "Avatar",
+    "昵称" : "Apodo",
+    "性别" : "Género",
+    "国家与地区" : "País y región",
+    "请输入昵称" : "Por favor, ingrese un apodo",
+    "男" : "Masculino",
+    "女" : "Femenino",
+    "保密" : "Confidencial",
+    "国家/地区" : "País/Región",
+    "请输入新的安全手机号码" : "Por favor, ingrese un nuevo número de teléfono seguro",
+    "请输入手机号码" : "Por favor, ingrese el número de teléfono",
+    
+    "请输入新的安全邮箱地址" : "Por favor, ingrese una nueva dirección de correo electrónico seguro",
+    "请输入邮箱地址" : "Por favor, ingrese la dirección de correo electrónico",
+    "请使用安全手机":"Por favor, use el teléfono seguro",
+    "请使用安全邮箱":"Por favor, use el correo electrónico seguro",
+    "获取验证码短信":"Obtener mensaje de código de verificación",
+    "请输入型号查询" : "Por favor, ingrese el modelo para consultar",
+    "问题描述或建议" : "Descripción del problema o sugerencia",
+    "在线咨询" : "Consulta en línea",
+    "问题类型" : "Tipo de problema",
+    "功能异常" : "Anomalía de función",
+    "意见与反馈" : "Comentarios y sugerencias",
+    "联系方式" : "Información de contacto",
+    "请输入手机号或邮箱" : "Por favor, ingrese el número de teléfono o correo electrónico",
+    "请至少用10个字描述问题,并添加截图,这有助于问题快速解决。" : "Por favor, describa el problema con al menos 10 caracteres y agregue una captura de pantalla, lo que ayudará a resolver el problema rápidamente.",
+    "反馈历史" : "Historial de comentarios",
+    "你好,请问有什么我可以帮助到您" : "Hola, ¿en qué puedo ayudarle?",
+    "请用一句话简单描述下您的问题~" : "Por favor, describa su problema en una frase simple~",
+    "猜你想问" : "Probablemente quiera preguntar",
+    
+    
+    "当前版本" : "Versión actual",
+    "检查更新" : "Verificar actualizaciones",
+    "系统权限管理" : "Gestión de permisos del sistema",
+    "切换账号" : "Cambiar de cuenta",
+    "退出登录" : "Cerrar sesión",
+    "注销账号" : "Eliminar cuenta",
+    "提示" : "Nota",
+    "确定" : "Confirmar",
+    "确认" : "Aceptar",
+    "取消" : "Cancelar",
+    "删除" : "Eliminar",
+    "下一步" : "Siguiente",
+    "确定要切换账号吗?" : "¿Está seguro de cambiar de cuenta?",
+    "确定要退出登录吗?" : "¿Está seguro de cerrar la sesión?",
+    "真的要注销账号吗?" : "¿Realmente desea eliminar la cuenta?",
+    "用户协议" : "Acuerdo de usuario",
+    "隐私政策" : "Política de privacidad",
+    "个人信息手机清单" : "Lista de recolección de información personal",
+    "系统权限清单" : "Lista de permisos del sistema",
+    "撤回同意" : "Retirar consentimiento",
+    "确认撤回" : "Confirmar retiro",
+    "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!" : "Por favor, asegúrese de que está autorizado para realizar esta operación de retiro de consentimiento a la política de privacidad. Al retirar el consentimiento a la política de privacidad, renunciará a los siguientes activos o derechos:\n\n1. Borrado de datos\nSe dejará de recopilar su información personal. Los datos generados durante el uso de la aplicación DeepChords serán borrados; los datos en caché de la aplicación DeepChords en el teléfono serán eliminados.\n\n2. Desvinculación de dispositivos\nEn la cuenta DeepChords, todos los dispositivos se desvincularán de la cuenta con la que ha iniciado sesión actualmente y se eliminarán los datos previamente almacenados en el servidor. Los datos almacenados en los dispositivos físicos deben eliminarse mediante un restablecimiento físico local manual. Si necesita volver a usar el dispositivo, deberá volver a vincularlo y autorizarlo nuevamente.\n\n3. Otros\nEsta acción también retirará su consentimiento al acuerdo de usuario y cerrará la aplicación DeepChords.\n\nPor favor, tenga en cuenta que retirar el consentimiento a la política de privacidad no implica que las acciones y responsabilidades anteriores al retiro del consentimiento sean exoneradas o mitigadas. Si necesita volver a gestionar dispositivos en esta cuenta, deberá volver a autorizar y vincularlos. Por favor,操作 con precaución!",
+    "您好, \n欢迎使用DeepChords" : "Hola, \nbienvenido a DeepChords",
+    "用户登录" : "Inicio de sesión de usuario",
+    "请输入密码" : "Por favor, ingrese la contraseña",
+    "请输入手机号码/邮箱":"Por favor, ingrese el número de teléfono/correo electrónico",
+    "登录并同意" : "Iniciar sesión y aceptar",
+    "《隐私政策》" : "Política de Privacidad",
+    " 和 " : " y ",
+    "《用户协议》" : "Acuerdo de Usuario",
+    "忘记密码" : "Olvidé la contraseña",
+    "验证码登录" : "Inicio de sesión con código de verificación",
+    "其他登录方式" : "Otras formas de inicio de sesión",
+    "用户注册" : "Registro de usuario",
+    "请输入验证码" : "Por favor, ingrese el código de verificación",
+    "发送验证码":"Enviar código de verificación",
+    "点击获取" : "Haga clic para obtener",
+    "登录" : "Iniciar sesión",
+    "密码登录" : "Inicio de sesión con contraseña",
+    "重置密码":"Restablecer contraseña",
+    "注册" : "Registrarse",
+    "请输入正确的手机号码" : "Por favor, ingrese un número de teléfono válido",
+    "请求失败" : "Solicitud fallida",
+    "请求成功!":"Solicitud exitosa!",
+    "加载中...":"Cargando...",
+    "上传中...":"Subiendo...",
+    "连接中":"Conectando",
+    "连接成功":"Conexión exitosa",
+    "连接失败":"Conexión fallida",
+    "智能体":"Agente inteligente",
+    "已成功更新到云储存空间":"Se ha actualizado exitosamente al espacio de almacenamiento en nube",
+]
diff --git a/ShenYin/ShenYin/lan/thai.swift b/ShenYin/ShenYin/lan/thai.swift
new file mode 100644 (file)
index 0000000..5f7cfed
--- /dev/null
@@ -0,0 +1,227 @@
+//
+//  Untitled 3.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/11/11.
+//
+
+let thaiMap:[String:String] =
+[
+    "智能" : "อัจฉา",
+    "模式" : "โหมด",
+    "睡眠" : "นอนหลับ",
+    "客服" : "บริการลูกค้า",
+    "我的" : "ของฉัน",
+    "设备":"อุปกรณ์",
+    "已连接" : "เชื่อมต่อแล้ว",
+    "未连接" : "ไม่ได้เชื่อมต่อ",
+    
+    "现场录音" : "บันทึกเสียงสด",
+    "随时随地,一键开录" : "บันทึกได้ทุกที่ทุกเวลา ด้วยการกดเดียว",
+    "通话录音" : "บันทึกการโทร",
+    "一键录音,翻译转写" : "บันทึกด้วยการกดเดียว แปลและถอดเสียง",
+    "中英互译" : "แปลระหว่างจีน-อังกฤษ",
+    "实时对话,即时互译" : "สนทนาแบบเรียลไทม์ แปลทันที",
+    "同传听译" : "การแปลแบบพร้อมฟัง",
+    "一机一耳,面对面畅聊" : "หนึ่งเครื่องหนึ่งหูฟัง สนทนากันใกล้ชิดได้อย่างอิสระ",
+    "对话翻译" : "แปลการสนทนา",
+    "会议讲座,同步翻译" : "การประชุมและเทศนา แปลแบบซิงโครนัส",
+    "文本翻译" : "แปลข้อความ",
+    "即打即译,多语支持":"แปลทันทีเมื่อพิมพ์ รองรับหลายภาษา",
+    "历史记录" : "ประวัติการใช้งาน",
+    "所有记录,一目了然" : "บันทึกทั้งหมด ชัดเจนอย่างชัดเจน",
+    "智能对话" : "สนทนาอัจฉริยะ",
+    "伙伴,随叫随到" : "เพื่อนที่มาทันทีเมื่อเรียก",
+    "切换角色" : "เปลี่ยนบทบาท",
+    "按住说话" : "กดและพูด",
+    "同传听译模式使用介绍":"คำอธิบายการใช้โหมดแปลพร้อมฟัง",
+    "对话模式使用介绍" : "คำอธิบายการใช้โหมดสนทนา",
+    "中英互译模式使用介绍" : "คำอธิบายการใช้โหมดแปลระหว่างจีน-อังกฤษ",
+    "一方手持手机,一方戴上耳机,对手机发言时,耳机播放译文,对耳机发言时,手机播放译文" : "หนึ่งฝ่ายถือโทรศัพท์ อีกฝ่ายสวมหูฟัง เมื่อพูดไปที่โทรศัพท์ หูฟังจะเล่นคำแปล เมื่อพูดไปที่หูฟัง โทรศัพท์จะเล่นคำแปล",
+    "两人各佩戴一只耳机,选择源语言语种, 双方耳机中播放目标语言" : "ทั้งสองคนสวมหูฟังแต่ละคน一只 เลือกภาษาแหล่งที่มา หูฟังของทั้งสองฝ่ายจะเล่นภาษาเป้าหมาย",
+    "手机靠近音源收音,佩戴耳机收听译文" : "เอาโทรศัพท์靠近แหล่งเสียงเพื่อ收音 สวมหูฟังเพื่อฟังคำแปล",
+    "- 情景示例 -\n张张靠近手机讲中文,对方耳机播放英语" : "- ตัวอย่างสถานการณ์ -\nจางจาง靠近โทรศัพท์พูดภาษาจีน หูฟังของอีกฝ่ายเล่นภาษาอังกฤษ",
+    "- 情景示例 -\n张张戴一只耳机讲中文,双方耳机播放英文翻译 Lucy切换为英语发言后,双方耳机中播报中文翻译" : "- ตัวอย่างสถานการณ์ -\nจางจางสวมหูฟัง一只พูดภาษาจีน หูฟังของทั้งสองฝ่ายเล่นคำแปลภาษาอังกฤษ หลังจากลูซี่เปลี่ยนไปพูดภาษาอังกฤษ หูฟังของทั้งสองฝ่ายจะประกาศคำแปลภาษาจีน",
+    "- 情景示例 -\nLisa对着手机讲英语,小徐耳机中播放中文" : "- ตัวอย่างสถานการณ์ -\nลิซ่า พูดภาษาอังกฤษไปที่โทรศัพท์ หูฟังของเสี่ยวซู่เล่นภาษาจีน",
+    "开始体验" : "เริ่มต้นใช้งาน",
+    "下次不再提示":"ไม่แสดงอีกครั้งในครั้งต่อไป",
+    "当前正在录音,确定放弃当前录音吗":"กำลังบันทึกเสียงอยู่ ต้องการละทิ้งการบันทึกปัจจุบันหรือไม่",
+    "云同步":"ซิงโครไคลาวด์",
+    "是否上传运存储空间备份":"ต้องการอัปโหลดไปยังพื้นที่เก็บข้อมูลคลาวด์เพื่อสำรองหรือไม่",
+    
+    "请选择语言":"กรุณาเลือกภาษา",
+    "中文" : "ภาษาจีน",
+    "英文" : "ภาษาอังกฤษ",
+    "日文" : "ภาษาญี่ปุ่น",
+    "韩文" : "ภาษาเกาหลี",
+    "法文" : "ภาษาฝรั่งเศส",
+    "西班牙文" : "ภาษาสเปน",
+    "葡萄牙文" : "ภาษาโปรตุเกส",
+    "印度尼西亚文" : "ภาษาอินโดนีเซีย",
+    "俄文" : "ภาษารัสเซีย",
+    "马来文" : "ภาษามาเลเซีย",
+    
+    "保存录音" : "บันทึกเสียง",
+    "原文" : "ข้อความต้นฉบับ",
+    "译文" : "ข้อความแปล",
+    "摘要" : "สรุป",
+    "翻译" : "แปล",
+    "重命名" : "เปลี่ยนชื่อ",
+    "播放录音" : "เล่นบันทึกเสียง",
+    "更多" : "เพิ่มเติม",
+    "字号" : "ขนาดตัวอักษร",
+    "分享" : "แชร์",
+    "调整字号" : "ปรับขนาดตัวอักษร",
+    "小" : "เล็ก",
+    "标准" : "มาตรฐาน",
+    "大" : "ใหญ่",
+    "设置" : "การตั้งค่า",
+    "左耳" : "หูซ้าย",
+    "右耳" : "หูขวา",
+    "耳机" : "หูฟัง",
+    "手机" : "โทรศัพท์",
+    "此处将显示原文" : "ข้อความต้นฉบับจะ显示ที่นี่",
+    "此处将显示译文" : "ข้อความแปลจะ显示ที่นี่",
+    "请输入..." : "กรุณาใส่...",
+    "筛选录音" : "กรองบันทึกเสียง",
+    "全部录音":"บันทึกเสียงทั้งหมด",
+    "收藏录音" : "บันทึกเสียงที่บันทึกไว้",
+    "多选" : "เลือกหลายรายการ",
+    "导出" : "ส่งออก",
+    "您要删除这些录音吗?" : "คุณต้องการลบบันทึกเสียงเหล่านี้หรือไม่?",
+    "删除后,这些记录将无法恢复。" : "หลังจากลบ บันทึกเหล่านี้จะไม่สามารถกู้คืนได้",
+    "删除后,此记录将无法恢复":"หลังจากลบ บันทึกนี้将ไม่สามารถกู้คืนได้",
+    "您要删除这条录音吗?":"คุณต้องการลบบันทึกเสียงนี้หรือไม่?",
+    
+    "多个文件将压缩成一个.zip的文件以便于分享。请选择您需要导出的文件类型:" : "ไฟล์หลาย个将ถูกบีบอัดเป็นไฟล์.zip เพื่อความสะดวกในการแชร์ กรุณาเลือกประเภทไฟล์ที่คุณต้องการส่งออก:",
+    "仅音频文件" : "เฉพาะไฟล์เสียง",
+    "仅文档" : "เฉพาะเอกสาร",
+    "音频文件" : "ไฟล์เสียง",
+    "文档":"เอกสาร",
+    
+    "白噪音":"สัญญาณรบกวนสีขาว",
+    "EQ调音":"ปรับเสียงEQ",
+    "正常":"ปกติ",
+    "流行":"ป๊อป",
+    "经典":"คลาสสิก",
+    "爵士":"จัซ",
+    "摇滚":"ร็อค",
+    "自定义":"กำหนดเอง",
+    "查找耳机":"ค้นหาหูฟัง",
+    "自定义音效":"เสียงที่กำหนดเอง",
+    "音效风格":"สไตล์เสียง",
+    "左耳机响铃":"หูฟังซ้ายดัง",
+    "右耳机响铃":"หูฟังขวาดัง",
+    "耳机在附近,可通过响铃进行查找":"หูฟังอยู่ใกล้สามารถค้นหาได้ผ่านการดังสัญญาณ",
+    
+    "个智能设备":"อุปกรณ์อัจฉริยะ个",
+    "云储存空间" : "พื้นที่เก็บข้อมูลคลาวด์",
+    "电子说明书" : "คู่มืออิเล็กทรอนิกส์",
+    "固件升级" : "อัปเกรดเฟิร์มแวร์",
+    "语言设置" : "การตั้งค่าภาษา",
+    "更多设置" : "การตั้งค่าเพิ่มเติม",
+    "帮助与反馈" : "ความช่วยเหลือและคำติชม",
+    "关于" : "เกี่ยวกับ",
+    "设备详情":"รายละเอียดอุปกรณ์",
+    "设备名称":"ชื่ออุปกรณ์",
+    "设备ID":"IDอุปกรณ์",
+    "最近登录时间":"เวลาเข้าสู่ระบบล่าสุด",
+    "移除设备":"เอาอุปกรณ์ออก",
+    "确定要解绑该设备吗?":"ต้องการยกเลิกการเชื่อมต่ออุปกรณ์นี้หรือไม่?",
+    "移除设备后会同步退出账号,在此设备上将无法访问该账号的数据":"หลังจากเอาอุปกรณ์ออกจะออกจากบัญชีพร้อมกัน และจะไม่สามารถเข้าถึงข้อมูลของบัญชีนี้บนอุปกรณ์นี้ได้",
+    "设备地址":"ที่อยู่อุปกรณ์",
+    "硬件版本":"เวอร์ชันฮาร์ดแวร์",
+    "软件版本":"เวอร์ชันซอฟต์แวร์",
+    "设备信息":"ข้อมูลอุปกรณ์",
+    
+    "账号设置" : "การตั้งค่าบัญชี",
+    "登录方式" : "วิธีเข้าสู่ระบบ",
+    "账号密码" : "รหัสบัญชี",
+    "安全手机" : "โทรศัพท์ปลอดภัย",
+    "安全邮箱" : "อีเมลปลอดภัย",
+    "基本资料" : "ข้อมูลพื้นฐาน",
+    "登录设备管理" : "การจัดการอุปกรณ์เข้าสู่ระบบ",
+    "头像" : "รูปโปรไฟล์",
+    "昵称" : "ชื่อเล่น",
+    "性别" : "เพศ",
+    "国家与地区" : "ประเทศและภูมิภาค",
+    "请输入昵称" : "กรุณาใส่ชื่อเล่น",
+    "男" : "ชาย",
+    "女" : "หญิง",
+    "保密" : "สงวนไว้",
+    "国家/地区" : "ประเทศ/ภูมิภาค",
+    "请输入新的安全手机号码" : "กรุณาใส่หมายเลขโทรศัพท์ปลอดภัยใหม่",
+    "请输入手机号码" : "กรุณาใส่หมายเลขโทรศัพท์",
+    
+    "请输入新的安全邮箱地址" : "กรุณาใส่ที่อยู่อีเมลปลอดภัยใหม่",
+    "请输入邮箱地址" : "กรุณาใส่ที่อยู่อีเมล",
+    "请使用安全手机":"กรุณาใช้โทรศัพท์ปลอดภัย",
+    "请使用安全邮箱":"กรุณาใช้อีเมลปลอดภัย",
+    "获取验证码短信":"รับส่งข้อความรหัสยืนยัน",
+    "请输入型号查询" : "กรุณาใส่รุ่นเพื่อ查询",
+    "问题描述或建议" : "คำอธิบายปัญหาหรือคำแนะนำ",
+    "在线咨询" : "ปรึกษาประชุมออนไลน์",
+    "问题类型" : "ประเภทของปัญหา",
+    "功能异常" : "การทำงานผิดปกติ",
+    "意见与反馈" : "ความคิดเห็นและคำติชม",
+    "联系方式" : "ช่องทางการติดต่อ",
+    "请输入手机号或邮箱" : "กรุณาใส่หมายเลขโทรศัพท์หรืออีเมล",
+    "请至少用10个字描述问题,并添加截图,这有助于问题快速解决。" : "กรุณาอธิบายปัญหาด้วยอย่างน้อย10ตัวอักษร และเพิ่มภาพหน้าจอ ซึ่งจะช่วยในการแก้ไขปัญหาได้เร็วขึ้น",
+    "反馈历史" : "ประวัติการติชม",
+    "你好,请问有什么我可以帮助到您" : "สวัสดี มีอะไรที่ฉันสามารถช่วยคุณได้吗",
+    "请用一句话简单描述下您的问题~" : "กรุณาอธิบายปัญหาของคุณด้วยประโยคเดียวอย่างง่าย~",
+    "猜你想问" : "เดาได้ว่าคุณอาจถาม",
+    
+    
+    "当前版本" : "เวอร์ชันปัจจุบัน",
+    "检查更新" : "ตรวจสอบการอัปเดต",
+    "系统权限管理" : "การจัดการสิทธิ์ระบบ",
+    "切换账号" : "เปลี่ยนบัญชี",
+    "退出登录" : "ออกจากระบบ",
+    "注销账号" : "ยกเลิกบัญชี",
+    "提示" : "แจ้งเตือน",
+    "确定" : "ยืนยัน",
+    "确认" : "ยืนยัน",
+    "取消" : "ยกเลิก",
+    "删除" : "ลบ",
+    "下一步" : "ขั้นตอนต่อไป",
+    "确定要切换账号吗?" : "ต้องการเปลี่ยนบัญชีหรือไม่?",
+    "确定要退出登录吗?" : "ต้องการออกจากระบบหรือไม่?",
+    "真的要注销账号吗?" : "ต้องการยกเลิกบัญชีจริงๆหรือไม่?",
+    "用户协议" : "ข้อตกลงผู้ใช้",
+    "隐私政策" : "นโยบายความเป็นส่วนตัว",
+    "个人信息手机清单" : "รายการเก็บข้อมูลส่วนบุคคล",
+    "系统权限清单" : "รายการสิทธิ์ระบบ",
+    "撤回同意" : "ถอนการยินยอม",
+    "确认撤回" : "ยืนยันการถอน",
+    "请您确保您是有权进行本撤回同意隐私政策操作的相关当事人。撤回同意隐私政策,您将放弃以下资产或者权益:\n\n1.数据清空\n将会停止收集您的个人信息。您使用DeepChords应用过程中产生的数据将被清空;手机中DeepChords应用的缓存数据将被清除。\n\n2.设备解除绑定\nDeepChords账号中,所有设备会与您当前登录的账号解除绑定,并清除设备之前存储在服务器的数据。存储在物理设备中的数据请通过人工本地物理重置来清除。如果您需要重新使用设备,需要您再次进行绑定并且重新授权。\n\n3.其他\n此举还将撤回您对用户协议的同意,并退出DeepChords应用。\n\n请您知悉,撤回同意隐私政策不代表撤回同意前的相关行为和责任得到豁免或减轻。若您需要重新在该账号管理设备,需要您重新授权并绑定。请谨慎操作!" : "กรุณาตรวจสอบให้แน่ใจว่าคุณมีสิทธิ์ในการดำเนินการถอนการยินยอมนโยบายความเป็นส่วนตัวนี้ ถอนการยินยอมนโยบายความเป็นส่วนตัว คุณ将สูญเสียทรัพย์สินหรือสิทธิ์ต่อไปนี้:\n\n1.การล้างข้อมูล\nจะหยุดเก็บข้อมูลส่วนบุคคลของคุณ ข้อมูลที่สร้างขึ้นระหว่างการใช้แอป DeepChords จะ被ล้าง; ข้อมูลแคชของแอป DeepChords ในโทรศัพท์จะ被ล้าง\n\n2.การยกเลิกการเชื่อมต่ออุปกรณ์\nในบัญชี DeepChords อุปกรณ์ทั้งหมดจะถูกยกเลิกการเชื่อมต่อจากบัญชีที่คุณเข้าสู่ระบบปัจจุบัน และข้อมูลที่เก็บไว้ในเซิร์ฟเวอร์ของอุปกรณ์จะ被ล้าง สำหรับข้อมูลที่เก็บไว้ในอุปกรณ์ทางกายภาพ กรุณาล้างผ่านการรีเซ็ตทางกายภาพแบบโลคอลด้วยตนเอง หากคุณต้องการใช้อุปกรณ์อีกครั้ง คุณ需要เชื่อมต่อและให้สิทธิ์ใหม่อีกครั้ง\n\n3.อื่นๆ\nการกระทำนี้还将ถอนการยินยอมของคุณต่อข้อตกลงผู้ใช้ และออกจากแอป DeepChords\n\nกรุณาทราบว่าการถอนการยินยอมนโยบายความเป็นส่วนตัวไม่ได้หมายถึงการยกเว้นหรือลด责任จากการกระทำและ责任ที่เกิดขึ้นก่อนการถอนการยินยอม หากคุณ需要จัดการอุปกรณ์ในบัญชีนี้อีกครั้ง คุณ需要ให้สิทธิ์และเชื่อมต่อใหม่อีกครั้ง กรุณาดำเนินการอย่างระมัดระวัง!",
+    "您好, \n欢迎使用DeepChords" : "สวัสดี \nยินดีต้อนรับสู่ DeepChords",
+    "用户登录" : "เข้าสู่ระบบผู้ใช้",
+    "请输入密码" : "กรุณาใส่รหัสผ่าน",
+    "请输入手机号码/邮箱":"กรุณาใส่หมายเลขโทรศัพท์/อีเมล",
+    "登录并同意" : "เข้าสู่ระบบและยินยอม",
+    "《隐私政策》" : "《นโยบายความเป็นส่วนตัว》",
+    " 和 " : " และ ",
+    "《用户协议》" : "《ข้อตกลงผู้ใช้》",
+    "忘记密码" : "ลืมรหัสผ่าน",
+    "验证码登录" : "เข้าสู่ระบบด้วยรหัสยืนยัน",
+    "其他登录方式" : "วิธีเข้าสู่ระบบอื่นๆ",
+    "用户注册" : "ลงทะเบียนผู้ใช้",
+    "请输入验证码" : "กรุณาใส่รหัสยืนยัน",
+    "发送验证码":"ส่งรหัสยืนยัน",
+    "点击获取" : "คลิกเพื่อ获取",
+    "登录" : "เข้าสู่ระบบ",
+    "密码登录" : "เข้าสู่ระบบด้วยรหัสผ่าน",
+    "重置密码":"รีเซ็ตรหัสผ่าน",
+    "注册" : "ลงทะเบียน",
+    "请输入正确的手机号码" : "กรุณาใส่หมายเลขโทรศัพท์ที่ถูกต้อง",
+    "请求失败" : "คำขอไม่สำเร็จ",
+    "请求成功!":"คำขอสำเร็จ!",
+    "加载中...":"กำลังโหลด...",
+    "上传中...":"กำลังอัปโหลด...",
+    "连接中":"กำลังเชื่อมต่อ",
+    "连接成功":"เชื่อมต่อสำเร็จ",
+    "连接失败":"เชื่อมต่อไม่สำเร็จ",
+    "智能体":"อัจฉริยะ",
+    "已成功更新到云储存空间":"อัปเดต到พื้นที่เก็บข้อมูลคลาวด์สำเร็จแล้ว",
+]