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"); }