From 8064cdf1a2216d6deb353d549727790a215f0fe8 Mon Sep 17 00:00:00 2001
From: rainv123 <2148537152@qq.com>
Date: Sat, 15 Nov 2025 17:24:47 +0800
Subject: [PATCH] =?UTF-8?q?uptate:=E6=99=BA=E6=8E=A7=E5=8F=B0=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=E5=BE=B7=E8=AF=AD=E3=80=81=E8=B6=8A=E5=8D=97=E8=AF=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../modules/security/config/WebMvcConfig.java | 18 +-
.../resources/i18n/messages_de_DE.properties | 192 +++
.../resources/i18n/messages_vi_VN.properties | 192 +++
.../i18n/validation_de_DE.properties | 34 +
.../i18n/validation_vi_VN.properties | 34 +
main/manager-web/src/components/HeaderBar.vue | 12 +
main/manager-web/src/i18n/de.js | 1265 +++++++++++++++++
main/manager-web/src/i18n/en.js | 2 +
main/manager-web/src/i18n/index.js | 12 +-
main/manager-web/src/i18n/vi.js | 1265 +++++++++++++++++
main/manager-web/src/i18n/zh_CN.js | 2 +
main/manager-web/src/i18n/zh_TW.js | 2 +
main/manager-web/src/views/login.vue | 10 +
13 files changed, 3035 insertions(+), 5 deletions(-)
create mode 100644 main/manager-api/src/main/resources/i18n/messages_de_DE.properties
create mode 100644 main/manager-api/src/main/resources/i18n/messages_vi_VN.properties
create mode 100644 main/manager-api/src/main/resources/i18n/validation_de_DE.properties
create mode 100644 main/manager-api/src/main/resources/i18n/validation_vi_VN.properties
create mode 100644 main/manager-web/src/i18n/de.js
create mode 100644 main/manager-web/src/i18n/vi.js
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/config/WebMvcConfig.java b/main/manager-api/src/main/java/xiaozhi/modules/security/config/WebMvcConfig.java
index f13194b1..8004eb9f 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/security/config/WebMvcConfig.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/security/config/WebMvcConfig.java
@@ -100,7 +100,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
converter.setObjectMapper(mapper);
return converter;
}
-
+
/**
* 国际化配置 - 根据请求头中的Accept-Language设置语言环境
*/
@@ -113,14 +113,14 @@ public class WebMvcConfig implements WebMvcConfigurer {
if (acceptLanguage == null || acceptLanguage.isEmpty()) {
return Locale.getDefault();
}
-
+
// 解析Accept-Language请求头中的首选语言
String[] languages = acceptLanguage.split(",");
if (languages.length > 0) {
// 提取第一个语言代码,去除可能的质量值(q=...)
String[] parts = languages[0].split(";" + "\\s*");
String primaryLanguage = parts[0].trim();
-
+
// 根据前端发送的语言代码直接创建Locale对象
if (primaryLanguage.equals("zh-CN")) {
return Locale.SIMPLIFIED_CHINESE;
@@ -128,15 +128,25 @@ public class WebMvcConfig implements WebMvcConfigurer {
return Locale.TRADITIONAL_CHINESE;
} else if (primaryLanguage.equals("en-US")) {
return Locale.US;
+ } else if (primaryLanguage.equals("de-DE")) {
+ return Locale.GERMANY;
+ } else if (primaryLanguage.equals("vi-VN")) {
+ return Locale.forLanguageTag("vi-VN");
} else if (primaryLanguage.startsWith("zh")) {
// 对于其他中文变体,默认使用简体中文
return Locale.SIMPLIFIED_CHINESE;
} else if (primaryLanguage.startsWith("en")) {
// 对于其他英文变体,默认使用美式英语
return Locale.US;
+ } else if (primaryLanguage.startsWith("de")) {
+ // 对于其他德语变体,默认使用德语
+ return Locale.GERMANY;
+ } else if (primaryLanguage.startsWith("vi")) {
+ // 对于其他越南语变体,默认使用越南语
+ return Locale.forLanguageTag("vi-VN");
}
}
-
+
// 如果没有匹配的语言,使用默认语言
return Locale.getDefault();
}
diff --git a/main/manager-api/src/main/resources/i18n/messages_de_DE.properties b/main/manager-api/src/main/resources/i18n/messages_de_DE.properties
new file mode 100644
index 00000000..b9e12bea
--- /dev/null
+++ b/main/manager-api/src/main/resources/i18n/messages_de_DE.properties
@@ -0,0 +1,192 @@
+#Deutsch
+500=Server interne Ausnahme
+401=Nicht autorisiert
+403=Zugriff verweigert, keine Berechtigungen
+10001={0} darf nicht leer sein
+10002=Der Datensatz existiert bereits in der Datenbank
+10003=Parameter abrufen fehlgeschlagen
+10004=Die Kontonummer oder das Passwort ist falsch
+10005=Konto wurde deaktiviert
+10006=Eindeutige ID darf nicht leer sein
+10007=Der Bestätigungscode ist falsch
+10008=Zuerst Untermenü oder Schaltfläche löschen
+10009=Das ursprüngliche Passwort ist falsch
+10010=Das Konto oder Passwort ist falsch, Sie können es noch {0} Mal versuchen
+
+10011=Die übergeordnete Abteilung hat eine falsche Wahl getroffen
+10012=Oberes Menü kann nicht sich selbst sein
+10013=Datenberechtigungsschnittstelle, die nur ein Map-Typ-Parameter sein kann
+10014=Bitte löschen Sie zuerst die untergeordnete Abteilung
+10015=Bitte löschen Sie zuerst den Benutzer unter der Abteilung
+10016=Bereitstellung fehlgeschlagen, kein Prozess
+10017=Das ModellDiagramm ist falsch, bitte überprüfen
+10018=Export fehlgeschlagen, Modell-ID ist {0}
+
+10019=Bitte laden Sie eine Datei hoch
+10020=Token darf nicht leer sein
+10021=Token ist ungültig, bitte melden Sie sich erneut an
+10022=Das Konto wurde gesperrt
+10023=Bitte laden Sie Dateien im Format zip, bar, bpmn, bpmn20.xml hoch
+
+10024=Datei-Upload fehlgeschlagen {0}
+10025=SMS-Sendung fehlgeschlagen {0}
+10026=E-Mail-Vorlage existiert nicht
+
+10027=Redis-Dienstausnahme
+10028=Zeitgesteuerte Aufgabe fehlgeschlagen
+10029=Darf keine illegalen Zeichen enthalten
+
+10030=Das Passwort hat weniger als {0} Ziffern
+10031=Das Passwort muss gleichzeitig aus Zahlen, Groß- und Kleinbuchstaben sowie Sonderzeichen bestehen
+10032=Ausnahme beim Löschen dieser Daten
+10033=Gerätebestätigungscode Fehler
+
+10034=Parameterwert darf nicht leer sein
+10035=Parametertyp darf nicht leer sein
+10036=Nicht unterstützter Parametertyp
+10037=Parameterwert muss eine gültige Zahl sein
+10038=Parameterwert muss true oder false sein
+10039=Parameterwert muss ein gültiges JSON-Array-Format sein
+10040=Parameterwert muss ein gültiges JSON-Format sein
+
+10041=Gerät nicht gefunden
+10042={0}
+10043=Löschen der Daten fehlgeschlagen
+10044=Benutzer nicht angemeldet
+10045=WebSocket-Verbindung fehlgeschlagen oder Zeitüberschreitung
+10046=Stimmabdruck speichern fehlgeschlagen, bitte Administrator kontaktieren
+10047=Tägliches SendeLimit erreicht
+10048=Altes Passwort ist falsch
+10049=Das eingestellte LLM ist nicht openai oder ollama
+10050=Token-Generierung fehlgeschlagen
+10051=Ressource nicht gefunden
+10052=Standard-Agent nicht gefunden
+10053=Agent nicht gefunden
+10054=Stimmabdruck-Schnittstelle nicht konfiguriert, bitte konfigurieren Sie zuerst die Stimmabdruck-Schnittstellenadresse (server.voice_print) in der Parameterkonfiguration
+10055=SMS-Sendung fehlgeschlagen
+10056=SMS-Verbindung konnte nicht hergestellt werden
+10057=Stimmabdruck für Agent konnte nicht erstellt werden
+10058=Stimmabdruck für Agent konnte nicht aktualisiert werden
+10059=Stimmabdruck für Agent konnte nicht gelöscht werden
+10060=Sendung zu häufig, bitte versuchen Sie es nach {0} Sekunden erneut
+10061=Aktivierungscode darf nicht leer sein
+10062=Aktivierungscode Fehler
+10063=Gerät bereits aktiviert
+10064=Dieses Modell ist das Standardmodell, bitte setzen Sie zuerst ein anderes Modell als Standard
+10065=Hinzufügen der Daten fehlgeschlagen
+10066=Aktualisieren der Daten fehlgeschlagen
+10067=Grafischer Bestätigungscode Fehler
+10068=Mobilregistrierung nicht aktiviert, SMS-Bestätigungscode-Funktion kann nicht verwendet werden
+10069=Benutzername ist keine Handynummer, bitte erneut eingeben
+10070=Diese Handynummer wurde bereits registriert
+10071=Die eingegebene Handynummer ist nicht registriert
+10072=Normale Benutzerregistrierung derzeit nicht erlaubt
+10073=Mobilregistrierung nicht aktiviert, Passwort-Wiederherstellungsfunktion kann nicht verwendet werden
+10074=Das Format der eingegebenen Handynummer ist falsch
+10075=Der eingegebene SMS-Bestätigungscode ist falsch
+10076=Wörterbuchtyp existiert nicht
+10077=Wörterbuchtypcode ist dupliziert
+10078=Lesen der Ressource fehlgeschlagen
+10079=LLM-Modell und Absichtserkennung, Parameterauswahl stimmt nicht überein
+10080=Dieser Stimmabdruck gehört zu {0}, der bereits registriert ist, bitte wählen Sie eine andere Stimme
+10081=Fehler beim Löschen des Stimmabdrucks aufgetreten
+10082=Änderung nicht erlaubt, diese Stimme wurde bereits als Stimmabdruck registriert ({0})
+10083=Fehler beim Ändern des Stimmabdrucks, bitte Administrator kontaktieren
+10084=Stimmabdruck-Schnittstellenadresse Fehler, bitte gehen Sie zur Parameterverwaltung, um die Stimmabdruck-Schnittstellenadresse zu ändern
+10085=Audiodaten gehören nicht zu diesem Agent
+10086=Audiodaten sind leer, bitte überprüfen Sie hochgeladene Daten
+10087=Stimmabdruck-Registrierung fehlgeschlagen, Anfrage nicht erfolgreich
+10088=Stimmabdruck-Registrierung fehlgeschlagen, Anfrageverarbeitung fehlgeschlagen
+10089=Stimmabdruck-Stornierung fehlgeschlagen, Anfrage nicht erfolgreich
+10090=Stimmabdruck-Stornierung fehlgeschlagen, Anfrageverarbeitung fehlgeschlagen
+10091=Modellanbieter existiert nicht
+10092=Das konfigurierte LLM existiert nicht
+10093=Diese Modellkonfiguration wird von Agent {0} referenziert und kann nicht gelöscht werden
+10094=Dieses LLM-Modell wird von der Absichtserkennungskonfiguration referenziert und kann nicht gelöscht werden
+10095=Ungültige Serveroperation
+10096=Server WebSocket-Adresse nicht konfiguriert
+10097=Ziel-WebSocket-Adresse existiert nicht
+10098=WebSocket-Adressliste darf nicht leer sein
+10099=WebSocket-Adresse darf nicht localhost oder 127.0.0.1 verwenden
+10100=WebSocket-Adressformat ist falsch
+10101=WebSocket-Verbindungstest fehlgeschlagen
+10102=OTA-Adresse darf nicht leer sein
+10103=OTA-Adresse darf nicht localhost oder 127.0.0.1 verwenden
+10104=OTA-Adresse muss mit http oder https beginnen
+10105=OTA-Adresse muss mit /ota/ enden
+10106=OTA-Schnittstellenzugriff fehlgeschlagen
+10107=OTA-Schnittstelle Rückgabeinhaltformat ist falsch
+10108=OTA-Schnittstellenvalidierung fehlgeschlagen
+10109=MCP-Adresse darf nicht leer sein
+10110=MCP-Adresse darf nicht localhost oder 127.0.0.1 verwenden
+10111=Keine gültige MCP-Adresse
+10112=MCP-Schnittstellenzugriff fehlgeschlagen
+10113=MCP-Schnittstelle Rückgabeinhaltformat ist falsch
+10114=MCP-Schnittstellenvalidierung fehlgeschlagen
+10115=Stimmabdruck-Schnittstellenadresse darf nicht leer sein
+10116=Stimmabdruck-Schnittstellenadresse darf nicht localhost oder 127.0.0.1 verwenden
+10117=Keine gültige Stimmabdruck-Schnittstellenadresse
+10118=Stimmabdruck-Schnittstellenadresse muss mit http oder https beginnen
+10119=Stimmabdruck-Schnittstellenzugriff fehlgeschlagen
+10120=Stimmabdruck-Schnittstelle Rückgabeinhaltformat ist falsch
+10121=Stimmabdruck-Schnittstellenvalidierung fehlgeschlagen
+10122=MQTT-Geheimnis darf nicht leer sein
+10123=Ihr MQTT-Geheimnis ist nicht sicher, es muss mindestens 8 Zeichen lang sein und muss sowohl Groß- als auch Kleinbuchstaben enthalten
+10124=Ihr MQTT-Geheimnis ist nicht sicher, MQTT-Geheimnis muss sowohl Groß- als auch Kleinbuchstaben enthalten
+10125=Ihr MQTT-Geheimnis enthält schwaches Passwort
+10128=Wörterbuchlabel ist dupliziert
+10129=SM2-Schlüssel nicht konfiguriert
+10130=SM2-Entschlüsselung fehlgeschlagen
+10131=modelType und provideCode dürfen nicht leer sein
+10132=Keine Berechtigung, den Chat-Verlauf dieses Agents anzuzeigen
+10133=Sitzungs-ID darf nicht leer sein
+10134=Agent-ID darf nicht leer sein
+10135=Chat-Verlauf-Download fehlgeschlagen
+10136=Download-Link abgelaufen oder ungültig
+10137=Download-Link ungültig
+10138=Benutzer
+10139=Agent
+10140=Audio-Datei darf nicht leer sein
+10141=Nur Audio-Dateien werden unterstützt
+10142=Audio-Dateigröße darf 10MB nicht überschreiten
+10143=Upload fehlgeschlagen
+10144=Stimmenklon-Datensatz existiert nicht
+10145=Stimmressourceninformationen dürfen nicht leer sein
+10146=TTS-Plattformname darf nicht leer sein
+10147=Stimmen-ID darf nicht leer sein
+10148=Kontoinhaber darf nicht leer sein
+10149=Zu löschende Stimmressourcen-ID darf nicht leer sein
+10150=Sie haben keine Berechtigung, diesen Datensatz zu bearbeiten
+10151=Bitte laden Sie zuerst eine Audio-Datei hoch
+10152=Modellkonfiguration nicht gefunden
+10153=Modelltyp nicht gefunden
+10154=Training fehlgeschlagen: {0}
+10155=Huoshan Engine-Konfiguration fehlt
+10156=Antwortformat Fehler, BaseResp-Feld fehlt
+10157=Anfrage fehlgeschlagen
+10158=Stimme klonen:
+10159=Stimmen-ID existiert bereits
+10160=Huoshan Engine-Stimmen-ID-Formatfehler, muss mit S_ beginnen
+10161=Mac-Adresse existiert bereits
+10162=Modellanbieter existiert nicht
+10163=Wissensbasis-Datensatz existiert nicht
+10164=RAG-Konfiguration nicht gefunden
+10165=RAG-Konfigurationstyp Fehler
+10166=Standard-RAG-Konfiguration nicht gefunden
+10167=RAG-API-Aufruf fehlgeschlagen: {0}
+10168=Datei-Upload fehlgeschlagen
+10169=Keine Berechtigung, diese Wissensbasis zu bearbeiten
+10170=Wissensbasis-Name existiert bereits
+10171=RAG-Konfiguration base_url darf nicht leer sein
+10172=RAG-Konfiguration api_key darf nicht leer sein
+10173=RAG-Konfiguration api_key darf keinen Platzhalter enthalten, bitte ersetzen Sie mit tatsächlichem API-Schlüssel
+10174=RAG-Konfiguration base_url-Formatfehler, muss mit http oder https beginnen
+10175=Mac-Adresse darf nicht leer sein
+10176=RAG-Konfiguration dataset_id darf nicht leer sein
+10177=RAG-Konfiguration model_id darf nicht leer sein
+10178=RAG-Konfiguration dataset_id und model_id dürfen nicht leer sein
+10179=Dateiname darf nicht leer sein
+10180=Dateiinhalt darf nicht leer sein
+10181=Stimmenklon-Name darf nicht leer sein
+10182=Stimmenklon-Audio nicht gefunden
+10183=Standard-Agent-Vorlage nicht gefunden
\ No newline at end of file
diff --git a/main/manager-api/src/main/resources/i18n/messages_vi_VN.properties b/main/manager-api/src/main/resources/i18n/messages_vi_VN.properties
new file mode 100644
index 00000000..47b59b2f
--- /dev/null
+++ b/main/manager-api/src/main/resources/i18n/messages_vi_VN.properties
@@ -0,0 +1,192 @@
+#Tiếng Việt
+500=Ngoại lệ nội bộ máy chủ
+401=Không được ủy quyền
+403=Truy cập bị từ chối, không có quyền
+10001={0} không thể để trống
+10002=Bản ghi đã tồn tại trong cơ sở dữ liệu
+10003=Không thể lấy tham số
+10004=Số tài khoản hoặc mật khẩu không chính xác
+10005=Tài khoản đã bị vô hiệu hóa
+10006=ID duy nhất không thể để trống
+10007=Mã xác minh không chính xác
+10008=Trước tiên hãy xóa menu con hoặc nút
+10009=Mật khẩu gốc không chính xác
+10010=Tài khoản hoặc mật khẩu không chính xác, bạn có thể thử thêm {0} lần nữa
+
+10011=Phòng ban cấp trên đã lựa chọn sai
+10012=Menu trên không thể là chính nó
+10013=Giao diện quyền dữ liệu, chỉ có thể là tham số kiểu Map
+10014=Vui lòng xóa phòng ban cấp dưới trước
+10015=Vui lòng xóa người dùng thuộc phòng ban trước
+10016=Triển khai thất bại, không có quy trình
+10017=Biểu đồ mô hình không chính xác, vui lòng kiểm tra
+10018=Xuất thất bại, ID mô hình là {0}
+
+10019=Vui lòng tải lên tệp
+10020=Token không thể để trống
+10021=Token không hợp lệ, vui lòng đăng nhập lại
+10022=Tài khoản đã bị khóa
+10023=Vui lòng tải lên tệp ở định dạng zip, bar, bpmn, bpmn20.xml
+
+10024=Tải lên tệp {0} thất bại
+10025=Gửi SMS {0} thất bại
+10026=Mẫu email không tồn tại
+
+10027=Ngoại lệ dịch vụ Redis
+10028=Tác vụ hẹn giờ thất bại
+10029=Không thể chứa ký tự không hợp lệ
+
+10030=Mật khẩu ít hơn {0} chữ số
+10031=Mật khẩu phải bao gồm số, chữ hoa, chữ thường và ký tự đặc biệt cùng một lúc
+10032=Ngoại lệ khi xóa dữ liệu này
+10033=Lỗi mã xác minh thiết bị
+
+10034=Giá trị tham số không thể để trống
+10035=Loại tham số không thể để trống
+10036=Loại tham số không được hỗ trợ
+10037=Giá trị tham số phải là số hợp lệ
+10038=Giá trị tham số phải là true hoặc false
+10039=Giá trị tham số phải là định dạng mảng JSON hợp lệ
+10040=Giá trị tham số phải là định dạng JSON hợp lệ
+
+10041=Không tìm thấy thiết bị
+10042={0}
+10043=Xóa dữ liệu thất bại
+10044=Người dùng chưa đăng nhập
+10045=Kết nối WebSocket thất bại hoặc hết thời gian chờ
+10046=Không thể lưu dấu giọng nói, vui lòng liên hệ quản trị viên
+10047=Đạt đến giới hạn gửi hàng ngày
+10048=Mật khẩu cũ không chính xác
+10049=LLM được đặt không phải là openai hoặc ollama
+10050=Không thể tạo token
+10051=Không tìm thấy tài nguyên
+10052=Không tìm thấy agent mặc định
+10053=Không tìm thấy agent
+10054=Giao diện dấu giọng nói chưa được cấu hình, vui lòng cấu hình địa chỉ giao diện dấu giọng nói (server.voice_print) trong cấu hình tham số trước
+10055=Gửi SMS thất bại
+10056=Không thể thiết lập kết nối SMS
+10057=Không thể tạo dấu giọng nói cho agent
+10058=Không thể cập nhật dấu giọng nói cho agent
+10059=Không thể xóa dấu giọng nói cho agent
+10060=Gửi quá thường xuyên, vui lòng thử lại sau {0} giây
+10061=Mã kích hoạt không thể để trống
+10062=Lỗi mã kích hoạt
+10063=Thiết bị đã được kích hoạt
+10064=Mô hình này là mô hình mặc định, vui lòng đặt mô hình khác làm mặc định trước
+10065=Thêm dữ liệu thất bại
+10066=Cập nhật dữ liệu thất bại
+10067=Lỗi mã xác minh đồ họa
+10068=Đăng ký di động không được bật, không thể sử dụng chức năng mã xác minh SMS
+10069=Tên người dùng không phải là số điện thoại di động, vui lòng nhập lại
+10070=Số điện thoại di động này đã được đăng ký
+10071=Số điện thoại di động đã nhập không được đăng ký
+10072=Hiện không cho phép đăng ký người dùng thông thường
+10073=Đăng ký di động không được bật, không thể sử dụng chức năng truy xuất mật khẩu
+10074=Định dạng số điện thoại di động đã nhập không chính xác
+10075=Mã xác minh SMS đã nhập không chính xác
+10076=Loại từ điển không tồn tại
+10077=Mã loại từ điển bị trùng lặp
+10078=Đọc tài nguyên thất bại
+10079=Mô hình LLM và nhận dạng ý định, lựa chọn tham số không khớp
+10080=Dấu giọng nói này thuộc về {0} đã đăng ký, vui lòng chọn giọng nói khác
+10081=Đã xảy ra lỗi khi xóa dấu giọng nói
+10082=Không cho phép sửa đổi, giọng nói này đã được đăng ký làm dấu giọng nói ({0})
+10083=Lỗi sửa đổi dấu giọng nói, vui lòng liên hệ quản trị viên
+10084=Lỗi địa chỉ giao diện dấu giọng nói, vui lòng vào quản lý tham số để sửa đổi địa chỉ giao diện dấu giọng nói
+10085=Dữ liệu âm thanh không thuộc về agent này
+10086=Dữ liệu âm thanh trống, vui lòng kiểm tra dữ liệu đã tải lên
+10087=Đăng ký dấu giọng nói thất bại, yêu cầu không thành công
+10088=Đăng ký dấu giọng nói thất bại, xử lý yêu cầu thất bại
+10089=Hủy dấu giọng nói thất bại, yêu cầu không thành công
+10090=Hủy dấu giọng nói thất bại, xử lý yêu cầu thất bại
+10091=Nhà cung cấp mô hình không tồn tại
+10092=LLM được cấu hình không tồn tại
+10093=Cấu hình mô hình này được tham chiếu bởi agent {0} và không thể xóa
+10094=Mô hình LLM này được tham chiếu bởi cấu hình nhận dạng ý định và không thể xóa
+10095=Thao tác máy chủ không hợp lệ
+10096=Địa chỉ WebSocket máy chủ chưa được cấu hình
+10097=Địa chỉ WebSocket mục tiêu không tồn tại
+10098=Danh sách địa chỉ WebSocket không thể để trống
+10099=Địa chỉ WebSocket không thể sử dụng localhost hoặc 127.0.0.1
+10100=Định dạng địa chỉ WebSocket không chính xác
+10101=Kiểm tra kết nối WebSocket thất bại
+10102=Địa chỉ OTA không thể để trống
+10103=Địa chỉ OTA không thể sử dụng localhost hoặc 127.0.0.1
+10104=Địa chỉ OTA phải bắt đầu bằng http hoặc https
+10105=Địa chỉ OTA phải kết thúc bằng /ota/
+10106=Truy cập giao diện OTA thất bại
+10107=Định dạng nội dung trả về giao diện OTA không chính xác
+10108=Xác thực giao diện OTA thất bại
+10109=Địa chỉ MCP không thể để trống
+10110=Địa chỉ MCP không thể sử dụng localhost hoặc 127.0.0.1
+10111=Không phải địa chỉ MCP hợp lệ
+10112=Truy cập giao diện MCP thất bại
+10113=Định dạng nội dung trả về giao diện MCP không chính xác
+10114=Xác thực giao diện MCP thất bại
+10115=Địa chỉ giao diện dấu giọng nói không thể để trống
+10116=Địa chỉ giao diện dấu giọng nói không thể sử dụng localhost hoặc 127.0.0.1
+10117=Không phải địa chỉ giao diện dấu giọng nói hợp lệ
+10118=Địa chỉ giao diện dấu giọng nói phải bắt đầu bằng http hoặc https
+10119=Truy cập giao diện dấu giọng nói thất bại
+10120=Định dạng nội dung trả về giao diện dấu giọng nói không chính xác
+10121=Xác thực giao diện dấu giọng nói thất bại
+10122=Bí mật MQTT không thể để trống
+10123=Bí mật MQTT của bạn không an toàn, cần ít nhất 8 ký tự và phải chứa cả chữ hoa và chữ thường
+10124=Bí mật MQTT của bạn không an toàn, bí mật MQTT phải chứa cả chữ hoa và chữ thường
+10125=Bí mật MQTT của bạn chứa mật khẩu yếu
+10128=Nhãn từ điển bị trùng lặp
+10129=Khóa SM2 chưa được cấu hình
+10130=Giải mã SM2 thất bại
+10131=modelType và provideCode không thể để trống
+10132=Không có quyền xem lịch sử trò chuyện của agent này
+10133=ID phiên không thể để trống
+10134=ID agent không thể để trống
+10135=Tải xuống lịch sử trò chuyện thất bại
+10136=Liên kết tải xuống đã hết hạn hoặc không hợp lệ
+10137=Liên kết tải xuống không hợp lệ
+10138=Người dùng
+10139=Agent
+10140=Tệp âm thanh không thể để trống
+10141=Chỉ hỗ trợ tệp âm thanh
+10142=Kích thước tệp âm thanh không thể vượt quá 10MB
+10143=Tải lên thất bại
+10144=Bản ghi nhân bản giọng nói không tồn tại
+10145=Thông tin tài nguyên giọng nói không thể để trống
+10146=Tên nền tảng TTS không thể để trống
+10147=ID giọng nói không thể để trống
+10148=Tài khoản chủ sở hữu không thể để trống
+10149=ID tài nguyên giọng nói cần xóa không thể để trống
+10150=Bạn không có quyền thao tác bản ghi này
+10151=Vui lòng tải lên tệp âm thanh trước
+10152=Không tìm thấy cấu hình mô hình
+10153=Không tìm thấy loại mô hình
+10154=Đào tạo thất bại: {0}
+10155=Thiếu cấu hình Huoshan Engine
+10156=Lỗi định dạng phản hồi, thiếu trường BaseResp
+10157=Yêu cầu thất bại
+10158=Nhân bản giọng nói:
+10159=ID giọng nói đã tồn tại
+10160=Lỗi định dạng ID giọng nói Huoshan Engine, phải bắt đầu bằng S_
+10161=Địa chỉ Mac đã tồn tại
+10162=Nhà cung cấp mô hình không tồn tại
+10163=Bản ghi cơ sở kiến thức không tồn tại
+10164=Không tìm thấy cấu hình RAG
+10165=Lỗi loại cấu hình RAG
+10166=Không tìm thấy cấu hình RAG mặc định
+10167=Gọi API RAG thất bại: {0}
+10168=Tải lên tệp thất bại
+10169=Không có quyền thao tác cơ sở kiến thức này
+10170=Tên cơ sở kiến thức đã tồn tại
+10171=Cấu hình RAG base_url không thể để trống
+10172=Cấu hình RAG api_key không thể để trống
+10173=Cấu hình RAG api_key không thể chứa trình giữ chỗ, vui lòng thay thế bằng khóa API thực tế
+10174=Lỗi định dạng cấu hình RAG base_url, phải bắt đầu bằng http hoặc https
+10175=Địa chỉ Mac không thể để trống
+10176=Cấu hình RAG dataset_id không thể để trống
+10177=Cấu hình RAG model_id không thể để trống
+10178=Cấu hình RAG dataset_id và model_id không thể để trống
+10179=Tên tệp không thể để trống
+10180=Nội dung tệp không thể để trống
+10181=Tên nhân bản giọng nói không thể để trống
+10182=Không tìm thấy âm thanh nhân bản giọng nói
+10183=Không tìm thấy mẫu agent mặc định
\ No newline at end of file
diff --git a/main/manager-api/src/main/resources/i18n/validation_de_DE.properties b/main/manager-api/src/main/resources/i18n/validation_de_DE.properties
new file mode 100644
index 00000000..21923019
--- /dev/null
+++ b/main/manager-api/src/main/resources/i18n/validation_de_DE.properties
@@ -0,0 +1,34 @@
+#Deutsch
+id.require=ID darf nicht leer sein
+id.null=ID muss leer sein
+
+sort.number=Der Sortierwert darf nicht kleiner als 0 sein
+page.number=Der Seitenwert darf nicht kleiner als 0 sein
+limit.number=Der Limit-Wert darf nicht kleiner als 0 sein
+
+sysdict.type.require=Der Wörterbuchtyp darf nicht leer sein
+sysdict.name.require=Der Wörterbuchname darf nicht leer sein
+sysdict.label.require=Wörterbuch-Label darf nicht leer sein
+
+sysparams.paramcode.require=Parameter-Code darf nicht leer sein
+sysparams.paramvalue.require=Parameter-Werte dürfen nicht leer sein
+sysparams.valuetype.require=Werttyp darf nicht leer sein
+sysparams.valuetype.pattern=Werttyp muss string, number, boolean oder array sein
+
+sysuser.username.require=Der Benutzername darf nicht leer sein
+sysuser.password.require=Das Passwort darf nicht leer sein
+sysuser.realname.require=Der echte Name darf nicht leer sein
+sysuser.gender.range=Geschlecht liegt im Bereich von 0 bis 2
+sysuser.email.error=Falsches E-Mail-Format
+sysuser.deptId.require=Abteilungen dürfen nicht leer sein
+sysuser.status.range=Status liegt im Bereich von 0 bis 1
+sysuser.captcha.require=Das Captcha darf nicht leer sein
+sysuser.uuid.require=Der eindeutige Identifikator darf nicht leer sein
+
+timbre.languages.require=Die Sprache des Klangs darf nicht leer sein
+timbre.name.require=Der Name des Klangs darf nicht leer sein
+timbre.ttsModelId.require=Die TTS-Modell-ID des Klangs darf nicht leer sein
+timbre.ttsVoice.require=Die TTS-Stimme des Klangs darf nicht leer sein
+
+ota.device.not.found=Gerät nicht gefunden
+ota.device.need.bind={0} muss gebunden werden
diff --git a/main/manager-api/src/main/resources/i18n/validation_vi_VN.properties b/main/manager-api/src/main/resources/i18n/validation_vi_VN.properties
new file mode 100644
index 00000000..d143691c
--- /dev/null
+++ b/main/manager-api/src/main/resources/i18n/validation_vi_VN.properties
@@ -0,0 +1,34 @@
+# Tiếng Việt
+id.require=ID không được để trống
+id.null=ID phải để trống
+
+sort.number=Giá trị sắp xếp không thể nhỏ hơn 0
+page.number=Giá trị trang không thể nhỏ hơn 0
+limit.number=Giá trị giới hạn không thể nhỏ hơn 0
+
+sysdict.type.require=Loại từ điển không được để trống
+sysdict.name.require=Tên từ điển không được để trống
+sysdict.label.require=Thẻ từ điển không được để trống
+
+sysparams.paramcode.require=Mã tham số không được để trống
+sysparams.paramvalue.require=Giá trị tham số không được để trống
+sysparams.valuetype.require=Loại giá trị không được để trống
+sysparams.valuetype.pattern=Loại giá trị phải là chuỗi, số, boolean hoặc mảng
+
+sysuser.username.require=Tên người dùng không được để trống
+sysuser.password.require=Mật khẩu không được để trống
+sysuser.realname.require=Tên thật không được để trống
+sysuser.gender.range=Giới tính phải từ 0 đến 2
+sysuser.email.error=Định dạng email không chính xác
+sysuser.deptId.require=Phòng ban không được để trống
+sysuser.status.range=Trạng thái phải từ 0 đến 1
+sysuser.captcha.require=Mã xác thực không được để trống
+sysuser.uuid.require=Định danh duy nhất không được để trống
+
+timbre.languages.require=Ngôn ngữ của âm sắc không được để trống
+timbre.name.require=Tên âm sắc không được để trống
+timbre.ttsModelId.require=ID mô hình TTS của âm sắc không được để trống
+timbre.ttsVoice.require=Giọng TTS của âm sắc không được để trống
+
+ota.device.not.found=Không tìm thấy thiết bị
+ota.device.need.bind={0}
\ No newline at end of file
diff --git a/main/manager-web/src/components/HeaderBar.vue b/main/manager-web/src/components/HeaderBar.vue
index 42e3a520..5e522ded 100644
--- a/main/manager-web/src/components/HeaderBar.vue
+++ b/main/manager-web/src/components/HeaderBar.vue
@@ -238,6 +238,10 @@ export default {
return this.$t("language.zhTW");
case "en":
return this.$t("language.en");
+ case "de":
+ return this.$t("language.de");
+ case "vi":
+ return this.$t("language.vi");
default:
return this.$t("language.zhCN");
}
@@ -261,6 +265,14 @@ export default {
label: this.$t("language.en"),
value: "en",
},
+ {
+ label: this.$t("language.de"),
+ value: "de",
+ },
+ {
+ label: this.$t("language.vi"),
+ value: "vi",
+ },
],
},
{
diff --git a/main/manager-web/src/i18n/de.js b/main/manager-web/src/i18n/de.js
new file mode 100644
index 00000000..4f0f419a
--- /dev/null
+++ b/main/manager-web/src/i18n/de.js
@@ -0,0 +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!',
+
+ // 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...',
+
+ // 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',
+
+ // 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',
+
+ // 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',
+
+ // 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',
+
+ // 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',
+
+ // 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...',
+
+ // 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',
+
+ // 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',
+
+ // 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',
+
+ // 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',
+
+ // Message tips
+ 'message.success': 'Operation erfolgreich',
+ 'message.error': 'Operation fehlgeschlagen',
+ 'message.warning': 'Warnung',
+ 'message.info': 'Information',
+
+ // 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',
+
+ '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',
+
+ // System information
+ 'system.name': 'XiaoZhi Service',
+
+ // 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': 'Wörterbuchtyp-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': 'Wörterbuchtyp hinzufügen',
+ 'dictManagement.batchDeleteDictType': 'Wörterbuchtypen massenhaft löschen',
+ 'dictManagement.addDictData': 'Wörterbuchdaten hinzufügen',
+ 'dictManagement.batchDeleteDictData': 'Wörterbuchdaten 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',
+
+ // 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',
+
+ // 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 Jarvis',
+ 'home.wish': 'Lassen Sie uns einen wunderbaren Tag haben!',
+ 'home.languageModel': 'LLM',
+ 'home.voiceModel': 'TTS',
+ 'home.configureRole': 'Rollen konfig.',
+ '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',
+
+ // 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',
+
+ // 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': ' Sprach-Erkenn. ',
+ 'roleConfig.asr': 'Sprach-Erkenn.',
+ 'roleConfig.llm': 'Sprach-Mod.',
+ 'roleConfig.vllm': 'Vision-Modell',
+ 'roleConfig.tts': 'Text-zu-Sprache',
+ 'roleConfig.memoryHis': 'Speicher',
+ 'roleConfig.memory': 'Speicher-Mod.',
+ 'roleConfig.intent': 'Absichts-Erkenn.',
+ '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',
+
+ // 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ählen',
+ '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',
+
+ // 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',
+
+ // 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',
+
+ // 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.deleteCancelled': 'Löschen abgebrochen',
+
+ // 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.configSaved': 'Konfiguration erfolgreich gespeichert',
+ 'templateQuickConfig.configReset': 'Konfiguration wurde zurückgesetzt',
+ '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',
+
+ // 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 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 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 a1a40942..56394ec4 100644
--- a/main/manager-web/src/i18n/en.js
+++ b/main/manager-web/src/i18n/en.js
@@ -639,6 +639,8 @@ export default {
'language.zhCN': '中文简体',
'language.zhTW': '中文繁體',
'language.en': 'English',
+ 'language.de': 'Deutsch',
+ 'language.vi': 'Tiếng Việt',
// Home page text
'home.addAgent': 'Add Agent',
diff --git a/main/manager-web/src/i18n/index.js b/main/manager-web/src/i18n/index.js
index a4c8ecf4..ed285fee 100644
--- a/main/manager-web/src/i18n/index.js
+++ b/main/manager-web/src/i18n/index.js
@@ -3,6 +3,8 @@ import VueI18n from 'vue-i18n';
import zhCN from './zh_CN';
import zhTW from './zh_TW';
import en from './en';
+import de from './de';
+import vi from './vi';
Vue.use(VueI18n);
@@ -19,6 +21,12 @@ const getDefaultLanguage = () => {
}
return 'zh_CN';
}
+ if (browserLang.indexOf('de') === 0) {
+ return 'de';
+ }
+ if (browserLang.indexOf('vi') === 0) {
+ return 'vi';
+ }
return 'en';
};
@@ -28,7 +36,9 @@ const i18n = new VueI18n({
messages: {
'zh_CN': zhCN,
'zh_TW': zhTW,
- 'en': en
+ 'en': en,
+ 'de': de,
+ 'vi': vi
}
});
diff --git a/main/manager-web/src/i18n/vi.js b/main/manager-web/src/i18n/vi.js
new file mode 100644
index 00000000..19c5967c
--- /dev/null
+++ b/main/manager-web/src/i18n/vi.js
@@ -0,0 +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!',
+
+ // HeaderBar component text
+ 'header.smartManagement': 'Đại lý',
+ 'header.modelConfig': 'Mô hình',
+ 'header.knowledgeBase': 'Kiến thức',
+ 'header.voiceCloneManagement': 'Cloning',
+ 'header.voiceResourceManagement': 'Tài nguyên giọng nói',
+ 'header.userManagement': 'Người dùng',
+ 'header.otaManagement': 'Quản lý OTA',
+ 'header.paramDictionary': 'Thêm',
+ '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ụ...',
+
+ // 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ị',
+
+ // 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',
+
+ // 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',
+
+ // 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',
+
+ // 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',
+
+ // 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...',
+
+ // 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',
+
+ // 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',
+
+ // 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 ý',
+
+ // 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',
+
+ // 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',
+
+ // 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',
+
+ // 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',
+
+ // 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',
+
+ // 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',
+
+ // 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',
+
+ // Home page text
+ 'home.addAgent': 'Thêm đại lý',
+ 'home.greeting': 'Xin chào Jarvis',
+ '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 đại lý 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',
+
+ // 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 đại lý',
+ 'addAgentDialog.agentName': 'Tên đại lý',
+ 'addAgentDialog.placeholder': 'Vui lòng nhập tên đại lý..',
+ 'addAgentDialog.confirm': 'Xác nhận',
+ 'addAgentDialog.cancel': 'Hủy bỏ',
+ 'addAgentDialog.nameRequired': 'Vui lòng nhập tên đại lý',
+ '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': 'Văn bản & 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 đại lý.',
+ '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 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',
+
+ // 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à 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',
+
+ // 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',
+
+ // 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.deleteCancelled': 'Đã hủy xóa',
+
+ // 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.configSaved': 'Đã lưu cấu hình thành công',
+ 'templateQuickConfig.configReset': 'Cấu hình đã được đặt lại',
+ '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',
+
+ // Voice Clone and Resource Management
+ 'voiceClone.title': 'Cloning giọng',
+ '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': 'Cloning giọng',
+ '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ói này?',
+ 'voiceClone.onlySuccessCanClone': 'Chỉ những giọng nói đã được đào tạo thành công mới có thể được nhân bản',
+ '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 đào tạo',
+ 'voiceClone.trainSuccess': 'Đào tạo thành công',
+ 'voiceClone.trainFailed': 'Đào tạo 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': 'Cloning giọng',
+ '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 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 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 9bf780bc..63434c42 100644
--- a/main/manager-web/src/i18n/zh_CN.js
+++ b/main/manager-web/src/i18n/zh_CN.js
@@ -639,6 +639,8 @@ export default {
'language.zhCN': '中文简体',
'language.zhTW': '中文繁體',
'language.en': 'English',
+ 'language.de': 'Deutsch',
+ 'language.vi': 'Tiếng Việt',
// 首页文本
'home.addAgent': '添加智能体',
diff --git a/main/manager-web/src/i18n/zh_TW.js b/main/manager-web/src/i18n/zh_TW.js
index 55927fa7..02134a87 100644
--- a/main/manager-web/src/i18n/zh_TW.js
+++ b/main/manager-web/src/i18n/zh_TW.js
@@ -639,6 +639,8 @@ export default {
'language.zhCN': '中文简体',
'language.zhTW': '中文繁體',
'language.en': 'English',
+ 'language.de': 'Deutsch',
+ 'language.vi': 'Tiếng Việt',
// 首頁文本
'home.addAgent': '添加智能體',
diff --git a/main/manager-web/src/views/login.vue b/main/manager-web/src/views/login.vue
index fc9c271e..9d56fdc5 100644
--- a/main/manager-web/src/views/login.vue
+++ b/main/manager-web/src/views/login.vue
@@ -49,6 +49,12 @@
{{ $t("language.en") }}
+
+ {{ $t("language.de") }}
+
+
+ {{ $t("language.vi") }}
+
@@ -177,6 +183,10 @@ export default {
return this.$t("language.zhTW");
case "en":
return this.$t("language.en");
+ case "de":
+ return this.$t("language.de");
+ case "vi":
+ return this.$t("language.vi");
default:
return this.$t("language.zhCN");
}