diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java index 3556877d..cb550b3e 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java @@ -395,7 +395,20 @@ public class AgentServiceImpl extends BaseServiceImpl imp entity.setIntentModelId(template.getIntentModelId()); entity.setSystemPrompt(template.getSystemPrompt()); entity.setSummaryMemory(template.getSummaryMemory()); - entity.setChatHistoryConf(template.getChatHistoryConf()); + + // 根据记忆模型类型设置默认的chatHistoryConf值 + if (template.getMemModelId() != null) { + if (template.getMemModelId().equals("Memory_nomem")) { + // 无记忆功能的模型,默认不记录聊天记录 + entity.setChatHistoryConf(0); + } else { + // 有记忆功能的模型,默认记录文本和语音 + entity.setChatHistoryConf(2); + } + } else { + entity.setChatHistoryConf(template.getChatHistoryConf()); + } + entity.setLangCode(template.getLangCode()); entity.setLanguage(template.getLanguage()); } diff --git a/main/manager-web/src/components/AddModelDialog.vue b/main/manager-web/src/components/AddModelDialog.vue index 0e208b55..c95e95a9 100644 --- a/main/manager-web/src/components/AddModelDialog.vue +++ b/main/manager-web/src/components/AddModelDialog.vue @@ -200,6 +200,13 @@ export default { confirm() { this.saving = true; + // 校验模型ID不能为纯文字或空格 + if (this.formData.id && !this.validateModelId(this.formData.id)) { + this.$message.error(this.$t('modelConfigDialog.invalidModelId')); + this.saving = false; + return; + } + if (!this.formData.supplier) { this.$message.error(this.$t('addModelDialog.requiredSupplier')); this.saving = false; @@ -254,6 +261,38 @@ export default { this.providerFields = []; this.currentProvider = null; }, + + // 校验模型ID:不能为纯文字或空格 + validateModelId(modelId) { + if (!modelId || typeof modelId !== 'string') { + return false; + } + + // 去除首尾空格 + const trimmedId = modelId.trim(); + + // 检查是否为空或纯空格 + if (trimmedId === '') { + return false; + } + + // 检查是否只包含字母(纯文字) + if (/^[a-zA-Z]+$/.test(trimmedId)) { + return false; + } + + // 检查是否包含空格 + if (/\s/.test(trimmedId)) { + return false; + } + + // 允许字母、数字、下划线、连字符 + if (!/^[a-zA-Z0-9_-]+$/.test(trimmedId)) { + return false; + } + + return true; + } } } diff --git a/main/manager-web/src/i18n/de.js b/main/manager-web/src/i18n/de.js index fb271a44..f748128f 100644 --- a/main/manager-web/src/i18n/de.js +++ b/main/manager-web/src/i18n/de.js @@ -1,1264 +1,1265 @@ export default { - // Login page related prompt text - 'login.requiredUsername': 'Benutzername darf nicht leer sein', - 'login.requiredPassword': 'Passwort darf nicht leer sein', - 'login.requiredCaptcha': 'Captcha darf nicht leer sein', - 'login.requiredMobile': 'Bitte geben Sie eine gültige Handynummer ein', - 'login.loginSuccess': 'Anmeldung erfolgreich!', + // Login page related prompt text + 'login.requiredUsername': 'Benutzername darf nicht leer sein', + 'login.requiredPassword': 'Passwort darf nicht leer sein', + 'login.requiredCaptcha': 'Captcha darf nicht leer sein', + 'login.requiredMobile': 'Bitte geben Sie eine gültige Handynummer ein', + 'login.loginSuccess': 'Anmeldung erfolgreich!', - // HeaderBar component text - 'header.smartManagement': 'Agenten', - 'header.modelConfig': 'Modelle', - 'header.knowledgeBase': 'Wissen', - 'header.voiceCloneManagement': 'Stimmenklon', - 'header.voiceResourceManagement': 'Stimmressourcen', - 'header.userManagement': 'Benutzer', - 'header.otaManagement': 'OTA-Verwaltung', - 'header.paramDictionary': 'Mehr', - 'header.paramManagement': 'Parameterverwaltung', - 'header.dictManagement': 'Wörterbuchverwaltung', - 'header.agentTemplate': 'Standard-Rollenvorlagen', - 'header.searchHistory': 'Suchverlauf', - 'header.clearHistory': 'Verlauf löschen', - 'header.providerManagement': 'Anbieterverwaltung', - 'header.serverSideManagement': 'Serververwaltung', - 'header.changePassword': 'Passwort ändern', - 'header.logout': 'Abmelden', - 'header.searchPlaceholder': 'Nach Namen suchen..', + // HeaderBar component text + 'header.smartManagement': 'Agenten', + 'header.modelConfig': 'Modelle', + 'header.knowledgeBase': 'Wissen', + 'header.voiceCloneManagement': 'Stimmenklon', + 'header.voiceResourceManagement': 'Stimmressourcen', + 'header.userManagement': 'Benutzer', + 'header.otaManagement': 'OTA-Verwaltung', + 'header.paramDictionary': 'Mehr', + 'header.paramManagement': 'Parameterverwaltung', + 'header.dictManagement': 'Wörterbuchverwaltung', + 'header.agentTemplate': 'Standard-Rollenvorlagen', + 'header.searchHistory': 'Suchverlauf', + 'header.clearHistory': 'Verlauf löschen', + 'header.providerManagement': 'Anbieterverwaltung', + 'header.serverSideManagement': 'Serververwaltung', + 'header.changePassword': 'Passwort ändern', + 'header.logout': 'Abmelden', + 'header.searchPlaceholder': 'Nach Namen suchen..', - // McpToolCallDialog component text - 'mcpToolCall.title': 'Werkzeugaufruf', - 'mcpToolCall.execute': 'Ausführen', - 'mcpToolCall.chooseFunction': '1、Funktion auswählen', - 'mcpToolCall.searchFunction': 'Funktion suchen', - 'mcpToolCall.noResults': 'Keine passenden Funktionen gefunden', - 'mcpToolCall.settings': '2、Parametereinstellungen', - 'mcpToolCall.inputPlaceholder': 'Bitte {label} eingeben', - 'mcpToolCall.valueRange': 'Wertebereich: {min} - {max}', - 'mcpToolCall.selectPlaceholder': 'Bitte {label} auswählen', - 'mcpToolCall.lightTheme': 'Helles Thema', - 'mcpToolCall.darkTheme': 'Dunkles Thema', - 'mcpToolCall.pleaseSelect': 'Bitte wählen Sie eine Funktion', - 'mcpToolCall.cancel': 'Abbrechen', - 'mcpToolCall.requiredField': 'Bitte {field} eingeben', - 'mcpToolCall.minValue': 'Mindestwert ist {value}', - 'mcpToolCall.maxValue': 'Höchstwert ist {value}', - 'mcpToolCall.selectTool': 'Bitte wählen Sie ein Werkzeug zur Ausführung', - 'mcpToolCall.executionResult': '3、Ausführungsergebnis', - 'mcpToolCall.copyResult': 'Ergebnis kopieren', - 'mcpToolCall.noResultYet': 'Noch kein Ergebnis', - 'mcpToolCall.loadingToolList': 'Werkzeugliste wird geladen...', + // McpToolCallDialog component text + 'mcpToolCall.title': 'Werkzeugaufruf', + 'mcpToolCall.execute': 'Ausführen', + 'mcpToolCall.chooseFunction': '1、Funktion auswählen', + 'mcpToolCall.searchFunction': 'Funktion suchen', + 'mcpToolCall.noResults': 'Keine passenden Funktionen gefunden', + 'mcpToolCall.settings': '2、Parametereinstellungen', + 'mcpToolCall.inputPlaceholder': 'Bitte {label} eingeben', + 'mcpToolCall.valueRange': 'Wertebereich: {min} - {max}', + 'mcpToolCall.selectPlaceholder': 'Bitte {label} auswählen', + 'mcpToolCall.lightTheme': 'Helles Thema', + 'mcpToolCall.darkTheme': 'Dunkles Thema', + 'mcpToolCall.pleaseSelect': 'Bitte wählen Sie eine Funktion', + 'mcpToolCall.cancel': 'Abbrechen', + 'mcpToolCall.requiredField': 'Bitte {field} eingeben', + 'mcpToolCall.minValue': 'Mindestwert ist {value}', + 'mcpToolCall.maxValue': 'Höchstwert ist {value}', + 'mcpToolCall.selectTool': 'Bitte wählen Sie ein Werkzeug zur Ausführung', + 'mcpToolCall.executionResult': '3、Ausführungsergebnis', + 'mcpToolCall.copyResult': 'Ergebnis kopieren', + 'mcpToolCall.noResultYet': 'Noch kein Ergebnis', + 'mcpToolCall.loadingToolList': 'Werkzeugliste wird geladen...', - // Tool names - 'mcpToolCall.toolName.getDeviceStatus': 'Gerätestatus anzeigen', - 'mcpToolCall.toolName.setVolume': 'Lautstärke einstellen', - 'mcpToolCall.toolName.setBrightness': 'Helligkeit einstellen', - 'mcpToolCall.toolName.setTheme': 'Thema einstellen', - 'mcpToolCall.toolName.takePhoto': 'Foto aufnehmen & Erkennen', - 'mcpToolCall.toolName.getSystemInfo': 'Systeminformationen', - 'mcpToolCall.toolName.reboot': 'Gerät neu starten', - 'mcpToolCall.toolName.upgradeFirmware': 'Firmware aktualisieren', - 'mcpToolCall.toolName.getScreenInfo': 'Bildschirminformationen', - 'mcpToolCall.toolName.snapshot': 'Bildschirmfoto', - 'mcpToolCall.toolName.previewImage': 'Bildvorschau', - 'mcpToolCall.toolName.setDownloadUrl': 'Download-URL festlegen', + // Tool names + 'mcpToolCall.toolName.getDeviceStatus': 'Gerätestatus anzeigen', + 'mcpToolCall.toolName.setVolume': 'Lautstärke einstellen', + 'mcpToolCall.toolName.setBrightness': 'Helligkeit einstellen', + 'mcpToolCall.toolName.setTheme': 'Thema einstellen', + 'mcpToolCall.toolName.takePhoto': 'Foto aufnehmen & Erkennen', + 'mcpToolCall.toolName.getSystemInfo': 'Systeminformationen', + 'mcpToolCall.toolName.reboot': 'Gerät neu starten', + 'mcpToolCall.toolName.upgradeFirmware': 'Firmware aktualisieren', + 'mcpToolCall.toolName.getScreenInfo': 'Bildschirminformationen', + 'mcpToolCall.toolName.snapshot': 'Bildschirmfoto', + 'mcpToolCall.toolName.previewImage': 'Bildvorschau', + 'mcpToolCall.toolName.setDownloadUrl': 'Download-URL festlegen', - // Tool categories - 'mcpToolCall.category.audio': 'Audio', - 'mcpToolCall.category.display': 'Anzeige', - 'mcpToolCall.category.camera': 'Kamera', - 'mcpToolCall.category.system': 'System', - 'mcpToolCall.category.assets': 'Assets', - 'mcpToolCall.category.deviceInfo': 'Geräteinformationen', + // Tool categories + 'mcpToolCall.category.audio': 'Audio', + 'mcpToolCall.category.display': 'Anzeige', + 'mcpToolCall.category.camera': 'Kamera', + 'mcpToolCall.category.system': 'System', + 'mcpToolCall.category.assets': 'Assets', + 'mcpToolCall.category.deviceInfo': 'Geräteinformationen', - // Table categories and properties - 'mcpToolCall.table.audioSpeaker': 'Audio-Lautsprecher', - 'mcpToolCall.table.screen': 'Bildschirm', - 'mcpToolCall.table.network': 'Netzwerk', - 'mcpToolCall.table.audioControl': 'Audio-Steuerung', - 'mcpToolCall.table.screenControl': 'Bildschirmsteuerung', - 'mcpToolCall.table.systemControl': 'Systemsteuerung', - 'mcpToolCall.table.screenInfo': 'Bildschirminformationen', - 'mcpToolCall.table.hardwareInfo': 'Hardware-Informationen', - 'mcpToolCall.table.memoryInfo': 'Speicherinformationen', - 'mcpToolCall.table.applicationInfo': 'Anwendungsinformationen', - 'mcpToolCall.table.networkInfo': 'Netzwerkinformationen', - 'mcpToolCall.table.displayInfo': 'Anzeigeinformationen', - 'mcpToolCall.table.deviceInfo': 'Geräteinformationen', - 'mcpToolCall.table.systemInfo': 'Systeminformationen', - // Table column headers - 'mcpToolCall.table.component': 'Komponente', - 'mcpToolCall.table.property': 'Eigenschaft', - 'mcpToolCall.table.value': 'Wert', + // Table categories and properties + 'mcpToolCall.table.audioSpeaker': 'Audio-Lautsprecher', + 'mcpToolCall.table.screen': 'Bildschirm', + 'mcpToolCall.table.network': 'Netzwerk', + 'mcpToolCall.table.audioControl': 'Audio-Steuerung', + 'mcpToolCall.table.screenControl': 'Bildschirmsteuerung', + 'mcpToolCall.table.systemControl': 'Systemsteuerung', + 'mcpToolCall.table.screenInfo': 'Bildschirminformationen', + 'mcpToolCall.table.hardwareInfo': 'Hardware-Informationen', + 'mcpToolCall.table.memoryInfo': 'Speicherinformationen', + 'mcpToolCall.table.applicationInfo': 'Anwendungsinformationen', + 'mcpToolCall.table.networkInfo': 'Netzwerkinformationen', + 'mcpToolCall.table.displayInfo': 'Anzeigeinformationen', + 'mcpToolCall.table.deviceInfo': 'Geräteinformationen', + 'mcpToolCall.table.systemInfo': 'Systeminformationen', + // Table column headers + 'mcpToolCall.table.component': 'Komponente', + 'mcpToolCall.table.property': 'Eigenschaft', + 'mcpToolCall.table.value': 'Wert', - 'mcpToolCall.prop.volume': 'Lautstärke', - 'mcpToolCall.prop.brightness': 'Helligkeit', - 'mcpToolCall.prop.theme': 'Thema', - 'mcpToolCall.prop.type': 'Typ', - 'mcpToolCall.prop.ssid': 'SSID', - 'mcpToolCall.prop.signalStrength': 'Signalstärke', - 'mcpToolCall.prop.operationResult': 'Betriebsergebnis', - 'mcpToolCall.prop.width': 'Breite', - 'mcpToolCall.prop.height': 'Höhe', - 'mcpToolCall.prop.screenType': 'Typ', - 'mcpToolCall.prop.chipModel': 'Chip-Modell', - 'mcpToolCall.prop.cpuCores': 'CPU-Kerne', - 'mcpToolCall.prop.chipVersion': 'Chip-Version', - 'mcpToolCall.prop.flashSize': 'Flash-Größe', - 'mcpToolCall.prop.minFreeHeap': 'Minimaler freier Heap', - 'mcpToolCall.prop.applicationName': 'Anwendungsname', - 'mcpToolCall.prop.applicationVersion': 'Anwendungsversion', - 'mcpToolCall.prop.compileTime': 'Kompilierzeit', - 'mcpToolCall.prop.idfVersion': 'IDF-Version', - 'mcpToolCall.prop.macAddress': 'MAC-Adresse', - 'mcpToolCall.prop.ipAddress': 'IP-Adresse', - 'mcpToolCall.prop.wifiName': 'WiFi-Name', - 'mcpToolCall.prop.wifiChannel': 'WiFi-Kanal', - 'mcpToolCall.prop.screenSize': 'Bildschirmgröße', - 'mcpToolCall.prop.deviceUuid': 'Geräte-UUID', - 'mcpToolCall.prop.systemLanguage': 'Systemsprache', - 'mcpToolCall.prop.currentOtaPartition': 'Aktuelle OTA-Partition', - 'mcpToolCall.prop.getResult': 'Ergebnis abrufen', - 'mcpToolCall.prop.url': 'URL', - 'mcpToolCall.prop.quality': 'Qualität', - 'mcpToolCall.prop.question': 'Frage', + 'mcpToolCall.prop.volume': 'Lautstärke', + 'mcpToolCall.prop.brightness': 'Helligkeit', + 'mcpToolCall.prop.theme': 'Thema', + 'mcpToolCall.prop.type': 'Typ', + 'mcpToolCall.prop.ssid': 'SSID', + 'mcpToolCall.prop.signalStrength': 'Signalstärke', + 'mcpToolCall.prop.operationResult': 'Betriebsergebnis', + 'mcpToolCall.prop.width': 'Breite', + 'mcpToolCall.prop.height': 'Höhe', + 'mcpToolCall.prop.screenType': 'Typ', + 'mcpToolCall.prop.chipModel': 'Chip-Modell', + 'mcpToolCall.prop.cpuCores': 'CPU-Kerne', + 'mcpToolCall.prop.chipVersion': 'Chip-Version', + 'mcpToolCall.prop.flashSize': 'Flash-Größe', + 'mcpToolCall.prop.minFreeHeap': 'Minimaler freier Heap', + 'mcpToolCall.prop.applicationName': 'Anwendungsname', + 'mcpToolCall.prop.applicationVersion': 'Anwendungsversion', + 'mcpToolCall.prop.compileTime': 'Kompilierzeit', + 'mcpToolCall.prop.idfVersion': 'IDF-Version', + 'mcpToolCall.prop.macAddress': 'MAC-Adresse', + 'mcpToolCall.prop.ipAddress': 'IP-Adresse', + 'mcpToolCall.prop.wifiName': 'WiFi-Name', + 'mcpToolCall.prop.wifiChannel': 'WiFi-Kanal', + 'mcpToolCall.prop.screenSize': 'Bildschirmgröße', + 'mcpToolCall.prop.deviceUuid': 'Geräte-UUID', + 'mcpToolCall.prop.systemLanguage': 'Systemsprache', + 'mcpToolCall.prop.currentOtaPartition': 'Aktuelle OTA-Partition', + 'mcpToolCall.prop.getResult': 'Ergebnis abrufen', + 'mcpToolCall.prop.url': 'URL', + 'mcpToolCall.prop.quality': 'Qualität', + 'mcpToolCall.prop.question': 'Frage', - // Tool help texts - 'mcpToolCall.help.getDeviceStatus': 'Aktuellen Betriebsstatus des Geräts anzeigen, einschließlich Lautstärke, Bildschirm, Batterie und anderen Informationen.', - 'mcpToolCall.help.setVolume': 'Lautstärke des Geräts anpassen, bitte einen Wert zwischen 0-100 eingeben.', - 'mcpToolCall.help.setBrightness': 'Helligkeit des Gerätebildschirms anpassen, bitte einen Wert zwischen 0-100 eingeben.', - 'mcpToolCall.help.setTheme': 'Anzeigethema des Gerätebildschirms wechseln, Sie können Hell- oder Dunkelmodus wählen.', - 'mcpToolCall.help.takePhoto': 'Fotos mit der Gerätekamera aufnehmen und Erkennungsanalyse durchführen, bitte geben Sie Ihre Frage ein.', - 'mcpToolCall.help.getSystemInfo': 'Systeminformationen des Geräts abrufen, einschließlich Hardwarespezifikationen, Softwareversion etc.', - 'mcpToolCall.help.reboot': 'Gerät neu starten, das Gerät wird nach Ausführung neu gestartet.', - 'mcpToolCall.help.upgradeFirmware': 'Gerätefirmware von der angegebenen URL herunterladen und aktualisieren, das Gerät startet nach der Aktualisierung automatisch neu.', - 'mcpToolCall.help.getScreenInfo': 'Detaillierte Informationen zum Bildschirm abrufen, wie Auflösung, Größe und andere Parameter.', - 'mcpToolCall.help.snapshot': 'Screenshot des aktuellen Bildschirms erstellen und an die angegebene URL hochladen.', - 'mcpToolCall.help.previewImage': 'Bilder von der angegebenen URL auf dem Gerätebildschirm in der Vorschau anzeigen.', - 'mcpToolCall.help.setDownloadUrl': 'Download-Adresse für Geräteressourcendateien festlegen.', + // Tool help texts + 'mcpToolCall.help.getDeviceStatus': 'Aktuellen Betriebsstatus des Geräts anzeigen, einschließlich Lautstärke, Bildschirm, Batterie und anderen Informationen.', + 'mcpToolCall.help.setVolume': 'Lautstärke des Geräts anpassen, bitte einen Wert zwischen 0-100 eingeben.', + 'mcpToolCall.help.setBrightness': 'Helligkeit des Gerätebildschirms anpassen, bitte einen Wert zwischen 0-100 eingeben.', + 'mcpToolCall.help.setTheme': 'Anzeigethema des Gerätebildschirms wechseln, Sie können Hell- oder Dunkelmodus wählen.', + 'mcpToolCall.help.takePhoto': 'Fotos mit der Gerätekamera aufnehmen und Erkennungsanalyse durchführen, bitte geben Sie Ihre Frage ein.', + 'mcpToolCall.help.getSystemInfo': 'Systeminformationen des Geräts abrufen, einschließlich Hardwarespezifikationen, Softwareversion etc.', + 'mcpToolCall.help.reboot': 'Gerät neu starten, das Gerät wird nach Ausführung neu gestartet.', + 'mcpToolCall.help.upgradeFirmware': 'Gerätefirmware von der angegebenen URL herunterladen und aktualisieren, das Gerät startet nach der Aktualisierung automatisch neu.', + 'mcpToolCall.help.getScreenInfo': 'Detaillierte Informationen zum Bildschirm abrufen, wie Auflösung, Größe und andere Parameter.', + 'mcpToolCall.help.snapshot': 'Screenshot des aktuellen Bildschirms erstellen und an die angegebene URL hochladen.', + 'mcpToolCall.help.previewImage': 'Bilder von der angegebenen URL auf dem Gerätebildschirm in der Vorschau anzeigen.', + 'mcpToolCall.help.setDownloadUrl': 'Download-Adresse für Geräteressourcendateien festlegen.', - // Other text - 'mcpToolCall.text.strong': 'Stark', - 'mcpToolCall.text.medium': 'Mittel', - 'mcpToolCall.text.weak': 'Schwach', - 'mcpToolCall.text.dark': 'Dunkel', - 'mcpToolCall.text.light': 'Hell', - 'mcpToolCall.text.setSuccess': 'Einstellung erfolgreich', - 'mcpToolCall.text.setFailed': 'Einstellung fehlgeschlagen', - 'mcpToolCall.text.brightnessSetSuccess': 'Helligkeitseinstellung erfolgreich', - 'mcpToolCall.text.brightnessSetFailed': 'Helligkeitseinstellung fehlgeschlagen', - 'mcpToolCall.text.themeSetSuccess': 'Themeneinstellung erfolgreich', - 'mcpToolCall.text.themeSetFailed': 'Themeneinstellung fehlgeschlagen', - 'mcpToolCall.text.rebootCommandSent': 'Neustartbefehl gesendet', - 'mcpToolCall.text.rebootFailed': 'Neustart fehlgeschlagen', - 'mcpToolCall.text.monochrome': 'Monochrom-Bildschirm', - 'mcpToolCall.text.color': 'Farbbildschirm', - 'mcpToolCall.text.getSuccessParseFailed': 'Abruf erfolgreich, aber Analyse fehlgeschlagen', - 'mcpToolCall.text.getFailed': 'Abruf fehlgeschlagen', - 'mcpToolCall.text.getSuccessFormatError': 'Abruf erfolgreich, aber Datenformat abnormal', + // Other text + 'mcpToolCall.text.strong': 'Stark', + 'mcpToolCall.text.medium': 'Mittel', + 'mcpToolCall.text.weak': 'Schwach', + 'mcpToolCall.text.dark': 'Dunkel', + 'mcpToolCall.text.light': 'Hell', + 'mcpToolCall.text.setSuccess': 'Einstellung erfolgreich', + 'mcpToolCall.text.setFailed': 'Einstellung fehlgeschlagen', + 'mcpToolCall.text.brightnessSetSuccess': 'Helligkeitseinstellung erfolgreich', + 'mcpToolCall.text.brightnessSetFailed': 'Helligkeitseinstellung fehlgeschlagen', + 'mcpToolCall.text.themeSetSuccess': 'Themeneinstellung erfolgreich', + 'mcpToolCall.text.themeSetFailed': 'Themeneinstellung fehlgeschlagen', + 'mcpToolCall.text.rebootCommandSent': 'Neustartbefehl gesendet', + 'mcpToolCall.text.rebootFailed': 'Neustart fehlgeschlagen', + 'mcpToolCall.text.monochrome': 'Monochrom-Bildschirm', + 'mcpToolCall.text.color': 'Farbbildschirm', + 'mcpToolCall.text.getSuccessParseFailed': 'Abruf erfolgreich, aber Analyse fehlgeschlagen', + 'mcpToolCall.text.getFailed': 'Abruf fehlgeschlagen', + 'mcpToolCall.text.getSuccessFormatError': 'Abruf erfolgreich, aber Datenformat abnormal', - // Dictionary data dialog related - 'dictDataDialog.addDictData': 'Wörterbuchdaten hinzufügen', - 'dictDataDialog.dictLabel': 'Wörterbuch-Label', - 'dictDataDialog.dictLabelPlaceholder': 'Bitte Wörterbuch-Label eingeben', - 'dictDataDialog.dictValue': 'Wörterbuch-Wert', - 'dictDataDialog.dictValuePlaceholder': 'Bitte Wörterbuch-Wert eingeben', - 'dictDataDialog.sort': 'Sortierung', - 'dictDataDialog.requiredDictLabel': 'Bitte Wörterbuch-Label eingeben', - 'dictDataDialog.requiredDictValue': 'Bitte Wörterbuch-Wert eingeben', + // Dictionary data dialog related + 'dictDataDialog.addDictData': 'Wörterbuchdaten hinzufügen', + 'dictDataDialog.dictLabel': 'Wörterbuch-Label', + 'dictDataDialog.dictLabelPlaceholder': 'Bitte Wörterbuch-Label eingeben', + 'dictDataDialog.dictValue': 'Wörterbuch-Wert', + 'dictDataDialog.dictValuePlaceholder': 'Bitte Wörterbuch-Wert eingeben', + 'dictDataDialog.sort': 'Sortierung', + 'dictDataDialog.requiredDictLabel': 'Bitte Wörterbuch-Label eingeben', + 'dictDataDialog.requiredDictValue': 'Bitte Wörterbuch-Wert eingeben', - // Dictionary type dialog related - 'dictTypeDialog.addDictType': 'Wörterbuchtyp hinzufügen', - 'dictTypeDialog.dictName': 'Wörterbuchtyp-Name', - 'dictTypeDialog.dictNamePlaceholder': 'Bitte Wörterbuchtyp-Namen eingeben', - 'dictTypeDialog.dictType': 'Wörterbuchtyp-Code', - 'dictTypeDialog.dictTypePlaceholder': 'Bitte Wörterbuchtyp-Code eingeben', - 'dictTypeDialog.requiredDictName': 'Bitte Wörterbuchtyp-Namen eingeben', - 'dictTypeDialog.requiredDictType': 'Bitte Wörterbuchtyp-Code eingeben', + // Dictionary type dialog related + 'dictTypeDialog.addDictType': 'Wörterbuchtyp hinzufügen', + 'dictTypeDialog.dictName': 'Wörterbuchtyp-Name', + 'dictTypeDialog.dictNamePlaceholder': 'Bitte Wörterbuchtyp-Namen eingeben', + 'dictTypeDialog.dictType': 'Wörterbuchtyp-Code', + 'dictTypeDialog.dictTypePlaceholder': 'Bitte Wörterbuchtyp-Code eingeben', + 'dictTypeDialog.requiredDictName': 'Bitte Wörterbuchtyp-Namen eingeben', + 'dictTypeDialog.requiredDictType': 'Bitte Wörterbuchtyp-Code eingeben', - // Audio edit dialog related - 'editVoiceDialog.voiceCode': 'Stimmcode', - 'editVoiceDialog.voiceCodePlaceholder': 'Bitte Stimmcode eingeben', - 'editVoiceDialog.voiceName': 'Stimmname', - 'editVoiceDialog.voiceNamePlaceholder': 'Bitte Stimmnamen eingeben', - 'editVoiceDialog.languageType': 'Sprachtyp', - 'editVoiceDialog.languageTypePlaceholder': 'Bitte Sprachtyp eingeben', - 'editVoiceDialog.sortNumber': 'Sortiernummer', - 'editVoiceDialog.remark': 'Bemerkung', - 'editVoiceDialog.remarkPlaceholder': 'Bitte Bemerkungsinhalt eingeben', - 'editVoiceDialog.generatePreview': 'Vorschau generieren', - 'editVoiceDialog.defaultVoiceName': 'Wawa Xiaohe', - 'editVoiceDialog.defaultLanguageType': 'Chinesisch', - 'editVoiceDialog.requiredVoiceCode': 'Bitte Stimmcode eingeben', - 'editVoiceDialog.requiredVoiceName': 'Bitte Stimmnamen eingeben', + // Audio edit dialog related + 'editVoiceDialog.voiceCode': 'Stimmcode', + 'editVoiceDialog.voiceCodePlaceholder': 'Bitte Stimmcode eingeben', + 'editVoiceDialog.voiceName': 'Stimmname', + 'editVoiceDialog.voiceNamePlaceholder': 'Bitte Stimmnamen eingeben', + 'editVoiceDialog.languageType': 'Sprachtyp', + 'editVoiceDialog.languageTypePlaceholder': 'Bitte Sprachtyp eingeben', + 'editVoiceDialog.sortNumber': 'Sortiernummer', + 'editVoiceDialog.remark': 'Bemerkung', + 'editVoiceDialog.remarkPlaceholder': 'Bitte Bemerkungsinhalt eingeben', + 'editVoiceDialog.generatePreview': 'Vorschau generieren', + 'editVoiceDialog.defaultVoiceName': 'Wawa Xiaohe', + 'editVoiceDialog.defaultLanguageType': 'Chinesisch', + 'editVoiceDialog.requiredVoiceCode': 'Bitte Stimmcode eingeben', + 'editVoiceDialog.requiredVoiceName': 'Bitte Stimmnamen eingeben', - // Firmware dialog related - 'firmwareDialog.firmwareName': 'Firmware-Name', - 'firmwareDialog.firmwareNamePlaceholder': 'Bitte Firmware-Namen eingeben (Board + Version)', - 'firmwareDialog.firmwareType': 'Firmware-Typ', - 'firmwareDialog.firmwareTypePlaceholder': 'Bitte Firmware-Typ auswählen', - 'firmwareDialog.version': 'Version', - 'firmwareDialog.versionPlaceholder': 'Bitte Version eingeben (x.x.x Format)', - 'firmwareDialog.firmwareFile': 'Firmware-Datei', - 'firmwareDialog.clickUpload': 'Zum Hochladen klicken', - 'firmwareDialog.uploadTip': 'Nur Firmware-Dateien (.bin/.apk) werden unterstützt, Größe sollte 100MB nicht überschreiten', - 'firmwareDialog.uploadHint': 'Hinweis: Bitte die vorab zusammengeführte xiaozhi.bin-Datei hochladen, nicht die zusammengeführte merged-binary.bin-Datei', - 'firmwareDialog.remark': 'Bemerkung', - 'firmwareDialog.remarkPlaceholder': 'Bitte Bemerkungsinformationen eingeben', - 'firmwareDialog.requiredFirmwareName': 'Bitte Firmware-Namen eingeben (Board + Version)', - 'firmwareDialog.requiredFirmwareType': 'Bitte Firmware-Typ auswählen', - 'firmwareDialog.requiredVersion': 'Bitte Version eingeben', - 'firmwareDialog.versionFormatError': 'Versionsformat falsch, bitte x.x.x Format eingeben', - 'firmwareDialog.requiredFirmwareFile': 'Bitte Firmware-Datei hochladen', - 'firmwareDialog.invalidFileType': 'Nur .bin/.apk Format-Firmware-Dateien werden unterstützt!', - 'firmwareDialog.invalidFileSize': 'Firmware-Dateigröße darf 100MB nicht überschreiten!', - 'firmwareDialog.uploadSuccess': 'Firmware-Datei erfolgreich hochgeladen', - 'firmwareDialog.uploadFailed': 'Datei-Upload fehlgeschlagen', + // Firmware dialog related + 'firmwareDialog.firmwareName': 'Firmware-Name', + 'firmwareDialog.firmwareNamePlaceholder': 'Bitte Firmware-Namen eingeben (Board + Version)', + 'firmwareDialog.firmwareType': 'Firmware-Typ', + 'firmwareDialog.firmwareTypePlaceholder': 'Bitte Firmware-Typ auswählen', + 'firmwareDialog.version': 'Version', + 'firmwareDialog.versionPlaceholder': 'Bitte Version eingeben (x.x.x Format)', + 'firmwareDialog.firmwareFile': 'Firmware-Datei', + 'firmwareDialog.clickUpload': 'Zum Hochladen klicken', + 'firmwareDialog.uploadTip': 'Nur Firmware-Dateien (.bin/.apk) werden unterstützt, Größe sollte 100MB nicht überschreiten', + 'firmwareDialog.uploadHint': 'Hinweis: Bitte die vorab zusammengeführte xiaozhi.bin-Datei hochladen, nicht die zusammengeführte merged-binary.bin-Datei', + 'firmwareDialog.remark': 'Bemerkung', + 'firmwareDialog.remarkPlaceholder': 'Bitte Bemerkungsinformationen eingeben', + 'firmwareDialog.requiredFirmwareName': 'Bitte Firmware-Namen eingeben (Board + Version)', + 'firmwareDialog.requiredFirmwareType': 'Bitte Firmware-Typ auswählen', + 'firmwareDialog.requiredVersion': 'Bitte Version eingeben', + 'firmwareDialog.versionFormatError': 'Versionsformat falsch, bitte x.x.x Format eingeben', + 'firmwareDialog.requiredFirmwareFile': 'Bitte Firmware-Datei hochladen', + 'firmwareDialog.invalidFileType': 'Nur .bin/.apk Format-Firmware-Dateien werden unterstützt!', + 'firmwareDialog.invalidFileSize': 'Firmware-Dateigröße darf 100MB nicht überschreiten!', + 'firmwareDialog.uploadSuccess': 'Firmware-Datei erfolgreich hochgeladen', + 'firmwareDialog.uploadFailed': 'Datei-Upload fehlgeschlagen', - // Voice print dialog related - 'voicePrintDialog.addSpeaker': 'Sprecher hinzufügen', - 'voicePrintDialog.voicePrintVector': 'Stimmabdruck-Vektor', - 'voicePrintDialog.selectVoiceMessage': 'Bitte wählen Sie eine Sprachnachricht', - 'voicePrintDialog.name': 'Name', - 'voicePrintDialog.enterName': 'Bitte Namen eingeben', - 'voicePrintDialog.description': 'Beschreibung', - 'voicePrintDialog.enterDescription': 'Bitte Beschreibung eingeben', - 'voicePrintDialog.save': 'Speichern', - 'voicePrintDialog.cancel': 'Abbrechen', - 'voicePrintDialog.requiredDescription': 'Bitte Beschreibung eingeben', - 'voicePrintDialog.requiredName': 'Bitte Namen eingeben', - 'voicePrintDialog.requiredAudioVector': 'Bitte Audio-Vektor auswählen', + // Voice print dialog related + 'voicePrintDialog.addSpeaker': 'Sprecher hinzufügen', + 'voicePrintDialog.voicePrintVector': 'Stimmabdruck-Vektor', + 'voicePrintDialog.selectVoiceMessage': 'Bitte wählen Sie eine Sprachnachricht', + 'voicePrintDialog.name': 'Name', + 'voicePrintDialog.enterName': 'Bitte Namen eingeben', + 'voicePrintDialog.description': 'Beschreibung', + 'voicePrintDialog.enterDescription': 'Bitte Beschreibung eingeben', + 'voicePrintDialog.save': 'Speichern', + 'voicePrintDialog.cancel': 'Abbrechen', + 'voicePrintDialog.requiredDescription': 'Bitte Beschreibung eingeben', + 'voicePrintDialog.requiredName': 'Bitte Namen eingeben', + 'voicePrintDialog.requiredAudioVector': 'Bitte Audio-Vektor auswählen', - // Voice print page related - 'voicePrint.pageTitle': 'Stimmabdruck-Erkennung', - 'voicePrint.name': 'Name', - 'voicePrint.description': 'Beschreibung', - 'voicePrint.createTime': 'Erstellungszeit', - 'voicePrint.action': 'Aktion', - 'voicePrint.edit': 'Bearbeiten', - 'voicePrint.delete': 'Löschen', - 'voicePrint.add': 'Hinzufügen', - 'voicePrint.addSpeaker': 'Sprecher hinzufügen', - 'voicePrint.editSpeaker': 'Sprecher bearbeiten', - 'voicePrint.fetchFailed': 'Stimmabdruck-Liste konnte nicht abgerufen werden', - 'voicePrint.updateSuccess': 'Aktualisierung erfolgreich', - 'voicePrint.addSuccess': 'Hinzufügen erfolgreich', - 'voicePrint.confirmDelete': 'Sind Sie sicher, dass Sie diesen Stimmabdruck löschen möchten?', - 'voicePrint.warning': 'Warnung', - 'voicePrint.confirm': 'Bestätigen', - 'voicePrint.cancel': 'Abbrechen', - 'voicePrint.deleteSuccess': 'Stimmabdruck erfolgreich gelöscht', - 'voicePrint.deleteFailed': 'Löschen fehlgeschlagen, bitte versuchen Sie es erneut', - 'voicePrint.cancelDelete': 'Löschvorgang abgebrochen', - 'voicePrint.closeOperation': 'Vorgang geschlossen', - 'voicePrint.loading': 'Lädt...', + // Voice print page related + 'voicePrint.pageTitle': 'Stimmabdruck-Erkennung', + 'voicePrint.name': 'Name', + 'voicePrint.description': 'Beschreibung', + 'voicePrint.createTime': 'Erstellungszeit', + 'voicePrint.action': 'Aktion', + 'voicePrint.edit': 'Bearbeiten', + 'voicePrint.delete': 'Löschen', + 'voicePrint.add': 'Hinzufügen', + 'voicePrint.addSpeaker': 'Sprecher hinzufügen', + 'voicePrint.editSpeaker': 'Sprecher bearbeiten', + 'voicePrint.fetchFailed': 'Stimmabdruck-Liste konnte nicht abgerufen werden', + 'voicePrint.updateSuccess': 'Aktualisierung erfolgreich', + 'voicePrint.addSuccess': 'Hinzufügen erfolgreich', + 'voicePrint.confirmDelete': 'Sind Sie sicher, dass Sie diesen Stimmabdruck löschen möchten?', + 'voicePrint.warning': 'Warnung', + 'voicePrint.confirm': 'Bestätigen', + 'voicePrint.cancel': 'Abbrechen', + 'voicePrint.deleteSuccess': 'Stimmabdruck erfolgreich gelöscht', + 'voicePrint.deleteFailed': 'Löschen fehlgeschlagen, bitte versuchen Sie es erneut', + 'voicePrint.cancelDelete': 'Löschvorgang abgebrochen', + 'voicePrint.closeOperation': 'Vorgang geschlossen', + 'voicePrint.loading': 'Lädt...', - // Manual add device dialog related - 'manualAddDeviceDialog.title': 'Manuell Gerät hinzufügen', - 'manualAddDeviceDialog.deviceType': 'Gerätetyp', - 'manualAddDeviceDialog.deviceTypePlaceholder': 'Bitte Gerätetyp auswählen', - 'manualAddDeviceDialog.firmwareVersion': 'Firmware-Version', - 'manualAddDeviceDialog.firmwareVersionPlaceholder': 'Bitte Firmware-Version eingeben', - 'manualAddDeviceDialog.macAddress': 'Mac-Adresse', - 'manualAddDeviceDialog.macAddressPlaceholder': 'Bitte Mac-Adresse eingeben', - 'manualAddDeviceDialog.confirm': 'Bestätigen', - 'manualAddDeviceDialog.cancel': 'Abbrechen', - 'manualAddDeviceDialog.requiredMacAddress': 'Bitte Mac-Adresse eingeben', - 'manualAddDeviceDialog.invalidMacAddress': 'Bitte korrektes Mac-Adressformat eingeben, z.B.: 00:1A:2B:3C:4D:5E', - 'manualAddDeviceDialog.requiredDeviceType': 'Bitte Gerätetyp auswählen', - 'manualAddDeviceDialog.requiredFirmwareVersion': 'Bitte Firmware-Version eingeben', - 'manualAddDeviceDialog.getFirmwareTypeFailed': 'Firmware-Typ konnte nicht abgerufen werden', - 'manualAddDeviceDialog.addSuccess': 'Gerät erfolgreich hinzugefügt', - 'manualAddDeviceDialog.addFailed': 'Hinzufügen fehlgeschlagen', + // Manual add device dialog related + 'manualAddDeviceDialog.title': 'Manuell Gerät hinzufügen', + 'manualAddDeviceDialog.deviceType': 'Gerätetyp', + 'manualAddDeviceDialog.deviceTypePlaceholder': 'Bitte Gerätetyp auswählen', + 'manualAddDeviceDialog.firmwareVersion': 'Firmware-Version', + 'manualAddDeviceDialog.firmwareVersionPlaceholder': 'Bitte Firmware-Version eingeben', + 'manualAddDeviceDialog.macAddress': 'Mac-Adresse', + 'manualAddDeviceDialog.macAddressPlaceholder': 'Bitte Mac-Adresse eingeben', + 'manualAddDeviceDialog.confirm': 'Bestätigen', + 'manualAddDeviceDialog.cancel': 'Abbrechen', + 'manualAddDeviceDialog.requiredMacAddress': 'Bitte Mac-Adresse eingeben', + 'manualAddDeviceDialog.invalidMacAddress': 'Bitte korrektes Mac-Adressformat eingeben, z.B.: 00:1A:2B:3C:4D:5E', + 'manualAddDeviceDialog.requiredDeviceType': 'Bitte Gerätetyp auswählen', + 'manualAddDeviceDialog.requiredFirmwareVersion': 'Bitte Firmware-Version eingeben', + 'manualAddDeviceDialog.getFirmwareTypeFailed': 'Firmware-Typ konnte nicht abgerufen werden', + 'manualAddDeviceDialog.addSuccess': 'Gerät erfolgreich hinzugefügt', + 'manualAddDeviceDialog.addFailed': 'Hinzufügen fehlgeschlagen', - // AddModelDialog component related - 'addModelDialog.requiredSupplier': 'Bitte wählen Sie einen Anbieter', + // AddModelDialog component related + 'addModelDialog.requiredSupplier': 'Bitte wählen Sie einen Anbieter', - // Register page related - 'register.title': 'Konto erstellen', - 'register.welcome': 'Willkommen bei XiaoZhi AI', - 'register.usernamePlaceholder': 'Bitte Benutzernamen eingeben', - 'register.mobilePlaceholder': 'Bitte Handynummer eingeben', - 'register.captchaPlaceholder': 'Bitte Captcha eingeben', - 'register.mobileCaptchaPlaceholder': 'Bitte SMS-Bestätigungscode eingeben', - 'register.passwordPlaceholder': 'Bitte Passwort festlegen', - 'register.confirmPasswordPlaceholder': 'Bitte Passwort bestätigen', - 'register.goToLogin': 'Bereits ein Konto? Anmelden', - 'register.registerButton': 'Registrieren', - 'register.agreeTo': 'Durch Registrierung stimmen Sie unseren', - 'register.userAgreement': 'Nutzungsbedingungen', - 'register.privacyPolicy': 'Datenschutzrichtlinie', - 'register.notAllowRegister': 'Benutzerregistrierung nicht erlaubt', - 'register.captchaLoadFailed': 'Captcha konnte nicht geladen werden', - 'register.inputCaptcha': 'Bitte Captcha eingeben', - 'register.inputCorrectMobile': 'Bitte korrekte Handynummer eingeben', - 'register.captchaSendSuccess': 'Bestätigungscode erfolgreich gesendet', - 'register.captchaSendFailed': 'Senden des Bestätigungscodes fehlgeschlagen', - 'register.passwordsNotMatch': 'Passwörter stimmen nicht überein', - 'register.registerSuccess': 'Registrierung erfolgreich!', - 'register.registerFailed': 'Registrierung fehlgeschlagen', - 'register.requiredUsername': 'Benutzername darf nicht leer sein', - 'register.requiredPassword': 'Passwort darf nicht leer sein', - 'register.requiredCaptcha': 'Captcha darf nicht leer sein', - 'register.requiredMobileCaptcha': 'Bitte SMS-Bestätigungscode eingeben', - 'register.invalidCaptcha': 'Ungültiger Bestätigungscode', - 'register.passwordLength': 'Passwortlänge muss zwischen 6-20 Zeichen liegen', - 'register.usernameFormat': 'Ungültiges Benutzernamenformat', - 'register.confirmPasswordRequired': 'Bestätigungspasswort darf nicht leer sein', - 'register.sendCaptcha': 'Bestätigungscode erhalten', - 'register.secondsLater': 'Sekunden später', + // Register page related + 'register.title': 'Konto erstellen', + 'register.welcome': 'Willkommen bei XiaoZhi AI', + 'register.usernamePlaceholder': 'Bitte Benutzernamen eingeben', + 'register.mobilePlaceholder': 'Bitte Handynummer eingeben', + 'register.captchaPlaceholder': 'Bitte Captcha eingeben', + 'register.mobileCaptchaPlaceholder': 'Bitte SMS-Bestätigungscode eingeben', + 'register.passwordPlaceholder': 'Bitte Passwort festlegen', + 'register.confirmPasswordPlaceholder': 'Bitte Passwort bestätigen', + 'register.goToLogin': 'Bereits ein Konto? Anmelden', + 'register.registerButton': 'Registrieren', + 'register.agreeTo': 'Durch Registrierung stimmen Sie unseren', + 'register.userAgreement': 'Nutzungsbedingungen', + 'register.privacyPolicy': 'Datenschutzrichtlinie', + 'register.notAllowRegister': 'Benutzerregistrierung nicht erlaubt', + 'register.captchaLoadFailed': 'Captcha konnte nicht geladen werden', + 'register.inputCaptcha': 'Bitte Captcha eingeben', + 'register.inputCorrectMobile': 'Bitte korrekte Handynummer eingeben', + 'register.captchaSendSuccess': 'Bestätigungscode erfolgreich gesendet', + 'register.captchaSendFailed': 'Senden des Bestätigungscodes fehlgeschlagen', + 'register.passwordsNotMatch': 'Passwörter stimmen nicht überein', + 'register.registerSuccess': 'Registrierung erfolgreich!', + 'register.registerFailed': 'Registrierung fehlgeschlagen', + 'register.requiredUsername': 'Benutzername darf nicht leer sein', + 'register.requiredPassword': 'Passwort darf nicht leer sein', + 'register.requiredCaptcha': 'Captcha darf nicht leer sein', + 'register.requiredMobileCaptcha': 'Bitte SMS-Bestätigungscode eingeben', + 'register.invalidCaptcha': 'Ungültiger Bestätigungscode', + 'register.passwordLength': 'Passwortlänge muss zwischen 6-20 Zeichen liegen', + 'register.usernameFormat': 'Ungültiges Benutzernamenformat', + 'register.confirmPasswordRequired': 'Bestätigungspasswort darf nicht leer sein', + 'register.sendCaptcha': 'Bestätigungscode erhalten', + 'register.secondsLater': 'Sekunden später', - // Parameter dialog related - 'paramDialog.paramCode': 'Parameter-Code', - 'paramDialog.paramCodePlaceholder': 'Bitte Parameter-Code eingeben', - 'paramDialog.paramValue': 'Parameter-Wert', - 'paramDialog.paramValuePlaceholder': 'Bitte Parameter-Wert eingeben', - 'paramDialog.valueType': 'Werttyp', - 'paramDialog.valueTypePlaceholder': 'Bitte Werttyp auswählen', - 'paramDialog.remark': 'Bemerkung', - 'paramDialog.remarkPlaceholder': 'Bitte Bemerkung eingeben', - 'paramDialog.save': 'Speichern', - 'paramDialog.cancel': 'Abbrechen', - 'paramDialog.requiredParamCode': 'Bitte Parameter-Code eingeben', - 'paramDialog.requiredParamValue': 'Bitte Parameter-Wert eingeben', - 'paramDialog.requiredValueType': 'Bitte Werttyp auswählen', - 'paramDialog.stringType': 'Zeichenkette', - 'paramDialog.numberType': 'Zahl', - 'paramDialog.booleanType': 'Boolesch', - 'paramDialog.arrayType': 'Array', - 'paramDialog.jsonType': 'JSON-Objekt', + // Parameter dialog related + 'paramDialog.paramCode': 'Parameter-Code', + 'paramDialog.paramCodePlaceholder': 'Bitte Parameter-Code eingeben', + 'paramDialog.paramValue': 'Parameter-Wert', + 'paramDialog.paramValuePlaceholder': 'Bitte Parameter-Wert eingeben', + 'paramDialog.valueType': 'Werttyp', + 'paramDialog.valueTypePlaceholder': 'Bitte Werttyp auswählen', + 'paramDialog.remark': 'Bemerkung', + 'paramDialog.remarkPlaceholder': 'Bitte Bemerkung eingeben', + 'paramDialog.save': 'Speichern', + 'paramDialog.cancel': 'Abbrechen', + 'paramDialog.requiredParamCode': 'Bitte Parameter-Code eingeben', + 'paramDialog.requiredParamValue': 'Bitte Parameter-Wert eingeben', + 'paramDialog.requiredValueType': 'Bitte Werttyp auswählen', + 'paramDialog.stringType': 'Zeichenkette', + 'paramDialog.numberType': 'Zahl', + 'paramDialog.booleanType': 'Boolesch', + 'paramDialog.arrayType': 'Array', + 'paramDialog.jsonType': 'JSON-Objekt', - // Login page text - 'login.title': 'Anmelden', - 'login.welcome': 'WILLKOMMEN ZUR ANMELDUNG', - 'login.username': 'Benutzername', - 'login.usernamePlaceholder': 'Bitte Benutzernamen eingeben', - 'login.mobilePlaceholder': 'Bitte Handynummer eingeben', - 'login.password': 'Passwort', - 'login.passwordPlaceholder': 'Bitte Passwort eingeben', - 'login.captchaPlaceholder': 'Bitte Bestätigungscode eingeben', - 'login.loginButton': 'Anmelden', - 'login.login': 'Anmelden', - 'login.register': 'Registrieren', - 'login.forgotPassword': 'Passwort vergessen', - 'login.forgetPassword': 'Passwort vergessen?', - 'login.mobileLogin': 'Handy-Anmeldung', - 'login.usernameLogin': 'Benutzername-Anmeldung', - 'login.agreeTo': 'Anmeldung bedeutet Zustimmung zu', - 'login.userAgreement': 'Nutzungsbedingungen', - 'login.and': 'und', - 'login.privacyPolicy': 'Datenschutzrichtlinie', - 'login.registerAccount': 'Konto registrieren', + // Login page text + 'login.title': 'Anmelden', + 'login.welcome': 'WILLKOMMEN ZUR ANMELDUNG', + 'login.username': 'Benutzername', + 'login.usernamePlaceholder': 'Bitte Benutzernamen eingeben', + 'login.mobilePlaceholder': 'Bitte Handynummer eingeben', + 'login.password': 'Passwort', + 'login.passwordPlaceholder': 'Bitte Passwort eingeben', + 'login.captchaPlaceholder': 'Bitte Bestätigungscode eingeben', + 'login.loginButton': 'Anmelden', + 'login.login': 'Anmelden', + 'login.register': 'Registrieren', + 'login.forgotPassword': 'Passwort vergessen', + 'login.forgetPassword': 'Passwort vergessen?', + 'login.mobileLogin': 'Handy-Anmeldung', + 'login.usernameLogin': 'Benutzername-Anmeldung', + 'login.agreeTo': 'Anmeldung bedeutet Zustimmung zu', + 'login.userAgreement': 'Nutzungsbedingungen', + 'login.and': 'und', + 'login.privacyPolicy': 'Datenschutzrichtlinie', + 'login.registerAccount': 'Konto registrieren', - // Retrieve password page text - 'retrievePassword.title': 'Passwort zurücksetzen', - 'retrievePassword.welcome': 'PASSWORTWIEDERHERSTELLUNG', - 'retrievePassword.subtitle': 'Passwort wiederherstellen', - 'retrievePassword.mobile': 'Handy', - 'retrievePassword.mobilePlaceholder': 'Bitte Handynummer eingeben', - 'retrievePassword.captcha': 'Bestätigungscode', - 'retrievePassword.captchaPlaceholder': 'Bitte Bestätigungscode eingeben', - 'retrievePassword.mobileCaptcha': 'Handy-Bestätigungscode', - 'retrievePassword.mobileCaptchaPlaceholder': 'Bitte Handy-Bestätigungscode eingeben', - 'retrievePassword.newPassword': 'Neues Passwort', - 'retrievePassword.newPasswordPlaceholder': 'Bitte neues Passwort eingeben', - 'retrievePassword.confirmNewPassword': 'Neues Passwort bestätigen', - 'retrievePassword.confirmNewPasswordPlaceholder': 'Bitte neues Passwort bestätigen', - 'retrievePassword.getMobileCaptcha': 'Bestätigungscode erhalten', - 'retrievePassword.resetButton': 'Passwort zurücksetzen', - 'retrievePassword.updateButton': 'Jetzt aktualisieren', - 'retrievePassword.goToLogin': 'Zurück zur Anmeldung', - 'retrievePassword.inputCorrectMobile': 'Bitte korrekte Handynummer eingeben', - 'retrievePassword.captchaSendSuccess': 'Bestätigungscode erfolgreich gesendet', - 'retrievePassword.passwordsNotMatch': 'Die beiden Passwörter stimmen nicht überein', - 'retrievePassword.passwordLength': 'Passwortlänge muss zwischen 6-20 Zeichen liegen', - 'retrievePassword.mobileRequired': 'Handynummer darf nicht leer sein', - 'retrievePassword.captchaRequired': 'Bestätigungscode darf nicht leer sein', - 'retrievePassword.mobileCaptchaRequired': 'Handy-Bestätigungscode darf nicht leer sein', - 'retrievePassword.newPasswordRequired': 'Neues Passwort darf nicht leer sein', - 'retrievePassword.confirmNewPasswordRequired': 'Bestätigungspasswort darf nicht leer sein', - 'retrievePassword.passwordUpdateSuccess': 'Passwort erfolgreich aktualisiert', - 'retrievePassword.agreeTo': 'Zurücksetzen bedeutet Zustimmung', + // Retrieve password page text + 'retrievePassword.title': 'Passwort zurücksetzen', + 'retrievePassword.welcome': 'PASSWORTWIEDERHERSTELLUNG', + 'retrievePassword.subtitle': 'Passwort wiederherstellen', + 'retrievePassword.mobile': 'Handy', + 'retrievePassword.mobilePlaceholder': 'Bitte Handynummer eingeben', + 'retrievePassword.captcha': 'Bestätigungscode', + 'retrievePassword.captchaPlaceholder': 'Bitte Bestätigungscode eingeben', + 'retrievePassword.mobileCaptcha': 'Handy-Bestätigungscode', + 'retrievePassword.mobileCaptchaPlaceholder': 'Bitte Handy-Bestätigungscode eingeben', + 'retrievePassword.newPassword': 'Neues Passwort', + 'retrievePassword.newPasswordPlaceholder': 'Bitte neues Passwort eingeben', + 'retrievePassword.confirmNewPassword': 'Neues Passwort bestätigen', + 'retrievePassword.confirmNewPasswordPlaceholder': 'Bitte neues Passwort bestätigen', + 'retrievePassword.getMobileCaptcha': 'Bestätigungscode erhalten', + 'retrievePassword.resetButton': 'Passwort zurücksetzen', + 'retrievePassword.updateButton': 'Jetzt aktualisieren', + 'retrievePassword.goToLogin': 'Zurück zur Anmeldung', + 'retrievePassword.inputCorrectMobile': 'Bitte korrekte Handynummer eingeben', + 'retrievePassword.captchaSendSuccess': 'Bestätigungscode erfolgreich gesendet', + 'retrievePassword.passwordsNotMatch': 'Die beiden Passwörter stimmen nicht überein', + 'retrievePassword.passwordLength': 'Passwortlänge muss zwischen 6-20 Zeichen liegen', + 'retrievePassword.mobileRequired': 'Handynummer darf nicht leer sein', + 'retrievePassword.captchaRequired': 'Bestätigungscode darf nicht leer sein', + 'retrievePassword.mobileCaptchaRequired': 'Handy-Bestätigungscode darf nicht leer sein', + 'retrievePassword.newPasswordRequired': 'Neues Passwort darf nicht leer sein', + 'retrievePassword.confirmNewPasswordRequired': 'Bestätigungspasswort darf nicht leer sein', + 'retrievePassword.passwordUpdateSuccess': 'Passwort erfolgreich aktualisiert', + 'retrievePassword.agreeTo': 'Zurücksetzen bedeutet Zustimmung', - // Change password page text - 'changePassword.title': 'Passwort ändern', - 'changePassword.oldPasswordLabel': 'Altes Passwort:', - 'changePassword.oldPasswordPlaceholder': 'Bitte altes Passwort eingeben', - 'changePassword.newPasswordLabel': 'Neues Passwort:', - 'changePassword.newPasswordPlaceholder': 'Bitte neues Passwort eingeben', - 'changePassword.confirmPasswordLabel': 'Neues Passwort bestätigen:', - 'changePassword.confirmPasswordPlaceholder': 'Bitte neues Passwort erneut eingeben', - 'changePassword.confirmButton': 'Bestätigen', - 'changePassword.cancelButton': 'Abbrechen', - 'changePassword.allFieldsRequired': 'Bitte füllen Sie alle Felder aus', - 'changePassword.passwordsNotMatch': 'Die beiden neuen Passwörter stimmen nicht überein', - 'changePassword.newPasswordSameAsOld': 'Neues Passwort darf nicht gleich dem alten sein', - 'changePassword.passwordChangedSuccessfully': 'Passwort erfolgreich geändert, bitte melden Sie sich erneut an', - 'changePassword.changeFailed': 'Passwortänderung fehlgeschlagen', + // Change password page text + 'changePassword.title': 'Passwort ändern', + 'changePassword.oldPasswordLabel': 'Altes Passwort:', + 'changePassword.oldPasswordPlaceholder': 'Bitte altes Passwort eingeben', + 'changePassword.newPasswordLabel': 'Neues Passwort:', + 'changePassword.newPasswordPlaceholder': 'Bitte neues Passwort eingeben', + 'changePassword.confirmPasswordLabel': 'Neues Passwort bestätigen:', + 'changePassword.confirmPasswordPlaceholder': 'Bitte neues Passwort erneut eingeben', + 'changePassword.confirmButton': 'Bestätigen', + 'changePassword.cancelButton': 'Abbrechen', + 'changePassword.allFieldsRequired': 'Bitte füllen Sie alle Felder aus', + 'changePassword.passwordsNotMatch': 'Die beiden neuen Passwörter stimmen nicht überein', + 'changePassword.newPasswordSameAsOld': 'Neues Passwort darf nicht gleich dem alten sein', + 'changePassword.passwordChangedSuccessfully': 'Passwort erfolgreich geändert, bitte melden Sie sich erneut an', + 'changePassword.changeFailed': 'Passwortänderung fehlgeschlagen', - // Device management page text - 'device.management': 'Geräteverwaltung', - 'device.add': 'Gerät hinzufügen', - 'device.edit': 'Gerät bearbeiten', - 'device.delete': 'Gerät löschen', - 'device.name': 'Gerätename', - 'device.type': 'Gerätetyp', - 'device.status': 'Gerätestatus', - 'device.dialogTitle': 'Gerät hinzufügen', - 'device.verificationCode': 'Bestätigungscode:', - 'device.verificationCodePlaceholder': 'Bitte den 6-stelligen Bestätigungscode eingeben, der vom Gerät gesendet wird..', - 'device.confirmButton': 'Bestätigen', - 'device.cancelButton': 'Abbrechen', - 'device.input6DigitCode': 'Bitte 6-stelligen Bestätigungscode eingeben', - 'device.bindSuccess': 'Gerätebindung erfolgreich', - 'device.bindFailed': 'Bindung fehlgeschlagen', - 'device.searchPlaceholder': 'Bitte Gerätemodell oder Mac-Adresse zur Suche eingeben', - 'device.model': 'Gerätemodell', - 'device.macAddress': 'Mac-Adresse', - 'device.firmwareVersion': 'Firmware-Version', - 'device.bindTime': 'Bindungszeit', - 'device.lastConversation': 'Letzte Konversation', - 'device.remark': 'Bemerkung', - 'device.autoUpdate': 'Automatische Aktualisierung', - 'device.operation': 'Operation', - 'device.search': 'Suchen', - 'device.selectAll': 'Alle auswählen/Abwählen', - 'deviceManagement.loading': 'Lädt...', - 'device.bindWithCode': '6-stelliger Bestätigungscode-Bindung', - 'device.manualAdd': 'Manuell hinzufügen', - 'device.unbind': 'Bindung aufheben', - 'device.toolCall': 'Werkzeugaufruf', - 'device.selectAtLeastOne': 'Bitte wählen Sie mindestens einen Datensatz aus', - 'device.confirmBatchUnbind': 'Sind Sie sicher, dass Sie {count} ausgewählte Geräte entbinden möchten?', - 'device.batchUnbindSuccess': 'Erfolgreich {count} Geräte entbunden', - 'device.batchUnbindError': 'Fehler beim Massen-Entbinden aufgetreten', - 'device.remarkTooLong': 'Bemerkung darf 64 Zeichen nicht überschreiten', - 'device.remarkSaved': 'Bemerkung erfolgreich gespeichert', - 'device.remarkSaveFailed': 'Speichern der Bemerkung fehlgeschlagen', - 'device.confirmUnbind': 'Sind Sie sicher, dass Sie dieses Gerät entbinden möchten?', - 'device.unbindSuccess': 'Gerät erfolgreich entbunden', - 'device.unbindFailed': 'Entbinden des Geräts fehlgeschlagen', - 'device.getListFailed': 'Geräteliste konnte nicht abgerufen werden', - 'device.autoUpdateEnabled': 'Automatische Aktualisierung aktiviert', - 'device.autoUpdateDisabled': 'Automatische Aktualisierung deaktiviert', - 'device.batchUnbindSuccess': 'Erfolgreich {count} Geräte entbunden', - 'device.getFirmwareTypeFailed': 'Firmware-Typ konnte nicht abgerufen werden', - 'device.deviceStatus': 'Status', - 'device.online': 'Online', - 'device.offline': 'Offline', + // Device management page text + 'device.management': 'Geräteverwaltung', + 'device.add': 'Gerät hinzufügen', + 'device.edit': 'Gerät bearbeiten', + 'device.delete': 'Gerät löschen', + 'device.name': 'Gerätename', + 'device.type': 'Gerätetyp', + 'device.status': 'Gerätestatus', + 'device.dialogTitle': 'Gerät hinzufügen', + 'device.verificationCode': 'Bestätigungscode:', + 'device.verificationCodePlaceholder': 'Bitte den 6-stelligen Bestätigungscode eingeben, der vom Gerät gesendet wird..', + 'device.confirmButton': 'Bestätigen', + 'device.cancelButton': 'Abbrechen', + 'device.input6DigitCode': 'Bitte 6-stelligen Bestätigungscode eingeben', + 'device.bindSuccess': 'Gerätebindung erfolgreich', + 'device.bindFailed': 'Bindung fehlgeschlagen', + 'device.searchPlaceholder': 'Bitte Gerätemodell oder Mac-Adresse zur Suche eingeben', + 'device.model': 'Gerätemodell', + 'device.macAddress': 'Mac-Adresse', + 'device.firmwareVersion': 'Firmware-Version', + 'device.bindTime': 'Bindungszeit', + 'device.lastConversation': 'Letzte Konversation', + 'device.remark': 'Bemerkung', + 'device.autoUpdate': 'Automatische Aktualisierung', + 'device.operation': 'Operation', + 'device.search': 'Suchen', + 'device.selectAll': 'Alle auswählen/Abwählen', + 'deviceManagement.loading': 'Lädt...', + 'device.bindWithCode': '6-stelliger Bestätigungscode-Bindung', + 'device.manualAdd': 'Manuell hinzufügen', + 'device.unbind': 'Bindung aufheben', + 'device.toolCall': 'Werkzeugaufruf', + 'device.selectAtLeastOne': 'Bitte wählen Sie mindestens einen Datensatz aus', + 'device.confirmBatchUnbind': 'Sind Sie sicher, dass Sie {count} ausgewählte Geräte entbinden möchten?', + 'device.batchUnbindSuccess': 'Erfolgreich {count} Geräte entbunden', + 'device.batchUnbindError': 'Fehler beim Massen-Entbinden aufgetreten', + 'device.remarkTooLong': 'Bemerkung darf 64 Zeichen nicht überschreiten', + 'device.remarkSaved': 'Bemerkung erfolgreich gespeichert', + 'device.remarkSaveFailed': 'Speichern der Bemerkung fehlgeschlagen', + 'device.confirmUnbind': 'Sind Sie sicher, dass Sie dieses Gerät entbinden möchten?', + 'device.unbindSuccess': 'Gerät erfolgreich entbunden', + 'device.unbindFailed': 'Entbinden des Geräts fehlgeschlagen', + 'device.getListFailed': 'Geräteliste konnte nicht abgerufen werden', + 'device.autoUpdateEnabled': 'Automatische Aktualisierung aktiviert', + 'device.autoUpdateDisabled': 'Automatische Aktualisierung deaktiviert', + 'device.batchUnbindSuccess': 'Erfolgreich {count} Geräte entbunden', + 'device.getFirmwareTypeFailed': 'Firmware-Typ konnte nicht abgerufen werden', + 'device.deviceStatus': 'Status', + 'device.online': 'Online', + 'device.offline': 'Offline', - // Message tips - 'message.success': 'Operation erfolgreich', - 'message.error': 'Operation fehlgeschlagen', - 'message.warning': 'Warnung', - 'message.info': 'Information', + // Message tips + 'message.success': 'Operation erfolgreich', + 'message.error': 'Operation fehlgeschlagen', + 'message.warning': 'Warnung', + 'message.info': 'Information', - // Cache related - 'cache.viewer': 'Cache-Betrachter', + // Cache related + 'cache.viewer': 'Cache-Betrachter', - // Chat history dialog related - 'chatHistory.with': 'Mit', - 'chatHistory.dialogTitle': "'s Chat-Verlauf", - 'chatHistory.loading': 'Lädt...', - 'chatHistory.noMoreRecords': 'Keine weiteren Datensätze', - 'chatHistory.selectSession': 'Bitte wählen Sie eine Sitzung aus, um den Chat-Verlauf anzuzeigen', - 'chatHistory.today': 'Heute', - 'chatHistory.yesterday': 'Gestern', - 'chatHistory.downloadCurrentSession': 'Aktuelle Sitzung Chat-Verlauf herunterladen', - 'chatHistory.downloadCurrentWithPreviousSessions': 'Aktuelle und vorherige 20 Sitzungen Chat-Verlauf herunterladen', - 'chatHistory.downloadLinkFailed': 'Download-Link konnte nicht abgerufen werden', + // Chat history dialog related + 'chatHistory.with': 'Mit', + 'chatHistory.dialogTitle': "'s Chat-Verlauf", + 'chatHistory.loading': 'Lädt...', + 'chatHistory.noMoreRecords': 'Keine weiteren Datensätze', + 'chatHistory.selectSession': 'Bitte wählen Sie eine Sitzung aus, um den Chat-Verlauf anzuzeigen', + 'chatHistory.today': 'Heute', + 'chatHistory.yesterday': 'Gestern', + 'chatHistory.downloadCurrentSession': 'Aktuelle Sitzung Chat-Verlauf herunterladen', + 'chatHistory.downloadCurrentWithPreviousSessions': 'Aktuelle und vorherige 20 Sitzungen Chat-Verlauf herunterladen', + 'chatHistory.downloadLinkFailed': 'Download-Link konnte nicht abgerufen werden', - 'cache.status': 'Cache-Status', - 'cache.cdnEnabled': 'CDN-Modus aktiviert', - 'cache.cdnDisabled': 'CDN-Modus deaktiviert', - 'cache.serviceWorkerRegistered': 'Service Worker registriert', - 'cache.serviceWorkerNotRegistered': 'Service Worker nicht registriert', - 'cache.noCacheDetected': 'Noch kein Cache erkannt, bitte Seite aktualisieren oder auf Cache-Einrichtung warten', - 'cache.swDevEnvWarning': 'In Entwicklungsumgebung kann Service Worker Cache möglicherweise nicht korrekt initialisieren', - 'cache.swCheckMethods': 'Bitte versuchen Sie folgende Methoden, um zu prüfen, ob Service Worker funktioniert:', - 'cache.swCheckMethod1': 'Service Worker-Status in Application/Application-Tab der Entwicklertools prüfen', - 'cache.swCheckMethod2': 'Cache-Inhalt in Application/Cache/Cache Storage der Entwicklertools anzeigen', - 'cache.swCheckMethod3': 'Produktions-Build (npm run build) verwenden und über HTTP-Server aufrufen, um volle Funktionalität zu testen', - 'cache.swDevEnvNormal': 'In Entwicklungsumgebung ist dies normal', - 'cache.swProdOnly': 'Service Worker funktioniert normalerweise nur in Produktionsumgebung', - 'cache.swTestingTitle': 'Um Service Worker-Funktionalität zu testen:', - 'cache.swTestingStep1': 'Führen Sie npm run build aus, um Produktionsversion zu erstellen', - 'cache.swTestingStep2': 'Rufen Sie die gebaute Seite über HTTP-Server auf', - 'cache.swNotSupported': 'Der aktuelle Browser unterstützt Service Worker nicht, CDN-Ressourcen-Caching-Funktion nicht verfügbar', - 'cache.dialogTitle': 'CDN-Ressourcen-Cache-Status', - 'cache.loading': 'Cache-Informationen werden geladen...', - 'cache.notSupported': 'Ihr Browser unterstützt Cache API nicht oder Service Worker ist nicht installiert', - 'cache.refreshPage': 'Seite aktualisieren', - 'cache.noCachedResources': 'Keine gecachten CDN-Ressourcen gefunden', - 'cache.noCachedResourcesDesc': 'Service Worker hat möglicherweise die Initialisierung nicht abgeschlossen oder Cache wurde noch nicht eingerichtet. Bitte Seite aktualisieren oder später erneut versuchen.', - 'cache.cdnCacheStatus': 'CDN-Ressourcen-Cache-Status', - 'cache.totalCachedResources': 'Insgesamt {count} gecachte Ressourcen gefunden', - 'cache.jsResources': 'JavaScript-Ressourcen ({count})', - 'cache.cssResources': 'CSS-Ressourcen ({count})', - 'cache.cached': 'Gecached', - 'cache.notCached': 'Nicht gecached', - 'cache.refreshStatus': 'Cache-Status aktualisieren', - 'cache.clearCache': 'Cache leeren', - 'cache.refreshingStatus': 'Cache-Status wird aktualisiert', - 'cache.confirmClear': 'Sind Sie sicher, dass Sie den gesamten Cache leeren möchten?', - 'cache.clearedSuccess': 'Cache erfolgreich geleert', - 'cache.clearFailed': 'Cache-Leeren fehlgeschlagen', - 'cache.clearCanceled': 'Leer-Vorgang abgebrochen', + 'cache.status': 'Cache-Status', + 'cache.cdnEnabled': 'CDN-Modus aktiviert', + 'cache.cdnDisabled': 'CDN-Modus deaktiviert', + 'cache.serviceWorkerRegistered': 'Service Worker registriert', + 'cache.serviceWorkerNotRegistered': 'Service Worker nicht registriert', + 'cache.noCacheDetected': 'Noch kein Cache erkannt, bitte Seite aktualisieren oder auf Cache-Einrichtung warten', + 'cache.swDevEnvWarning': 'In Entwicklungsumgebung kann Service Worker Cache möglicherweise nicht korrekt initialisieren', + 'cache.swCheckMethods': 'Bitte versuchen Sie folgende Methoden, um zu prüfen, ob Service Worker funktioniert:', + 'cache.swCheckMethod1': 'Service Worker-Status in Application/Application-Tab der Entwicklertools prüfen', + 'cache.swCheckMethod2': 'Cache-Inhalt in Application/Cache/Cache Storage der Entwicklertools anzeigen', + 'cache.swCheckMethod3': 'Produktions-Build (npm run build) verwenden und über HTTP-Server aufrufen, um volle Funktionalität zu testen', + 'cache.swDevEnvNormal': 'In Entwicklungsumgebung ist dies normal', + 'cache.swProdOnly': 'Service Worker funktioniert normalerweise nur in Produktionsumgebung', + 'cache.swTestingTitle': 'Um Service Worker-Funktionalität zu testen:', + 'cache.swTestingStep1': 'Führen Sie npm run build aus, um Produktionsversion zu erstellen', + 'cache.swTestingStep2': 'Rufen Sie die gebaute Seite über HTTP-Server auf', + 'cache.swNotSupported': 'Der aktuelle Browser unterstützt Service Worker nicht, CDN-Ressourcen-Caching-Funktion nicht verfügbar', + 'cache.dialogTitle': 'CDN-Ressourcen-Cache-Status', + 'cache.loading': 'Cache-Informationen werden geladen...', + 'cache.notSupported': 'Ihr Browser unterstützt Cache API nicht oder Service Worker ist nicht installiert', + 'cache.refreshPage': 'Seite aktualisieren', + 'cache.noCachedResources': 'Keine gecachten CDN-Ressourcen gefunden', + 'cache.noCachedResourcesDesc': 'Service Worker hat möglicherweise die Initialisierung nicht abgeschlossen oder Cache wurde noch nicht eingerichtet. Bitte Seite aktualisieren oder später erneut versuchen.', + 'cache.cdnCacheStatus': 'CDN-Ressourcen-Cache-Status', + 'cache.totalCachedResources': 'Insgesamt {count} gecachte Ressourcen gefunden', + 'cache.jsResources': 'JavaScript-Ressourcen ({count})', + 'cache.cssResources': 'CSS-Ressourcen ({count})', + 'cache.cached': 'Gecached', + 'cache.notCached': 'Nicht gecached', + 'cache.refreshStatus': 'Cache-Status aktualisieren', + 'cache.clearCache': 'Cache leeren', + 'cache.refreshingStatus': 'Cache-Status wird aktualisiert', + 'cache.confirmClear': 'Sind Sie sicher, dass Sie den gesamten Cache leeren möchten?', + 'cache.clearedSuccess': 'Cache erfolgreich geleert', + 'cache.clearFailed': 'Cache-Leeren fehlgeschlagen', + 'cache.clearCanceled': 'Leer-Vorgang abgebrochen', - // Common buttons - 'button.ok': 'OK', - 'button.cancel': 'Abbrechen', - 'button.save': 'Speichern', - 'button.close': 'Schließen', + // Common buttons + 'button.ok': 'OK', + 'button.cancel': 'Abbrechen', + 'button.save': 'Speichern', + 'button.close': 'Schließen', - // System information - 'system.name': 'XiaoZhi Service', + // System information + 'system.name': 'XiaoZhi Service', - // Voiceprint related - 'voiceprint.management': 'Stimmabdruckverwaltung', - 'voiceprint.add': 'Stimmabdruck hinzufügen', - 'voiceprint.delete': 'Stimmabdruck löschen', + // Voiceprint related + 'voiceprint.management': 'Stimmabdruckverwaltung', + 'voiceprint.add': 'Stimmabdruck hinzufügen', + 'voiceprint.delete': 'Stimmabdruck löschen', - // Dictionary management page text - 'dictManagement.pageTitle': 'Wörterbuchverwaltung', - 'dictManagement.searchPlaceholder': 'Bitte Wörterbuchwert-Label zur Suche eingeben', - 'dictManagement.search': 'Suchen', - 'dictManagement.dictTypeName': 'WDT-Name', - 'dictManagement.operation': 'Operation', - 'dictManagement.edit': 'Bearbeiten', - 'dictManagement.dictLabel': 'Wörterbuch-Label', - 'dictManagement.dictValue': 'Wörterbuch-Wert', - 'dictManagement.sort': 'Sortierung', - 'dictManagement.delete': 'Löschen', - 'dictManagement.selectAll': 'Alle auswählen', - 'dictManagement.deselectAll': 'Alle abwählen', - 'dictManagement.addDictType': 'WDT hinzufügen', - 'dictManagement.batchDeleteDictType': 'WDT massenhaft löschen', - 'dictManagement.addDictData': 'WDT hinzufügen', - 'dictManagement.batchDeleteDictData': 'WDT massenhaft löschen', - 'dictManagement.itemsPerPage': '{items} Einträge/Seite', - 'dictManagement.firstPage': 'Erste Seite', - 'dictManagement.prevPage': 'Vorherige Seite', - 'dictManagement.nextPage': 'Nächste Seite', - 'dictManagement.totalRecords': 'Insgesamt {total} Datensätze', - 'dictManagement.editDictType': 'Wörterbuchtyp bearbeiten', - 'dictManagement.editDictData': 'Wörterbuchdaten bearbeiten', - 'dictManagement.saveSuccess': 'Speichern erfolgreich', - 'dictManagement.deleteSuccess': 'Löschen erfolgreich', - 'dictManagement.selectDictTypeToDelete': 'Bitte wählen Sie Wörterbuchtypen zum Löschen aus', - 'dictManagement.confirmDeleteDictType': 'Sind Sie sicher, dass Sie die ausgewählten Wörterbuchtypen löschen möchten?', - 'dictManagement.confirm': 'Bestätigen', - 'dictManagement.cancel': 'Abbrechen', - 'dictManagement.selectDictTypeFirst': 'Bitte wählen Sie zuerst einen Wörterbuchtyp aus', - 'dictManagement.confirmDeleteDictData': 'Sind Sie sicher, dass Sie diese Wörterbuchdaten löschen möchten?', - 'dictManagement.selectDictDataToDelete': 'Bitte wählen Sie Wörterbuchdaten zum Löschen aus', - 'dictManagement.confirmBatchDeleteDictData': 'Sind Sie sicher, dass Sie {count} ausgewählte Wörterbuchdaten löschen möchten?', - 'dictManagement.getDictDataFailed': 'Wörterbuchdaten konnten nicht abgerufen werden', + // Dictionary management page text + 'dictManagement.pageTitle': 'Wörterbuchverwaltung', + 'dictManagement.searchPlaceholder': 'Bitte Wörterbuchwert-Label zur Suche eingeben', + 'dictManagement.search': 'Suchen', + 'dictManagement.dictTypeName': 'WDT-Name', + 'dictManagement.operation': 'Operation', + 'dictManagement.edit': 'Bearbeiten', + 'dictManagement.dictLabel': 'Wörterbuch-Label', + 'dictManagement.dictValue': 'Wörterbuch-Wert', + 'dictManagement.sort': 'Sortierung', + 'dictManagement.delete': 'Löschen', + 'dictManagement.selectAll': 'Alle auswählen', + 'dictManagement.deselectAll': 'Alle abwählen', + 'dictManagement.addDictType': 'WDT hinzufügen', + 'dictManagement.batchDeleteDictType': 'WDT massenhaft löschen', + 'dictManagement.addDictData': 'WDT hinzufügen', + 'dictManagement.batchDeleteDictData': 'WDT massenhaft löschen', + 'dictManagement.itemsPerPage': '{items} Einträge/Seite', + 'dictManagement.firstPage': 'Erste Seite', + 'dictManagement.prevPage': 'Vorherige Seite', + 'dictManagement.nextPage': 'Nächste Seite', + 'dictManagement.totalRecords': 'Insgesamt {total} Datensätze', + 'dictManagement.editDictType': 'Wörterbuchtyp bearbeiten', + 'dictManagement.editDictData': 'Wörterbuchdaten bearbeiten', + 'dictManagement.saveSuccess': 'Speichern erfolgreich', + 'dictManagement.deleteSuccess': 'Löschen erfolgreich', + 'dictManagement.selectDictTypeToDelete': 'Bitte wählen Sie Wörterbuchtypen zum Löschen aus', + 'dictManagement.confirmDeleteDictType': 'Sind Sie sicher, dass Sie die ausgewählten Wörterbuchtypen löschen möchten?', + 'dictManagement.confirm': 'Bestätigen', + 'dictManagement.cancel': 'Abbrechen', + 'dictManagement.selectDictTypeFirst': 'Bitte wählen Sie zuerst einen Wörterbuchtyp aus', + 'dictManagement.confirmDeleteDictData': 'Sind Sie sicher, dass Sie diese Wörterbuchdaten löschen möchten?', + 'dictManagement.selectDictDataToDelete': 'Bitte wählen Sie Wörterbuchdaten zum Löschen aus', + 'dictManagement.confirmBatchDeleteDictData': 'Sind Sie sicher, dass Sie {count} ausgewählte Wörterbuchdaten löschen möchten?', + 'dictManagement.getDictDataFailed': 'Wörterbuchdaten konnten nicht abgerufen werden', - // User information - 'user.info': 'Benutzerinformationen', - 'user.username': 'Benutzername', - 'user.mobile': 'Handy', - 'user.userid': 'Benutzer-ID', - 'user.deviceCount': 'Geräteanzahl', - 'user.createDate': 'Registrierungszeit', - 'user.status': 'Status', - 'user.normal': 'Normal', - 'user.disabled': 'Deaktiviert', - 'user.resetPassword': 'Passwort zurücksetzen', - 'user.disableAccount': 'Konto deaktivieren', - 'user.enableAccount': 'Konto aktivieren', - 'user.deleteUser': 'Benutzer löschen', - 'user.deselectAll': 'Alle abwählen', - 'user.selectAll': 'Alle auswählen', - 'user.enable': 'Aktivieren', - 'user.disable': 'Deaktivieren', - 'user.delete': 'Löschen', - 'user.selectUsersFirst': 'Bitte wählen Sie zuerst Benutzer zum Löschen aus', - 'user.confirmDeleteSelected': 'Sind Sie sicher, dass Sie {count} ausgewählte Benutzer löschen möchten?', - 'user.deleting': 'Löscht...', - 'user.deleteSuccess': 'Erfolgreich {count} Benutzer gelöscht', - 'user.deleteFailed': 'Löschen fehlgeschlagen, bitte versuchen Sie es erneut', - 'user.partialDelete': 'Erfolgreich {successCount} Benutzer gelöscht, {failCount} fehlgeschlagen', - 'user.deleteError': 'Fehler beim Löschen aufgetreten', - 'user.deleteCancelled': 'Löschen abgebrochen', - 'user.confirmResetPassword': 'Ein neues Passwort wird nach dem Zurücksetzen generiert. Fortfahren?', - 'user.resetPasswordSuccess': 'Passwort wurde zurückgesetzt, bitte benachrichtigen Sie den Benutzer, sich mit dem neuen Passwort anzumelden', - 'user.generatedPassword': 'Generiertes Standardpasswort', - 'user.confirmDeleteUser': 'Sind Sie sicher, dass Sie diesen Benutzer löschen möchten?', - 'user.deleteUserSuccess': 'Löschen erfolgreich', - 'user.operationFailed': 'Operation fehlgeschlagen, bitte versuchen Sie es erneut', - 'user.confirmStatusChange': 'Sind Sie sicher, dass Sie {count} ausgewählte Benutzer {action} möchten?', - 'user.statusChangeSuccess': 'Erfolgreich {count} Benutzer {action}', - 'user.invalidUserId': 'Es gibt ungültige Benutzer-IDs', - 'user.searchPhone': 'Bitte Handynummer zur Suche eingeben', - 'user.search': 'Suchen', + // User information + 'user.info': 'Benutzerinformationen', + 'user.username': 'Benutzername', + 'user.mobile': 'Handy', + 'user.userid': 'Benutzer-ID', + 'user.deviceCount': 'Geräteanzahl', + 'user.createDate': 'Registrierungszeit', + 'user.status': 'Status', + 'user.normal': 'Normal', + 'user.disabled': 'Deaktiviert', + 'user.resetPassword': 'Passwort zurücksetzen', + 'user.disableAccount': 'Konto deaktivieren', + 'user.enableAccount': 'Konto aktivieren', + 'user.deleteUser': 'Benutzer löschen', + 'user.deselectAll': 'Alle abwählen', + 'user.selectAll': 'Alle auswählen', + 'user.enable': 'Aktivieren', + 'user.disable': 'Deaktivieren', + 'user.delete': 'Löschen', + 'user.selectUsersFirst': 'Bitte wählen Sie zuerst Benutzer zum Löschen aus', + 'user.confirmDeleteSelected': 'Sind Sie sicher, dass Sie {count} ausgewählte Benutzer löschen möchten?', + 'user.deleting': 'Löscht...', + 'user.deleteSuccess': 'Erfolgreich {count} Benutzer gelöscht', + 'user.deleteFailed': 'Löschen fehlgeschlagen, bitte versuchen Sie es erneut', + 'user.partialDelete': 'Erfolgreich {successCount} Benutzer gelöscht, {failCount} fehlgeschlagen', + 'user.deleteError': 'Fehler beim Löschen aufgetreten', + 'user.deleteCancelled': 'Löschen abgebrochen', + 'user.confirmResetPassword': 'Ein neues Passwort wird nach dem Zurücksetzen generiert. Fortfahren?', + 'user.resetPasswordSuccess': 'Passwort wurde zurückgesetzt, bitte benachrichtigen Sie den Benutzer, sich mit dem neuen Passwort anzumelden', + 'user.generatedPassword': 'Generiertes Standardpasswort', + 'user.confirmDeleteUser': 'Sind Sie sicher, dass Sie diesen Benutzer löschen möchten?', + 'user.deleteUserSuccess': 'Löschen erfolgreich', + 'user.operationFailed': 'Operation fehlgeschlagen, bitte versuchen Sie es erneut', + 'user.confirmStatusChange': 'Sind Sie sicher, dass Sie {count} ausgewählte Benutzer {action} möchten?', + 'user.statusChangeSuccess': 'Erfolgreich {count} Benutzer {action}', + 'user.invalidUserId': 'Es gibt ungültige Benutzer-IDs', + 'user.searchPhone': 'Bitte Handynummer zur Suche eingeben', + 'user.search': 'Suchen', - // Provider Management Page Text - 'providerManagement.categoryFilter': 'Kategoriefilter', - 'providerManagement.searchPlaceholder': 'Bitte Anbieternamen zur Suche eingeben', - 'providerManagement.category': 'Kategorie', - 'providerManagement.providerCode': 'Anbieter-Code', - 'providerManagement.fieldConfig': 'Feldkonfiguration', - 'providerManagement.selectToDelete': 'Bitte wählen Sie zuerst Anbieter zum Löschen aus', - 'providerManagement.confirmDelete': 'Sind Sie sicher, dass Sie die ausgewählten {count} Anbieter löschen möchten?', - 'providerManagement.viewFields': 'Felder anzeigen', + // Provider Management Page Text + 'providerManagement.categoryFilter': 'Kategoriefilter', + 'providerManagement.searchPlaceholder': 'Bitte Anbieternamen zur Suche eingeben', + 'providerManagement.category': 'Kategorie', + 'providerManagement.providerCode': 'Anbieter-Code', + 'providerManagement.fieldConfig': 'Feldkonfiguration', + 'providerManagement.selectToDelete': 'Bitte wählen Sie zuerst Anbieter zum Löschen aus', + 'providerManagement.confirmDelete': 'Sind Sie sicher, dass Sie die ausgewählten {count} Anbieter löschen möchten?', + 'providerManagement.viewFields': 'Felder anzeigen', - // Common Text - 'common.all': 'Alle', - 'common.search': 'Suchen', - 'common.name': 'Name', - 'common.sort': 'Sortierung', - 'common.action': 'Aktion', - 'common.edit': 'Bearbeiten', - 'common.delete': 'Löschen', - 'common.selectAll': 'Alle auswählen', - 'common.deselectAll': 'Alle abwählen', - 'common.add': 'Hinzufügen', - 'common.perPage': '{number}/Seite', - 'common.firstPage': 'Erste Seite', - 'common.prevPage': 'Vorherige Seite', - 'common.nextPage': 'Nächste Seite', - 'common.totalRecords': 'Insgesamt {number} Datensätze', - 'common.addProvider': 'Anbieter hinzufügen', - 'common.success': 'Erfolg', - 'common.editProvider': 'Anbieter bearbeiten', - 'common.updateSuccess': 'Aktualisierung erfolgreich', - 'common.addSuccess': 'Hinzufügen erfolgreich', - 'common.deleteSuccess': 'Löschen erfolgreich', - 'common.deleteFailure': 'Löschen fehlgeschlagen, bitte versuchen Sie es erneut', - 'common.deleteCancelled': 'Löschen abgebrochen', - 'common.warning': 'Warnung', - 'common.tip': 'Hinweis', - 'common.confirm': 'Bestätigen', - 'common.cancel': 'Abbrechen', - 'common.sensitive': 'Sensibel', - 'common.loading': 'Lädt', + // Common Text + 'common.all': 'Alle', + 'common.search': 'Suchen', + 'common.name': 'Name', + 'common.sort': 'Sortierung', + 'common.action': 'Aktion', + 'common.edit': 'Bearbeiten', + 'common.delete': 'Löschen', + 'common.selectAll': 'Alle auswählen', + 'common.deselectAll': 'Alle abwählen', + 'common.add': 'Hinzufügen', + 'common.perPage': '{number}/Seite', + 'common.firstPage': 'Erste Seite', + 'common.prevPage': 'Vorherige Seite', + 'common.nextPage': 'Nächste Seite', + 'common.totalRecords': 'Insgesamt {number} Datensätze', + 'common.addProvider': 'Anbieter hinzufügen', + 'common.success': 'Erfolg', + 'common.editProvider': 'Anbieter bearbeiten', + 'common.updateSuccess': 'Aktualisierung erfolgreich', + 'common.addSuccess': 'Hinzufügen erfolgreich', + 'common.deleteSuccess': 'Löschen erfolgreich', + 'common.deleteFailure': 'Löschen fehlgeschlagen, bitte versuchen Sie es erneut', + 'common.deleteCancelled': 'Löschen abgebrochen', + 'common.warning': 'Warnung', + 'common.tip': 'Hinweis', + 'common.confirm': 'Bestätigen', + 'common.cancel': 'Abbrechen', + 'common.sensitive': 'Sensibel', + 'common.loading': 'Lädt', - // Language switch - 'language.zhCN': '中文简体', - 'language.zhTW': '中文繁體', - 'language.en': 'English', - 'language.de': 'Deutsch', - 'language.vi': 'Tiếng Việt', + // Language switch + 'language.zhCN': '中文简体', + 'language.zhTW': '中文繁體', + 'language.en': 'English', + 'language.de': 'Deutsch', + 'language.vi': 'Tiếng Việt', - // Home page text - 'home.addAgent': 'Agent hinzufügen', - 'home.greeting': 'Hallo XiaoZhi', - 'home.wish': 'Lassen Sie uns einen wunderbaren Tag haben!', - 'home.languageModel': 'LLM', - 'home.voiceModel': 'TTS', - 'home.configureRole': 'Rolle konf.', - 'home.voiceprintRecognition': 'Stimmabdruck', - 'home.deviceManagement': 'Geräte', - 'home.chatHistory': 'Chat-Verlauf', - 'home.lastConversation': 'Letzte Konversation', - 'home.noConversation': 'Keine Konversation', - 'home.justNow': 'Gerade eben', - 'home.minutesAgo': 'Vor {minutes} Minuten', - 'home.hoursAgo': 'Vor {hours} Stunden {minutes} Minuten', - 'home.confirmDeleteAgent': 'Sind Sie sicher, dass Sie diesen Agenten löschen möchten?', - 'home.deleteSuccess': 'Löschen erfolgreich', - 'home.deleteFailed': 'Löschen fehlgeschlagen', - 'home.enableMemory': 'Bitte aktivieren Sie zuerst den Speicher auf der \"Rolle konfigurieren\" Seite', + // Home page text + 'home.addAgent': 'Agent hinzufügen', + 'home.greeting': 'Hallo XiaoZhi', + 'home.wish': 'Lassen Sie uns einen wunderbaren Tag haben!', + 'home.languageModel': 'LLM', + 'home.voiceModel': 'TTS', + 'home.configureRole': 'Rolle konf.', + 'home.voiceprintRecognition': 'Stimmabdruck', + 'home.deviceManagement': 'Geräte', + 'home.chatHistory': 'Chat-Verlauf', + 'home.lastConversation': 'Letzte Konversation', + 'home.noConversation': 'Keine Konversation', + 'home.justNow': 'Gerade eben', + 'home.minutesAgo': 'Vor {minutes} Minuten', + 'home.hoursAgo': 'Vor {hours} Stunden {minutes} Minuten', + 'home.confirmDeleteAgent': 'Sind Sie sicher, dass Sie diesen Agenten löschen möchten?', + 'home.deleteSuccess': 'Löschen erfolgreich', + 'home.deleteFailed': 'Löschen fehlgeschlagen', + 'home.enableMemory': 'Bitte aktivieren Sie zuerst den Speicher auf der \"Rolle konfigurieren\" Seite', - // Parameter management page text - 'paramManagement.pageTitle': 'Parameterverwaltung', - 'paramManagement.searchPlaceholder': 'Bitte Parameter-Code oder Bemerkung zur Suche eingeben', - 'paramManagement.search': 'Suchen', - 'paramManagement.paramCode': 'Parameter-Code', - 'paramManagement.paramValue': 'Parameter-Wert', - 'paramManagement.remark': 'Bemerkung', - 'paramManagement.operation': 'Operation', - 'paramManagement.hide': 'Ausblenden', - 'paramManagement.view': 'Anzeigen', - 'paramManagement.deselectAll': 'Alle abwählen', - 'paramManagement.selectAll': 'Alle auswählen', - 'paramManagement.add': 'Hinzufügen', - 'paramManagement.delete': 'Löschen', - 'paramManagement.edit': 'Bearbeiten', - 'paramManagement.itemsPerPage': 'Einträge/Seite', - 'paramManagement.firstPage': 'Erste Seite', - 'paramManagement.prevPage': 'Vorherige Seite', - 'paramManagement.nextPage': 'Nächste Seite', - 'paramManagement.totalRecords': 'Insgesamt {total} Datensätze', - 'paramManagement.addParam': 'Parameter hinzufügen', - 'paramManagement.editParam': 'Parameter bearbeiten', - 'paramManagement.getParamsListFailed': 'Parameterliste konnte nicht abgerufen werden', - 'paramManagement.selectParamsFirst': 'Bitte wählen Sie zuerst Parameter zum Löschen aus', - 'paramManagement.confirmBatchDelete': 'Sind Sie sicher, dass Sie {paramCount} ausgewählte Parameter löschen möchten?', - 'paramManagement.invalidParamId': 'Es gibt ungültige Parameter-IDs', - 'paramManagement.batchDeleteSuccess': 'Erfolgreich {paramCount} Parameter gelöscht', - 'paramManagement.deleteFailed': 'Löschen fehlgeschlagen, bitte versuchen Sie es erneut', - 'paramManagement.operationCancelled': 'Löschen abgebrochen', - 'paramManagement.operationClosed': 'Operation geschlossen', - 'paramManagement.updateSuccess': 'Aktualisierung erfolgreich', - 'paramManagement.addSuccess': 'Hinzufügen erfolgreich', - 'paramManagement.updateFailed': 'Aktualisierung fehlgeschlagen', - 'paramManagement.addFailed': 'Hinzufügen fehlgeschlagen', + // Parameter management page text + 'paramManagement.pageTitle': 'Parameterverwaltung', + 'paramManagement.searchPlaceholder': 'Bitte Parameter-Code oder Bemerkung zur Suche eingeben', + 'paramManagement.search': 'Suchen', + 'paramManagement.paramCode': 'Parameter-Code', + 'paramManagement.paramValue': 'Parameter-Wert', + 'paramManagement.remark': 'Bemerkung', + 'paramManagement.operation': 'Operation', + 'paramManagement.hide': 'Ausblenden', + 'paramManagement.view': 'Anzeigen', + 'paramManagement.deselectAll': 'Alle abwählen', + 'paramManagement.selectAll': 'Alle auswählen', + 'paramManagement.add': 'Hinzufügen', + 'paramManagement.delete': 'Löschen', + 'paramManagement.edit': 'Bearbeiten', + 'paramManagement.itemsPerPage': 'Einträge/Seite', + 'paramManagement.firstPage': 'Erste Seite', + 'paramManagement.prevPage': 'Vorherige Seite', + 'paramManagement.nextPage': 'Nächste Seite', + 'paramManagement.totalRecords': 'Insgesamt {total} Datensätze', + 'paramManagement.addParam': 'Parameter hinzufügen', + 'paramManagement.editParam': 'Parameter bearbeiten', + 'paramManagement.getParamsListFailed': 'Parameterliste konnte nicht abgerufen werden', + 'paramManagement.selectParamsFirst': 'Bitte wählen Sie zuerst Parameter zum Löschen aus', + 'paramManagement.confirmBatchDelete': 'Sind Sie sicher, dass Sie {paramCount} ausgewählte Parameter löschen möchten?', + 'paramManagement.invalidParamId': 'Es gibt ungültige Parameter-IDs', + 'paramManagement.batchDeleteSuccess': 'Erfolgreich {paramCount} Parameter gelöscht', + 'paramManagement.deleteFailed': 'Löschen fehlgeschlagen, bitte versuchen Sie es erneut', + 'paramManagement.operationCancelled': 'Löschen abgebrochen', + 'paramManagement.operationClosed': 'Operation geschlossen', + 'paramManagement.updateSuccess': 'Aktualisierung erfolgreich', + 'paramManagement.addSuccess': 'Hinzufügen erfolgreich', + 'paramManagement.updateFailed': 'Aktualisierung fehlgeschlagen', + 'paramManagement.addFailed': 'Hinzufügen fehlgeschlagen', - // Server side management page text - 'serverSideManager.pageTitle': 'Serververwaltung', - 'serverSideManager.wsAddress': 'WS-Adresse', - 'serverSideManager.operation': 'Operation', - 'serverSideManager.restart': 'Neustart', - 'serverSideManager.updateConfig': 'Konfiguration aktualisieren', - 'serverSideManager.restartServer': 'Server neu starten', - 'serverSideManager.updateConfigTitle': 'Konfiguration aktualisieren', - 'serverSideManager.confirmRestart': 'Sind Sie sicher, dass Sie den Server neu starten möchten?', - 'serverSideManager.confirmUpdateConfig': 'Sind Sie sicher, dass Sie die Konfiguration aktualisieren möchten?', - 'serverSideManager.loading': 'Lädt...', - 'serverSideManager.getServerListFailed': 'Serverliste konnte nicht abgerufen werden', - 'serverSideManager.operationFailed': 'Operation fehlgeschlagen', - 'serverSideManager.restartSuccess': 'Neustart erfolgreich', - 'serverSideManager.updateConfigSuccess': 'Konfigurationsupdate erfolgreich', + // Server side management page text + 'serverSideManager.pageTitle': 'Serververwaltung', + 'serverSideManager.wsAddress': 'WS-Adresse', + 'serverSideManager.operation': 'Operation', + 'serverSideManager.restart': 'Neustart', + 'serverSideManager.updateConfig': 'Konfiguration aktualisieren', + 'serverSideManager.restartServer': 'Server neu starten', + 'serverSideManager.updateConfigTitle': 'Konfiguration aktualisieren', + 'serverSideManager.confirmRestart': 'Sind Sie sicher, dass Sie den Server neu starten möchten?', + 'serverSideManager.confirmUpdateConfig': 'Sind Sie sicher, dass Sie die Konfiguration aktualisieren möchten?', + 'serverSideManager.loading': 'Lädt...', + 'serverSideManager.getServerListFailed': 'Serverliste konnte nicht abgerufen werden', + 'serverSideManager.operationFailed': 'Operation fehlgeschlagen', + 'serverSideManager.restartSuccess': 'Neustart erfolgreich', + 'serverSideManager.updateConfigSuccess': 'Konfigurationsupdate erfolgreich', - // Add agent dialog text - 'addAgentDialog.title': 'Agent hinzufügen', - 'addAgentDialog.agentName': 'Agent-Name', - 'addAgentDialog.placeholder': 'Bitte Agent-Namen eingeben..', - 'addAgentDialog.confirm': 'Bestätigen', - 'addAgentDialog.cancel': 'Abbrechen', - 'addAgentDialog.nameRequired': 'Bitte Agent-Namen eingeben', - 'addAgentDialog.addSuccess': 'Hinzufügen erfolgreich', + // Add agent dialog text + 'addAgentDialog.title': 'Agent hinzufügen', + 'addAgentDialog.agentName': 'Agent-Name', + 'addAgentDialog.placeholder': 'Bitte Agent-Namen eingeben..', + 'addAgentDialog.confirm': 'Bestätigen', + 'addAgentDialog.cancel': 'Abbrechen', + 'addAgentDialog.nameRequired': 'Bitte Agent-Namen eingeben', + 'addAgentDialog.addSuccess': 'Hinzufügen erfolgreich', - // Role configuration page text - 'roleConfig.title': 'Rollenkonfiguration', - 'roleConfig.restartNotice': 'Nach dem Speichern der Konfiguration müssen Sie das Gerät neu starten, damit die neue Konfiguration wirksam wird.', - 'roleConfig.saveConfig': 'Konfiguration speichern', - 'roleConfig.reset': 'Zurücksetzen', - 'roleConfig.agentName': 'Spitzname', - 'roleConfig.roleTemplate': 'Vorlage', - 'roleConfig.roleIntroduction': 'Einführung', - 'roleConfig.languageCode': 'Sprachcode', - 'roleConfig.interactionLanguage': 'Interaktionssprache', - 'roleConfig.vad': 'VAD', - 'roleConfig.asr': 'ASR', - 'roleConfig.llm': 'LLM', - 'roleConfig.vllm': 'VLLM', - 'roleConfig.tts': 'TTS', - 'roleConfig.memoryHis': 'Speicher', - 'roleConfig.memory': 'Speicher', - 'roleConfig.intent': 'Intent', - 'roleConfig.voiceType': 'Stimmtyp', - 'roleConfig.pleaseEnterContent': 'Bitte Inhalt eingeben', - 'roleConfig.pleaseEnterLangCode': 'Bitte Sprachcode eingeben, z.B.: en_US', - 'roleConfig.pleaseEnterLangName': 'Bitte Interaktionssprache eingeben, z.B.: Englisch', - 'roleConfig.pleaseSelect': 'Bitte auswählen', - 'roleConfig.editFunctions': 'Funktionen bearbeiten', - 'roleConfig.reportText': 'Nur Text', - 'roleConfig.reportTextVoice': 'Text & Sprache', - 'roleConfig.saveSuccess': 'Konfiguration erfolgreich gespeichert', - 'roleConfig.saveFailed': 'Konfigurationsspeicherung fehlgeschlagen', - 'roleConfig.confirmReset': 'Sind Sie sicher, dass Sie die Konfiguration zurücksetzen möchten?', - 'roleConfig.resetSuccess': 'Konfiguration wurde zurückgesetzt', - 'roleConfig.fetchTemplatesFailed': 'Vorlagenliste konnte nicht abgerufen werden', - 'roleConfig.templateApplied': 'Vorlage wurde angewendet', - 'roleConfig.applyTemplateFailed': 'Anwenden der Vorlage fehlgeschlagen', - 'roleConfig.fetchConfigFailed': 'Konfiguration konnte nicht abgerufen werden', - 'roleConfig.fetchModelsFailed': 'Modellliste konnte nicht abgerufen werden', - 'roleConfig.fetchPluginsFailed': 'Plugin-Liste konnte nicht abgerufen werden', + // Role configuration page text + 'roleConfig.title': 'Rollenkonfiguration', + 'roleConfig.restartNotice': 'Nach dem Speichern der Konfiguration müssen Sie das Gerät neu starten, damit die neue Konfiguration wirksam wird.', + 'roleConfig.saveConfig': 'Konfiguration speichern', + 'roleConfig.reset': 'Zurücksetzen', + 'roleConfig.agentName': 'Spitzname', + 'roleConfig.roleTemplate': 'Vorlage', + 'roleConfig.roleIntroduction': 'Einführung', + 'roleConfig.languageCode': 'Sprachcode', + 'roleConfig.interactionLanguage': 'Interaktionssprache', + 'roleConfig.vad': 'VAD', + 'roleConfig.asr': 'ASR', + 'roleConfig.llm': 'LLM', + 'roleConfig.vllm': 'VLLM', + 'roleConfig.tts': 'TTS', + 'roleConfig.memoryHis': 'Speicher', + 'roleConfig.memory': 'Speicher', + 'roleConfig.intent': 'Intent', + 'roleConfig.voiceType': 'Stimmtyp', + 'roleConfig.pleaseEnterContent': 'Bitte Inhalt eingeben', + 'roleConfig.pleaseEnterLangCode': 'Bitte Sprachcode eingeben, z.B.: en_US', + 'roleConfig.pleaseEnterLangName': 'Bitte Interaktionssprache eingeben, z.B.: Englisch', + 'roleConfig.pleaseSelect': 'Bitte auswählen', + 'roleConfig.editFunctions': 'Funktionen bearbeiten', + 'roleConfig.reportText': 'Nur Text', + 'roleConfig.reportTextVoice': 'Text & Sprache', + 'roleConfig.saveSuccess': 'Konfiguration erfolgreich gespeichert', + 'roleConfig.saveFailed': 'Konfigurationsspeicherung fehlgeschlagen', + 'roleConfig.confirmReset': 'Sind Sie sicher, dass Sie die Konfiguration zurücksetzen möchten?', + 'roleConfig.resetSuccess': 'Konfiguration wurde zurückgesetzt', + 'roleConfig.fetchTemplatesFailed': 'Vorlagenliste konnte nicht abgerufen werden', + 'roleConfig.templateApplied': 'Vorlage wurde angewendet', + 'roleConfig.applyTemplateFailed': 'Anwenden der Vorlage fehlgeschlagen', + 'roleConfig.fetchConfigFailed': 'Konfiguration konnte nicht abgerufen werden', + 'roleConfig.fetchModelsFailed': 'Modellliste konnte nicht abgerufen werden', + 'roleConfig.fetchPluginsFailed': 'Plugin-Liste konnte nicht abgerufen werden', - // Function management dialog text - 'functionDialog.title': 'Funktionsverwaltung', - 'functionDialog.unselectedFunctions': 'Nicht ausgewählte Funktionen', - 'functionDialog.selectedFunctions': 'Ausgewählte Funktionen', - 'functionDialog.selectAll': 'Alle auswählen', - 'functionDialog.noMorePlugins': 'Keine weiteren Plugins verfügbar', - 'functionDialog.pleaseSelectPlugin': 'Bitte wählen Sie Plugin-Funktionen aus', - 'functionDialog.paramConfig': 'Parameterkonfiguration', - 'functionDialog.noNeedToConfig': ' erfordert keine Parameterkonfiguration', - 'functionDialog.pleaseSelectFunctionForParam': 'Bitte wählen Sie eine konfigurierte Funktion für Parametereinstellungen aus', - 'functionDialog.mcpAccessPoint': 'MCP-Zugangspunkt', - 'functionDialog.mcpAddressDesc': 'Unten sind die MCP-Zugangspunktadressen für den Agenten.', - 'functionDialog.howToDeployMcp': 'Wie man MCP-Zugangspunkt bereitstellt', - 'functionDialog.howToIntegrateMcp': 'Wie man MCP-Funktionen integriert', - 'functionDialog.copy': 'Kopieren', - 'functionDialog.accessPointStatus': 'Zugangspunkt-Status', - 'functionDialog.connected': 'Verbunden', - 'functionDialog.loading': 'Lädt...', - 'functionDialog.disconnected': 'Getrennt', - 'functionDialog.refresh': 'Aktualisieren', - 'functionDialog.noAvailableTools': 'Keine verfügbaren Werkzeuge', - 'functionDialog.cancel': 'Abbrechen', - 'functionDialog.saveConfig': 'Konfiguration speichern', - 'functionDialog.copiedToClipboard': 'In Zwischenablage kopiert', - 'functionDialog.copyFailed': 'Kopieren fehlgeschlagen, bitte manuell kopieren', - 'functionDialog.jsonFormatError': ' Feldformatfehler: ungültiges JSON-Format', - 'functionDialog.defaultValue': 'Standardwert', + // Function management dialog text + 'functionDialog.title': 'Funktionsverwaltung', + 'functionDialog.unselectedFunctions': 'Nicht ausgewählte Funktionen', + 'functionDialog.selectedFunctions': 'Ausgewählte Funktionen', + 'functionDialog.selectAll': 'Alle auswählen', + 'functionDialog.noMorePlugins': 'Keine weiteren Plugins verfügbar', + 'functionDialog.pleaseSelectPlugin': 'Bitte wählen Sie Plugin-Funktionen aus', + 'functionDialog.paramConfig': 'Parameterkonfiguration', + 'functionDialog.noNeedToConfig': ' erfordert keine Parameterkonfiguration', + 'functionDialog.pleaseSelectFunctionForParam': 'Bitte wählen Sie eine konfigurierte Funktion für Parametereinstellungen aus', + 'functionDialog.mcpAccessPoint': 'MCP-Zugangspunkt', + 'functionDialog.mcpAddressDesc': 'Unten sind die MCP-Zugangspunktadressen für den Agenten.', + 'functionDialog.howToDeployMcp': 'Wie man MCP-Zugangspunkt bereitstellt', + 'functionDialog.howToIntegrateMcp': 'Wie man MCP-Funktionen integriert', + 'functionDialog.copy': 'Kopieren', + 'functionDialog.accessPointStatus': 'Zugangspunkt-Status', + 'functionDialog.connected': 'Verbunden', + 'functionDialog.loading': 'Lädt...', + 'functionDialog.disconnected': 'Getrennt', + 'functionDialog.refresh': 'Aktualisieren', + 'functionDialog.noAvailableTools': 'Keine verfügbaren Werkzeuge', + 'functionDialog.cancel': 'Abbrechen', + 'functionDialog.saveConfig': 'Konfiguration speichern', + 'functionDialog.copiedToClipboard': 'In Zwischenablage kopiert', + 'functionDialog.copyFailed': 'Kopieren fehlgeschlagen, bitte manuell kopieren', + 'functionDialog.jsonFormatError': ' Feldformatfehler: ungültiges JSON-Format', + 'functionDialog.defaultValue': 'Standardwert', - // Model Configuration Page Text - 'modelConfig.searchPlaceholder': 'Bitte Modellnamen zur Suche eingeben', - 'modelConfig.search': 'Suchen', - 'modelConfig.vad': 'Sprachaktivitätserkennung', - 'modelConfig.asr': 'Spracherkennung', - 'modelConfig.llm': 'Großes Sprachmodell', - 'modelConfig.vllm': 'Visuelles Sprachmodell', - 'modelConfig.intent': 'Absichtserkennung', - 'modelConfig.tts': 'Text-zu-Sprache', - 'modelConfig.memory': 'Speicher', - 'modelConfig.rag': 'RAG', - 'modelConfig.modelId': 'Modell-ID', - 'modelConfig.modelName': 'Modellname', - 'modelConfig.provider': 'Anbieter', - 'modelConfig.unknown': 'Unbekannt', - 'modelConfig.isEnabled': 'Aktiviert', - 'modelConfig.isDefault': 'Standard', - 'modelConfig.action': 'Aktion', - 'modelConfig.voiceManagement': 'Stimmverwaltung', - 'modelConfig.edit': 'Bearbeiten', - 'modelConfig.duplicate': 'Duplizieren', - 'modelConfig.delete': 'Löschen', - 'modelConfig.deselectAll': 'Alle abwählen', - 'modelConfig.select': 'ausw.', - 'modelConfig.selectAll': 'Alle auswählen', - 'modelConfig.add': 'Neu hinzufügen', - 'modelConfig.selectModelsFirst': 'Bitte wählen Sie zuerst Modelle zum Löschen aus', - 'modelConfig.confirmBatchDelete': 'Sind Sie sicher, dass Sie die ausgewählten Modelle löschen möchten?', - 'modelConfig.confirmDelete': 'Sind Sie sicher, dass Sie dieses Modell löschen möchten?', - 'modelConfig.batchDeleteSuccess': 'Massenlöschung erfolgreich', - 'modelConfig.partialDeleteFailed': 'Teilweise Löschung fehlgeschlagen', - 'modelConfig.deleteSuccess': 'Löschung erfolgreich', - 'modelConfig.deleteFailed': 'Löschung fehlgeschlagen', - 'modelConfig.deleteCancelled': 'Löschung abgebrochen', - 'modelConfig.duplicateSuccess': 'Duplizierung erfolgreich', - 'modelConfig.duplicateFailed': 'Duplizierung fehlgeschlagen', - 'modelConfig.saveSuccess': 'Speichern erfolgreich', - 'modelConfig.saveFailed': 'Speichern fehlgeschlagen', - 'modelConfig.addSuccess': 'Hinzufügen erfolgreich', - 'modelConfig.addFailed': 'Hinzufügen fehlgeschlagen', - 'modelConfig.fetchModelsFailed': 'Modellliste konnte nicht abgerufen werden', - 'modelConfig.enableSuccess': 'Aktivieren erfolgreich', - 'modelConfig.disableSuccess': 'Deaktivieren erfolgreich', - 'modelConfig.operationFailed': 'Operation fehlgeschlagen', - 'modelConfig.setDefaultSuccess': 'Standardmodell erfolgreich gesetzt', - 'modelConfig.itemsPerPage': '{items} Einträge/Seite', - 'modelConfig.firstPage': 'Erste Seite', - 'modelConfig.prevPage': 'Vorherige Seite', - 'modelConfig.nextPage': 'Nächste Seite', - 'modelConfig.totalRecords': 'Insgesamt {total} Datensätze', - 'modelConfig.loading': 'Lädt...', + // Model Configuration Page Text + 'modelConfig.searchPlaceholder': 'Bitte Modellnamen zur Suche eingeben', + 'modelConfig.search': 'Suchen', + 'modelConfig.vad': 'Sprachaktivitätserkennung', + 'modelConfig.asr': 'Spracherkennung', + 'modelConfig.llm': 'Großes Sprachmodell', + 'modelConfig.vllm': 'Visuelles Sprachmodell', + 'modelConfig.intent': 'Absichtserkennung', + 'modelConfig.tts': 'Text-zu-Sprache', + 'modelConfig.memory': 'Speicher', + 'modelConfig.rag': 'RAG', + 'modelConfig.modelId': 'Modell-ID', + 'modelConfig.modelName': 'Modellname', + 'modelConfig.provider': 'Anbieter', + 'modelConfig.unknown': 'Unbekannt', + 'modelConfig.isEnabled': 'Aktiviert', + 'modelConfig.isDefault': 'Standard', + 'modelConfig.action': 'Aktion', + 'modelConfig.voiceManagement': 'Stimmverwaltung', + 'modelConfig.edit': 'Bearbeiten', + 'modelConfig.duplicate': 'Duplizieren', + 'modelConfig.delete': 'Löschen', + 'modelConfig.deselectAll': 'Alle abwählen', + 'modelConfig.select': 'ausw.', + 'modelConfig.selectAll': 'Alle auswählen', + 'modelConfig.add': 'Neu hinzufügen', + 'modelConfig.selectModelsFirst': 'Bitte wählen Sie zuerst Modelle zum Löschen aus', + 'modelConfig.confirmBatchDelete': 'Sind Sie sicher, dass Sie die ausgewählten Modelle löschen möchten?', + 'modelConfig.confirmDelete': 'Sind Sie sicher, dass Sie dieses Modell löschen möchten?', + 'modelConfig.batchDeleteSuccess': 'Massenlöschung erfolgreich', + 'modelConfig.partialDeleteFailed': 'Teilweise Löschung fehlgeschlagen', + 'modelConfig.deleteSuccess': 'Löschung erfolgreich', + 'modelConfig.deleteFailed': 'Löschung fehlgeschlagen', + 'modelConfig.deleteCancelled': 'Löschung abgebrochen', + 'modelConfig.duplicateSuccess': 'Duplizierung erfolgreich', + 'modelConfig.duplicateFailed': 'Duplizierung fehlgeschlagen', + 'modelConfig.saveSuccess': 'Speichern erfolgreich', + 'modelConfig.saveFailed': 'Speichern fehlgeschlagen', + 'modelConfig.addSuccess': 'Hinzufügen erfolgreich', + 'modelConfig.addFailed': 'Hinzufügen fehlgeschlagen', + 'modelConfig.fetchModelsFailed': 'Modellliste konnte nicht abgerufen werden', + 'modelConfig.enableSuccess': 'Aktivieren erfolgreich', + 'modelConfig.disableSuccess': 'Deaktivieren erfolgreich', + 'modelConfig.operationFailed': 'Operation fehlgeschlagen', + 'modelConfig.setDefaultSuccess': 'Standardmodell erfolgreich gesetzt', + 'modelConfig.itemsPerPage': '{items} Einträge/Seite', + 'modelConfig.firstPage': 'Erste Seite', + 'modelConfig.prevPage': 'Vorherige Seite', + 'modelConfig.nextPage': 'Nächste Seite', + 'modelConfig.totalRecords': 'Insgesamt {total} Datensätze', + 'modelConfig.loading': 'Lädt...', - // Model Configuration Dialog Text - 'modelConfigDialog.addModel': 'Modell hinzufügen', - 'modelConfigDialog.editModel': 'Modell bearbeiten', - 'modelConfigDialog.duplicateModel': 'Modell duplizieren', - 'modelConfigDialog.copySuffix': '_Kopie', - 'modelConfigDialog.modelInfo': 'Modellinformationen', - 'modelConfigDialog.enable': 'Aktivieren', - 'modelConfigDialog.setDefault': 'Als Standard festlegen', - 'modelConfigDialog.modelId': 'Modell-ID', - 'modelConfigDialog.enterModelId': 'Wenn nicht ausgefüllt, wird es automatisch generiert', - 'modelConfigDialog.modelName': 'Modellname', - 'modelConfigDialog.enterModelName': 'Bitte Modellnamen eingeben', - 'modelConfigDialog.modelCode': 'Modellcode', - 'modelConfigDialog.enterModelCode': 'Bitte Modellcode eingeben', - 'modelConfigDialog.supplier': 'Anbieter', - 'modelConfigDialog.selectSupplier': 'Bitte auswählen', - 'modelConfigDialog.sortOrder': 'Sortierreihenfolge', - 'modelConfigDialog.enterSortOrder': 'Bitte Sortierreihenfolge eingeben', - 'modelConfigDialog.docLink': 'Dokumentationslink', - 'modelConfigDialog.enterDocLink': 'Bitte Dokumentationslink eingeben', - 'modelConfigDialog.remark': 'Bemerkung', - 'modelConfigDialog.enterRemark': 'Bitte Modellbemerkung eingeben', - 'modelConfigDialog.callInfo': 'Aufrufinformationen', - 'modelConfigDialog.enterJsonExample': 'Bitte JSON-Format Variablen eingeben (Beispiel:{\"key\":\"value\"})', - 'modelConfigDialog.save': 'Speichern', + // Model Configuration Dialog Text + 'modelConfigDialog.addModel': 'Modell hinzufügen', + 'modelConfigDialog.editModel': 'Modell bearbeiten', + 'modelConfigDialog.duplicateModel': 'Modell duplizieren', + 'modelConfigDialog.copySuffix': '_Kopie', + 'modelConfigDialog.modelInfo': 'Modellinformationen', + 'modelConfigDialog.enable': 'Aktivieren', + 'modelConfigDialog.setDefault': 'Als Standard festlegen', + 'modelConfigDialog.modelId': 'Modell-ID', + 'modelConfigDialog.enterModelId': 'Wenn nicht ausgefüllt, wird es automatisch generiert', + 'modelConfigDialog.invalidModelId': 'Modell-ID darf nicht nur aus Text oder Leerzeichen bestehen, bitte verwenden Sie Buchstaben, Zahlen, Unterstriche oder Bindestriche', + 'modelConfigDialog.modelName': 'Modellname', + 'modelConfigDialog.enterModelName': 'Bitte Modellnamen eingeben', + 'modelConfigDialog.modelCode': 'Modellcode', + 'modelConfigDialog.enterModelCode': 'Bitte Modellcode eingeben', + 'modelConfigDialog.supplier': 'Anbieter', + 'modelConfigDialog.selectSupplier': 'Bitte auswählen', + 'modelConfigDialog.sortOrder': 'Sortierreihenfolge', + 'modelConfigDialog.enterSortOrder': 'Bitte Sortierreihenfolge eingeben', + 'modelConfigDialog.docLink': 'Dokumentationslink', + 'modelConfigDialog.enterDocLink': 'Bitte Dokumentationslink eingeben', + 'modelConfigDialog.remark': 'Bemerkung', + 'modelConfigDialog.enterRemark': 'Bitte Modellbemerkung eingeben', + 'modelConfigDialog.callInfo': 'Aufrufinformationen', + 'modelConfigDialog.enterJsonExample': 'Bitte JSON-Format Variablen eingeben (Beispiel:{\"key\":\"value\"})', + 'modelConfigDialog.save': 'Speichern', - // TTS Model Configuration Text - 'ttsModel.select': 'Auswählen', - 'ttsModel.voiceCode': 'Stimmcode', - 'ttsModel.voiceName': 'Stimmname', - 'ttsModel.languageType': 'Sprachtyp', - 'ttsModel.preview': 'Vorschau', - 'ttsModel.enterMp3Url': 'Bitte MP3-URL eingeben', - 'ttsModel.remark': 'Bemerkung', - 'ttsModel.enterRemark': 'Dies ist eine Bemerkung', - 'ttsModel.referenceAudioPath': 'Referenz-Audio-Pfad', - 'ttsModel.enterReferenceAudio': 'Dies ist der Referenz-Audio-Pfad', - 'ttsModel.referenceText': 'Referenz-Audio-Text', - 'ttsModel.enterReferenceText': 'Dies ist der Text für Referenz-Audio', - 'ttsModel.action': 'Aktion', - 'ttsModel.operation': 'Operation', - 'ttsModel.operationFailed': 'Operation fehlgeschlagen', - 'ttsModel.operationClosed': 'Operation geschlossen', - 'ttsModel.edit': 'Bearbeiten', - 'ttsModel.delete': 'Löschen', - 'ttsModel.deleteVoiceSuccess': 'Erfolgreich {count} Stimmen gelöscht', - 'ttsModel.deleteFailed': 'Löschen der Stimmen fehlgeschlagen', - 'ttsModel.save': 'Speichern', - 'ttsModel.deselectAll': 'Alle abwählen', - 'ttsModel.selectAll': 'Alle auswählen', - 'ttsModel.add': 'Hinzufügen', - 'ttsModel.fetchVoicesFailed': 'Stimmliste konnte nicht abgerufen werden', - 'ttsModel.loadVoicesFailed': 'Stimmdaten konnten nicht geladen werden', - 'ttsModel.unnamedVoice': 'Unbenannte Stimme', - 'ttsModel.finishEditingFirst': 'Bitte beenden Sie zuerst die aktuelle Bearbeitung', - 'ttsModel.selectVoiceToDelete': 'Bitte wählen Sie Stimmen zum Löschen aus', - 'ttsModel.warning': 'Warnung', - 'ttsModel.confirmDeleteVoice': 'Sind Sie sicher, dass Sie {count} Stimmen löschen möchten?', + // TTS Model Configuration Text + 'ttsModel.select': 'Auswählen', + 'ttsModel.voiceCode': 'Stimmcode', + 'ttsModel.voiceName': 'Stimmname', + 'ttsModel.languageType': 'Sprachtyp', + 'ttsModel.preview': 'Vorschau', + 'ttsModel.enterMp3Url': 'Bitte MP3-URL eingeben', + 'ttsModel.remark': 'Bemerkung', + 'ttsModel.enterRemark': 'Dies ist eine Bemerkung', + 'ttsModel.referenceAudioPath': 'Referenz-Audio-Pfad', + 'ttsModel.enterReferenceAudio': 'Dies ist der Referenz-Audio-Pfad', + 'ttsModel.referenceText': 'Referenz-Audio-Text', + 'ttsModel.enterReferenceText': 'Dies ist der Text für Referenz-Audio', + 'ttsModel.action': 'Aktion', + 'ttsModel.operation': 'Operation', + 'ttsModel.operationFailed': 'Operation fehlgeschlagen', + 'ttsModel.operationClosed': 'Operation geschlossen', + 'ttsModel.edit': 'Bearbeiten', + 'ttsModel.delete': 'Löschen', + 'ttsModel.deleteVoiceSuccess': 'Erfolgreich {count} Stimmen gelöscht', + 'ttsModel.deleteFailed': 'Löschen der Stimmen fehlgeschlagen', + 'ttsModel.save': 'Speichern', + 'ttsModel.deselectAll': 'Alle abwählen', + 'ttsModel.selectAll': 'Alle auswählen', + 'ttsModel.add': 'Hinzufügen', + 'ttsModel.fetchVoicesFailed': 'Stimmliste konnte nicht abgerufen werden', + 'ttsModel.loadVoicesFailed': 'Stimmdaten konnten nicht geladen werden', + 'ttsModel.unnamedVoice': 'Unbenannte Stimme', + 'ttsModel.finishEditingFirst': 'Bitte beenden Sie zuerst die aktuelle Bearbeitung', + 'ttsModel.selectVoiceToDelete': 'Bitte wählen Sie Stimmen zum Löschen aus', + 'ttsModel.warning': 'Warnung', + 'ttsModel.confirmDeleteVoice': 'Sind Sie sicher, dass Sie {count} Stimmen löschen möchten?', - // OTA Management Page Text - 'otaManagement.firmwareManagement': 'Firmware-Verwaltung', - 'otaManagement.searchPlaceholder': 'Bitte Firmware-Namen zur Suche eingeben', - 'otaManagement.search': 'Suchen', - 'otaManagement.firmwareName': 'Firmware-Name', - 'otaManagement.firmwareType': 'Firmware-Typ', - 'otaManagement.version': 'Version', - 'otaManagement.fileSize': 'Dateigröße', - 'otaManagement.remark': 'Bemerkung', - 'otaManagement.createTime': 'Erstellungszeit', - 'otaManagement.updateTime': 'Aktualisierungszeit', - 'otaManagement.action': 'Aktion', - 'otaManagement.download': 'Herunterladen', - 'otaManagement.edit': 'Bearbeiten', - 'otaManagement.delete': 'Löschen', - 'otaManagement.selectAll': 'Alle auswählen', - 'otaManagement.deselectAll': 'Alle abwählen', - 'otaManagement.addNew': 'Neu hinzufügen', - 'otaManagement.addFirmware': 'Firmware hinzufügen', - 'otaManagement.editFirmware': 'Firmware bearbeiten', - 'otaManagement.itemsPerPage': '{items} Einträge/Seite', - 'otaManagement.firstPage': 'Erste Seite', - 'otaManagement.prevPage': 'Vorherige Seite', - 'otaManagement.nextPage': 'Nächste Seite', - 'otaManagement.totalRecords': 'Insgesamt {total} Datensätze', - 'otaManagement.selectFirmwareFirst': 'Bitte wählen Sie zuerst Firmware zum Löschen aus', - 'otaManagement.confirmBatchDelete': 'Sind Sie sicher, dass Sie die ausgewählten {paramCount} Firmware löschen möchten?', - 'otaManagement.operationCancelled': 'Löschvorgang wurde abgebrochen', - 'otaManagement.operationClosed': 'Vorgang wurde geschlossen', - 'otaManagement.batchDeleteSuccess': 'Erfolgreich {paramCount} Firmware gelöscht', - 'otaManagement.deleteFailed': 'Löschen fehlgeschlagen, bitte versuchen Sie es erneut', - 'otaManagement.incompleteFirmwareInfo': 'Unvollständige Firmware-Informationen', - 'otaManagement.getDownloadUrlFailed': 'Download-Link konnte nicht abgerufen werden', - 'otaManagement.getFirmwareTypesFailed': 'Firmware-Typen konnten nicht abgerufen werden', - 'otaManagement.updateSuccess': 'Aktualisierung erfolgreich', - 'otaManagement.updateFailed': 'Aktualisierung fehlgeschlagen', - 'otaManagement.addSuccess': 'Hinzufügen erfolgreich', - 'otaManagement.addFailed': 'Hinzufügen fehlgeschlagen', - 'otaManagement.fetchFirmwareListFailed': 'Firmware-Liste konnte nicht abgerufen werden', + // OTA Management Page Text + 'otaManagement.firmwareManagement': 'Firmware-Verwaltung', + 'otaManagement.searchPlaceholder': 'Bitte Firmware-Namen zur Suche eingeben', + 'otaManagement.search': 'Suchen', + 'otaManagement.firmwareName': 'Firmware-Name', + 'otaManagement.firmwareType': 'Firmware-Typ', + 'otaManagement.version': 'Version', + 'otaManagement.fileSize': 'Dateigröße', + 'otaManagement.remark': 'Bemerkung', + 'otaManagement.createTime': 'Erstellungszeit', + 'otaManagement.updateTime': 'Aktualisierungszeit', + 'otaManagement.action': 'Aktion', + 'otaManagement.download': 'Herunterladen', + 'otaManagement.edit': 'Bearbeiten', + 'otaManagement.delete': 'Löschen', + 'otaManagement.selectAll': 'Alle auswählen', + 'otaManagement.deselectAll': 'Alle abwählen', + 'otaManagement.addNew': 'Neu hinzufügen', + 'otaManagement.addFirmware': 'Firmware hinzufügen', + 'otaManagement.editFirmware': 'Firmware bearbeiten', + 'otaManagement.itemsPerPage': '{items} Einträge/Seite', + 'otaManagement.firstPage': 'Erste Seite', + 'otaManagement.prevPage': 'Vorherige Seite', + 'otaManagement.nextPage': 'Nächste Seite', + 'otaManagement.totalRecords': 'Insgesamt {total} Datensätze', + 'otaManagement.selectFirmwareFirst': 'Bitte wählen Sie zuerst Firmware zum Löschen aus', + 'otaManagement.confirmBatchDelete': 'Sind Sie sicher, dass Sie die ausgewählten {paramCount} Firmware löschen möchten?', + 'otaManagement.operationCancelled': 'Löschvorgang wurde abgebrochen', + 'otaManagement.operationClosed': 'Vorgang wurde geschlossen', + 'otaManagement.batchDeleteSuccess': 'Erfolgreich {paramCount} Firmware gelöscht', + 'otaManagement.deleteFailed': 'Löschen fehlgeschlagen, bitte versuchen Sie es erneut', + 'otaManagement.incompleteFirmwareInfo': 'Unvollständige Firmware-Informationen', + 'otaManagement.getDownloadUrlFailed': 'Download-Link konnte nicht abgerufen werden', + 'otaManagement.getFirmwareTypesFailed': 'Firmware-Typen konnten nicht abgerufen werden', + 'otaManagement.updateSuccess': 'Aktualisierung erfolgreich', + 'otaManagement.updateFailed': 'Aktualisierung fehlgeschlagen', + 'otaManagement.addSuccess': 'Hinzufügen erfolgreich', + 'otaManagement.addFailed': 'Hinzufügen fehlgeschlagen', + 'otaManagement.fetchFirmwareListFailed': 'Firmware-Liste konnte nicht abgerufen werden', - // Provider Management page model type translations - 'providerManagement.all': 'Alle', - 'providerManagement.modelType.ASR': 'Spracherkennung', - 'providerManagement.modelType.TTS': 'Text-zu-Sprache', - 'providerManagement.modelType.LLM': 'Großes Sprachmodell', - 'providerManagement.modelType.VLLM': 'Vision Großes Sprachmodell', - 'providerManagement.modelType.Intent': 'Absichtserkennung', - 'providerManagement.modelType.Memory': 'Speichermodul', - 'providerManagement.modelType.VAD': 'Sprachaktivitätserkennung', - 'providerManagement.modelType.Plugin': 'Plugin-Werkzeug', - 'providerManagement.modelType.RAG': 'RAG', + // Provider Management page model type translations + 'providerManagement.all': 'Alle', + 'providerManagement.modelType.ASR': 'Spracherkennung', + 'providerManagement.modelType.TTS': 'Text-zu-Sprache', + 'providerManagement.modelType.LLM': 'Großes Sprachmodell', + 'providerManagement.modelType.VLLM': 'Vision Großes Sprachmodell', + 'providerManagement.modelType.Intent': 'Absichtserkennung', + 'providerManagement.modelType.Memory': 'Speichermodul', + 'providerManagement.modelType.VAD': 'Sprachaktivitätserkennung', + 'providerManagement.modelType.Plugin': 'Plugin-Werkzeug', + 'providerManagement.modelType.RAG': 'RAG', - // Provider Dialog translations - 'providerDialog.category': 'Kategorie', - 'providerDialog.selectCategory': 'Bitte Kategorie auswählen', - 'providerDialog.code': 'Code', - 'providerDialog.inputCode': 'Bitte Anbieter-Code eingeben', - 'providerDialog.name': 'Name', - 'providerDialog.inputName': 'Bitte Anbieter-Namen eingeben', - 'providerDialog.sort': 'Sortierung', - 'providerDialog.fieldConfig': 'Feldkonfiguration', - 'providerDialog.add': 'Hinzufügen', - 'providerDialog.deselectAll': 'Alle abwählen', - 'providerDialog.selectAll': 'Alle auswählen', - 'providerDialog.batchDelete': 'Massenlöschung', - 'providerDialog.fieldKey': 'Feld-Schlüssel', - 'providerDialog.fieldLabel': 'Feld-Label', - 'providerDialog.fieldType': 'Feldtyp', - 'providerDialog.type': 'Typ', - 'providerDialog.stringType': 'Zeichenkette', - 'providerDialog.numberType': 'Zahl', - 'providerDialog.booleanType': 'Boolesch', - 'providerDialog.dictType': 'Wörterbuch', - 'providerDialog.arrayType': 'Semikolon-getrennte Liste', - 'providerDialog.ragType': 'RAG', - 'providerDialog.defaultValue': 'Standardwert', - 'providerDialog.inputDefaultValue': 'Bitte Standardwert eingeben', - 'providerDialog.operation': 'Operation', - 'providerDialog.edit': 'Bearbeiten', - 'providerDialog.complete': 'Fertig', - 'providerDialog.delete': 'Löschen', - 'providerDialog.save': 'Speichern', - 'providerDialog.requiredCategory': 'Bitte Kategorie auswählen', - 'providerDialog.requiredCode': 'Bitte Anbieter-Code eingeben', - 'providerDialog.requiredName': 'Bitte Anbieter-Namen eingeben', - 'providerDialog.completeFieldEdit': 'Bitte beenden Sie zuerst die aktuelle Feldbearbeitung', - 'providerDialog.confirmDeleteField': 'Sind Sie sicher, dass Sie dieses Feld löschen möchten?', - 'providerDialog.selectFieldsToDelete': 'Bitte wählen Sie zuerst Felder zum Löschen aus', - 'providerDialog.confirmBatchDeleteFields': 'Sind Sie sicher, dass Sie {count} ausgewählte Felder löschen möchten?', - 'providerDialog.batchDeleteFieldsSuccess': 'Erfolgreich {count} Felder gelöscht', + // Provider Dialog translations + 'providerDialog.category': 'Kategorie', + 'providerDialog.selectCategory': 'Bitte Kategorie auswählen', + 'providerDialog.code': 'Code', + 'providerDialog.inputCode': 'Bitte Anbieter-Code eingeben', + 'providerDialog.name': 'Name', + 'providerDialog.inputName': 'Bitte Anbieter-Namen eingeben', + 'providerDialog.sort': 'Sortierung', + 'providerDialog.fieldConfig': 'Feldkonfiguration', + 'providerDialog.add': 'Hinzufügen', + 'providerDialog.deselectAll': 'Alle abwählen', + 'providerDialog.selectAll': 'Alle auswählen', + 'providerDialog.batchDelete': 'Massenlöschung', + 'providerDialog.fieldKey': 'Feld-Schlüssel', + 'providerDialog.fieldLabel': 'Feld-Label', + 'providerDialog.fieldType': 'Feldtyp', + 'providerDialog.type': 'Typ', + 'providerDialog.stringType': 'Zeichenkette', + 'providerDialog.numberType': 'Zahl', + 'providerDialog.booleanType': 'Boolesch', + 'providerDialog.dictType': 'Wörterbuch', + 'providerDialog.arrayType': 'Semikolon-getrennte Liste', + 'providerDialog.ragType': 'RAG', + 'providerDialog.defaultValue': 'Standardwert', + 'providerDialog.inputDefaultValue': 'Bitte Standardwert eingeben', + 'providerDialog.operation': 'Operation', + 'providerDialog.edit': 'Bearbeiten', + 'providerDialog.complete': 'Fertig', + 'providerDialog.delete': 'Löschen', + 'providerDialog.save': 'Speichern', + 'providerDialog.requiredCategory': 'Bitte Kategorie auswählen', + 'providerDialog.requiredCode': 'Bitte Anbieter-Code eingeben', + 'providerDialog.requiredName': 'Bitte Anbieter-Namen eingeben', + 'providerDialog.completeFieldEdit': 'Bitte beenden Sie zuerst die aktuelle Feldbearbeitung', + 'providerDialog.confirmDeleteField': 'Sind Sie sicher, dass Sie dieses Feld löschen möchten?', + 'providerDialog.selectFieldsToDelete': 'Bitte wählen Sie zuerst Felder zum Löschen aus', + 'providerDialog.confirmBatchDeleteFields': 'Sind Sie sicher, dass Sie {count} ausgewählte Felder löschen möchten?', + 'providerDialog.batchDeleteFieldsSuccess': 'Erfolgreich {count} Felder gelöscht', - // agentTemplateManagement - 'agentTemplateManagement.title': 'Standard-Rollenverwaltung', - 'agentTemplateManagement.templateName': 'Vorlagenname', - 'agentTemplateManagement.action': 'Aktion', - 'agentTemplateManagement.createTemplate': 'Vorlage erstellen', - 'templateQuickConfig.newTemplate': 'Neue Vorlage', - 'agentTemplateManagement.editTemplate': 'Vorlage bearbeiten', - 'agentTemplateManagement.deleteTemplate': 'Vorlage löschen', - 'agentTemplateManagement.deleteSuccess': 'Vorlage erfolgreich gelöscht', - 'agentTemplateManagement.batchDelete': 'Massenlöschung', - 'agentTemplateManagement.batchDeleteSuccess': 'Massenlöschung erfolgreich', - 'agentTemplateManagement.selectTemplate': 'Bitte wählen Sie eine Vorlage aus', - 'agentTemplateManagement.select': 'Auswählen', - 'agentTemplateManagement.searchPlaceholder': 'Bitte Vorlagennamen zur Suche eingeben', - 'agentTemplateManagement.search': 'Suchen', - 'agentTemplateManagement.serialNumber': 'Seriennummer', - 'agentTemplateManagement.selectAll': 'Alle auswählen', - 'agentTemplateManagement.deselectAll': 'Alle abwählen', - 'agentTemplateManagement.loading': 'Lädt...', - 'agentTemplateManagement.confirmSingleDelete': 'Sind Sie sicher, dass Sie diese Vorlage löschen möchten?', - 'agentTemplateManagement.confirmBatchDelete': 'Sind Sie sicher, dass Sie die ausgewählten {count} Vorlagen löschen möchten?', - 'agentTemplateManagement.deleteFailed': 'Vorlagenlöschung fehlgeschlagen', - 'agentTemplateManagement.batchDeleteFailed': 'Vorlagen-Massenlöschung fehlgeschlagen', - 'agentTemplateManagement.deleteBackendError': 'Löschen fehlgeschlagen, bitte prüfen Sie, ob der Backend-Service normal ist', + // agentTemplateManagement + 'agentTemplateManagement.title': 'Standard-Rollenverwaltung', + 'agentTemplateManagement.templateName': 'Vorlagenname', + 'agentTemplateManagement.action': 'Aktion', + 'agentTemplateManagement.createTemplate': 'Vorlage erstellen', + 'templateQuickConfig.newTemplate': 'Neue Vorlage', + 'agentTemplateManagement.editTemplate': 'Vorlage bearbeiten', + 'agentTemplateManagement.deleteTemplate': 'Vorlage löschen', + 'agentTemplateManagement.deleteSuccess': 'Vorlage erfolgreich gelöscht', + 'agentTemplateManagement.batchDelete': 'Massenlöschung', + 'agentTemplateManagement.batchDeleteSuccess': 'Massenlöschung erfolgreich', + 'agentTemplateManagement.selectTemplate': 'Bitte wählen Sie eine Vorlage aus', + 'agentTemplateManagement.select': 'Auswählen', + 'agentTemplateManagement.searchPlaceholder': 'Bitte Vorlagennamen zur Suche eingeben', + 'agentTemplateManagement.search': 'Suchen', + 'agentTemplateManagement.serialNumber': 'Seriennummer', + 'agentTemplateManagement.selectAll': 'Alle auswählen', + 'agentTemplateManagement.deselectAll': 'Alle abwählen', + 'agentTemplateManagement.loading': 'Lädt...', + 'agentTemplateManagement.confirmSingleDelete': 'Sind Sie sicher, dass Sie diese Vorlage löschen möchten?', + 'agentTemplateManagement.confirmBatchDelete': 'Sind Sie sicher, dass Sie die ausgewählten {count} Vorlagen löschen möchten?', + 'agentTemplateManagement.deleteFailed': 'Vorlagenlöschung fehlgeschlagen', + 'agentTemplateManagement.batchDeleteFailed': 'Vorlagen-Massenlöschung fehlgeschlagen', + 'agentTemplateManagement.deleteBackendError': 'Löschen fehlgeschlagen, bitte prüfen Sie, ob der Backend-Service normal ist', - // templateQuickConfig - 'templateQuickConfig.title': 'Modul-Schnellkonfiguration', - 'templateQuickConfig.agentSettings.agentName': 'Spitzname', - 'templateQuickConfig.agentSettings.agentNamePlaceholder': 'Bitte Spitznamen eingeben', - 'templateQuickConfig.agentSettings.systemPrompt': 'Einführung', - 'templateQuickConfig.agentSettings.systemPromptPlaceholder': 'Bitte Einführung eingeben', - 'templateQuickConfig.saveConfig': 'Konfiguration speichern', - 'templateQuickConfig.resetConfig': 'Konfiguration zurücksetzen', - 'templateQuickConfig.saveSuccess': 'Speichern erfolgreich', - 'templateQuickConfig.resetSuccess': 'Zurücksetzen erfolgreich', - 'templateQuickConfig.confirmReset': 'Sind Sie sicher, dass Sie die Konfiguration zurücksetzen möchten?', - 'templateQuickConfig.saveFailed': 'Konfigurationsspeicherung fehlgeschlagen', - 'templateQuickConfig.confirm': 'Bestätigen', - 'templateQuickConfig.cancel': 'Abbrechen', - 'templateQuickConfig.templateNotFound': 'Vorlage nicht gefunden', - 'warning': 'Warnung', - 'info': 'Info', - 'common.networkError': 'Netzwerkanfrage fehlgeschlagen', + // templateQuickConfig + 'templateQuickConfig.title': 'Modul-Schnellkonfiguration', + 'templateQuickConfig.agentSettings.agentName': 'Spitzname', + 'templateQuickConfig.agentSettings.agentNamePlaceholder': 'Bitte Spitznamen eingeben', + 'templateQuickConfig.agentSettings.systemPrompt': 'Einführung', + 'templateQuickConfig.agentSettings.systemPromptPlaceholder': 'Bitte Einführung eingeben', + 'templateQuickConfig.saveConfig': 'Konfiguration speichern', + 'templateQuickConfig.resetConfig': 'Konfiguration zurücksetzen', + 'templateQuickConfig.saveSuccess': 'Speichern erfolgreich', + 'templateQuickConfig.resetSuccess': 'Zurücksetzen erfolgreich', + 'templateQuickConfig.confirmReset': 'Sind Sie sicher, dass Sie die Konfiguration zurücksetzen möchten?', + 'templateQuickConfig.saveFailed': 'Konfigurationsspeicherung fehlgeschlagen', + 'templateQuickConfig.confirm': 'Bestätigen', + 'templateQuickConfig.cancel': 'Abbrechen', + 'templateQuickConfig.templateNotFound': 'Vorlage nicht gefunden', + 'warning': 'Warnung', + 'info': 'Info', + 'common.networkError': 'Netzwerkanfrage fehlgeschlagen', - // SM2 Encryption - 'sm2.publicKeyNotConfigured': 'SM2 öffentlicher Schlüssel nicht konfiguriert, bitte Administrator kontaktieren', - 'sm2.encryptionFailed': 'Passwortverschlüsselung fehlgeschlagen', - 'sm2.keyGenerationFailed': 'Schlüsselpaar-Generierung fehlgeschlagen', - 'sm2.invalidPublicKey': 'Ungültiges öffentliches Schlüsselformat', - 'sm2.encryptionError': 'Fehler bei der Verschlüsselung aufgetreten', - 'sm2.publicKeyRetry': 'Öffentlichen Schlüssel erneut abrufen...', - 'sm2.publicKeyRetryFailed': 'Wiederholter Abruf des öffentlichen Schlüssels fehlgeschlagen', + // SM2 Encryption + 'sm2.publicKeyNotConfigured': 'SM2 öffentlicher Schlüssel nicht konfiguriert, bitte Administrator kontaktieren', + 'sm2.encryptionFailed': 'Passwortverschlüsselung fehlgeschlagen', + 'sm2.keyGenerationFailed': 'Schlüsselpaar-Generierung fehlgeschlagen', + 'sm2.invalidPublicKey': 'Ungültiges öffentliches Schlüsselformat', + 'sm2.encryptionError': 'Fehler bei der Verschlüsselung aufgetreten', + 'sm2.publicKeyRetry': 'Öffentlichen Schlüssel erneut abrufen...', + 'sm2.publicKeyRetryFailed': 'Wiederholter Abruf des öffentlichen Schlüssels fehlgeschlagen', - // Voice Clone and Resource Management - 'voiceClone.title': 'Stimmenklon', - 'voiceResource.title': 'Stimmressourcen', - 'voiceClone.platformName': 'Plattformname', - 'voiceClone.voiceId': 'Stimmen-ID', - 'voiceClone.userId': 'Kontoinhaber', - 'voiceClone.name': 'Stimmname', - 'voiceClone.clone': 'Stimme klonen', - 'voiceClone.action': 'Aktion', - 'voiceClone.modelId': 'Modell-ID', - 'voiceClone.trainStatus': 'Trainingsstatus', - 'voiceClone.trainError': 'Trainingsfehler', - 'voiceClone.createdAt': 'Erstellungszeit', - 'voiceClone.search': 'Suchen', - 'voiceClone.searchPlaceholder': 'Bitte Stimmname oder Stimmen-ID eingeben', - 'voiceClone.addNew': 'Hinzufügen', - 'voiceClone.delete': 'Löschen', - 'voiceClone.selectAll': 'Alle auswählen', - 'voiceClone.deselectAll': 'Alle abwählen', - 'voiceClone.addVoiceClone': 'Stimmressource hinzufügen', - 'voiceClone.confirmDelete': 'Sind Sie sicher, dass Sie die ausgewählten {count} Stimmressourcen löschen möchten?', - 'voiceClone.deleteSuccess': 'Erfolgreich {count} Stimmressourcen gelöscht', - 'voiceClone.deleteFailed': 'Löschen fehlgeschlagen', - 'voiceClone.addSuccess': 'Hinzufügen erfolgreich', - 'voiceClone.addFailed': 'Hinzufügen fehlgeschlagen', - 'voiceClone.updateSuccess': 'Aktualisierung erfolgreich', - 'voiceClone.updateFailed': 'Aktualisierung fehlgeschlagen', - 'voiceClone.selectFirst': 'Bitte wählen Sie zuerst Stimmressourcen zum Löschen aus', - 'voiceClone.operationCancelled': 'Abbrechen', - 'voiceClone.operationClosed': 'Popup geschlossen', - 'voiceClone.cloneSuccess': 'Klonen erfolgreich', - 'voiceClone.cloneFailed': 'Klonen fehlgeschlagen', - 'voiceClone.confirmClone': 'Sind Sie sicher, dass Sie diese Stimme klonen möchten?', - 'voiceClone.onlySuccessCanClone': 'Nur erfolgreich trainierte Stimmen können geklont werden', - 'common.insufficient': 'Unzureichend', - 'voiceClone.platformNameRequired': 'Bitte Plattformname auswählen', - 'voiceClone.voiceIdRequired': 'Bitte Stimmen-ID auswählen', - 'voiceClone.userIdRequired': 'Bitte Kontoinhaber auswählen', - 'voiceClone.platformNamePlaceholder': 'Bitte Plattformname auswählen', - 'voiceClone.voiceIdPlaceholder': 'Bitte Stimmen-ID eingeben und Enter drücken', - 'voiceClone.userIdPlaceholder': 'Bitte Schlüsselwort eingeben, um Kontoinhaber auszuwählen', - 'voiceClone.waitingUpload': 'Wartet auf Upload', - 'voiceClone.waitingTraining': 'Wartet auf Klon', - 'voiceClone.training': 'Training', - 'voiceClone.trainSuccess': 'Training erfolgreich', - 'voiceClone.trainFailed': 'Training fehlgeschlagen', - 'voiceClone.itemsPerPage': '{items} Einträge pro Seite', - 'voiceClone.firstPage': 'Erste Seite', - 'voiceClone.prevPage': 'Vorherige Seite', - 'voiceClone.nextPage': 'Nächste Seite', - 'voiceClone.totalRecords': '{total} Datensätze insgesamt', - 'voiceClone.noVoiceCloneAssigned': 'Ihrem Konto sind keine Stimmressourcen zugewiesen', - 'voiceClone.contactAdmin': 'Bitte kontaktieren Sie Administrator für Stimmressourcenzuweisung', - 'voiceClone.dialogTitle': 'Stimmenklon', - 'voiceClone.stepUpload': 'Audio vorbereiten', - 'voiceClone.stepEdit': 'Audio bearbeiten', - 'voiceClone.dragOrClick': 'Audio-Datei hierher ziehen oder klicken zum Hochladen', - 'voiceClone.uploadTip': 'Unterstützt alle gängigen Audioformate, ausgewählte Dauer muss zwischen 8-60 Sekunden liegen', - 'voiceClone.editTip1': 'Bitte bestätigen Sie, ob das hochgeladene Audio zufriedenstellend ist', - 'voiceClone.editTip2': 'Sie können das Audio anhören und zuschneiden, wenn nicht zufrieden können Sie zurückgehen, um erneut aufzunehmen oder hochzuladen', - 'voiceClone.selectedDuration': 'Ausgewähltes gültiges Segment: {duration} Sekunden', - 'voiceClone.trim': 'Ausgewähltes Segment zuschneiden', - 'voiceClone.reset': 'Zurücksetzen', - 'voiceClone.play': 'Abspielen', - 'voiceClone.pause': 'Pause', - 'voiceClone.stop': 'Stopp', - 'voiceClone.cancel': 'Abbrechen', - 'voiceClone.warning': 'Warnung', - 'voiceClone.ok': 'OK', - 'voiceClone.nextStep': 'Weiter', - 'voiceClone.prevStep': 'Zurück', - 'voiceClone.upload': 'Audio hochladen', - 'voiceClone.pleaseSelectAudio': 'Bitte wählen Sie zuerst eine Audio-Datei aus', - 'voiceClone.durationError': 'Audio-Dauer muss zwischen 8-60 Sekunden liegen', - 'voiceClone.loadAudioFailed': 'Audio konnte nicht geladen werden', - 'voiceClone.trimSuccess': 'Zuschneiden erfolgreich', - 'voiceClone.resetSuccess': 'Zurücksetzen erfolgreich', - 'voiceClone.uploadSuccess': 'Upload erfolgreich', - 'voiceClone.uploadFailed': 'Upload fehlgeschlagen', - 'voiceClone.updateNameSuccess': 'Name erfolgreich aktualisiert', - 'voiceClone.updateNameFailed': 'Name konnte nicht aktualisiert werden', - 'voiceClone.playFailed': 'Abspielen fehlgeschlagen', - 'voiceClone.Details': 'Fehlerdetails', + // Voice Clone and Resource Management + 'voiceClone.title': 'Stimmenklon', + 'voiceResource.title': 'Stimmressourcen', + 'voiceClone.platformName': 'Plattformname', + 'voiceClone.voiceId': 'Stimmen-ID', + 'voiceClone.userId': 'Kontoinhaber', + 'voiceClone.name': 'Stimmname', + 'voiceClone.clone': 'Stimme klonen', + 'voiceClone.action': 'Aktion', + 'voiceClone.modelId': 'Modell-ID', + 'voiceClone.trainStatus': 'Trainingsstatus', + 'voiceClone.trainError': 'Trainingsfehler', + 'voiceClone.createdAt': 'Erstellungszeit', + 'voiceClone.search': 'Suchen', + 'voiceClone.searchPlaceholder': 'Bitte Stimmname oder Stimmen-ID eingeben', + 'voiceClone.addNew': 'Hinzufügen', + 'voiceClone.delete': 'Löschen', + 'voiceClone.selectAll': 'Alle auswählen', + 'voiceClone.deselectAll': 'Alle abwählen', + 'voiceClone.addVoiceClone': 'Stimmressource hinzufügen', + 'voiceClone.confirmDelete': 'Sind Sie sicher, dass Sie die ausgewählten {count} Stimmressourcen löschen möchten?', + 'voiceClone.deleteSuccess': 'Erfolgreich {count} Stimmressourcen gelöscht', + 'voiceClone.deleteFailed': 'Löschen fehlgeschlagen', + 'voiceClone.addSuccess': 'Hinzufügen erfolgreich', + 'voiceClone.addFailed': 'Hinzufügen fehlgeschlagen', + 'voiceClone.updateSuccess': 'Aktualisierung erfolgreich', + 'voiceClone.updateFailed': 'Aktualisierung fehlgeschlagen', + 'voiceClone.selectFirst': 'Bitte wählen Sie zuerst Stimmressourcen zum Löschen aus', + 'voiceClone.operationCancelled': 'Abbrechen', + 'voiceClone.operationClosed': 'Popup geschlossen', + 'voiceClone.cloneSuccess': 'Klonen erfolgreich', + 'voiceClone.cloneFailed': 'Klonen fehlgeschlagen', + 'voiceClone.confirmClone': 'Sind Sie sicher, dass Sie diese Stimme klonen möchten?', + 'voiceClone.onlySuccessCanClone': 'Nur erfolgreich trainierte Stimmen können geklont werden', + 'common.insufficient': 'Unzureichend', + 'voiceClone.platformNameRequired': 'Bitte Plattformname auswählen', + 'voiceClone.voiceIdRequired': 'Bitte Stimmen-ID auswählen', + 'voiceClone.userIdRequired': 'Bitte Kontoinhaber auswählen', + 'voiceClone.platformNamePlaceholder': 'Bitte Plattformname auswählen', + 'voiceClone.voiceIdPlaceholder': 'Bitte Stimmen-ID eingeben und Enter drücken', + 'voiceClone.userIdPlaceholder': 'Bitte Schlüsselwort eingeben, um Kontoinhaber auszuwählen', + 'voiceClone.waitingUpload': 'Wartet auf Upload', + 'voiceClone.waitingTraining': 'Wartet auf Klon', + 'voiceClone.training': 'Training', + 'voiceClone.trainSuccess': 'Training erfolgreich', + 'voiceClone.trainFailed': 'Training fehlgeschlagen', + 'voiceClone.itemsPerPage': '{items} Einträge pro Seite', + 'voiceClone.firstPage': 'Erste Seite', + 'voiceClone.prevPage': 'Vorherige Seite', + 'voiceClone.nextPage': 'Nächste Seite', + 'voiceClone.totalRecords': '{total} Datensätze insgesamt', + 'voiceClone.noVoiceCloneAssigned': 'Ihrem Konto sind keine Stimmressourcen zugewiesen', + 'voiceClone.contactAdmin': 'Bitte kontaktieren Sie Administrator für Stimmressourcenzuweisung', + 'voiceClone.dialogTitle': 'Stimmenklon', + 'voiceClone.stepUpload': 'Audio vorbereiten', + 'voiceClone.stepEdit': 'Audio bearbeiten', + 'voiceClone.dragOrClick': 'Audio-Datei hierher ziehen oder klicken zum Hochladen', + 'voiceClone.uploadTip': 'Unterstützt alle gängigen Audioformate, ausgewählte Dauer muss zwischen 8-60 Sekunden liegen', + 'voiceClone.editTip1': 'Bitte bestätigen Sie, ob das hochgeladene Audio zufriedenstellend ist', + 'voiceClone.editTip2': 'Sie können das Audio anhören und zuschneiden, wenn nicht zufrieden können Sie zurückgehen, um erneut aufzunehmen oder hochzuladen', + 'voiceClone.selectedDuration': 'Ausgewähltes gültiges Segment: {duration} Sekunden', + 'voiceClone.trim': 'Ausgewähltes Segment zuschneiden', + 'voiceClone.reset': 'Zurücksetzen', + 'voiceClone.play': 'Abspielen', + 'voiceClone.pause': 'Pause', + 'voiceClone.stop': 'Stopp', + 'voiceClone.cancel': 'Abbrechen', + 'voiceClone.warning': 'Warnung', + 'voiceClone.ok': 'OK', + 'voiceClone.nextStep': 'Weiter', + 'voiceClone.prevStep': 'Zurück', + 'voiceClone.upload': 'Audio hochladen', + 'voiceClone.pleaseSelectAudio': 'Bitte wählen Sie zuerst eine Audio-Datei aus', + 'voiceClone.durationError': 'Audio-Dauer muss zwischen 8-60 Sekunden liegen', + 'voiceClone.loadAudioFailed': 'Audio konnte nicht geladen werden', + 'voiceClone.trimSuccess': 'Zuschneiden erfolgreich', + 'voiceClone.resetSuccess': 'Zurücksetzen erfolgreich', + 'voiceClone.uploadSuccess': 'Upload erfolgreich', + 'voiceClone.uploadFailed': 'Upload fehlgeschlagen', + 'voiceClone.updateNameSuccess': 'Name erfolgreich aktualisiert', + 'voiceClone.updateNameFailed': 'Name konnte nicht aktualisiert werden', + 'voiceClone.playFailed': 'Abspielen fehlgeschlagen', + 'voiceClone.Details': 'Fehlerdetails', - // Knowledge Base Management page text - 'knowledgeBaseManagement.title': 'Wissensbasis', - 'knowledgeBaseManagement.searchPlaceholder': 'Bitte Wissensbasis-Namen zur Suche eingeben', - 'knowledgeBaseManagement.search': 'Suchen', - 'knowledgeBaseManagement.name': 'Wissensbasis-Name', - 'knowledgeBaseManagement.description': 'Wissensbasis-Beschreibung', - 'knowledgeBaseManagement.documentCount': 'Dokumentenanzahl', - 'knowledgeBaseManagement.status': 'Aktiviert', - 'knowledgeBaseManagement.createdAt': 'Erstellt am', - 'knowledgeBaseManagement.operation': 'Operation', - 'knowledgeBaseManagement.add': 'Hinzufügen', - 'knowledgeBaseManagement.delete': 'Löschen', - 'knowledgeBaseManagement.edit': 'Bearbeiten', - 'knowledgeBaseManagement.itemsPerPage': 'Einträge/Seite', - 'knowledgeBaseManagement.firstPage': 'Erste Seite', - 'knowledgeBaseManagement.prevPage': 'Vorherige Seite', - 'knowledgeBaseManagement.nextPage': 'Nächste Seite', - 'knowledgeBaseManagement.totalRecords': 'Insgesamt {total} Datensätze', - 'knowledgeBaseManagement.addKnowledgeBase': 'Wissensbasis hinzufügen', - 'knowledgeBaseManagement.editKnowledgeBase': 'Wissensbasis bearbeiten', - 'knowledgeBaseManagement.getKnowledgeBaseListFailed': 'Wissensbasis-Liste konnte nicht abgerufen werden', - 'knowledgeBaseManagement.selectKnowledgeBaseFirst': 'Bitte wählen Sie zuerst Wissensbasen zum Löschen aus', - 'knowledgeBaseManagement.confirmBatchDelete': 'Sind Sie sicher, dass Sie die ausgewählten {count} Wissensbasen löschen möchten?', - 'knowledgeBaseManagement.batchDeleteSuccess': 'Erfolgreich {count} Wissensbasen gelöscht', - 'knowledgeBaseManagement.deleteFailed': 'Löschen fehlgeschlagen, bitte versuchen Sie es erneut', - 'knowledgeBaseManagement.operationCancelled': 'Löschvorgang wurde abgebrochen', - 'knowledgeBaseManagement.updateSuccess': 'Aktualisierung erfolgreich', - 'knowledgeBaseManagement.addSuccess': 'Hinzufügen erfolgreich', - 'knowledgeBaseManagement.updateFailed': 'Aktualisierung fehlgeschlagen', - 'knowledgeBaseManagement.addFailed': 'Hinzufügen fehlgeschlagen', - 'knowledgeBaseManagement.selectAll': 'Alle auswählen', - 'knowledgeBaseManagement.cancelSelectAll': 'Alle abwählen', + // Knowledge Base Management page text + 'knowledgeBaseManagement.title': 'Wissensbasis', + 'knowledgeBaseManagement.searchPlaceholder': 'Bitte Wissensbasis-Namen zur Suche eingeben', + 'knowledgeBaseManagement.search': 'Suchen', + 'knowledgeBaseManagement.name': 'Wissensbasis-Name', + 'knowledgeBaseManagement.description': 'Wissensbasis-Beschreibung', + 'knowledgeBaseManagement.documentCount': 'Dokumentenanzahl', + 'knowledgeBaseManagement.status': 'Aktiviert', + 'knowledgeBaseManagement.createdAt': 'Erstellt am', + 'knowledgeBaseManagement.operation': 'Operation', + 'knowledgeBaseManagement.add': 'Hinzufügen', + 'knowledgeBaseManagement.delete': 'Löschen', + 'knowledgeBaseManagement.edit': 'Bearbeiten', + 'knowledgeBaseManagement.itemsPerPage': 'Einträge/Seite', + 'knowledgeBaseManagement.firstPage': 'Erste Seite', + 'knowledgeBaseManagement.prevPage': 'Vorherige Seite', + 'knowledgeBaseManagement.nextPage': 'Nächste Seite', + 'knowledgeBaseManagement.totalRecords': 'Insgesamt {total} Datensätze', + 'knowledgeBaseManagement.addKnowledgeBase': 'Wissensbasis hinzufügen', + 'knowledgeBaseManagement.editKnowledgeBase': 'Wissensbasis bearbeiten', + 'knowledgeBaseManagement.getKnowledgeBaseListFailed': 'Wissensbasis-Liste konnte nicht abgerufen werden', + 'knowledgeBaseManagement.selectKnowledgeBaseFirst': 'Bitte wählen Sie zuerst Wissensbasen zum Löschen aus', + 'knowledgeBaseManagement.confirmBatchDelete': 'Sind Sie sicher, dass Sie die ausgewählten {count} Wissensbasen löschen möchten?', + 'knowledgeBaseManagement.batchDeleteSuccess': 'Erfolgreich {count} Wissensbasen gelöscht', + 'knowledgeBaseManagement.deleteFailed': 'Löschen fehlgeschlagen, bitte versuchen Sie es erneut', + 'knowledgeBaseManagement.operationCancelled': 'Löschvorgang wurde abgebrochen', + 'knowledgeBaseManagement.updateSuccess': 'Aktualisierung erfolgreich', + 'knowledgeBaseManagement.addSuccess': 'Hinzufügen erfolgreich', + 'knowledgeBaseManagement.updateFailed': 'Aktualisierung fehlgeschlagen', + 'knowledgeBaseManagement.addFailed': 'Hinzufügen fehlgeschlagen', + 'knowledgeBaseManagement.selectAll': 'Alle auswählen', + 'knowledgeBaseManagement.cancelSelectAll': 'Alle abwählen', - // Knowledge Base Dialog text - 'knowledgeBaseDialog.title': 'Wissensbasis', - 'knowledgeBaseDialog.name': 'Wissensbasis-Name', - 'knowledgeBaseDialog.namePlaceholder': 'Bitte Wissensbasis-Namen genau eingeben, um die Genauigkeit des Wissensbasis-Aufrufs zu verbessern', - 'knowledgeBaseDialog.description': 'Wissensbasis-Beschreibung', - 'knowledgeBaseDialog.descriptionPlaceholder': 'Bitte Wissensbasis-Beschreibung genau eingeben, um dem Modell zu helfen, den Wissensbasis-Inhalt besser zu verstehen', - 'knowledgeBaseDialog.ragModel': 'RAG-Modell', - 'knowledgeBaseDialog.ragModelPlaceholder': 'Bitte RAG-Modell auswählen', - 'knowledgeBaseDialog.ragModelRequired': 'Bitte RAG-Modell auswählen', - 'knowledgeBaseDialog.loadRAGModelsFailed': 'RAG-Modell-Liste konnte nicht geladen werden', - 'knowledgeBaseDialog.status': 'Status', - 'knowledgeBaseDialog.statusEnabled': 'Aktiviert', - 'knowledgeBaseDialog.statusDisabled': 'Deaktiviert', - 'knowledgeBaseDialog.save': 'Speichern', - 'knowledgeBaseDialog.cancel': 'Abbrechen', - 'knowledgeBaseDialog.confirm': 'Bestätigen', - 'knowledgeBaseDialog.requiredName': 'Bitte Wissensbasis-Namen eingeben', - 'knowledgeBaseDialog.nameRequired': 'Bitte Wissensbasis-Namen eingeben', - 'knowledgeBaseDialog.nameLength': 'Wissensbasis-Name-Länge sollte zwischen 1 und 50 Zeichen liegen', - 'knowledgeBaseDialog.namePattern': 'Wissensbasis-Name darf nur Chinesisch, Englisch, Zahlen, Leerzeichen, Unterstriche und Bindestriche enthalten', - 'knowledgeBaseDialog.descriptionLength': 'Wissensbasis-Beschreibung darf 200 Zeichen nicht überschreiten', - 'knowledgeBaseDialog.nameLengthLimit': 'Wissensbasis-Name darf 50 Zeichen nicht überschreiten', - 'knowledgeBaseDialog.descriptionLengthLimit': 'Wissensbasis-Beschreibung darf 200 Zeichen nicht überschreiten', + // Knowledge Base Dialog text + 'knowledgeBaseDialog.title': 'Wissensbasis', + 'knowledgeBaseDialog.name': 'Wissensbasis-Name', + 'knowledgeBaseDialog.namePlaceholder': 'Bitte Wissensbasis-Namen genau eingeben, um die Genauigkeit des Wissensbasis-Aufrufs zu verbessern', + 'knowledgeBaseDialog.description': 'Wissensbasis-Beschreibung', + 'knowledgeBaseDialog.descriptionPlaceholder': 'Bitte Wissensbasis-Beschreibung genau eingeben, um dem Modell zu helfen, den Wissensbasis-Inhalt besser zu verstehen', + 'knowledgeBaseDialog.ragModel': 'RAG-Modell', + 'knowledgeBaseDialog.ragModelPlaceholder': 'Bitte RAG-Modell auswählen', + 'knowledgeBaseDialog.ragModelRequired': 'Bitte RAG-Modell auswählen', + 'knowledgeBaseDialog.loadRAGModelsFailed': 'RAG-Modell-Liste konnte nicht geladen werden', + 'knowledgeBaseDialog.status': 'Status', + 'knowledgeBaseDialog.statusEnabled': 'Aktiviert', + 'knowledgeBaseDialog.statusDisabled': 'Deaktiviert', + 'knowledgeBaseDialog.save': 'Speichern', + 'knowledgeBaseDialog.cancel': 'Abbrechen', + 'knowledgeBaseDialog.confirm': 'Bestätigen', + 'knowledgeBaseDialog.requiredName': 'Bitte Wissensbasis-Namen eingeben', + 'knowledgeBaseDialog.nameRequired': 'Bitte Wissensbasis-Namen eingeben', + 'knowledgeBaseDialog.nameLength': 'Wissensbasis-Name-Länge sollte zwischen 1 und 50 Zeichen liegen', + 'knowledgeBaseDialog.namePattern': 'Wissensbasis-Name darf nur Chinesisch, Englisch, Zahlen, Leerzeichen, Unterstriche und Bindestriche enthalten', + 'knowledgeBaseDialog.descriptionLength': 'Wissensbasis-Beschreibung darf 200 Zeichen nicht überschreiten', + 'knowledgeBaseDialog.nameLengthLimit': 'Wissensbasis-Name darf 50 Zeichen nicht überschreiten', + 'knowledgeBaseDialog.descriptionLengthLimit': 'Wissensbasis-Beschreibung darf 200 Zeichen nicht überschreiten', - // Knowledge Base Management page new view button text - 'knowledgeBaseManagement.view': 'Dateien verwalten', + // Knowledge Base Management page new view button text + 'knowledgeBaseManagement.view': 'Dateien verwalten', - // Knowledge File Upload page text - 'knowledgeFileUpload.back': 'Zurück', - 'knowledgeFileUpload.searchPlaceholder': 'Bitte Dokumentnamen zur Suche eingeben', - 'knowledgeFileUpload.search': 'Suchen', - 'knowledgeFileUpload.addDocument': 'Dokument hinzufügen', - 'knowledgeFileUpload.documentName': 'Dokumentname', - 'knowledgeFileUpload.uploadTime': 'Upload-Zeit', - 'knowledgeFileUpload.status': 'Status', - 'knowledgeFileUpload.operation': 'Operation', - 'knowledgeFileUpload.parse': 'Parsen', - 'knowledgeFileUpload.viewSlices': 'Segmente anzeigen', - 'knowledgeFileUpload.delete': 'Löschen', - 'knowledgeFileUpload.itemsPerPage': 'Einträge/Seite', - 'knowledgeFileUpload.firstPage': 'Erste Seite', - 'knowledgeFileUpload.prevPage': 'Vorherige Seite', - 'knowledgeFileUpload.nextPage': 'Nächste Seite', - 'knowledgeFileUpload.totalRecords': 'Insgesamt {total} Datensätze', - 'knowledgeFileUpload.uploadDocument': 'Dokument hochladen', - 'knowledgeFileUpload.documentNamePlaceholder': 'Bitte Dokumentnamen eingeben', - 'knowledgeFileUpload.file': 'Datei', - 'knowledgeFileUpload.clickToUpload': 'Zum Hochladen klicken', - 'knowledgeFileUpload.uploadTip': 'Unterstützte Dateitypen: PDF, DOC, DOCX, TXT, MD, CSV, XLS, XLSX, PPT, PPTX. Maximal 32 Dateien pro Upload, jede Dateigröße bis zu 10MB', - 'knowledgeFileUpload.dragOrClick': 'Datei hierher ziehen oder klicken zum Hochladen', - 'knowledgeFileUpload.cancel': 'Abbrechen', - 'knowledgeFileUpload.confirm': 'Bestätigen', - 'knowledgeFileUpload.knowledgeBaseName': 'Wissensbasis-Name', - 'knowledgeFileUpload.statusNotStarted': 'Nicht gestartet', - 'knowledgeFileUpload.statusProcessing': 'Wird verarbeitet', - 'knowledgeFileUpload.statusCancelled': 'Abgebrochen', - 'knowledgeFileUpload.statusCompleted': 'Abgeschlossen', - 'knowledgeFileUpload.statusFailed': 'Fehlgeschlagen', - 'knowledgeFileUpload.uploadSuccess': 'Dokument-Upload erfolgreich', - 'knowledgeFileUpload.uploadFailed': 'Dokument-Upload fehlgeschlagen', - 'knowledgeFileUpload.parseSuccess': 'Dokument-Parsen erfolgreich', - 'knowledgeFileUpload.parseFailed': 'Dokument-Parsen fehlgeschlagen', - 'knowledgeFileUpload.deleteSuccess': 'Dokument-Löschen erfolgreich', - 'knowledgeFileUpload.deleteFailed': 'Dokument-Löschen fehlgeschlagen', - 'knowledgeFileUpload.confirmDelete': 'Sind Sie sicher, dass Sie dieses Dokument löschen möchten?', - 'knowledgeFileUpload.confirmParse': 'Sind Sie sicher, dass Sie dieses Dokument parsen möchten?', - 'knowledgeFileUpload.nameRequired': 'Bitte Dokumentnamen eingeben', - 'knowledgeFileUpload.fileRequired': 'Bitte wählen Sie eine Datei zum Hochladen aus', - 'knowledgeFileUpload.getListFailed': 'Dokumentenliste konnte nicht abgerufen werden', - 'knowledgeFileUpload.parseCancelled': 'Parsen abgebrochen', - 'knowledgeFileUpload.deleteCancelled': 'Löschen abgebrochen', - 'knowledgeFileUpload.selectFilesFirst': 'Bitte wählen Sie zuerst Dateien zum Löschen aus', - 'knowledgeFileUpload.selectAll': 'Alle auswählen', - 'knowledgeFileUpload.deselectAll': 'Alle abwählen', - 'knowledgeFileUpload.batchDelete': 'Löschen', - 'knowledgeFileUpload.confirmBatchDelete': 'Sind Sie sicher, dass Sie die ausgewählten {count} Dateien löschen möchten?', - 'knowledgeFileUpload.batchDeleteSuccess': 'Erfolgreich {count} Dateien gelöscht', - 'knowledgeFileUpload.batchDeleteFailed': 'Massenlöschung fehlgeschlagen', - 'knowledgeFileUpload.sliceCount': 'Segmentanzahl', - 'knowledgeFileUpload.add': 'Hinzufügen', - 'knowledgeFileUpload.retrievalTest': 'Abruftest', - 'knowledgeFileUpload.testQuestion': 'Testfrage', - 'knowledgeFileUpload.testQuestionPlaceholder': 'Bitte geben Sie die zu testende Frage ein', - 'knowledgeFileUpload.executeTest': 'Test ausführen', - 'knowledgeFileUpload.testResult': 'Testergebnis:', - 'knowledgeFileUpload.selectedFiles': 'Ausgewählte Dateien', - 'knowledgeFileUpload.totalSlices': 'Insgesamt {total} Datensätze', - 'knowledgeFileUpload.slice': 'Segment', - 'knowledgeFileUpload.noSliceData': 'Keine Segmentdaten verfügbar', - 'knowledgeFileUpload.firstPage': 'Erste', - 'knowledgeFileUpload.prevPage': 'Vorherige', - 'knowledgeFileUpload.nextPage': 'Nächste', - 'knowledgeFileUpload.totalRecords': 'Insgesamt {total} Datensätze', - 'knowledgeFileUpload.testQuestion': 'Testfrage', - 'knowledgeFileUpload.testQuestionPlaceholder': 'Bitte geben Sie die zu testende Frage ein', - 'knowledgeFileUpload.runTest': 'Test ausführen', - 'knowledgeFileUpload.testResult': 'Testergebnis:', - 'knowledgeFileUpload.noRelatedSlices': 'Keine verwandten Segmente gefunden', - 'knowledgeFileUpload.comprehensiveSimilarity': 'Umfassende Ähnlichkeit', - 'knowledgeFileUpload.content': 'Inhalt:', - 'knowledgeFileUpload.testQuestionRequired': 'Bitte Testfrage eingeben', - 'knowledgeBaseDialog.descriptionRequired': 'Bitte Wissensbasis-Beschreibung eingeben', + // Knowledge File Upload page text + 'knowledgeFileUpload.back': 'Zurück', + 'knowledgeFileUpload.searchPlaceholder': 'Bitte Dokumentnamen zur Suche eingeben', + 'knowledgeFileUpload.search': 'Suchen', + 'knowledgeFileUpload.addDocument': 'Dokument hinzufügen', + 'knowledgeFileUpload.documentName': 'Dokumentname', + 'knowledgeFileUpload.uploadTime': 'Upload-Zeit', + 'knowledgeFileUpload.status': 'Status', + 'knowledgeFileUpload.operation': 'Operation', + 'knowledgeFileUpload.parse': 'Parsen', + 'knowledgeFileUpload.viewSlices': 'Segmente anzeigen', + 'knowledgeFileUpload.delete': 'Löschen', + 'knowledgeFileUpload.itemsPerPage': 'Einträge/Seite', + 'knowledgeFileUpload.firstPage': 'Erste Seite', + 'knowledgeFileUpload.prevPage': 'Vorherige Seite', + 'knowledgeFileUpload.nextPage': 'Nächste Seite', + 'knowledgeFileUpload.totalRecords': 'Insgesamt {total} Datensätze', + 'knowledgeFileUpload.uploadDocument': 'Dokument hochladen', + 'knowledgeFileUpload.documentNamePlaceholder': 'Bitte Dokumentnamen eingeben', + 'knowledgeFileUpload.file': 'Datei', + 'knowledgeFileUpload.clickToUpload': 'Zum Hochladen klicken', + 'knowledgeFileUpload.uploadTip': 'Unterstützte Dateitypen: PDF, DOC, DOCX, TXT, MD, CSV, XLS, XLSX, PPT, PPTX. Maximal 32 Dateien pro Upload, jede Dateigröße bis zu 10MB', + 'knowledgeFileUpload.dragOrClick': 'Datei hierher ziehen oder klicken zum Hochladen', + 'knowledgeFileUpload.cancel': 'Abbrechen', + 'knowledgeFileUpload.confirm': 'Bestätigen', + 'knowledgeFileUpload.knowledgeBaseName': 'Wissensbasis-Name', + 'knowledgeFileUpload.statusNotStarted': 'Nicht gestartet', + 'knowledgeFileUpload.statusProcessing': 'Wird verarbeitet', + 'knowledgeFileUpload.statusCancelled': 'Abgebrochen', + 'knowledgeFileUpload.statusCompleted': 'Abgeschlossen', + 'knowledgeFileUpload.statusFailed': 'Fehlgeschlagen', + 'knowledgeFileUpload.uploadSuccess': 'Dokument-Upload erfolgreich', + 'knowledgeFileUpload.uploadFailed': 'Dokument-Upload fehlgeschlagen', + 'knowledgeFileUpload.parseSuccess': 'Dokument-Parsen erfolgreich', + 'knowledgeFileUpload.parseFailed': 'Dokument-Parsen fehlgeschlagen', + 'knowledgeFileUpload.deleteSuccess': 'Dokument-Löschen erfolgreich', + 'knowledgeFileUpload.deleteFailed': 'Dokument-Löschen fehlgeschlagen', + 'knowledgeFileUpload.confirmDelete': 'Sind Sie sicher, dass Sie dieses Dokument löschen möchten?', + 'knowledgeFileUpload.confirmParse': 'Sind Sie sicher, dass Sie dieses Dokument parsen möchten?', + 'knowledgeFileUpload.nameRequired': 'Bitte Dokumentnamen eingeben', + 'knowledgeFileUpload.fileRequired': 'Bitte wählen Sie eine Datei zum Hochladen aus', + 'knowledgeFileUpload.getListFailed': 'Dokumentenliste konnte nicht abgerufen werden', + 'knowledgeFileUpload.parseCancelled': 'Parsen abgebrochen', + 'knowledgeFileUpload.deleteCancelled': 'Löschen abgebrochen', + 'knowledgeFileUpload.selectFilesFirst': 'Bitte wählen Sie zuerst Dateien zum Löschen aus', + 'knowledgeFileUpload.selectAll': 'Alle auswählen', + 'knowledgeFileUpload.deselectAll': 'Alle abwählen', + 'knowledgeFileUpload.batchDelete': 'Löschen', + 'knowledgeFileUpload.confirmBatchDelete': 'Sind Sie sicher, dass Sie die ausgewählten {count} Dateien löschen möchten?', + 'knowledgeFileUpload.batchDeleteSuccess': 'Erfolgreich {count} Dateien gelöscht', + 'knowledgeFileUpload.batchDeleteFailed': 'Massenlöschung fehlgeschlagen', + 'knowledgeFileUpload.sliceCount': 'Segmentanzahl', + 'knowledgeFileUpload.add': 'Hinzufügen', + 'knowledgeFileUpload.retrievalTest': 'Abruftest', + 'knowledgeFileUpload.testQuestion': 'Testfrage', + 'knowledgeFileUpload.testQuestionPlaceholder': 'Bitte geben Sie die zu testende Frage ein', + 'knowledgeFileUpload.executeTest': 'Test ausführen', + 'knowledgeFileUpload.testResult': 'Testergebnis:', + 'knowledgeFileUpload.selectedFiles': 'Ausgewählte Dateien', + 'knowledgeFileUpload.totalSlices': 'Insgesamt {total} Datensätze', + 'knowledgeFileUpload.slice': 'Segment', + 'knowledgeFileUpload.noSliceData': 'Keine Segmentdaten verfügbar', + 'knowledgeFileUpload.firstPage': 'Erste', + 'knowledgeFileUpload.prevPage': 'Vorherige', + 'knowledgeFileUpload.nextPage': 'Nächste', + 'knowledgeFileUpload.totalRecords': 'Insgesamt {total} Datensätze', + 'knowledgeFileUpload.testQuestion': 'Testfrage', + 'knowledgeFileUpload.testQuestionPlaceholder': 'Bitte geben Sie die zu testende Frage ein', + 'knowledgeFileUpload.runTest': 'Test ausführen', + 'knowledgeFileUpload.testResult': 'Testergebnis:', + 'knowledgeFileUpload.noRelatedSlices': 'Keine verwandten Segmente gefunden', + 'knowledgeFileUpload.comprehensiveSimilarity': 'Umfassende Ähnlichkeit', + 'knowledgeFileUpload.content': 'Inhalt:', + 'knowledgeFileUpload.testQuestionRequired': 'Bitte Testfrage eingeben', + 'knowledgeBaseDialog.descriptionRequired': 'Bitte Wissensbasis-Beschreibung eingeben', } \ No newline at end of file diff --git a/main/manager-web/src/i18n/en.js b/main/manager-web/src/i18n/en.js index e9b9f74d..1253d1fe 100644 --- a/main/manager-web/src/i18n/en.js +++ b/main/manager-web/src/i18n/en.js @@ -849,6 +849,7 @@ export default { 'modelConfigDialog.setDefault': 'Set as Default', 'modelConfigDialog.modelId': 'Model ID', 'modelConfigDialog.enterModelId': 'If not filled in, it will be generated automatically', + 'modelConfigDialog.invalidModelId': 'Model ID cannot be pure text or spaces, please use letters, numbers, underscores, or hyphens', 'modelConfigDialog.modelName': 'Model Name', 'modelConfigDialog.enterModelName': 'Please enter model name', 'modelConfigDialog.modelCode': 'Model Code', diff --git a/main/manager-web/src/i18n/vi.js b/main/manager-web/src/i18n/vi.js index 75fb2ede..487a342c 100644 --- a/main/manager-web/src/i18n/vi.js +++ b/main/manager-web/src/i18n/vi.js @@ -1,1264 +1,1265 @@ export default { - // Login page related prompt text - 'login.requiredUsername': 'Tên đăng nhập không được để trống', - 'login.requiredPassword': 'Mật khẩu không được để trống', - 'login.requiredCaptcha': 'Mã xác minh không được để trống', - 'login.requiredMobile': 'Vui lòng nhập số điện thoại di động hợp lệ', - 'login.loginSuccess': 'Đăng nhập thành công!', + // Login page related prompt text + 'login.requiredUsername': 'Tên đăng nhập không được để trống', + 'login.requiredPassword': 'Mật khẩu không được để trống', + 'login.requiredCaptcha': 'Mã xác minh không được để trống', + 'login.requiredMobile': 'Vui lòng nhập số điện thoại di động hợp lệ', + 'login.loginSuccess': 'Đăng nhập thành công!', - // HeaderBar component text - 'header.smartManagement': 'Tác nhân AI', - 'header.modelConfig': 'Mô hình', - 'header.knowledgeBase': 'Kiến thức', - 'header.voiceCloneManagement': 'NBAS', - 'header.voiceResourceManagement': 'Tài nguyên giọng nói', - 'header.userManagement': 'Người dùng', - 'header.otaManagement': 'Quản lý OTA', - 'header.paramDictionary': 'Khác', - 'header.paramManagement': 'Quản lý tham số', - 'header.dictManagement': 'Quản lý từ điển', - 'header.agentTemplate': 'Mẫu vai trò mặc định', - 'header.searchHistory': 'Lịch sử tìm kiếm', - 'header.clearHistory': 'Xóa lịch sử', - 'header.providerManagement': 'Quản lý nhà cung cấp', - 'header.serverSideManagement': 'Quản lý máy chủ', - 'header.changePassword': 'Đổi mật khẩu', - 'header.logout': 'Đăng xuất', - 'header.searchPlaceholder': 'Tìm kiếm theo tên..', + // HeaderBar component text + 'header.smartManagement': 'Tác nhân AI', + 'header.modelConfig': 'Mô hình', + 'header.knowledgeBase': 'Kiến thức', + 'header.voiceCloneManagement': 'NBAS', + 'header.voiceResourceManagement': 'Tài nguyên giọng nói', + 'header.userManagement': 'Người dùng', + 'header.otaManagement': 'Quản lý OTA', + 'header.paramDictionary': 'Khác', + 'header.paramManagement': 'Quản lý tham số', + 'header.dictManagement': 'Quản lý từ điển', + 'header.agentTemplate': 'Mẫu vai trò mặc định', + 'header.searchHistory': 'Lịch sử tìm kiếm', + 'header.clearHistory': 'Xóa lịch sử', + 'header.providerManagement': 'Quản lý nhà cung cấp', + 'header.serverSideManagement': 'Quản lý máy chủ', + 'header.changePassword': 'Đổi mật khẩu', + 'header.logout': 'Đăng xuất', + 'header.searchPlaceholder': 'Tìm kiếm theo tên..', - // McpToolCallDialog component text - 'mcpToolCall.title': 'Gọi công cụ', - 'mcpToolCall.execute': 'Thực thi', - 'mcpToolCall.chooseFunction': '1、Chọn chức năng', - 'mcpToolCall.searchFunction': 'Tìm kiếm chức năng', - 'mcpToolCall.noResults': 'Không tìm thấy chức năng phù hợp', - 'mcpToolCall.settings': '2、Cài đặt tham số', - 'mcpToolCall.inputPlaceholder': 'Vui lòng nhập {label}', - 'mcpToolCall.valueRange': 'Phạm vi giá trị: {min} - {max}', - 'mcpToolCall.selectPlaceholder': 'Vui lòng chọn {label}', - 'mcpToolCall.lightTheme': 'Chủ đề sáng', - 'mcpToolCall.darkTheme': 'Chủ đề tối', - 'mcpToolCall.pleaseSelect': 'Vui lòng chọn một chức năng', - 'mcpToolCall.cancel': 'Hủy bỏ', - 'mcpToolCall.requiredField': 'Vui lòng nhập {field}', - 'mcpToolCall.minValue': 'Giá trị tối thiểu là {value}', - 'mcpToolCall.maxValue': 'Giá trị tối đa là {value}', - 'mcpToolCall.selectTool': 'Vui lòng chọn một công cụ để thực thi', - 'mcpToolCall.executionResult': '3、Kết quả thực thi', - 'mcpToolCall.copyResult': 'Sao chép kết quả', - 'mcpToolCall.noResultYet': 'Chưa có kết quả', - 'mcpToolCall.loadingToolList': 'Đang tải danh sách công cụ...', + // McpToolCallDialog component text + 'mcpToolCall.title': 'Gọi công cụ', + 'mcpToolCall.execute': 'Thực thi', + 'mcpToolCall.chooseFunction': '1、Chọn chức năng', + 'mcpToolCall.searchFunction': 'Tìm kiếm chức năng', + 'mcpToolCall.noResults': 'Không tìm thấy chức năng phù hợp', + 'mcpToolCall.settings': '2、Cài đặt tham số', + 'mcpToolCall.inputPlaceholder': 'Vui lòng nhập {label}', + 'mcpToolCall.valueRange': 'Phạm vi giá trị: {min} - {max}', + 'mcpToolCall.selectPlaceholder': 'Vui lòng chọn {label}', + 'mcpToolCall.lightTheme': 'Chủ đề sáng', + 'mcpToolCall.darkTheme': 'Chủ đề tối', + 'mcpToolCall.pleaseSelect': 'Vui lòng chọn một chức năng', + 'mcpToolCall.cancel': 'Hủy bỏ', + 'mcpToolCall.requiredField': 'Vui lòng nhập {field}', + 'mcpToolCall.minValue': 'Giá trị tối thiểu là {value}', + 'mcpToolCall.maxValue': 'Giá trị tối đa là {value}', + 'mcpToolCall.selectTool': 'Vui lòng chọn một công cụ để thực thi', + 'mcpToolCall.executionResult': '3、Kết quả thực thi', + 'mcpToolCall.copyResult': 'Sao chép kết quả', + 'mcpToolCall.noResultYet': 'Chưa có kết quả', + 'mcpToolCall.loadingToolList': 'Đang tải danh sách công cụ...', - // Tool names - 'mcpToolCall.toolName.getDeviceStatus': 'Xem trạng thái thiết bị', - 'mcpToolCall.toolName.setVolume': 'Đặt âm lượng', - 'mcpToolCall.toolName.setBrightness': 'Đặt độ sáng', - 'mcpToolCall.toolName.setTheme': 'Đặt chủ đề', - 'mcpToolCall.toolName.takePhoto': 'Chụp ảnh & Nhận dạng', - 'mcpToolCall.toolName.getSystemInfo': 'Thông tin hệ thống', - 'mcpToolCall.toolName.reboot': 'Khởi động lại thiết bị', - 'mcpToolCall.toolName.upgradeFirmware': 'Nâng cấp firmware', - 'mcpToolCall.toolName.getScreenInfo': 'Thông tin màn hình', - 'mcpToolCall.toolName.snapshot': 'Ảnh chụp màn hình', - 'mcpToolCall.toolName.previewImage': 'Xem trước hình ảnh', - 'mcpToolCall.toolName.setDownloadUrl': 'Đặt URL tải xuống', + // Tool names + 'mcpToolCall.toolName.getDeviceStatus': 'Xem trạng thái thiết bị', + 'mcpToolCall.toolName.setVolume': 'Đặt âm lượng', + 'mcpToolCall.toolName.setBrightness': 'Đặt độ sáng', + 'mcpToolCall.toolName.setTheme': 'Đặt chủ đề', + 'mcpToolCall.toolName.takePhoto': 'Chụp ảnh & Nhận dạng', + 'mcpToolCall.toolName.getSystemInfo': 'Thông tin hệ thống', + 'mcpToolCall.toolName.reboot': 'Khởi động lại thiết bị', + 'mcpToolCall.toolName.upgradeFirmware': 'Nâng cấp firmware', + 'mcpToolCall.toolName.getScreenInfo': 'Thông tin màn hình', + 'mcpToolCall.toolName.snapshot': 'Ảnh chụp màn hình', + 'mcpToolCall.toolName.previewImage': 'Xem trước hình ảnh', + 'mcpToolCall.toolName.setDownloadUrl': 'Đặt URL tải xuống', - // Tool categories - 'mcpToolCall.category.audio': 'Âm thanh', - 'mcpToolCall.category.display': 'Hiển thị', - 'mcpToolCall.category.camera': 'Máy ảnh', - 'mcpToolCall.category.system': 'Hệ thống', - 'mcpToolCall.category.assets': 'Tài sản', - 'mcpToolCall.category.deviceInfo': 'Thông tin thiết bị', + // Tool categories + 'mcpToolCall.category.audio': 'Âm thanh', + 'mcpToolCall.category.display': 'Hiển thị', + 'mcpToolCall.category.camera': 'Máy ảnh', + 'mcpToolCall.category.system': 'Hệ thống', + 'mcpToolCall.category.assets': 'Tài sản', + 'mcpToolCall.category.deviceInfo': 'Thông tin thiết bị', - // Table categories and properties - 'mcpToolCall.table.audioSpeaker': 'Loa âm thanh', - 'mcpToolCall.table.screen': 'Màn hình', - 'mcpToolCall.table.network': 'Mạng', - 'mcpToolCall.table.audioControl': 'Điều khiển âm thanh', - 'mcpToolCall.table.screenControl': 'Điều khiển màn hình', - 'mcpToolCall.table.systemControl': 'Điều khiển hệ thống', - 'mcpToolCall.table.screenInfo': 'Thông tin màn hình', - 'mcpToolCall.table.hardwareInfo': 'Thông tin phần cứng', - 'mcpToolCall.table.memoryInfo': 'Thông tin bộ nhớ', - 'mcpToolCall.table.applicationInfo': 'Thông tin ứng dụng', - 'mcpToolCall.table.networkInfo': 'Thông tin mạng', - 'mcpToolCall.table.displayInfo': 'Thông tin hiển thị', - 'mcpToolCall.table.deviceInfo': 'Thông tin thiết bị', - 'mcpToolCall.table.systemInfo': 'Thông tin hệ thống', - // Table column headers - 'mcpToolCall.table.component': 'Thành phần', - 'mcpToolCall.table.property': 'Thuộc tính', - 'mcpToolCall.table.value': 'Giá trị', + // Table categories and properties + 'mcpToolCall.table.audioSpeaker': 'Loa âm thanh', + 'mcpToolCall.table.screen': 'Màn hình', + 'mcpToolCall.table.network': 'Mạng', + 'mcpToolCall.table.audioControl': 'Điều khiển âm thanh', + 'mcpToolCall.table.screenControl': 'Điều khiển màn hình', + 'mcpToolCall.table.systemControl': 'Điều khiển hệ thống', + 'mcpToolCall.table.screenInfo': 'Thông tin màn hình', + 'mcpToolCall.table.hardwareInfo': 'Thông tin phần cứng', + 'mcpToolCall.table.memoryInfo': 'Thông tin bộ nhớ', + 'mcpToolCall.table.applicationInfo': 'Thông tin ứng dụng', + 'mcpToolCall.table.networkInfo': 'Thông tin mạng', + 'mcpToolCall.table.displayInfo': 'Thông tin hiển thị', + 'mcpToolCall.table.deviceInfo': 'Thông tin thiết bị', + 'mcpToolCall.table.systemInfo': 'Thông tin hệ thống', + // Table column headers + 'mcpToolCall.table.component': 'Thành phần', + 'mcpToolCall.table.property': 'Thuộc tính', + 'mcpToolCall.table.value': 'Giá trị', - 'mcpToolCall.prop.volume': 'Âm lượng', - 'mcpToolCall.prop.brightness': 'Độ sáng', - 'mcpToolCall.prop.theme': 'Chủ đề', - 'mcpToolCall.prop.type': 'Loại', - 'mcpToolCall.prop.ssid': 'SSID', - 'mcpToolCall.prop.signalStrength': 'Cường độ tín hiệu', - 'mcpToolCall.prop.operationResult': 'Kết quả thao tác', - 'mcpToolCall.prop.width': 'Chiều rộng', - 'mcpToolCall.prop.height': 'Chiều cao', - 'mcpToolCall.prop.screenType': 'Loại', - 'mcpToolCall.prop.chipModel': 'Model chip', - 'mcpToolCall.prop.cpuCores': 'Số lõi CPU', - 'mcpToolCall.prop.chipVersion': 'Phiên bản chip', - 'mcpToolCall.prop.flashSize': 'Kích thước Flash', - 'mcpToolCall.prop.minFreeHeap': 'Heap trống tối thiểu', - 'mcpToolCall.prop.applicationName': 'Tên ứng dụng', - 'mcpToolCall.prop.applicationVersion': 'Phiên bản ứng dụng', - 'mcpToolCall.prop.compileTime': 'Thời gian biên dịch', - 'mcpToolCall.prop.idfVersion': 'Phiên bản IDF', - 'mcpToolCall.prop.macAddress': 'Địa chỉ MAC', - 'mcpToolCall.prop.ipAddress': 'Địa chỉ IP', - 'mcpToolCall.prop.wifiName': 'Tên WiFi', - 'mcpToolCall.prop.wifiChannel': 'Kênh WiFi', - 'mcpToolCall.prop.screenSize': 'Kích thước màn hình', - 'mcpToolCall.prop.deviceUuid': 'UUID thiết bị', - 'mcpToolCall.prop.systemLanguage': 'Ngôn ngữ hệ thống', - 'mcpToolCall.prop.currentOtaPartition': 'Phân vùng OTA hiện tại', - 'mcpToolCall.prop.getResult': 'Lấy kết quả', - 'mcpToolCall.prop.url': 'URL', - 'mcpToolCall.prop.quality': 'Chất lượng', - 'mcpToolCall.prop.question': 'Câu hỏi', + 'mcpToolCall.prop.volume': 'Âm lượng', + 'mcpToolCall.prop.brightness': 'Độ sáng', + 'mcpToolCall.prop.theme': 'Chủ đề', + 'mcpToolCall.prop.type': 'Loại', + 'mcpToolCall.prop.ssid': 'SSID', + 'mcpToolCall.prop.signalStrength': 'Cường độ tín hiệu', + 'mcpToolCall.prop.operationResult': 'Kết quả thao tác', + 'mcpToolCall.prop.width': 'Chiều rộng', + 'mcpToolCall.prop.height': 'Chiều cao', + 'mcpToolCall.prop.screenType': 'Loại', + 'mcpToolCall.prop.chipModel': 'Model chip', + 'mcpToolCall.prop.cpuCores': 'Số lõi CPU', + 'mcpToolCall.prop.chipVersion': 'Phiên bản chip', + 'mcpToolCall.prop.flashSize': 'Kích thước Flash', + 'mcpToolCall.prop.minFreeHeap': 'Heap trống tối thiểu', + 'mcpToolCall.prop.applicationName': 'Tên ứng dụng', + 'mcpToolCall.prop.applicationVersion': 'Phiên bản ứng dụng', + 'mcpToolCall.prop.compileTime': 'Thời gian biên dịch', + 'mcpToolCall.prop.idfVersion': 'Phiên bản IDF', + 'mcpToolCall.prop.macAddress': 'Địa chỉ MAC', + 'mcpToolCall.prop.ipAddress': 'Địa chỉ IP', + 'mcpToolCall.prop.wifiName': 'Tên WiFi', + 'mcpToolCall.prop.wifiChannel': 'Kênh WiFi', + 'mcpToolCall.prop.screenSize': 'Kích thước màn hình', + 'mcpToolCall.prop.deviceUuid': 'UUID thiết bị', + 'mcpToolCall.prop.systemLanguage': 'Ngôn ngữ hệ thống', + 'mcpToolCall.prop.currentOtaPartition': 'Phân vùng OTA hiện tại', + 'mcpToolCall.prop.getResult': 'Lấy kết quả', + 'mcpToolCall.prop.url': 'URL', + 'mcpToolCall.prop.quality': 'Chất lượng', + 'mcpToolCall.prop.question': 'Câu hỏi', - // Tool help texts - 'mcpToolCall.help.getDeviceStatus': 'Xem trạng thái hoạt động hiện tại của thiết bị, bao gồm âm lượng, màn hình, pin và các thông tin khác.', - 'mcpToolCall.help.setVolume': 'Điều chỉnh âm lượng của thiết bị, vui lòng nhập giá trị từ 0-100.', - 'mcpToolCall.help.setBrightness': 'Điều chỉnh độ sáng màn hình thiết bị, vui lòng nhập giá trị từ 0-100.', - 'mcpToolCall.help.setTheme': 'Chuyển đổi chủ đề hiển thị của màn hình thiết bị, bạn có thể chọn chế độ sáng hoặc tối.', - 'mcpToolCall.help.takePhoto': 'Chụp ảnh bằng camera thiết bị và thực hiện phân tích nhận dạng, vui lòng nhập câu hỏi bạn muốn hỏi.', - 'mcpToolCall.help.getSystemInfo': 'Lấy thông tin hệ thống của thiết bị, bao gồm thông số kỹ thuật phần cứng, phiên bản phần mềm, v.v.', - 'mcpToolCall.help.reboot': 'Khởi động lại thiết bị, thiết bị sẽ khởi động lại sau khi thực thi.', - 'mcpToolCall.help.upgradeFirmware': 'Tải xuống và nâng cấp firmware thiết bị từ URL được chỉ định, thiết bị sẽ tự động khởi động lại sau khi nâng cấp.', - 'mcpToolCall.help.getScreenInfo': 'Lấy thông tin chi tiết về màn hình, như độ phân giải, kích thước và các thông số khác.', - 'mcpToolCall.help.snapshot': 'Chụp ảnh màn hình hiện tại và tải lên URL được chỉ định.', - 'mcpToolCall.help.previewImage': 'Xem trước hình ảnh từ URL được chỉ định trên màn hình thiết bị.', - 'mcpToolCall.help.setDownloadUrl': 'Đặt địa chỉ tải xuống cho các tệp tài nguyên thiết bị.', + // Tool help texts + 'mcpToolCall.help.getDeviceStatus': 'Xem trạng thái hoạt động hiện tại của thiết bị, bao gồm âm lượng, màn hình, pin và các thông tin khác.', + 'mcpToolCall.help.setVolume': 'Điều chỉnh âm lượng của thiết bị, vui lòng nhập giá trị từ 0-100.', + 'mcpToolCall.help.setBrightness': 'Điều chỉnh độ sáng màn hình thiết bị, vui lòng nhập giá trị từ 0-100.', + 'mcpToolCall.help.setTheme': 'Chuyển đổi chủ đề hiển thị của màn hình thiết bị, bạn có thể chọn chế độ sáng hoặc tối.', + 'mcpToolCall.help.takePhoto': 'Chụp ảnh bằng camera thiết bị và thực hiện phân tích nhận dạng, vui lòng nhập câu hỏi bạn muốn hỏi.', + 'mcpToolCall.help.getSystemInfo': 'Lấy thông tin hệ thống của thiết bị, bao gồm thông số kỹ thuật phần cứng, phiên bản phần mềm, v.v.', + 'mcpToolCall.help.reboot': 'Khởi động lại thiết bị, thiết bị sẽ khởi động lại sau khi thực thi.', + 'mcpToolCall.help.upgradeFirmware': 'Tải xuống và nâng cấp firmware thiết bị từ URL được chỉ định, thiết bị sẽ tự động khởi động lại sau khi nâng cấp.', + 'mcpToolCall.help.getScreenInfo': 'Lấy thông tin chi tiết về màn hình, như độ phân giải, kích thước và các thông số khác.', + 'mcpToolCall.help.snapshot': 'Chụp ảnh màn hình hiện tại và tải lên URL được chỉ định.', + 'mcpToolCall.help.previewImage': 'Xem trước hình ảnh từ URL được chỉ định trên màn hình thiết bị.', + 'mcpToolCall.help.setDownloadUrl': 'Đặt địa chỉ tải xuống cho các tệp tài nguyên thiết bị.', - // Other text - 'mcpToolCall.text.strong': 'Mạnh', - 'mcpToolCall.text.medium': 'Trung bình', - 'mcpToolCall.text.weak': 'Yếu', - 'mcpToolCall.text.dark': 'Tối', - 'mcpToolCall.text.light': 'Sáng', - 'mcpToolCall.text.setSuccess': 'Cài đặt thành công', - 'mcpToolCall.text.setFailed': 'Cài đặt thất bại', - 'mcpToolCall.text.brightnessSetSuccess': 'Cài đặt độ sáng thành công', - 'mcpToolCall.text.brightnessSetFailed': 'Cài đặt độ sáng thất bại', - 'mcpToolCall.text.themeSetSuccess': 'Cài đặt chủ đề thành công', - 'mcpToolCall.text.themeSetFailed': 'Cài đặt chủ đề thất bại', - 'mcpToolCall.text.rebootCommandSent': 'Đã gửi lệnh khởi động lại', - 'mcpToolCall.text.rebootFailed': 'Khởi động lại thất bại', - 'mcpToolCall.text.monochrome': 'Màn hình đơn sắc', - 'mcpToolCall.text.color': 'Màn hình màu', - 'mcpToolCall.text.getSuccessParseFailed': 'Lấy thành công, nhưng phân tích thất bại', - 'mcpToolCall.text.getFailed': 'Lấy thất bại', - 'mcpToolCall.text.getSuccessFormatError': 'Lấy thành công, nhưng định dạng dữ liệu bất thường', + // Other text + 'mcpToolCall.text.strong': 'Mạnh', + 'mcpToolCall.text.medium': 'Trung bình', + 'mcpToolCall.text.weak': 'Yếu', + 'mcpToolCall.text.dark': 'Tối', + 'mcpToolCall.text.light': 'Sáng', + 'mcpToolCall.text.setSuccess': 'Cài đặt thành công', + 'mcpToolCall.text.setFailed': 'Cài đặt thất bại', + 'mcpToolCall.text.brightnessSetSuccess': 'Cài đặt độ sáng thành công', + 'mcpToolCall.text.brightnessSetFailed': 'Cài đặt độ sáng thất bại', + 'mcpToolCall.text.themeSetSuccess': 'Cài đặt chủ đề thành công', + 'mcpToolCall.text.themeSetFailed': 'Cài đặt chủ đề thất bại', + 'mcpToolCall.text.rebootCommandSent': 'Đã gửi lệnh khởi động lại', + 'mcpToolCall.text.rebootFailed': 'Khởi động lại thất bại', + 'mcpToolCall.text.monochrome': 'Màn hình đơn sắc', + 'mcpToolCall.text.color': 'Màn hình màu', + 'mcpToolCall.text.getSuccessParseFailed': 'Lấy thành công, nhưng phân tích thất bại', + 'mcpToolCall.text.getFailed': 'Lấy thất bại', + 'mcpToolCall.text.getSuccessFormatError': 'Lấy thành công, nhưng định dạng dữ liệu bất thường', - // Dictionary data dialog related - 'dictDataDialog.addDictData': 'Thêm dữ liệu từ điển', - 'dictDataDialog.dictLabel': 'Nhãn từ điển', - 'dictDataDialog.dictLabelPlaceholder': 'Vui lòng nhập nhãn từ điển', - 'dictDataDialog.dictValue': 'Giá trị từ điển', - 'dictDataDialog.dictValuePlaceholder': 'Vui lòng nhập giá trị từ điển', - 'dictDataDialog.sort': 'Sắp xếp', - 'dictDataDialog.requiredDictLabel': 'Vui lòng nhập nhãn từ điển', - 'dictDataDialog.requiredDictValue': 'Vui lòng nhập giá trị từ điển', + // Dictionary data dialog related + 'dictDataDialog.addDictData': 'Thêm dữ liệu từ điển', + 'dictDataDialog.dictLabel': 'Nhãn từ điển', + 'dictDataDialog.dictLabelPlaceholder': 'Vui lòng nhập nhãn từ điển', + 'dictDataDialog.dictValue': 'Giá trị từ điển', + 'dictDataDialog.dictValuePlaceholder': 'Vui lòng nhập giá trị từ điển', + 'dictDataDialog.sort': 'Sắp xếp', + 'dictDataDialog.requiredDictLabel': 'Vui lòng nhập nhãn từ điển', + 'dictDataDialog.requiredDictValue': 'Vui lòng nhập giá trị từ điển', - // Dictionary type dialog related - 'dictTypeDialog.addDictType': 'Thêm loại từ điển', - 'dictTypeDialog.dictName': 'Tên loại từ điển', - 'dictTypeDialog.dictNamePlaceholder': 'Vui lòng nhập tên loại từ điển', - 'dictTypeDialog.dictType': 'Mã loại từ điển', - 'dictTypeDialog.dictTypePlaceholder': 'Vui lòng nhập mã loại từ điển', - 'dictTypeDialog.requiredDictName': 'Vui lòng nhập tên loại từ điển', - 'dictTypeDialog.requiredDictType': 'Vui lòng nhập mã loại từ điển', + // Dictionary type dialog related + 'dictTypeDialog.addDictType': 'Thêm loại từ điển', + 'dictTypeDialog.dictName': 'Tên loại từ điển', + 'dictTypeDialog.dictNamePlaceholder': 'Vui lòng nhập tên loại từ điển', + 'dictTypeDialog.dictType': 'Mã loại từ điển', + 'dictTypeDialog.dictTypePlaceholder': 'Vui lòng nhập mã loại từ điển', + 'dictTypeDialog.requiredDictName': 'Vui lòng nhập tên loại từ điển', + 'dictTypeDialog.requiredDictType': 'Vui lòng nhập mã loại từ điển', - // Audio edit dialog related - 'editVoiceDialog.voiceCode': 'Mã giọng nói', - 'editVoiceDialog.voiceCodePlaceholder': 'Vui lòng nhập mã giọng nói', - 'editVoiceDialog.voiceName': 'Tên giọng nói', - 'editVoiceDialog.voiceNamePlaceholder': 'Vui lòng nhập tên giọng nói', - 'editVoiceDialog.languageType': 'Loại ngôn ngữ', - 'editVoiceDialog.languageTypePlaceholder': 'Vui lòng nhập loại ngôn ngữ', - 'editVoiceDialog.sortNumber': 'Số thứ tự', - 'editVoiceDialog.remark': 'Ghi chú', - 'editVoiceDialog.remarkPlaceholder': 'Vui lòng nhập nội dung ghi chú', - 'editVoiceDialog.generatePreview': 'Tạo xem trước', - 'editVoiceDialog.defaultVoiceName': 'Wawa Xiaohe', - 'editVoiceDialog.defaultLanguageType': 'Tiếng Trung', - 'editVoiceDialog.requiredVoiceCode': 'Vui lòng nhập mã giọng nói', - 'editVoiceDialog.requiredVoiceName': 'Vui lòng nhập tên giọng nói', + // Audio edit dialog related + 'editVoiceDialog.voiceCode': 'Mã giọng nói', + 'editVoiceDialog.voiceCodePlaceholder': 'Vui lòng nhập mã giọng nói', + 'editVoiceDialog.voiceName': 'Tên giọng nói', + 'editVoiceDialog.voiceNamePlaceholder': 'Vui lòng nhập tên giọng nói', + 'editVoiceDialog.languageType': 'Loại ngôn ngữ', + 'editVoiceDialog.languageTypePlaceholder': 'Vui lòng nhập loại ngôn ngữ', + 'editVoiceDialog.sortNumber': 'Số thứ tự', + 'editVoiceDialog.remark': 'Ghi chú', + 'editVoiceDialog.remarkPlaceholder': 'Vui lòng nhập nội dung ghi chú', + 'editVoiceDialog.generatePreview': 'Tạo xem trước', + 'editVoiceDialog.defaultVoiceName': 'Wawa Xiaohe', + 'editVoiceDialog.defaultLanguageType': 'Tiếng Trung', + 'editVoiceDialog.requiredVoiceCode': 'Vui lòng nhập mã giọng nói', + 'editVoiceDialog.requiredVoiceName': 'Vui lòng nhập tên giọng nói', - // Firmware dialog related - 'firmwareDialog.firmwareName': 'Tên firmware', - 'firmwareDialog.firmwareNamePlaceholder': 'Vui lòng nhập tên firmware (board + phiên bản)', - 'firmwareDialog.firmwareType': 'Loại firmware', - 'firmwareDialog.firmwareTypePlaceholder': 'Vui lòng chọn loại firmware', - 'firmwareDialog.version': 'Phiên bản', - 'firmwareDialog.versionPlaceholder': 'Vui lòng nhập phiên bản (định dạng x.x.x)', - 'firmwareDialog.firmwareFile': 'Tệp firmware', - 'firmwareDialog.clickUpload': 'Nhấp để tải lên', - 'firmwareDialog.uploadTip': 'Chỉ hỗ trợ tệp firmware (.bin/.apk), kích thước không vượt quá 100MB', - 'firmwareDialog.uploadHint': 'Nhắc nhở: Vui lòng tải lên tệp xiaozhi.bin đã hợp nhất trước, không phải tệp merged-binary.bin đã hợp nhất', - 'firmwareDialog.remark': 'Ghi chú', - 'firmwareDialog.remarkPlaceholder': 'Vui lòng nhập thông tin ghi chú', - 'firmwareDialog.requiredFirmwareName': 'Vui lòng nhập tên firmware (board + phiên bản)', - 'firmwareDialog.requiredFirmwareType': 'Vui lòng chọn loại firmware', - 'firmwareDialog.requiredVersion': 'Vui lòng nhập phiên bản', - 'firmwareDialog.versionFormatError': 'Định dạng phiên bản không chính xác, vui lòng nhập định dạng x.x.x', - 'firmwareDialog.requiredFirmwareFile': 'Vui lòng tải lên tệp firmware', - 'firmwareDialog.invalidFileType': 'Chỉ hỗ trợ tệp firmware định dạng .bin/.apk!', - 'firmwareDialog.invalidFileSize': 'Kích thước tệp firmware không được vượt quá 100MB!', - 'firmwareDialog.uploadSuccess': 'Tải lên tệp firmware thành công', - 'firmwareDialog.uploadFailed': 'Tải lên tệp thất bại', + // Firmware dialog related + 'firmwareDialog.firmwareName': 'Tên firmware', + 'firmwareDialog.firmwareNamePlaceholder': 'Vui lòng nhập tên firmware (board + phiên bản)', + 'firmwareDialog.firmwareType': 'Loại firmware', + 'firmwareDialog.firmwareTypePlaceholder': 'Vui lòng chọn loại firmware', + 'firmwareDialog.version': 'Phiên bản', + 'firmwareDialog.versionPlaceholder': 'Vui lòng nhập phiên bản (định dạng x.x.x)', + 'firmwareDialog.firmwareFile': 'Tệp firmware', + 'firmwareDialog.clickUpload': 'Nhấp để tải lên', + 'firmwareDialog.uploadTip': 'Chỉ hỗ trợ tệp firmware (.bin/.apk), kích thước không vượt quá 100MB', + 'firmwareDialog.uploadHint': 'Nhắc nhở: Vui lòng tải lên tệp xiaozhi.bin đã hợp nhất trước, không phải tệp merged-binary.bin đã hợp nhất', + 'firmwareDialog.remark': 'Ghi chú', + 'firmwareDialog.remarkPlaceholder': 'Vui lòng nhập thông tin ghi chú', + 'firmwareDialog.requiredFirmwareName': 'Vui lòng nhập tên firmware (board + phiên bản)', + 'firmwareDialog.requiredFirmwareType': 'Vui lòng chọn loại firmware', + 'firmwareDialog.requiredVersion': 'Vui lòng nhập phiên bản', + 'firmwareDialog.versionFormatError': 'Định dạng phiên bản không chính xác, vui lòng nhập định dạng x.x.x', + 'firmwareDialog.requiredFirmwareFile': 'Vui lòng tải lên tệp firmware', + 'firmwareDialog.invalidFileType': 'Chỉ hỗ trợ tệp firmware định dạng .bin/.apk!', + 'firmwareDialog.invalidFileSize': 'Kích thước tệp firmware không được vượt quá 100MB!', + 'firmwareDialog.uploadSuccess': 'Tải lên tệp firmware thành công', + 'firmwareDialog.uploadFailed': 'Tải lên tệp thất bại', - // Voice print dialog related - 'voicePrintDialog.addSpeaker': 'Thêm người nói', - 'voicePrintDialog.voicePrintVector': 'Vector dấu giọng nói', - 'voicePrintDialog.selectVoiceMessage': 'Vui lòng chọn một tin nhắn thoại', - 'voicePrintDialog.name': 'Tên', - 'voicePrintDialog.enterName': 'Vui lòng nhập tên', - 'voicePrintDialog.description': 'Mô tả', - 'voicePrintDialog.enterDescription': 'Vui lòng nhập mô tả', - 'voicePrintDialog.save': 'Lưu', - 'voicePrintDialog.cancel': 'Hủy bỏ', - 'voicePrintDialog.requiredDescription': 'Vui lòng nhập mô tả', - 'voicePrintDialog.requiredName': 'Vui lòng nhập tên', - 'voicePrintDialog.requiredAudioVector': 'Vui lòng chọn vector âm thanh', + // Voice print dialog related + 'voicePrintDialog.addSpeaker': 'Thêm người nói', + 'voicePrintDialog.voicePrintVector': 'Vector dấu giọng nói', + 'voicePrintDialog.selectVoiceMessage': 'Vui lòng chọn một tin nhắn thoại', + 'voicePrintDialog.name': 'Tên', + 'voicePrintDialog.enterName': 'Vui lòng nhập tên', + 'voicePrintDialog.description': 'Mô tả', + 'voicePrintDialog.enterDescription': 'Vui lòng nhập mô tả', + 'voicePrintDialog.save': 'Lưu', + 'voicePrintDialog.cancel': 'Hủy bỏ', + 'voicePrintDialog.requiredDescription': 'Vui lòng nhập mô tả', + 'voicePrintDialog.requiredName': 'Vui lòng nhập tên', + 'voicePrintDialog.requiredAudioVector': 'Vui lòng chọn vector âm thanh', - // Voice print page related - 'voicePrint.pageTitle': 'Nhận dạng dấu giọng nói', - 'voicePrint.name': 'Tên', - 'voicePrint.description': 'Mô tả', - 'voicePrint.createTime': 'Thời gian tạo', - 'voicePrint.action': 'Hành động', - 'voicePrint.edit': 'Chỉnh sửa', - 'voicePrint.delete': 'Xóa', - 'voicePrint.add': 'Thêm', - 'voicePrint.addSpeaker': 'Thêm người nói', - 'voicePrint.editSpeaker': 'Chỉnh sửa người nói', - 'voicePrint.fetchFailed': 'Không thể tải danh sách dấu giọng nói', - 'voicePrint.updateSuccess': 'Cập nhật thành công', - 'voicePrint.addSuccess': 'Thêm thành công', - 'voicePrint.confirmDelete': 'Bạn có chắc chắn muốn xóa dấu giọng nói này không?', - 'voicePrint.warning': 'Cảnh báo', - 'voicePrint.confirm': 'Xác nhận', - 'voicePrint.cancel': 'Hủy bỏ', - 'voicePrint.deleteSuccess': 'Đã xóa dấu giọng nói thành công', - 'voicePrint.deleteFailed': 'Xóa thất bại, vui lòng thử lại', - 'voicePrint.cancelDelete': 'Đã hủy thao tác xóa', - 'voicePrint.closeOperation': 'Đã đóng thao tác', - 'voicePrint.loading': 'Đang tải...', + // Voice print page related + 'voicePrint.pageTitle': 'Nhận dạng dấu giọng nói', + 'voicePrint.name': 'Tên', + 'voicePrint.description': 'Mô tả', + 'voicePrint.createTime': 'Thời gian tạo', + 'voicePrint.action': 'Hành động', + 'voicePrint.edit': 'Chỉnh sửa', + 'voicePrint.delete': 'Xóa', + 'voicePrint.add': 'Thêm', + 'voicePrint.addSpeaker': 'Thêm người nói', + 'voicePrint.editSpeaker': 'Chỉnh sửa người nói', + 'voicePrint.fetchFailed': 'Không thể tải danh sách dấu giọng nói', + 'voicePrint.updateSuccess': 'Cập nhật thành công', + 'voicePrint.addSuccess': 'Thêm thành công', + 'voicePrint.confirmDelete': 'Bạn có chắc chắn muốn xóa dấu giọng nói này không?', + 'voicePrint.warning': 'Cảnh báo', + 'voicePrint.confirm': 'Xác nhận', + 'voicePrint.cancel': 'Hủy bỏ', + 'voicePrint.deleteSuccess': 'Đã xóa dấu giọng nói thành công', + 'voicePrint.deleteFailed': 'Xóa thất bại, vui lòng thử lại', + 'voicePrint.cancelDelete': 'Đã hủy thao tác xóa', + 'voicePrint.closeOperation': 'Đã đóng thao tác', + 'voicePrint.loading': 'Đang tải...', - // Manual add device dialog related - 'manualAddDeviceDialog.title': 'Thêm thiết bị thủ công', - 'manualAddDeviceDialog.deviceType': 'Loại thiết bị', - 'manualAddDeviceDialog.deviceTypePlaceholder': 'Vui lòng chọn loại thiết bị', - 'manualAddDeviceDialog.firmwareVersion': 'Phiên bản firmware', - 'manualAddDeviceDialog.firmwareVersionPlaceholder': 'Vui lòng nhập phiên bản firmware', - 'manualAddDeviceDialog.macAddress': 'Địa chỉ Mac', - 'manualAddDeviceDialog.macAddressPlaceholder': 'Vui lòng nhập địa chỉ Mac', - 'manualAddDeviceDialog.confirm': 'Xác nhận', - 'manualAddDeviceDialog.cancel': 'Hủy bỏ', - 'manualAddDeviceDialog.requiredMacAddress': 'Vui lòng nhập địa chỉ Mac', - 'manualAddDeviceDialog.invalidMacAddress': 'Vui lòng nhập đúng định dạng địa chỉ Mac, ví dụ: 00:1A:2B:3C:4D:5E', - 'manualAddDeviceDialog.requiredDeviceType': 'Vui lòng chọn loại thiết bị', - 'manualAddDeviceDialog.requiredFirmwareVersion': 'Vui lòng nhập phiên bản firmware', - 'manualAddDeviceDialog.getFirmwareTypeFailed': 'Không thể lấy loại firmware', - 'manualAddDeviceDialog.addSuccess': 'Đã thêm thiết bị thành công', - 'manualAddDeviceDialog.addFailed': 'Thêm thất bại', + // Manual add device dialog related + 'manualAddDeviceDialog.title': 'Thêm thiết bị thủ công', + 'manualAddDeviceDialog.deviceType': 'Loại thiết bị', + 'manualAddDeviceDialog.deviceTypePlaceholder': 'Vui lòng chọn loại thiết bị', + 'manualAddDeviceDialog.firmwareVersion': 'Phiên bản firmware', + 'manualAddDeviceDialog.firmwareVersionPlaceholder': 'Vui lòng nhập phiên bản firmware', + 'manualAddDeviceDialog.macAddress': 'Địa chỉ Mac', + 'manualAddDeviceDialog.macAddressPlaceholder': 'Vui lòng nhập địa chỉ Mac', + 'manualAddDeviceDialog.confirm': 'Xác nhận', + 'manualAddDeviceDialog.cancel': 'Hủy bỏ', + 'manualAddDeviceDialog.requiredMacAddress': 'Vui lòng nhập địa chỉ Mac', + 'manualAddDeviceDialog.invalidMacAddress': 'Vui lòng nhập đúng định dạng địa chỉ Mac, ví dụ: 00:1A:2B:3C:4D:5E', + 'manualAddDeviceDialog.requiredDeviceType': 'Vui lòng chọn loại thiết bị', + 'manualAddDeviceDialog.requiredFirmwareVersion': 'Vui lòng nhập phiên bản firmware', + 'manualAddDeviceDialog.getFirmwareTypeFailed': 'Không thể lấy loại firmware', + 'manualAddDeviceDialog.addSuccess': 'Đã thêm thiết bị thành công', + 'manualAddDeviceDialog.addFailed': 'Thêm thất bại', - // AddModelDialog component related - 'addModelDialog.requiredSupplier': 'Vui lòng chọn nhà cung cấp', + // AddModelDialog component related + 'addModelDialog.requiredSupplier': 'Vui lòng chọn nhà cung cấp', - // Register page related - 'register.title': 'Tạo tài khoản', - 'register.welcome': 'Chào mừng đến với XiaoZhi AI', - 'register.usernamePlaceholder': 'Vui lòng nhập tên đăng nhập', - 'register.mobilePlaceholder': 'Vui lòng nhập số điện thoại di động', - 'register.captchaPlaceholder': 'Vui lòng nhập mã xác minh', - 'register.mobileCaptchaPlaceholder': 'Vui lòng nhập mã xác minh SMS', - 'register.passwordPlaceholder': 'Vui lòng đặt mật khẩu', - 'register.confirmPasswordPlaceholder': 'Vui lòng xác nhận mật khẩu', - 'register.goToLogin': 'Đã có tài khoản? Đăng nhập', - 'register.registerButton': 'Đăng ký', - 'register.agreeTo': 'Bằng cách đăng ký, bạn đồng ý với', - 'register.userAgreement': 'Thỏa thuận người dùng', - 'register.privacyPolicy': 'Chính sách bảo mật', - 'register.notAllowRegister': 'Không cho phép đăng ký người dùng', - 'register.captchaLoadFailed': 'Không thể tải mã xác minh', - 'register.inputCaptcha': 'Vui lòng nhập mã xác minh', - 'register.inputCorrectMobile': 'Vui lòng nhập số điện thoại di động chính xác', - 'register.captchaSendSuccess': 'Đã gửi mã xác minh thành công', - 'register.captchaSendFailed': 'Gửi mã xác minh thất bại', - 'register.passwordsNotMatch': 'Mật khẩu không khớp', - 'register.registerSuccess': 'Đăng ký thành công!', - 'register.registerFailed': 'Đăng ký thất bại', - 'register.requiredUsername': 'Tên đăng nhập không được để trống', - 'register.requiredPassword': 'Mật khẩu không được để trống', - 'register.requiredCaptcha': 'Mã xác minh không được để trống', - 'register.requiredMobileCaptcha': 'Vui lòng nhập mã xác minh SMS', - 'register.invalidCaptcha': 'Mã xác minh không hợp lệ', - 'register.passwordLength': 'Độ dài mật khẩu phải từ 6-20 ký tự', - 'register.usernameFormat': 'Định dạng tên đăng nhập không hợp lệ', - 'register.confirmPasswordRequired': 'Xác nhận mật khẩu không được để trống', - 'register.sendCaptcha': 'Lấy mã xác minh', - 'register.secondsLater': 'giây sau', + // Register page related + 'register.title': 'Tạo tài khoản', + 'register.welcome': 'Chào mừng đến với XiaoZhi AI', + 'register.usernamePlaceholder': 'Vui lòng nhập tên đăng nhập', + 'register.mobilePlaceholder': 'Vui lòng nhập số điện thoại di động', + 'register.captchaPlaceholder': 'Vui lòng nhập mã xác minh', + 'register.mobileCaptchaPlaceholder': 'Vui lòng nhập mã xác minh SMS', + 'register.passwordPlaceholder': 'Vui lòng đặt mật khẩu', + 'register.confirmPasswordPlaceholder': 'Vui lòng xác nhận mật khẩu', + 'register.goToLogin': 'Đã có tài khoản? Đăng nhập', + 'register.registerButton': 'Đăng ký', + 'register.agreeTo': 'Bằng cách đăng ký, bạn đồng ý với', + 'register.userAgreement': 'Thỏa thuận người dùng', + 'register.privacyPolicy': 'Chính sách bảo mật', + 'register.notAllowRegister': 'Không cho phép đăng ký người dùng', + 'register.captchaLoadFailed': 'Không thể tải mã xác minh', + 'register.inputCaptcha': 'Vui lòng nhập mã xác minh', + 'register.inputCorrectMobile': 'Vui lòng nhập số điện thoại di động chính xác', + 'register.captchaSendSuccess': 'Đã gửi mã xác minh thành công', + 'register.captchaSendFailed': 'Gửi mã xác minh thất bại', + 'register.passwordsNotMatch': 'Mật khẩu không khớp', + 'register.registerSuccess': 'Đăng ký thành công!', + 'register.registerFailed': 'Đăng ký thất bại', + 'register.requiredUsername': 'Tên đăng nhập không được để trống', + 'register.requiredPassword': 'Mật khẩu không được để trống', + 'register.requiredCaptcha': 'Mã xác minh không được để trống', + 'register.requiredMobileCaptcha': 'Vui lòng nhập mã xác minh SMS', + 'register.invalidCaptcha': 'Mã xác minh không hợp lệ', + 'register.passwordLength': 'Độ dài mật khẩu phải từ 6-20 ký tự', + 'register.usernameFormat': 'Định dạng tên đăng nhập không hợp lệ', + 'register.confirmPasswordRequired': 'Xác nhận mật khẩu không được để trống', + 'register.sendCaptcha': 'Lấy mã xác minh', + 'register.secondsLater': 'giây sau', - // Parameter dialog related - 'paramDialog.paramCode': 'Mã tham số', - 'paramDialog.paramCodePlaceholder': 'Vui lòng nhập mã tham số', - 'paramDialog.paramValue': 'Giá trị tham số', - 'paramDialog.paramValuePlaceholder': 'Vui lòng nhập giá trị tham số', - 'paramDialog.valueType': 'Loại giá trị', - 'paramDialog.valueTypePlaceholder': 'Vui lòng chọn loại giá trị', - 'paramDialog.remark': 'Ghi chú', - 'paramDialog.remarkPlaceholder': 'Vui lòng nhập ghi chú', - 'paramDialog.save': 'Lưu', - 'paramDialog.cancel': 'Hủy bỏ', - 'paramDialog.requiredParamCode': 'Vui lòng nhập mã tham số', - 'paramDialog.requiredParamValue': 'Vui lòng nhập giá trị tham số', - 'paramDialog.requiredValueType': 'Vui lòng chọn loại giá trị', - 'paramDialog.stringType': 'Chuỗi', - 'paramDialog.numberType': 'Số', - 'paramDialog.booleanType': 'Boolean', - 'paramDialog.arrayType': 'Mảng', - 'paramDialog.jsonType': 'Đối tượng JSON', + // Parameter dialog related + 'paramDialog.paramCode': 'Mã tham số', + 'paramDialog.paramCodePlaceholder': 'Vui lòng nhập mã tham số', + 'paramDialog.paramValue': 'Giá trị tham số', + 'paramDialog.paramValuePlaceholder': 'Vui lòng nhập giá trị tham số', + 'paramDialog.valueType': 'Loại giá trị', + 'paramDialog.valueTypePlaceholder': 'Vui lòng chọn loại giá trị', + 'paramDialog.remark': 'Ghi chú', + 'paramDialog.remarkPlaceholder': 'Vui lòng nhập ghi chú', + 'paramDialog.save': 'Lưu', + 'paramDialog.cancel': 'Hủy bỏ', + 'paramDialog.requiredParamCode': 'Vui lòng nhập mã tham số', + 'paramDialog.requiredParamValue': 'Vui lòng nhập giá trị tham số', + 'paramDialog.requiredValueType': 'Vui lòng chọn loại giá trị', + 'paramDialog.stringType': 'Chuỗi', + 'paramDialog.numberType': 'Số', + 'paramDialog.booleanType': 'Boolean', + 'paramDialog.arrayType': 'Mảng', + 'paramDialog.jsonType': 'Đối tượng JSON', - // Login page text - 'login.title': 'Đăng nhập', - 'login.welcome': 'CHÀO MỪNG ĐẾN VỚI ĐĂNG NHẬP', - 'login.username': 'Tên đăng nhập', - 'login.usernamePlaceholder': 'Vui lòng nhập tên đăng nhập', - 'login.mobilePlaceholder': 'Vui lòng nhập số điện thoại di động', - 'login.password': 'Mật khẩu', - 'login.passwordPlaceholder': 'Vui lòng nhập mật khẩu', - 'login.captchaPlaceholder': 'Vui lòng nhập mã xác minh', - 'login.loginButton': 'Đăng nhập', - 'login.login': 'Đăng nhập', - 'login.register': 'Đăng ký', - 'login.forgotPassword': 'Quên mật khẩu', - 'login.forgetPassword': 'Quên mật khẩu?', - 'login.mobileLogin': 'Đăng nhập bằng điện thoại', - 'login.usernameLogin': 'Đăng nhập bằng tên đăng nhập', - 'login.agreeTo': 'Đăng nhập có nghĩa là chấp nhận', - 'login.userAgreement': 'Thỏa thuận người dùng', - 'login.and': 'và', - 'login.privacyPolicy': 'Chính sách bảo mật', - 'login.registerAccount': 'Đăng ký tài khoản', + // Login page text + 'login.title': 'Đăng nhập', + 'login.welcome': 'CHÀO MỪNG ĐẾN VỚI ĐĂNG NHẬP', + 'login.username': 'Tên đăng nhập', + 'login.usernamePlaceholder': 'Vui lòng nhập tên đăng nhập', + 'login.mobilePlaceholder': 'Vui lòng nhập số điện thoại di động', + 'login.password': 'Mật khẩu', + 'login.passwordPlaceholder': 'Vui lòng nhập mật khẩu', + 'login.captchaPlaceholder': 'Vui lòng nhập mã xác minh', + 'login.loginButton': 'Đăng nhập', + 'login.login': 'Đăng nhập', + 'login.register': 'Đăng ký', + 'login.forgotPassword': 'Quên mật khẩu', + 'login.forgetPassword': 'Quên mật khẩu?', + 'login.mobileLogin': 'Đăng nhập bằng điện thoại', + 'login.usernameLogin': 'Đăng nhập bằng tên đăng nhập', + 'login.agreeTo': 'Đăng nhập có nghĩa là chấp nhận', + 'login.userAgreement': 'Thỏa thuận người dùng', + 'login.and': 'và', + 'login.privacyPolicy': 'Chính sách bảo mật', + 'login.registerAccount': 'Đăng ký tài khoản', - // Retrieve password page text - 'retrievePassword.title': 'Đặt lại mật khẩu', - 'retrievePassword.welcome': 'KHÔI PHỤC MẬT KHẨU', - 'retrievePassword.subtitle': 'Khôi phục mật khẩu', - 'retrievePassword.mobile': 'Điện thoại', - 'retrievePassword.mobilePlaceholder': 'Vui lòng nhập số điện thoại di động', - 'retrievePassword.captcha': 'Mã xác minh', - 'retrievePassword.captchaPlaceholder': 'Vui lòng nhập mã xác minh', - 'retrievePassword.mobileCaptcha': 'Mã xác minh điện thoại', - 'retrievePassword.mobileCaptchaPlaceholder': 'Vui lòng nhập mã xác minh điện thoại', - 'retrievePassword.newPassword': 'Mật khẩu mới', - 'retrievePassword.newPasswordPlaceholder': 'Vui lòng nhập mật khẩu mới', - 'retrievePassword.confirmNewPassword': 'Xác nhận mật khẩu mới', - 'retrievePassword.confirmNewPasswordPlaceholder': 'Vui lòng xác nhận mật khẩu mới', - 'retrievePassword.getMobileCaptcha': 'Lấy mã xác minh', - 'retrievePassword.resetButton': 'Đặt lại mật khẩu', - 'retrievePassword.updateButton': 'Cập nhật ngay', - 'retrievePassword.goToLogin': 'Quay lại đăng nhập', - 'retrievePassword.inputCorrectMobile': 'Vui lòng nhập số điện thoại di động chính xác', - 'retrievePassword.captchaSendSuccess': 'Đã gửi mã xác minh thành công', - 'retrievePassword.passwordsNotMatch': 'Hai mật khẩu nhập vào không khớp', - 'retrievePassword.passwordLength': 'Độ dài mật khẩu phải từ 6-20 ký tự', - 'retrievePassword.mobileRequired': 'Số điện thoại di động không được để trống', - 'retrievePassword.captchaRequired': 'Mã xác minh không được để trống', - 'retrievePassword.mobileCaptchaRequired': 'Mã xác minh điện thoại không được để trống', - 'retrievePassword.newPasswordRequired': 'Mật khẩu mới không được để trống', - 'retrievePassword.confirmNewPasswordRequired': 'Xác nhận mật khẩu mới không được để trống', - 'retrievePassword.passwordUpdateSuccess': 'Đã cập nhật mật khẩu thành công', - 'retrievePassword.agreeTo': 'Đặt lại có nghĩa là đồng ý', + // Retrieve password page text + 'retrievePassword.title': 'Đặt lại mật khẩu', + 'retrievePassword.welcome': 'KHÔI PHỤC MẬT KHẨU', + 'retrievePassword.subtitle': 'Khôi phục mật khẩu', + 'retrievePassword.mobile': 'Điện thoại', + 'retrievePassword.mobilePlaceholder': 'Vui lòng nhập số điện thoại di động', + 'retrievePassword.captcha': 'Mã xác minh', + 'retrievePassword.captchaPlaceholder': 'Vui lòng nhập mã xác minh', + 'retrievePassword.mobileCaptcha': 'Mã xác minh điện thoại', + 'retrievePassword.mobileCaptchaPlaceholder': 'Vui lòng nhập mã xác minh điện thoại', + 'retrievePassword.newPassword': 'Mật khẩu mới', + 'retrievePassword.newPasswordPlaceholder': 'Vui lòng nhập mật khẩu mới', + 'retrievePassword.confirmNewPassword': 'Xác nhận mật khẩu mới', + 'retrievePassword.confirmNewPasswordPlaceholder': 'Vui lòng xác nhận mật khẩu mới', + 'retrievePassword.getMobileCaptcha': 'Lấy mã xác minh', + 'retrievePassword.resetButton': 'Đặt lại mật khẩu', + 'retrievePassword.updateButton': 'Cập nhật ngay', + 'retrievePassword.goToLogin': 'Quay lại đăng nhập', + 'retrievePassword.inputCorrectMobile': 'Vui lòng nhập số điện thoại di động chính xác', + 'retrievePassword.captchaSendSuccess': 'Đã gửi mã xác minh thành công', + 'retrievePassword.passwordsNotMatch': 'Hai mật khẩu nhập vào không khớp', + 'retrievePassword.passwordLength': 'Độ dài mật khẩu phải từ 6-20 ký tự', + 'retrievePassword.mobileRequired': 'Số điện thoại di động không được để trống', + 'retrievePassword.captchaRequired': 'Mã xác minh không được để trống', + 'retrievePassword.mobileCaptchaRequired': 'Mã xác minh điện thoại không được để trống', + 'retrievePassword.newPasswordRequired': 'Mật khẩu mới không được để trống', + 'retrievePassword.confirmNewPasswordRequired': 'Xác nhận mật khẩu mới không được để trống', + 'retrievePassword.passwordUpdateSuccess': 'Đã cập nhật mật khẩu thành công', + 'retrievePassword.agreeTo': 'Đặt lại có nghĩa là đồng ý', - // Change password page text - 'changePassword.title': 'Đổi mật khẩu', - 'changePassword.oldPasswordLabel': 'Mật khẩu cũ:', - 'changePassword.oldPasswordPlaceholder': 'Vui lòng nhập mật khẩu cũ', - 'changePassword.newPasswordLabel': 'Mật khẩu mới:', - 'changePassword.newPasswordPlaceholder': 'Vui lòng nhập mật khẩu mới', - 'changePassword.confirmPasswordLabel': 'Xác nhận mật khẩu mới:', - 'changePassword.confirmPasswordPlaceholder': 'Vui lòng nhập lại mật khẩu mới', - 'changePassword.confirmButton': 'Xác nhận', - 'changePassword.cancelButton': 'Hủy bỏ', - 'changePassword.allFieldsRequired': 'Vui lòng điền vào tất cả các trường', - 'changePassword.passwordsNotMatch': 'Hai mật khẩu mới nhập vào không khớp', - 'changePassword.newPasswordSameAsOld': 'Mật khẩu mới không được giống mật khẩu cũ', - 'changePassword.passwordChangedSuccessfully': 'Đã đổi mật khẩu thành công, vui lòng đăng nhập lại', - 'changePassword.changeFailed': 'Đổi mật khẩu thất bại', + // Change password page text + 'changePassword.title': 'Đổi mật khẩu', + 'changePassword.oldPasswordLabel': 'Mật khẩu cũ:', + 'changePassword.oldPasswordPlaceholder': 'Vui lòng nhập mật khẩu cũ', + 'changePassword.newPasswordLabel': 'Mật khẩu mới:', + 'changePassword.newPasswordPlaceholder': 'Vui lòng nhập mật khẩu mới', + 'changePassword.confirmPasswordLabel': 'Xác nhận mật khẩu mới:', + 'changePassword.confirmPasswordPlaceholder': 'Vui lòng nhập lại mật khẩu mới', + 'changePassword.confirmButton': 'Xác nhận', + 'changePassword.cancelButton': 'Hủy bỏ', + 'changePassword.allFieldsRequired': 'Vui lòng điền vào tất cả các trường', + 'changePassword.passwordsNotMatch': 'Hai mật khẩu mới nhập vào không khớp', + 'changePassword.newPasswordSameAsOld': 'Mật khẩu mới không được giống mật khẩu cũ', + 'changePassword.passwordChangedSuccessfully': 'Đã đổi mật khẩu thành công, vui lòng đăng nhập lại', + 'changePassword.changeFailed': 'Đổi mật khẩu thất bại', - // Device management page text - 'device.management': 'Quản lý thiết bị', - 'device.add': 'Thêm thiết bị', - 'device.edit': 'Chỉnh sửa thiết bị', - 'device.delete': 'Xóa thiết bị', - 'device.name': 'Tên thiết bị', - 'device.type': 'Loại thiết bị', - 'device.status': 'Trạng thái thiết bị', - 'device.dialogTitle': 'Thêm thiết bị', - 'device.verificationCode': 'Mã xác minh:', - 'device.verificationCodePlaceholder': 'Vui lòng nhập mã xác minh 6 chữ số được phát từ thiết bị..', - 'device.confirmButton': 'Xác nhận', - 'device.cancelButton': 'Hủy bỏ', - 'device.input6DigitCode': 'Vui lòng nhập mã xác minh 6 chữ số', - 'device.bindSuccess': 'Liên kết thiết bị thành công', - 'device.bindFailed': 'Liên kết thất bại', - 'device.searchPlaceholder': 'Vui lòng nhập model thiết bị hoặc địa chỉ Mac để tìm kiếm', - 'device.model': 'Model thiết bị', - 'device.macAddress': 'Địa chỉ Mac', - 'device.firmwareVersion': 'Phiên bản firmware', - 'device.bindTime': 'Thời gian liên kết', - 'device.lastConversation': 'Cuộc trò chuyện cuối', - 'device.remark': 'Ghi chú', - 'device.autoUpdate': 'Tự động cập nhật', - 'device.operation': 'Thao tác', - 'device.search': 'Tìm kiếm', - 'device.selectAll': 'Chọn tất cả/Bỏ chọn tất cả', - 'deviceManagement.loading': 'Đang tải...', - 'device.bindWithCode': 'Liên kết bằng mã xác minh 6 chữ số', - 'device.manualAdd': 'Thêm thủ công', - 'device.unbind': 'Hủy liên kết', - 'device.toolCall': 'Gọi công cụ', - 'device.selectAtLeastOne': 'Vui lòng chọn ít nhất một bản ghi', - 'device.confirmBatchUnbind': 'Bạn có chắc chắn muốn hủy liên kết {count} thiết bị đã chọn?', - 'device.batchUnbindSuccess': 'Đã hủy liên kết thành công {count} thiết bị', - 'device.batchUnbindError': 'Đã xảy ra lỗi khi hủy liên kết hàng loạt', - 'device.remarkTooLong': 'Ghi chú không được vượt quá 64 ký tự', - 'device.remarkSaved': 'Đã lưu ghi chú thành công', - 'device.remarkSaveFailed': 'Lưu ghi chú thất bại', - 'device.confirmUnbind': 'Bạn có chắc chắn muốn hủy liên kết thiết bị này?', - 'device.unbindSuccess': 'Đã hủy liên kết thiết bị thành công', - 'device.unbindFailed': 'Hủy liên kết thiết bị thất bại', - 'device.getListFailed': 'Không thể tải danh sách thiết bị', - 'device.autoUpdateEnabled': 'Đã bật tự động cập nhật', - 'device.autoUpdateDisabled': 'Đã tắt tự động cập nhật', - 'device.batchUnbindSuccess': 'Đã hủy liên kết thành công {count} thiết bị', - 'device.getFirmwareTypeFailed': 'Không thể lấy loại firmware', - 'device.deviceStatus': 'Trạng thái', - 'device.online': 'Trực tuyến', - 'device.offline': 'Ngoại tuyến', + // Device management page text + 'device.management': 'Quản lý thiết bị', + 'device.add': 'Thêm thiết bị', + 'device.edit': 'Chỉnh sửa thiết bị', + 'device.delete': 'Xóa thiết bị', + 'device.name': 'Tên thiết bị', + 'device.type': 'Loại thiết bị', + 'device.status': 'Trạng thái thiết bị', + 'device.dialogTitle': 'Thêm thiết bị', + 'device.verificationCode': 'Mã xác minh:', + 'device.verificationCodePlaceholder': 'Vui lòng nhập mã xác minh 6 chữ số được phát từ thiết bị..', + 'device.confirmButton': 'Xác nhận', + 'device.cancelButton': 'Hủy bỏ', + 'device.input6DigitCode': 'Vui lòng nhập mã xác minh 6 chữ số', + 'device.bindSuccess': 'Liên kết thiết bị thành công', + 'device.bindFailed': 'Liên kết thất bại', + 'device.searchPlaceholder': 'Vui lòng nhập model thiết bị hoặc địa chỉ Mac để tìm kiếm', + 'device.model': 'Model thiết bị', + 'device.macAddress': 'Địa chỉ Mac', + 'device.firmwareVersion': 'Phiên bản firmware', + 'device.bindTime': 'Thời gian liên kết', + 'device.lastConversation': 'Cuộc trò chuyện cuối', + 'device.remark': 'Ghi chú', + 'device.autoUpdate': 'Tự động cập nhật', + 'device.operation': 'Thao tác', + 'device.search': 'Tìm kiếm', + 'device.selectAll': 'Chọn tất cả/Bỏ chọn tất cả', + 'deviceManagement.loading': 'Đang tải...', + 'device.bindWithCode': 'Liên kết bằng mã xác minh 6 chữ số', + 'device.manualAdd': 'Thêm thủ công', + 'device.unbind': 'Hủy liên kết', + 'device.toolCall': 'Gọi công cụ', + 'device.selectAtLeastOne': 'Vui lòng chọn ít nhất một bản ghi', + 'device.confirmBatchUnbind': 'Bạn có chắc chắn muốn hủy liên kết {count} thiết bị đã chọn?', + 'device.batchUnbindSuccess': 'Đã hủy liên kết thành công {count} thiết bị', + 'device.batchUnbindError': 'Đã xảy ra lỗi khi hủy liên kết hàng loạt', + 'device.remarkTooLong': 'Ghi chú không được vượt quá 64 ký tự', + 'device.remarkSaved': 'Đã lưu ghi chú thành công', + 'device.remarkSaveFailed': 'Lưu ghi chú thất bại', + 'device.confirmUnbind': 'Bạn có chắc chắn muốn hủy liên kết thiết bị này?', + 'device.unbindSuccess': 'Đã hủy liên kết thiết bị thành công', + 'device.unbindFailed': 'Hủy liên kết thiết bị thất bại', + 'device.getListFailed': 'Không thể tải danh sách thiết bị', + 'device.autoUpdateEnabled': 'Đã bật tự động cập nhật', + 'device.autoUpdateDisabled': 'Đã tắt tự động cập nhật', + 'device.batchUnbindSuccess': 'Đã hủy liên kết thành công {count} thiết bị', + 'device.getFirmwareTypeFailed': 'Không thể lấy loại firmware', + 'device.deviceStatus': 'Trạng thái', + 'device.online': 'Trực tuyến', + 'device.offline': 'Ngoại tuyến', - // Message tips - 'message.success': 'Thao tác thành công', - 'message.error': 'Thao tác thất bại', - 'message.warning': 'Cảnh báo', - 'message.info': 'Thông tin', + // Message tips + 'message.success': 'Thao tác thành công', + 'message.error': 'Thao tác thất bại', + 'message.warning': 'Cảnh báo', + 'message.info': 'Thông tin', - // Cache related - 'cache.viewer': 'Trình xem cache', + // Cache related + 'cache.viewer': 'Trình xem cache', - // Chat history dialog related - 'chatHistory.with': 'Với', - 'chatHistory.dialogTitle': "'s Lịch sử trò chuyện", - 'chatHistory.loading': 'Đang tải...', - 'chatHistory.noMoreRecords': 'Không còn bản ghi nào', - 'chatHistory.selectSession': 'Vui lòng chọn một phiên để xem lịch sử trò chuyện', - 'chatHistory.today': 'Hôm nay', - 'chatHistory.yesterday': 'Hôm qua', - 'chatHistory.downloadCurrentSession': 'Tải xuống lịch sử trò chuyện phiên hiện tại', - 'chatHistory.downloadCurrentWithPreviousSessions': 'Tải xuống lịch sử trò chuyện phiên hiện tại và 20 phiên trước', - 'chatHistory.downloadLinkFailed': 'Không thể lấy liên kết tải xuống', + // Chat history dialog related + 'chatHistory.with': 'Với', + 'chatHistory.dialogTitle': "'s Lịch sử trò chuyện", + 'chatHistory.loading': 'Đang tải...', + 'chatHistory.noMoreRecords': 'Không còn bản ghi nào', + 'chatHistory.selectSession': 'Vui lòng chọn một phiên để xem lịch sử trò chuyện', + 'chatHistory.today': 'Hôm nay', + 'chatHistory.yesterday': 'Hôm qua', + 'chatHistory.downloadCurrentSession': 'Tải xuống lịch sử trò chuyện phiên hiện tại', + 'chatHistory.downloadCurrentWithPreviousSessions': 'Tải xuống lịch sử trò chuyện phiên hiện tại và 20 phiên trước', + 'chatHistory.downloadLinkFailed': 'Không thể lấy liên kết tải xuống', - 'cache.status': 'Trạng thái cache', - 'cache.cdnEnabled': 'Đã bật chế độ CDN', - 'cache.cdnDisabled': 'Đã tắt chế độ CDN', - 'cache.serviceWorkerRegistered': 'Đã đăng ký Service Worker', - 'cache.serviceWorkerNotRegistered': 'Chưa đăng ký Service Worker', - 'cache.noCacheDetected': 'Chưa phát hiện cache, vui lòng làm mới trang hoặc chờ cache được thiết lập', - 'cache.swDevEnvWarning': 'Trong môi trường phát triển, Service Worker có thể không khởi tạo cache đúng cách', - 'cache.swCheckMethods': 'Vui lòng thử các phương pháp sau để kiểm tra xem Service Worker có hoạt động không:', - 'cache.swCheckMethod1': 'Kiểm tra trạng thái Service Worker trong tab Application/Application của công cụ nhà phát triển', - 'cache.swCheckMethod2': 'Xem nội dung cache trong Application/Cache/Cache Storage của công cụ nhà phát triển', - 'cache.swCheckMethod3': 'Sử dụng bản dựng production (npm run build) và truy cập qua máy chủ HTTP để kiểm tra chức năng đầy đủ', - 'cache.swDevEnvNormal': 'Trong môi trường phát triển, điều này là bình thường', - 'cache.swProdOnly': 'Service Worker thường chỉ hoạt động trong môi trường production', - 'cache.swTestingTitle': 'Để kiểm tra chức năng Service Worker:', - 'cache.swTestingStep1': 'Chạy npm run build để tạo bản production', - 'cache.swTestingStep2': 'Truy cập trang đã build qua máy chủ HTTP', - 'cache.swNotSupported': 'Trình duyệt hiện tại không hỗ trợ Service Worker, chức năng cache tài nguyên CDN không khả dụng', - 'cache.dialogTitle': 'Trạng thái cache tài nguyên CDN', - 'cache.loading': 'Đang tải thông tin cache...', - 'cache.notSupported': 'Trình duyệt của bạn không hỗ trợ Cache API hoặc Service Worker chưa được cài đặt', - 'cache.refreshPage': 'Làm mới trang', - 'cache.noCachedResources': 'Không tìm thấy tài nguyên CDN được cache', - 'cache.noCachedResourcesDesc': 'Service Worker có thể chưa hoàn tất khởi tạo hoặc cache chưa được thiết lập. Vui lòng làm mới trang hoặc thử lại sau.', - 'cache.cdnCacheStatus': 'Trạng thái cache tài nguyên CDN', - 'cache.totalCachedResources': 'Đã tìm thấy tổng cộng {count} tài nguyên được cache', - 'cache.jsResources': 'Tài nguyên JavaScript ({count})', - 'cache.cssResources': 'Tài nguyên CSS ({count})', - 'cache.cached': 'Đã cache', - 'cache.notCached': 'Chưa cache', - 'cache.refreshStatus': 'Làm mới trạng thái cache', - 'cache.clearCache': 'Xóa cache', - 'cache.refreshingStatus': 'Đang làm mới trạng thái cache', - 'cache.confirmClear': 'Bạn có chắc chắn muốn xóa toàn bộ cache?', - 'cache.clearedSuccess': 'Đã xóa cache thành công', - 'cache.clearFailed': 'Xóa cache thất bại', - 'cache.clearCanceled': 'Đã hủy thao tác xóa', + 'cache.status': 'Trạng thái cache', + 'cache.cdnEnabled': 'Đã bật chế độ CDN', + 'cache.cdnDisabled': 'Đã tắt chế độ CDN', + 'cache.serviceWorkerRegistered': 'Đã đăng ký Service Worker', + 'cache.serviceWorkerNotRegistered': 'Chưa đăng ký Service Worker', + 'cache.noCacheDetected': 'Chưa phát hiện cache, vui lòng làm mới trang hoặc chờ cache được thiết lập', + 'cache.swDevEnvWarning': 'Trong môi trường phát triển, Service Worker có thể không khởi tạo cache đúng cách', + 'cache.swCheckMethods': 'Vui lòng thử các phương pháp sau để kiểm tra xem Service Worker có hoạt động không:', + 'cache.swCheckMethod1': 'Kiểm tra trạng thái Service Worker trong tab Application/Application của công cụ nhà phát triển', + 'cache.swCheckMethod2': 'Xem nội dung cache trong Application/Cache/Cache Storage của công cụ nhà phát triển', + 'cache.swCheckMethod3': 'Sử dụng bản dựng production (npm run build) và truy cập qua máy chủ HTTP để kiểm tra chức năng đầy đủ', + 'cache.swDevEnvNormal': 'Trong môi trường phát triển, điều này là bình thường', + 'cache.swProdOnly': 'Service Worker thường chỉ hoạt động trong môi trường production', + 'cache.swTestingTitle': 'Để kiểm tra chức năng Service Worker:', + 'cache.swTestingStep1': 'Chạy npm run build để tạo bản production', + 'cache.swTestingStep2': 'Truy cập trang đã build qua máy chủ HTTP', + 'cache.swNotSupported': 'Trình duyệt hiện tại không hỗ trợ Service Worker, chức năng cache tài nguyên CDN không khả dụng', + 'cache.dialogTitle': 'Trạng thái cache tài nguyên CDN', + 'cache.loading': 'Đang tải thông tin cache...', + 'cache.notSupported': 'Trình duyệt của bạn không hỗ trợ Cache API hoặc Service Worker chưa được cài đặt', + 'cache.refreshPage': 'Làm mới trang', + 'cache.noCachedResources': 'Không tìm thấy tài nguyên CDN được cache', + 'cache.noCachedResourcesDesc': 'Service Worker có thể chưa hoàn tất khởi tạo hoặc cache chưa được thiết lập. Vui lòng làm mới trang hoặc thử lại sau.', + 'cache.cdnCacheStatus': 'Trạng thái cache tài nguyên CDN', + 'cache.totalCachedResources': 'Đã tìm thấy tổng cộng {count} tài nguyên được cache', + 'cache.jsResources': 'Tài nguyên JavaScript ({count})', + 'cache.cssResources': 'Tài nguyên CSS ({count})', + 'cache.cached': 'Đã cache', + 'cache.notCached': 'Chưa cache', + 'cache.refreshStatus': 'Làm mới trạng thái cache', + 'cache.clearCache': 'Xóa cache', + 'cache.refreshingStatus': 'Đang làm mới trạng thái cache', + 'cache.confirmClear': 'Bạn có chắc chắn muốn xóa toàn bộ cache?', + 'cache.clearedSuccess': 'Đã xóa cache thành công', + 'cache.clearFailed': 'Xóa cache thất bại', + 'cache.clearCanceled': 'Đã hủy thao tác xóa', - // Common buttons - 'button.ok': 'OK', - 'button.cancel': 'Hủy bỏ', - 'button.save': 'Lưu', - 'button.close': 'Đóng', + // Common buttons + 'button.ok': 'OK', + 'button.cancel': 'Hủy bỏ', + 'button.save': 'Lưu', + 'button.close': 'Đóng', - // System information - 'system.name': 'Dịch vụ XiaoZhi', + // System information + 'system.name': 'Dịch vụ XiaoZhi', - // Voiceprint related - 'voiceprint.management': 'Quản lý dấu giọng nói', - 'voiceprint.add': 'Thêm dấu giọng nói', - 'voiceprint.delete': 'Xóa dấu giọng nói', + // Voiceprint related + 'voiceprint.management': 'Quản lý dấu giọng nói', + 'voiceprint.add': 'Thêm dấu giọng nói', + 'voiceprint.delete': 'Xóa dấu giọng nói', - // Dictionary management page text - 'dictManagement.pageTitle': 'Quản lý từ điển', - 'dictManagement.searchPlaceholder': 'Vui lòng nhập nhãn giá trị từ điển để tìm kiếm', - 'dictManagement.search': 'Tìm kiếm', - 'dictManagement.dictTypeName': 'Tên loại từ điển', - 'dictManagement.operation': 'Thao tác', - 'dictManagement.edit': 'Chỉnh sửa', - 'dictManagement.dictLabel': 'Nhãn từ điển', - 'dictManagement.dictValue': 'Giá trị từ điển', - 'dictManagement.sort': 'Sắp xếp', - 'dictManagement.delete': 'Xóa', - 'dictManagement.selectAll': 'Chọn tất cả', - 'dictManagement.deselectAll': 'Bỏ chọn tất cả', - 'dictManagement.addDictType': 'Thêm loại từ điển', - 'dictManagement.batchDeleteDictType': 'Xóa hàng loạt loại từ điển', - 'dictManagement.addDictData': 'Thêm dữ liệu từ điển', - 'dictManagement.batchDeleteDictData': 'Xóa hàng loạt dữ liệu từ điển', - 'dictManagement.itemsPerPage': '{items} mục/trang', - 'dictManagement.firstPage': 'Trang đầu', - 'dictManagement.prevPage': 'Trang trước', - 'dictManagement.nextPage': 'Trang sau', - 'dictManagement.totalRecords': 'Tổng cộng {total} bản ghi', - 'dictManagement.editDictType': 'Chỉnh sửa loại từ điển', - 'dictManagement.editDictData': 'Chỉnh sửa dữ liệu từ điển', - 'dictManagement.saveSuccess': 'Lưu thành công', - 'dictManagement.deleteSuccess': 'Xóa thành công', - 'dictManagement.selectDictTypeToDelete': 'Vui lòng chọn loại từ điển để xóa', - 'dictManagement.confirmDeleteDictType': 'Bạn có chắc chắn muốn xóa các loại từ điển đã chọn?', - 'dictManagement.confirm': 'Xác nhận', - 'dictManagement.cancel': 'Hủy bỏ', - 'dictManagement.selectDictTypeFirst': 'Vui lòng chọn loại từ điển trước', - 'dictManagement.confirmDeleteDictData': 'Bạn có chắc chắn muốn xóa dữ liệu từ điển này?', - 'dictManagement.selectDictDataToDelete': 'Vui lòng chọn dữ liệu từ điển để xóa', - 'dictManagement.confirmBatchDeleteDictData': 'Bạn có chắc chắn muốn xóa {count} dữ liệu từ điển đã chọn?', - 'dictManagement.getDictDataFailed': 'Không thể lấy dữ liệu từ điển', + // Dictionary management page text + 'dictManagement.pageTitle': 'Quản lý từ điển', + 'dictManagement.searchPlaceholder': 'Vui lòng nhập nhãn giá trị từ điển để tìm kiếm', + 'dictManagement.search': 'Tìm kiếm', + 'dictManagement.dictTypeName': 'Tên loại từ điển', + 'dictManagement.operation': 'Thao tác', + 'dictManagement.edit': 'Chỉnh sửa', + 'dictManagement.dictLabel': 'Nhãn từ điển', + 'dictManagement.dictValue': 'Giá trị từ điển', + 'dictManagement.sort': 'Sắp xếp', + 'dictManagement.delete': 'Xóa', + 'dictManagement.selectAll': 'Chọn tất cả', + 'dictManagement.deselectAll': 'Bỏ chọn tất cả', + 'dictManagement.addDictType': 'Thêm loại từ điển', + 'dictManagement.batchDeleteDictType': 'Xóa hàng loạt loại từ điển', + 'dictManagement.addDictData': 'Thêm dữ liệu từ điển', + 'dictManagement.batchDeleteDictData': 'Xóa hàng loạt dữ liệu từ điển', + 'dictManagement.itemsPerPage': '{items} mục/trang', + 'dictManagement.firstPage': 'Trang đầu', + 'dictManagement.prevPage': 'Trang trước', + 'dictManagement.nextPage': 'Trang sau', + 'dictManagement.totalRecords': 'Tổng cộng {total} bản ghi', + 'dictManagement.editDictType': 'Chỉnh sửa loại từ điển', + 'dictManagement.editDictData': 'Chỉnh sửa dữ liệu từ điển', + 'dictManagement.saveSuccess': 'Lưu thành công', + 'dictManagement.deleteSuccess': 'Xóa thành công', + 'dictManagement.selectDictTypeToDelete': 'Vui lòng chọn loại từ điển để xóa', + 'dictManagement.confirmDeleteDictType': 'Bạn có chắc chắn muốn xóa các loại từ điển đã chọn?', + 'dictManagement.confirm': 'Xác nhận', + 'dictManagement.cancel': 'Hủy bỏ', + 'dictManagement.selectDictTypeFirst': 'Vui lòng chọn loại từ điển trước', + 'dictManagement.confirmDeleteDictData': 'Bạn có chắc chắn muốn xóa dữ liệu từ điển này?', + 'dictManagement.selectDictDataToDelete': 'Vui lòng chọn dữ liệu từ điển để xóa', + 'dictManagement.confirmBatchDeleteDictData': 'Bạn có chắc chắn muốn xóa {count} dữ liệu từ điển đã chọn?', + 'dictManagement.getDictDataFailed': 'Không thể lấy dữ liệu từ điển', - // User information - 'user.info': 'Thông tin người dùng', - 'user.username': 'Tên đăng nhập', - 'user.mobile': 'Điện thoại di động', - 'user.userid': 'ID người dùng', - 'user.deviceCount': 'Số lượng thiết bị', - 'user.createDate': 'Thời gian đăng ký', - 'user.status': 'Trạng thái', - 'user.normal': 'Bình thường', - 'user.disabled': 'Đã vô hiệu hóa', - 'user.resetPassword': 'Đặt lại mật khẩu', - 'user.disableAccount': 'Vô hiệu hóa tài khoản', - 'user.enableAccount': 'Kích hoạt tài khoản', - 'user.deleteUser': 'Xóa người dùng', - 'user.deselectAll': 'Bỏ chọn tất cả', - 'user.selectAll': 'Chọn tất cả', - 'user.enable': 'Kích hoạt', - 'user.disable': 'Vô hiệu hóa', - 'user.delete': 'Xóa', - 'user.selectUsersFirst': 'Vui lòng chọn người dùng để xóa trước', - 'user.confirmDeleteSelected': 'Bạn có chắc chắn muốn xóa {count} người dùng đã chọn?', - 'user.deleting': 'Đang xóa...', - 'user.deleteSuccess': 'Đã xóa thành công {count} người dùng', - 'user.deleteFailed': 'Xóa thất bại, vui lòng thử lại', - 'user.partialDelete': 'Đã xóa thành công {successCount} người dùng, {failCount} thất bại', - 'user.deleteError': 'Đã xảy ra lỗi khi xóa', - 'user.deleteCancelled': 'Đã hủy xóa', - 'user.confirmResetPassword': 'Một mật khẩu mới sẽ được tạo sau khi đặt lại. Tiếp tục?', - 'user.resetPasswordSuccess': 'Mật khẩu đã được đặt lại, vui lòng thông báo cho người dùng đăng nhập bằng mật khẩu mới', - 'user.generatedPassword': 'Mật khẩu mặc định được tạo', - 'user.confirmDeleteUser': 'Bạn có chắc chắn muốn xóa người dùng này?', - 'user.deleteUserSuccess': 'Xóa thành công', - 'user.operationFailed': 'Thao tác thất bại, vui lòng thử lại', - 'user.confirmStatusChange': 'Bạn có chắc chắn muốn {action} {count} người dùng đã chọn?', - 'user.statusChangeSuccess': 'Đã {action} thành công {count} người dùng', - 'user.invalidUserId': 'Có ID người dùng không hợp lệ', - 'user.searchPhone': 'Vui lòng nhập số điện thoại di động để tìm kiếm', - 'user.search': 'Tìm kiếm', + // User information + 'user.info': 'Thông tin người dùng', + 'user.username': 'Tên đăng nhập', + 'user.mobile': 'Điện thoại di động', + 'user.userid': 'ID người dùng', + 'user.deviceCount': 'Số lượng thiết bị', + 'user.createDate': 'Thời gian đăng ký', + 'user.status': 'Trạng thái', + 'user.normal': 'Bình thường', + 'user.disabled': 'Đã vô hiệu hóa', + 'user.resetPassword': 'Đặt lại mật khẩu', + 'user.disableAccount': 'Vô hiệu hóa tài khoản', + 'user.enableAccount': 'Kích hoạt tài khoản', + 'user.deleteUser': 'Xóa người dùng', + 'user.deselectAll': 'Bỏ chọn tất cả', + 'user.selectAll': 'Chọn tất cả', + 'user.enable': 'Kích hoạt', + 'user.disable': 'Vô hiệu hóa', + 'user.delete': 'Xóa', + 'user.selectUsersFirst': 'Vui lòng chọn người dùng để xóa trước', + 'user.confirmDeleteSelected': 'Bạn có chắc chắn muốn xóa {count} người dùng đã chọn?', + 'user.deleting': 'Đang xóa...', + 'user.deleteSuccess': 'Đã xóa thành công {count} người dùng', + 'user.deleteFailed': 'Xóa thất bại, vui lòng thử lại', + 'user.partialDelete': 'Đã xóa thành công {successCount} người dùng, {failCount} thất bại', + 'user.deleteError': 'Đã xảy ra lỗi khi xóa', + 'user.deleteCancelled': 'Đã hủy xóa', + 'user.confirmResetPassword': 'Một mật khẩu mới sẽ được tạo sau khi đặt lại. Tiếp tục?', + 'user.resetPasswordSuccess': 'Mật khẩu đã được đặt lại, vui lòng thông báo cho người dùng đăng nhập bằng mật khẩu mới', + 'user.generatedPassword': 'Mật khẩu mặc định được tạo', + 'user.confirmDeleteUser': 'Bạn có chắc chắn muốn xóa người dùng này?', + 'user.deleteUserSuccess': 'Xóa thành công', + 'user.operationFailed': 'Thao tác thất bại, vui lòng thử lại', + 'user.confirmStatusChange': 'Bạn có chắc chắn muốn {action} {count} người dùng đã chọn?', + 'user.statusChangeSuccess': 'Đã {action} thành công {count} người dùng', + 'user.invalidUserId': 'Có ID người dùng không hợp lệ', + 'user.searchPhone': 'Vui lòng nhập số điện thoại di động để tìm kiếm', + 'user.search': 'Tìm kiếm', - // Provider Management Page Text - 'providerManagement.categoryFilter': 'Bộ lọc danh mục', - 'providerManagement.searchPlaceholder': 'Vui lòng nhập tên nhà cung cấp để tìm kiếm', - 'providerManagement.category': 'Danh mục', - 'providerManagement.providerCode': 'Mã nhà cung cấp', - 'providerManagement.fieldConfig': 'Cấu hình trường', - 'providerManagement.selectToDelete': 'Vui lòng chọn nhà cung cấp để xóa trước', - 'providerManagement.confirmDelete': 'Bạn có chắc chắn muốn xóa {count} nhà cung cấp đã chọn?', - 'providerManagement.viewFields': 'Xem các trường', + // Provider Management Page Text + 'providerManagement.categoryFilter': 'Bộ lọc danh mục', + 'providerManagement.searchPlaceholder': 'Vui lòng nhập tên nhà cung cấp để tìm kiếm', + 'providerManagement.category': 'Danh mục', + 'providerManagement.providerCode': 'Mã nhà cung cấp', + 'providerManagement.fieldConfig': 'Cấu hình trường', + 'providerManagement.selectToDelete': 'Vui lòng chọn nhà cung cấp để xóa trước', + 'providerManagement.confirmDelete': 'Bạn có chắc chắn muốn xóa {count} nhà cung cấp đã chọn?', + 'providerManagement.viewFields': 'Xem các trường', - // Common Text - 'common.all': 'Tất cả', - 'common.search': 'Tìm kiếm', - 'common.name': 'Tên', - 'common.sort': 'Sắp xếp', - 'common.action': 'Hành động', - 'common.edit': 'Chỉnh sửa', - 'common.delete': 'Xóa', - 'common.selectAll': 'Chọn tất cả', - 'common.deselectAll': 'Bỏ chọn tất cả', - 'common.add': 'Thêm', - 'common.perPage': '{number}/trang', - 'common.firstPage': 'Trang đầu', - 'common.prevPage': 'Trang trước', - 'common.nextPage': 'Trang sau', - 'common.totalRecords': 'Tổng cộng {number} bản ghi', - 'common.addProvider': 'Thêm nhà cung cấp', - 'common.success': 'Thành công', - 'common.editProvider': 'Chỉnh sửa nhà cung cấp', - 'common.updateSuccess': 'Cập nhật thành công', - 'common.addSuccess': 'Thêm thành công', - 'common.deleteSuccess': 'Xóa thành công', - 'common.deleteFailure': 'Xóa thất bại, vui lòng thử lại', - 'common.deleteCancelled': 'Đã hủy xóa', - 'common.warning': 'Cảnh báo', - 'common.tip': 'Mẹo', - 'common.confirm': 'Xác nhận', - 'common.cancel': 'Hủy bỏ', - 'common.sensitive': 'Nhạy cảm', - 'common.loading': 'Đang tải', + // Common Text + 'common.all': 'Tất cả', + 'common.search': 'Tìm kiếm', + 'common.name': 'Tên', + 'common.sort': 'Sắp xếp', + 'common.action': 'Hành động', + 'common.edit': 'Chỉnh sửa', + 'common.delete': 'Xóa', + 'common.selectAll': 'Chọn tất cả', + 'common.deselectAll': 'Bỏ chọn tất cả', + 'common.add': 'Thêm', + 'common.perPage': '{number}/trang', + 'common.firstPage': 'Trang đầu', + 'common.prevPage': 'Trang trước', + 'common.nextPage': 'Trang sau', + 'common.totalRecords': 'Tổng cộng {number} bản ghi', + 'common.addProvider': 'Thêm nhà cung cấp', + 'common.success': 'Thành công', + 'common.editProvider': 'Chỉnh sửa nhà cung cấp', + 'common.updateSuccess': 'Cập nhật thành công', + 'common.addSuccess': 'Thêm thành công', + 'common.deleteSuccess': 'Xóa thành công', + 'common.deleteFailure': 'Xóa thất bại, vui lòng thử lại', + 'common.deleteCancelled': 'Đã hủy xóa', + 'common.warning': 'Cảnh báo', + 'common.tip': 'Mẹo', + 'common.confirm': 'Xác nhận', + 'common.cancel': 'Hủy bỏ', + 'common.sensitive': 'Nhạy cảm', + 'common.loading': 'Đang tải', - // Language switch - 'language.zhCN': '中文简体', - 'language.zhTW': '中文繁體', - 'language.en': 'English', - 'language.de': 'Deutsch', - 'language.vi': 'Tiếng Việt', + // Language switch + 'language.zhCN': '中文简体', + 'language.zhTW': '中文繁體', + 'language.en': 'English', + 'language.de': 'Deutsch', + 'language.vi': 'Tiếng Việt', - // Home page text - 'home.addAgent': 'Thêm tác nhân', - 'home.greeting': 'Xin chào XiaoZhi', - 'home.wish': 'Chúc bạn một ngày tuyệt vời!', - 'home.languageModel': 'LLM', - 'home.voiceModel': 'TTS', - 'home.configureRole': 'Vai trò', - 'home.voiceprintRecognition': 'Giọng nói', - 'home.deviceManagement': 'Thiết bị', - 'home.chatHistory': 'Lịch sử', - 'home.lastConversation': 'Cuộc trò chuyện cuối', - 'home.noConversation': 'Không có cuộc trò chuyện', - 'home.justNow': 'Vừa xong', - 'home.minutesAgo': '{minutes} phút trước', - 'home.hoursAgo': '{hours} giờ {minutes} phút trước', - 'home.confirmDeleteAgent': 'Bạn có chắc chắn muốn xóa tác nhân này?', - 'home.deleteSuccess': 'Xóa thành công', - 'home.deleteFailed': 'Xóa thất bại', - 'home.enableMemory': 'Vui lòng bật bộ nhớ trong trang \"Cấu hình vai trò\" trước', + // Home page text + 'home.addAgent': 'Thêm tác nhân', + 'home.greeting': 'Xin chào XiaoZhi', + 'home.wish': 'Chúc bạn một ngày tuyệt vời!', + 'home.languageModel': 'LLM', + 'home.voiceModel': 'TTS', + 'home.configureRole': 'Vai trò', + 'home.voiceprintRecognition': 'Giọng nói', + 'home.deviceManagement': 'Thiết bị', + 'home.chatHistory': 'Lịch sử', + 'home.lastConversation': 'Cuộc trò chuyện cuối', + 'home.noConversation': 'Không có cuộc trò chuyện', + 'home.justNow': 'Vừa xong', + 'home.minutesAgo': '{minutes} phút trước', + 'home.hoursAgo': '{hours} giờ {minutes} phút trước', + 'home.confirmDeleteAgent': 'Bạn có chắc chắn muốn xóa tác nhân này?', + 'home.deleteSuccess': 'Xóa thành công', + 'home.deleteFailed': 'Xóa thất bại', + 'home.enableMemory': 'Vui lòng bật bộ nhớ trong trang \"Cấu hình vai trò\" trước', - // Parameter management page text - 'paramManagement.pageTitle': 'Quản lý tham số', - 'paramManagement.searchPlaceholder': 'Vui lòng nhập mã tham số hoặc ghi chú để tìm kiếm', - 'paramManagement.search': 'Tìm kiếm', - 'paramManagement.paramCode': 'Mã tham số', - 'paramManagement.paramValue': 'Giá trị tham số', - 'paramManagement.remark': 'Ghi chú', - 'paramManagement.operation': 'Thao tác', - 'paramManagement.hide': 'Ẩn', - 'paramManagement.view': 'Xem', - 'paramManagement.deselectAll': 'Bỏ chọn tất cả', - 'paramManagement.selectAll': 'Chọn tất cả', - 'paramManagement.add': 'Thêm', - 'paramManagement.delete': 'Xóa', - 'paramManagement.edit': 'Chỉnh sửa', - 'paramManagement.itemsPerPage': 'mục/trang', - 'paramManagement.firstPage': 'Trang đầu', - 'paramManagement.prevPage': 'Trang trước', - 'paramManagement.nextPage': 'Trang sau', - 'paramManagement.totalRecords': 'Tổng cộng {total} bản ghi', - 'paramManagement.addParam': 'Thêm tham số', - 'paramManagement.editParam': 'Chỉnh sửa tham số', - 'paramManagement.getParamsListFailed': 'Không thể lấy danh sách tham số', - 'paramManagement.selectParamsFirst': 'Vui lòng chọn tham số để xóa trước', - 'paramManagement.confirmBatchDelete': 'Bạn có chắc chắn muốn xóa {paramCount} tham số đã chọn?', - 'paramManagement.invalidParamId': 'Có ID tham số không hợp lệ', - 'paramManagement.batchDeleteSuccess': 'Đã xóa thành công {paramCount} tham số', - 'paramManagement.deleteFailed': 'Xóa thất bại, vui lòng thử lại', - 'paramManagement.operationCancelled': 'Đã hủy xóa', - 'paramManagement.operationClosed': 'Đã đóng thao tác', - 'paramManagement.updateSuccess': 'Cập nhật thành công', - 'paramManagement.addSuccess': 'Thêm thành công', - 'paramManagement.updateFailed': 'Cập nhật thất bại', - 'paramManagement.addFailed': 'Thêm thất bại', + // Parameter management page text + 'paramManagement.pageTitle': 'Quản lý tham số', + 'paramManagement.searchPlaceholder': 'Vui lòng nhập mã tham số hoặc ghi chú để tìm kiếm', + 'paramManagement.search': 'Tìm kiếm', + 'paramManagement.paramCode': 'Mã tham số', + 'paramManagement.paramValue': 'Giá trị tham số', + 'paramManagement.remark': 'Ghi chú', + 'paramManagement.operation': 'Thao tác', + 'paramManagement.hide': 'Ẩn', + 'paramManagement.view': 'Xem', + 'paramManagement.deselectAll': 'Bỏ chọn tất cả', + 'paramManagement.selectAll': 'Chọn tất cả', + 'paramManagement.add': 'Thêm', + 'paramManagement.delete': 'Xóa', + 'paramManagement.edit': 'Chỉnh sửa', + 'paramManagement.itemsPerPage': 'mục/trang', + 'paramManagement.firstPage': 'Trang đầu', + 'paramManagement.prevPage': 'Trang trước', + 'paramManagement.nextPage': 'Trang sau', + 'paramManagement.totalRecords': 'Tổng cộng {total} bản ghi', + 'paramManagement.addParam': 'Thêm tham số', + 'paramManagement.editParam': 'Chỉnh sửa tham số', + 'paramManagement.getParamsListFailed': 'Không thể lấy danh sách tham số', + 'paramManagement.selectParamsFirst': 'Vui lòng chọn tham số để xóa trước', + 'paramManagement.confirmBatchDelete': 'Bạn có chắc chắn muốn xóa {paramCount} tham số đã chọn?', + 'paramManagement.invalidParamId': 'Có ID tham số không hợp lệ', + 'paramManagement.batchDeleteSuccess': 'Đã xóa thành công {paramCount} tham số', + 'paramManagement.deleteFailed': 'Xóa thất bại, vui lòng thử lại', + 'paramManagement.operationCancelled': 'Đã hủy xóa', + 'paramManagement.operationClosed': 'Đã đóng thao tác', + 'paramManagement.updateSuccess': 'Cập nhật thành công', + 'paramManagement.addSuccess': 'Thêm thành công', + 'paramManagement.updateFailed': 'Cập nhật thất bại', + 'paramManagement.addFailed': 'Thêm thất bại', - // Server side management page text - 'serverSideManager.pageTitle': 'Quản lý máy chủ', - 'serverSideManager.wsAddress': 'Địa chỉ WS', - 'serverSideManager.operation': 'Thao tác', - 'serverSideManager.restart': 'Khởi động lại', - 'serverSideManager.updateConfig': 'Cập nhật cấu hình', - 'serverSideManager.restartServer': 'Khởi động lại máy chủ', - 'serverSideManager.updateConfigTitle': 'Cập nhật cấu hình', - 'serverSideManager.confirmRestart': 'Bạn có chắc chắn muốn khởi động lại máy chủ?', - 'serverSideManager.confirmUpdateConfig': 'Bạn có chắc chắn muốn cập nhật cấu hình?', - 'serverSideManager.loading': 'Đang tải...', - 'serverSideManager.getServerListFailed': 'Không thể lấy danh sách máy chủ', - 'serverSideManager.operationFailed': 'Thao tác thất bại', - 'serverSideManager.restartSuccess': 'Khởi động lại thành công', - 'serverSideManager.updateConfigSuccess': 'Cập nhật cấu hình thành công', + // Server side management page text + 'serverSideManager.pageTitle': 'Quản lý máy chủ', + 'serverSideManager.wsAddress': 'Địa chỉ WS', + 'serverSideManager.operation': 'Thao tác', + 'serverSideManager.restart': 'Khởi động lại', + 'serverSideManager.updateConfig': 'Cập nhật cấu hình', + 'serverSideManager.restartServer': 'Khởi động lại máy chủ', + 'serverSideManager.updateConfigTitle': 'Cập nhật cấu hình', + 'serverSideManager.confirmRestart': 'Bạn có chắc chắn muốn khởi động lại máy chủ?', + 'serverSideManager.confirmUpdateConfig': 'Bạn có chắc chắn muốn cập nhật cấu hình?', + 'serverSideManager.loading': 'Đang tải...', + 'serverSideManager.getServerListFailed': 'Không thể lấy danh sách máy chủ', + 'serverSideManager.operationFailed': 'Thao tác thất bại', + 'serverSideManager.restartSuccess': 'Khởi động lại thành công', + 'serverSideManager.updateConfigSuccess': 'Cập nhật cấu hình thành công', - // Add agent dialog text - 'addAgentDialog.title': 'Thêm tác nhân', - 'addAgentDialog.agentName': 'Tên tác nhân', - 'addAgentDialog.placeholder': 'Vui lòng nhập tên tác nhân..', - 'addAgentDialog.confirm': 'Xác nhận', - 'addAgentDialog.cancel': 'Hủy bỏ', - 'addAgentDialog.nameRequired': 'Vui lòng nhập tên tác nhân', - 'addAgentDialog.addSuccess': 'Thêm thành công', + // Add agent dialog text + 'addAgentDialog.title': 'Thêm tác nhân', + 'addAgentDialog.agentName': 'Tên tác nhân', + 'addAgentDialog.placeholder': 'Vui lòng nhập tên tác nhân..', + 'addAgentDialog.confirm': 'Xác nhận', + 'addAgentDialog.cancel': 'Hủy bỏ', + 'addAgentDialog.nameRequired': 'Vui lòng nhập tên tác nhân', + 'addAgentDialog.addSuccess': 'Thêm thành công', - // Role configuration page text - 'roleConfig.title': 'Vai trò', - 'roleConfig.restartNotice': 'Sau khi lưu cấu hình, bạn cần khởi động lại thiết bị để cấu hình mới có hiệu lực.', - 'roleConfig.saveConfig': 'Lưu cấu hình', - 'roleConfig.reset': 'Đặt lại', - 'roleConfig.agentName': 'Biệt danh', - 'roleConfig.roleTemplate': 'Mẫu', - 'roleConfig.roleIntroduction': 'Giới thiệu', - 'roleConfig.languageCode': 'Mã ngôn ngữ', - 'roleConfig.interactionLanguage': 'Ngôn ngữ tương tác', - 'roleConfig.vad': 'Phát hiện giọng nói', - 'roleConfig.asr': 'Nhận dạng giọng nói', - 'roleConfig.llm': 'Mô hình ngôn ngữ', - 'roleConfig.vllm': 'Mô hình thị giác', - 'roleConfig.tts': 'Văn bản thành giọng nói', - 'roleConfig.memoryHis': 'Bộ nhớ', - 'roleConfig.memory': 'Mô hình bộ nhớ', - 'roleConfig.intent': 'Nhận dạng ý định', - 'roleConfig.voiceType': 'Loại giọng nói', - 'roleConfig.pleaseEnterContent': 'Vui lòng nhập nội dung', - 'roleConfig.pleaseEnterLangCode': 'Vui lòng nhập mã ngôn ngữ, ví dụ: en_US', - 'roleConfig.pleaseEnterLangName': 'Vui lòng nhập ngôn ngữ tương tác, ví dụ: Tiếng Anh', - 'roleConfig.pleaseSelect': 'Vui lòng chọn', - 'roleConfig.editFunctions': 'Chỉnh sửa chức năng', - 'roleConfig.reportText': 'Chỉ văn bản', - 'roleConfig.reportTextVoice': 'VB&Giọng nói', - 'roleConfig.saveSuccess': 'Đã lưu cấu hình thành công', - 'roleConfig.saveFailed': 'Lưu cấu hình thất bại', - 'roleConfig.confirmReset': 'Bạn có chắc chắn muốn đặt lại cấu hình?', - 'roleConfig.resetSuccess': 'Cấu hình đã được đặt lại', - 'roleConfig.fetchTemplatesFailed': 'Không thể tải danh sách mẫu', - 'roleConfig.templateApplied': 'mẫu đã được áp dụng', - 'roleConfig.applyTemplateFailed': 'Áp dụng mẫu thất bại', - 'roleConfig.fetchConfigFailed': 'Không thể lấy cấu hình', - 'roleConfig.fetchModelsFailed': 'Không thể tải danh sách mô hình', - 'roleConfig.fetchPluginsFailed': 'Không thể tải danh sách plugin', + // Role configuration page text + 'roleConfig.title': 'Vai trò', + 'roleConfig.restartNotice': 'Sau khi lưu cấu hình, bạn cần khởi động lại thiết bị để cấu hình mới có hiệu lực.', + 'roleConfig.saveConfig': 'Lưu cấu hình', + 'roleConfig.reset': 'Đặt lại', + 'roleConfig.agentName': 'Biệt danh', + 'roleConfig.roleTemplate': 'Mẫu', + 'roleConfig.roleIntroduction': 'Giới thiệu', + 'roleConfig.languageCode': 'Mã ngôn ngữ', + 'roleConfig.interactionLanguage': 'Ngôn ngữ tương tác', + 'roleConfig.vad': 'Phát hiện giọng nói', + 'roleConfig.asr': 'Nhận dạng giọng nói', + 'roleConfig.llm': 'Mô hình ngôn ngữ', + 'roleConfig.vllm': 'Mô hình thị giác', + 'roleConfig.tts': 'Văn bản thành giọng nói', + 'roleConfig.memoryHis': 'Bộ nhớ', + 'roleConfig.memory': 'Mô hình bộ nhớ', + 'roleConfig.intent': 'Nhận dạng ý định', + 'roleConfig.voiceType': 'Loại giọng nói', + 'roleConfig.pleaseEnterContent': 'Vui lòng nhập nội dung', + 'roleConfig.pleaseEnterLangCode': 'Vui lòng nhập mã ngôn ngữ, ví dụ: en_US', + 'roleConfig.pleaseEnterLangName': 'Vui lòng nhập ngôn ngữ tương tác, ví dụ: Tiếng Anh', + 'roleConfig.pleaseSelect': 'Vui lòng chọn', + 'roleConfig.editFunctions': 'Chỉnh sửa chức năng', + 'roleConfig.reportText': 'Chỉ văn bản', + 'roleConfig.reportTextVoice': 'VB&Giọng nói', + 'roleConfig.saveSuccess': 'Đã lưu cấu hình thành công', + 'roleConfig.saveFailed': 'Lưu cấu hình thất bại', + 'roleConfig.confirmReset': 'Bạn có chắc chắn muốn đặt lại cấu hình?', + 'roleConfig.resetSuccess': 'Cấu hình đã được đặt lại', + 'roleConfig.fetchTemplatesFailed': 'Không thể tải danh sách mẫu', + 'roleConfig.templateApplied': 'mẫu đã được áp dụng', + 'roleConfig.applyTemplateFailed': 'Áp dụng mẫu thất bại', + 'roleConfig.fetchConfigFailed': 'Không thể lấy cấu hình', + 'roleConfig.fetchModelsFailed': 'Không thể tải danh sách mô hình', + 'roleConfig.fetchPluginsFailed': 'Không thể tải danh sách plugin', - // Function management dialog text - 'functionDialog.title': 'Quản lý chức năng', - 'functionDialog.unselectedFunctions': 'Chức năng chưa chọn', - 'functionDialog.selectedFunctions': 'Chức năng đã chọn', - 'functionDialog.selectAll': 'Chọn tất cả', - 'functionDialog.noMorePlugins': 'Không còn plugin nào khác', - 'functionDialog.pleaseSelectPlugin': 'Vui lòng chọn chức năng plugin', - 'functionDialog.paramConfig': 'Cấu hình tham số', - 'functionDialog.noNeedToConfig': ' không yêu cầu cấu hình tham số', - 'functionDialog.pleaseSelectFunctionForParam': 'Vui lòng chọn một chức năng đã cấu hình để thiết lập tham số', - 'functionDialog.mcpAccessPoint': 'Điểm truy cập MCP', - 'functionDialog.mcpAddressDesc': 'Dưới đây là các địa chỉ điểm truy cập MCP cho tác nhân.', - 'functionDialog.howToDeployMcp': 'Cách triển khai điểm truy cập MCP', - 'functionDialog.howToIntegrateMcp': 'Cách tích hợp chức năng MCP', - 'functionDialog.copy': 'Sao chép', - 'functionDialog.accessPointStatus': 'Trạng thái điểm truy cập', - 'functionDialog.connected': 'Đã kết nối', - 'functionDialog.loading': 'Đang tải...', - 'functionDialog.disconnected': 'Đã ngắt kết nối', - 'functionDialog.refresh': 'Làm mới', - 'functionDialog.noAvailableTools': 'Không có công cụ khả dụng', - 'functionDialog.cancel': 'Hủy bỏ', - 'functionDialog.saveConfig': 'Lưu cấu hình', - 'functionDialog.copiedToClipboard': 'Đã sao chép vào clipboard', - 'functionDialog.copyFailed': 'Sao chép thất bại, vui lòng sao chép thủ công', - 'functionDialog.jsonFormatError': ' lỗi định dạng trường: định dạng JSON không hợp lệ', - 'functionDialog.defaultValue': 'Giá trị mặc định', + // Function management dialog text + 'functionDialog.title': 'Quản lý chức năng', + 'functionDialog.unselectedFunctions': 'Chức năng chưa chọn', + 'functionDialog.selectedFunctions': 'Chức năng đã chọn', + 'functionDialog.selectAll': 'Chọn tất cả', + 'functionDialog.noMorePlugins': 'Không còn plugin nào khác', + 'functionDialog.pleaseSelectPlugin': 'Vui lòng chọn chức năng plugin', + 'functionDialog.paramConfig': 'Cấu hình tham số', + 'functionDialog.noNeedToConfig': ' không yêu cầu cấu hình tham số', + 'functionDialog.pleaseSelectFunctionForParam': 'Vui lòng chọn một chức năng đã cấu hình để thiết lập tham số', + 'functionDialog.mcpAccessPoint': 'Điểm truy cập MCP', + 'functionDialog.mcpAddressDesc': 'Dưới đây là các địa chỉ điểm truy cập MCP cho tác nhân.', + 'functionDialog.howToDeployMcp': 'Cách triển khai điểm truy cập MCP', + 'functionDialog.howToIntegrateMcp': 'Cách tích hợp chức năng MCP', + 'functionDialog.copy': 'Sao chép', + 'functionDialog.accessPointStatus': 'Trạng thái điểm truy cập', + 'functionDialog.connected': 'Đã kết nối', + 'functionDialog.loading': 'Đang tải...', + 'functionDialog.disconnected': 'Đã ngắt kết nối', + 'functionDialog.refresh': 'Làm mới', + 'functionDialog.noAvailableTools': 'Không có công cụ khả dụng', + 'functionDialog.cancel': 'Hủy bỏ', + 'functionDialog.saveConfig': 'Lưu cấu hình', + 'functionDialog.copiedToClipboard': 'Đã sao chép vào clipboard', + 'functionDialog.copyFailed': 'Sao chép thất bại, vui lòng sao chép thủ công', + 'functionDialog.jsonFormatError': ' lỗi định dạng trường: định dạng JSON không hợp lệ', + 'functionDialog.defaultValue': 'Giá trị mặc định', - // Model Configuration Page Text - 'modelConfig.searchPlaceholder': 'Vui lòng nhập tên mô hình để tìm kiếm', - 'modelConfig.search': 'Tìm kiếm', - 'modelConfig.vad': 'Phát hiện hoạt động giọng nói', - 'modelConfig.asr': 'Nhận dạng giọng nói', - 'modelConfig.llm': 'Mô hình ngôn ngữ lớn', - 'modelConfig.vllm': 'Mô hình ngôn ngữ thị giác', - 'modelConfig.intent': 'Nhận dạng ý định', - 'modelConfig.tts': 'Văn bản thành giọng nói', - 'modelConfig.memory': 'Bộ nhớ', - 'modelConfig.rag': 'RAG', - 'modelConfig.modelId': 'ID mô hình', - 'modelConfig.modelName': 'Tên mô hình', - 'modelConfig.provider': 'Nhà cung cấp', - 'modelConfig.unknown': 'Không xác định', - 'modelConfig.isEnabled': 'Đã bật', - 'modelConfig.isDefault': 'Mặc định', - 'modelConfig.action': 'Hành động', - 'modelConfig.voiceManagement': 'Quản lý giọng nói', - 'modelConfig.edit': 'Chỉnh sửa', - 'modelConfig.duplicate': 'Nhân bản', - 'modelConfig.delete': 'Xóa', - 'modelConfig.deselectAll': 'Bỏ chọn tất cả', - 'modelConfig.select': 'Chọn', - 'modelConfig.selectAll': 'Chọn tất cả', - 'modelConfig.add': 'Thêm mới', - 'modelConfig.selectModelsFirst': 'Vui lòng chọn mô hình để xóa trước', - 'modelConfig.confirmBatchDelete': 'Bạn có chắc chắn muốn xóa các mô hình đã chọn?', - 'modelConfig.confirmDelete': 'Bạn có chắc chắn muốn xóa mô hình này?', - 'modelConfig.batchDeleteSuccess': 'Xóa hàng loạt thành công', - 'modelConfig.partialDeleteFailed': 'Xóa một phần thất bại', - 'modelConfig.deleteSuccess': 'Xóa thành công', - 'modelConfig.deleteFailed': 'Xóa thất bại', - 'modelConfig.deleteCancelled': 'Đã hủy xóa', - 'modelConfig.duplicateSuccess': 'Nhân bản thành công', - 'modelConfig.duplicateFailed': 'Nhân bản thất bại', - 'modelConfig.saveSuccess': 'Lưu thành công', - 'modelConfig.saveFailed': 'Lưu thất bại', - 'modelConfig.addSuccess': 'Thêm thành công', - 'modelConfig.addFailed': 'Thêm thất bại', - 'modelConfig.fetchModelsFailed': 'Không thể tải danh sách mô hình', - 'modelConfig.enableSuccess': 'Bật thành công', - 'modelConfig.disableSuccess': 'Tắt thành công', - 'modelConfig.operationFailed': 'Thao tác thất bại', - 'modelConfig.setDefaultSuccess': 'Đặt mô hình mặc định thành công', - 'modelConfig.itemsPerPage': '{items} mục/trang', - 'modelConfig.firstPage': 'Trang đầu', - 'modelConfig.prevPage': 'Trang trước', - 'modelConfig.nextPage': 'Trang sau', - 'modelConfig.totalRecords': 'Tổng cộng {total} bản ghi', - 'modelConfig.loading': 'Đang tải...', + // Model Configuration Page Text + 'modelConfig.searchPlaceholder': 'Vui lòng nhập tên mô hình để tìm kiếm', + 'modelConfig.search': 'Tìm kiếm', + 'modelConfig.vad': 'Phát hiện hoạt động giọng nói', + 'modelConfig.asr': 'Nhận dạng giọng nói', + 'modelConfig.llm': 'Mô hình ngôn ngữ lớn', + 'modelConfig.vllm': 'Mô hình ngôn ngữ thị giác', + 'modelConfig.intent': 'Nhận dạng ý định', + 'modelConfig.tts': 'Văn bản thành giọng nói', + 'modelConfig.memory': 'Bộ nhớ', + 'modelConfig.rag': 'RAG', + 'modelConfig.modelId': 'ID mô hình', + 'modelConfig.modelName': 'Tên mô hình', + 'modelConfig.provider': 'Nhà cung cấp', + 'modelConfig.unknown': 'Không xác định', + 'modelConfig.isEnabled': 'Đã bật', + 'modelConfig.isDefault': 'Mặc định', + 'modelConfig.action': 'Hành động', + 'modelConfig.voiceManagement': 'Quản lý giọng nói', + 'modelConfig.edit': 'Chỉnh sửa', + 'modelConfig.duplicate': 'Nhân bản', + 'modelConfig.delete': 'Xóa', + 'modelConfig.deselectAll': 'Bỏ chọn tất cả', + 'modelConfig.select': 'Chọn', + 'modelConfig.selectAll': 'Chọn tất cả', + 'modelConfig.add': 'Thêm mới', + 'modelConfig.selectModelsFirst': 'Vui lòng chọn mô hình để xóa trước', + 'modelConfig.confirmBatchDelete': 'Bạn có chắc chắn muốn xóa các mô hình đã chọn?', + 'modelConfig.confirmDelete': 'Bạn có chắc chắn muốn xóa mô hình này?', + 'modelConfig.batchDeleteSuccess': 'Xóa hàng loạt thành công', + 'modelConfig.partialDeleteFailed': 'Xóa một phần thất bại', + 'modelConfig.deleteSuccess': 'Xóa thành công', + 'modelConfig.deleteFailed': 'Xóa thất bại', + 'modelConfig.deleteCancelled': 'Đã hủy xóa', + 'modelConfig.duplicateSuccess': 'Nhân bản thành công', + 'modelConfig.duplicateFailed': 'Nhân bản thất bại', + 'modelConfig.saveSuccess': 'Lưu thành công', + 'modelConfig.saveFailed': 'Lưu thất bại', + 'modelConfig.addSuccess': 'Thêm thành công', + 'modelConfig.addFailed': 'Thêm thất bại', + 'modelConfig.fetchModelsFailed': 'Không thể tải danh sách mô hình', + 'modelConfig.enableSuccess': 'Bật thành công', + 'modelConfig.disableSuccess': 'Tắt thành công', + 'modelConfig.operationFailed': 'Thao tác thất bại', + 'modelConfig.setDefaultSuccess': 'Đặt mô hình mặc định thành công', + 'modelConfig.itemsPerPage': '{items} mục/trang', + 'modelConfig.firstPage': 'Trang đầu', + 'modelConfig.prevPage': 'Trang trước', + 'modelConfig.nextPage': 'Trang sau', + 'modelConfig.totalRecords': 'Tổng cộng {total} bản ghi', + 'modelConfig.loading': 'Đang tải...', - // Model Configuration Dialog Text - 'modelConfigDialog.addModel': 'Thêm mô hình', - 'modelConfigDialog.editModel': 'Chỉnh sửa mô hình', - 'modelConfigDialog.duplicateModel': 'Nhân bản mô hình', - 'modelConfigDialog.copySuffix': '_bản_sao', - 'modelConfigDialog.modelInfo': 'Thông tin mô hình', - 'modelConfigDialog.enable': 'Bật', - 'modelConfigDialog.setDefault': 'Đặt làm mặc định', - 'modelConfigDialog.modelId': 'ID mô hình', - 'modelConfigDialog.enterModelId': 'Nếu không điền, sẽ được tạo tự động', - 'modelConfigDialog.modelName': 'Tên mô hình', - 'modelConfigDialog.enterModelName': 'Vui lòng nhập tên mô hình', - 'modelConfigDialog.modelCode': 'Mã mô hình', - 'modelConfigDialog.enterModelCode': 'Vui lòng nhập mã mô hình', - 'modelConfigDialog.supplier': 'Nhà cung cấp', - 'modelConfigDialog.selectSupplier': 'Vui lòng chọn', - 'modelConfigDialog.sortOrder': 'Thứ tự sắp xếp', - 'modelConfigDialog.enterSortOrder': 'Vui lòng nhập thứ tự sắp xếp', - 'modelConfigDialog.docLink': 'Liên kết tài liệu', - 'modelConfigDialog.enterDocLink': 'Vui lòng nhập liên kết tài liệu', - 'modelConfigDialog.remark': 'Ghi chú', - 'modelConfigDialog.enterRemark': 'Vui lòng nhập ghi chú mô hình', - 'modelConfigDialog.callInfo': 'Thông tin gọi', - 'modelConfigDialog.enterJsonExample': 'Vui lòng nhập biến định dạng JSON (ví dụ:{\"key\":\"value\"})', - 'modelConfigDialog.save': 'Lưu', + // Model Configuration Dialog Text + 'modelConfigDialog.addModel': 'Thêm mô hình', + 'modelConfigDialog.editModel': 'Chỉnh sửa mô hình', + 'modelConfigDialog.duplicateModel': 'Nhân bản mô hình', + 'modelConfigDialog.copySuffix': '_bản_sao', + 'modelConfigDialog.modelInfo': 'Thông tin mô hình', + 'modelConfigDialog.enable': 'Bật', + 'modelConfigDialog.setDefault': 'Đặt làm mặc định', + 'modelConfigDialog.modelId': 'ID mô hình', + 'modelConfigDialog.enterModelId': 'Nếu không điền, sẽ được tạo tự động', + 'modelConfigDialog.invalidModelId': 'ID mô hình không thể chỉ là văn bản thuần túy hoặc khoảng trắng, vui lòng sử dụng chữ cái, số, dấu gạch dưới hoặc dấu gạch ngang', + 'modelConfigDialog.modelName': 'Tên mô hình', + 'modelConfigDialog.enterModelName': 'Vui lòng nhập tên mô hình', + 'modelConfigDialog.modelCode': 'Mã mô hình', + 'modelConfigDialog.enterModelCode': 'Vui lòng nhập mã mô hình', + 'modelConfigDialog.supplier': 'Nhà cung cấp', + 'modelConfigDialog.selectSupplier': 'Vui lòng chọn', + 'modelConfigDialog.sortOrder': 'Thứ tự sắp xếp', + 'modelConfigDialog.enterSortOrder': 'Vui lòng nhập thứ tự sắp xếp', + 'modelConfigDialog.docLink': 'Liên kết tài liệu', + 'modelConfigDialog.enterDocLink': 'Vui lòng nhập liên kết tài liệu', + 'modelConfigDialog.remark': 'Ghi chú', + 'modelConfigDialog.enterRemark': 'Vui lòng nhập ghi chú mô hình', + 'modelConfigDialog.callInfo': 'Thông tin gọi', + 'modelConfigDialog.enterJsonExample': 'Vui lòng nhập biến định dạng JSON (ví dụ:{\"key\":\"value\"})', + 'modelConfigDialog.save': 'Lưu', - // TTS Model Configuration Text - 'ttsModel.select': 'Chọn', - 'ttsModel.voiceCode': 'Mã giọng nói', - 'ttsModel.voiceName': 'Tên giọng nói', - 'ttsModel.languageType': 'Loại ngôn ngữ', - 'ttsModel.preview': 'Xem trước', - 'ttsModel.enterMp3Url': 'Vui lòng nhập URL MP3', - 'ttsModel.remark': 'Ghi chú', - 'ttsModel.enterRemark': 'Đây là ghi chú', - 'ttsModel.referenceAudioPath': 'Đường dẫn âm thanh tham chiếu', - 'ttsModel.enterReferenceAudio': 'Đây là đường dẫn âm thanh tham chiếu', - 'ttsModel.referenceText': 'Văn bản âm thanh tham chiếu', - 'ttsModel.enterReferenceText': 'Đây là Chỉ Văn bản cho âm thanh tham chiếu', - 'ttsModel.action': 'Hành động', - 'ttsModel.operation': 'Thao tác', - 'ttsModel.operationFailed': 'Thao tác thất bại', - 'ttsModel.operationClosed': 'Đã đóng thao tác', - 'ttsModel.edit': 'Chỉnh sửa', - 'ttsModel.delete': 'Xóa', - 'ttsModel.deleteVoiceSuccess': 'Đã xóa thành công {count} giọng nói', - 'ttsModel.deleteFailed': 'Xóa giọng nói thất bại', - 'ttsModel.save': 'Lưu', - 'ttsModel.deselectAll': 'Bỏ chọn tất cả', - 'ttsModel.selectAll': 'Chọn tất cả', - 'ttsModel.add': 'Thêm', - 'ttsModel.fetchVoicesFailed': 'Không thể tải danh sách giọng nói', - 'ttsModel.loadVoicesFailed': 'Không thể tải dữ liệu giọng nói', - 'ttsModel.unnamedVoice': 'Giọng nói không tên', - 'ttsModel.finishEditingFirst': 'Vui lòng hoàn tất chỉnh sửa hiện tại trước', - 'ttsModel.selectVoiceToDelete': 'Vui lòng chọn giọng nói để xóa', - 'ttsModel.warning': 'Cảnh báo', - 'ttsModel.confirmDeleteVoice': 'Bạn có chắc chắn muốn xóa {count} giọng nói?', + // TTS Model Configuration Text + 'ttsModel.select': 'Chọn', + 'ttsModel.voiceCode': 'Mã giọng nói', + 'ttsModel.voiceName': 'Tên giọng nói', + 'ttsModel.languageType': 'Loại ngôn ngữ', + 'ttsModel.preview': 'Xem trước', + 'ttsModel.enterMp3Url': 'Vui lòng nhập URL MP3', + 'ttsModel.remark': 'Ghi chú', + 'ttsModel.enterRemark': 'Đây là ghi chú', + 'ttsModel.referenceAudioPath': 'Đường dẫn âm thanh tham chiếu', + 'ttsModel.enterReferenceAudio': 'Đây là đường dẫn âm thanh tham chiếu', + 'ttsModel.referenceText': 'Văn bản âm thanh tham chiếu', + 'ttsModel.enterReferenceText': 'Đây là Chỉ Văn bản cho âm thanh tham chiếu', + 'ttsModel.action': 'Hành động', + 'ttsModel.operation': 'Thao tác', + 'ttsModel.operationFailed': 'Thao tác thất bại', + 'ttsModel.operationClosed': 'Đã đóng thao tác', + 'ttsModel.edit': 'Chỉnh sửa', + 'ttsModel.delete': 'Xóa', + 'ttsModel.deleteVoiceSuccess': 'Đã xóa thành công {count} giọng nói', + 'ttsModel.deleteFailed': 'Xóa giọng nói thất bại', + 'ttsModel.save': 'Lưu', + 'ttsModel.deselectAll': 'Bỏ chọn tất cả', + 'ttsModel.selectAll': 'Chọn tất cả', + 'ttsModel.add': 'Thêm', + 'ttsModel.fetchVoicesFailed': 'Không thể tải danh sách giọng nói', + 'ttsModel.loadVoicesFailed': 'Không thể tải dữ liệu giọng nói', + 'ttsModel.unnamedVoice': 'Giọng nói không tên', + 'ttsModel.finishEditingFirst': 'Vui lòng hoàn tất chỉnh sửa hiện tại trước', + 'ttsModel.selectVoiceToDelete': 'Vui lòng chọn giọng nói để xóa', + 'ttsModel.warning': 'Cảnh báo', + 'ttsModel.confirmDeleteVoice': 'Bạn có chắc chắn muốn xóa {count} giọng nói?', - // OTA Management Page Text - 'otaManagement.firmwareManagement': 'Quản lý firmware', - 'otaManagement.searchPlaceholder': 'Vui lòng nhập tên firmware để tìm kiếm', - 'otaManagement.search': 'Tìm kiếm', - 'otaManagement.firmwareName': 'Tên firmware', - 'otaManagement.firmwareType': 'Loại firmware', - 'otaManagement.version': 'Phiên bản', - 'otaManagement.fileSize': 'Kích thước tệp', - 'otaManagement.remark': 'Ghi chú', - 'otaManagement.createTime': 'Thời gian tạo', - 'otaManagement.updateTime': 'Thời gian cập nhật', - 'otaManagement.action': 'Hành động', - 'otaManagement.download': 'Tải xuống', - 'otaManagement.edit': 'Chỉnh sửa', - 'otaManagement.delete': 'Xóa', - 'otaManagement.selectAll': 'Chọn tất cả', - 'otaManagement.deselectAll': 'Bỏ chọn tất cả', - 'otaManagement.addNew': 'Thêm mới', - 'otaManagement.addFirmware': 'Thêm firmware', - 'otaManagement.editFirmware': 'Chỉnh sửa firmware', - 'otaManagement.itemsPerPage': '{items} mục/trang', - 'otaManagement.firstPage': 'Trang đầu', - 'otaManagement.prevPage': 'Trang trước', - 'otaManagement.nextPage': 'Trang sau', - 'otaManagement.totalRecords': 'Tổng cộng {total} bản ghi', - 'otaManagement.selectFirmwareFirst': 'Vui lòng chọn firmware để xóa trước', - 'otaManagement.confirmBatchDelete': 'Bạn có chắc chắn muốn xóa {paramCount} firmware đã chọn?', - 'otaManagement.operationCancelled': 'Đã hủy thao tác xóa', - 'otaManagement.operationClosed': 'Đã đóng thao tác', - 'otaManagement.batchDeleteSuccess': 'Đã xóa thành công {paramCount} firmware', - 'otaManagement.deleteFailed': 'Xóa thất bại, vui lòng thử lại', - 'otaManagement.incompleteFirmwareInfo': 'Thông tin firmware không đầy đủ', - 'otaManagement.getDownloadUrlFailed': 'Không thể lấy liên kết tải xuống', - 'otaManagement.getFirmwareTypesFailed': 'Không thể lấy loại firmware', - 'otaManagement.updateSuccess': 'Cập nhật thành công', - 'otaManagement.updateFailed': 'Cập nhật thất bại', - 'otaManagement.addSuccess': 'Thêm thành công', - 'otaManagement.addFailed': 'Thêm thất bại', - 'otaManagement.fetchFirmwareListFailed': 'Không thể tải danh sách firmware', + // OTA Management Page Text + 'otaManagement.firmwareManagement': 'Quản lý firmware', + 'otaManagement.searchPlaceholder': 'Vui lòng nhập tên firmware để tìm kiếm', + 'otaManagement.search': 'Tìm kiếm', + 'otaManagement.firmwareName': 'Tên firmware', + 'otaManagement.firmwareType': 'Loại firmware', + 'otaManagement.version': 'Phiên bản', + 'otaManagement.fileSize': 'Kích thước tệp', + 'otaManagement.remark': 'Ghi chú', + 'otaManagement.createTime': 'Thời gian tạo', + 'otaManagement.updateTime': 'Thời gian cập nhật', + 'otaManagement.action': 'Hành động', + 'otaManagement.download': 'Tải xuống', + 'otaManagement.edit': 'Chỉnh sửa', + 'otaManagement.delete': 'Xóa', + 'otaManagement.selectAll': 'Chọn tất cả', + 'otaManagement.deselectAll': 'Bỏ chọn tất cả', + 'otaManagement.addNew': 'Thêm mới', + 'otaManagement.addFirmware': 'Thêm firmware', + 'otaManagement.editFirmware': 'Chỉnh sửa firmware', + 'otaManagement.itemsPerPage': '{items} mục/trang', + 'otaManagement.firstPage': 'Trang đầu', + 'otaManagement.prevPage': 'Trang trước', + 'otaManagement.nextPage': 'Trang sau', + 'otaManagement.totalRecords': 'Tổng cộng {total} bản ghi', + 'otaManagement.selectFirmwareFirst': 'Vui lòng chọn firmware để xóa trước', + 'otaManagement.confirmBatchDelete': 'Bạn có chắc chắn muốn xóa {paramCount} firmware đã chọn?', + 'otaManagement.operationCancelled': 'Đã hủy thao tác xóa', + 'otaManagement.operationClosed': 'Đã đóng thao tác', + 'otaManagement.batchDeleteSuccess': 'Đã xóa thành công {paramCount} firmware', + 'otaManagement.deleteFailed': 'Xóa thất bại, vui lòng thử lại', + 'otaManagement.incompleteFirmwareInfo': 'Thông tin firmware không đầy đủ', + 'otaManagement.getDownloadUrlFailed': 'Không thể lấy liên kết tải xuống', + 'otaManagement.getFirmwareTypesFailed': 'Không thể lấy loại firmware', + 'otaManagement.updateSuccess': 'Cập nhật thành công', + 'otaManagement.updateFailed': 'Cập nhật thất bại', + 'otaManagement.addSuccess': 'Thêm thành công', + 'otaManagement.addFailed': 'Thêm thất bại', + 'otaManagement.fetchFirmwareListFailed': 'Không thể tải danh sách firmware', - // Provider Management page model type translations - 'providerManagement.all': 'Tất cả', - 'providerManagement.modelType.ASR': 'Nhận dạng giọng nói', - 'providerManagement.modelType.TTS': 'Văn bản thành giọng nói', - 'providerManagement.modelType.LLM': 'Mô hình ngôn ngữ lớn', - 'providerManagement.modelType.VLLM': 'Mô hình ngôn ngữ thị giác lớn', - 'providerManagement.modelType.Intent': 'Nhận dạng ý định', - 'providerManagement.modelType.Memory': 'Mô-đun bộ nhớ', - 'providerManagement.modelType.VAD': 'Phát hiện hoạt động giọng nói', - 'providerManagement.modelType.Plugin': 'Công cụ plugin', - 'providerManagement.modelType.RAG': 'RAG', + // Provider Management page model type translations + 'providerManagement.all': 'Tất cả', + 'providerManagement.modelType.ASR': 'Nhận dạng giọng nói', + 'providerManagement.modelType.TTS': 'Văn bản thành giọng nói', + 'providerManagement.modelType.LLM': 'Mô hình ngôn ngữ lớn', + 'providerManagement.modelType.VLLM': 'Mô hình ngôn ngữ thị giác lớn', + 'providerManagement.modelType.Intent': 'Nhận dạng ý định', + 'providerManagement.modelType.Memory': 'Mô-đun bộ nhớ', + 'providerManagement.modelType.VAD': 'Phát hiện hoạt động giọng nói', + 'providerManagement.modelType.Plugin': 'Công cụ plugin', + 'providerManagement.modelType.RAG': 'RAG', - // Provider Dialog translations - 'providerDialog.category': 'Danh mục', - 'providerDialog.selectCategory': 'Vui lòng chọn danh mục', - 'providerDialog.code': 'Mã', - 'providerDialog.inputCode': 'Vui lòng nhập mã nhà cung cấp', - 'providerDialog.name': 'Tên', - 'providerDialog.inputName': 'Vui lòng nhập tên nhà cung cấp', - 'providerDialog.sort': 'Sắp xếp', - 'providerDialog.fieldConfig': 'Cấu hình trường', - 'providerDialog.add': 'Thêm', - 'providerDialog.deselectAll': 'Bỏ chọn tất cả', - 'providerDialog.selectAll': 'Chọn tất cả', - 'providerDialog.batchDelete': 'Xóa hàng loạt', - 'providerDialog.fieldKey': 'Khóa trường', - 'providerDialog.fieldLabel': 'Nhãn trường', - 'providerDialog.fieldType': 'Loại trường', - 'providerDialog.type': 'Loại', - 'providerDialog.stringType': 'Chuỗi', - 'providerDialog.numberType': 'Số', - 'providerDialog.booleanType': 'Boolean', - 'providerDialog.dictType': 'Từ điển', - 'providerDialog.arrayType': 'Danh sách phân cách bằng dấu chấm phẩy', - 'providerDialog.ragType': 'RAG', - 'providerDialog.defaultValue': 'Giá trị mặc định', - 'providerDialog.inputDefaultValue': 'Vui lòng nhập giá trị mặc định', - 'providerDialog.operation': 'Thao tác', - 'providerDialog.edit': 'Chỉnh sửa', - 'providerDialog.complete': 'Hoàn tất', - 'providerDialog.delete': 'Xóa', - 'providerDialog.save': 'Lưu', - 'providerDialog.requiredCategory': 'Vui lòng chọn danh mục', - 'providerDialog.requiredCode': 'Vui lòng nhập mã nhà cung cấp', - 'providerDialog.requiredName': 'Vui lòng nhập tên nhà cung cấp', - 'providerDialog.completeFieldEdit': 'Vui lòng hoàn tất chỉnh sửa trường hiện tại trước', - 'providerDialog.confirmDeleteField': 'Bạn có chắc chắn muốn xóa trường này?', - 'providerDialog.selectFieldsToDelete': 'Vui lòng chọn trường để xóa trước', - 'providerDialog.confirmBatchDeleteFields': 'Bạn có chắc chắn muốn xóa {count} trường đã chọn?', - 'providerDialog.batchDeleteFieldsSuccess': 'Đã xóa thành công {count} trường', + // Provider Dialog translations + 'providerDialog.category': 'Danh mục', + 'providerDialog.selectCategory': 'Vui lòng chọn danh mục', + 'providerDialog.code': 'Mã', + 'providerDialog.inputCode': 'Vui lòng nhập mã nhà cung cấp', + 'providerDialog.name': 'Tên', + 'providerDialog.inputName': 'Vui lòng nhập tên nhà cung cấp', + 'providerDialog.sort': 'Sắp xếp', + 'providerDialog.fieldConfig': 'Cấu hình trường', + 'providerDialog.add': 'Thêm', + 'providerDialog.deselectAll': 'Bỏ chọn tất cả', + 'providerDialog.selectAll': 'Chọn tất cả', + 'providerDialog.batchDelete': 'Xóa hàng loạt', + 'providerDialog.fieldKey': 'Khóa trường', + 'providerDialog.fieldLabel': 'Nhãn trường', + 'providerDialog.fieldType': 'Loại trường', + 'providerDialog.type': 'Loại', + 'providerDialog.stringType': 'Chuỗi', + 'providerDialog.numberType': 'Số', + 'providerDialog.booleanType': 'Boolean', + 'providerDialog.dictType': 'Từ điển', + 'providerDialog.arrayType': 'Danh sách phân cách bằng dấu chấm phẩy', + 'providerDialog.ragType': 'RAG', + 'providerDialog.defaultValue': 'Giá trị mặc định', + 'providerDialog.inputDefaultValue': 'Vui lòng nhập giá trị mặc định', + 'providerDialog.operation': 'Thao tác', + 'providerDialog.edit': 'Chỉnh sửa', + 'providerDialog.complete': 'Hoàn tất', + 'providerDialog.delete': 'Xóa', + 'providerDialog.save': 'Lưu', + 'providerDialog.requiredCategory': 'Vui lòng chọn danh mục', + 'providerDialog.requiredCode': 'Vui lòng nhập mã nhà cung cấp', + 'providerDialog.requiredName': 'Vui lòng nhập tên nhà cung cấp', + 'providerDialog.completeFieldEdit': 'Vui lòng hoàn tất chỉnh sửa trường hiện tại trước', + 'providerDialog.confirmDeleteField': 'Bạn có chắc chắn muốn xóa trường này?', + 'providerDialog.selectFieldsToDelete': 'Vui lòng chọn trường để xóa trước', + 'providerDialog.confirmBatchDeleteFields': 'Bạn có chắc chắn muốn xóa {count} trường đã chọn?', + 'providerDialog.batchDeleteFieldsSuccess': 'Đã xóa thành công {count} trường', - // agentTemplateManagement - 'agentTemplateManagement.title': 'Quản lý vai trò mặc định', - 'agentTemplateManagement.templateName': 'Tên mẫu', - 'agentTemplateManagement.action': 'Hành động', - 'agentTemplateManagement.createTemplate': 'Tạo mẫu', - 'templateQuickConfig.newTemplate': 'Mẫu mới', - 'agentTemplateManagement.editTemplate': 'Chỉnh sửa mẫu', - 'agentTemplateManagement.deleteTemplate': 'Xóa mẫu', - 'agentTemplateManagement.deleteSuccess': 'Đã xóa mẫu thành công', - 'agentTemplateManagement.batchDelete': 'Xóa hàng loạt', - 'agentTemplateManagement.batchDeleteSuccess': 'Xóa hàng loạt thành công', - 'agentTemplateManagement.selectTemplate': 'Vui lòng chọn một mẫu', - 'agentTemplateManagement.select': 'Chọn', - 'agentTemplateManagement.searchPlaceholder': 'Vui lòng nhập tên mẫu để tìm kiếm', - 'agentTemplateManagement.search': 'Tìm kiếm', - 'agentTemplateManagement.serialNumber': 'Số sê-ri', - 'agentTemplateManagement.selectAll': 'Chọn tất cả', - 'agentTemplateManagement.deselectAll': 'Bỏ chọn tất cả', - 'agentTemplateManagement.loading': 'Đang tải...', - 'agentTemplateManagement.confirmSingleDelete': 'Bạn có chắc chắn muốn xóa mẫu này?', - 'agentTemplateManagement.confirmBatchDelete': 'Bạn có chắc chắn muốn xóa {count} mẫu đã chọn?', - 'agentTemplateManagement.deleteFailed': 'Xóa mẫu thất bại', - 'agentTemplateManagement.batchDeleteFailed': 'Xóa hàng loạt mẫu thất bại', - 'agentTemplateManagement.deleteBackendError': 'Xóa thất bại, vui lòng kiểm tra xem dịch vụ backend có bình thường không', + // agentTemplateManagement + 'agentTemplateManagement.title': 'Quản lý vai trò mặc định', + 'agentTemplateManagement.templateName': 'Tên mẫu', + 'agentTemplateManagement.action': 'Hành động', + 'agentTemplateManagement.createTemplate': 'Tạo mẫu', + 'templateQuickConfig.newTemplate': 'Mẫu mới', + 'agentTemplateManagement.editTemplate': 'Chỉnh sửa mẫu', + 'agentTemplateManagement.deleteTemplate': 'Xóa mẫu', + 'agentTemplateManagement.deleteSuccess': 'Đã xóa mẫu thành công', + 'agentTemplateManagement.batchDelete': 'Xóa hàng loạt', + 'agentTemplateManagement.batchDeleteSuccess': 'Xóa hàng loạt thành công', + 'agentTemplateManagement.selectTemplate': 'Vui lòng chọn một mẫu', + 'agentTemplateManagement.select': 'Chọn', + 'agentTemplateManagement.searchPlaceholder': 'Vui lòng nhập tên mẫu để tìm kiếm', + 'agentTemplateManagement.search': 'Tìm kiếm', + 'agentTemplateManagement.serialNumber': 'Số sê-ri', + 'agentTemplateManagement.selectAll': 'Chọn tất cả', + 'agentTemplateManagement.deselectAll': 'Bỏ chọn tất cả', + 'agentTemplateManagement.loading': 'Đang tải...', + 'agentTemplateManagement.confirmSingleDelete': 'Bạn có chắc chắn muốn xóa mẫu này?', + 'agentTemplateManagement.confirmBatchDelete': 'Bạn có chắc chắn muốn xóa {count} mẫu đã chọn?', + 'agentTemplateManagement.deleteFailed': 'Xóa mẫu thất bại', + 'agentTemplateManagement.batchDeleteFailed': 'Xóa hàng loạt mẫu thất bại', + 'agentTemplateManagement.deleteBackendError': 'Xóa thất bại, vui lòng kiểm tra xem dịch vụ backend có bình thường không', - // templateQuickConfig - 'templateQuickConfig.title': 'Cấu hình nhanh mô-đun', - 'templateQuickConfig.agentSettings.agentName': 'Biệt danh', - 'templateQuickConfig.agentSettings.agentNamePlaceholder': 'Vui lòng nhập biệt danh', - 'templateQuickConfig.agentSettings.systemPrompt': 'Giới thiệu', - 'templateQuickConfig.agentSettings.systemPromptPlaceholder': 'Vui lòng nhập giới thiệu', - 'templateQuickConfig.saveConfig': 'Lưu cấu hình', - 'templateQuickConfig.resetConfig': 'Đặt lại cấu hình', - 'templateQuickConfig.saveSuccess': 'Lưu thành công', - 'templateQuickConfig.resetSuccess': 'Đặt lại thành công', - 'templateQuickConfig.confirmReset': 'Bạn có chắc chắn muốn đặt lại cấu hình?', - 'templateQuickConfig.saveFailed': 'Lưu cấu hình thất bại', - 'templateQuickConfig.confirm': 'Xác nhận', - 'templateQuickConfig.cancel': 'Hủy bỏ', - 'templateQuickConfig.templateNotFound': 'Không tìm thấy mẫu', - 'warning': 'Cảnh báo', - 'info': 'Thông tin', - 'common.networkError': 'Yêu cầu mạng thất bại', + // templateQuickConfig + 'templateQuickConfig.title': 'Cấu hình nhanh mô-đun', + 'templateQuickConfig.agentSettings.agentName': 'Biệt danh', + 'templateQuickConfig.agentSettings.agentNamePlaceholder': 'Vui lòng nhập biệt danh', + 'templateQuickConfig.agentSettings.systemPrompt': 'Giới thiệu', + 'templateQuickConfig.agentSettings.systemPromptPlaceholder': 'Vui lòng nhập giới thiệu', + 'templateQuickConfig.saveConfig': 'Lưu cấu hình', + 'templateQuickConfig.resetConfig': 'Đặt lại cấu hình', + 'templateQuickConfig.saveSuccess': 'Lưu thành công', + 'templateQuickConfig.resetSuccess': 'Đặt lại thành công', + 'templateQuickConfig.confirmReset': 'Bạn có chắc chắn muốn đặt lại cấu hình?', + 'templateQuickConfig.saveFailed': 'Lưu cấu hình thất bại', + 'templateQuickConfig.confirm': 'Xác nhận', + 'templateQuickConfig.cancel': 'Hủy bỏ', + 'templateQuickConfig.templateNotFound': 'Không tìm thấy mẫu', + 'warning': 'Cảnh báo', + 'info': 'Thông tin', + 'common.networkError': 'Yêu cầu mạng thất bại', - // SM2 Encryption - 'sm2.publicKeyNotConfigured': 'Khóa công khai SM2 chưa được cấu hình, vui lòng liên hệ quản trị viên', - 'sm2.encryptionFailed': 'Mã hóa mật khẩu thất bại', - 'sm2.keyGenerationFailed': 'Tạo cặp khóa thất bại', - 'sm2.invalidPublicKey': 'Định dạng khóa công khai không hợp lệ', - 'sm2.encryptionError': 'Đã xảy ra lỗi khi mã hóa', - 'sm2.publicKeyRetry': 'Đang thử lấy lại khóa công khai...', - 'sm2.publicKeyRetryFailed': 'Thử lấy lại khóa công khai thất bại', + // SM2 Encryption + 'sm2.publicKeyNotConfigured': 'Khóa công khai SM2 chưa được cấu hình, vui lòng liên hệ quản trị viên', + 'sm2.encryptionFailed': 'Mã hóa mật khẩu thất bại', + 'sm2.keyGenerationFailed': 'Tạo cặp khóa thất bại', + 'sm2.invalidPublicKey': 'Định dạng khóa công khai không hợp lệ', + 'sm2.encryptionError': 'Đã xảy ra lỗi khi mã hóa', + 'sm2.publicKeyRetry': 'Đang thử lấy lại khóa công khai...', + 'sm2.publicKeyRetryFailed': 'Thử lấy lại khóa công khai thất bại', - // Voice Clone and Resource Management - 'voiceClone.title': 'Nhân bản âm sắc', - 'voiceResource.title': 'Tài nguyên giọng nói', - 'voiceClone.platformName': 'Tên nền tảng', - 'voiceClone.voiceId': 'ID giọng nói', - 'voiceClone.userId': 'Chủ sở hữu tài khoản', - 'voiceClone.name': 'Tên giọng nói', - 'voiceClone.clone': 'Nhân bản', - 'voiceClone.action': 'Hành động', - 'voiceClone.modelId': 'ID mô hình', - 'voiceClone.trainStatus': 'Trạng thái đào tạo', - 'voiceClone.trainError': 'Lỗi đào tạo', - 'voiceClone.createdAt': 'Thời gian tạo', - 'voiceClone.search': 'Tìm kiếm', - 'voiceClone.searchPlaceholder': 'Vui lòng nhập tên giọng nói hoặc ID giọng nói', - 'voiceClone.addNew': 'Thêm', - 'voiceClone.delete': 'Xóa', - 'voiceClone.selectAll': 'Chọn tất cả', - 'voiceClone.deselectAll': 'Bỏ chọn tất cả', - 'voiceClone.addVoiceClone': 'Thêm tài nguyên giọng nói', - 'voiceClone.confirmDelete': 'Bạn có chắc chắn muốn xóa {count} tài nguyên giọng nói đã chọn?', - 'voiceClone.deleteSuccess': 'Đã xóa thành công {count} tài nguyên giọng nói', - 'voiceClone.deleteFailed': 'Xóa thất bại', - 'voiceClone.addSuccess': 'Thêm thành công', - 'voiceClone.addFailed': 'Thêm thất bại', - 'voiceClone.updateSuccess': 'Cập nhật thành công', - 'voiceClone.updateFailed': 'Cập nhật thất bại', - 'voiceClone.selectFirst': 'Vui lòng chọn tài nguyên giọng nói để xóa trước', - 'voiceClone.operationCancelled': 'Hủy bỏ', - 'voiceClone.operationClosed': 'Đã đóng popup', - 'voiceClone.cloneSuccess': 'Nhân bản thành công', - 'voiceClone.cloneFailed': 'Nhân bản thất bại', - 'voiceClone.confirmClone': 'Bạn có chắc chắn muốn nhân bản giọng này?', - 'voiceClone.onlySuccessCanClone': 'Chỉ có thể nhân bản giọng đã huấn luyện thành công', - 'common.insufficient': 'Không đủ', - 'voiceClone.platformNameRequired': 'Vui lòng chọn tên nền tảng', - 'voiceClone.voiceIdRequired': 'Vui lòng chọn ID giọng nói', - 'voiceClone.userIdRequired': 'Vui lòng chọn chủ sở hữu tài khoản', - 'voiceClone.platformNamePlaceholder': 'Vui lòng chọn tên nền tảng', - 'voiceClone.voiceIdPlaceholder': 'Vui lòng nhập ID giọng nói và nhấn Enter', - 'voiceClone.userIdPlaceholder': 'Vui lòng nhập từ khóa để chọn chủ sở hữu tài khoản', - 'voiceClone.waitingUpload': 'Đang chờ tải lên', - 'voiceClone.waitingTraining': 'Đang chờ nhân bản', - 'voiceClone.training': 'Đang huấn luyện', - 'voiceClone.trainSuccess': 'Huấn luyện thành công', - 'voiceClone.trainFailed': 'Huấn luyện thất bại', - 'voiceClone.itemsPerPage': '{items} mục mỗi trang', - 'voiceClone.firstPage': 'Trang đầu', - 'voiceClone.prevPage': 'Trang trước', - 'voiceClone.nextPage': 'Trang sau', - 'voiceClone.totalRecords': 'Tổng cộng {total} bản ghi', - 'voiceClone.noVoiceCloneAssigned': 'Tài khoản của bạn không được chỉ định tài nguyên giọng nói', - 'voiceClone.contactAdmin': 'Vui lòng liên hệ quản trị viên để được chỉ định tài nguyên giọng nói', - 'voiceClone.dialogTitle': 'Nhân bản âm sắc', - 'voiceClone.stepUpload': 'Chuẩn bị âm thanh', - 'voiceClone.stepEdit': 'Chỉnh sửa âm thanh', - 'voiceClone.dragOrClick': 'Kéo tệp âm thanh vào đây hoặc nhấp để tải lên', - 'voiceClone.uploadTip': 'Hỗ trợ tất cả các định dạng âm thanh chính, thời lượng được chọn phải từ 8-60 giây', - 'voiceClone.editTip1': 'Vui lòng xác nhận xem âm thanh đã tải lên có đạt yêu cầu không', - 'voiceClone.editTip2': 'Bạn có thể nghe và cắt âm thanh, nếu không hài lòng có thể quay lại để ghi âm lại hoặc tải lên lại', - 'voiceClone.selectedDuration': 'Đoạn hợp lệ đã chọn: {duration} giây', - 'voiceClone.trim': 'Cắt đoạn đã chọn', - 'voiceClone.reset': 'Đặt lại', - 'voiceClone.play': 'Phát', - 'voiceClone.pause': 'Tạm dừng', - 'voiceClone.stop': 'Dừng', - 'voiceClone.cancel': 'Hủy bỏ', - 'voiceClone.warning': 'Cảnh báo', - 'voiceClone.ok': 'OK', - 'voiceClone.nextStep': 'Tiếp theo', - 'voiceClone.prevStep': 'Trước', - 'voiceClone.upload': 'Tải lên âm thanh', - 'voiceClone.pleaseSelectAudio': 'Vui lòng chọn tệp âm thanh trước', - 'voiceClone.durationError': 'Thời lượng âm thanh phải từ 8-60 giây', - 'voiceClone.loadAudioFailed': 'Không thể tải âm thanh', - 'voiceClone.trimSuccess': 'Cắt thành công', - 'voiceClone.resetSuccess': 'Đặt lại thành công', - 'voiceClone.uploadSuccess': 'Tải lên thành công', - 'voiceClone.uploadFailed': 'Tải lên thất bại', - 'voiceClone.updateNameSuccess': 'Đã cập nhật tên thành công', - 'voiceClone.updateNameFailed': 'Không thể cập nhật tên', - 'voiceClone.playFailed': 'Phát thất bại', - 'voiceClone.Details': 'Chi tiết lỗi', + // Voice Clone and Resource Management + 'voiceClone.title': 'Nhân bản âm sắc', + 'voiceResource.title': 'Tài nguyên giọng nói', + 'voiceClone.platformName': 'Tên nền tảng', + 'voiceClone.voiceId': 'ID giọng nói', + 'voiceClone.userId': 'Chủ sở hữu tài khoản', + 'voiceClone.name': 'Tên giọng nói', + 'voiceClone.clone': 'Nhân bản', + 'voiceClone.action': 'Hành động', + 'voiceClone.modelId': 'ID mô hình', + 'voiceClone.trainStatus': 'Trạng thái đào tạo', + 'voiceClone.trainError': 'Lỗi đào tạo', + 'voiceClone.createdAt': 'Thời gian tạo', + 'voiceClone.search': 'Tìm kiếm', + 'voiceClone.searchPlaceholder': 'Vui lòng nhập tên giọng nói hoặc ID giọng nói', + 'voiceClone.addNew': 'Thêm', + 'voiceClone.delete': 'Xóa', + 'voiceClone.selectAll': 'Chọn tất cả', + 'voiceClone.deselectAll': 'Bỏ chọn tất cả', + 'voiceClone.addVoiceClone': 'Thêm tài nguyên giọng nói', + 'voiceClone.confirmDelete': 'Bạn có chắc chắn muốn xóa {count} tài nguyên giọng nói đã chọn?', + 'voiceClone.deleteSuccess': 'Đã xóa thành công {count} tài nguyên giọng nói', + 'voiceClone.deleteFailed': 'Xóa thất bại', + 'voiceClone.addSuccess': 'Thêm thành công', + 'voiceClone.addFailed': 'Thêm thất bại', + 'voiceClone.updateSuccess': 'Cập nhật thành công', + 'voiceClone.updateFailed': 'Cập nhật thất bại', + 'voiceClone.selectFirst': 'Vui lòng chọn tài nguyên giọng nói để xóa trước', + 'voiceClone.operationCancelled': 'Hủy bỏ', + 'voiceClone.operationClosed': 'Đã đóng popup', + 'voiceClone.cloneSuccess': 'Nhân bản thành công', + 'voiceClone.cloneFailed': 'Nhân bản thất bại', + 'voiceClone.confirmClone': 'Bạn có chắc chắn muốn nhân bản giọng này?', + 'voiceClone.onlySuccessCanClone': 'Chỉ có thể nhân bản giọng đã huấn luyện thành công', + 'common.insufficient': 'Không đủ', + 'voiceClone.platformNameRequired': 'Vui lòng chọn tên nền tảng', + 'voiceClone.voiceIdRequired': 'Vui lòng chọn ID giọng nói', + 'voiceClone.userIdRequired': 'Vui lòng chọn chủ sở hữu tài khoản', + 'voiceClone.platformNamePlaceholder': 'Vui lòng chọn tên nền tảng', + 'voiceClone.voiceIdPlaceholder': 'Vui lòng nhập ID giọng nói và nhấn Enter', + 'voiceClone.userIdPlaceholder': 'Vui lòng nhập từ khóa để chọn chủ sở hữu tài khoản', + 'voiceClone.waitingUpload': 'Đang chờ tải lên', + 'voiceClone.waitingTraining': 'Đang chờ nhân bản', + 'voiceClone.training': 'Đang huấn luyện', + 'voiceClone.trainSuccess': 'Huấn luyện thành công', + 'voiceClone.trainFailed': 'Huấn luyện thất bại', + 'voiceClone.itemsPerPage': '{items} mục mỗi trang', + 'voiceClone.firstPage': 'Trang đầu', + 'voiceClone.prevPage': 'Trang trước', + 'voiceClone.nextPage': 'Trang sau', + 'voiceClone.totalRecords': 'Tổng cộng {total} bản ghi', + 'voiceClone.noVoiceCloneAssigned': 'Tài khoản của bạn không được chỉ định tài nguyên giọng nói', + 'voiceClone.contactAdmin': 'Vui lòng liên hệ quản trị viên để được chỉ định tài nguyên giọng nói', + 'voiceClone.dialogTitle': 'Nhân bản âm sắc', + 'voiceClone.stepUpload': 'Chuẩn bị âm thanh', + 'voiceClone.stepEdit': 'Chỉnh sửa âm thanh', + 'voiceClone.dragOrClick': 'Kéo tệp âm thanh vào đây hoặc nhấp để tải lên', + 'voiceClone.uploadTip': 'Hỗ trợ tất cả các định dạng âm thanh chính, thời lượng được chọn phải từ 8-60 giây', + 'voiceClone.editTip1': 'Vui lòng xác nhận xem âm thanh đã tải lên có đạt yêu cầu không', + 'voiceClone.editTip2': 'Bạn có thể nghe và cắt âm thanh, nếu không hài lòng có thể quay lại để ghi âm lại hoặc tải lên lại', + 'voiceClone.selectedDuration': 'Đoạn hợp lệ đã chọn: {duration} giây', + 'voiceClone.trim': 'Cắt đoạn đã chọn', + 'voiceClone.reset': 'Đặt lại', + 'voiceClone.play': 'Phát', + 'voiceClone.pause': 'Tạm dừng', + 'voiceClone.stop': 'Dừng', + 'voiceClone.cancel': 'Hủy bỏ', + 'voiceClone.warning': 'Cảnh báo', + 'voiceClone.ok': 'OK', + 'voiceClone.nextStep': 'Tiếp theo', + 'voiceClone.prevStep': 'Trước', + 'voiceClone.upload': 'Tải lên âm thanh', + 'voiceClone.pleaseSelectAudio': 'Vui lòng chọn tệp âm thanh trước', + 'voiceClone.durationError': 'Thời lượng âm thanh phải từ 8-60 giây', + 'voiceClone.loadAudioFailed': 'Không thể tải âm thanh', + 'voiceClone.trimSuccess': 'Cắt thành công', + 'voiceClone.resetSuccess': 'Đặt lại thành công', + 'voiceClone.uploadSuccess': 'Tải lên thành công', + 'voiceClone.uploadFailed': 'Tải lên thất bại', + 'voiceClone.updateNameSuccess': 'Đã cập nhật tên thành công', + 'voiceClone.updateNameFailed': 'Không thể cập nhật tên', + 'voiceClone.playFailed': 'Phát thất bại', + 'voiceClone.Details': 'Chi tiết lỗi', - // Knowledge Base Management page text - 'knowledgeBaseManagement.title': 'Cơ sở kiến thức', - 'knowledgeBaseManagement.searchPlaceholder': 'Vui lòng nhập tên cơ sở kiến thức để tìm kiếm', - 'knowledgeBaseManagement.search': 'Tìm kiếm', - 'knowledgeBaseManagement.name': 'Tên cơ sở kiến thức', - 'knowledgeBaseManagement.description': 'Mô tả cơ sở kiến thức', - 'knowledgeBaseManagement.documentCount': 'Số lượng tài liệu', - 'knowledgeBaseManagement.status': 'Đã bật', - 'knowledgeBaseManagement.createdAt': 'Được tạo lúc', - 'knowledgeBaseManagement.operation': 'Thao tác', - 'knowledgeBaseManagement.add': 'Thêm', - 'knowledgeBaseManagement.delete': 'Xóa', - 'knowledgeBaseManagement.edit': 'Chỉnh sửa', - 'knowledgeBaseManagement.itemsPerPage': 'mục/trang', - 'knowledgeBaseManagement.firstPage': 'Trang đầu', - 'knowledgeBaseManagement.prevPage': 'Trang trước', - 'knowledgeBaseManagement.nextPage': 'Trang sau', - 'knowledgeBaseManagement.totalRecords': 'Tổng cộng {total} bản ghi', - 'knowledgeBaseManagement.addKnowledgeBase': 'Thêm cơ sở kiến thức', - 'knowledgeBaseManagement.editKnowledgeBase': 'Chỉnh sửa cơ sở kiến thức', - 'knowledgeBaseManagement.getKnowledgeBaseListFailed': 'Không thể lấy danh sách cơ sở kiến thức', - 'knowledgeBaseManagement.selectKnowledgeBaseFirst': 'Vui lòng chọn cơ sở kiến thức để xóa trước', - 'knowledgeBaseManagement.confirmBatchDelete': 'Bạn có chắc chắn muốn xóa {count} cơ sở kiến thức đã chọn?', - 'knowledgeBaseManagement.batchDeleteSuccess': 'Đã xóa thành công {count} cơ sở kiến thức', - 'knowledgeBaseManagement.deleteFailed': 'Xóa thất bại, vui lòng thử lại', - 'knowledgeBaseManagement.operationCancelled': 'Đã hủy thao tác xóa', - 'knowledgeBaseManagement.updateSuccess': 'Cập nhật thành công', - 'knowledgeBaseManagement.addSuccess': 'Thêm thành công', - 'knowledgeBaseManagement.updateFailed': 'Cập nhật thất bại', - 'knowledgeBaseManagement.addFailed': 'Thêm thất bại', - 'knowledgeBaseManagement.selectAll': 'Chọn tất cả', - 'knowledgeBaseManagement.cancelSelectAll': 'Bỏ chọn tất cả', + // Knowledge Base Management page text + 'knowledgeBaseManagement.title': 'Cơ sở kiến thức', + 'knowledgeBaseManagement.searchPlaceholder': 'Vui lòng nhập tên cơ sở kiến thức để tìm kiếm', + 'knowledgeBaseManagement.search': 'Tìm kiếm', + 'knowledgeBaseManagement.name': 'Tên cơ sở kiến thức', + 'knowledgeBaseManagement.description': 'Mô tả cơ sở kiến thức', + 'knowledgeBaseManagement.documentCount': 'Số lượng tài liệu', + 'knowledgeBaseManagement.status': 'Đã bật', + 'knowledgeBaseManagement.createdAt': 'Được tạo lúc', + 'knowledgeBaseManagement.operation': 'Thao tác', + 'knowledgeBaseManagement.add': 'Thêm', + 'knowledgeBaseManagement.delete': 'Xóa', + 'knowledgeBaseManagement.edit': 'Chỉnh sửa', + 'knowledgeBaseManagement.itemsPerPage': 'mục/trang', + 'knowledgeBaseManagement.firstPage': 'Trang đầu', + 'knowledgeBaseManagement.prevPage': 'Trang trước', + 'knowledgeBaseManagement.nextPage': 'Trang sau', + 'knowledgeBaseManagement.totalRecords': 'Tổng cộng {total} bản ghi', + 'knowledgeBaseManagement.addKnowledgeBase': 'Thêm cơ sở kiến thức', + 'knowledgeBaseManagement.editKnowledgeBase': 'Chỉnh sửa cơ sở kiến thức', + 'knowledgeBaseManagement.getKnowledgeBaseListFailed': 'Không thể lấy danh sách cơ sở kiến thức', + 'knowledgeBaseManagement.selectKnowledgeBaseFirst': 'Vui lòng chọn cơ sở kiến thức để xóa trước', + 'knowledgeBaseManagement.confirmBatchDelete': 'Bạn có chắc chắn muốn xóa {count} cơ sở kiến thức đã chọn?', + 'knowledgeBaseManagement.batchDeleteSuccess': 'Đã xóa thành công {count} cơ sở kiến thức', + 'knowledgeBaseManagement.deleteFailed': 'Xóa thất bại, vui lòng thử lại', + 'knowledgeBaseManagement.operationCancelled': 'Đã hủy thao tác xóa', + 'knowledgeBaseManagement.updateSuccess': 'Cập nhật thành công', + 'knowledgeBaseManagement.addSuccess': 'Thêm thành công', + 'knowledgeBaseManagement.updateFailed': 'Cập nhật thất bại', + 'knowledgeBaseManagement.addFailed': 'Thêm thất bại', + 'knowledgeBaseManagement.selectAll': 'Chọn tất cả', + 'knowledgeBaseManagement.cancelSelectAll': 'Bỏ chọn tất cả', - // Knowledge Base Dialog text - 'knowledgeBaseDialog.title': 'Cơ sở kiến thức', - 'knowledgeBaseDialog.name': 'Tên cơ sở kiến thức', - 'knowledgeBaseDialog.namePlaceholder': 'Vui lòng nhập chính xác tên cơ sở kiến thức để cải thiện độ chính xác của việc gọi cơ sở kiến thức', - 'knowledgeBaseDialog.description': 'Mô tả cơ sở kiến thức', - 'knowledgeBaseDialog.descriptionPlaceholder': 'Vui lòng nhập chính xác mô tả cơ sở kiến thức để giúp mô hình hiểu rõ hơn nội dung cơ sở kiến thức', - 'knowledgeBaseDialog.ragModel': 'Mô hình RAG', - 'knowledgeBaseDialog.ragModelPlaceholder': 'Vui lòng chọn mô hình RAG', - 'knowledgeBaseDialog.ragModelRequired': 'Vui lòng chọn mô hình RAG', - 'knowledgeBaseDialog.loadRAGModelsFailed': 'Không thể tải danh sách mô hình RAG', - 'knowledgeBaseDialog.status': 'Trạng thái', - 'knowledgeBaseDialog.statusEnabled': 'Đã bật', - 'knowledgeBaseDialog.statusDisabled': 'Đã tắt', - 'knowledgeBaseDialog.save': 'Lưu', - 'knowledgeBaseDialog.cancel': 'Hủy bỏ', - 'knowledgeBaseDialog.confirm': 'Xác nhận', - 'knowledgeBaseDialog.requiredName': 'Vui lòng nhập tên cơ sở kiến thức', - 'knowledgeBaseDialog.nameRequired': 'Vui lòng nhập tên cơ sở kiến thức', - 'knowledgeBaseDialog.nameLength': 'Độ dài tên cơ sở kiến thức nên từ 1 đến 50 ký tự', - 'knowledgeBaseDialog.namePattern': 'Tên cơ sở kiến thức chỉ có thể chứa chữ Trung, Anh, số, khoảng trắng, gạch dưới và gạch ngang', - 'knowledgeBaseDialog.descriptionLength': 'Mô tả cơ sở kiến thức không được vượt quá 200 ký tự', - 'knowledgeBaseDialog.nameLengthLimit': 'Tên cơ sở kiến thức không được vượt quá 50 ký tự', - 'knowledgeBaseDialog.descriptionLengthLimit': 'Mô tả cơ sở kiến thức không được vượt quá 200 ký tự', + // Knowledge Base Dialog text + 'knowledgeBaseDialog.title': 'Cơ sở kiến thức', + 'knowledgeBaseDialog.name': 'Tên cơ sở kiến thức', + 'knowledgeBaseDialog.namePlaceholder': 'Vui lòng nhập chính xác tên cơ sở kiến thức để cải thiện độ chính xác của việc gọi cơ sở kiến thức', + 'knowledgeBaseDialog.description': 'Mô tả cơ sở kiến thức', + 'knowledgeBaseDialog.descriptionPlaceholder': 'Vui lòng nhập chính xác mô tả cơ sở kiến thức để giúp mô hình hiểu rõ hơn nội dung cơ sở kiến thức', + 'knowledgeBaseDialog.ragModel': 'Mô hình RAG', + 'knowledgeBaseDialog.ragModelPlaceholder': 'Vui lòng chọn mô hình RAG', + 'knowledgeBaseDialog.ragModelRequired': 'Vui lòng chọn mô hình RAG', + 'knowledgeBaseDialog.loadRAGModelsFailed': 'Không thể tải danh sách mô hình RAG', + 'knowledgeBaseDialog.status': 'Trạng thái', + 'knowledgeBaseDialog.statusEnabled': 'Đã bật', + 'knowledgeBaseDialog.statusDisabled': 'Đã tắt', + 'knowledgeBaseDialog.save': 'Lưu', + 'knowledgeBaseDialog.cancel': 'Hủy bỏ', + 'knowledgeBaseDialog.confirm': 'Xác nhận', + 'knowledgeBaseDialog.requiredName': 'Vui lòng nhập tên cơ sở kiến thức', + 'knowledgeBaseDialog.nameRequired': 'Vui lòng nhập tên cơ sở kiến thức', + 'knowledgeBaseDialog.nameLength': 'Độ dài tên cơ sở kiến thức nên từ 1 đến 50 ký tự', + 'knowledgeBaseDialog.namePattern': 'Tên cơ sở kiến thức chỉ có thể chứa chữ Trung, Anh, số, khoảng trắng, gạch dưới và gạch ngang', + 'knowledgeBaseDialog.descriptionLength': 'Mô tả cơ sở kiến thức không được vượt quá 200 ký tự', + 'knowledgeBaseDialog.nameLengthLimit': 'Tên cơ sở kiến thức không được vượt quá 50 ký tự', + 'knowledgeBaseDialog.descriptionLengthLimit': 'Mô tả cơ sở kiến thức không được vượt quá 200 ký tự', - // Knowledge Base Management page new view button text - 'knowledgeBaseManagement.view': 'Quản lý tệp', + // Knowledge Base Management page new view button text + 'knowledgeBaseManagement.view': 'Quản lý tệp', - // Knowledge File Upload page text - 'knowledgeFileUpload.back': 'Quay lại', - 'knowledgeFileUpload.searchPlaceholder': 'Vui lòng nhập tên tài liệu để tìm kiếm', - 'knowledgeFileUpload.search': 'Tìm kiếm', - 'knowledgeFileUpload.addDocument': 'Thêm tài liệu', - 'knowledgeFileUpload.documentName': 'Tên tài liệu', - 'knowledgeFileUpload.uploadTime': 'Thời gian tải lên', - 'knowledgeFileUpload.status': 'Trạng thái', - 'knowledgeFileUpload.operation': 'Thao tác', - 'knowledgeFileUpload.parse': 'Phân tích cú pháp', - 'knowledgeFileUpload.viewSlices': 'Xem các phần', - 'knowledgeFileUpload.delete': 'Xóa', - 'knowledgeFileUpload.itemsPerPage': 'mục/trang', - 'knowledgeFileUpload.firstPage': 'Trang đầu', - 'knowledgeFileUpload.prevPage': 'Trang trước', - 'knowledgeFileUpload.nextPage': 'Trang sau', - 'knowledgeFileUpload.totalRecords': 'Tổng cộng {total} bản ghi', - 'knowledgeFileUpload.uploadDocument': 'Tải lên tài liệu', - 'knowledgeFileUpload.documentNamePlaceholder': 'Vui lòng nhập tên tài liệu', - 'knowledgeFileUpload.file': 'Tệp', - 'knowledgeFileUpload.clickToUpload': 'Nhấp để tải lên', - 'knowledgeFileUpload.uploadTip': 'Các loại tệp được hỗ trợ: PDF, DOC, DOCX, TXT, MD, CSV, XLS, XLSX, PPT, PPTX. Tối đa 32 tệp mỗi lần tải lên, kích thước mỗi tệp lên đến 10MB', - 'knowledgeFileUpload.dragOrClick': 'Kéo tệp vào đây hoặc nhấp để tải lên', - 'knowledgeFileUpload.cancel': 'Hủy bỏ', - 'knowledgeFileUpload.confirm': 'Xác nhận', - 'knowledgeFileUpload.knowledgeBaseName': 'Tên cơ sở kiến thức', - 'knowledgeFileUpload.statusNotStarted': 'Chưa bắt đầu', - 'knowledgeFileUpload.statusProcessing': 'Đang xử lý', - 'knowledgeFileUpload.statusCancelled': 'Đã hủy', - 'knowledgeFileUpload.statusCompleted': 'Đã hoàn thành', - 'knowledgeFileUpload.statusFailed': 'Thất bại', - 'knowledgeFileUpload.uploadSuccess': 'Tải lên tài liệu thành công', - 'knowledgeFileUpload.uploadFailed': 'Tải lên tài liệu thất bại', - 'knowledgeFileUpload.parseSuccess': 'Phân tích cú pháp tài liệu thành công', - 'knowledgeFileUpload.parseFailed': 'Phân tích cú pháp tài liệu thất bại', - 'knowledgeFileUpload.deleteSuccess': 'Xóa tài liệu thành công', - 'knowledgeFileUpload.deleteFailed': 'Xóa tài liệu thất bại', - 'knowledgeFileUpload.confirmDelete': 'Bạn có chắc chắn muốn xóa tài liệu này?', - 'knowledgeFileUpload.confirmParse': 'Bạn có chắc chắn muốn phân tích cú pháp tài liệu này?', - 'knowledgeFileUpload.nameRequired': 'Vui lòng nhập tên tài liệu', - 'knowledgeFileUpload.fileRequired': 'Vui lòng chọn tệp để tải lên', - 'knowledgeFileUpload.getListFailed': 'Không thể lấy danh sách tài liệu', - 'knowledgeFileUpload.parseCancelled': 'Đã hủy phân tích cú pháp', - 'knowledgeFileUpload.deleteCancelled': 'Đã hủy xóa', - 'knowledgeFileUpload.selectFilesFirst': 'Vui lòng chọn tệp để xóa trước', - 'knowledgeFileUpload.selectAll': 'Chọn tất cả', - 'knowledgeFileUpload.deselectAll': 'Bỏ chọn tất cả', - 'knowledgeFileUpload.batchDelete': 'Xóa', - 'knowledgeFileUpload.confirmBatchDelete': 'Bạn có chắc chắn muốn xóa {count} tệp đã chọn?', - 'knowledgeFileUpload.batchDeleteSuccess': 'Đã xóa thành công {count} tệp', - 'knowledgeFileUpload.batchDeleteFailed': 'Xóa hàng loạt thất bại', - 'knowledgeFileUpload.sliceCount': 'Số lượng phần', - 'knowledgeFileUpload.add': 'Thêm', - 'knowledgeFileUpload.retrievalTest': 'Kiểm tra truy xuất', - 'knowledgeFileUpload.testQuestion': 'Câu hỏi kiểm tra', - 'knowledgeFileUpload.testQuestionPlaceholder': 'Vui lòng nhập câu hỏi để kiểm tra', - 'knowledgeFileUpload.executeTest': 'Thực thi kiểm tra', - 'knowledgeFileUpload.testResult': 'Kết quả kiểm tra:', - 'knowledgeFileUpload.selectedFiles': 'Tệp đã chọn', - 'knowledgeFileUpload.totalSlices': 'Tổng cộng {total} bản ghi', - 'knowledgeFileUpload.slice': 'Phần', - 'knowledgeFileUpload.noSliceData': 'Không có dữ liệu phần nào', - 'knowledgeFileUpload.firstPage': 'Đầu tiên', - 'knowledgeFileUpload.prevPage': 'Trước', - 'knowledgeFileUpload.nextPage': 'Tiếp theo', - 'knowledgeFileUpload.totalRecords': 'Tổng cộng {total} bản ghi', - 'knowledgeFileUpload.testQuestion': 'Câu hỏi kiểm tra', - 'knowledgeFileUpload.testQuestionPlaceholder': 'Vui lòng nhập câu hỏi để kiểm tra', - 'knowledgeFileUpload.runTest': 'Chạy kiểm tra', - 'knowledgeFileUpload.testResult': 'Kết quả kiểm tra:', - 'knowledgeFileUpload.noRelatedSlices': 'Không tìm thấy phần liên quan', - 'knowledgeFileUpload.comprehensiveSimilarity': 'Độ tương đồng toàn diện', - 'knowledgeFileUpload.content': 'Nội dung:', - 'knowledgeFileUpload.testQuestionRequired': 'Vui lòng nhập câu hỏi kiểm tra', - 'knowledgeBaseDialog.descriptionRequired': 'Vui lòng nhập mô tả cơ sở kiến thức', + // Knowledge File Upload page text + 'knowledgeFileUpload.back': 'Quay lại', + 'knowledgeFileUpload.searchPlaceholder': 'Vui lòng nhập tên tài liệu để tìm kiếm', + 'knowledgeFileUpload.search': 'Tìm kiếm', + 'knowledgeFileUpload.addDocument': 'Thêm tài liệu', + 'knowledgeFileUpload.documentName': 'Tên tài liệu', + 'knowledgeFileUpload.uploadTime': 'Thời gian tải lên', + 'knowledgeFileUpload.status': 'Trạng thái', + 'knowledgeFileUpload.operation': 'Thao tác', + 'knowledgeFileUpload.parse': 'Phân tích cú pháp', + 'knowledgeFileUpload.viewSlices': 'Xem các phần', + 'knowledgeFileUpload.delete': 'Xóa', + 'knowledgeFileUpload.itemsPerPage': 'mục/trang', + 'knowledgeFileUpload.firstPage': 'Trang đầu', + 'knowledgeFileUpload.prevPage': 'Trang trước', + 'knowledgeFileUpload.nextPage': 'Trang sau', + 'knowledgeFileUpload.totalRecords': 'Tổng cộng {total} bản ghi', + 'knowledgeFileUpload.uploadDocument': 'Tải lên tài liệu', + 'knowledgeFileUpload.documentNamePlaceholder': 'Vui lòng nhập tên tài liệu', + 'knowledgeFileUpload.file': 'Tệp', + 'knowledgeFileUpload.clickToUpload': 'Nhấp để tải lên', + 'knowledgeFileUpload.uploadTip': 'Các loại tệp được hỗ trợ: PDF, DOC, DOCX, TXT, MD, CSV, XLS, XLSX, PPT, PPTX. Tối đa 32 tệp mỗi lần tải lên, kích thước mỗi tệp lên đến 10MB', + 'knowledgeFileUpload.dragOrClick': 'Kéo tệp vào đây hoặc nhấp để tải lên', + 'knowledgeFileUpload.cancel': 'Hủy bỏ', + 'knowledgeFileUpload.confirm': 'Xác nhận', + 'knowledgeFileUpload.knowledgeBaseName': 'Tên cơ sở kiến thức', + 'knowledgeFileUpload.statusNotStarted': 'Chưa bắt đầu', + 'knowledgeFileUpload.statusProcessing': 'Đang xử lý', + 'knowledgeFileUpload.statusCancelled': 'Đã hủy', + 'knowledgeFileUpload.statusCompleted': 'Đã hoàn thành', + 'knowledgeFileUpload.statusFailed': 'Thất bại', + 'knowledgeFileUpload.uploadSuccess': 'Tải lên tài liệu thành công', + 'knowledgeFileUpload.uploadFailed': 'Tải lên tài liệu thất bại', + 'knowledgeFileUpload.parseSuccess': 'Phân tích cú pháp tài liệu thành công', + 'knowledgeFileUpload.parseFailed': 'Phân tích cú pháp tài liệu thất bại', + 'knowledgeFileUpload.deleteSuccess': 'Xóa tài liệu thành công', + 'knowledgeFileUpload.deleteFailed': 'Xóa tài liệu thất bại', + 'knowledgeFileUpload.confirmDelete': 'Bạn có chắc chắn muốn xóa tài liệu này?', + 'knowledgeFileUpload.confirmParse': 'Bạn có chắc chắn muốn phân tích cú pháp tài liệu này?', + 'knowledgeFileUpload.nameRequired': 'Vui lòng nhập tên tài liệu', + 'knowledgeFileUpload.fileRequired': 'Vui lòng chọn tệp để tải lên', + 'knowledgeFileUpload.getListFailed': 'Không thể lấy danh sách tài liệu', + 'knowledgeFileUpload.parseCancelled': 'Đã hủy phân tích cú pháp', + 'knowledgeFileUpload.deleteCancelled': 'Đã hủy xóa', + 'knowledgeFileUpload.selectFilesFirst': 'Vui lòng chọn tệp để xóa trước', + 'knowledgeFileUpload.selectAll': 'Chọn tất cả', + 'knowledgeFileUpload.deselectAll': 'Bỏ chọn tất cả', + 'knowledgeFileUpload.batchDelete': 'Xóa', + 'knowledgeFileUpload.confirmBatchDelete': 'Bạn có chắc chắn muốn xóa {count} tệp đã chọn?', + 'knowledgeFileUpload.batchDeleteSuccess': 'Đã xóa thành công {count} tệp', + 'knowledgeFileUpload.batchDeleteFailed': 'Xóa hàng loạt thất bại', + 'knowledgeFileUpload.sliceCount': 'Số lượng phần', + 'knowledgeFileUpload.add': 'Thêm', + 'knowledgeFileUpload.retrievalTest': 'Kiểm tra truy xuất', + 'knowledgeFileUpload.testQuestion': 'Câu hỏi kiểm tra', + 'knowledgeFileUpload.testQuestionPlaceholder': 'Vui lòng nhập câu hỏi để kiểm tra', + 'knowledgeFileUpload.executeTest': 'Thực thi kiểm tra', + 'knowledgeFileUpload.testResult': 'Kết quả kiểm tra:', + 'knowledgeFileUpload.selectedFiles': 'Tệp đã chọn', + 'knowledgeFileUpload.totalSlices': 'Tổng cộng {total} bản ghi', + 'knowledgeFileUpload.slice': 'Phần', + 'knowledgeFileUpload.noSliceData': 'Không có dữ liệu phần nào', + 'knowledgeFileUpload.firstPage': 'Đầu tiên', + 'knowledgeFileUpload.prevPage': 'Trước', + 'knowledgeFileUpload.nextPage': 'Tiếp theo', + 'knowledgeFileUpload.totalRecords': 'Tổng cộng {total} bản ghi', + 'knowledgeFileUpload.testQuestion': 'Câu hỏi kiểm tra', + 'knowledgeFileUpload.testQuestionPlaceholder': 'Vui lòng nhập câu hỏi để kiểm tra', + 'knowledgeFileUpload.runTest': 'Chạy kiểm tra', + 'knowledgeFileUpload.testResult': 'Kết quả kiểm tra:', + 'knowledgeFileUpload.noRelatedSlices': 'Không tìm thấy phần liên quan', + 'knowledgeFileUpload.comprehensiveSimilarity': 'Độ tương đồng toàn diện', + 'knowledgeFileUpload.content': 'Nội dung:', + 'knowledgeFileUpload.testQuestionRequired': 'Vui lòng nhập câu hỏi kiểm tra', + 'knowledgeBaseDialog.descriptionRequired': 'Vui lòng nhập mô tả cơ sở kiến thức', } \ No newline at end of file diff --git a/main/manager-web/src/i18n/zh_CN.js b/main/manager-web/src/i18n/zh_CN.js index 221136a2..7f172f0e 100644 --- a/main/manager-web/src/i18n/zh_CN.js +++ b/main/manager-web/src/i18n/zh_CN.js @@ -849,6 +849,7 @@ export default { 'modelConfigDialog.setDefault': '设为默认', 'modelConfigDialog.modelId': '模型ID', 'modelConfigDialog.enterModelId': '未填写将自动生成模型ID', + 'modelConfigDialog.invalidModelId': '模型ID不能为纯文字或空格,请使用字母、数字、下划线或连字符组合', 'modelConfigDialog.modelName': '模型名称', 'modelConfigDialog.enterModelName': '请输入模型名称', 'modelConfigDialog.modelCode': '模型编码', diff --git a/main/manager-web/src/i18n/zh_TW.js b/main/manager-web/src/i18n/zh_TW.js index 70c47527..18d84ec5 100644 --- a/main/manager-web/src/i18n/zh_TW.js +++ b/main/manager-web/src/i18n/zh_TW.js @@ -849,6 +849,7 @@ export default { 'modelConfigDialog.setDefault': '設為默認', 'modelConfigDialog.modelId': '模型ID', 'modelConfigDialog.enterModelId': '未填冩將自動生成模型ID', + 'modelConfigDialog.invalidModelId': '模型ID不能為純文字或空格,請使用字母、數字、底線或連字符組合', 'modelConfigDialog.modelName': '模型名稱', 'modelConfigDialog.enterModelName': '請輸入模型名稱', 'modelConfigDialog.modelCode': '模型編碼', diff --git a/main/manager-web/src/views/roleConfig.vue b/main/manager-web/src/views/roleConfig.vue index e7b593e2..a0baf371 100644 --- a/main/manager-web/src/views/roleConfig.vue +++ b/main/manager-web/src/views/roleConfig.vue @@ -604,15 +604,14 @@ export default { if (type === "Intent" && value !== "Intent_nointent") { this.fetchAllFunctions(); } - if (type === "Memory" && value === "Memory_nomem") { - this.form.chatHistoryConf = 0; - } - if ( - type === "Memory" && - value !== "Memory_nomem" && - (this.form.chatHistoryConf === 0 || this.form.chatHistoryConf === null) - ) { - this.form.chatHistoryConf = 2; + if (type === "Memory") { + if (value === "Memory_nomem") { + // 无记忆功能的模型,默认不记录聊天记录 + this.form.chatHistoryConf = 0; + } else { + // 有记忆功能的模型,默认记录文本和语音 + this.form.chatHistoryConf = 2; + } } if (type === "LLM") { // 当LLM类型改变时,更新意图识别选项的可见性