From f8a96054173a1f9c17cedc8ecc20cef6b02ac91e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 24 Jun 2026 05:54:21 +0000 Subject: [PATCH 1/9] chore(i18n): sync translations with en-US (#37855) Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com> --- web/i18n/ar-TN/dataset-pipeline.json | 2 +- web/i18n/ar-TN/plugin.json | 31 ++++++++++++++++++++ web/i18n/de-DE/dataset-pipeline.json | 2 +- web/i18n/de-DE/plugin.json | 31 ++++++++++++++++++++ web/i18n/es-ES/dataset-pipeline.json | 2 +- web/i18n/es-ES/plugin.json | 33 ++++++++++++++++++++- web/i18n/fa-IR/dataset-pipeline.json | 2 +- web/i18n/fa-IR/plugin.json | 33 ++++++++++++++++++++- web/i18n/fr-FR/dataset-pipeline.json | 2 +- web/i18n/fr-FR/plugin.json | 33 ++++++++++++++++++++- web/i18n/hi-IN/dataset-pipeline.json | 2 +- web/i18n/hi-IN/plugin.json | 43 ++++++++++++++++++++++++---- web/i18n/id-ID/dataset-pipeline.json | 2 +- web/i18n/id-ID/plugin.json | 33 ++++++++++++++++++++- web/i18n/it-IT/dataset-pipeline.json | 2 +- web/i18n/it-IT/plugin.json | 33 ++++++++++++++++++++- web/i18n/ja-JP/plugin.json | 28 ++++++++++++++++++ web/i18n/ko-KR/dataset-pipeline.json | 2 +- web/i18n/ko-KR/plugin.json | 31 ++++++++++++++++++++ web/i18n/nl-NL/dataset-pipeline.json | 2 +- web/i18n/nl-NL/plugin.json | 33 ++++++++++++++++++++- web/i18n/pl-PL/dataset-pipeline.json | 2 +- web/i18n/pl-PL/plugin.json | 33 ++++++++++++++++++++- web/i18n/pt-BR/dataset-pipeline.json | 2 +- web/i18n/pt-BR/plugin.json | 33 ++++++++++++++++++++- web/i18n/ro-RO/dataset-pipeline.json | 2 +- web/i18n/ro-RO/plugin.json | 31 ++++++++++++++++++++ web/i18n/ru-RU/dataset-pipeline.json | 2 +- web/i18n/ru-RU/plugin.json | 31 ++++++++++++++++++++ web/i18n/sl-SI/dataset-pipeline.json | 2 +- web/i18n/sl-SI/plugin.json | 31 ++++++++++++++++++++ web/i18n/th-TH/dataset-pipeline.json | 2 +- web/i18n/th-TH/plugin.json | 33 ++++++++++++++++++++- web/i18n/tr-TR/dataset-pipeline.json | 2 +- web/i18n/tr-TR/plugin.json | 31 ++++++++++++++++++++ web/i18n/uk-UA/dataset-pipeline.json | 2 +- web/i18n/uk-UA/plugin.json | 31 ++++++++++++++++++++ web/i18n/vi-VN/dataset-pipeline.json | 2 +- web/i18n/vi-VN/plugin.json | 31 ++++++++++++++++++++ web/i18n/zh-Hant/plugin.json | 35 ++++++++++++++++++++-- 40 files changed, 684 insertions(+), 36 deletions(-) diff --git a/web/i18n/ar-TN/dataset-pipeline.json b/web/i18n/ar-TN/dataset-pipeline.json index 5be245018e0..7ad5276fe74 100644 --- a/web/i18n/ar-TN/dataset-pipeline.json +++ b/web/i18n/ar-TN/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "هذا الإجراء دائم. لن تتمكن من العودة إلى الطريقة السابقة. يرجى التأكيد للتحويل.", "conversion.confirm.title": "تأكيد", "conversion.descriptionChunk1": "يمكنك الآن تحويل قاعدة المعرفة الحالية لاستخدام سير عمل المعرفة لمعالجة المستندات", - "conversion.descriptionChunk2": " - نهج أكثر انفتاحًا ومرونة مع الوصول إلى الإضافات من سوقنا. سيطبق هذا طريقة المعالجة الجديدة على جميع المستندات المستقبلية.", + "conversion.descriptionChunk2": " — نهج أكثر انفتاحًا ومرونة مع الوصول إلى الإضافات من السوق. سيطبق هذا طريقة المعالجة الجديدة على جميع المستندات المستقبلية.", "conversion.errorMessage": "فشل تحويل مجموعة البيانات إلى سير عمل", "conversion.successMessage": "تم تحويل مجموعة البيانات إلى سير عمل بنجاح", "conversion.title": "التحويل إلى سير عمل المعرفة", diff --git a/web/i18n/ar-TN/plugin.json b/web/i18n/ar-TN/plugin.json index a784c02e7f0..f46ef50eb18 100644 --- a/web/i18n/ar-TN/plugin.json +++ b/web/i18n/ar-TN/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "استخدام تفويض OAuth", "auth.whoCanUse": "من يستطيع استخدامه", "auth.workspaceDefault": "افتراضي مساحة العمل", + "autoUpdate.autoUpdate": "التحديث التلقائي", + "autoUpdate.autoUpdateSettings": "إعدادات التحديث التلقائي", "autoUpdate.automaticUpdates": "تحديثات تلقائية", "autoUpdate.changeTimezone": "لتغيير المنطقة الزمنية، انتقل إلى الإعدادات", "autoUpdate.excludeUpdate": "لن يتم تحديث الإضافات {{num}} التالية تلقائيًا", + "autoUpdate.excludeUpdate_one": "لن يتم تحديث الإضافة {{num}} التالية تلقائيًا", + "autoUpdate.excludeUpdate_other": "لن يتم تحديث الإضافات {{num}} التالية تلقائيًا", "autoUpdate.nextUpdateTime": "التحديث التلقائي التالي: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "لم يتم العثور على أي إضافات", "autoUpdate.noPluginPlaceholder.noInstalled": "لم يتم تثبيت أي إضافات", "autoUpdate.operation.clearAll": "مسح الكل", "autoUpdate.operation.select": "تحديد الإضافات", "autoUpdate.partialUPdate": "سيتم تحديث الإضافات {{num}} التالية فقط تلقائيًا", + "autoUpdate.partialUPdate_one": "سيتم تحديث الإضافة {{num}} التالية فقط تلقائيًا", + "autoUpdate.partialUPdate_other": "سيتم تحديث الإضافات {{num}} التالية فقط تلقائيًا", "autoUpdate.pluginDowngradeWarning.description": "التحديث التلقائي ممكن حاليًا لهذه الإضافة. قد يؤدي خفض الإصدار إلى استبدال تغييراتك أثناء التحديث التلقائي التالي.", "autoUpdate.pluginDowngradeWarning.downgrade": "خفض على أي حال", "autoUpdate.pluginDowngradeWarning.exclude": "استبعاد من التحديث التلقائي", "autoUpdate.pluginDowngradeWarning.title": "خفض إصدار الإضافة", + "autoUpdate.scope": "النطاق", + "autoUpdate.scopeMode.all": "الكل", + "autoUpdate.scopeMode.exclude": "استبعاد المحدد", "autoUpdate.specifyPluginsToUpdate": "تحديد الإضافات للتحديث", "autoUpdate.strategy.disabled.description": "لن يتم تحديث الإضافات تلقائيًا", "autoUpdate.strategy.disabled.name": "معطل", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "تحديث", "detailPanel.operation.updateTooltip": "قم بالتحديث للوصول إلى أحدث النماذج.", "detailPanel.operation.viewDetail": "عرض التفاصيل", + "detailPanel.operation.viewReadme": "عرض الملف التمهيدي", "detailPanel.serviceOk": "الخدمة جيدة", "detailPanel.strategyNum": "{{num}} {{strategy}} متضمن", "detailPanel.switchVersion": "تبديل الإصدار", @@ -173,6 +183,7 @@ "installModal.back": "رجوع", "installModal.cancel": "إلغاء", "installModal.close": "إغلاق", + "installModal.dropIntegrationToInstall": "أفلت حزمة الإضافة هنا للتثبيت", "installModal.dropPluginToInstall": "أفلت حزمة الإضافة هنا للتثبيت", "installModal.fromTrustSource": "يرجى التأكد من تثبيت الإضافات فقط من مصدر موثوق.", "installModal.install": "تثبيت", @@ -182,7 +193,9 @@ "installModal.installPlugin": "تثبيت الإضافة", "installModal.installWarning": "لا يسمح بتثبيت هذه الإضافة.", "installModal.installedSuccessfully": "تم التثبيت بنجاح", + "installModal.installedSuccessfullyCountDesc": "تم تثبيت الإضافات {{num}} التالية بنجاح.", "installModal.installedSuccessfullyDesc": "تم تثبيت الإضافة بنجاح.", + "installModal.installedSuccessfullyWithPageDesc": "تم تثبيت الإضافة بنجاح. يمكنك العثور عليها في صفحة {{categoryName}}.", "installModal.installing": "جارٍ التثبيت...", "installModal.labels.package": "الحزمة", "installModal.labels.repository": "المستودع", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "على وشك تثبيت الإضافات {{num}} التالية", "installModal.uploadFailed": "فشل التحميل", "installModal.uploadingPackage": "جارٍ تحميل {{packageName}}...", + "installModal.viewDetails": "عرض التفاصيل", "installPlugin": "تثبيت الإضافة", + "list.noAgentStrategyFound": "لم يتم العثور على استراتيجية وكيل", + "list.noExtensionFound": "لم يتم العثور على ملحق", "list.noInstalled": "لم يتم تثبيت أي إضافات", + "list.noTriggerFound": "لم يتم العثور على مشغل", "list.notFound": "لم يتم العثور على أي إضافات", "list.source.github": "تثبيت من GitHub", "list.source.local": "تثبيت من ملف الحزمة المحلية", "list.source.marketplace": "تثبيت من السوق", + "marketplace.allPlugins": "جميع الإضافات", "marketplace.and": "و", + "marketplace.becomePartner": "كن شريكًا", "marketplace.difyMarketplace": "سوق Dify", "marketplace.discover": "اكتشف", "marketplace.empower": "تمكين تطوير الذكاء الاصطناعي الخاص بك", "marketplace.moreFrom": "المزيد من السوق", "marketplace.noPluginFound": "لم يتم العثور على إضافة", "marketplace.partnerTip": "تم التحقق بواسطة شريك Dify", + "marketplace.pluginsHeroSubtitle": "استخدم الإضافات التي بناها المجتمع لتعزيز تطوير الذكاء الاصطناعي الخاص بك.", + "marketplace.pluginsHeroTitle": "اكتشف. وسّع. ابنِ.", "marketplace.pluginsResult": "{{num}} نتائج", "marketplace.sortBy": "فرز حسب", "marketplace.sortOption.firstReleased": "صدر لأول مرة", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "تم التحقق بواسطة Dify", "marketplace.viewMore": "عرض المزيد", "metadata.title": "الإضافات", + "pluginDevelopmentGuide": "دليل تطوير الإضافات", "pluginInfoModal.packageName": "الحزمة", "pluginInfoModal.release": "الإصدار", "pluginInfoModal.repository": "المستودع", "pluginInfoModal.title": "معلومات الإضافة", + "pluginPublishGuide": "دليل نشر الإضافات", "privilege.admins": "المسؤولون", + "privilege.configurePermissionsInSettings": "انتقل إلى الإعدادات > الأدوار والأذونات لتكوين أذونات الإضافات.", "privilege.everyone": "الجميع", + "privilege.noDebugPermissionTooltip": "ليس لديك إذن لتصحيح الإضافات", + "privilege.noInstallPermissionTooltip": "ليس لديك إذن لتثبيت وإدارة الإضافات", "privilege.noone": "لا أحد", + "privilege.permissions": "الأذونات", + "privilege.quickWhoCanDebug": "من يمكنه التصحيح؟", + "privilege.quickWhoCanInstall": "من يمكنه التثبيت والإدارة؟", "privilege.title": "تفضيلات الإضافة", "privilege.whoCanDebug": "من يمكنه تصحيح الإضافات؟", "privilege.whoCanInstall": "من يمكنه تثبيت وإدارة الإضافات؟", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "لا يوجد ملف تمهيدي متاح", "readmeInfo.title": "الملف التمهيدي", "requestAPlugin": "طلب إضافة", + "requestSubmit": "طلب أو نشر", "search": "بحث", "searchCategories": "بحث في الفئات", "searchInMarketplace": "بحث في السوق", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "تثبيت {{installingLength}} إضافات، {{successLength}} نجاح.", "task.runningPlugins": "تثبيت الإضافات", "task.successPlugins": "تم تثبيت الإضافات بنجاح", + "templatePublishingGuide": "دليل نشر القوالب", "upgrade.close": "إغلاق", "upgrade.description": "على وشك تثبيت الإضافة التالية", "upgrade.successfulTitle": "تم التثبيت بنجاح", diff --git a/web/i18n/de-DE/dataset-pipeline.json b/web/i18n/de-DE/dataset-pipeline.json index d6867b2336e..563e35f9a6a 100644 --- a/web/i18n/de-DE/dataset-pipeline.json +++ b/web/i18n/de-DE/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "Diese Aktion ist dauerhaft. Sie können die vorherige Methode nicht wiederherstellen. Bitte bestätigen Sie, um umzurechnen.", "conversion.confirm.title": "Bestätigung", "conversion.descriptionChunk1": "Sie können jetzt Ihre vorhandene Wissensdatenbank konvertieren, um die Knowledge Pipeline für die Dokumentenverarbeitung zu verwenden", - "conversion.descriptionChunk2": "– ein offenerer und flexiblerer Ansatz mit Zugang zu Plugins aus unserem Marktplatz. Dadurch wird die neue Verarbeitungsmethode auf alle zukünftigen Dokumente angewendet.", + "conversion.descriptionChunk2": " – ein offenerer und flexiblerer Ansatz mit Zugang zu Plugins aus dem Marketplace. Dadurch wird die neue Verarbeitungsmethode auf alle zukünftigen Dokumente angewendet.", "conversion.errorMessage": "Fehler beim Konvertieren des Datasets in eine Pipeline.", "conversion.successMessage": "Erfolgreiches Konvertieren des Datasets in eine Pipeline", "conversion.title": "In Wissenspipeline konvertieren", diff --git a/web/i18n/de-DE/plugin.json b/web/i18n/de-DE/plugin.json index 80a810160e0..bb8700bbae0 100644 --- a/web/i18n/de-DE/plugin.json +++ b/web/i18n/de-DE/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "Verwenden Sie die OAuth-Authentifizierung", "auth.whoCanUse": "Wer kann verwenden", "auth.workspaceDefault": "Arbeitsbereich Standard", + "autoUpdate.autoUpdate": "Automatische Aktualisierung", + "autoUpdate.autoUpdateSettings": "Einstellungen für automatische Aktualisierung", "autoUpdate.automaticUpdates": "Automatische Updates", "autoUpdate.changeTimezone": "Um die Zeitzone zu ändern, gehen Sie zu Einstellungen ", "autoUpdate.excludeUpdate": "Die folgenden {{num}} Plugins werden nicht automatisch aktualisiert.", + "autoUpdate.excludeUpdate_one": "Das folgende {{num}} Plugin wird nicht automatisch aktualisiert", + "autoUpdate.excludeUpdate_other": "Die folgenden {{num}} Plugins werden nicht automatisch aktualisiert", "autoUpdate.nextUpdateTime": "Nächstes automatisches Update: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "Keine Plugins gefunden.", "autoUpdate.noPluginPlaceholder.noInstalled": "Keine Plugins installiert", "autoUpdate.operation.clearAll": "Alles löschen", "autoUpdate.operation.select": "Plugins auswählen", "autoUpdate.partialUPdate": "Nur die folgenden {{num}} Plugins werden automatisch aktualisiert", + "autoUpdate.partialUPdate_one": "Nur das folgende {{num}} Plugin wird automatisch aktualisiert", + "autoUpdate.partialUPdate_other": "Nur die folgenden {{num}} Plugins werden automatisch aktualisiert", "autoUpdate.pluginDowngradeWarning.description": "Die automatische Aktualisierung ist derzeit für dieses Plugin aktiviert. Ein Downgrade der Version kann dazu führen, dass Ihre Änderungen während des nächsten automatischen Updates überschrieben werden.", "autoUpdate.pluginDowngradeWarning.downgrade": "Trotzdem downgraden", "autoUpdate.pluginDowngradeWarning.exclude": "Von der automatischen Aktualisierung ausschließen", "autoUpdate.pluginDowngradeWarning.title": "Plugin Downgrade", + "autoUpdate.scope": "Geltungsbereich", + "autoUpdate.scopeMode.all": "Alle", + "autoUpdate.scopeMode.exclude": "Ausgewählte ausschließen", "autoUpdate.specifyPluginsToUpdate": "Geben Sie die zu aktualisierenden Plugins an", "autoUpdate.strategy.disabled.description": "Plugins werden nicht automatisch aktualisiert", "autoUpdate.strategy.disabled.name": "Behindert", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "Aktualisieren", "detailPanel.operation.updateTooltip": "Aktualisieren Sie, um auf die neuesten Modelle zuzugreifen.", "detailPanel.operation.viewDetail": "Im Detail sehen", + "detailPanel.operation.viewReadme": "README anzeigen", "detailPanel.serviceOk": "Service in Ordnung", "detailPanel.strategyNum": "{{num}} {{strategy}} IINKLUSIVE", "detailPanel.switchVersion": "Version wechseln", @@ -173,6 +183,7 @@ "installModal.back": "Zurück", "installModal.cancel": "Abbrechen", "installModal.close": "Schließen", + "installModal.dropIntegrationToInstall": "Legen Sie das Plugin-Paket hier ab, um es zu installieren", "installModal.dropPluginToInstall": "Legen Sie das Plugin-Paket hier ab, um es zu installieren", "installModal.fromTrustSource": "Bitte stellen Sie sicher, dass Sie nur Plugins aus einer vertrauenswürdigen Quelle installieren.", "installModal.install": "Installieren", @@ -182,7 +193,9 @@ "installModal.installPlugin": "Plugin installieren", "installModal.installWarning": "Dieses Plugin darf nicht installiert werden.", "installModal.installedSuccessfully": "Installation erfolgreich", + "installModal.installedSuccessfullyCountDesc": "Die folgenden {{num}} Plugins wurden erfolgreich installiert.", "installModal.installedSuccessfullyDesc": "Das Plugin wurde erfolgreich installiert.", + "installModal.installedSuccessfullyWithPageDesc": "Das Plugin wurde erfolgreich installiert. Sie finden es auf der Seite {{categoryName}}.", "installModal.installing": "Installation...", "installModal.labels.package": "Paket", "installModal.labels.repository": "Aufbewahrungsort", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "Über die Installation der folgenden {{num}} Plugins", "installModal.uploadFailed": "Upload fehlgeschlagen", "installModal.uploadingPackage": "Das Hochladen von {{packageName}}...", + "installModal.viewDetails": "Details anzeigen", "installPlugin": "Plugin installieren", + "list.noAgentStrategyFound": "Keine Agenten-Strategie gefunden", + "list.noExtensionFound": "Keine Erweiterung gefunden", "list.noInstalled": "Keine Plugins installiert", + "list.noTriggerFound": "Kein Auslöser gefunden", "list.notFound": "Keine Plugins gefunden", "list.source.github": "Installation von GitHub", "list.source.local": "Installation aus lokaler Paketdatei", "list.source.marketplace": "Installation aus dem Marketplace", + "marketplace.allPlugins": "Alle Plugins", "marketplace.and": "und", + "marketplace.becomePartner": "Partner werden", "marketplace.difyMarketplace": "Dify Marktplatz", "marketplace.discover": "Entdecken", "marketplace.empower": "Unterstützen Sie Ihre KI-Entwicklung", "marketplace.moreFrom": "Mehr aus dem Marketplace", "marketplace.noPluginFound": "Kein Plugin gefunden", "marketplace.partnerTip": "Von einem Dify-Partner verifiziert", + "marketplace.pluginsHeroSubtitle": "Nutzen Sie von der Community erstellte Plugins, um Ihre KI-Entwicklung voranzutreiben.", + "marketplace.pluginsHeroTitle": "Entdecken. Erweitern. Entwickeln.", "marketplace.pluginsResult": "{{num}} Ergebnisse", "marketplace.sortBy": "Sortieren nach", "marketplace.sortOption.firstReleased": "Zuerst veröffentlicht", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "Von Dify überprüft", "marketplace.viewMore": "Mehr anzeigen", "metadata.title": "Plugins", + "pluginDevelopmentGuide": "Leitfaden zur Plugin-Entwicklung", "pluginInfoModal.packageName": "Paket", "pluginInfoModal.release": "Loslassen", "pluginInfoModal.repository": "Aufbewahrungsort", "pluginInfoModal.title": "Plugin-Info", + "pluginPublishGuide": "Leitfaden zur Plugin-Veröffentlichung", "privilege.admins": "Administratoren", + "privilege.configurePermissionsInSettings": "Gehen Sie zu Einstellungen > Rollen & Berechtigungen, um die Plugin-Berechtigungen zu konfigurieren.", "privilege.everyone": "Jeder", + "privilege.noDebugPermissionTooltip": "Sie haben keine Berechtigung, Plugins zu debuggen", + "privilege.noInstallPermissionTooltip": "Sie haben keine Berechtigung, Plugins zu installieren und zu verwalten", "privilege.noone": "Niemand", + "privilege.permissions": "Berechtigungen", + "privilege.quickWhoCanDebug": "Wer kann debuggen?", + "privilege.quickWhoCanInstall": "Wer kann installieren und verwalten?", "privilege.title": "Plugin-Einstellungen", "privilege.whoCanDebug": "Wer kann Plugins debuggen?", "privilege.whoCanInstall": "Wer kann Plugins installieren und verwalten?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "Keine README verfügbar", "readmeInfo.title": "LIESMICH", "requestAPlugin": "Ein Plugin anfordern", + "requestSubmit": "Anfordern oder veröffentlichen", "search": "Suchen", "searchCategories": "Kategorien durchsuchen", "searchInMarketplace": "Suche im Marketplace", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "Installation von {{installingLength}} Plugins, {{successLength}} erfolgreich.", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "Leitfaden zur Vorlagen-Veröffentlichung", "upgrade.close": "Schließen", "upgrade.description": "Über die Installation des folgenden Plugins", "upgrade.successfulTitle": "Installation erfolgreich", diff --git a/web/i18n/es-ES/dataset-pipeline.json b/web/i18n/es-ES/dataset-pipeline.json index 27a4e6adaa1..93c1721c37c 100644 --- a/web/i18n/es-ES/dataset-pipeline.json +++ b/web/i18n/es-ES/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "Esta acción es permanente. No podrá volver al método anterior. Por favor, confirme para convertir.", "conversion.confirm.title": "Confirmación", "conversion.descriptionChunk1": "Ahora puede convertir su base de conocimientos existente para usar la canalización de conocimientos para el procesamiento de documentos", - "conversion.descriptionChunk2": "— un enfoque más abierto y flexible con acceso a complementos de nuestro mercado. Esto aplicará el nuevo método de procesamiento a todos los documentos futuros.", + "conversion.descriptionChunk2": " — un enfoque más abierto y flexible con acceso a integraciones del Marketplace. Esto aplicará el nuevo método de procesamiento a todos los documentos futuros.", "conversion.errorMessage": "No se pudo convertir el conjunto de datos en una canalización", "conversion.successMessage": "Convertir correctamente el conjunto de datos en una canalización", "conversion.title": "Convertir en canalización de conocimiento", diff --git a/web/i18n/es-ES/plugin.json b/web/i18n/es-ES/plugin.json index ec77e8c1e97..3db287f6322 100644 --- a/web/i18n/es-ES/plugin.json +++ b/web/i18n/es-ES/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "Usar autorización OAuth", "auth.whoCanUse": "¿Quién puede usar?", "auth.workspaceDefault": "Espacio de trabajo predeterminado", + "autoUpdate.autoUpdate": "Actualización automática", + "autoUpdate.autoUpdateSettings": "Configuración de actualización automática", "autoUpdate.automaticUpdates": "Actualizaciones automáticas", "autoUpdate.changeTimezone": "Para cambiar la zona horaria, ve a Configuración.", "autoUpdate.excludeUpdate": "Los siguientes {{num}} complementos no se actualizarán automáticamente", + "autoUpdate.excludeUpdate_one": "La siguiente {{num}} integración no se actualizará automáticamente", + "autoUpdate.excludeUpdate_other": "Las siguientes {{num}} integraciones no se actualizarán automáticamente", "autoUpdate.nextUpdateTime": "Próxima autoactualización: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "No se encontraron complementos", "autoUpdate.noPluginPlaceholder.noInstalled": "No hay plugins instalados", "autoUpdate.operation.clearAll": "Borrar todo", "autoUpdate.operation.select": "Seleccionar complementos", "autoUpdate.partialUPdate": "Solo los siguientes {{num}} complementos se actualizarán automáticamente", + "autoUpdate.partialUPdate_one": "Solo la siguiente {{num}} integración se actualizará automáticamente", + "autoUpdate.partialUPdate_other": "Solo las siguientes {{num}} integraciones se actualizarán automáticamente", "autoUpdate.pluginDowngradeWarning.description": "La actualización automática está actualmente habilitada para este complemento. Downgradear la versión puede hacer que tus cambios se sobrescriban durante la próxima actualización automática.", "autoUpdate.pluginDowngradeWarning.downgrade": "De todas formas, degradar", "autoUpdate.pluginDowngradeWarning.exclude": "Excluir de la actualización automática", "autoUpdate.pluginDowngradeWarning.title": "Degradar plugin", + "autoUpdate.scope": "Alcance", + "autoUpdate.scopeMode.all": "Todo", + "autoUpdate.scopeMode.exclude": "Excluir seleccionado", "autoUpdate.specifyPluginsToUpdate": "Especifique qué complementos actualizar", "autoUpdate.strategy.disabled.description": "Los plugins no se actualizarán automáticamente", "autoUpdate.strategy.disabled.name": "Discapacitado", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "Actualizar", "detailPanel.operation.updateTooltip": "Actualiza para acceder a los modelos más recientes.", "detailPanel.operation.viewDetail": "Ver Detalle", + "detailPanel.operation.viewReadme": "Ver README", "detailPanel.serviceOk": "Servicio OK", "detailPanel.strategyNum": "{{num}} {{strategy}} INCLUIDO", "detailPanel.switchVersion": "Versión del interruptor", @@ -173,6 +183,7 @@ "installModal.back": "Atrás", "installModal.cancel": "Cancelar", "installModal.close": "Cerrar", + "installModal.dropIntegrationToInstall": "Suelte el paquete de la integración aquí para instalarlo", "installModal.dropPluginToInstall": "Suelte el paquete del complemento aquí para instalarlo", "installModal.fromTrustSource": "Por favor, asegúrate de que sólo instalas plugins de una fuente de confianza.", "installModal.install": "Instalar", @@ -182,7 +193,9 @@ "installModal.installPlugin": "Instalar plugin", "installModal.installWarning": "Este plugin no está permitido para instalar.", "installModal.installedSuccessfully": "Instalación exitosa", + "installModal.installedSuccessfullyCountDesc": "Las siguientes {{num}} integraciones se han instalado correctamente.", "installModal.installedSuccessfullyDesc": "El plugin se ha instalado correctamente.", + "installModal.installedSuccessfullyWithPageDesc": "La integración se ha instalado correctamente. Puedes encontrarla en la página {{categoryName}}.", "installModal.installing": "Instalar...", "installModal.labels.package": "Paquete", "installModal.labels.repository": "Depósito", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "A punto de instalar los siguientes plugins {{num}}", "installModal.uploadFailed": "Error de carga", "installModal.uploadingPackage": "Subiendo {{packageName}}...", + "installModal.viewDetails": "Ver detalles", "installPlugin": "Instalar plugin", + "list.noAgentStrategyFound": "No se encontró ninguna estrategia de agente", + "list.noExtensionFound": "No se encontró ninguna extensión", "list.noInstalled": "No hay plugins instalados", + "list.noTriggerFound": "No se encontró ningún disparador", "list.notFound": "No se han encontrado plugins", "list.source.github": "Instalar desde GitHub", "list.source.local": "Instalar desde el archivo de paquete local", "list.source.marketplace": "Instalar desde Marketplace", + "marketplace.allPlugins": "Todas las integraciones", "marketplace.and": "y", + "marketplace.becomePartner": "Conviértete en socio", "marketplace.difyMarketplace": "Mercado de Dify", "marketplace.discover": "Descubrir", "marketplace.empower": "Potencie su desarrollo de IA", "marketplace.moreFrom": "Más de Marketplace", - "marketplace.noPluginFound": "No se ha encontrado ningún plugin", + "marketplace.noPluginFound": "No se ha encontrado ninguna integración", "marketplace.partnerTip": "Verificado por un socio de Dify", + "marketplace.pluginsHeroSubtitle": "Usa integraciones creadas por la comunidad para potenciar tu desarrollo de IA.", + "marketplace.pluginsHeroTitle": "Descubre. Amplía. Crea.", "marketplace.pluginsResult": "{{num}} resultados", "marketplace.sortBy": "Ordenar por", "marketplace.sortOption.firstReleased": "Lanzado por primera vez", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "Verificado por Dify", "marketplace.viewMore": "Ver más", "metadata.title": "Complementos", + "pluginDevelopmentGuide": "Guía de desarrollo de integraciones", "pluginInfoModal.packageName": "Paquete", "pluginInfoModal.release": "Lanzamiento", "pluginInfoModal.repository": "Depósito", "pluginInfoModal.title": "Información del plugin", + "pluginPublishGuide": "Guía de publicación de integraciones", "privilege.admins": "Administradores", + "privilege.configurePermissionsInSettings": "Ve a Configuración > Roles y permisos para configurar los permisos de las integraciones.", "privilege.everyone": "Todos", + "privilege.noDebugPermissionTooltip": "No tienes permiso para depurar integraciones", + "privilege.noInstallPermissionTooltip": "No tienes permiso para instalar y administrar integraciones", "privilege.noone": "Nadie", + "privilege.permissions": "Permisos", + "privilege.quickWhoCanDebug": "¿Quién puede depurar?", + "privilege.quickWhoCanInstall": "¿Quién puede instalar y administrar?", "privilege.title": "Preferencias del plugin", "privilege.whoCanDebug": "¿Quién puede depurar plugins?", "privilege.whoCanInstall": "¿Quién puede instalar y administrar complementos?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "No hay archivo README disponible", "readmeInfo.title": "LEEME", "requestAPlugin": "Solicitar un plugin", + "requestSubmit": "Solicitar o publicar", "search": "Buscar", "searchCategories": "Categorías de búsqueda", "searchInMarketplace": "Buscar en Marketplace", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "Instalando plugins {{installingLength}}, {{successLength}} éxito.", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "Guía de publicación de plantillas", "upgrade.close": "Cerrar", "upgrade.description": "A punto de instalar el siguiente plugin", "upgrade.successfulTitle": "Instalación correcta", diff --git a/web/i18n/fa-IR/dataset-pipeline.json b/web/i18n/fa-IR/dataset-pipeline.json index a8582273391..db65d4ec4c0 100644 --- a/web/i18n/fa-IR/dataset-pipeline.json +++ b/web/i18n/fa-IR/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "این عمل دائمی است. نمی توانید به روش قبلی برگردید. لطفا برای تبدیل تأیید کنید.", "conversion.confirm.title": "تایید", "conversion.descriptionChunk1": "اکنون می توانید پایگاه دانش موجود خود را برای استفاده از خط لوله دانش برای پردازش اسناد تبدیل کنید", - "conversion.descriptionChunk2": "- یک رویکرد بازتر و انعطاف پذیرتر با دسترسی به افزونه ها از بازار ما. این روش پردازش جدید را برای تمام اسناد آینده اعمال می کند.", + "conversion.descriptionChunk2": " — یک رویکرد بازتر و انعطاف‌پذیرتر با دسترسی به افزونه‌ها از Marketplace. این روش پردازش جدید را برای تمام اسناد آینده اعمال می‌کند.", "conversion.errorMessage": "تبدیل مجموعه داده به خط لوله انجام نشد", "conversion.successMessage": "مجموعه داده را با موفقیت به یک خط لوله تبدیل کرد", "conversion.title": "تبدیل به پایپ لاین دانش", diff --git a/web/i18n/fa-IR/plugin.json b/web/i18n/fa-IR/plugin.json index b00896bd026..0ff89d623c2 100644 --- a/web/i18n/fa-IR/plugin.json +++ b/web/i18n/fa-IR/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "از مجوز OAuth استفاده کنید", "auth.whoCanUse": "چه کسی می تواند استفاده کند", "auth.workspaceDefault": "پیش فرض محیط کار", + "autoUpdate.autoUpdate": "به‌روزرسانی خودکار", + "autoUpdate.autoUpdateSettings": "تنظیمات به‌روزرسانی خودکار", "autoUpdate.automaticUpdates": "بروز رسانی خودکار", "autoUpdate.changeTimezone": "برای تغییر منطقه زمانی، به تنظیمات بروید", "autoUpdate.excludeUpdate": "پلاگین‌های زیر {{num}} به‌طور خودکار به‌روزرسانی نخواهند شد", + "autoUpdate.excludeUpdate_one": "افزونه {{num}} زیر به‌طور خودکار به‌روزرسانی نخواهد شد", + "autoUpdate.excludeUpdate_other": "افزونه‌های {{num}} زیر به‌طور خودکار به‌روزرسانی نخواهند شد", "autoUpdate.nextUpdateTime": "به‌روزرسانی خودکار بعدی: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "هیچ افزونه‌ای یافت نشد", "autoUpdate.noPluginPlaceholder.noInstalled": "هیچ افزونه‌ای نصب نشده است", "autoUpdate.operation.clearAll": "همه را پاک کن", "autoUpdate.operation.select": "افزونه‌ها را انتخاب کنید", "autoUpdate.partialUPdate": "تنها {{num}} پلاگین زیر به‌طور خودکار به‌روزرسانی خواهد شد.", + "autoUpdate.partialUPdate_one": "تنها افزونه {{num}} زیر به‌طور خودکار به‌روزرسانی خواهد شد", + "autoUpdate.partialUPdate_other": "تنها افزونه‌های {{num}} زیر به‌طور خودکار به‌روزرسانی خواهند شد", "autoUpdate.pluginDowngradeWarning.description": "به‌روزرسانی خودکار برای این افزونه در حال حاضر فعال است. کاهش نسخه ممکن است باعث شود تغییرات شما در حین به‌روزرسانی خودکار بعدی نادیده گرفته شود.", "autoUpdate.pluginDowngradeWarning.downgrade": "به هر حال تنزل دهید", "autoUpdate.pluginDowngradeWarning.exclude": "از بروزرسانی خودکار مستثنی شود", "autoUpdate.pluginDowngradeWarning.title": "کاهش نسخه افزونه", + "autoUpdate.scope": "دامنه", + "autoUpdate.scopeMode.all": "همه", + "autoUpdate.scopeMode.exclude": "موارد انتخاب شده را مستثنی کن", "autoUpdate.specifyPluginsToUpdate": "ماژول‌هایی را برای به‌روزرسانی مشخص کنید", "autoUpdate.strategy.disabled.description": "پلاگین‌ها به‌طور خودکار به‌روزرسانی نخواهند شد", "autoUpdate.strategy.disabled.name": "ناتوان", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "روز رسانی", "detailPanel.operation.updateTooltip": "به‌روزرسانی کنید تا به جدیدترین مدل‌ها دسترسی پیدا کنید.", "detailPanel.operation.viewDetail": "نمایش جزئیات", + "detailPanel.operation.viewReadme": "مشاهده README", "detailPanel.serviceOk": "خدمات خوب", "detailPanel.strategyNum": "{{num}} {{strategy}} شامل", "detailPanel.switchVersion": "نسخه سوئیچ", @@ -173,6 +183,7 @@ "installModal.back": "بازگشت", "installModal.cancel": "لغو", "installModal.close": "نزدیک", + "installModal.dropIntegrationToInstall": "بسته افزونه را برای نصب اینجا رها کنید", "installModal.dropPluginToInstall": "بسته افزونه را برای نصب اینجا رها کنید", "installModal.fromTrustSource": "لطفا مطمئن شوید که افزونه ها را فقط از یک منبع قابل اعتماد نصب می کنید.", "installModal.install": "نصب", @@ -182,7 +193,9 @@ "installModal.installPlugin": "افزونه را نصب کنید", "installModal.installWarning": "این افزونه اجازه نصب ندارد.", "installModal.installedSuccessfully": "نصب موفقیت آمیز بود", + "installModal.installedSuccessfullyCountDesc": "افزونه‌های {{num}} زیر با موفقیت نصب شدند.", "installModal.installedSuccessfullyDesc": "این افزونه با موفقیت نصب شد.", + "installModal.installedSuccessfullyWithPageDesc": "این افزونه با موفقیت نصب شد. می‌توانید آن را در صفحه {{categoryName}} پیدا کنید.", "installModal.installing": "نصب...", "installModal.labels.package": "بسته", "installModal.labels.repository": "مخزن", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "در شرف نصب افزونه های {{num}} زیر", "installModal.uploadFailed": "آپلود انجام نشد", "installModal.uploadingPackage": "آپلود {{packageName}}...", + "installModal.viewDetails": "نمایش جزئیات", "installPlugin": "افزونه را نصب کنید", + "list.noAgentStrategyFound": "هیچ استراتژی عاملی یافت نشد", + "list.noExtensionFound": "هیچ افزونه‌ای یافت نشد", "list.noInstalled": "هیچ افزونه ای نصب نشده است", + "list.noTriggerFound": "هیچ محرکی یافت نشد", "list.notFound": "هیچ افزونه ای یافت نشد", "list.source.github": "نصب از GitHub", "list.source.local": "نصب از فایل بسته محلی", "list.source.marketplace": "از Marketplace نصب کنید", + "marketplace.allPlugins": "همه افزونه‌ها", "marketplace.and": "و", + "marketplace.becomePartner": "شریک شوید", "marketplace.difyMarketplace": "بازار دیفی", "marketplace.discover": "کشف", "marketplace.empower": "توسعه هوش مصنوعی خود را توانمند کنید", "marketplace.moreFrom": "اطلاعات بیشتر از Marketplace", - "marketplace.noPluginFound": "هیچ افزونه ای یافت نشد", + "marketplace.noPluginFound": "هیچ افزونه‌ای یافت نشد", "marketplace.partnerTip": "تأیید شده توسط یک شریک دیفی", + "marketplace.pluginsHeroSubtitle": "از افزونه‌های ساخته‌شده توسط جامعه برای تقویت توسعه هوش مصنوعی خود استفاده کنید.", + "marketplace.pluginsHeroTitle": "کشف کنید. گسترش دهید. بسازید.", "marketplace.pluginsResult": "نتایج {{num}}", "marketplace.sortBy": "شهر سیاه", "marketplace.sortOption.firstReleased": "اولین منتشر شد", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "تأیید شده توسط دیفی", "marketplace.viewMore": "بیشتر ببینید", "metadata.title": "پلاگین ها", + "pluginDevelopmentGuide": "راهنمای توسعه افزونه", "pluginInfoModal.packageName": "بسته", "pluginInfoModal.release": "انتشار", "pluginInfoModal.repository": "مخزن", "pluginInfoModal.title": "اطلاعات پلاگین", + "pluginPublishGuide": "راهنمای انتشار افزونه", "privilege.admins": "مدیران", + "privilege.configurePermissionsInSettings": "برای پیکربندی مجوزهای افزونه به تنظیمات > نقش‌ها و مجوزها بروید.", "privilege.everyone": "همه", + "privilege.noDebugPermissionTooltip": "شما اجازه اشکال‌زدایی افزونه‌ها را ندارید", + "privilege.noInstallPermissionTooltip": "شما اجازه نصب و مدیریت افزونه‌ها را ندارید", "privilege.noone": "هیچ", + "privilege.permissions": "مجوزها", + "privilege.quickWhoCanDebug": "چه کسی می‌تواند اشکال‌زدایی کند؟", + "privilege.quickWhoCanInstall": "چه کسی می‌تواند نصب و مدیریت کند؟", "privilege.title": "تنظیمات پلاگین", "privilege.whoCanDebug": "چه کسی می تواند افزونه ها را اشکال زدایی کند؟", "privilege.whoCanInstall": "چه کسی می تواند افزونه ها را نصب و مدیریت کند؟", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "بدون پرونده README موجود", "readmeInfo.title": "خواندنی", "requestAPlugin": "درخواست یک افزونه", + "requestSubmit": "درخواست یا انتشار", "search": "جستجو", "searchCategories": "دسته بندی ها را جستجو کنید", "searchInMarketplace": "جستجو در Marketplace", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "نصب پلاگین های {{installingLength}}، {{successLength}} موفقیت آمیز است.", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "راهنمای انتشار الگو", "upgrade.close": "نزدیک", "upgrade.description": "در مورد نصب افزونه زیر", "upgrade.successfulTitle": "نصب موفقیت آمیز", diff --git a/web/i18n/fr-FR/dataset-pipeline.json b/web/i18n/fr-FR/dataset-pipeline.json index 46c3ead1743..621de36994b 100644 --- a/web/i18n/fr-FR/dataset-pipeline.json +++ b/web/i18n/fr-FR/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "Cette action est permanente. Vous ne pourrez pas revenir à la méthode précédente. Veuillez confirmer la conversion.", "conversion.confirm.title": "Confirmation", "conversion.descriptionChunk1": "Vous pouvez désormais convertir votre base de connaissances existante pour utiliser le pipeline de connaissances pour le traitement des documents", - "conversion.descriptionChunk2": "— une approche plus ouverte et plus flexible avec un accès aux plugins de notre Marketplace. Cela appliquera la nouvelle méthode de traitement à tous les documents futurs.", + "conversion.descriptionChunk2": " — une approche plus ouverte et plus flexible avec un accès aux plugins du Marketplace. Cela appliquera la nouvelle méthode de traitement à tous les documents futurs.", "conversion.errorMessage": "Échec de la conversion du jeu de données en pipeline", "conversion.successMessage": "Conversion réussie du jeu de données en pipeline", "conversion.title": "Convertir vers le pipeline de connaissances", diff --git a/web/i18n/fr-FR/plugin.json b/web/i18n/fr-FR/plugin.json index 7a645f65193..55b244e6742 100644 --- a/web/i18n/fr-FR/plugin.json +++ b/web/i18n/fr-FR/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "Utilisez l'autorisation OAuth", "auth.whoCanUse": "Qui peut utiliser", "auth.workspaceDefault": "Espace de travail par défaut", + "autoUpdate.autoUpdate": "Mise à jour automatique", + "autoUpdate.autoUpdateSettings": "Paramètres de mise à jour automatique", "autoUpdate.automaticUpdates": "Mises à jour automatiques", "autoUpdate.changeTimezone": "Pour changer de fuseau horaire, allez dans Paramètres", "autoUpdate.excludeUpdate": "Les {{num}} plugins suivants ne se mettront pas à jour automatiquement", + "autoUpdate.excludeUpdate_one": "Le {{num}} plugin suivant ne se mettra pas à jour automatiquement", + "autoUpdate.excludeUpdate_other": "Les {{num}} plugins suivants ne se mettront pas à jour automatiquement", "autoUpdate.nextUpdateTime": "Prochaine mise à jour automatique : {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "Aucun plugin n'a été trouvé", "autoUpdate.noPluginPlaceholder.noInstalled": "Aucun plugin installé", "autoUpdate.operation.clearAll": "Tout effacer", "autoUpdate.operation.select": "Sélectionner des plugins", "autoUpdate.partialUPdate": "Seuls les {{num}} plugins suivants se mettront à jour automatiquement", + "autoUpdate.partialUPdate_one": "Seul le {{num}} plugin suivant se mettra à jour automatiquement", + "autoUpdate.partialUPdate_other": "Seuls les {{num}} plugins suivants se mettront à jour automatiquement", "autoUpdate.pluginDowngradeWarning.description": "La mise à jour automatique est actuellement activée pour ce plugin. Le fait de rétrograder la version peut entraîner la perte de vos modifications lors de la prochaine mise à jour automatique.", "autoUpdate.pluginDowngradeWarning.downgrade": "Dégradez de toute façon", "autoUpdate.pluginDowngradeWarning.exclude": "Exclure de la mise à jour automatique", "autoUpdate.pluginDowngradeWarning.title": "Baisse de version du plugin", + "autoUpdate.scope": "Portée", + "autoUpdate.scopeMode.all": "Tout", + "autoUpdate.scopeMode.exclude": "Exclure la sélection", "autoUpdate.specifyPluginsToUpdate": "Spécifiez les plugins à mettre à jour", "autoUpdate.strategy.disabled.description": "Les plugins ne se mettront pas à jour automatiquement", "autoUpdate.strategy.disabled.name": "désactivé", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "Mettre à jour", "detailPanel.operation.updateTooltip": "Mettez à jour pour accéder aux derniers modèles.", "detailPanel.operation.viewDetail": "Voir les détails", + "detailPanel.operation.viewReadme": "Voir le README", "detailPanel.serviceOk": "Service OK", "detailPanel.strategyNum": "{{num}} {{strategy}} INCLUS", "detailPanel.switchVersion": "Version du commutateur", @@ -173,6 +183,7 @@ "installModal.back": "Précédent", "installModal.cancel": "Annuler", "installModal.close": "Fermer", + "installModal.dropIntegrationToInstall": "Déposez le package de plugin ici pour l’installer", "installModal.dropPluginToInstall": "Déposez le package de plugin ici pour l’installer", "installModal.fromTrustSource": "Assurez-vous de n’installer que des plugins provenant d’une source fiable.", "installModal.install": "Installer", @@ -182,7 +193,9 @@ "installModal.installPlugin": "Installer le plugin", "installModal.installWarning": "Ce plugin n’est pas autorisé à être installé.", "installModal.installedSuccessfully": "Installation réussie", + "installModal.installedSuccessfullyCountDesc": "Les {{num}} plugins suivants ont été installés avec succès.", "installModal.installedSuccessfullyDesc": "Le plugin a été installé avec succès.", + "installModal.installedSuccessfullyWithPageDesc": "Le plugin a été installé avec succès. Vous pouvez le trouver sur la page {{categoryName}}.", "installModal.installing": "Installation...", "installModal.labels.package": "Colis", "installModal.labels.repository": "Dépôt", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "Sur le point d’installer les plugins {{num}} suivants", "installModal.uploadFailed": "Échec du téléchargement", "installModal.uploadingPackage": "Téléchargement de {{packageName}}...", + "installModal.viewDetails": "Voir les détails", "installPlugin": "Installer le plugin", + "list.noAgentStrategyFound": "Aucune stratégie d’agent trouvée", + "list.noExtensionFound": "Aucune extension trouvée", "list.noInstalled": "Aucun plugin installé", + "list.noTriggerFound": "Aucun déclencheur trouvé", "list.notFound": "Aucun plugin trouvé", "list.source.github": "Installer à partir de GitHub", "list.source.local": "Installer à partir d’un fichier de package local", "list.source.marketplace": "Installer à partir de Marketplace", + "marketplace.allPlugins": "Toutes les intégrations", "marketplace.and": "et", + "marketplace.becomePartner": "Devenir partenaire", "marketplace.difyMarketplace": "Marché Dify", "marketplace.discover": "Découvrir", "marketplace.empower": "Renforcez le développement de votre IA", "marketplace.moreFrom": "Plus de Marketplace", - "marketplace.noPluginFound": "Aucun plugin trouvé", + "marketplace.noPluginFound": "Aucune intégration trouvée", "marketplace.partnerTip": "Vérifié par un partenaire Dify", + "marketplace.pluginsHeroSubtitle": "Utilisez des intégrations créées par la communauté pour propulser votre développement de l’IA.", + "marketplace.pluginsHeroTitle": "Découvrir. Étendre. Construire.", "marketplace.pluginsResult": "{{num}} résultats", "marketplace.sortBy": "Ville noire", "marketplace.sortOption.firstReleased": "Première sortie", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "Vérifié par Dify", "marketplace.viewMore": "Voir plus", "metadata.title": "Plugins", + "pluginDevelopmentGuide": "Guide de développement d’intégration", "pluginInfoModal.packageName": "Colis", "pluginInfoModal.release": "Libérer", "pluginInfoModal.repository": "Dépôt", "pluginInfoModal.title": "Informations sur le plugin", + "pluginPublishGuide": "Guide de publication d’intégration", "privilege.admins": "Administrateurs", + "privilege.configurePermissionsInSettings": "Allez dans Paramètres > Rôles et permissions pour configurer les permissions des plugins.", "privilege.everyone": "Tout le monde", + "privilege.noDebugPermissionTooltip": "Vous n’avez pas l’autorisation de déboguer les intégrations", + "privilege.noInstallPermissionTooltip": "Vous n’avez pas l’autorisation d’installer et de gérer les intégrations", "privilege.noone": "Personne", + "privilege.permissions": "Permissions", + "privilege.quickWhoCanDebug": "Qui peut déboguer ?", + "privilege.quickWhoCanInstall": "Qui peut installer et gérer ?", "privilege.title": "Préférences du plugin", "privilege.whoCanDebug": "Qui peut déboguer les plugins ?", "privilege.whoCanInstall": "Qui peut installer et gérer les plugins ?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "Aucun README disponible", "readmeInfo.title": "Lisez-moi", "requestAPlugin": "Demander un plugin", + "requestSubmit": "Demander ou publier", "search": "Rechercher", "searchCategories": "Catégories de recherche", "searchInMarketplace": "Rechercher sur Marketplace", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "Installation des plugins {{installingLength}}, succès de {{successLength}}.", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "Guide de publication de modèle", "upgrade.close": "Fermer", "upgrade.description": "Sur le point d’installer le plugin suivant", "upgrade.successfulTitle": "Installation réussie", diff --git a/web/i18n/hi-IN/dataset-pipeline.json b/web/i18n/hi-IN/dataset-pipeline.json index 1a8cc033f88..1f49efdb2bc 100644 --- a/web/i18n/hi-IN/dataset-pipeline.json +++ b/web/i18n/hi-IN/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "यह कार्रवाई स्थायी है। आप पिछले तरीके पर वापस नहीं जा पाएंगे। कृपया परिवर्तन की पुष्टि करें।", "conversion.confirm.title": "पुष्टि", "conversion.descriptionChunk1": "आप अब अपने मौजूदा ज्ञान आधार को दस्तावेज़ प्रसंस्करण के लिए ज्ञान पाइपलाइन में बदल सकते हैं", - "conversion.descriptionChunk2": "— एक अधिक खुला और लचीला दृष्टिकोण जो हमारे मार्केटप्लेस से प्लगइन्स तक पहुंच प्रदान करता है। यह नए प्रसंस्करण पद्धति को सभी भविष्य के दस्तावेजों पर लागू करेगा।", + "conversion.descriptionChunk2": " — एक अधिक खुला और लचीला दृष्टिकोण जो मार्केटप्लेस से इंटीग्रेशन तक पहुंच प्रदान करता है। यह नई प्रसंस्करण पद्धति को सभी भविष्य के दस्तावेजों पर लागू करेगा।", "conversion.errorMessage": "डेटासेट को पाइपलाइन में परिवर्तित करने में विफल रहा", "conversion.successMessage": "डेटासेट को एक पाइपलाइन में सफलतापूर्वक रूपांतरित किया गया है", "conversion.title": "ज्ञान पाइपलाइन में परिवर्तित करें", diff --git a/web/i18n/hi-IN/plugin.json b/web/i18n/hi-IN/plugin.json index d0cf6609e16..844ee11541e 100644 --- a/web/i18n/hi-IN/plugin.json +++ b/web/i18n/hi-IN/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "OAuth प्राधिकरण का उपयोग करें", "auth.whoCanUse": "कौन उपयोग कर सकता है", "auth.workspaceDefault": "कार्यस्थल डिफ़ॉल्ट", + "autoUpdate.autoUpdate": "स्वतः अपडेट", + "autoUpdate.autoUpdateSettings": "स्वतः अपडेट सेटिंग्स", "autoUpdate.automaticUpdates": "स्वचालित अपडेट", "autoUpdate.changeTimezone": "समय क्षेत्र बदलने के लिए, सेटिंग्स पर जाएं", - "autoUpdate.excludeUpdate": "निम्नलिखित {{num}} प्लगइन्स स्वचालित रूप से अपडेट नहीं होंगे", + "autoUpdate.excludeUpdate": "निम्नलिखित {{num}} इंटीग्रेशन स्वचालित रूप से अपडेट नहीं होंगे", + "autoUpdate.excludeUpdate_one": "निम्नलिखित {{num}} इंटीग्रेशन स्वचालित रूप से अपडेट नहीं होगा", + "autoUpdate.excludeUpdate_other": "निम्नलिखित {{num}} इंटीग्रेशन स्वचालित रूप से अपडेट नहीं होंगे", "autoUpdate.nextUpdateTime": "अगली ऑटो-अपडेट: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "कोई प्लगइन्स नहीं मिले", "autoUpdate.noPluginPlaceholder.noInstalled": "कोई प्लगइन स्थापित नहीं है", "autoUpdate.operation.clearAll": "सभी हटाएं", "autoUpdate.operation.select": "प्लगइन्स चुनें", - "autoUpdate.partialUPdate": "केवल निम्नलिखित {{num}} प्लगइन्स स्वचालित रूप से अपडेट होंगे", + "autoUpdate.partialUPdate": "केवल निम्नलिखित {{num}} इंटीग्रेशन स्वचालित रूप से अपडेट होंगे", + "autoUpdate.partialUPdate_one": "केवल निम्नलिखित {{num}} इंटीग्रेशन स्वचालित रूप से अपडेट होगा", + "autoUpdate.partialUPdate_other": "केवल निम्नलिखित {{num}} इंटीग्रेशन स्वचालित रूप से अपडेट होंगे", "autoUpdate.pluginDowngradeWarning.description": "इस प्लगइन के लिए ऑटो-अपडेट वर्तमान में सक्षम है। संस्करण को डाउनग्रेड करने से आपके परिवर्तनों को अगली स्वचालित अद्यतन के दौरान ओवरराइट किया जा सकता है।", "autoUpdate.pluginDowngradeWarning.downgrade": "फिर भी डाउनग्रेड करें", "autoUpdate.pluginDowngradeWarning.exclude": "स्वतः अपडेट से बाहर करें", "autoUpdate.pluginDowngradeWarning.title": "प्लगइन डाउनग्रेड", + "autoUpdate.scope": "दायरा", + "autoUpdate.scopeMode.all": "सभी", + "autoUpdate.scopeMode.exclude": "चयनित को बाहर करें", "autoUpdate.specifyPluginsToUpdate": "अपडेट करने के लिए प्लगइन्स निर्दिष्ट करें", "autoUpdate.strategy.disabled.description": "प्लगइन्स स्वचालित रूप से अपडेट नहीं होंगे", "autoUpdate.strategy.disabled.name": "अक्षम", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "अपडेट", "detailPanel.operation.updateTooltip": "नवीनतम मॉडल तक पहुँचने के लिए अपडेट करें।", "detailPanel.operation.viewDetail": "विवरण देखें", + "detailPanel.operation.viewReadme": "README देखें", "detailPanel.serviceOk": "सेवा ठीक है", "detailPanel.strategyNum": "{{num}} {{strategy}} शामिल", "detailPanel.switchVersion": "स्विच संस्करण", @@ -173,6 +183,7 @@ "installModal.back": "पीछे", "installModal.cancel": "रद्द करें", "installModal.close": "करीब", + "installModal.dropIntegrationToInstall": "स्थापित करने के लिए इंटीग्रेशन पैकेज यहां ड्रॉप करें", "installModal.dropPluginToInstall": "यहां प्लगइन पैकेज ड्रॉप करें ताकि इसे स्थापित किया जा सके", "installModal.fromTrustSource": "कृपया सुनिश्चित करें कि आप केवल एक विश्वसनीय स्रोत से प्लगइन्स स्थापित करें।", "installModal.install": "स्थापित करें", @@ -182,7 +193,9 @@ "installModal.installPlugin": "प्लगइन स्थापित करें", "installModal.installWarning": "इस प्लगइन को स्थापित करने की अनुमति नहीं है।", "installModal.installedSuccessfully": "स्थापना सफल", + "installModal.installedSuccessfullyCountDesc": "निम्नलिखित {{num}} इंटीग्रेशन सफलतापूर्वक स्थापित किए गए हैं।", "installModal.installedSuccessfullyDesc": "प्लगइन सफलतापूर्वक स्थापित किया गया है।", + "installModal.installedSuccessfullyWithPageDesc": "इंटीग्रेशन सफलतापूर्वक स्थापित किया गया है। आप इसे {{categoryName}} पृष्ठ पर पा सकते हैं।", "installModal.installing": "स्थापित कर रहा है...", "installModal.labels.package": "पैकेज", "installModal.labels.repository": "भंडार", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "निम्नलिखित {{num}} प्लगइन्स स्थापित करने वाले हैं", "installModal.uploadFailed": "अपलोड विफल", "installModal.uploadingPackage": "{{packageName}} अपलोड हो रहा है...", + "installModal.viewDetails": "विवरण देखें", "installPlugin": "प्लगइन स्थापित करें", + "list.noAgentStrategyFound": "कोई एजेंट रणनीति नहीं मिली", + "list.noExtensionFound": "कोई एक्सटेंशन नहीं मिला", "list.noInstalled": "कोई प्लगइन स्थापित नहीं हैं", + "list.noTriggerFound": "कोई ट्रिगर नहीं मिला", "list.notFound": "कोई प्लगइन नहीं मिला", "list.source.github": "गिटहब से इंस्टॉल करें", "list.source.local": "स्थानीय पैकेज फ़ाइल से स्थापित करें", "list.source.marketplace": "मार्केटप्लेस से इंस्टॉल करें", + "marketplace.allPlugins": "सभी इंटीग्रेशन", "marketplace.and": "और", + "marketplace.becomePartner": "भागीदार बनें", "marketplace.difyMarketplace": "डिफाई मार्केटप्लेस", "marketplace.discover": "खोजें", "marketplace.empower": "अपने एआई विकास को सशक्त बनाएं", "marketplace.moreFrom": "मार्केटप्लेस से अधिक", - "marketplace.noPluginFound": "कोई प्लगइन नहीं मिला", + "marketplace.noPluginFound": "कोई इंटीग्रेशन नहीं मिला", "marketplace.partnerTip": "Dify भागीदार द्वारा सत्यापित", + "marketplace.pluginsHeroSubtitle": "अपने एआई विकास को सशक्त बनाने के लिए समुदाय द्वारा निर्मित इंटीग्रेशन का उपयोग करें।", + "marketplace.pluginsHeroTitle": "खोजें। विस्तार करें। निर्माण करें।", "marketplace.pluginsResult": "{{num}} परिणाम", "marketplace.sortBy": "काला शहर", "marketplace.sortOption.firstReleased": "पहली बार जारी किया गया", @@ -217,22 +238,31 @@ "marketplace.verifiedTip": "डिफाई द्वारा सत्यापित", "marketplace.viewMore": "और देखें", "metadata.title": "प्लगइन्स", + "pluginDevelopmentGuide": "इंटीग्रेशन विकास मार्गदर्शिका", "pluginInfoModal.packageName": "पैकेज", "pluginInfoModal.release": "रिहाई", "pluginInfoModal.repository": "भंडार", "pluginInfoModal.title": "प्लगइन जानकारी", + "pluginPublishGuide": "इंटीग्रेशन प्रकाशन मार्गदर्शिका", "privilege.admins": "व्यवस्थापक", + "privilege.configurePermissionsInSettings": "प्लगइन अनुमतियाँ कॉन्फ़िगर करने के लिए सेटिंग्स > भूमिकाएँ और अनुमतियाँ पर जाएं।", "privilege.everyone": "सभी", + "privilege.noDebugPermissionTooltip": "आपके पास इंटीग्रेशन डिबग करने की अनुमति नहीं है", + "privilege.noInstallPermissionTooltip": "आपके पास इंटीग्रेशन स्थापित और प्रबंधित करने की अनुमति नहीं है", "privilege.noone": "कोई नहीं", - "privilege.title": "प्लगइन प्राथमिकताएँ", - "privilege.whoCanDebug": "कौन प्लगइन्स को डिबग कर सकता है?", - "privilege.whoCanInstall": "कौन प्लगइन्स को स्थापित और प्रबंधित कर सकता है?", + "privilege.permissions": "अनुमतियाँ", + "privilege.quickWhoCanDebug": "कौन डिबग कर सकता है?", + "privilege.quickWhoCanInstall": "कौन स्थापित और प्रबंधित कर सकता है?", + "privilege.title": "इंटीग्रेशन प्राथमिकताएँ", + "privilege.whoCanDebug": "कौन इंटीग्रेशन को डिबग कर सकता है?", + "privilege.whoCanInstall": "कौन इंटीग्रेशन को स्थापित और प्रबंधित कर सकता है?", "publishPlugins": "प्लगइन प्रकाशित करें", "readmeInfo.failedToFetch": "README लाने में असफल", "readmeInfo.needHelpCheckReadme": "मदद चाहिए? README देखें।", "readmeInfo.noReadmeAvailable": "कोई README उपलब्ध नहीं है", "readmeInfo.title": "पढ़ें मुझे", "requestAPlugin": "एक प्लगइन का अनुरोध करें", + "requestSubmit": "अनुरोध करें या प्रकाशित करें", "search": "खोज", "searchCategories": "खोज श्रेणियाँ", "searchInMarketplace": "मार्केटप्लेस में खोजें", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "{{installingLength}} प्लगइन्स स्थापित कर रहे हैं, {{successLength}} सफल।", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "टेम्पलेट प्रकाशन मार्गदर्शिका", "upgrade.close": "करीब", "upgrade.description": "निम्नलिखित प्लगइन स्थापित करने वाले हैं", "upgrade.successfulTitle": "स्थापना सफल", diff --git a/web/i18n/id-ID/dataset-pipeline.json b/web/i18n/id-ID/dataset-pipeline.json index a262ba1b122..c0d34f216d5 100644 --- a/web/i18n/id-ID/dataset-pipeline.json +++ b/web/i18n/id-ID/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "Tindakan ini bersifat permanen. Anda tidak akan dapat kembali ke metode sebelumnya. Silakan konfirmasi untuk mengonversi.", "conversion.confirm.title": "Konfirmasi", "conversion.descriptionChunk1": "Anda sekarang dapat mengonversi basis pengetahuan yang ada untuk menggunakan Knowledge Pipeline untuk pemrosesan dokumen", - "conversion.descriptionChunk2": "— pendekatan yang lebih terbuka dan fleksibel dengan akses ke plugin dari pasar kami. Ini akan menerapkan metode pemrosesan baru untuk semua dokumen di masa mendatang.", + "conversion.descriptionChunk2": " — pendekatan yang lebih terbuka dan fleksibel dengan akses ke integrasi dari Marketplace. Ini akan menerapkan metode pemrosesan baru untuk semua dokumen di masa mendatang.", "conversion.errorMessage": "Gagal mengonversi himpunan data ke alur", "conversion.successMessage": "Berhasil mengonversi himpunan data menjadi alur", "conversion.title": "Mengonversi ke Alur Pengetahuan", diff --git a/web/i18n/id-ID/plugin.json b/web/i18n/id-ID/plugin.json index 5045d3b5cfa..362d57afd5a 100644 --- a/web/i18n/id-ID/plugin.json +++ b/web/i18n/id-ID/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "Gunakan Otorisasi OAuth", "auth.whoCanUse": "Siapa yang bisa menggunakan", "auth.workspaceDefault": "Ruang Kerja Default", + "autoUpdate.autoUpdate": "Pembaruan otomatis", + "autoUpdate.autoUpdateSettings": "Pengaturan Pembaruan Otomatis", "autoUpdate.automaticUpdates": "Pembaruan otomatis", "autoUpdate.changeTimezone": "Untuk mengubah zona waktu, pergi ke Pengaturan", "autoUpdate.excludeUpdate": "Plugin {{num}} berikut ini tidak akan diperbarui secara otomatis", + "autoUpdate.excludeUpdate_one": "{{num}} integrasi berikut tidak akan diperbarui secara otomatis", + "autoUpdate.excludeUpdate_other": "{{num}} integrasi berikut tidak akan diperbarui secara otomatis", "autoUpdate.nextUpdateTime": "Pembaruan otomatis berikutnya: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "Tidak ada plugin yang ditemukan", "autoUpdate.noPluginPlaceholder.noInstalled": "Tidak ada plugin yang diinstal", "autoUpdate.operation.clearAll": "Hapus semua", "autoUpdate.operation.select": "Pilih plugin", "autoUpdate.partialUPdate": "Hanya plugin {{num}} berikut yang akan diperbarui secara otomatis", + "autoUpdate.partialUPdate_one": "Hanya {{num}} integrasi berikut yang akan diperbarui secara otomatis", + "autoUpdate.partialUPdate_other": "Hanya {{num}} integrasi berikut yang akan diperbarui secara otomatis", "autoUpdate.pluginDowngradeWarning.description": "Pembaruan otomatis saat ini diaktifkan untuk plugin ini. Menurunkan versi dapat menyebabkan perubahan Anda ditimpa selama pembaruan otomatis berikutnya.", "autoUpdate.pluginDowngradeWarning.downgrade": "Tetap turun", "autoUpdate.pluginDowngradeWarning.exclude": "Mengecualikan dari pembaruan otomatis", "autoUpdate.pluginDowngradeWarning.title": "Penurunan Plugin", + "autoUpdate.scope": "Cakupan", + "autoUpdate.scopeMode.all": "Semua", + "autoUpdate.scopeMode.exclude": "Kecualikan yang dipilih", "autoUpdate.specifyPluginsToUpdate": "Tentukan plugin untuk diperbarui", "autoUpdate.strategy.disabled.description": "Plugin tidak akan diperbarui secara otomatis", "autoUpdate.strategy.disabled.name": "Cacat", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "Pemutakhiran", "detailPanel.operation.updateTooltip": "Perbarui untuk mengakses model terbaru.", "detailPanel.operation.viewDetail": "Lihat Detail", + "detailPanel.operation.viewReadme": "Lihat README", "detailPanel.serviceOk": "Layanan OK", "detailPanel.strategyNum": "{{num}} {{strategy}} TERMASUK", "detailPanel.switchVersion": "Beralih Versi", @@ -173,6 +183,7 @@ "installModal.back": "Kembali", "installModal.cancel": "Membatalkan", "installModal.close": "Tutup", + "installModal.dropIntegrationToInstall": "Jatuhkan paket integrasi di sini untuk menginstal", "installModal.dropPluginToInstall": "Jatuhkan paket plugin di sini untuk menginstal", "installModal.fromTrustSource": "Pastikan Anda hanya menginstal plugin dari sumber yang tepercaya.", "installModal.install": "Pasang", @@ -182,7 +193,9 @@ "installModal.installPlugin": "Instal Plugin", "installModal.installWarning": "Plugin ini tidak diperbolehkan untuk diinstal.", "installModal.installedSuccessfully": "Instalasi berhasil", + "installModal.installedSuccessfullyCountDesc": "{{num}} integrasi berikut telah berhasil diinstal.", "installModal.installedSuccessfullyDesc": "Plugin telah berhasil diinstal.", + "installModal.installedSuccessfullyWithPageDesc": "Integrasi telah berhasil diinstal. Anda dapat menemukannya di halaman {{categoryName}}.", "installModal.installing": "Menginstal...", "installModal.labels.package": "Paket", "installModal.labels.repository": "Repositori", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "Akan memasang plugin {{num}} berikut", "installModal.uploadFailed": "Upload gagal", "installModal.uploadingPackage": "Mengunggah {{packageName}}...", + "installModal.viewDetails": "Lihat Detail", "installPlugin": "Instal plugin", + "list.noAgentStrategyFound": "Tidak ada Strategi Agen yang ditemukan", + "list.noExtensionFound": "Tidak ada Ekstensi yang ditemukan", "list.noInstalled": "Tidak ada plugin yang diinstal", + "list.noTriggerFound": "Tidak ada Pemicu yang ditemukan", "list.notFound": "Tidak ada plugin yang ditemukan", "list.source.github": "Instal dari GitHub", "list.source.local": "Instal dari File Paket Lokal", "list.source.marketplace": "Instal dari Marketplace", + "marketplace.allPlugins": "Semua integrasi", "marketplace.and": "dan", + "marketplace.becomePartner": "Menjadi Partner", "marketplace.difyMarketplace": "Dify Marketplace", "marketplace.discover": "Menemukan", "marketplace.empower": "Berdayakan pengembangan AI Anda", "marketplace.moreFrom": "Selengkapnya dari Marketplace", - "marketplace.noPluginFound": "Tidak ada plugin yang ditemukan", + "marketplace.noPluginFound": "Tidak ada integrasi yang ditemukan", "marketplace.partnerTip": "Diverifikasi oleh partner Dify", + "marketplace.pluginsHeroSubtitle": "Gunakan integrasi buatan komunitas untuk mendukung pengembangan AI Anda.", + "marketplace.pluginsHeroTitle": "Temukan. Perluas. Bangun.", "marketplace.pluginsResult": "hasil {{num}}", "marketplace.sortBy": "Urutkan berdasarkan", "marketplace.sortOption.firstReleased": "Pertama Dirilis", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "Diverifikasi oleh Dify", "marketplace.viewMore": "Lihat lebih banyak", "metadata.title": "Plugin", + "pluginDevelopmentGuide": "Panduan pengembangan integrasi", "pluginInfoModal.packageName": "Paket", "pluginInfoModal.release": "Lepaskan", "pluginInfoModal.repository": "Repositori", "pluginInfoModal.title": "Info plugin", + "pluginPublishGuide": "Panduan penerbitan integrasi", "privilege.admins": "Admin", + "privilege.configurePermissionsInSettings": "Buka Pengaturan > Peran & Izin untuk mengonfigurasi izin integrasi.", "privilege.everyone": "Orang", + "privilege.noDebugPermissionTooltip": "Anda tidak memiliki izin untuk men-debug integrasi", + "privilege.noInstallPermissionTooltip": "Anda tidak memiliki izin untuk menginstal dan mengelola integrasi", "privilege.noone": "Tidak ada seorang pun", + "privilege.permissions": "Izin", + "privilege.quickWhoCanDebug": "Siapa yang dapat men-debug?", + "privilege.quickWhoCanInstall": "Siapa yang dapat menginstal dan mengelola?", "privilege.title": "Preferensi Plugin", "privilege.whoCanDebug": "Siapa yang dapat men-debug plugin?", "privilege.whoCanInstall": "Siapa yang dapat menginstal dan mengelola plugin?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "Tidak ada README yang tersedia", "readmeInfo.title": "BACA SAYA", "requestAPlugin": "Minta plugin", + "requestSubmit": "Minta atau terbitkan", "search": "Mencari", "searchCategories": "Cari Kategori", "searchInMarketplace": "Cari di Marketplace", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "Memasang plugin {{installingLength}}, {{successLength}} berhasil.", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "Panduan penerbitan templat", "upgrade.close": "Tutup", "upgrade.description": "Tentang menginstal plugin berikut", "upgrade.successfulTitle": "Instal berhasil", diff --git a/web/i18n/it-IT/dataset-pipeline.json b/web/i18n/it-IT/dataset-pipeline.json index 17a80f05d0c..117ef2b8565 100644 --- a/web/i18n/it-IT/dataset-pipeline.json +++ b/web/i18n/it-IT/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "Questa azione è permanente. Non sarà possibile ripristinare il metodo precedente. Si prega di confermare per convertire.", "conversion.confirm.title": "Conferma", "conversion.descriptionChunk1": "Ora puoi convertire la tua knowledge base esistente per utilizzare la Knowledge Pipeline per l'elaborazione dei documenti", - "conversion.descriptionChunk2": "— un approccio più aperto e flessibile con l'accesso ai plugin dal nostro marketplace. In questo modo il nuovo metodo di elaborazione verrà applicato a tutti i documenti futuri.", + "conversion.descriptionChunk2": " — un approccio più aperto e flessibile con l'accesso alle integrazioni dal Marketplace. In questo modo il nuovo metodo di elaborazione verrà applicato a tutti i documenti futuri.", "conversion.errorMessage": "Impossibile convertire il set di dati in una pipeline", "conversion.successMessage": "Conversione del set di dati in pipeline", "conversion.title": "Conversione in pipeline di conoscenza", diff --git a/web/i18n/it-IT/plugin.json b/web/i18n/it-IT/plugin.json index d4c6609909c..3727cdfad46 100644 --- a/web/i18n/it-IT/plugin.json +++ b/web/i18n/it-IT/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "Usa l'autorizzazione OAuth", "auth.whoCanUse": "Chi può utilizzare", "auth.workspaceDefault": "Spazio di Lavoro Predefinito", + "autoUpdate.autoUpdate": "Aggiornamento automatico", + "autoUpdate.autoUpdateSettings": "Impostazioni di aggiornamento automatico", "autoUpdate.automaticUpdates": "Aggiornamenti automatici", "autoUpdate.changeTimezone": "Per cambiare il fuso orario, vai su Impostazioni", "autoUpdate.excludeUpdate": "I seguenti {{num}} plugin non si aggiorneranno automaticamente", + "autoUpdate.excludeUpdate_one": "La seguente {{num}} integrazione non si aggiornerà automaticamente", + "autoUpdate.excludeUpdate_other": "Le seguenti {{num}} integrazioni non si aggiorneranno automaticamente", "autoUpdate.nextUpdateTime": "Prossimo aggiornamento automatico: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "Nessun plugin trovato", "autoUpdate.noPluginPlaceholder.noInstalled": "Nessun plugin installato", "autoUpdate.operation.clearAll": "Cancella tutto", "autoUpdate.operation.select": "Seleziona i plugin", "autoUpdate.partialUPdate": "Solo i seguenti {{num}} plugin si aggiorneranno automaticamente", + "autoUpdate.partialUPdate_one": "Solo la seguente {{num}} integrazione si aggiornerà automaticamente", + "autoUpdate.partialUPdate_other": "Solo le seguenti {{num}} integrazioni si aggiorneranno automaticamente", "autoUpdate.pluginDowngradeWarning.description": "L'aggiornamento automatico è attualmente abilitato per questo plugin. Il downgrade della versione potrebbe causare la sovrascrittura delle tue modifiche durante il prossimo aggiornamento automatico.", "autoUpdate.pluginDowngradeWarning.downgrade": "Comunque esegui il downgrade", "autoUpdate.pluginDowngradeWarning.exclude": "Escludi dall'aggiornamento automatico", "autoUpdate.pluginDowngradeWarning.title": "Downgrade del plugin", + "autoUpdate.scope": "Ambito", + "autoUpdate.scopeMode.all": "Tutto", + "autoUpdate.scopeMode.exclude": "Escludi selezionato", "autoUpdate.specifyPluginsToUpdate": "Specifica i plugin da aggiornare", "autoUpdate.strategy.disabled.description": "I plugin non si aggiorneranno automaticamente", "autoUpdate.strategy.disabled.name": "Disabile", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "Aggiornare", "detailPanel.operation.updateTooltip": "Aggiorna per accedere ai modelli più recenti.", "detailPanel.operation.viewDetail": "vedi dettagli", + "detailPanel.operation.viewReadme": "Visualizza README", "detailPanel.serviceOk": "Servizio OK", "detailPanel.strategyNum": "{{num}} {{strategy}} INCLUSO", "detailPanel.switchVersion": "Versione switch", @@ -173,6 +183,7 @@ "installModal.back": "Indietro", "installModal.cancel": "Annulla", "installModal.close": "Chiudere", + "installModal.dropIntegrationToInstall": "Rilascia qui il pacchetto dell'integrazione per installarlo", "installModal.dropPluginToInstall": "Rilascia qui il pacchetto del plug-in per installarlo", "installModal.fromTrustSource": "Assicurati di installare i plug-in solo da una fonte attendibile.", "installModal.install": "Installare", @@ -182,7 +193,9 @@ "installModal.installPlugin": "Installa il plugin", "installModal.installWarning": "Questo plugin non è consentito essere installato.", "installModal.installedSuccessfully": "Installazione riuscita", + "installModal.installedSuccessfullyCountDesc": "Le seguenti {{num}} integrazioni sono state installate con successo.", "installModal.installedSuccessfullyDesc": "Il plug-in è stato installato correttamente.", + "installModal.installedSuccessfullyWithPageDesc": "L'integrazione è stata installata con successo. Puoi trovarla nella pagina {{categoryName}}.", "installModal.installing": "Installazione...", "installModal.labels.package": "Pacco", "installModal.labels.repository": "Deposito", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "Sto per installare i seguenti plugin {{num}}", "installModal.uploadFailed": "Caricamento non riuscito", "installModal.uploadingPackage": "Caricamento di {{packageName}}...", + "installModal.viewDetails": "Visualizza dettagli", "installPlugin": "Installa il plugin", + "list.noAgentStrategyFound": "Nessuna strategia agente trovata", + "list.noExtensionFound": "Nessuna estensione trovata", "list.noInstalled": "Nessun plug-in installato", + "list.noTriggerFound": "Nessun trigger trovato", "list.notFound": "Nessun plugin trovato", "list.source.github": "Installa da GitHub", "list.source.local": "Installa dal file del pacchetto locale", "list.source.marketplace": "Installa da Marketplace", + "marketplace.allPlugins": "Tutte le integrazioni", "marketplace.and": "e", + "marketplace.becomePartner": "Diventa un partner", "marketplace.difyMarketplace": "Mercato Dify", "marketplace.discover": "Scoprire", "marketplace.empower": "Potenzia lo sviluppo dell'intelligenza artificiale", "marketplace.moreFrom": "Altro da Marketplace", - "marketplace.noPluginFound": "Nessun plug-in trovato", + "marketplace.noPluginFound": "Nessuna integrazione trovata", "marketplace.partnerTip": "Verificato da un partner Dify", + "marketplace.pluginsHeroSubtitle": "Usa integrazioni create dalla community per potenziare lo sviluppo della tua IA.", + "marketplace.pluginsHeroTitle": "Scopri. Estendi. Costruisci.", "marketplace.pluginsResult": "{{num}} risultati", "marketplace.sortBy": "Ordina per", "marketplace.sortOption.firstReleased": "Prima pubblicazione", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "Verificato da Dify", "marketplace.viewMore": "Vedi di più", "metadata.title": "Plugin", + "pluginDevelopmentGuide": "Guida allo sviluppo delle integrazioni", "pluginInfoModal.packageName": "Pacco", "pluginInfoModal.release": "Rilascio", "pluginInfoModal.repository": "Deposito", "pluginInfoModal.title": "Informazioni sul plugin", + "pluginPublishGuide": "Guida alla pubblicazione delle integrazioni", "privilege.admins": "Amministratori", + "privilege.configurePermissionsInSettings": "Vai su Impostazioni > Ruoli e autorizzazioni per configurare le autorizzazioni delle integrazioni.", "privilege.everyone": "Ciascuno", + "privilege.noDebugPermissionTooltip": "Non hai l'autorizzazione per eseguire il debug delle integrazioni", + "privilege.noInstallPermissionTooltip": "Non hai l'autorizzazione per installare e gestire le integrazioni", "privilege.noone": "Nessuno", + "privilege.permissions": "Autorizzazioni", + "privilege.quickWhoCanDebug": "Chi può eseguire il debug?", + "privilege.quickWhoCanInstall": "Chi può installare e gestire?", "privilege.title": "Preferenze del plugin", "privilege.whoCanDebug": "Chi può eseguire il debug dei plugin?", "privilege.whoCanInstall": "Chi può installare e gestire i plugin?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "Nessun README disponibile", "readmeInfo.title": "LEGGIMI", "requestAPlugin": "Richiedi un plugin", + "requestSubmit": "Richiedi o pubblica", "search": "Ricerca", "searchCategories": "Cerca Categorie", "searchInMarketplace": "Cerca nel Marketplace", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "Installazione dei plugin {{installingLength}}, {{successLength}} successo.", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "Guida alla pubblicazione dei modelli", "upgrade.close": "Chiudere", "upgrade.description": "Sto per installare il seguente plugin", "upgrade.successfulTitle": "Installazione riuscita", diff --git a/web/i18n/ja-JP/plugin.json b/web/i18n/ja-JP/plugin.json index 31fe611c242..9e828f8fd29 100644 --- a/web/i18n/ja-JP/plugin.json +++ b/web/i18n/ja-JP/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "OAuth認証を使用する", "auth.whoCanUse": "誰が使えるのか", "auth.workspaceDefault": "ワークスペースのデフォルト", + "autoUpdate.autoUpdate": "自動更新", + "autoUpdate.autoUpdateSettings": "自動更新設定", "autoUpdate.automaticUpdates": "自動更新", "autoUpdate.changeTimezone": "タイムゾーンを変更するには、設定に移動してください。", "autoUpdate.excludeUpdate": "以下の{{num}}プラグインは自動更新されません", + "autoUpdate.excludeUpdate_one": "以下の{{num}}プラグインは自動更新されません", + "autoUpdate.excludeUpdate_other": "以下の{{num}}プラグインは自動更新されません", "autoUpdate.nextUpdateTime": "次の自動更新: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "プラグインが見つかりませんでした", "autoUpdate.noPluginPlaceholder.noInstalled": "プラグインがインストールされていません", "autoUpdate.operation.clearAll": "すべてクリア", "autoUpdate.operation.select": "プラグインを選択する", "autoUpdate.partialUPdate": "以下の{{num}}プラグインのみが自動更新されます", + "autoUpdate.partialUPdate_one": "以下の{{num}}プラグインのみが自動更新されます", + "autoUpdate.partialUPdate_other": "以下の{{num}}プラグインのみが自動更新されます", "autoUpdate.pluginDowngradeWarning.description": "このプラグインは現在、自動更新が有効です。バージョンをダウングレードすると、次回の自動更新中に変更が上書きされる可能性があります。", "autoUpdate.pluginDowngradeWarning.downgrade": "とにかくダウングレードする", "autoUpdate.pluginDowngradeWarning.exclude": "自動更新から除外する", "autoUpdate.pluginDowngradeWarning.title": "プラグインのダウングレード", + "autoUpdate.scope": "範囲", + "autoUpdate.scopeMode.all": "すべて", + "autoUpdate.scopeMode.exclude": "選択したものを除外する", "autoUpdate.specifyPluginsToUpdate": "更新するプラグインを指定してください", "autoUpdate.strategy.disabled.description": "プラグインは自動更新されません", "autoUpdate.strategy.disabled.name": "無効", @@ -174,6 +183,7 @@ "installModal.back": "戻る", "installModal.cancel": "キャンセル", "installModal.close": "閉じる", + "installModal.dropIntegrationToInstall": "プラグインパッケージをここにドロップしてインストールします", "installModal.dropPluginToInstall": "プラグインパッケージをここにドロップしてインストールします", "installModal.fromTrustSource": "信頼できるソースからのみプラグインをインストールするようにしてください。", "installModal.install": "インストール", @@ -183,7 +193,9 @@ "installModal.installPlugin": "プラグインをインストール", "installModal.installWarning": "このプラグインはインストールを許可されていません。", "installModal.installedSuccessfully": "インストールに成功しました", + "installModal.installedSuccessfullyCountDesc": "以下の{{num}}個のプラグインが正常にインストールされました。", "installModal.installedSuccessfullyDesc": "プラグインは正常にインストールされました。", + "installModal.installedSuccessfullyWithPageDesc": "プラグインは正常にインストールされました。{{categoryName}}ページで見つけることができます。", "installModal.installing": "インストール中...", "installModal.labels.package": "パッケージ", "installModal.labels.repository": "リポジトリ", @@ -196,19 +208,27 @@ "installModal.readyToInstallPackages": "次の{{num}}プラグインをインストールしようとしています", "installModal.uploadFailed": "アップロードに失敗しました", "installModal.uploadingPackage": "{{packageName}}をアップロード中...", + "installModal.viewDetails": "詳細を見る", "installPlugin": "プラグインをインストール", + "list.noAgentStrategyFound": "エージェント戦略が見つかりません", + "list.noExtensionFound": "拡張機能が見つかりません", "list.noInstalled": "プラグインはインストールされていません", + "list.noTriggerFound": "トリガーが見つかりません", "list.notFound": "プラグインが見つかりません", "list.source.github": "GitHub からインストール", "list.source.local": "ローカルパッケージファイルからインストール", "list.source.marketplace": "マーケットプレイスからインストール", + "marketplace.allPlugins": "すべてのインテグレーション", "marketplace.and": "と", + "marketplace.becomePartner": "パートナーになる", "marketplace.difyMarketplace": "Dify マーケットプレイス", "marketplace.discover": "探索", "marketplace.empower": "AI 開発をサポートする", "marketplace.moreFrom": "マーケットプレイスからのさらなる情報", "marketplace.noPluginFound": "インテグレーションが見つかりません", "marketplace.partnerTip": "このプラグインは Dify のパートナーによって認証されています", + "marketplace.pluginsHeroSubtitle": "コミュニティ製のインテグレーションを活用して、AI 開発を強化しましょう。", + "marketplace.pluginsHeroTitle": "発見する。拡張する。構築する。", "marketplace.pluginsResult": "{{num}} 件の結果", "marketplace.sortBy": "並べ替え", "marketplace.sortOption.firstReleased": "リリース順", @@ -218,15 +238,21 @@ "marketplace.verifiedTip": "このプラグインは Dify によって認証されています", "marketplace.viewMore": "もっと見る", "metadata.title": "プラグイン", + "pluginDevelopmentGuide": "インテグレーション開発ガイド", "pluginInfoModal.packageName": "パッケージ", "pluginInfoModal.release": "リリース", "pluginInfoModal.repository": "リポジトリ", "pluginInfoModal.title": "プラグイン情報", + "pluginPublishGuide": "インテグレーション公開ガイド", "privilege.admins": "管理者", + "privilege.configurePermissionsInSettings": "設定 > ロールと権限 でプラグインの権限を設定してください。", "privilege.everyone": "みんな", + "privilege.noDebugPermissionTooltip": "インテグレーションをデバッグする権限がありません", "privilege.noInstallPermissionTooltip": "連携管理の権限がありません", "privilege.noone": "誰もいない", "privilege.permissions": "権限", + "privilege.quickWhoCanDebug": "誰がデバッグできますか?", + "privilege.quickWhoCanInstall": "誰がインストールおよび管理できますか?", "privilege.title": "プラグインの設定", "privilege.whoCanDebug": "誰がプラグインのデバッグを行うことができますか?", "privilege.whoCanInstall": "誰がプラグインをインストールして管理できますか?", @@ -236,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "READMEは利用できません", "readmeInfo.title": "リードミー", "requestAPlugin": "プラグインをリクエスト", + "requestSubmit": "リクエストまたは公開", "search": "検索", "searchCategories": "検索カテゴリ", "searchInMarketplace": "マーケットプレイスで検索", @@ -261,6 +288,7 @@ "task.installingWithSuccess": "{{installingLength}}個のプラグインをインストール中、{{successLength}}個成功しました。", "task.runningPlugins": "インストール中のプラグイン", "task.successPlugins": "インストール済みのプラグイン", + "templatePublishingGuide": "テンプレート公開ガイド", "upgrade.close": "閉じる", "upgrade.description": "次のプラグインをインストールしようとしています", "upgrade.successfulTitle": "インストールに成功しました", diff --git a/web/i18n/ko-KR/dataset-pipeline.json b/web/i18n/ko-KR/dataset-pipeline.json index 7e6804719c3..dd11dac48f6 100644 --- a/web/i18n/ko-KR/dataset-pipeline.json +++ b/web/i18n/ko-KR/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "이 작업은 영구적입니다. 이전 방법으로 되돌릴 수 없습니다. 변환을 확인하시기 바랍니다.", "conversion.confirm.title": "확인", "conversion.descriptionChunk1": "이제 문서 처리에 지식 파이프라인을 사용하도록 기존 기술 자료를 변환할 수 있습니다", - "conversion.descriptionChunk2": "— 마켓플레이스의 플러그인에 액세스할 수 있는 보다 개방적이고 유연한 접근 방식입니다. 이렇게 하면 향후 모든 문서에 새로운 처리 방법이 적용됩니다.", + "conversion.descriptionChunk2": " — 마켓플레이스의 플러그인에 액세스할 수 있는 보다 개방적이고 유연한 접근 방식입니다. 이렇게 하면 향후 모든 문서에 새로운 처리 방법이 적용됩니다.", "conversion.errorMessage": "데이터 세트를 파이프라인으로 변환하지 못했습니다.", "conversion.successMessage": "데이터 세트를 파이프라인으로 성공적으로 변환했습니다.", "conversion.title": "지식 파이프라인으로 변환", diff --git a/web/i18n/ko-KR/plugin.json b/web/i18n/ko-KR/plugin.json index 7e202a67ba7..62b51478852 100644 --- a/web/i18n/ko-KR/plugin.json +++ b/web/i18n/ko-KR/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "OAuth 인증 사용하기", "auth.whoCanUse": "사용할 수 있는 사용자", "auth.workspaceDefault": "작업 공간 기본값", + "autoUpdate.autoUpdate": "자동 업데이트", + "autoUpdate.autoUpdateSettings": "자동 업데이트 설정", "autoUpdate.automaticUpdates": "자동 업데이트", "autoUpdate.changeTimezone": "시간대를 변경하려면 설정으로 이동하세요.", "autoUpdate.excludeUpdate": "다음 {{num}} 플러그인은 자동 업데이트되지 않습니다.", + "autoUpdate.excludeUpdate_one": "다음 {{num}} 플러그인은 자동 업데이트되지 않습니다.", + "autoUpdate.excludeUpdate_other": "다음 {{num}} 플러그인은 자동 업데이트되지 않습니다.", "autoUpdate.nextUpdateTime": "다음 자동 업데이트: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "플러그인이 없습니다.", "autoUpdate.noPluginPlaceholder.noInstalled": "설치된 플러그인이 없습니다.", "autoUpdate.operation.clearAll": "모두 지우기", "autoUpdate.operation.select": "플러그인을 선택하세요", "autoUpdate.partialUPdate": "다음 {{num}} 플러그인만 자동 업데이트됩니다.", + "autoUpdate.partialUPdate_one": "다음 {{num}} 플러그인만 자동 업데이트됩니다.", + "autoUpdate.partialUPdate_other": "다음 {{num}} 플러그인만 자동 업데이트됩니다.", "autoUpdate.pluginDowngradeWarning.description": "이 플러그인은 현재 자동 업데이트가 활성화되어 있습니다. 버전을 다운그레이드하면 다음 자동 업데이트 중에 변경 사항이 덮어써질 수 있습니다.", "autoUpdate.pluginDowngradeWarning.downgrade": "어쨌든 다운그레이드", "autoUpdate.pluginDowngradeWarning.exclude": "자동 업데이트에서 제외", "autoUpdate.pluginDowngradeWarning.title": "플러그인 다운그레이드", + "autoUpdate.scope": "범위", + "autoUpdate.scopeMode.all": "모두", + "autoUpdate.scopeMode.exclude": "선택한 항목 제외", "autoUpdate.specifyPluginsToUpdate": "업데이트할 플러그인을 지정하십시오.", "autoUpdate.strategy.disabled.description": "플러그인이 자동으로 업데이트되지 않습니다.", "autoUpdate.strategy.disabled.name": "비활성화", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "업데이트", "detailPanel.operation.updateTooltip": "최신 모델에 액세스하려면 업데이트하세요.", "detailPanel.operation.viewDetail": "자세히보기", + "detailPanel.operation.viewReadme": "README 보기", "detailPanel.serviceOk": "서비스 정상", "detailPanel.strategyNum": "{{num}} {{strategy}} 포함", "detailPanel.switchVersion": "스위치 버전", @@ -173,6 +183,7 @@ "installModal.back": "뒤로", "installModal.cancel": "취소", "installModal.close": "닫기", + "installModal.dropIntegrationToInstall": "플러그인 패키지를 여기에 놓아 설치하십시오.", "installModal.dropPluginToInstall": "플러그인 패키지를 여기에 놓아 설치하십시오.", "installModal.fromTrustSource": "신뢰할 수 있는 출처의 플러그인만 설치하도록 하세요.", "installModal.install": "설치", @@ -182,7 +193,9 @@ "installModal.installPlugin": "플러그인 설치", "installModal.installWarning": "이 플러그인은 설치할 수 없습니다.", "installModal.installedSuccessfully": "설치 성공", + "installModal.installedSuccessfullyCountDesc": "다음 {{num}} 플러그인이 성공적으로 설치되었습니다.", "installModal.installedSuccessfullyDesc": "플러그인이 성공적으로 설치되었습니다.", + "installModal.installedSuccessfullyWithPageDesc": "플러그인이 성공적으로 설치되었습니다. {{categoryName}} 페이지에서 찾을 수 있습니다.", "installModal.installing": "설치...", "installModal.labels.package": "패키지", "installModal.labels.repository": "저장소", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "다음 {{num}} 플러그인을 설치하려고 합니다.", "installModal.uploadFailed": "업로드 실패", "installModal.uploadingPackage": "{{packageName}} 업로드 중...", + "installModal.viewDetails": "세부 정보 보기", "installPlugin": "플러그인 설치", + "list.noAgentStrategyFound": "에이전트 전략을 찾을 수 없습니다.", + "list.noExtensionFound": "확장을 찾을 수 없습니다.", "list.noInstalled": "설치된 플러그인이 없습니다.", + "list.noTriggerFound": "트리거를 찾을 수 없습니다.", "list.notFound": "플러그인을 찾을 수 없습니다.", "list.source.github": "GitHub 에서 설치", "list.source.local": "로컬 패키지 파일에서 설치", "list.source.marketplace": "마켓플레이스에서 설치", + "marketplace.allPlugins": "모든 플러그인", "marketplace.and": "그리고", + "marketplace.becomePartner": "파트너 되기", "marketplace.difyMarketplace": "Dify 마켓플레이스", "marketplace.discover": "발견하다", "marketplace.empower": "AI 개발 역량 강화", "marketplace.moreFrom": "Marketplace 에서 더 보기", "marketplace.noPluginFound": "플러그인을 찾을 수 없습니다.", "marketplace.partnerTip": "Dify 파트너에 의해 확인됨", + "marketplace.pluginsHeroSubtitle": "커뮤니티에서 제작한 플러그인을 사용하여 AI 개발을 강화하세요.", + "marketplace.pluginsHeroTitle": "발견하고. 확장하고. 구축하세요.", "marketplace.pluginsResult": "{{num}} 결과", "marketplace.sortBy": "정렬", "marketplace.sortOption.firstReleased": "첫 출시", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "Dify 에 의해 확인됨", "marketplace.viewMore": "더보기", "metadata.title": "플러그인", + "pluginDevelopmentGuide": "플러그인 개발 가이드", "pluginInfoModal.packageName": "패키지", "pluginInfoModal.release": "릴리스", "pluginInfoModal.repository": "저장소", "pluginInfoModal.title": "플러그인 정보", + "pluginPublishGuide": "플러그인 게시 가이드", "privilege.admins": "관리자", + "privilege.configurePermissionsInSettings": "설정 > 역할 및 권한으로 이동하여 플러그인 권한을 구성하세요.", "privilege.everyone": "모두", + "privilege.noDebugPermissionTooltip": "플러그인을 디버깅할 권한이 없습니다.", + "privilege.noInstallPermissionTooltip": "플러그인을 설치하고 관리할 권한이 없습니다.", "privilege.noone": "아무도 없어", + "privilege.permissions": "권한", + "privilege.quickWhoCanDebug": "누가 디버깅할 수 있나요?", + "privilege.quickWhoCanInstall": "누가 설치하고 관리할 수 있나요?", "privilege.title": "플러그인 기본 설정", "privilege.whoCanDebug": "누가 플러그인을 디버깅할 수 있나요?", "privilege.whoCanInstall": "누가 플러그인을 설치하고 관리할 수 있습니까?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "사용 가능한 README가 없습니다", "readmeInfo.title": "읽어보기", "requestAPlugin": "플러그인을 요청하세요", + "requestSubmit": "요청 또는 게시", "search": "검색", "searchCategories": "검색 카테고리", "searchInMarketplace": "Marketplace 에서 검색", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "{{installingLength}} 플러그인 설치, {{successLength}} 성공.", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "템플릿 게시 가이드", "upgrade.close": "닫기", "upgrade.description": "다음 플러그인을 설치하려고 합니다.", "upgrade.successfulTitle": "설치 성공", diff --git a/web/i18n/nl-NL/dataset-pipeline.json b/web/i18n/nl-NL/dataset-pipeline.json index 7f461b48dd3..c771b8000df 100644 --- a/web/i18n/nl-NL/dataset-pipeline.json +++ b/web/i18n/nl-NL/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "This action is permanent. You won't be able to revert to the previous method.Please confirm to convert.", "conversion.confirm.title": "Confirmation", "conversion.descriptionChunk1": "You can now convert your existing knowledge base to use the Knowledge Pipeline for document processing", - "conversion.descriptionChunk2": " — a more open and flexible approach with access to plugins from our marketplace. This will apply the new processing method to all future documents.", + "conversion.descriptionChunk2": " — a more open and flexible approach with access to integrations from the Marketplace. This will apply the new processing method to all future documents.", "conversion.errorMessage": "Failed to convert the dataset to a pipeline", "conversion.successMessage": "Successfully converted the dataset to a pipeline", "conversion.title": "Convert to Knowledge Pipeline", diff --git a/web/i18n/nl-NL/plugin.json b/web/i18n/nl-NL/plugin.json index 723477771da..9429fd3f6a4 100644 --- a/web/i18n/nl-NL/plugin.json +++ b/web/i18n/nl-NL/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "Use OAuth Authorization", "auth.whoCanUse": "Wie kan gebruiken", "auth.workspaceDefault": "Workspace Default", + "autoUpdate.autoUpdate": "Automatisch bijwerken", + "autoUpdate.autoUpdateSettings": "Instellingen voor automatisch bijwerken", "autoUpdate.automaticUpdates": "Automatic updates", "autoUpdate.changeTimezone": "To change time zone, go to Settings", "autoUpdate.excludeUpdate": "The following {{num}} plugins will not auto-update", + "autoUpdate.excludeUpdate_one": "De volgende {{num}} plugin wordt niet automatisch bijgewerkt", + "autoUpdate.excludeUpdate_other": "De volgende {{num}} plugins worden niet automatisch bijgewerkt", "autoUpdate.nextUpdateTime": "Next auto-update: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "No plugins were found", "autoUpdate.noPluginPlaceholder.noInstalled": "No plugins installed", "autoUpdate.operation.clearAll": "Clear all", "autoUpdate.operation.select": "Select plugins", "autoUpdate.partialUPdate": "Only the following {{num}} plugins will auto-update", + "autoUpdate.partialUPdate_one": "Alleen de volgende {{num}} plugin wordt automatisch bijgewerkt", + "autoUpdate.partialUPdate_other": "Alleen de volgende {{num}} plugins worden automatisch bijgewerkt", "autoUpdate.pluginDowngradeWarning.description": "Auto-update is currently enabled for this plugin. Downgrading the version may cause your changes to be overwritten during the next automatic update.", "autoUpdate.pluginDowngradeWarning.downgrade": "Downgrade anyway", "autoUpdate.pluginDowngradeWarning.exclude": "Exclude from auto-update", "autoUpdate.pluginDowngradeWarning.title": "Plugin Downgrade", + "autoUpdate.scope": "Bereik", + "autoUpdate.scopeMode.all": "Alle", + "autoUpdate.scopeMode.exclude": "Geselecteerde uitsluiten", "autoUpdate.specifyPluginsToUpdate": "Specify plugins to update", "autoUpdate.strategy.disabled.description": "Plugins will not auto-update", "autoUpdate.strategy.disabled.name": "Disabled", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "Update", "detailPanel.operation.updateTooltip": "Werk bij voor toegang tot de nieuwste modellen.", "detailPanel.operation.viewDetail": "View Detail", + "detailPanel.operation.viewReadme": "README bekijken", "detailPanel.serviceOk": "Service OK", "detailPanel.strategyNum": "{{num}} {{strategy}} INCLUDED", "detailPanel.switchVersion": "Switch Version", @@ -173,6 +183,7 @@ "installModal.back": "Back", "installModal.cancel": "Cancel", "installModal.close": "Close", + "installModal.dropIntegrationToInstall": "Sleep het pluginpakket hierheen om te installeren", "installModal.dropPluginToInstall": "Drop plugin package here to install", "installModal.fromTrustSource": "Please make sure that you only install plugins from a trusted source.", "installModal.install": "Install", @@ -182,7 +193,9 @@ "installModal.installPlugin": "Install Plugin", "installModal.installWarning": "This plugin is not allowed to be installed.", "installModal.installedSuccessfully": "Installation successful", + "installModal.installedSuccessfullyCountDesc": "De volgende {{num}} plugins zijn succesvol geïnstalleerd.", "installModal.installedSuccessfullyDesc": "The plugin has been installed successfully.", + "installModal.installedSuccessfullyWithPageDesc": "De plugin is succesvol geïnstalleerd. Je vindt deze op de {{categoryName}}-pagina.", "installModal.installing": "Installing...", "installModal.labels.package": "Package", "installModal.labels.repository": "Repository", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "About to install the following {{num}} plugins", "installModal.uploadFailed": "Upload failed", "installModal.uploadingPackage": "Uploading {{packageName}}...", + "installModal.viewDetails": "Details bekijken", "installPlugin": "Plugin installeren", + "list.noAgentStrategyFound": "Geen Agent Strategy gevonden", + "list.noExtensionFound": "Geen Extension gevonden", "list.noInstalled": "No plugins installed", + "list.noTriggerFound": "Geen Trigger gevonden", "list.notFound": "No plugins found", "list.source.github": "Install from GitHub", "list.source.local": "Install from Local Package File", "list.source.marketplace": "Install from Marketplace", + "marketplace.allPlugins": "Alle plugins", "marketplace.and": "and", + "marketplace.becomePartner": "Word partner", "marketplace.difyMarketplace": "Dify Marketplace", "marketplace.discover": "Discover", "marketplace.empower": "Empower your AI development", "marketplace.moreFrom": "More from Marketplace", - "marketplace.noPluginFound": "No plugin found", + "marketplace.noPluginFound": "Geen plugin gevonden", "marketplace.partnerTip": "Verified by a Dify partner", + "marketplace.pluginsHeroSubtitle": "Gebruik door de community gebouwde plugins om je AI-ontwikkeling te versterken.", + "marketplace.pluginsHeroTitle": "Ontdek. Breid uit. Bouw.", "marketplace.pluginsResult": "{{num}} results", "marketplace.sortBy": "Sort by", "marketplace.sortOption.firstReleased": "First Released", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "Verified by Dify", "marketplace.viewMore": "View more", "metadata.title": "Plugins", + "pluginDevelopmentGuide": "Handleiding voor pluginontwikkeling", "pluginInfoModal.packageName": "Package", "pluginInfoModal.release": "Release", "pluginInfoModal.repository": "Repository", "pluginInfoModal.title": "Plugin info", + "pluginPublishGuide": "Handleiding voor pluginpublicatie", "privilege.admins": "Admins", + "privilege.configurePermissionsInSettings": "Ga naar Instellingen > Rollen & Rechten om pluginrechten te configureren.", "privilege.everyone": "Everyone", + "privilege.noDebugPermissionTooltip": "Je hebt geen toestemming om plugins te debuggen", + "privilege.noInstallPermissionTooltip": "Je hebt geen toestemming om plugins te installeren en beheren", "privilege.noone": "No one", + "privilege.permissions": "Rechten", + "privilege.quickWhoCanDebug": "Wie kan debuggen?", + "privilege.quickWhoCanInstall": "Wie kan installeren en beheren?", "privilege.title": "Plugin Preferences", "privilege.whoCanDebug": "Who can debug plugins?", "privilege.whoCanInstall": "Who can install and manage plugins?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "No README available", "readmeInfo.title": "README", "requestAPlugin": "Een plugin aanvragen", + "requestSubmit": "Aanvragen of publiceren", "search": "Zoeken", "searchCategories": "Categorieën zoeken", "searchInMarketplace": "Zoeken in Marketplace", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "Installing {{installingLength}} plugins, {{successLength}} success.", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "Handleiding voor templatepublicatie", "upgrade.close": "Close", "upgrade.description": "About to install the following plugin", "upgrade.successfulTitle": "Install successful", diff --git a/web/i18n/pl-PL/dataset-pipeline.json b/web/i18n/pl-PL/dataset-pipeline.json index 033796cbffa..f70de83f1c6 100644 --- a/web/i18n/pl-PL/dataset-pipeline.json +++ b/web/i18n/pl-PL/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "To działanie jest trwałe. Nie będzie można powrócić do poprzedniej metody. Potwierdź, aby przekonwertować.", "conversion.confirm.title": "Potwierdzenie", "conversion.descriptionChunk1": "Teraz możesz przekonwertować istniejącą bazę wiedzy tak, aby używała potoku wiedzy do przetwarzania dokumentów", - "conversion.descriptionChunk2": "— bardziej otwarte i elastyczne podejście z dostępem do wtyczek z naszego rynku. Spowoduje to zastosowanie nowej metody przetwarzania do wszystkich przyszłych dokumentów.", + "conversion.descriptionChunk2": " — bardziej otwarte i elastyczne podejście z dostępem do integracji z Marketplace. Spowoduje to zastosowanie nowej metody przetwarzania do wszystkich przyszłych dokumentów.", "conversion.errorMessage": "Nie można przekonwertować zestawu danych na potok", "conversion.successMessage": "Pomyślnie przekonwertowano zestaw danych na potok", "conversion.title": "Konwertuj na potok wiedzy", diff --git a/web/i18n/pl-PL/plugin.json b/web/i18n/pl-PL/plugin.json index d577b331976..40ba6e90a70 100644 --- a/web/i18n/pl-PL/plugin.json +++ b/web/i18n/pl-PL/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "Użyj autoryzacji OAuth", "auth.whoCanUse": "Kto może skorzystać", "auth.workspaceDefault": "Domyślna przestrzeń robocza", + "autoUpdate.autoUpdate": "Automatyczna aktualizacja", + "autoUpdate.autoUpdateSettings": "Ustawienia automatycznej aktualizacji", "autoUpdate.automaticUpdates": "Automatyczne aktualizacje", "autoUpdate.changeTimezone": "Aby zmienić strefę czasową, przejdź do Ustawienia", "autoUpdate.excludeUpdate": "Następujące {{num}} wtyczki nie będą aktualizować się automatycznie", + "autoUpdate.excludeUpdate_one": "Następująca {{num}} wtyczka nie będzie aktualizować się automatycznie", + "autoUpdate.excludeUpdate_other": "Następujące {{num}} wtyczki nie będą aktualizować się automatycznie", "autoUpdate.nextUpdateTime": "Następna automatyczna aktualizacja: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "Nie znaleziono wtyczek", "autoUpdate.noPluginPlaceholder.noInstalled": "Brak zainstalowanych wtyczek", "autoUpdate.operation.clearAll": "Wyczyść wszystko", "autoUpdate.operation.select": "Wybierz wtyczki", "autoUpdate.partialUPdate": "Tylko następujące {{num}} wtyczki będą się automatycznie aktualizować", + "autoUpdate.partialUPdate_one": "Tylko następująca {{num}} wtyczka będzie się automatycznie aktualizować", + "autoUpdate.partialUPdate_other": "Tylko następujące {{num}} wtyczki będą się automatycznie aktualizować", "autoUpdate.pluginDowngradeWarning.description": "Automatyczna aktualizacja jest obecnie włączona dla tej wtyczki. Obniżenie wersji może spowodować, że twoje zmiany zostaną nadpisane podczas następnej automatycznej aktualizacji.", "autoUpdate.pluginDowngradeWarning.downgrade": "Zrób downgrade tak czy inaczej", "autoUpdate.pluginDowngradeWarning.exclude": "Wyłącz z automatycznej aktualizacji", "autoUpdate.pluginDowngradeWarning.title": "Obniżenie wersji wtyczki", + "autoUpdate.scope": "Zakres", + "autoUpdate.scopeMode.all": "Wszystkie", + "autoUpdate.scopeMode.exclude": "Wyłącz wybrane", "autoUpdate.specifyPluginsToUpdate": "Określ wtyczki do zaktualizowania", "autoUpdate.strategy.disabled.description": "Wtyczki nie będą się automatycznie aktualizować", "autoUpdate.strategy.disabled.name": "Niepełnosprawny", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "Aktualizacja", "detailPanel.operation.updateTooltip": "Zaktualizuj, aby uzyskać dostęp do najnowszych modeli.", "detailPanel.operation.viewDetail": "Pokaż szczegóły", + "detailPanel.operation.viewReadme": "Wyświetl README", "detailPanel.serviceOk": "Serwis OK", "detailPanel.strategyNum": "{{num}} {{strategy}} ZAWARTE", "detailPanel.switchVersion": "Wersja przełącznika", @@ -173,6 +183,7 @@ "installModal.back": "Wstecz", "installModal.cancel": "Anuluj", "installModal.close": "Zamykać", + "installModal.dropIntegrationToInstall": "Upuść pakiet integracji tutaj, aby zainstalować", "installModal.dropPluginToInstall": "Upuść pakiet wtyczek tutaj, aby zainstalować", "installModal.fromTrustSource": "Upewnij się, że instalujesz wtyczki tylko z zaufanego źródła.", "installModal.install": "Instalować", @@ -182,7 +193,9 @@ "installModal.installPlugin": "Zainstaluj wtyczkę", "installModal.installWarning": "Ten plugin nie może być zainstalowany.", "installModal.installedSuccessfully": "Instalacja powiodła się", + "installModal.installedSuccessfullyCountDesc": "Następujące {{num}} wtyczki zostały pomyślnie zainstalowane.", "installModal.installedSuccessfullyDesc": "Wtyczka została pomyślnie zainstalowana.", + "installModal.installedSuccessfullyWithPageDesc": "Wtyczka została pomyślnie zainstalowana. Możesz ją znaleźć na stronie {{categoryName}}.", "installModal.installing": "Instalowanie...", "installModal.labels.package": "Pakiet", "installModal.labels.repository": "Repozytorium", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "Informacje o instalacji następujących wtyczek {{num}}", "installModal.uploadFailed": "Przekazywanie nie powiodło się", "installModal.uploadingPackage": "Przesyłanie {{packageName}}...", + "installModal.viewDetails": "Pokaż szczegóły", "installPlugin": "Zainstaluj wtyczkę", + "list.noAgentStrategyFound": "Nie znaleziono strategii agenta", + "list.noExtensionFound": "Nie znaleziono rozszerzenia", "list.noInstalled": "Brak zainstalowanych wtyczek", + "list.noTriggerFound": "Nie znaleziono czynnika wywołującego", "list.notFound": "Nie znaleziono wtyczek", "list.source.github": "Instalowanie z usługi GitHub", "list.source.local": "Zainstaluj z lokalnego pliku pakietu", "list.source.marketplace": "Instalowanie z Marketplace", + "marketplace.allPlugins": "Wszystkie integracje", "marketplace.and": "i", + "marketplace.becomePartner": "Zostań partnerem", "marketplace.difyMarketplace": "Rynek Dify", "marketplace.discover": "Odkryć", "marketplace.empower": "Zwiększ możliwości rozwoju sztucznej inteligencji", "marketplace.moreFrom": "Więcej z Marketplace", - "marketplace.noPluginFound": "Nie znaleziono wtyczki", + "marketplace.noPluginFound": "Nie znaleziono integracji", "marketplace.partnerTip": "Zweryfikowane przez partnera Dify", + "marketplace.pluginsHeroSubtitle": "Korzystaj z integracji tworzonych przez społeczność, aby wspierać rozwój swojej sztucznej inteligencji.", + "marketplace.pluginsHeroTitle": "Odkrywaj. Rozszerzaj. Twórz.", "marketplace.pluginsResult": "{{num}} wyniki", "marketplace.sortBy": "Czarne miasto", "marketplace.sortOption.firstReleased": "Po raz pierwszy wydany", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "Zweryfikowane przez Dify", "marketplace.viewMore": "Zobacz więcej", "metadata.title": "Wtyczki", + "pluginDevelopmentGuide": "Przewodnik tworzenia integracji", "pluginInfoModal.packageName": "Pakiet", "pluginInfoModal.release": "Zwolnić", "pluginInfoModal.repository": "Repozytorium", "pluginInfoModal.title": "Informacje o wtyczce", + "pluginPublishGuide": "Przewodnik publikowania integracji", "privilege.admins": "Administratorzy", + "privilege.configurePermissionsInSettings": "Przejdź do Ustawienia > Role i uprawnienia, aby skonfigurować uprawnienia wtyczek.", "privilege.everyone": "Każdy", + "privilege.noDebugPermissionTooltip": "Nie masz uprawnień do debugowania integracji", + "privilege.noInstallPermissionTooltip": "Nie masz uprawnień do instalowania integracji i zarządzania nimi", "privilege.noone": "Nikt", + "privilege.permissions": "Uprawnienia", + "privilege.quickWhoCanDebug": "Kto może debugować?", + "privilege.quickWhoCanInstall": "Kto może instalować i zarządzać?", "privilege.title": "Preferencje wtyczek", "privilege.whoCanDebug": "Kto może debugować wtyczki?", "privilege.whoCanInstall": "Kto może instalować wtyczki i nimi zarządzać?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "Brak dostępnego pliku README", "readmeInfo.title": "PRZECZYTAJMNIE", "requestAPlugin": "Poproś o wtyczkę", + "requestSubmit": "Poproś lub opublikuj", "search": "Szukać", "searchCategories": "Kategorie wyszukiwania", "searchInMarketplace": "Wyszukiwanie w Marketplace", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "Instalacja wtyczek {{installingLength}}, {{successLength}} powodzenie.", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "Przewodnik publikowania szablonów", "upgrade.close": "Zamykać", "upgrade.description": "Informacje o instalacji następującej wtyczki", "upgrade.successfulTitle": "Instalacja powiodła się", diff --git a/web/i18n/pt-BR/dataset-pipeline.json b/web/i18n/pt-BR/dataset-pipeline.json index 8e3ebde8595..c7431d0aba8 100644 --- a/web/i18n/pt-BR/dataset-pipeline.json +++ b/web/i18n/pt-BR/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "Esta ação é permanente. Você não poderá reverter para o método anterior. Por favor, confirme para converter.", "conversion.confirm.title": "Confirmação", "conversion.descriptionChunk1": "Agora você pode converter sua base de conhecimento existente para usar o Pipeline de Conhecimento para processamento de documentos", - "conversion.descriptionChunk2": "— uma abordagem mais aberta e flexível com acesso a plugins do nosso mercado. Isso aplicará o novo método de processamento a todos os documentos futuros.", + "conversion.descriptionChunk2": " — uma abordagem mais aberta e flexível com acesso a integrações do Marketplace. Isso aplicará o novo método de processamento a todos os documentos futuros.", "conversion.errorMessage": "Falha ao converter o conjunto de dados em um pipeline", "conversion.successMessage": "Converteu com êxito o conjunto de dados em um pipeline", "conversion.title": "Converter em pipeline de conhecimento", diff --git a/web/i18n/pt-BR/plugin.json b/web/i18n/pt-BR/plugin.json index 681ec3d3451..3c031fc7c0c 100644 --- a/web/i18n/pt-BR/plugin.json +++ b/web/i18n/pt-BR/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "Use a autorização OAuth", "auth.whoCanUse": "Quem pode usar", "auth.workspaceDefault": "Espaço de trabalho padrão", + "autoUpdate.autoUpdate": "Atualização automática", + "autoUpdate.autoUpdateSettings": "Configurações de atualização automática", "autoUpdate.automaticUpdates": "Atualizações automáticas", "autoUpdate.changeTimezone": "Para mudar o fuso horário, vá para Configurações", "autoUpdate.excludeUpdate": "Os seguintes {{num}} plugins não serão atualizados automaticamente", + "autoUpdate.excludeUpdate_one": "A seguinte {{num}} integração não será atualizada automaticamente", + "autoUpdate.excludeUpdate_other": "As seguintes {{num}} integrações não serão atualizadas automaticamente", "autoUpdate.nextUpdateTime": "Próxima atualização automática: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "Nenhum plugin foi encontrado.", "autoUpdate.noPluginPlaceholder.noInstalled": "Nenhum plugin instalado", "autoUpdate.operation.clearAll": "Limpar tudo", "autoUpdate.operation.select": "Selecionar plugins", "autoUpdate.partialUPdate": "Apenas os seguintes {{num}} plugins serão atualizados automaticamente", + "autoUpdate.partialUPdate_one": "Apenas a seguinte {{num}} integração será atualizada automaticamente", + "autoUpdate.partialUPdate_other": "Apenas as seguintes {{num}} integrações serão atualizadas automaticamente", "autoUpdate.pluginDowngradeWarning.description": "A atualização automática está atualmente habilitada para este plugin. Reverter a versão pode causar a sobrescrição de suas alterações durante a próxima atualização automática.", "autoUpdate.pluginDowngradeWarning.downgrade": "Descer de nível de qualquer forma", "autoUpdate.pluginDowngradeWarning.exclude": "Excluir da atualização automática", "autoUpdate.pluginDowngradeWarning.title": "Rebaixamento do Plugin", + "autoUpdate.scope": "Escopo", + "autoUpdate.scopeMode.all": "Todos", + "autoUpdate.scopeMode.exclude": "Excluir selecionados", "autoUpdate.specifyPluginsToUpdate": "Especifique os plugins a serem atualizados", "autoUpdate.strategy.disabled.description": "Os plugins não atualizarão automaticamente", "autoUpdate.strategy.disabled.name": "Desativado", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "Atualização", "detailPanel.operation.updateTooltip": "Atualize para acessar os modelos mais recentes.", "detailPanel.operation.viewDetail": "Ver detalhes", + "detailPanel.operation.viewReadme": "Ver README", "detailPanel.serviceOk": "Serviço OK", "detailPanel.strategyNum": "{{num}} {{strategy}} INCLUSO", "detailPanel.switchVersion": "Versão do Switch", @@ -173,6 +183,7 @@ "installModal.back": "Voltar", "installModal.cancel": "Cancelar", "installModal.close": "Fechar", + "installModal.dropIntegrationToInstall": "Solte o pacote de integração aqui para instalar", "installModal.dropPluginToInstall": "Solte o pacote de plug-in aqui para instalar", "installModal.fromTrustSource": "Certifique-se de instalar apenas plug-ins de uma fonte confiável.", "installModal.install": "Instalar", @@ -182,7 +193,9 @@ "installModal.installPlugin": "Instale o plugin", "installModal.installWarning": "Este plugin não é permitido ser instalado.", "installModal.installedSuccessfully": "Instalação bem-sucedida", + "installModal.installedSuccessfullyCountDesc": "As seguintes {{num}} integrações foram instaladas com sucesso.", "installModal.installedSuccessfullyDesc": "O plugin foi instalado com sucesso.", + "installModal.installedSuccessfullyWithPageDesc": "A integração foi instalada com sucesso. Você pode encontrá-la na página {{categoryName}}.", "installModal.installing": "Instalar...", "installModal.labels.package": "Pacote", "installModal.labels.repository": "Repositório", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "Prestes a instalar os seguintes plugins {{num}}", "installModal.uploadFailed": "Falha no upload", "installModal.uploadingPackage": "Carregando {{packageName}} ...", + "installModal.viewDetails": "Ver detalhes", "installPlugin": "Instale o plugin", + "list.noAgentStrategyFound": "Nenhuma Estratégia do Agente encontrada", + "list.noExtensionFound": "Nenhuma Extensão encontrada", "list.noInstalled": "Nenhum plug-in instalado", + "list.noTriggerFound": "Nenhum Gatilho encontrado", "list.notFound": "Nenhum plugin encontrado", "list.source.github": "Instalar do GitHub", "list.source.local": "Instalar a partir do arquivo de pacote local", "list.source.marketplace": "Instalar do Marketplace", + "marketplace.allPlugins": "Todas as integrações", "marketplace.and": "e", + "marketplace.becomePartner": "Torne-se um parceiro", "marketplace.difyMarketplace": "Mercado Dify", "marketplace.discover": "Descobrir", "marketplace.empower": "Capacite seu desenvolvimento de IA", "marketplace.moreFrom": "Mais do Marketplace", - "marketplace.noPluginFound": "Nenhum plugin encontrado", + "marketplace.noPluginFound": "Nenhuma integração encontrada", "marketplace.partnerTip": "Verificado por um parceiro da Dify", + "marketplace.pluginsHeroSubtitle": "Use integrações criadas pela comunidade para impulsionar seu desenvolvimento de IA.", + "marketplace.pluginsHeroTitle": "Descubra. Estenda. Construa.", "marketplace.pluginsResult": "{{num}} resultados", "marketplace.sortBy": "Ordenar por", "marketplace.sortOption.firstReleased": "Lançado pela primeira vez", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "Verificado pelo Dify", "marketplace.viewMore": "Ver mais", "metadata.title": "Plugins", + "pluginDevelopmentGuide": "Guia de desenvolvimento de integrações", "pluginInfoModal.packageName": "Pacote", "pluginInfoModal.release": "Soltar", "pluginInfoModal.repository": "Repositório", "pluginInfoModal.title": "Informações do plugin", + "pluginPublishGuide": "Guia de publicação de integrações", "privilege.admins": "Administradores", + "privilege.configurePermissionsInSettings": "Vá para Configurações > Funções e Permissões para configurar as permissões de integração.", "privilege.everyone": "Todos", + "privilege.noDebugPermissionTooltip": "Você não tem permissão para depurar integrações", + "privilege.noInstallPermissionTooltip": "Você não tem permissão para instalar e gerenciar integrações", "privilege.noone": "Ninguém", + "privilege.permissions": "Permissões", + "privilege.quickWhoCanDebug": "Quem pode depurar?", + "privilege.quickWhoCanInstall": "Quem pode instalar e gerenciar?", "privilege.title": "Preferências de plug-ins", "privilege.whoCanDebug": "Quem pode depurar plugins?", "privilege.whoCanInstall": "Quem pode instalar e gerenciar plugins?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "Nenhum README disponível", "readmeInfo.title": "LEIA-ME", "requestAPlugin": "Solicitar um plugin", + "requestSubmit": "Solicitar ou publicar", "search": "Procurar", "searchCategories": "Categorias de pesquisa", "searchInMarketplace": "Pesquisar no Marketplace", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "Instalando plugins {{installingLength}}, {{successLength}} sucesso.", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "Guia de publicação de modelos", "upgrade.close": "Fechar", "upgrade.description": "Prestes a instalar o seguinte plugin", "upgrade.successfulTitle": "Instalação bem-sucedida", diff --git a/web/i18n/ro-RO/dataset-pipeline.json b/web/i18n/ro-RO/dataset-pipeline.json index 420889e71ee..3ff3de2cef1 100644 --- a/web/i18n/ro-RO/dataset-pipeline.json +++ b/web/i18n/ro-RO/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "Această acțiune este permanentă. Nu veți putea reveni la metoda anterioară. Vă rugăm să confirmați pentru a converti.", "conversion.confirm.title": "Confirmare", "conversion.descriptionChunk1": "Acum puteți converti baza de cunoștințe existentă pentru a utiliza Pipeline de cunoștințe pentru procesarea documentelor", - "conversion.descriptionChunk2": "— o abordare mai deschisă și mai flexibilă, cu acces la plugin-uri de pe piața noastră. Aceasta va aplica noua metodă de procesare tuturor documentelor viitoare.", + "conversion.descriptionChunk2": " — o abordare mai deschisă și mai flexibilă, cu acces la plugin-uri din Marketplace. Aceasta va aplica noua metodă de procesare tuturor documentelor viitoare.", "conversion.errorMessage": "Nu s-a reușit să se convertească setul de date într-o conductă", "conversion.successMessage": "Conversia cu succes a setului de date într-o conductă", "conversion.title": "Conversia în Knowledge Pipeline", diff --git a/web/i18n/ro-RO/plugin.json b/web/i18n/ro-RO/plugin.json index 6be16ffa66e..2181ed66e64 100644 --- a/web/i18n/ro-RO/plugin.json +++ b/web/i18n/ro-RO/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "Folosește autorizarea OAuth", "auth.whoCanUse": "Cine poate folosi", "auth.workspaceDefault": "Spațiul de lucru implicit", + "autoUpdate.autoUpdate": "Actualizare automată", + "autoUpdate.autoUpdateSettings": "Setări de actualizare automată", "autoUpdate.automaticUpdates": "Actualizări automate", "autoUpdate.changeTimezone": "Pentru a schimba fusul orar, mergi la Setări", "autoUpdate.excludeUpdate": "Următoarele {{num}} pluginuri nu se vor actualiza automat", + "autoUpdate.excludeUpdate_one": "Următorul {{num}} plugin nu se va actualiza automat", + "autoUpdate.excludeUpdate_other": "Următoarele {{num}} pluginuri nu se vor actualiza automat", "autoUpdate.nextUpdateTime": "Următoarea actualizare automată: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "Nu au fost găsite plugin-uri", "autoUpdate.noPluginPlaceholder.noInstalled": "Niciun plugin instalat", "autoUpdate.operation.clearAll": "Șterge tot", "autoUpdate.operation.select": "Selectați plugin-uri", "autoUpdate.partialUPdate": "Numai următoarele {{num}} pluginuri se vor actualiza automat", + "autoUpdate.partialUPdate_one": "Numai următorul {{num}} plugin se va actualiza automat", + "autoUpdate.partialUPdate_other": "Numai următoarele {{num}} pluginuri se vor actualiza automat", "autoUpdate.pluginDowngradeWarning.description": "Actualizarea automată este în prezent activată pentru acest plugin. Revenirea la o versiune anterioară poate provoca suprascrierea modificărilor tale în timpul următoarei actualizări automate.", "autoUpdate.pluginDowngradeWarning.downgrade": "Oricum, downgradează", "autoUpdate.pluginDowngradeWarning.exclude": "Exclude de la actualizarea automată", "autoUpdate.pluginDowngradeWarning.title": "Scădere a pluginului", + "autoUpdate.scope": "Domeniu de aplicare", + "autoUpdate.scopeMode.all": "Toate", + "autoUpdate.scopeMode.exclude": "Exclude selecția", "autoUpdate.specifyPluginsToUpdate": "Specificați plugin-urile de actualizat", "autoUpdate.strategy.disabled.description": "Pluginurile nu se vor actualiza automat", "autoUpdate.strategy.disabled.name": "Dezactivat", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "Actualiza", "detailPanel.operation.updateTooltip": "Actualizați pentru a accesa cele mai recente modele.", "detailPanel.operation.viewDetail": "Vezi detalii", + "detailPanel.operation.viewReadme": "Vizualizați README", "detailPanel.serviceOk": "Serviciu OK", "detailPanel.strategyNum": "{{num}} {{strategy}} INCLUS", "detailPanel.switchVersion": "Versiune de comutare", @@ -173,6 +183,7 @@ "installModal.back": "Spate", "installModal.cancel": "Anula", "installModal.close": "Închide", + "installModal.dropIntegrationToInstall": "Aruncați pachetul de plugin aici pentru a instala", "installModal.dropPluginToInstall": "Aruncați pachetul de plugin aici pentru a instala", "installModal.fromTrustSource": "Vă rugăm să vă asigurați că instalați plugin-uri numai dintr-o sursă de încredere.", "installModal.install": "Instala", @@ -182,7 +193,9 @@ "installModal.installPlugin": "Instalează pluginul", "installModal.installWarning": "Acest plugin nu este permis să fie instalat.", "installModal.installedSuccessfully": "Instalarea cu succes", + "installModal.installedSuccessfullyCountDesc": "Următoarele {{num}} pluginuri au fost instalate cu succes.", "installModal.installedSuccessfullyDesc": "Pluginul a fost instalat cu succes.", + "installModal.installedSuccessfullyWithPageDesc": "Pluginul a fost instalat cu succes. Îl puteți găsi pe pagina {{categoryName}}.", "installModal.installing": "Instalarea...", "installModal.labels.package": "Pachet", "installModal.labels.repository": "Depozit", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "Despre instalarea următoarelor plugin-uri {{num}}", "installModal.uploadFailed": "Încărcarea a eșuat", "installModal.uploadingPackage": "Încărcarea {{packageName}}...", + "installModal.viewDetails": "Vezi detalii", "installPlugin": "Instalează pluginul", + "list.noAgentStrategyFound": "Nu s-a găsit nicio strategie de agent", + "list.noExtensionFound": "Nu s-a găsit nicio extensie", "list.noInstalled": "Nu sunt instalate plugin-uri", + "list.noTriggerFound": "Nu s-a găsit niciun declanșator", "list.notFound": "Nu au fost găsite plugin-uri", "list.source.github": "Instalați din GitHub", "list.source.local": "Instalare din fișierul pachet local", "list.source.marketplace": "Instalează din Marketplace", + "marketplace.allPlugins": "Toate pluginurile", "marketplace.and": "și", + "marketplace.becomePartner": "Deveniți partener", "marketplace.difyMarketplace": "Piața Dify", "marketplace.discover": "Descoperi", "marketplace.empower": "Îmbunătățește-ți dezvoltarea AI", "marketplace.moreFrom": "Mai multe din Marketplace", "marketplace.noPluginFound": "Nu s-a găsit niciun plugin", "marketplace.partnerTip": "Verificat de un partener Dify", + "marketplace.pluginsHeroSubtitle": "Folosiți pluginuri create de comunitate pentru a vă alimenta dezvoltarea AI.", + "marketplace.pluginsHeroTitle": "Descoperă. Extinde. Construiește.", "marketplace.pluginsResult": "{{num}} rezultate", "marketplace.sortBy": "Sortează după", "marketplace.sortOption.firstReleased": "Prima lansare", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "Verificat de Dify", "marketplace.viewMore": "Vezi mai mult", "metadata.title": "Pluginuri", + "pluginDevelopmentGuide": "Ghid de dezvoltare a pluginurilor", "pluginInfoModal.packageName": "Pachet", "pluginInfoModal.release": "Elibera", "pluginInfoModal.repository": "Depozit", "pluginInfoModal.title": "Informații despre plugin", + "pluginPublishGuide": "Ghid de publicare a pluginurilor", "privilege.admins": "Administratori", + "privilege.configurePermissionsInSettings": "Accesați Setări > Roluri și permisiuni pentru a configura permisiunile pluginurilor.", "privilege.everyone": "Oricine", + "privilege.noDebugPermissionTooltip": "Nu aveți permisiunea de a depana pluginuri", + "privilege.noInstallPermissionTooltip": "Nu aveți permisiunea de a instala și gestiona pluginuri", "privilege.noone": "Nimeni", + "privilege.permissions": "Permisiuni", + "privilege.quickWhoCanDebug": "Cine poate depana?", + "privilege.quickWhoCanInstall": "Cine poate instala și gestiona?", "privilege.title": "Preferințe plugin", "privilege.whoCanDebug": "Cine poate depana pluginuri?", "privilege.whoCanInstall": "Cine poate instala și gestiona plugin-uri?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "Nu există fișier README disponibil", "readmeInfo.title": "Citiți-mă", "requestAPlugin": "Solicitați un plugin", + "requestSubmit": "Solicitați sau publicați", "search": "Căutare", "searchCategories": "Categorii de căutare", "searchInMarketplace": "Căutare în Marketplace", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "Instalarea pluginurilor {{installingLength}}, {{successLength}} succes.", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "Ghid de publicare a șabloanelor", "upgrade.close": "Închide", "upgrade.description": "Despre instalarea următorului plugin", "upgrade.successfulTitle": "Instalarea cu succes", diff --git a/web/i18n/ru-RU/dataset-pipeline.json b/web/i18n/ru-RU/dataset-pipeline.json index 2ec2da0d999..06d1b874fab 100644 --- a/web/i18n/ru-RU/dataset-pipeline.json +++ b/web/i18n/ru-RU/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "Это действие является постоянным. Вы не сможете вернуться к предыдущему методу. Пожалуйста, подтвердите конвертацию.", "conversion.confirm.title": "Подтверждение", "conversion.descriptionChunk1": "Теперь вы можете преобразовать существующую базу знаний для использования конвейера знаний для обработки документов", - "conversion.descriptionChunk2": "— более открытый и гибкий подход с доступом к плагинам из нашего маркетплейса. Это позволит применить новый метод обработки ко всем будущим документам.", + "conversion.descriptionChunk2": " — более открытый и гибкий подход с доступом к плагинам из Marketplace. Это позволит применить новый метод обработки ко всем будущим документам.", "conversion.errorMessage": "Не удалось преобразовать набор данных в конвейер", "conversion.successMessage": "Успешное преобразование набора данных в конвейер", "conversion.title": "Конвертация в конвейер знаний", diff --git a/web/i18n/ru-RU/plugin.json b/web/i18n/ru-RU/plugin.json index 34c8341e942..d25e50885af 100644 --- a/web/i18n/ru-RU/plugin.json +++ b/web/i18n/ru-RU/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "Используйте авторизацию OAuth", "auth.whoCanUse": "Кто может использовать", "auth.workspaceDefault": "Рабочее пространство по умолчанию", + "autoUpdate.autoUpdate": "Автообновление", + "autoUpdate.autoUpdateSettings": "Настройки автообновления", "autoUpdate.automaticUpdates": "Автоматические обновления", "autoUpdate.changeTimezone": "Чтобы изменить часовой пояс, перейдите в Настройки", "autoUpdate.excludeUpdate": "Следующие {{num}} плагины не будут обновляться автоматически", + "autoUpdate.excludeUpdate_one": "Следующий {{num}} плагин не будет обновляться автоматически", + "autoUpdate.excludeUpdate_other": "Следующие {{num}} плагины не будут обновляться автоматически", "autoUpdate.nextUpdateTime": "Следующее автообновление: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "Плагины не найдены", "autoUpdate.noPluginPlaceholder.noInstalled": "Нет установленных плагинов", "autoUpdate.operation.clearAll": "Очистить все", "autoUpdate.operation.select": "Выберите плагины", "autoUpdate.partialUPdate": "Только следующие {{num}} плагины будут обновляться автоматически", + "autoUpdate.partialUPdate_one": "Только следующий {{num}} плагин будет обновляться автоматически", + "autoUpdate.partialUPdate_other": "Только следующие {{num}} плагины будут обновляться автоматически", "autoUpdate.pluginDowngradeWarning.description": "Автообновление в данный момент включено для этого плагина. Понижение версии может привести к тому, что ваши изменения будут перезаписаны во время следующего автоматического обновления.", "autoUpdate.pluginDowngradeWarning.downgrade": "Все равно понизьте версию", "autoUpdate.pluginDowngradeWarning.exclude": "Исключить из автообновления", "autoUpdate.pluginDowngradeWarning.title": "Понижение версии плагина", + "autoUpdate.scope": "Область", + "autoUpdate.scopeMode.all": "Все", + "autoUpdate.scopeMode.exclude": "Исключить выбранное", "autoUpdate.specifyPluginsToUpdate": "Укажите плагины для обновления", "autoUpdate.strategy.disabled.description": "Плагины не будут автоматически обновляться", "autoUpdate.strategy.disabled.name": "Отключен", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "Обновлять", "detailPanel.operation.updateTooltip": "Обновите для доступа к последним моделям.", "detailPanel.operation.viewDetail": "Подробнее", + "detailPanel.operation.viewReadme": "Посмотреть README", "detailPanel.serviceOk": "Услуга ОК", "detailPanel.strategyNum": "{{num}} {{strategy}} ВКЛЮЧЕННЫЙ", "detailPanel.switchVersion": "Версия для переключателя", @@ -173,6 +183,7 @@ "installModal.back": "Назад", "installModal.cancel": "Отмена", "installModal.close": "Закрывать", + "installModal.dropIntegrationToInstall": "Перетащите пакет плагина сюда для установки", "installModal.dropPluginToInstall": "Перетащите пакет плагина сюда для установки", "installModal.fromTrustSource": "Убедитесь, что вы устанавливаете плагины только из надежного источника.", "installModal.install": "Устанавливать", @@ -182,7 +193,9 @@ "installModal.installPlugin": "Установить плагин", "installModal.installWarning": "Этот плагин не разрешено устанавливать.", "installModal.installedSuccessfully": "Установка успешна", + "installModal.installedSuccessfullyCountDesc": "Следующие {{num}} плагины успешно установлены.", "installModal.installedSuccessfullyDesc": "Плагин успешно установлен.", + "installModal.installedSuccessfullyWithPageDesc": "Плагин успешно установлен. Вы можете найти его на странице {{categoryName}}.", "installModal.installing": "Установка...", "installModal.labels.package": "Пакет", "installModal.labels.repository": "Хранилище", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "О необходимости установки следующих плагинов {{num}}", "installModal.uploadFailed": "Ошибка загрузки", "installModal.uploadingPackage": "Загрузка {{packageName}}...", + "installModal.viewDetails": "Подробнее", "installPlugin": "Установка плагина", + "list.noAgentStrategyFound": "Агентская стратегия не найдена", + "list.noExtensionFound": "Расширение не найдено", "list.noInstalled": "Плагины не установлены", + "list.noTriggerFound": "Триггер не найден", "list.notFound": "Плагины не найдены", "list.source.github": "Установка с GitHub", "list.source.local": "Установка из локального файла пакета", "list.source.marketplace": "Установка из Marketplace", + "marketplace.allPlugins": "Все плагины", "marketplace.and": "и", + "marketplace.becomePartner": "Стать партнёром", "marketplace.difyMarketplace": "Торговая площадка Dify", "marketplace.discover": "Обнаруживать", "marketplace.empower": "Расширьте возможности разработки ИИ", "marketplace.moreFrom": "Больше из Marketplace", "marketplace.noPluginFound": "Плагин не найден", "marketplace.partnerTip": "Подтверждено партнером Dify", + "marketplace.pluginsHeroSubtitle": "Используйте плагины, созданные сообществом, чтобы ускорить разработку ИИ.", + "marketplace.pluginsHeroTitle": "Открывайте. Расширяйте. Создавайте.", "marketplace.pluginsResult": "Результаты {{num}}", "marketplace.sortBy": "Черный город", "marketplace.sortOption.firstReleased": "Впервые выпущен", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "Подтверждено Dify", "marketplace.viewMore": "Подробнее", "metadata.title": "Плагины", + "pluginDevelopmentGuide": "Руководство по разработке плагинов", "pluginInfoModal.packageName": "Пакет", "pluginInfoModal.release": "Отпускать", "pluginInfoModal.repository": "Хранилище", "pluginInfoModal.title": "Информация о плагине", + "pluginPublishGuide": "Руководство по публикации плагинов", "privilege.admins": "Админы", + "privilege.configurePermissionsInSettings": "Перейдите в «Настройки» > «Роли и разрешения», чтобы настроить разрешения плагинов.", "privilege.everyone": "Каждый", + "privilege.noDebugPermissionTooltip": "У вас нет разрешения на отладку плагинов", + "privilege.noInstallPermissionTooltip": "У вас нет разрешения на установку плагинов и управление ими", "privilege.noone": "Никто", + "privilege.permissions": "Разрешения", + "privilege.quickWhoCanDebug": "Кто может отлаживать?", + "privilege.quickWhoCanInstall": "Кто может устанавливать и управлять?", "privilege.title": "Настройки плагина", "privilege.whoCanDebug": "Кто может отлаживать плагины?", "privilege.whoCanInstall": "Кто может устанавливать плагины и управлять ими?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "README недоступен", "readmeInfo.title": "ПРОЧТИ_МЕНЯ", "requestAPlugin": "Запросите плагин", + "requestSubmit": "Запросить или опубликовать", "search": "Искать", "searchCategories": "Поиск категорий", "searchInMarketplace": "Поиск в маркетплейсе", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "Установка плагинов {{installingLength}}, {{successLength}} успех.", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "Руководство по публикации шаблонов", "upgrade.close": "Закрывать", "upgrade.description": "О программе установки следующего плагина", "upgrade.successfulTitle": "Установка успешна", diff --git a/web/i18n/sl-SI/dataset-pipeline.json b/web/i18n/sl-SI/dataset-pipeline.json index c2123636d13..834a9935573 100644 --- a/web/i18n/sl-SI/dataset-pipeline.json +++ b/web/i18n/sl-SI/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "To dejanje je trajno. Ne boste se mogli vrniti na prejšnjo metodo. Prosimo, potrdite za pretvorbo.", "conversion.confirm.title": "Potrditev", "conversion.descriptionChunk1": "Zdaj lahko obstoječo zbirko znanja pretvorite tako, da za obdelavo dokumentov uporabljate cevovod znanja", - "conversion.descriptionChunk2": "- bolj odprt in prilagodljiv pristop z dostopom do vtičnikov z našega trga. To bo uporabilo novo metodo obdelave za vse prihodnje dokumente.", + "conversion.descriptionChunk2": " — bolj odprt in prilagodljiv pristop z dostopom do vtičnikov s Tržnice. To bo uporabilo novo metodo obdelave za vse prihodnje dokumente.", "conversion.errorMessage": "Pretvorba nabora podatkov v cevovod ni uspela", "conversion.successMessage": "Uspešno pretvorba nabora podatkov v cevovod", "conversion.title": "Pretvori v cevovod znanja", diff --git a/web/i18n/sl-SI/plugin.json b/web/i18n/sl-SI/plugin.json index 50d1ab9e749..be30977a79c 100644 --- a/web/i18n/sl-SI/plugin.json +++ b/web/i18n/sl-SI/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "Uporabite OAuth avtentikacijo", "auth.whoCanUse": "Kdo lahko uporablja", "auth.workspaceDefault": "Privzeti delovni prostor", + "autoUpdate.autoUpdate": "Samodejno posodabljanje", + "autoUpdate.autoUpdateSettings": "Nastavitve samodejnega posodabljanja", "autoUpdate.automaticUpdates": "Samodejna posodobitev", "autoUpdate.changeTimezone": "Za spremembo časovnega pasu pojdite v Nastavitve", "autoUpdate.excludeUpdate": "Naslednjih {{num}} razširitev ne bo samodejno posodobljenih", + "autoUpdate.excludeUpdate_one": "Naslednji {{num}} vtičnik ne bo samodejno posodobljen", + "autoUpdate.excludeUpdate_other": "Naslednjih {{num}} vtičnikov ne bo samodejno posodobljenih", "autoUpdate.nextUpdateTime": "Naslednje samodejno posodabljanje: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "Nobeni vtičniki niso bili najdeni", "autoUpdate.noPluginPlaceholder.noInstalled": "Nobenih vtičnikov ni nameščenih", "autoUpdate.operation.clearAll": "Počisti vse", "autoUpdate.operation.select": "Izberi vtičnike", "autoUpdate.partialUPdate": "Samo naslednjih {{num}} vtičnikov se bo samodejno posodabljalo.", + "autoUpdate.partialUPdate_one": "Samo naslednji {{num}} vtičnik se bo samodejno posodabljal", + "autoUpdate.partialUPdate_other": "Samo naslednjih {{num}} vtičnikov se bo samodejno posodabljalo", "autoUpdate.pluginDowngradeWarning.description": "Samodejno posodabljanje je trenutno omogočeno za ta vtičnik. Zmanjšanje različice lahko povzroči, da bodo vaše spremembe prepisane med naslednjim samodejnim posodabljanjem.", "autoUpdate.pluginDowngradeWarning.downgrade": "Kljub temu narediti nižjo različico", "autoUpdate.pluginDowngradeWarning.exclude": "Izključi iz samodejnega posodabljanja", "autoUpdate.pluginDowngradeWarning.title": "Zmanjšanje različice vtičnika", + "autoUpdate.scope": "Obseg", + "autoUpdate.scopeMode.all": "Vse", + "autoUpdate.scopeMode.exclude": "Izključi izbrano", "autoUpdate.specifyPluginsToUpdate": "Določite vtičnike za posodobitev", "autoUpdate.strategy.disabled.description": "Vtičniki se ne bodo samodejno posodobili", "autoUpdate.strategy.disabled.name": "Onemogočeno", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "Posodobitev", "detailPanel.operation.updateTooltip": "Posodobite za dostop do najnovejših modelov.", "detailPanel.operation.viewDetail": "Oglej si podrobnosti", + "detailPanel.operation.viewReadme": "Ogled README", "detailPanel.serviceOk": "Storitve so v redu", "detailPanel.strategyNum": "{{num}} {{strategy}} VKLJUČENO", "detailPanel.switchVersion": "Preklopna različica", @@ -173,6 +183,7 @@ "installModal.back": "Nazaj", "installModal.cancel": "Prekliči", "installModal.close": "Zapri", + "installModal.dropIntegrationToInstall": "Tukaj spustite paket vtičnika, da ga namestite", "installModal.dropPluginToInstall": "Tukaj spustite paket vtičnika, da ga namestite", "installModal.fromTrustSource": "Prosimo, poskrbite, da namestite le vtičnike iz zaupanja vrednega vira.", "installModal.install": "Namestite", @@ -182,7 +193,9 @@ "installModal.installPlugin": "Namestite vtičnik", "installModal.installWarning": "Ta vtičnik ni dovoljen za namestitev.", "installModal.installedSuccessfully": "Namestitev uspešna", + "installModal.installedSuccessfullyCountDesc": "Naslednjih {{num}} vtičnikov je bilo uspešno nameščenih.", "installModal.installedSuccessfullyDesc": "Vtičnik je bil uspešno nameščen.", + "installModal.installedSuccessfullyWithPageDesc": "Vtičnik je bil uspešno nameščen. Najdete ga na strani {{categoryName}}.", "installModal.installing": "Nameščanje...", "installModal.labels.package": "Paket", "installModal.labels.repository": "Shramba", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "Prihajamo do namestitve naslednjih {{num}} dodatkov", "installModal.uploadFailed": "Nalaganje ni uspelo", "installModal.uploadingPackage": "Nalagam {{packageName}}...", + "installModal.viewDetails": "Ogled podrobnosti", "installPlugin": "Namestite vtičnik", + "list.noAgentStrategyFound": "Nobena strategija agenta ni bila najdena", + "list.noExtensionFound": "Nobena razširitev ni bila najdena", "list.noInstalled": "Nobeni vtičniki niso nameščeni.", + "list.noTriggerFound": "Noben sprožilec ni bil najden", "list.notFound": "Nobeni vtičniki niso bili najdeni.", "list.source.github": "Namestite iz GitHub-a", "list.source.local": "Namestite iz lokalne paketne datoteke", "list.source.marketplace": "Namestite iz tržnice", + "marketplace.allPlugins": "Vsi vtičniki", "marketplace.and": "in", + "marketplace.becomePartner": "Postanite partner", "marketplace.difyMarketplace": "Dify Marketplace", "marketplace.discover": "Odkrijte", "marketplace.empower": "Okrepite svoj razvoj AI", "marketplace.moreFrom": "Več iz tržnice", "marketplace.noPluginFound": "Nobenega vtičnika ni bilo najti.", "marketplace.partnerTip": "Potrjeno s strani partnerja Dify", + "marketplace.pluginsHeroSubtitle": "Uporabite vtičnike, ki jih je ustvarila skupnost, za pospešitev vašega razvoja AI.", + "marketplace.pluginsHeroTitle": "Odkrijte. Razširite. Gradite.", "marketplace.pluginsResult": "{{num}} rezultati", "marketplace.sortBy": "Razvrsti po", "marketplace.sortOption.firstReleased": "Prvič izdan", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "Verificirano s strani Dify", "marketplace.viewMore": "Oglejte si več", "metadata.title": "Vtičniki", + "pluginDevelopmentGuide": "Vodnik za razvoj vtičnikov", "pluginInfoModal.packageName": "Paket", "pluginInfoModal.release": "Izdati", "pluginInfoModal.repository": "Shramba", "pluginInfoModal.title": "Informacije o vtičniku", + "pluginPublishGuide": "Vodnik za objavljanje vtičnikov", "privilege.admins": "Administratori", + "privilege.configurePermissionsInSettings": "Pojdite v Nastavitve > Vloge in dovoljenja za konfiguracijo dovoljenj vtičnikov.", "privilege.everyone": "Vsi", + "privilege.noDebugPermissionTooltip": "Nimate dovoljenja za odpravljanje napak v vtičnikih", + "privilege.noInstallPermissionTooltip": "Nimate dovoljenja za namestitev in upravljanje vtičnikov", "privilege.noone": "Nihče", + "privilege.permissions": "Dovoljenja", + "privilege.quickWhoCanDebug": "Kdo lahko odpravlja napake?", + "privilege.quickWhoCanInstall": "Kdo lahko namesti in upravlja?", "privilege.title": "Nastavitve vtičnika", "privilege.whoCanDebug": "Kdo lahko odpravi napake v vtičnikih?", "privilege.whoCanInstall": "Kdo lahko namesti in upravlja vtičnike?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "README ni na voljo", "readmeInfo.title": "PREBERIME", "requestAPlugin": "Zahtevajte vtičnik", + "requestSubmit": "Zahtevaj ali objavi", "search": "Iskanje", "searchCategories": "Išči kategorije", "searchInMarketplace": "Iskanje na trgu", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "Namestitev {{installingLength}} dodatkov, {{successLength}} uspešnih.", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "Vodnik za objavljanje predlog", "upgrade.close": "Zapri", "upgrade.description": "Namestitev naslednjega vtičnika", "upgrade.successfulTitle": "Namestitev uspešna", diff --git a/web/i18n/th-TH/dataset-pipeline.json b/web/i18n/th-TH/dataset-pipeline.json index 712a5f963db..511cbacaaf8 100644 --- a/web/i18n/th-TH/dataset-pipeline.json +++ b/web/i18n/th-TH/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "การกระทํานี้เป็นแบบถาวร คุณจะไม่สามารถเปลี่ยนกลับไปใช้วิธีการก่อนหน้านี้ได้ โปรดยืนยันการแปลง", "conversion.confirm.title": "การยืนยัน", "conversion.descriptionChunk1": "ตอนนี้คุณสามารถแปลงฐานความรู้ที่มีอยู่เพื่อใช้ไปป์ไลน์ความรู้สําหรับการประมวลผลเอกสารได้แล้ว", - "conversion.descriptionChunk2": "— แนวทางที่เปิดกว้างและยืดหยุ่นมากขึ้นด้วยการเข้าถึงปลั๊กอินจากตลาดของเรา การดําเนินการนี้จะใช้วิธีการประมวลผลใหม่กับเอกสารในอนาคตทั้งหมด", + "conversion.descriptionChunk2": " — แนวทางที่เปิดกว้างและยืดหยุ่นมากขึ้นด้วยการเข้าถึงปลั๊กอินจาก Marketplace การดําเนินการนี้จะใช้วิธีการประมวลผลใหม่กับเอกสารในอนาคตทั้งหมด", "conversion.errorMessage": "ไม่สามารถแปลงชุดข้อมูลเป็นไปป์ไลน์ได้", "conversion.successMessage": "แปลงชุดข้อมูลเป็นไปป์ไลน์เรียบร้อยแล้ว", "conversion.title": "แปลงเป็นไปป์ไลน์ความรู้", diff --git a/web/i18n/th-TH/plugin.json b/web/i18n/th-TH/plugin.json index a5acf0e7479..fa09b838018 100644 --- a/web/i18n/th-TH/plugin.json +++ b/web/i18n/th-TH/plugin.json @@ -43,20 +43,29 @@ "auth.useOAuthAuth": "ใช้การอนุญาต OAuth", "auth.whoCanUse": "ใครใช้ได้บ้าง", "auth.workspaceDefault": "พื้นที่ทำงานเริ่มต้น", + "autoUpdate.autoUpdate": "อัปเดตอัตโนมัติ", + "autoUpdate.autoUpdateSettings": "การตั้งค่าการอัปเดตอัตโนมัติ", "autoUpdate.automaticUpdates": "การอัปเดตอัตโนมัติ", "autoUpdate.changeTimezone": "ในการเปลี่ยนเขตเวลา ให้ไปที่ การตั้งค่า", "autoUpdate.excludeUpdate": "ปลั๊กอิน {{num}} ต่อไปนี้จะไม่อัพเดตอัตโนมัติ", + "autoUpdate.excludeUpdate_one": "ปลั๊กอิน {{num}} ต่อไปนี้จะไม่อัพเดตอัตโนมัติ", + "autoUpdate.excludeUpdate_other": "ปลั๊กอิน {{num}} ต่อไปนี้จะไม่อัพเดตอัตโนมัติ", "autoUpdate.nextUpdateTime": "การอัปเดตอัตโนมัติครั้งถัดไป: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "ไม่พบปลั๊กอิน", "autoUpdate.noPluginPlaceholder.noInstalled": "ไม่มีปลั๊กอินติดตั้ง", "autoUpdate.operation.clearAll": "ล้างทั้งหมด", "autoUpdate.operation.select": "เลือกปลั๊กอิน", "autoUpdate.partialUPdate": "ปลั๊กอิน {{num}} ตัวต่อไปนี้จะอัปเดตให้อัตโนมัติเท่านั้น", + "autoUpdate.partialUPdate_one": "ปลั๊กอิน {{num}} ตัวต่อไปนี้จะอัปเดตให้อัตโนมัติเท่านั้น", + "autoUpdate.partialUPdate_other": "ปลั๊กอิน {{num}} ตัวต่อไปนี้จะอัปเดตให้อัตโนมัติเท่านั้น", "autoUpdate.pluginDowngradeWarning.description": "ฟีเจอร์การอัปเดตอัตโนมัติเปิดใช้งานอยู่สำหรับปลั๊กอินนี้ การลดระดับเวอร์ชันอาจทำให้การเปลี่ยนแปลงของคุณหายไปในระหว่างการอัปเดตอัตโนมัติต่อไป", "autoUpdate.pluginDowngradeWarning.downgrade": "ลดระดับอยู่ดี", "autoUpdate.pluginDowngradeWarning.exclude": "ไม่รวมในการอัปเดตอัตโนมัติ", "autoUpdate.pluginDowngradeWarning.title": "การลดเวอร์ชันปลั๊กอิน", - "autoUpdate.specifyPluginsToUpdate": "ระบุปลั๊กอินที่จะแ atualizar", + "autoUpdate.scope": "ขอบเขต", + "autoUpdate.scopeMode.all": "ทั้งหมด", + "autoUpdate.scopeMode.exclude": "ยกเว้นที่เลือกไว้", + "autoUpdate.specifyPluginsToUpdate": "ระบุปลั๊กอินที่จะอัปเดต", "autoUpdate.strategy.disabled.description": "ปลั๊กอินจะไม่อัปเดตอัตโนมัติ", "autoUpdate.strategy.disabled.name": "ผู้พิการ", "autoUpdate.strategy.fixOnly.description": "การอัปเดตอัตโนมัติสำหรับเฉพาะเวอร์ชันแพทช์ (เช่น 1.0.1 → 1.0.2) การเปลี่ยนแปลงเวอร์ชันย่อยจะไม่ทำให้เกิดการอัปเดต", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "อัพเดต", "detailPanel.operation.updateTooltip": "อัปเดตเพื่อเข้าถึงโมเดลล่าสุด", "detailPanel.operation.viewDetail": "ดูรายละเอียด", + "detailPanel.operation.viewReadme": "ดู README", "detailPanel.serviceOk": "บริการตกลง", "detailPanel.strategyNum": "{{num}} {{strategy}} รวม", "detailPanel.switchVersion": "สลับเวอร์ชัน", @@ -173,6 +183,7 @@ "installModal.back": "ย้อนกลับ", "installModal.cancel": "ยกเลิก", "installModal.close": "ปิด", + "installModal.dropIntegrationToInstall": "วางแพ็คเกจปลั๊กอินที่นี่เพื่อติดตั้ง", "installModal.dropPluginToInstall": "วางแพ็คเกจปลั๊กอินที่นี่เพื่อติดตั้ง", "installModal.fromTrustSource": "โปรดตรวจสอบให้แน่ใจว่าคุณติดตั้งปลั๊กอินจากแหล่งที่เชื่อถือได้เท่านั้น", "installModal.install": "ติดตั้ง", @@ -182,7 +193,9 @@ "installModal.installPlugin": "ติดตั้งปลั๊กอิน", "installModal.installWarning": "ไม่อนุญาตให้ติดตั้งปลั๊กอินนี้", "installModal.installedSuccessfully": "การติดตั้งสําเร็จ", + "installModal.installedSuccessfullyCountDesc": "ติดตั้งปลั๊กอิน {{num}} ตัวต่อไปนี้สําเร็จแล้ว", "installModal.installedSuccessfullyDesc": "ติดตั้งปลั๊กอินสําเร็จแล้ว", + "installModal.installedSuccessfullyWithPageDesc": "ติดตั้งปลั๊กอินสําเร็จแล้ว คุณสามารถค้นหาได้ในหน้า {{categoryName}}", "installModal.installing": "ติด ตั้ง ", "installModal.labels.package": "ห่อ", "installModal.labels.repository": "เก็บ", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "เกี่ยวกับการติดตั้งปลั๊กอิน {{num}} ต่อไปนี้", "installModal.uploadFailed": "อัปโหลดล้มเหลว", "installModal.uploadingPackage": "กําลังอัปโหลด {{packageName}}...", + "installModal.viewDetails": "ดูรายละเอียด", "installPlugin": "ติดตั้งปลั๊กอิน", + "list.noAgentStrategyFound": "ไม่พบกลยุทธ์ตัวแทน", + "list.noExtensionFound": "ไม่พบส่วนขยาย", "list.noInstalled": "ไม่ได้ติดตั้งปลั๊กอิน", + "list.noTriggerFound": "ไม่พบทริกเกอร์", "list.notFound": "ไม่พบปลั๊กอิน", "list.source.github": "ติดตั้งจาก GitHub", "list.source.local": "ติดตั้งจากไฟล์แพ็คเกจในเครื่อง", "list.source.marketplace": "ติดตั้งจาก Marketplace", + "marketplace.allPlugins": "ปลั๊กอินทั้งหมด", "marketplace.and": "และ", + "marketplace.becomePartner": "เป็นพันธมิตร", "marketplace.difyMarketplace": "ตลาด Dify", "marketplace.discover": "ค้นพบ", "marketplace.empower": "เพิ่มศักยภาพในการพัฒนา AI ของคุณ", "marketplace.moreFrom": "แอปเพิ่มเติมจาก Marketplace", "marketplace.noPluginFound": "ไม่พบปลั๊กอิน", "marketplace.partnerTip": "ได้รับการตรวจสอบโดยพันธมิตรของ Dify", + "marketplace.pluginsHeroSubtitle": "ใช้ปลั๊กอินที่สร้างโดยชุมชนเพื่อเสริมพลังการพัฒนา AI ของคุณ", + "marketplace.pluginsHeroTitle": "ค้นพบ ขยาย สร้าง", "marketplace.pluginsResult": "{{num}} ผลลัพธ์", "marketplace.sortBy": "เมืองสีดํา", "marketplace.sortOption.firstReleased": "เปิดตัวครั้งแรก", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "ได้รับการตรวจสอบโดย Dify", "marketplace.viewMore": "ดูเพิ่มเติม", "metadata.title": "ปลั๊กอิน", + "pluginDevelopmentGuide": "คู่มือการพัฒนาปลั๊กอิน", "pluginInfoModal.packageName": "ห่อ", "pluginInfoModal.release": "ปล่อย", "pluginInfoModal.repository": "เก็บ", "pluginInfoModal.title": "ข้อมูลปลั๊กอิน", + "pluginPublishGuide": "คู่มือการเผยแพร่ปลั๊กอิน", "privilege.admins": "ผู้ดูแลระบบ", + "privilege.configurePermissionsInSettings": "ไปที่ การตั้งค่า > บทบาทและสิทธิ์ เพื่อกำหนดค่าสิทธิ์ของปลั๊กอิน", "privilege.everyone": "ทุกคน", + "privilege.noDebugPermissionTooltip": "คุณไม่มีสิทธิ์ในการดีบักปลั๊กอิน", + "privilege.noInstallPermissionTooltip": "คุณไม่มีสิทธิ์ในการติดตั้งและจัดการปลั๊กอิน", "privilege.noone": "ไม่มีใคร", + "privilege.permissions": "สิทธิ์", + "privilege.quickWhoCanDebug": "ใครสามารถดีบักได้บ้าง?", + "privilege.quickWhoCanInstall": "ใครสามารถติดตั้งและจัดการได้บ้าง?", "privilege.title": "การตั้งค่าปลั๊กอิน", "privilege.whoCanDebug": "ใครสามารถดีบักปลั๊กอินได้บ้าง", "privilege.whoCanInstall": "ใครสามารถติดตั้งและจัดการปลั๊กอินได้บ้าง", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "ไม่มีไฟล์ README", "readmeInfo.title": "อ่านฉัน", "requestAPlugin": "ขอปลั๊กอิน", + "requestSubmit": "ขอหรือเผยแพร่", "search": "ค้น", "searchCategories": "หมวดหมู่การค้นหา", "searchInMarketplace": "ค้นหาใน Marketplace", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "การติดตั้งปลั๊กอิน {{installingLength}}, {{successLength}} สําเร็จ", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "คู่มือการเผยแพร่เทมเพลต", "upgrade.close": "ปิด", "upgrade.description": "เกี่ยวกับการติดตั้งปลั๊กอินต่อไปนี้", "upgrade.successfulTitle": "ติดตั้งสําเร็จ", diff --git a/web/i18n/tr-TR/dataset-pipeline.json b/web/i18n/tr-TR/dataset-pipeline.json index 3c617f3a276..d03ef8caffe 100644 --- a/web/i18n/tr-TR/dataset-pipeline.json +++ b/web/i18n/tr-TR/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "Bu eylem kalıcıdır. Önceki yönteme geri dönemezsiniz. Dönüştürmek için lütfen onaylayın.", "conversion.confirm.title": "Onay", "conversion.descriptionChunk1": "Artık mevcut bilgi bankanızı belge işleme için Bilgi İşlem Hattı'nı kullanacak şekilde dönüştürebilirsiniz", - "conversion.descriptionChunk2": "— Pazarımızdaki eklentilere erişim ile daha açık ve esnek bir yaklaşım. Bu, yeni işleme yöntemini gelecekteki tüm belgelere uygulayacaktır.", + "conversion.descriptionChunk2": " — Pazar Yeri'ndeki eklentilere erişim sağlayan, daha açık ve esnek bir yaklaşım. Bu, yeni işleme yöntemini gelecekteki tüm belgelere uygulayacaktır.", "conversion.errorMessage": "Veri kümesi işlem hattına dönüştürülemedi", "conversion.successMessage": "Veri kümesi başarıyla işlem hattına dönüştürüldü", "conversion.title": "Bilgi İşlem Hattına Dönüştür", diff --git a/web/i18n/tr-TR/plugin.json b/web/i18n/tr-TR/plugin.json index e4db0c83577..080c13c0416 100644 --- a/web/i18n/tr-TR/plugin.json +++ b/web/i18n/tr-TR/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "OAuth Yetkilendirmesi Kullan", "auth.whoCanUse": "Kimler kullanabilir?", "auth.workspaceDefault": "Çalışma Alanı Varsayılan", + "autoUpdate.autoUpdate": "Otomatik güncelleme", + "autoUpdate.autoUpdateSettings": "Otomatik Güncelleme Ayarları", "autoUpdate.automaticUpdates": "Otomatik güncellemeler", "autoUpdate.changeTimezone": "Zaman dilimini değiştirmek için Ayarlar sekmesine gidin", "autoUpdate.excludeUpdate": "Aşağıdaki {{num}} eklenti otomatik olarak güncellenmeyecek", + "autoUpdate.excludeUpdate_one": "Aşağıdaki {{num}} eklenti otomatik olarak güncellenmeyecek", + "autoUpdate.excludeUpdate_other": "Aşağıdaki {{num}} eklenti otomatik olarak güncellenmeyecek", "autoUpdate.nextUpdateTime": "Sonraki otomatik güncelleme: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "Hiçbir eklenti bulunamadı", "autoUpdate.noPluginPlaceholder.noInstalled": "Hiçbir eklenti yüklenmemiş", "autoUpdate.operation.clearAll": "Hepsini temizle", "autoUpdate.operation.select": "Eklentileri seçin", "autoUpdate.partialUPdate": "Sadece aşağıdaki {{num}} eklenti otomatik olarak güncellenecek", + "autoUpdate.partialUPdate_one": "Sadece aşağıdaki {{num}} eklenti otomatik olarak güncellenecek", + "autoUpdate.partialUPdate_other": "Sadece aşağıdaki {{num}} eklenti otomatik olarak güncellenecek", "autoUpdate.pluginDowngradeWarning.description": "Bu eklenti için otomatik güncelleme şu anda etkin. Sürümün düşürülmesi, bir sonraki otomatik güncelleme sırasında değişikliklerinizin üzerine yazılmasına neden olabilir.", "autoUpdate.pluginDowngradeWarning.downgrade": "Her durumda düşürme", "autoUpdate.pluginDowngradeWarning.exclude": "Otomatik güncellemeden hariç tut", "autoUpdate.pluginDowngradeWarning.title": "Eklenti Düşürme", + "autoUpdate.scope": "Kapsam", + "autoUpdate.scopeMode.all": "Tümü", + "autoUpdate.scopeMode.exclude": "Seçilenleri hariç tut", "autoUpdate.specifyPluginsToUpdate": "Güncellemek için eklentileri belirtin", "autoUpdate.strategy.disabled.description": "Eklentiler otomatik olarak güncellenmeyecek", "autoUpdate.strategy.disabled.name": "Devre Dışı", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "Güncelle", "detailPanel.operation.updateTooltip": "En son modellere erişmek için güncelleyin.", "detailPanel.operation.viewDetail": "Pazar Yeri'nde görüntüle", + "detailPanel.operation.viewReadme": "README'yi Görüntüle", "detailPanel.serviceOk": "Servis Tamam", "detailPanel.strategyNum": "{{num}} {{strategy}} DAHİL", "detailPanel.switchVersion": "Sürümü Değiştir", @@ -173,6 +183,7 @@ "installModal.back": "Geri", "installModal.cancel": "İptal", "installModal.close": "Kapat", + "installModal.dropIntegrationToInstall": "Yüklemek için eklenti paketini buraya bırakın", "installModal.dropPluginToInstall": "Yüklemek için eklenti paketini buraya bırakın", "installModal.fromTrustSource": "Lütfen eklentileri yalnızca güvenilir bir kaynaktan yüklediğinizden emin olun.", "installModal.install": "Yükle", @@ -182,7 +193,9 @@ "installModal.installPlugin": "Eklentiyi Yükle", "installModal.installWarning": "Bu eklentinin yüklenmesine izin verilmemektedir.", "installModal.installedSuccessfully": "Yükleme başarılı", + "installModal.installedSuccessfullyCountDesc": "Aşağıdaki {{num}} eklenti başarıyla yüklendi.", "installModal.installedSuccessfullyDesc": "Eklenti başarıyla yüklendi.", + "installModal.installedSuccessfullyWithPageDesc": "Eklenti başarıyla yüklendi. Bunu {{categoryName}} sayfasında bulabilirsiniz.", "installModal.installing": "Yükleme...", "installModal.labels.package": "Paket", "installModal.labels.repository": "Depo", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "Aşağıdaki {{num}} eklentilerini yüklemek üzereyim", "installModal.uploadFailed": "Karşıya yükleme başarısız oldu", "installModal.uploadingPackage": "{{packageName}} yükleniyor...", + "installModal.viewDetails": "Ayrıntıları Görüntüle", "installPlugin": "Eklentiyi yükle", + "list.noAgentStrategyFound": "Ajan Stratejisi bulunamadı", + "list.noExtensionFound": "Uzantı bulunamadı", "list.noInstalled": "Yüklü eklenti yok", + "list.noTriggerFound": "Tetikleyici bulunamadı", "list.notFound": "Eklenti bulunamadı", "list.source.github": "GitHub'dan yükleyin", "list.source.local": "Yerel Paket Dosyasından Yükle", "list.source.marketplace": "Pazar Yeri'nden Yükleme", + "marketplace.allPlugins": "Tüm eklentiler", "marketplace.and": "ve", + "marketplace.becomePartner": "Partner Olun", "marketplace.difyMarketplace": "Dify Pazar Yeri", "marketplace.discover": "Keşfet", "marketplace.empower": "Yapay zeka geliştirmenizi güçlendirin", "marketplace.moreFrom": "Pazar Yeri'nden daha fazlası", "marketplace.noPluginFound": "Eklenti bulunamadı", "marketplace.partnerTip": "Dify partner'ı tarafından doğrulandı", + "marketplace.pluginsHeroSubtitle": "Yapay zeka geliştirmenizi güçlendirmek için topluluk tarafından oluşturulan eklentileri kullanın.", + "marketplace.pluginsHeroTitle": "Keşfet. Genişlet. Oluştur.", "marketplace.pluginsResult": "{{num}} sonuç", "marketplace.sortBy": "Sırala", "marketplace.sortOption.firstReleased": "İlk Çıkanlar", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "Dify tarafından doğrulanmıştır.", "marketplace.viewMore": "Daha fazla göster", "metadata.title": "Eklentiler", + "pluginDevelopmentGuide": "Eklenti geliştirme kılavuzu", "pluginInfoModal.packageName": "Paket", "pluginInfoModal.release": "Sürüm", "pluginInfoModal.repository": "Depo", "pluginInfoModal.title": "Eklenti bilgisi", + "pluginPublishGuide": "Eklenti yayınlama kılavuzu", "privilege.admins": "Yöneticiler", + "privilege.configurePermissionsInSettings": "Eklenti izinlerini yapılandırmak için Ayarlar > Roller ve İzinler bölümüne gidin.", "privilege.everyone": "Herkes", + "privilege.noDebugPermissionTooltip": "Eklentilerde hata ayıklama izniniz yok", + "privilege.noInstallPermissionTooltip": "Eklentileri yükleme ve yönetme izniniz yok", "privilege.noone": "Hiç kimse", + "privilege.permissions": "İzinler", + "privilege.quickWhoCanDebug": "Kim hata ayıklayabilir?", + "privilege.quickWhoCanInstall": "Kim yükleyebilir ve yönetebilir?", "privilege.title": "Eklenti Tercihleri", "privilege.whoCanDebug": "Eklentilerde kimler hata ayıklayabilir?", "privilege.whoCanInstall": "Eklentileri kimler yükleyebilir ve yönetebilir?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "README mevcut değil", "readmeInfo.title": "BENİOKU", "requestAPlugin": "Bir eklenti iste", + "requestSubmit": "İste veya yayınla", "search": "Ara", "searchCategories": "Arama Kategorileri", "searchInMarketplace": "Pazar Yeri'nde arama yapın", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "{{installingLength}} eklentileri yükleniyor, {{successLength}} başarılı.", "task.runningPlugins": "Eklentiler Yükleniyor", "task.successPlugins": "Başarıyla Yüklenen Eklentiler", + "templatePublishingGuide": "Şablon yayınlama kılavuzu", "upgrade.close": "Kapat", "upgrade.description": "Aşağıdaki eklentiyi güncellemek üzeresiniz", "upgrade.successfulTitle": "Güncelleme başarılı", diff --git a/web/i18n/uk-UA/dataset-pipeline.json b/web/i18n/uk-UA/dataset-pipeline.json index fc619120076..b937bc3afc6 100644 --- a/web/i18n/uk-UA/dataset-pipeline.json +++ b/web/i18n/uk-UA/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "Ця дія є постійною. Ви не зможете повернутися до попереднього способу. Будь ласка, підтвердьте конвертацію.", "conversion.confirm.title": "Підтвердження", "conversion.descriptionChunk1": "Тепер ви можете перетворити наявну базу знань на використання Knowledge Pipeline для обробки документів", - "conversion.descriptionChunk2": "— більш відкритий та гнучкий підхід з доступом до плагінів з нашого маркетплейсу. Це застосує новий метод обробки до всіх майбутніх документів.", + "conversion.descriptionChunk2": " — більш відкритий та гнучкий підхід з доступом до плагінів з Marketplace. Це застосує новий метод обробки до всіх майбутніх документів.", "conversion.errorMessage": "Не вдалося перетворити набір даних у пайплайн", "conversion.successMessage": "Успішно перетворили набір даних у пайплайн", "conversion.title": "Перетворення на конвеєр знань", diff --git a/web/i18n/uk-UA/plugin.json b/web/i18n/uk-UA/plugin.json index 8535a7384ae..b085f6261d5 100644 --- a/web/i18n/uk-UA/plugin.json +++ b/web/i18n/uk-UA/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "Використовуйте авторизацію OAuth", "auth.whoCanUse": "Хто може використовувати", "auth.workspaceDefault": "За замовчуванням робочого простору", + "autoUpdate.autoUpdate": "Автоматичне оновлення", + "autoUpdate.autoUpdateSettings": "Налаштування автоматичного оновлення", "autoUpdate.automaticUpdates": "Автоматичні оновлення", "autoUpdate.changeTimezone": "Щоб змінити часовий пояс, перейдіть до Налаштування", "autoUpdate.excludeUpdate": "Наступні {{num}} плагіни не будуть автоматично оновлюватися", + "autoUpdate.excludeUpdate_one": "Наступний {{num}} плагін не буде автоматично оновлюватися", + "autoUpdate.excludeUpdate_other": "Наступні {{num}} плагіни не будуть автоматично оновлюватися", "autoUpdate.nextUpdateTime": "Наступне автоматичне оновлення: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "Плагіни не були знайдені", "autoUpdate.noPluginPlaceholder.noInstalled": "Жодних плагінів не встановлено", "autoUpdate.operation.clearAll": "Очистити все", "autoUpdate.operation.select": "Виберіть плагіни", "autoUpdate.partialUPdate": "Тільки наступні {{num}} плагіни будуть автоматично оновлюватися", + "autoUpdate.partialUPdate_one": "Тільки наступний {{num}} плагін буде автоматично оновлюватися", + "autoUpdate.partialUPdate_other": "Тільки наступні {{num}} плагіни будуть автоматично оновлюватися", "autoUpdate.pluginDowngradeWarning.description": "Автоматичне оновлення наразі увімкнене для цього плагіна. Пониження версії може призвести до того, що ваші зміни будуть перезаписані під час наступного автоматичного оновлення.", "autoUpdate.pluginDowngradeWarning.downgrade": "Все одно знизити версію", "autoUpdate.pluginDowngradeWarning.exclude": "Виключити з автоматичного оновлення", "autoUpdate.pluginDowngradeWarning.title": "Пониження плагіна", + "autoUpdate.scope": "Область", + "autoUpdate.scopeMode.all": "Всі", + "autoUpdate.scopeMode.exclude": "Виключити вибране", "autoUpdate.specifyPluginsToUpdate": "Вкажіть плагіни для оновлення", "autoUpdate.strategy.disabled.description": "Плагіни не будуть автоматично оновлюватися", "autoUpdate.strategy.disabled.name": "Вимкнено", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "Оновлювати", "detailPanel.operation.updateTooltip": "Оновіть, щоб отримати доступ до найновіших моделей.", "detailPanel.operation.viewDetail": "Переглянути деталі", + "detailPanel.operation.viewReadme": "Переглянути README", "detailPanel.serviceOk": "Сервіс працює", "detailPanel.strategyNum": "{{num}} {{strategy}} ВКЛЮЧЕНІ", "detailPanel.switchVersion": "Версія перемикача", @@ -173,6 +183,7 @@ "installModal.back": "Задній", "installModal.cancel": "Скасувати", "installModal.close": "Закрити", + "installModal.dropIntegrationToInstall": "Перетягніть пакет плагіна сюди, щоб встановити", "installModal.dropPluginToInstall": "Перетягніть пакет плагіна сюди, щоб встановити", "installModal.fromTrustSource": "Будь ласка, переконайтеся, що ви встановлюєте плагіни лише з надійного джерела.", "installModal.install": "Інсталювати", @@ -182,7 +193,9 @@ "installModal.installPlugin": "Встановити плагін", "installModal.installWarning": "Цей плагін не можна установити.", "installModal.installedSuccessfully": "Монтаж успішний", + "installModal.installedSuccessfullyCountDesc": "Наступні {{num}} плагіни успішно встановлено.", "installModal.installedSuccessfullyDesc": "Плагін успішно встановлено.", + "installModal.installedSuccessfullyWithPageDesc": "Плагін успішно встановлено. Ви можете знайти його на сторінці {{categoryName}}.", "installModal.installing": "Установки...", "installModal.labels.package": "Пакунок", "installModal.labels.repository": "Сховище", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "Про встановлення наступних плагінів {{num}}", "installModal.uploadFailed": "Не вдалося завантажити файл", "installModal.uploadingPackage": "Завантаження {{packageName}}...", + "installModal.viewDetails": "Переглянути деталі", "installPlugin": "Встановити плагін", + "list.noAgentStrategyFound": "Стратегію агента не знайдено", + "list.noExtensionFound": "Розширення не знайдено", "list.noInstalled": "Плагіни не встановлено", + "list.noTriggerFound": "Тригер не знайдено", "list.notFound": "Плагінів не знайдено", "list.source.github": "Встановлення з GitHub", "list.source.local": "Інсталяція з локального файлу пакета", "list.source.marketplace": "Інсталяція з Marketplace", + "marketplace.allPlugins": "Всі плагіни", "marketplace.and": "і", + "marketplace.becomePartner": "Стати партнером", "marketplace.difyMarketplace": "Dify Marketplace", "marketplace.discover": "Виявити", "marketplace.empower": "Розширюйте можливості розробки штучного інтелекту", "marketplace.moreFrom": "Більше від Marketplace", "marketplace.noPluginFound": "Плагін не знайдено", "marketplace.partnerTip": "Перевірено партнером Dify", + "marketplace.pluginsHeroSubtitle": "Використовуйте створені спільнотою плагіни для розвитку вашої розробки штучного інтелекту.", + "marketplace.pluginsHeroTitle": "Відкривайте. Розширюйте. Створюйте.", "marketplace.pluginsResult": "Результати {{num}}", "marketplace.sortBy": "Чорне місто", "marketplace.sortOption.firstReleased": "Перший реліз", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "Перевірено Dify", "marketplace.viewMore": "Дивитись більше", "metadata.title": "Плагіни", + "pluginDevelopmentGuide": "Посібник з розробки плагінів", "pluginInfoModal.packageName": "Пакунок", "pluginInfoModal.release": "Реліз", "pluginInfoModal.repository": "Сховище", "pluginInfoModal.title": "Інформація про плагін", + "pluginPublishGuide": "Посібник з публікації плагінів", "privilege.admins": "Адміни", + "privilege.configurePermissionsInSettings": "Перейдіть до Налаштування > Ролі та дозволи, щоб налаштувати дозволи плагінів.", "privilege.everyone": "Кожен", + "privilege.noDebugPermissionTooltip": "У вас немає дозволу на налагодження плагінів", + "privilege.noInstallPermissionTooltip": "У вас немає дозволу на встановлення плагінів та керування ними", "privilege.noone": "Ніхто", + "privilege.permissions": "Дозволи", + "privilege.quickWhoCanDebug": "Хто може налагоджувати?", + "privilege.quickWhoCanInstall": "Хто може встановлювати та керувати?", "privilege.title": "Налаштування плагіна", "privilege.whoCanDebug": "Хто може налагоджувати плагіни?", "privilege.whoCanInstall": "Хто може встановлювати плагіни та керувати ними?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "README недоступний", "readmeInfo.title": "Прочитай мене", "requestAPlugin": "Запросити плагін", + "requestSubmit": "Запросити або опублікувати", "search": "Шукати", "searchCategories": "Категорії пошуку", "searchInMarketplace": "Пошук у Marketplace", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "Встановлення плагінів {{installingLength}}, успіх {{successLength}}.", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "Посібник з публікації шаблонів", "upgrade.close": "Закрити", "upgrade.description": "Про встановлення наступного плагіна", "upgrade.successfulTitle": "Установка успішна", diff --git a/web/i18n/vi-VN/dataset-pipeline.json b/web/i18n/vi-VN/dataset-pipeline.json index 8d5ebe11bc7..54551c6e883 100644 --- a/web/i18n/vi-VN/dataset-pipeline.json +++ b/web/i18n/vi-VN/dataset-pipeline.json @@ -15,7 +15,7 @@ "conversion.confirm.content": "Hành động này là vĩnh viễn. Bạn sẽ không thể hoàn nguyên về phương pháp trước đó. Vui lòng xác nhận để chuyển đổi.", "conversion.confirm.title": "Sự xác nhận", "conversion.descriptionChunk1": "Giờ đây, bạn có thể chuyển đổi cơ sở kiến thức hiện có của mình để sử dụng Đường ống kiến thức để xử lý tài liệu", - "conversion.descriptionChunk2": "— một cách tiếp cận cởi mở và linh hoạt hơn với quyền truy cập vào các plugin từ thị trường của chúng tôi. Điều này sẽ áp dụng phương pháp xử lý mới cho tất cả các tài liệu trong tương lai.", + "conversion.descriptionChunk2": " — một cách tiếp cận cởi mở và linh hoạt hơn với quyền truy cập vào các plugin từ Marketplace. Điều này sẽ áp dụng phương pháp xử lý mới cho tất cả các tài liệu trong tương lai.", "conversion.errorMessage": "Không thể chuyển đổi tập dữ liệu thành quy trình", "conversion.successMessage": "Đã chuyển đổi thành công tập dữ liệu thành một quy trình", "conversion.title": "Chuyển đổi sang quy trình kiến thức", diff --git a/web/i18n/vi-VN/plugin.json b/web/i18n/vi-VN/plugin.json index 0ed0c7c36e4..fa711bb99ec 100644 --- a/web/i18n/vi-VN/plugin.json +++ b/web/i18n/vi-VN/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "Sử dụng ủy quyền OAuth", "auth.whoCanUse": "Ai có thể sử dụng", "auth.workspaceDefault": "Mặc định không gian làm việc", + "autoUpdate.autoUpdate": "Tự động cập nhật", + "autoUpdate.autoUpdateSettings": "Cài đặt tự động cập nhật", "autoUpdate.automaticUpdates": "Cập nhật tự động", "autoUpdate.changeTimezone": "Để thay đổi múi giờ, hãy vào Cài đặt", "autoUpdate.excludeUpdate": "Các plugin {{num}} sau đây sẽ không tự động cập nhật", + "autoUpdate.excludeUpdate_one": "{{num}} plugin sau đây sẽ không tự động cập nhật", + "autoUpdate.excludeUpdate_other": "Các plugin {{num}} sau đây sẽ không tự động cập nhật", "autoUpdate.nextUpdateTime": "Cập nhật tự động tiếp theo: {{time}}", "autoUpdate.noPluginPlaceholder.noFound": "Không tìm thấy plugin nào", "autoUpdate.noPluginPlaceholder.noInstalled": "Không có plugin nào được cài đặt", "autoUpdate.operation.clearAll": "Xóa tất cả", "autoUpdate.operation.select": "Chọn plugin", "autoUpdate.partialUPdate": "Chỉ có {{num}} plugin sau đây sẽ tự động cập nhật", + "autoUpdate.partialUPdate_one": "Chỉ có {{num}} plugin sau đây sẽ tự động cập nhật", + "autoUpdate.partialUPdate_other": "Chỉ có {{num}} plugin sau đây sẽ tự động cập nhật", "autoUpdate.pluginDowngradeWarning.description": "Chức năng tự động cập nhật hiện đang được bật cho plugin này. Việc hạ cấp phiên bản có thể khiến các thay đổi của bạn bị ghi đè trong lần cập nhật tự động tiếp theo.", "autoUpdate.pluginDowngradeWarning.downgrade": "Giảm cấp vẫn vậy", "autoUpdate.pluginDowngradeWarning.exclude": "Loại trừ khỏi cập nhật tự động", "autoUpdate.pluginDowngradeWarning.title": "Hạ cấp Plugin", + "autoUpdate.scope": "Phạm vi", + "autoUpdate.scopeMode.all": "Tất cả", + "autoUpdate.scopeMode.exclude": "Loại trừ đã chọn", "autoUpdate.specifyPluginsToUpdate": "Chỉ định các plugin để cập nhật", "autoUpdate.strategy.disabled.description": "Các plugin sẽ không tự động cập nhật", "autoUpdate.strategy.disabled.name": "Khuyết tật", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "Cập nhật", "detailPanel.operation.updateTooltip": "Cập nhật để truy cập các mô hình mới nhất.", "detailPanel.operation.viewDetail": "xem chi tiết", + "detailPanel.operation.viewReadme": "Xem README", "detailPanel.serviceOk": "Dịch vụ OK", "detailPanel.strategyNum": "{{num}} {{strategy}} BAO GỒM", "detailPanel.switchVersion": "Chuyển đổi phiên bản", @@ -173,6 +183,7 @@ "installModal.back": "Lưng", "installModal.cancel": "Hủy", "installModal.close": "Đóng", + "installModal.dropIntegrationToInstall": "Thả gói plugin vào đây để cài đặt", "installModal.dropPluginToInstall": "Thả gói plugin vào đây để cài đặt", "installModal.fromTrustSource": "Hãy đảm bảo rằng bạn chỉ cài đặt các plugin từ một nguồn đáng tin cậy.", "installModal.install": "Cài đặt", @@ -182,7 +193,9 @@ "installModal.installPlugin": "Cài đặt Plugin", "installModal.installWarning": "Plugin này không được phép cài đặt.", "installModal.installedSuccessfully": "Cài đặt thành công", + "installModal.installedSuccessfullyCountDesc": "{{num}} plugin sau đây đã được cài đặt thành công.", "installModal.installedSuccessfullyDesc": "Plugin đã được cài đặt thành công.", + "installModal.installedSuccessfullyWithPageDesc": "Plugin đã được cài đặt thành công. Bạn có thể tìm thấy nó trên trang {{categoryName}}.", "installModal.installing": "Cài đặt...", "installModal.labels.package": "Gói", "installModal.labels.repository": "Kho", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "Chuẩn bị cài đặt các plugin {{num}} sau", "installModal.uploadFailed": "Tải lên không thành công", "installModal.uploadingPackage": "Tải lên {{packageName}}...", + "installModal.viewDetails": "Xem chi tiết", "installPlugin": "Cài đặt plugin", + "list.noAgentStrategyFound": "Không tìm thấy Chiến lược đại lý", + "list.noExtensionFound": "Không tìm thấy Phần mở rộng", "list.noInstalled": "Không có plugin nào được cài đặt", + "list.noTriggerFound": "Không tìm thấy Kích hoạt", "list.notFound": "Không tìm thấy plugin", "list.source.github": "Cài đặt từ GitHub", "list.source.local": "Cài đặt từ tệp gói cục bộ", "list.source.marketplace": "Cài đặt từ Marketplace", + "marketplace.allPlugins": "Tất cả plugin", "marketplace.and": "và", + "marketplace.becomePartner": "Trở thành đối tác", "marketplace.difyMarketplace": "Thị trường Dify", "marketplace.discover": "Khám phá", "marketplace.empower": "Hỗ trợ phát triển AI của bạn", "marketplace.moreFrom": "Các ứng dụng khác từ Marketplace", "marketplace.noPluginFound": "Không tìm thấy plugin nào", "marketplace.partnerTip": "Được xác nhận bởi một đối tác của Dify", + "marketplace.pluginsHeroSubtitle": "Sử dụng các plugin do cộng đồng xây dựng để hỗ trợ phát triển AI của bạn.", + "marketplace.pluginsHeroTitle": "Khám phá. Mở rộng. Xây dựng.", "marketplace.pluginsResult": "{{num}} kết quả", "marketplace.sortBy": "Thành phố đen", "marketplace.sortOption.firstReleased": "Phát hành lần đầu tiên", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "Được xác nhận bởi Dify", "marketplace.viewMore": "Xem thêm", "metadata.title": "Plugin", + "pluginDevelopmentGuide": "Hướng dẫn phát triển plugin", "pluginInfoModal.packageName": "Gói", "pluginInfoModal.release": "Phát hành", "pluginInfoModal.repository": "Kho", "pluginInfoModal.title": "Thông tin plugin", + "pluginPublishGuide": "Hướng dẫn xuất bản plugin", "privilege.admins": "Quản trị viên", + "privilege.configurePermissionsInSettings": "Vào Cài đặt > Vai trò & Quyền để cấu hình quyền plugin.", "privilege.everyone": "Ai ai", + "privilege.noDebugPermissionTooltip": "Bạn không có quyền gỡ lỗi plugin", + "privilege.noInstallPermissionTooltip": "Bạn không có quyền cài đặt và quản lý plugin", "privilege.noone": "Không ai", + "privilege.permissions": "Quyền", + "privilege.quickWhoCanDebug": "Ai có thể gỡ lỗi?", + "privilege.quickWhoCanInstall": "Ai có thể cài đặt và quản lý?", "privilege.title": "Tùy chọn plugin", "privilege.whoCanDebug": "Ai có thể gỡ lỗi plugin?", "privilege.whoCanInstall": "Ai có thể cài đặt và quản lý plugin?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "Không có README", "readmeInfo.title": "ĐỌC_TÔI", "requestAPlugin": "Yêu cầu một plugin", + "requestSubmit": "Yêu cầu hoặc xuất bản", "search": "Tìm kiếm", "searchCategories": "Danh mục tìm kiếm", "searchInMarketplace": "Tìm kiếm trên Marketplace", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "Cài đặt {{installingLength}} plugins, {{successLength}} thành công.", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "Hướng dẫn xuất bản mẫu", "upgrade.close": "Đóng", "upgrade.description": "Giới thiệu cài đặt plugin sau", "upgrade.successfulTitle": "Cài đặt thành công", diff --git a/web/i18n/zh-Hant/plugin.json b/web/i18n/zh-Hant/plugin.json index 11c79e49b16..ba4c3463e95 100644 --- a/web/i18n/zh-Hant/plugin.json +++ b/web/i18n/zh-Hant/plugin.json @@ -43,19 +43,28 @@ "auth.useOAuthAuth": "使用 OAuth 授權", "auth.whoCanUse": "誰可以使用", "auth.workspaceDefault": "工作區域默認", + "autoUpdate.autoUpdate": "自動更新", + "autoUpdate.autoUpdateSettings": "自動更新設定", "autoUpdate.automaticUpdates": "自動更新", "autoUpdate.changeTimezone": "要更改時區,請前往設定", - "autoUpdate.excludeUpdate": "以下 {{num}} 個插件將不會自動更新", + "autoUpdate.excludeUpdate": "以下 {{num}} 個集成將不會自動更新", + "autoUpdate.excludeUpdate_one": "以下 {{num}} 個集成將不會自動更新", + "autoUpdate.excludeUpdate_other": "以下 {{num}} 個集成將不會自動更新", "autoUpdate.nextUpdateTime": "下次自動更新:{{time}}", "autoUpdate.noPluginPlaceholder.noFound": "未找到任何外掛", "autoUpdate.noPluginPlaceholder.noInstalled": "沒有安裝插件", "autoUpdate.operation.clearAll": "清除所有", "autoUpdate.operation.select": "選擇插件", - "autoUpdate.partialUPdate": "只有以下 {{num}} 個插件將自動更新", + "autoUpdate.partialUPdate": "只有以下 {{num}} 個集成將自動更新", + "autoUpdate.partialUPdate_one": "只有以下 {{num}} 個集成將自動更新", + "autoUpdate.partialUPdate_other": "只有以下 {{num}} 個集成將自動更新", "autoUpdate.pluginDowngradeWarning.description": "這個插件目前已啟用自動更新。降級版本可能會導致您的更改在下一次自動更新時被覆蓋。", "autoUpdate.pluginDowngradeWarning.downgrade": "無論如何降級", "autoUpdate.pluginDowngradeWarning.exclude": "排除自動更新", "autoUpdate.pluginDowngradeWarning.title": "插件降級", + "autoUpdate.scope": "範圍", + "autoUpdate.scopeMode.all": "全部", + "autoUpdate.scopeMode.exclude": "排除選定的", "autoUpdate.specifyPluginsToUpdate": "指定要更新的插件", "autoUpdate.strategy.disabled.description": "插件將不會自動更新", "autoUpdate.strategy.disabled.name": "殘疾的", @@ -126,6 +135,7 @@ "detailPanel.operation.update": "更新", "detailPanel.operation.updateTooltip": "更新以取得最新模型。", "detailPanel.operation.viewDetail": "在 Marketplace 查看", + "detailPanel.operation.viewReadme": "查看 README", "detailPanel.serviceOk": "服務正常", "detailPanel.strategyNum": "{{num}} {{strategy}} 包括", "detailPanel.switchVersion": "Switch 版本", @@ -173,6 +183,7 @@ "installModal.back": "返回", "installModal.cancel": "取消", "installModal.close": "關閉", + "installModal.dropIntegrationToInstall": "將集成包拖放到此處進行安裝", "installModal.dropPluginToInstall": "將插件包拖放到此處進行安裝", "installModal.fromTrustSource": "請確保您只從受信任的來源安裝插件。", "installModal.install": "安裝", @@ -182,7 +193,9 @@ "installModal.installPlugin": "安裝插件", "installModal.installWarning": "此插件不允許安裝。", "installModal.installedSuccessfully": "安裝成功", + "installModal.installedSuccessfullyCountDesc": "以下 {{num}} 個集成已成功安裝。", "installModal.installedSuccessfullyDesc": "插件已成功安裝。", + "installModal.installedSuccessfullyWithPageDesc": "集成已成功安裝。您可以在 {{categoryName}} 頁面找到它。", "installModal.installing": "安裝。。。", "installModal.labels.package": "包", "installModal.labels.repository": "存儲庫", @@ -195,19 +208,27 @@ "installModal.readyToInstallPackages": "即將安裝以下 {{num}} 個插件", "installModal.uploadFailed": "上傳失敗", "installModal.uploadingPackage": "正在上傳 {{packageName}}...", + "installModal.viewDetails": "查看詳情", "installPlugin": "安裝插件", + "list.noAgentStrategyFound": "未找到代理策略", + "list.noExtensionFound": "未找到擴展", "list.noInstalled": "未安裝插件", + "list.noTriggerFound": "未找到觸發器", "list.notFound": "未找到插件", "list.source.github": "從 GitHub 安裝", "list.source.local": "從本地包檔安裝", "list.source.marketplace": "從 Marketplace 安裝", + "marketplace.allPlugins": "所有集成", "marketplace.and": "和", + "marketplace.becomePartner": "成為合作夥伴", "marketplace.difyMarketplace": "Dify Marketplace", "marketplace.discover": "發現", "marketplace.empower": "為您的 AI 開發提供支援", "marketplace.moreFrom": "來自 Marketplace 的更多內容", "marketplace.noPluginFound": "未找到集成", "marketplace.partnerTip": "由 Dify 合作夥伴驗證", + "marketplace.pluginsHeroSubtitle": "使用社群構建的集成來助力您的 AI 開發。", + "marketplace.pluginsHeroTitle": "發現。擴展。構建。", "marketplace.pluginsResult": "{{num}} 個結果", "marketplace.sortBy": "排序方式", "marketplace.sortOption.firstReleased": "首次發佈", @@ -217,13 +238,21 @@ "marketplace.verifiedTip": "由 Dify 驗證", "marketplace.viewMore": "查看更多", "metadata.title": "插件", + "pluginDevelopmentGuide": "集成開發指南", "pluginInfoModal.packageName": "包", "pluginInfoModal.release": "釋放", "pluginInfoModal.repository": "存儲庫", "pluginInfoModal.title": "插件資訊", + "pluginPublishGuide": "集成發佈指南", "privilege.admins": "管理員", + "privilege.configurePermissionsInSettings": "前往設定 > 角色與權限以配置插件權限。", "privilege.everyone": "每個人 都", + "privilege.noDebugPermissionTooltip": "您沒有調試集成的權限", + "privilege.noInstallPermissionTooltip": "您沒有安裝和管理集成的權限", "privilege.noone": "沒人", + "privilege.permissions": "權限", + "privilege.quickWhoCanDebug": "誰可以調試?", + "privilege.quickWhoCanInstall": "誰可以安裝和管理?", "privilege.title": "插件首選項", "privilege.whoCanDebug": "誰可以調試插件?", "privilege.whoCanInstall": "誰可以安裝和管理插件?", @@ -233,6 +262,7 @@ "readmeInfo.noReadmeAvailable": "沒有可用的自述文件", "readmeInfo.title": "自述檔", "requestAPlugin": "申请插件", + "requestSubmit": "請求或發佈", "search": "搜索", "searchCategories": "搜索類別", "searchInMarketplace": "在 Marketplace 中搜索", @@ -258,6 +288,7 @@ "task.installingWithSuccess": "安裝 {{installingLength}} 個插件,{{successLength}} 成功。", "task.runningPlugins": "Installing Plugins", "task.successPlugins": "Successfully Installed Plugins", + "templatePublishingGuide": "範本發佈指南", "upgrade.close": "關閉", "upgrade.description": "即將安裝以下插件", "upgrade.successfulTitle": "安裝成功", From eb191409860e5b861c1185efbd16413d198b7196 Mon Sep 17 00:00:00 2001 From: Wu Tianwei <30284043+WTW0313@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:24:38 +0800 Subject: [PATCH 2/9] chore: Update permission keys and descriptions for multiple languages to simplify application and dataset management phrases (#37859) --- web/i18n/ar-TN/permission-keys.json | 4 ++-- web/i18n/ar-TN/permission.json | 2 +- web/i18n/de-DE/permission-keys.json | 4 ++-- web/i18n/de-DE/permission.json | 2 +- web/i18n/en-US/permission-keys.json | 4 ++-- web/i18n/en-US/permission.json | 2 +- web/i18n/es-ES/permission-keys.json | 4 ++-- web/i18n/es-ES/permission.json | 2 +- web/i18n/fa-IR/permission-keys.json | 4 ++-- web/i18n/fa-IR/permission.json | 2 +- web/i18n/fr-FR/permission-keys.json | 4 ++-- web/i18n/fr-FR/permission.json | 2 +- web/i18n/hi-IN/permission-keys.json | 4 ++-- web/i18n/hi-IN/permission.json | 2 +- web/i18n/id-ID/permission-keys.json | 4 ++-- web/i18n/id-ID/permission.json | 2 +- web/i18n/it-IT/permission-keys.json | 4 ++-- web/i18n/it-IT/permission.json | 2 +- web/i18n/ja-JP/permission-keys.json | 4 ++-- web/i18n/ja-JP/permission.json | 2 +- web/i18n/ko-KR/permission-keys.json | 4 ++-- web/i18n/ko-KR/permission.json | 2 +- web/i18n/nl-NL/permission-keys.json | 4 ++-- web/i18n/nl-NL/permission.json | 2 +- web/i18n/pl-PL/permission-keys.json | 4 ++-- web/i18n/pl-PL/permission.json | 2 +- web/i18n/pt-BR/permission-keys.json | 4 ++-- web/i18n/pt-BR/permission.json | 2 +- web/i18n/ro-RO/permission-keys.json | 4 ++-- web/i18n/ro-RO/permission.json | 2 +- web/i18n/ru-RU/permission-keys.json | 4 ++-- web/i18n/ru-RU/permission.json | 2 +- web/i18n/sl-SI/permission-keys.json | 4 ++-- web/i18n/sl-SI/permission.json | 2 +- web/i18n/th-TH/permission-keys.json | 4 ++-- web/i18n/th-TH/permission.json | 2 +- web/i18n/tr-TR/permission-keys.json | 4 ++-- web/i18n/tr-TR/permission.json | 2 +- web/i18n/uk-UA/permission-keys.json | 4 ++-- web/i18n/uk-UA/permission.json | 2 +- web/i18n/vi-VN/permission-keys.json | 4 ++-- web/i18n/vi-VN/permission.json | 2 +- web/i18n/zh-Hans/permission-keys.json | 4 ++-- web/i18n/zh-Hans/permission.json | 2 +- web/i18n/zh-Hant/permission-keys.json | 4 ++-- web/i18n/zh-Hant/permission.json | 2 +- 46 files changed, 69 insertions(+), 69 deletions(-) diff --git a/web/i18n/ar-TN/permission-keys.json b/web/i18n/ar-TN/permission-keys.json index cd7c67a28e6..082b345ba66 100644 --- a/web/i18n/ar-TN/permission-keys.json +++ b/web/i18n/ar-TN/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "نشر التطبيق وإدارة الإصدارات", "app.acl.test_and_run": "اختبار التطبيق واستخدامه", "app.acl.view_layout": "صفحة التنسيق للقراءة فقط", - "app.create_and_management": "إنشاء التطبيقات وإدارة التطبيقات التي أنشأتها", + "app.create_and_management": "إنشاء التطبيقات", "app.tag.manage": "إدارة وسوم التطبيق", "app_library.access": "الوصول إلى مكتبة التطبيقات", "billing.manage": "تغيير خطط الاشتراك", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "استرجاع قاعدة المعرفة", "dataset.acl.use": "إضافة مستندات إلى قاعدة المعرفة", "dataset.api_key.manage": "إدارة مفاتيح API لقاعدة المعرفة", - "dataset.create_and_management": "إنشاء قواعد المعرفة وإدارة قواعد المعرفة التي أنشأتها", + "dataset.create_and_management": "إنشاء قواعد المعرفة", "dataset.external.connect": "الاتصال بقواعد المعرفة الخارجية", "dataset.tag.manage": "إدارة وسوم قاعدة المعرفة", "mcp.manage": "إدارة MCP", diff --git a/web/i18n/ar-TN/permission.json b/web/i18n/ar-TN/permission.json index 75acc42fb23..e08371d8d77 100644 --- a/web/i18n/ar-TN/permission.json +++ b/web/i18n/ar-TN/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "اعرض الاسم والوصف والأذونات الممنوحة لمجموعة الأذونات هذه.", "permissionSet.modal.view.dataset.title": "عرض مجموعة أذونات قاعدة المعرفة", "permissionSet.nameLabel": "اسم مجموعة الأذونات", - "permissionSet.namePlaceholder": "مثال: يمكنه تصدير DSL", + "permissionSet.namePlaceholder": "مثال: مجموعة أذونات التشغيل", "permissionSet.permissions": "الأذونات", "role.addRole": "إنشاء الأدوار", "role.copyMembersDescription_one": "\"{{name}}\" مُعيَّن لعضو {{count}}. هل تريد أن تتضمن نسخة الدور الجديد العضو نفسه؟", diff --git a/web/i18n/de-DE/permission-keys.json b/web/i18n/de-DE/permission-keys.json index 5b42c701c9e..09da9ee9462 100644 --- a/web/i18n/de-DE/permission-keys.json +++ b/web/i18n/de-DE/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "App-Veröffentlichung und Versionsverwaltung", "app.acl.test_and_run": "App testen und verwenden", "app.acl.view_layout": "Schreibgeschützte Orchestrierungsseite", - "app.create_and_management": "Apps erstellen und von Ihnen erstellte Apps verwalten", + "app.create_and_management": "Apps erstellen", "app.tag.manage": "App-Tags verwalten", "app_library.access": "Auf App-Bibliothek zugreifen", "billing.manage": "Abonnementpläne ändern", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "Wissensdatenbank-Abruf", "dataset.acl.use": "Dokumente zur Wissensdatenbank hinzufügen", "dataset.api_key.manage": "API-Schlüssel der Wissensdatenbank verwalten", - "dataset.create_and_management": "Wissensdatenbanken erstellen und von Ihnen erstellte Wissensdatenbanken verwalten", + "dataset.create_and_management": "Wissensdatenbanken erstellen", "dataset.external.connect": "Externe Wissensdatenbanken verbinden", "dataset.tag.manage": "Wissensdatenbank-Tags verwalten", "mcp.manage": "MCP verwalten", diff --git a/web/i18n/de-DE/permission.json b/web/i18n/de-DE/permission.json index ef7121b5b29..fa4921a3fb1 100644 --- a/web/i18n/de-DE/permission.json +++ b/web/i18n/de-DE/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "Sehen Sie den Namen, die Beschreibung und die für diesen Berechtigungssatz gewährten Berechtigungen.", "permissionSet.modal.view.dataset.title": "Wissensdatenbank-Berechtigungssatz anzeigen", "permissionSet.nameLabel": "Name des Berechtigungssatzes", - "permissionSet.namePlaceholder": "z. B. Kann DSL exportieren", + "permissionSet.namePlaceholder": "z. B. Berechtigungsset für Betrieb", "permissionSet.permissions": "Berechtigungen", "role.addRole": "Rollen erstellen", "role.copyMembersDescription_one": "\"{{name}}\" ist {{count}} Mitglied zugewiesen. Möchten Sie, dass die neue Rollenkopie dasselbe Mitglied enthält?", diff --git a/web/i18n/en-US/permission-keys.json b/web/i18n/en-US/permission-keys.json index a5db8ef638c..aa2aa3aa26e 100644 --- a/web/i18n/en-US/permission-keys.json +++ b/web/i18n/en-US/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "App publishing and version management", "app.acl.test_and_run": "Test and use app", "app.acl.view_layout": "Read-only orchestration page", - "app.create_and_management": "Create apps and manage apps you created", + "app.create_and_management": "Create apps", "app.tag.manage": "Manage app tags", "app_library.access": "Access App Library", "billing.manage": "Change subscription plans", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "Knowledge base retrieval", "dataset.acl.use": "Add documents to knowledge base", "dataset.api_key.manage": "Manage knowledge base API keys", - "dataset.create_and_management": "Create knowledge bases and manage knowledge bases you created", + "dataset.create_and_management": "Create knowledge bases", "dataset.external.connect": "Connect external knowledge bases", "dataset.tag.manage": "Manage knowledge base tags", "mcp.manage": "Manage MCP", diff --git a/web/i18n/en-US/permission.json b/web/i18n/en-US/permission.json index ddcce91e5b4..2f62c3b1cb3 100644 --- a/web/i18n/en-US/permission.json +++ b/web/i18n/en-US/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "View the name, description, and permissions granted for this permission set.", "permissionSet.modal.view.dataset.title": "View Knowledge Base permission set", "permissionSet.nameLabel": "Permission set name", - "permissionSet.namePlaceholder": "e.g. Can export DSL", + "permissionSet.namePlaceholder": "e.g. Operations permission set", "permissionSet.permissions": "Permissions", "role.addRole": "Create roles", "role.copyMembersDescription_one": "\"{{name}}\" is assigned to {{count}} member. Do you want the new role copy to include the same member?", diff --git a/web/i18n/es-ES/permission-keys.json b/web/i18n/es-ES/permission-keys.json index 3b52ba33826..b1b551d3caf 100644 --- a/web/i18n/es-ES/permission-keys.json +++ b/web/i18n/es-ES/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "Publicación de la app y gestión de versiones", "app.acl.test_and_run": "Probar y usar la app", "app.acl.view_layout": "Página de orquestación de solo lectura", - "app.create_and_management": "Crear apps y gestionar las apps que has creado", + "app.create_and_management": "Crear apps", "app.tag.manage": "Gestionar etiquetas de apps", "app_library.access": "Acceder a la Biblioteca de apps", "billing.manage": "Cambiar planes de suscripción", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "Recuperación de la base de conocimiento", "dataset.acl.use": "Añadir documentos a la base de conocimiento", "dataset.api_key.manage": "Gestionar las claves de API de la base de conocimiento", - "dataset.create_and_management": "Crear bases de conocimiento y gestionar las bases de conocimiento que has creado", + "dataset.create_and_management": "Crear bases de conocimiento", "dataset.external.connect": "Conectar bases de conocimiento externas", "dataset.tag.manage": "Gestionar etiquetas de la base de conocimiento", "mcp.manage": "Gestionar MCP", diff --git a/web/i18n/es-ES/permission.json b/web/i18n/es-ES/permission.json index 88ad805b1fb..c8246bce768 100644 --- a/web/i18n/es-ES/permission.json +++ b/web/i18n/es-ES/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "Consulta el nombre, la descripción y los permisos concedidos para este conjunto de permisos.", "permissionSet.modal.view.dataset.title": "Ver conjunto de permisos de base de conocimiento", "permissionSet.nameLabel": "Nombre del conjunto de permisos", - "permissionSet.namePlaceholder": "p. ej. Puede exportar DSL", + "permissionSet.namePlaceholder": "p. ej. Conjunto de permisos de operaciones", "permissionSet.permissions": "Permisos", "role.addRole": "Crear roles", "role.copyMembersDescription_one": "\"{{name}}\" está asignado a {{count}} miembro. ¿Quieres que la nueva copia del rol incluya el mismo miembro?", diff --git a/web/i18n/fa-IR/permission-keys.json b/web/i18n/fa-IR/permission-keys.json index c1773da4424..a3a2f81c66e 100644 --- a/web/i18n/fa-IR/permission-keys.json +++ b/web/i18n/fa-IR/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "انتشار برنامه و مدیریت نسخه", "app.acl.test_and_run": "آزمایش و استفاده از برنامه", "app.acl.view_layout": "صفحه هماهنگ‌سازی فقط‌خواندنی", - "app.create_and_management": "ایجاد برنامه‌ها و مدیریت برنامه‌هایی که ایجاد کرده‌اید", + "app.create_and_management": "ایجاد برنامه‌ها", "app.tag.manage": "مدیریت برچسب‌های برنامه", "app_library.access": "دسترسی به کتابخانه برنامه", "billing.manage": "تغییر طرح‌های اشتراک", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "بازیابی پایگاه دانش", "dataset.acl.use": "افزودن اسناد به پایگاه دانش", "dataset.api_key.manage": "مدیریت کلیدهای API پایگاه دانش", - "dataset.create_and_management": "ایجاد پایگاه‌های دانش و مدیریت پایگاه‌های دانشی که ایجاد کرده‌اید", + "dataset.create_and_management": "ایجاد پایگاه‌های دانش", "dataset.external.connect": "اتصال به پایگاه‌های دانش خارجی", "dataset.tag.manage": "مدیریت برچسب‌های پایگاه دانش", "mcp.manage": "مدیریت MCP", diff --git a/web/i18n/fa-IR/permission.json b/web/i18n/fa-IR/permission.json index 548e0257435..87e88dc46dc 100644 --- a/web/i18n/fa-IR/permission.json +++ b/web/i18n/fa-IR/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "نام، توضیحات و مجوزهای اعطاشده برای این مجموعه مجوز را مشاهده کنید.", "permissionSet.modal.view.dataset.title": "مشاهده مجموعه مجوز پایگاه دانش", "permissionSet.nameLabel": "نام مجموعه مجوز", - "permissionSet.namePlaceholder": "مثلاً می‌تواند DSL را صادر کند", + "permissionSet.namePlaceholder": "مثلاً مجموعه مجوزهای عملیات", "permissionSet.permissions": "مجوزها", "role.addRole": "ایجاد نقش‌ها", "role.copyMembersDescription_one": "«{{name}}» به {{count}} عضو اختصاص داده شده است. آیا می‌خواهید نسخه نقش جدید همان عضو را در بر بگیرد؟", diff --git a/web/i18n/fr-FR/permission-keys.json b/web/i18n/fr-FR/permission-keys.json index 759ff9b7e0a..931088820dd 100644 --- a/web/i18n/fr-FR/permission-keys.json +++ b/web/i18n/fr-FR/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "Publication de l'application et gestion des versions", "app.acl.test_and_run": "Tester et utiliser l'application", "app.acl.view_layout": "Page d'orchestration en lecture seule", - "app.create_and_management": "Créer des applications et gérer les applications que vous avez créées", + "app.create_and_management": "Créer des applications", "app.tag.manage": "Gérer les étiquettes d'applications", "app_library.access": "Accéder à la bibliothèque d'applications", "billing.manage": "Modifier les forfaits d'abonnement", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "Récupération dans la base de connaissances", "dataset.acl.use": "Ajouter des documents à la base de connaissances", "dataset.api_key.manage": "Gérer les clés API de la base de connaissances", - "dataset.create_and_management": "Créer des bases de connaissances et gérer les bases de connaissances que vous avez créées", + "dataset.create_and_management": "Créer des bases de connaissances", "dataset.external.connect": "Connecter des bases de connaissances externes", "dataset.tag.manage": "Gérer les étiquettes de bases de connaissances", "mcp.manage": "Gérer MCP", diff --git a/web/i18n/fr-FR/permission.json b/web/i18n/fr-FR/permission.json index 897d0f71d8a..e07a9fae877 100644 --- a/web/i18n/fr-FR/permission.json +++ b/web/i18n/fr-FR/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "Affichez le nom, la description et les autorisations accordées pour cet ensemble d'autorisations.", "permissionSet.modal.view.dataset.title": "Afficher l'ensemble d'autorisations de base de connaissances", "permissionSet.nameLabel": "Nom de l'ensemble d'autorisations", - "permissionSet.namePlaceholder": "ex. Peut exporter le DSL", + "permissionSet.namePlaceholder": "ex. Ensemble de permissions d'exploitation", "permissionSet.permissions": "Autorisations", "role.addRole": "Créer des rôles", "role.copyMembersDescription_one": "\"{{name}}\" est attribué à {{count}} membre. Voulez-vous que la copie du nouveau rôle inclue le même membre ?", diff --git a/web/i18n/hi-IN/permission-keys.json b/web/i18n/hi-IN/permission-keys.json index 7aec8a75945..b91e15050ca 100644 --- a/web/i18n/hi-IN/permission-keys.json +++ b/web/i18n/hi-IN/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "ऐप प्रकाशन और संस्करण प्रबंधन", "app.acl.test_and_run": "ऐप परीक्षण और उपयोग करें", "app.acl.view_layout": "केवल-पढ़ने योग्य ऑर्केस्ट्रेशन पृष्ठ", - "app.create_and_management": "ऐप्स बनाएं और अपने बनाए गए ऐप्स प्रबंधित करें", + "app.create_and_management": "ऐप्स बनाएं", "app.tag.manage": "ऐप टैग प्रबंधित करें", "app_library.access": "ऐप लाइब्रेरी तक पहुंचें", "billing.manage": "सदस्यता योजनाएं बदलें", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "ज्ञान आधार पुनर्प्राप्ति", "dataset.acl.use": "ज्ञान आधार में दस्तावेज़ जोड़ें", "dataset.api_key.manage": "ज्ञान आधार API कुंजियाँ प्रबंधित करें", - "dataset.create_and_management": "ज्ञान आधार बनाएं और अपने बनाए गए ज्ञान आधार प्रबंधित करें", + "dataset.create_and_management": "ज्ञान आधार बनाएं", "dataset.external.connect": "बाहरी ज्ञान आधार कनेक्ट करें", "dataset.tag.manage": "ज्ञान आधार टैग प्रबंधित करें", "mcp.manage": "MCP प्रबंधित करें", diff --git a/web/i18n/hi-IN/permission.json b/web/i18n/hi-IN/permission.json index 92ad3bbedcd..5795087827b 100644 --- a/web/i18n/hi-IN/permission.json +++ b/web/i18n/hi-IN/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "इस अनुमति सेट के लिए नाम, विवरण और प्रदान की गई अनुमतियों को देखें।", "permissionSet.modal.view.dataset.title": "ज्ञान आधार अनुमति सेट देखें", "permissionSet.nameLabel": "अनुमति सेट नाम", - "permissionSet.namePlaceholder": "उदा. DSL निर्यात कर सकते हैं", + "permissionSet.namePlaceholder": "उदा. संचालन अनुमति सेट", "permissionSet.permissions": "अनुमतियां", "role.addRole": "भूमिकाएं बनाएं", "role.copyMembersDescription_one": "\"{{name}}\" {{count}} सदस्य को सौंपी गई है। क्या आप चाहते हैं कि नई भूमिका प्रति में वही सदस्य शामिल हो?", diff --git a/web/i18n/id-ID/permission-keys.json b/web/i18n/id-ID/permission-keys.json index c94d50274e2..3904eb23819 100644 --- a/web/i18n/id-ID/permission-keys.json +++ b/web/i18n/id-ID/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "Penerbitan aplikasi dan manajemen versi", "app.acl.test_and_run": "Uji dan gunakan aplikasi", "app.acl.view_layout": "Halaman orkestrasi hanya-baca", - "app.create_and_management": "Buat aplikasi dan kelola aplikasi yang Anda buat", + "app.create_and_management": "Buat aplikasi", "app.tag.manage": "Kelola tag aplikasi", "app_library.access": "Akses Pustaka Aplikasi", "billing.manage": "Ubah paket langganan", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "Pengambilan basis pengetahuan", "dataset.acl.use": "Tambahkan dokumen ke basis pengetahuan", "dataset.api_key.manage": "Kelola kunci API basis pengetahuan", - "dataset.create_and_management": "Buat basis pengetahuan dan kelola basis pengetahuan yang Anda buat", + "dataset.create_and_management": "Buat basis pengetahuan", "dataset.external.connect": "Hubungkan basis pengetahuan eksternal", "dataset.tag.manage": "Kelola tag basis pengetahuan", "mcp.manage": "Kelola MCP", diff --git a/web/i18n/id-ID/permission.json b/web/i18n/id-ID/permission.json index 0b7ceca2a29..8a06cf642ee 100644 --- a/web/i18n/id-ID/permission.json +++ b/web/i18n/id-ID/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "Lihat nama, deskripsi, dan izin yang diberikan untuk set izin ini.", "permissionSet.modal.view.dataset.title": "Lihat set izin Basis Pengetahuan", "permissionSet.nameLabel": "Nama set izin", - "permissionSet.namePlaceholder": "mis. Dapat mengekspor DSL", + "permissionSet.namePlaceholder": "mis. Set izin operasional", "permissionSet.permissions": "Izin", "role.addRole": "Buat peran", "role.copyMembersDescription_one": "\"{{name}}\" ditetapkan ke {{count}} anggota. Apakah Anda ingin salinan peran baru menyertakan anggota yang sama?", diff --git a/web/i18n/it-IT/permission-keys.json b/web/i18n/it-IT/permission-keys.json index 5a3c453b135..970a2a58f71 100644 --- a/web/i18n/it-IT/permission-keys.json +++ b/web/i18n/it-IT/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "Pubblicazione dell'app e gestione delle versioni", "app.acl.test_and_run": "Testa e usa l'app", "app.acl.view_layout": "Pagina di orchestrazione in sola lettura", - "app.create_and_management": "Crea app e gestisci le app che hai creato", + "app.create_and_management": "Crea app", "app.tag.manage": "Gestisci i tag delle app", "app_library.access": "Accedi alla Libreria delle app", "billing.manage": "Cambia i piani di abbonamento", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "Recupero dalla knowledge base", "dataset.acl.use": "Aggiungi documenti alla knowledge base", "dataset.api_key.manage": "Gestisci le chiavi API della knowledge base", - "dataset.create_and_management": "Crea knowledge base e gestisci le knowledge base che hai creato", + "dataset.create_and_management": "Crea knowledge base", "dataset.external.connect": "Connetti knowledge base esterne", "dataset.tag.manage": "Gestisci i tag della knowledge base", "mcp.manage": "Gestisci MCP", diff --git a/web/i18n/it-IT/permission.json b/web/i18n/it-IT/permission.json index 0111207c5dd..974e47b3305 100644 --- a/web/i18n/it-IT/permission.json +++ b/web/i18n/it-IT/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "Visualizza il nome, la descrizione e i permessi concessi per questo set di permessi.", "permissionSet.modal.view.dataset.title": "Visualizza set di permessi per knowledge base", "permissionSet.nameLabel": "Nome del set di permessi", - "permissionSet.namePlaceholder": "es. Può esportare DSL", + "permissionSet.namePlaceholder": "es. Set di autorizzazioni operative", "permissionSet.permissions": "Permessi", "role.addRole": "Crea ruoli", "role.copyMembersDescription_one": "\"{{name}}\" è assegnato a {{count}} membro. Vuoi che la copia del nuovo ruolo includa lo stesso membro?", diff --git a/web/i18n/ja-JP/permission-keys.json b/web/i18n/ja-JP/permission-keys.json index c4d67d83c9b..7c6c0c5e12a 100644 --- a/web/i18n/ja-JP/permission-keys.json +++ b/web/i18n/ja-JP/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "アプリ公開とバージョン管理", "app.acl.test_and_run": "アプリのテストと使用", "app.acl.view_layout": "オーケストレーションページの読み取り専用", - "app.create_and_management": "アプリの作成と、自分が作成したアプリの管理", + "app.create_and_management": "アプリを作成", "app.tag.manage": "アプリタグを管理", "app_library.access": "アプリライブラリにアクセス", "billing.manage": "サブスクリプションプランを変更", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "ナレッジベース検索リコール", "dataset.acl.use": "ナレッジベースにドキュメントを追加", "dataset.api_key.manage": "ナレッジベース API キーを管理", - "dataset.create_and_management": "ナレッジベースの作成と、自分が作成したナレッジベースの管理", + "dataset.create_and_management": "ナレッジベースを作成", "dataset.external.connect": "外部ナレッジベースに接続", "dataset.tag.manage": "ナレッジベースタグを管理", "mcp.manage": "MCPを管理", diff --git a/web/i18n/ja-JP/permission.json b/web/i18n/ja-JP/permission.json index e38e07d5b06..7620cb5e91f 100644 --- a/web/i18n/ja-JP/permission.json +++ b/web/i18n/ja-JP/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "この権限セットの名前、説明、付与される権限を表示します。", "permissionSet.modal.view.dataset.title": "ナレッジベース権限セットを表示", "permissionSet.nameLabel": "権限セット名", - "permissionSet.namePlaceholder": "例: DSL をエクスポート可能", + "permissionSet.namePlaceholder": "例: 運用権限セット", "permissionSet.permissions": "権限", "role.addRole": "ロールを作成", "role.copyMembersDescription_one": "「{{name}}」は {{count}} 人のメンバーに割り当てられています。新しいロールのコピーに同じメンバーを含めますか?", diff --git a/web/i18n/ko-KR/permission-keys.json b/web/i18n/ko-KR/permission-keys.json index 0a703735b65..363dee55a35 100644 --- a/web/i18n/ko-KR/permission-keys.json +++ b/web/i18n/ko-KR/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "앱 게시 및 버전 관리", "app.acl.test_and_run": "앱 테스트 및 사용", "app.acl.view_layout": "읽기 전용 오케스트레이션 페이지", - "app.create_and_management": "앱 생성 및 직접 만든 앱 관리", + "app.create_and_management": "앱 생성", "app.tag.manage": "앱 태그 관리", "app_library.access": "앱 라이브러리 접근", "billing.manage": "구독 플랜 변경", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "지식 베이스 검색", "dataset.acl.use": "지식 베이스에 문서 추가", "dataset.api_key.manage": "지식 베이스 API 키 관리", - "dataset.create_and_management": "지식 베이스 생성 및 직접 만든 지식 베이스 관리", + "dataset.create_and_management": "지식 베이스 생성", "dataset.external.connect": "외부 지식 베이스 연결", "dataset.tag.manage": "지식 베이스 태그 관리", "mcp.manage": "MCP 관리", diff --git a/web/i18n/ko-KR/permission.json b/web/i18n/ko-KR/permission.json index 73f8b48dcfa..92446230511 100644 --- a/web/i18n/ko-KR/permission.json +++ b/web/i18n/ko-KR/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "이 권한 집합의 이름, 설명 및 부여된 권한을 봅니다.", "permissionSet.modal.view.dataset.title": "지식 베이스 권한 집합 보기", "permissionSet.nameLabel": "권한 집합 이름", - "permissionSet.namePlaceholder": "예: DSL 내보내기 가능", + "permissionSet.namePlaceholder": "예: 운영 권한 세트", "permissionSet.permissions": "권한", "role.addRole": "역할 생성", "role.copyMembersDescription_one": "\"{{name}}\"이(가) {{count}}명의 멤버에게 할당되어 있습니다. 새 역할 복사본에 동일한 멤버를 포함하시겠습니까?", diff --git a/web/i18n/nl-NL/permission-keys.json b/web/i18n/nl-NL/permission-keys.json index 685ac79d194..b9a21ae620f 100644 --- a/web/i18n/nl-NL/permission-keys.json +++ b/web/i18n/nl-NL/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "App publiceren en versiebeheer", "app.acl.test_and_run": "App testen en gebruiken", "app.acl.view_layout": "Alleen-lezen orkestratiepagina", - "app.create_and_management": "Apps maken en door jou gemaakte apps beheren", + "app.create_and_management": "Apps maken", "app.tag.manage": "App-tags beheren", "app_library.access": "Toegang tot App-bibliotheek", "billing.manage": "Abonnementen wijzigen", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "Kennisbank ophalen", "dataset.acl.use": "Documenten toevoegen aan kennisbank", "dataset.api_key.manage": "API-sleutels van kennisbank beheren", - "dataset.create_and_management": "Kennisbanken maken en door jou gemaakte kennisbanken beheren", + "dataset.create_and_management": "Kennisbanken maken", "dataset.external.connect": "Externe kennisbanken verbinden", "dataset.tag.manage": "Kennisbank-tags beheren", "mcp.manage": "MCP beheren", diff --git a/web/i18n/nl-NL/permission.json b/web/i18n/nl-NL/permission.json index 44f8ec4384c..efbe7ab66a5 100644 --- a/web/i18n/nl-NL/permission.json +++ b/web/i18n/nl-NL/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "Bekijk de naam, beschrijving en verleende rechten voor deze rechtenset.", "permissionSet.modal.view.dataset.title": "Kennisbank-rechtenset bekijken", "permissionSet.nameLabel": "Naam van rechtenset", - "permissionSet.namePlaceholder": "bijv. Kan DSL exporteren", + "permissionSet.namePlaceholder": "bijv. Machtigingenset voor operations", "permissionSet.permissions": "Rechten", "role.addRole": "Rollen maken", "role.copyMembersDescription_one": "\"{{name}}\" is toegewezen aan {{count}} lid. Wil je dat de nieuwe rolkopie hetzelfde lid bevat?", diff --git a/web/i18n/pl-PL/permission-keys.json b/web/i18n/pl-PL/permission-keys.json index 7b151edac91..8854ba92135 100644 --- a/web/i18n/pl-PL/permission-keys.json +++ b/web/i18n/pl-PL/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "Publikowanie aplikacji i zarządzanie wersjami", "app.acl.test_and_run": "Testuj i używaj aplikacji", "app.acl.view_layout": "Strona orkiestracji tylko do odczytu", - "app.create_and_management": "Twórz aplikacje i zarządzaj utworzonymi przez siebie aplikacjami", + "app.create_and_management": "Twórz aplikacje", "app.tag.manage": "Zarządzaj tagami aplikacji", "app_library.access": "Dostęp do Biblioteki aplikacji", "billing.manage": "Zmień plany subskrypcji", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "Wyszukiwanie w bazie wiedzy", "dataset.acl.use": "Dodaj dokumenty do bazy wiedzy", "dataset.api_key.manage": "Zarządzaj kluczami API bazy wiedzy", - "dataset.create_and_management": "Twórz bazy wiedzy i zarządzaj utworzonymi przez siebie bazami wiedzy", + "dataset.create_and_management": "Twórz bazy wiedzy", "dataset.external.connect": "Połącz zewnętrzne bazy wiedzy", "dataset.tag.manage": "Zarządzaj tagami bazy wiedzy", "mcp.manage": "Zarządzaj MCP", diff --git a/web/i18n/pl-PL/permission.json b/web/i18n/pl-PL/permission.json index aea644c8133..712aeea239c 100644 --- a/web/i18n/pl-PL/permission.json +++ b/web/i18n/pl-PL/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "Wyświetl nazwę, opis i uprawnienia przyznane dla tego zestawu uprawnień.", "permissionSet.modal.view.dataset.title": "Wyświetl zestaw uprawnień bazy wiedzy", "permissionSet.nameLabel": "Nazwa zestawu uprawnień", - "permissionSet.namePlaceholder": "np. Może eksportować DSL", + "permissionSet.namePlaceholder": "np. Zestaw uprawnień operacyjnych", "permissionSet.permissions": "Uprawnienia", "role.addRole": "Twórz role", "role.copyMembersDescription_one": "\"{{name}}\" jest przypisana do {{count}} członka. Czy chcesz, aby nowa kopia roli zawierała tego samego członka?", diff --git a/web/i18n/pt-BR/permission-keys.json b/web/i18n/pt-BR/permission-keys.json index 2b23db09971..09d623193f6 100644 --- a/web/i18n/pt-BR/permission-keys.json +++ b/web/i18n/pt-BR/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "Publicação de aplicativo e gerenciamento de versões", "app.acl.test_and_run": "Testar e usar aplicativo", "app.acl.view_layout": "Página de orquestração somente leitura", - "app.create_and_management": "Criar aplicativos e gerenciar os aplicativos que você criou", + "app.create_and_management": "Criar aplicativos", "app.tag.manage": "Gerenciar tags de aplicativo", "app_library.access": "Acessar a Biblioteca de Aplicativos", "billing.manage": "Alterar planos de assinatura", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "Recuperação do Conhecimento", "dataset.acl.use": "Adicionar documentos ao Conhecimento", "dataset.api_key.manage": "Gerenciar chaves de API do Conhecimento", - "dataset.create_and_management": "Criar Conhecimentos e gerenciar os Conhecimentos que você criou", + "dataset.create_and_management": "Criar Conhecimentos", "dataset.external.connect": "Conectar Conhecimentos externos", "dataset.tag.manage": "Gerenciar tags do Conhecimento", "mcp.manage": "Gerenciar MCP", diff --git a/web/i18n/pt-BR/permission.json b/web/i18n/pt-BR/permission.json index 3b403cc5bd7..8a32b538fd4 100644 --- a/web/i18n/pt-BR/permission.json +++ b/web/i18n/pt-BR/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "Visualize o nome, a descrição e as permissões concedidas para este conjunto de permissões.", "permissionSet.modal.view.dataset.title": "Visualizar conjunto de permissões de Conhecimento", "permissionSet.nameLabel": "Nome do conjunto de permissões", - "permissionSet.namePlaceholder": "ex.: Pode exportar DSL", + "permissionSet.namePlaceholder": "ex.: Conjunto de permissões de operações", "permissionSet.permissions": "Permissões", "role.addRole": "Criar funções", "role.copyMembersDescription_one": "\"{{name}}\" está atribuída a {{count}} membro. Você deseja que a cópia da nova função inclua o mesmo membro?", diff --git a/web/i18n/ro-RO/permission-keys.json b/web/i18n/ro-RO/permission-keys.json index 1d7de2be2a3..cdb49270e3b 100644 --- a/web/i18n/ro-RO/permission-keys.json +++ b/web/i18n/ro-RO/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "Publicarea aplicației și gestionarea versiunilor", "app.acl.test_and_run": "Testează și utilizează aplicația", "app.acl.view_layout": "Pagină de orchestrare doar pentru citire", - "app.create_and_management": "Creează aplicații și gestionează aplicațiile pe care le-ai creat", + "app.create_and_management": "Creează aplicații", "app.tag.manage": "Gestionează etichetele aplicațiilor", "app_library.access": "Accesează Biblioteca de aplicații", "billing.manage": "Schimbă planurile de abonament", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "Recuperare din baza de cunoștințe", "dataset.acl.use": "Adaugă documente în baza de cunoștințe", "dataset.api_key.manage": "Gestionează cheile API ale bazei de cunoștințe", - "dataset.create_and_management": "Creează baze de cunoștințe și gestionează bazele de cunoștințe pe care le-ai creat", + "dataset.create_and_management": "Creează baze de cunoștințe", "dataset.external.connect": "Conectează baze de cunoștințe externe", "dataset.tag.manage": "Gestionează etichetele bazei de cunoștințe", "mcp.manage": "Gestionează MCP", diff --git a/web/i18n/ro-RO/permission.json b/web/i18n/ro-RO/permission.json index 367f8a2069c..1290f20454f 100644 --- a/web/i18n/ro-RO/permission.json +++ b/web/i18n/ro-RO/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "Vizualizează numele, descrierea și permisiunile acordate pentru acest set de permisiuni.", "permissionSet.modal.view.dataset.title": "Vizualizează set de permisiuni pentru baza de cunoștințe", "permissionSet.nameLabel": "Numele setului de permisiuni", - "permissionSet.namePlaceholder": "de ex. Poate exporta DSL", + "permissionSet.namePlaceholder": "de ex. Set de permisiuni operaționale", "permissionSet.permissions": "Permisiuni", "role.addRole": "Creează roluri", "role.copyMembersDescription_one": "\"{{name}}\" este atribuit unui {{count}} membru. Dorești ca noua copie a rolului să includă același membru?", diff --git a/web/i18n/ru-RU/permission-keys.json b/web/i18n/ru-RU/permission-keys.json index f49dff7216c..059c11b5b68 100644 --- a/web/i18n/ru-RU/permission-keys.json +++ b/web/i18n/ru-RU/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "Публикация приложения и управление версиями", "app.acl.test_and_run": "Тестирование и использование приложения", "app.acl.view_layout": "Страница оркестрации только для чтения", - "app.create_and_management": "Создание приложений и управление созданными вами приложениями", + "app.create_and_management": "Создание приложений", "app.tag.manage": "Управление тегами приложений", "app_library.access": "Доступ к библиотеке приложений", "billing.manage": "Изменение тарифных планов", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "Извлечение из базы знаний", "dataset.acl.use": "Добавление документов в базу знаний", "dataset.api_key.manage": "Управление API-ключами базы знаний", - "dataset.create_and_management": "Создание баз знаний и управление созданными вами базами знаний", + "dataset.create_and_management": "Создание баз знаний", "dataset.external.connect": "Подключение внешних баз знаний", "dataset.tag.manage": "Управление тегами баз знаний", "mcp.manage": "Управление MCP", diff --git a/web/i18n/ru-RU/permission.json b/web/i18n/ru-RU/permission.json index f5a50c880dc..b90278eb907 100644 --- a/web/i18n/ru-RU/permission.json +++ b/web/i18n/ru-RU/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "Просмотрите имя, описание и предоставляемые права для этого набора прав.", "permissionSet.modal.view.dataset.title": "Просмотр набора прав базы знаний", "permissionSet.nameLabel": "Имя набора прав", - "permissionSet.namePlaceholder": "напр. Может экспортировать DSL", + "permissionSet.namePlaceholder": "напр. Набор разрешений для эксплуатации", "permissionSet.permissions": "Права", "role.addRole": "Создать роли", "role.copyMembersDescription_one": "\"{{name}}\" назначена {{count}} участнику. Хотите, чтобы копия новой роли включала того же участника?", diff --git a/web/i18n/sl-SI/permission-keys.json b/web/i18n/sl-SI/permission-keys.json index 74ec9370429..0734599f931 100644 --- a/web/i18n/sl-SI/permission-keys.json +++ b/web/i18n/sl-SI/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "Objavljanje aplikacije in upravljanje različic", "app.acl.test_and_run": "Preizkusi in uporabi aplikacijo", "app.acl.view_layout": "Stran za orkestracijo samo za branje", - "app.create_and_management": "Ustvarjanje aplikacij in upravljanje aplikacij, ki ste jih ustvarili", + "app.create_and_management": "Ustvarjanje aplikacij", "app.tag.manage": "Upravljanje oznak aplikacij", "app_library.access": "Dostop do knjižnice aplikacij", "billing.manage": "Spremeni naročniške načrte", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "Pridobivanje iz baze znanja", "dataset.acl.use": "Dodaj dokumente v bazo znanja", "dataset.api_key.manage": "Upravljanje API ključev baze znanja", - "dataset.create_and_management": "Ustvarjanje baz znanja in upravljanje baz znanja, ki ste jih ustvarili", + "dataset.create_and_management": "Ustvarjanje baz znanja", "dataset.external.connect": "Poveži zunanje baze znanja", "dataset.tag.manage": "Upravljanje oznak baze znanja", "mcp.manage": "Upravljanje MCP", diff --git a/web/i18n/sl-SI/permission.json b/web/i18n/sl-SI/permission.json index 627641c04d7..1f55ea58820 100644 --- a/web/i18n/sl-SI/permission.json +++ b/web/i18n/sl-SI/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "Oglejte si ime, opis in dovoljenja, podeljena za ta nabor dovoljenj.", "permissionSet.modal.view.dataset.title": "Ogled nabora dovoljenj za bazo znanja", "permissionSet.nameLabel": "Ime nabora dovoljenj", - "permissionSet.namePlaceholder": "npr. Lahko izvozi DSL", + "permissionSet.namePlaceholder": "npr. Nabor dovoljenj za operacije", "permissionSet.permissions": "Dovoljenja", "role.addRole": "Ustvari vloge", "role.copyMembersDescription_one": "\"{{name}}\" je dodeljen {{count}} članu. Ali želite, da nova kopija vloge vključuje istega člana?", diff --git a/web/i18n/th-TH/permission-keys.json b/web/i18n/th-TH/permission-keys.json index 139287d1901..5cb9d6ef8a5 100644 --- a/web/i18n/th-TH/permission-keys.json +++ b/web/i18n/th-TH/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "การเผยแพร่แอปและการจัดการเวอร์ชัน", "app.acl.test_and_run": "ทดสอบและใช้งานแอป", "app.acl.view_layout": "หน้าจัดวางแบบอ่านอย่างเดียว", - "app.create_and_management": "สร้างแอปและจัดการแอปที่คุณสร้าง", + "app.create_and_management": "สร้างแอป", "app.tag.manage": "จัดการแท็กแอป", "app_library.access": "เข้าถึงคลังแอป", "billing.manage": "เปลี่ยนแผนการสมัครสมาชิก", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "การดึงข้อมูลจากฐานความรู้", "dataset.acl.use": "เพิ่มเอกสารลงในฐานความรู้", "dataset.api_key.manage": "จัดการคีย์ API ของฐานความรู้", - "dataset.create_and_management": "สร้างฐานความรู้และจัดการฐานความรู้ที่คุณสร้าง", + "dataset.create_and_management": "สร้างฐานความรู้", "dataset.external.connect": "เชื่อมต่อฐานความรู้ภายนอก", "dataset.tag.manage": "จัดการแท็กฐานความรู้", "mcp.manage": "จัดการ MCP", diff --git a/web/i18n/th-TH/permission.json b/web/i18n/th-TH/permission.json index e52406958c9..29b152d2b11 100644 --- a/web/i18n/th-TH/permission.json +++ b/web/i18n/th-TH/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "ดูชื่อ คําอธิบาย และสิทธิ์ที่ให้สําหรับชุดสิทธิ์นี้", "permissionSet.modal.view.dataset.title": "ดูชุดสิทธิ์ฐานความรู้", "permissionSet.nameLabel": "ชื่อชุดสิทธิ์", - "permissionSet.namePlaceholder": "เช่น สามารถส่งออก DSL", + "permissionSet.namePlaceholder": "เช่น ชุดสิทธิ์การดำเนินงาน", "permissionSet.permissions": "สิทธิ์", "role.addRole": "สร้างบทบาท", "role.copyMembersDescription_one": "\"{{name}}\" ถูกกําหนดให้กับสมาชิก {{count}} คน คุณต้องการให้สําเนาบทบาทใหม่รวมสมาชิกคนเดียวกันหรือไม่", diff --git a/web/i18n/tr-TR/permission-keys.json b/web/i18n/tr-TR/permission-keys.json index 8e2009dea25..0932407ea8f 100644 --- a/web/i18n/tr-TR/permission-keys.json +++ b/web/i18n/tr-TR/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "Uygulama yayınlama ve sürüm yönetimi", "app.acl.test_and_run": "Uygulamayı test et ve kullan", "app.acl.view_layout": "Salt okunur düzenleme sayfası", - "app.create_and_management": "Uygulama oluştur ve oluşturduğun uygulamaları yönet", + "app.create_and_management": "Uygulama oluştur", "app.tag.manage": "Uygulama etiketlerini yönet", "app_library.access": "Uygulama Kitaplığına eriş", "billing.manage": "Abonelik planlarını değiştir", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "Bilgi tabanı geri alımı", "dataset.acl.use": "Bilgi tabanına belge ekle", "dataset.api_key.manage": "Bilgi tabanı API anahtarlarını yönet", - "dataset.create_and_management": "Bilgi tabanı oluştur ve oluşturduğun bilgi tabanlarını yönet", + "dataset.create_and_management": "Bilgi tabanı oluştur", "dataset.external.connect": "Harici bilgi tabanlarına bağlan", "dataset.tag.manage": "Bilgi tabanı etiketlerini yönet", "mcp.manage": "MCP yönet", diff --git a/web/i18n/tr-TR/permission.json b/web/i18n/tr-TR/permission.json index 86818102126..db0310a4c2b 100644 --- a/web/i18n/tr-TR/permission.json +++ b/web/i18n/tr-TR/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "Bu izin kümesi için verilen adı, açıklamayı ve izinleri görüntüleyin.", "permissionSet.modal.view.dataset.title": "Bilgi Tabanı izin kümesini görüntüle", "permissionSet.nameLabel": "İzin kümesi adı", - "permissionSet.namePlaceholder": "ör. DSL dışa aktarabilir", + "permissionSet.namePlaceholder": "ör. Operasyon izin seti", "permissionSet.permissions": "İzinler", "role.addRole": "Rol oluştur", "role.copyMembersDescription_one": "\"{{name}}\" {{count}} üyeye atanmış. Yeni rol kopyasının aynı üyeyi içermesini istiyor musunuz?", diff --git a/web/i18n/uk-UA/permission-keys.json b/web/i18n/uk-UA/permission-keys.json index 1639eb65cba..d977a2b0e61 100644 --- a/web/i18n/uk-UA/permission-keys.json +++ b/web/i18n/uk-UA/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "Публікація застосунку та керування версіями", "app.acl.test_and_run": "Тестувати та використовувати застосунок", "app.acl.view_layout": "Сторінка оркестрації лише для читання", - "app.create_and_management": "Створювати застосунки та керувати створеними вами застосунками", + "app.create_and_management": "Створювати застосунки", "app.tag.manage": "Керування тегами застосунків", "app_library.access": "Доступ до бібліотеки застосунків", "billing.manage": "Зміна планів підписки", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "Пошук у базі знань", "dataset.acl.use": "Додавати документи до бази знань", "dataset.api_key.manage": "Керування ключами API бази знань", - "dataset.create_and_management": "Створювати бази знань та керувати створеними вами базами знань", + "dataset.create_and_management": "Створювати бази знань", "dataset.external.connect": "Підключати зовнішні бази знань", "dataset.tag.manage": "Керування тегами бази знань", "mcp.manage": "Керування MCP", diff --git a/web/i18n/uk-UA/permission.json b/web/i18n/uk-UA/permission.json index c035dbe4dfd..90a97e07dd6 100644 --- a/web/i18n/uk-UA/permission.json +++ b/web/i18n/uk-UA/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "Перегляньте назву, опис та надані дозволи для цього набору дозволів.", "permissionSet.modal.view.dataset.title": "Переглянути набір дозволів бази знань", "permissionSet.nameLabel": "Назва набору дозволів", - "permissionSet.namePlaceholder": "напр. Може експортувати DSL", + "permissionSet.namePlaceholder": "напр. Набір дозволів для експлуатації", "permissionSet.permissions": "Дозволи", "role.addRole": "Створити ролі", "role.copyMembersDescription_one": "\"{{name}}\" призначено {{count}} учаснику. Чи хочете ви, щоб нова копія ролі включала того самого учасника?", diff --git a/web/i18n/vi-VN/permission-keys.json b/web/i18n/vi-VN/permission-keys.json index defaa08969f..7cb6c5d09b4 100644 --- a/web/i18n/vi-VN/permission-keys.json +++ b/web/i18n/vi-VN/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "Phát hành ứng dụng và quản lý phiên bản", "app.acl.test_and_run": "Kiểm thử và sử dụng ứng dụng", "app.acl.view_layout": "Trang điều phối chỉ đọc", - "app.create_and_management": "Tạo ứng dụng và quản lý các ứng dụng bạn đã tạo", + "app.create_and_management": "Tạo ứng dụng", "app.tag.manage": "Quản lý thẻ ứng dụng", "app_library.access": "Truy cập Thư viện ứng dụng", "billing.manage": "Thay đổi gói đăng ký", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "Truy xuất cơ sở tri thức", "dataset.acl.use": "Thêm tài liệu vào cơ sở tri thức", "dataset.api_key.manage": "Quản lý khóa API cơ sở tri thức", - "dataset.create_and_management": "Tạo cơ sở tri thức và quản lý các cơ sở tri thức bạn đã tạo", + "dataset.create_and_management": "Tạo cơ sở tri thức", "dataset.external.connect": "Kết nối cơ sở tri thức bên ngoài", "dataset.tag.manage": "Quản lý thẻ cơ sở tri thức", "mcp.manage": "Quản lý MCP", diff --git a/web/i18n/vi-VN/permission.json b/web/i18n/vi-VN/permission.json index 5ebadd022a3..206f7467fc1 100644 --- a/web/i18n/vi-VN/permission.json +++ b/web/i18n/vi-VN/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "Xem tên, mô tả và các quyền được cấp cho bộ quyền này.", "permissionSet.modal.view.dataset.title": "Xem bộ quyền cơ sở tri thức", "permissionSet.nameLabel": "Tên bộ quyền", - "permissionSet.namePlaceholder": "ví dụ: Có thể xuất DSL", + "permissionSet.namePlaceholder": "ví dụ: Bộ quyền vận hành", "permissionSet.permissions": "Quyền", "role.addRole": "Tạo vai trò", "role.copyMembersDescription_one": "\"{{name}}\" được gán cho {{count}} thành viên. Bạn có muốn bản sao vai trò mới bao gồm cùng thành viên đó không?", diff --git a/web/i18n/zh-Hans/permission-keys.json b/web/i18n/zh-Hans/permission-keys.json index 2c6f06ffc12..c6a790af1a3 100644 --- a/web/i18n/zh-Hans/permission-keys.json +++ b/web/i18n/zh-Hans/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "应用发布与版本管理", "app.acl.test_and_run": "测试与使用应用", "app.acl.view_layout": "编排页只读", - "app.create_and_management": "创建和管理自己创建的应用", + "app.create_and_management": "创建应用", "app.tag.manage": "管理应用标签", "app_library.access": "访问应用库", "billing.manage": "更换订阅套餐", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "知识库检索召回", "dataset.acl.use": "向知识库新增文件", "dataset.api_key.manage": "管理知识库 API Key", - "dataset.create_and_management": "创建和管理自己创建的知识库", + "dataset.create_and_management": "创建知识库", "dataset.external.connect": "连接外部知识库", "dataset.tag.manage": "管理知识库标签", "mcp.manage": "管理MCP", diff --git a/web/i18n/zh-Hans/permission.json b/web/i18n/zh-Hans/permission.json index 21c308de084..a0ff717c539 100644 --- a/web/i18n/zh-Hans/permission.json +++ b/web/i18n/zh-Hans/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "查看此权限集的名称、描述和授予的权限。", "permissionSet.modal.view.dataset.title": "查看知识库权限集", "permissionSet.nameLabel": "权限集名称", - "permissionSet.namePlaceholder": "例如:可导出 DSL", + "permissionSet.namePlaceholder": "例如:运维权限集合", "permissionSet.permissions": "权限", "role.addRole": "创建角色", "role.copyMembersDescription_one": "“{{name}}”已分配给 {{count}} 个成员。是否让新角色副本包含相同成员?", diff --git a/web/i18n/zh-Hant/permission-keys.json b/web/i18n/zh-Hant/permission-keys.json index 92058d576c9..39c2607b5d9 100644 --- a/web/i18n/zh-Hant/permission-keys.json +++ b/web/i18n/zh-Hant/permission-keys.json @@ -10,7 +10,7 @@ "app.acl.release_and_version": "應用發布與版本管理", "app.acl.test_and_run": "測試與使用應用", "app.acl.view_layout": "編排頁唯讀", - "app.create_and_management": "建立與管理自己建立的應用", + "app.create_and_management": "建立應用", "app.tag.manage": "管理應用標籤", "app_library.access": "訪問應用庫", "billing.manage": "更換訂閱套餐", @@ -35,7 +35,7 @@ "dataset.acl.retrieval_recall": "知識庫檢索召回", "dataset.acl.use": "向知識庫新增檔案", "dataset.api_key.manage": "管理知識庫 API Key", - "dataset.create_and_management": "建立與管理自己建立的知識庫", + "dataset.create_and_management": "建立知識庫", "dataset.external.connect": "連接外部知識庫", "dataset.tag.manage": "管理知識庫標籤", "mcp.manage": "管理MCP", diff --git a/web/i18n/zh-Hant/permission.json b/web/i18n/zh-Hant/permission.json index 28e90a4b902..e83824744a2 100644 --- a/web/i18n/zh-Hant/permission.json +++ b/web/i18n/zh-Hant/permission.json @@ -71,7 +71,7 @@ "permissionSet.modal.view.dataset.description": "查看此權限集的名稱、描述和授予的權限。", "permissionSet.modal.view.dataset.title": "查看知識庫權限集", "permissionSet.nameLabel": "權限集名稱", - "permissionSet.namePlaceholder": "例如:可匯出 DSL", + "permissionSet.namePlaceholder": "例如:維運權限集合", "permissionSet.permissions": "權限", "role.addRole": "建立角色", "role.copyMembersDescription_one": "「{{name}}」已分配給 {{count}} 個成員。是否讓新角色副本包含相同成員?", From 347b02d318427169daba6251c7f06a921de4e560 Mon Sep 17 00:00:00 2001 From: Asuka Minato Date: Wed, 24 Jun 2026 16:10:02 +0900 Subject: [PATCH 3/9] chore: rm all mock_logger (#37786) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .../test_webhook_service_relationships.py | 31 ++-- .../test_disable_segments_from_index_task.py | 27 ++-- .../tasks/test_mail_email_code_login_task.py | 40 ++--- .../tasks/test_mail_invite_member_task.py | 28 ++-- .../tasks/test_mail_register_task.py | 25 ++- .../test_entities_provider_configuration.py | 37 ++--- .../rag/embedding/test_embedding_service.py | 2 +- .../test_paragraph_index_processor.py | 10 +- .../processor/test_qa_index_processor.py | 4 +- .../graph_engine/layers/test_llm_quota.py | 4 +- .../enterprise/telemetry/test_exporter.py | 6 +- ...st_update_provider_when_message_created.py | 5 +- .../extensions/test_ext_request_logging.py | 144 ++++++++++-------- .../enterprise/test_plugin_manager_service.py | 37 +++-- .../test_restore_archived_workflow_run.py | 17 ++- .../services/test_human_input_service.py | 2 +- .../services/test_webhook_service.py | 13 +- 17 files changed, 238 insertions(+), 194 deletions(-) diff --git a/api/tests/test_containers_integration_tests/services/test_webhook_service_relationships.py b/api/tests/test_containers_integration_tests/services/test_webhook_service_relationships.py index 69cde847f8e..f37dc328b02 100644 --- a/api/tests/test_containers_integration_tests/services/test_webhook_service_relationships.py +++ b/api/tests/test_containers_integration_tests/services/test_webhook_service_relationships.py @@ -1,6 +1,7 @@ from __future__ import annotations import json +import logging from types import SimpleNamespace from unittest.mock import MagicMock, patch from uuid import uuid4 @@ -355,7 +356,10 @@ class TestWebhookServiceTriggerExecutionWithContainers: mock_mark_rate_limited.assert_called_once_with(tenant.id) def test_trigger_workflow_execution_logs_and_reraises_unexpected_errors( - self, db_session_with_containers: Session, flask_app_with_containers: Flask + self, + db_session_with_containers: Session, + flask_app_with_containers: Flask, + caplog: pytest.LogCaptureFixture, ): del flask_app_with_containers factory = WebhookServiceRelationshipFactory @@ -367,13 +371,11 @@ class TestWebhookServiceTriggerExecutionWithContainers: webhook_trigger = factory.create_webhook_trigger( db_session_with_containers, app=app, account=account, node_id="node-1" ) + caplog.set_level(logging.ERROR, logger="services.trigger.webhook_service") - with ( - patch( - "services.trigger.webhook_service.EndUserService.get_or_create_end_user_by_type", - side_effect=RuntimeError("boom"), - ), - patch("services.trigger.webhook_service.logger.exception") as mock_logger_exception, + with patch( + "services.trigger.webhook_service.EndUserService.get_or_create_end_user_by_type", + side_effect=RuntimeError("boom"), ): with pytest.raises(RuntimeError, match="boom"): WebhookService.trigger_workflow_execution( @@ -382,7 +384,7 @@ class TestWebhookServiceTriggerExecutionWithContainers: workflow, ) - mock_logger_exception.assert_called_once() + assert caplog.messages.count(f"Failed to trigger workflow for webhook {webhook_trigger.webhook_id}") == 1 class TestWebhookServiceRelationshipSyncWithContainers: @@ -482,7 +484,10 @@ class TestWebhookServiceRelationshipSyncWithContainers: assert cached_payload["webhook_id"] == "cache-webhook-id-00001" def test_sync_webhook_relationships_logs_when_lock_release_fails( - self, db_session_with_containers: Session, flask_app_with_containers: Flask + self, + db_session_with_containers: Session, + flask_app_with_containers: Flask, + caplog: pytest.LogCaptureFixture, ): del flask_app_with_containers factory = WebhookServiceRelationshipFactory @@ -494,14 +499,12 @@ class TestWebhookServiceRelationshipSyncWithContainers: lock = MagicMock() lock.acquire.return_value = True lock.release.side_effect = RuntimeError("release failed") + caplog.set_level(logging.ERROR, logger="services.trigger.webhook_service") - with ( - patch("services.trigger.webhook_service.redis_client.lock", return_value=lock), - patch("services.trigger.webhook_service.logger.exception") as mock_logger_exception, - ): + with patch("services.trigger.webhook_service.redis_client.lock", return_value=lock): WebhookService.sync_webhook_relationships(app, workflow) - mock_logger_exception.assert_called_once() + assert caplog.messages.count(f"Failed to release lock for webhook sync, app {app.id}") == 1 def _read_cache(cache_key: str) -> dict[str, str] | None: diff --git a/api/tests/test_containers_integration_tests/tasks/test_disable_segments_from_index_task.py b/api/tests/test_containers_integration_tests/tasks/test_disable_segments_from_index_task.py index cb5fb5483c8..19611bd6ff2 100644 --- a/api/tests/test_containers_integration_tests/tasks/test_disable_segments_from_index_task.py +++ b/api/tests/test_containers_integration_tests/tasks/test_disable_segments_from_index_task.py @@ -6,9 +6,11 @@ using TestContainers to ensure realistic database interactions and proper isolat The task is responsible for removing document segments from the search index when they are disabled. """ +import logging from unittest.mock import MagicMock, patch from uuid import uuid4 +import pytest from faker import Faker from sqlalchemy import select from sqlalchemy.orm import Session @@ -533,7 +535,9 @@ class TestDisableSegmentsFromIndexTask: assert result is None # Task should complete without returning a value mock_factory.assert_called_with(doc_form) - def test_disable_segments_performance_timing(self, db_session_with_containers: Session): + def test_disable_segments_performance_timing( + self, db_session_with_containers: Session, caplog: pytest.LogCaptureFixture + ): """ Test that the task properly measures and logs performance timing. @@ -562,21 +566,18 @@ class TestDisableSegmentsFromIndexTask: # Mock time.perf_counter to control timing with patch("tasks.disable_segments_from_index_task.time.perf_counter") as mock_perf_counter: mock_perf_counter.side_effect = [1000.0, 1000.5] # 0.5 seconds execution time + caplog.set_level(logging.INFO, logger="tasks.disable_segments_from_index_task") - # Mock logger to capture log messages - with patch("tasks.disable_segments_from_index_task.logger") as mock_logger: - # Act - result = disable_segments_from_index_task(segment_ids, dataset.id, document.id) + # Act + result = disable_segments_from_index_task(segment_ids, dataset.id, document.id) - # Assert - assert result is None # Task should complete without returning a value + # Assert + assert result is None # Task should complete without returning a value - # Verify performance logging - mock_logger.info.assert_called() - log_calls = [call[0][0] for call in mock_logger.info.call_args_list] - performance_log = next((call for call in log_calls if "latency" in call), None) - assert performance_log is not None - assert "0.5" in performance_log # Should log the execution time + # Verify performance logging + performance_log = next((message for message in caplog.messages if "latency" in message), None) + assert performance_log is not None + assert "0.5" in performance_log # Should log the execution time def test_disable_segments_redis_cache_cleanup(self, db_session_with_containers: Session): """ diff --git a/api/tests/test_containers_integration_tests/tasks/test_mail_email_code_login_task.py b/api/tests/test_containers_integration_tests/tasks/test_mail_email_code_login_task.py index 0eec166fe2f..567bd44b930 100644 --- a/api/tests/test_containers_integration_tests/tasks/test_mail_email_code_login_task.py +++ b/api/tests/test_containers_integration_tests/tasks/test_mail_email_code_login_task.py @@ -10,6 +10,7 @@ All tests use the testcontainers infrastructure to ensure proper database isolat and realistic testing scenarios with actual PostgreSQL and Redis instances. """ +import logging from unittest.mock import MagicMock, patch import pytest @@ -543,7 +544,10 @@ class TestSendEmailCodeLoginMailTask: redis_client.delete(cache_key) def test_send_email_code_login_mail_task_error_handling_comprehensive( - self, db_session_with_containers: Session, mock_external_service_dependencies + self, + db_session_with_containers: Session, + mock_external_service_dependencies, + caplog: pytest.LogCaptureFixture, ): """ Test comprehensive error handling for email code login mail task. @@ -559,6 +563,7 @@ class TestSendEmailCodeLoginMailTask: test_email = fake.email() test_code = "123456" test_language = "en-US" + caplog.set_level(logging.ERROR, logger="tasks.mail_email_code_login") # Test different exception types exception_types = [ @@ -571,31 +576,26 @@ class TestSendEmailCodeLoginMailTask: for error_name, exception in exception_types: # Reset mocks for each test case + caplog.clear() mock_email_service_instance = mock_external_service_dependencies["email_service_instance"] mock_email_service_instance.reset_mock() mock_email_service_instance.send_email.side_effect = exception - # Mock logging to capture error messages - with patch("tasks.mail_email_code_login.logger", autospec=True) as mock_logger: - # Act: Execute the task - it should handle the exception gracefully - send_email_code_login_mail_task( - language=test_language, - to=test_email, - code=test_code, - ) + # Act: Execute the task - it should handle the exception gracefully + send_email_code_login_mail_task( + language=test_language, + to=test_email, + code=test_code, + ) - # Assert: Verify error handling - # Verify email service was called (and failed) - mock_email_service_instance.send_email.assert_called_once() + # Assert: Verify error handling + # Verify email service was called (and failed) + mock_email_service_instance.send_email.assert_called_once() - # Verify error was logged - error_calls = [ - call - for call in mock_logger.exception.call_args_list - if f"Send email code login mail to {test_email} failed" in str(call) - ] - # Check if any exception call was made (the exact message format may vary) - assert mock_logger.exception.call_count >= 1, f"Error should be logged for {error_name}" + # Verify error was logged + assert f"Send email code login mail to {test_email} failed" in caplog.messages, ( + f"Error should be logged for {error_name}" + ) # Reset side effect for next iteration mock_email_service_instance.send_email.side_effect = None diff --git a/api/tests/test_containers_integration_tests/tasks/test_mail_invite_member_task.py b/api/tests/test_containers_integration_tests/tasks/test_mail_invite_member_task.py index de15d4cc772..507e674e5af 100644 --- a/api/tests/test_containers_integration_tests/tasks/test_mail_invite_member_task.py +++ b/api/tests/test_containers_integration_tests/tasks/test_mail_invite_member_task.py @@ -11,6 +11,7 @@ and realistic testing scenarios with actual PostgreSQL and Redis instances. """ import json +import logging import uuid from datetime import UTC, datetime from unittest.mock import MagicMock, patch @@ -295,7 +296,10 @@ class TestMailInviteMemberTask: mock_email_service.send_email.assert_not_called() def test_send_invite_member_mail_email_service_exception( - self, db_session_with_containers: Session, mock_external_service_dependencies + self, + db_session_with_containers: Session, + mock_external_service_dependencies, + caplog: pytest.LogCaptureFixture, ): """ Test error handling when email service raises an exception. @@ -308,21 +312,19 @@ class TestMailInviteMemberTask: # Arrange: Setup email service to raise exception mock_email_service = mock_external_service_dependencies["email_service"] mock_email_service.send_email.side_effect = Exception("Email service failed") + caplog.set_level(logging.ERROR, logger="tasks.mail_invite_member_task") # Act & Assert: Execute task and verify exception is handled - with patch("tasks.mail_invite_member_task.logger", autospec=True) as mock_logger: - send_invite_member_mail_task( - language="en-US", - to="test@example.com", - token="test-token", - inviter_name="Test User", - workspace_name="Test Workspace", - ) + send_invite_member_mail_task( + language="en-US", + to="test@example.com", + token="test-token", + inviter_name="Test User", + workspace_name="Test Workspace", + ) - # Verify error was logged - mock_logger.exception.assert_called_once() - error_call = mock_logger.exception.call_args[0][0] - assert "Send invite member mail to %s failed" in error_call + # Verify error was logged + assert caplog.messages.count("Send invite member mail to test@example.com failed") == 1 def test_send_invite_member_mail_template_context_validation( self, db_session_with_containers: Session, mock_external_service_dependencies diff --git a/api/tests/test_containers_integration_tests/tasks/test_mail_register_task.py b/api/tests/test_containers_integration_tests/tasks/test_mail_register_task.py index c74b451b4b6..685c1617bb0 100644 --- a/api/tests/test_containers_integration_tests/tasks/test_mail_register_task.py +++ b/api/tests/test_containers_integration_tests/tasks/test_mail_register_task.py @@ -5,6 +5,7 @@ This module provides integration tests for email registration tasks using TestContainers to ensure real database and service interactions. """ +import logging from unittest.mock import patch import pytest @@ -68,7 +69,10 @@ class TestMailRegisterTask: mock_mail_dependencies["email_service"].send_email.assert_not_called() def test_send_email_register_mail_task_exception_handling( - self, db_session_with_containers: Session, mock_mail_dependencies + self, + db_session_with_containers: Session, + mock_mail_dependencies, + caplog: pytest.LogCaptureFixture, ): """Test email registration task exception handling.""" mock_mail_dependencies["email_service"].send_email.side_effect = Exception("Email service error") @@ -76,10 +80,11 @@ class TestMailRegisterTask: fake = Faker() to_email = fake.email() code = fake.numerify("######") + caplog.set_level(logging.ERROR, logger="tasks.mail_register_task") - with patch("tasks.mail_register_task.logger", autospec=True) as mock_logger: - send_email_register_mail_task(language="en-US", to=to_email, code=code) - mock_logger.exception.assert_called_once_with("Send email register mail to %s failed", to_email) + send_email_register_mail_task(language="en-US", to=to_email, code=code) + + assert caplog.messages.count(f"Send email register mail to {to_email} failed") == 1 def test_send_email_register_mail_task_when_account_exist_success( self, db_session_with_containers: Session, mock_mail_dependencies @@ -121,7 +126,10 @@ class TestMailRegisterTask: mock_mail_dependencies["email_service"].send_email.assert_not_called() def test_send_email_register_mail_task_when_account_exist_exception_handling( - self, db_session_with_containers: Session, mock_mail_dependencies + self, + db_session_with_containers: Session, + mock_mail_dependencies, + caplog: pytest.LogCaptureFixture, ): """Test account exist email task exception handling.""" mock_mail_dependencies["email_service"].send_email.side_effect = Exception("Email service error") @@ -129,7 +137,8 @@ class TestMailRegisterTask: fake = Faker() to_email = fake.email() account_name = fake.name() + caplog.set_level(logging.ERROR, logger="tasks.mail_register_task") - with patch("tasks.mail_register_task.logger", autospec=True) as mock_logger: - send_email_register_mail_task_when_account_exist(language="en-US", to=to_email, account_name=account_name) - mock_logger.exception.assert_called_once_with("Send email register mail to %s failed", to_email) + send_email_register_mail_task_when_account_exist(language="en-US", to=to_email, account_name=account_name) + + assert caplog.messages.count(f"Send email register mail to {to_email} failed") == 1 diff --git a/api/tests/unit_tests/core/entities/test_entities_provider_configuration.py b/api/tests/unit_tests/core/entities/test_entities_provider_configuration.py index 07ba9314977..dbc8f4969dc 100644 --- a/api/tests/unit_tests/core/entities/test_entities_provider_configuration.py +++ b/api/tests/unit_tests/core/entities/test_entities_provider_configuration.py @@ -1,5 +1,6 @@ from __future__ import annotations +import logging from contextlib import contextmanager from types import SimpleNamespace from typing import Any @@ -1704,13 +1705,14 @@ def test_get_specific_provider_credential_decrypts_and_obfuscates_credentials() assert credentials == {"openai_api_key": "raw-secret", "region": "us"} -def test_get_specific_provider_credential_logs_when_decrypt_fails() -> None: +def test_get_specific_provider_credential_logs_when_decrypt_fails(caplog: pytest.LogCaptureFixture) -> None: configuration = _build_provider_configuration() configuration.provider.provider_credential_schema = _build_secret_provider_schema() session = Mock() session.execute.return_value.scalar_one_or_none.return_value = SimpleNamespace( encrypted_config='{"openai_api_key":"enc-secret"}' ) + caplog.set_level(logging.ERROR, logger="core.entities.provider_configuration") with _patched_session(session): with patch.object(ProviderConfiguration, "_get_provider_record", return_value=None): @@ -1718,16 +1720,15 @@ def test_get_specific_provider_credential_logs_when_decrypt_fails() -> None: "core.entities.provider_configuration.encrypter.decrypt_token", side_effect=RuntimeError("boom"), ): - with patch("core.entities.provider_configuration.logger.exception") as mock_logger: - with patch.object( - ProviderConfiguration, - "obfuscated_credentials", - side_effect=lambda credentials, credential_form_schemas: credentials, - ): - credentials = configuration._get_specific_provider_credential("cred-1") + with patch.object( + ProviderConfiguration, + "obfuscated_credentials", + side_effect=lambda credentials, credential_form_schemas: credentials, + ): + credentials = configuration._get_specific_provider_credential("cred-1") assert credentials == {"openai_api_key": "enc-secret"} - mock_logger.assert_called_once() + assert caplog.messages.count("Failed to decrypt credential secret variable openai_api_key") == 1 def test_validate_provider_credentials_uses_empty_original_when_record_missing() -> None: @@ -1831,7 +1832,7 @@ def test_switch_active_provider_credential_rolls_back_on_error() -> None: session.rollback.assert_called_once() -def test_get_specific_custom_model_credential_logs_when_decrypt_fails() -> None: +def test_get_specific_custom_model_credential_logs_when_decrypt_fails(caplog: pytest.LogCaptureFixture) -> None: configuration = _build_provider_configuration() configuration.provider.model_credential_schema = _build_secret_model_schema() session = Mock() @@ -1840,19 +1841,19 @@ def test_get_specific_custom_model_credential_logs_when_decrypt_fails() -> None: credential_name="Main", encrypted_config='{"openai_api_key":"enc-secret"}', ) + caplog.set_level(logging.ERROR, logger="core.entities.provider_configuration") with _patched_session(session): with patch("core.entities.provider_configuration.encrypter.decrypt_token", side_effect=RuntimeError("boom")): - with patch("core.entities.provider_configuration.logger.exception") as mock_logger: - with patch.object( - ProviderConfiguration, - "obfuscated_credentials", - side_effect=lambda credentials, credential_form_schemas: credentials, - ): - result = configuration._get_specific_custom_model_credential(ModelType.LLM, "gpt-4o", "cred-1") + with patch.object( + ProviderConfiguration, + "obfuscated_credentials", + side_effect=lambda credentials, credential_form_schemas: credentials, + ): + result = configuration._get_specific_custom_model_credential(ModelType.LLM, "gpt-4o", "cred-1") assert result["credentials"] == {"openai_api_key": "enc-secret"} - mock_logger.assert_called_once() + assert caplog.messages.count("Failed to decrypt model credential secret variable openai_api_key") == 1 def test_validate_custom_model_credentials_handles_invalid_original_json() -> None: diff --git a/api/tests/unit_tests/core/rag/embedding/test_embedding_service.py b/api/tests/unit_tests/core/rag/embedding/test_embedding_service.py index 42d5ea4a393..168d0e466d4 100644 --- a/api/tests/unit_tests/core/rag/embedding/test_embedding_service.py +++ b/api/tests/unit_tests/core/rag/embedding/test_embedding_service.py @@ -407,7 +407,7 @@ class TestCacheEmbeddingDocuments: assert len(calls[1].kwargs["texts"]) == 10 assert len(calls[2].kwargs["texts"]) == 5 - def test_embed_documents_nan_handling(self, mock_model_instance, caplog): + def test_embed_documents_nan_handling(self, mock_model_instance, caplog: pytest.LogCaptureFixture): """Test handling of NaN values in embeddings. Verifies: diff --git a/api/tests/unit_tests/core/rag/indexing/processor/test_paragraph_index_processor.py b/api/tests/unit_tests/core/rag/indexing/processor/test_paragraph_index_processor.py index d2154f138a7..302ababb48f 100644 --- a/api/tests/unit_tests/core/rag/indexing/processor/test_paragraph_index_processor.py +++ b/api/tests/unit_tests/core/rag/indexing/processor/test_paragraph_index_processor.py @@ -385,7 +385,7 @@ class TestParagraphIndexProcessor: with pytest.raises(ValueError, match="model_name and model_provider_name"): ParagraphIndexProcessor.generate_summary("tenant-1", "text", {"enable": True}) - def test_generate_summary_text_only_flow(self, caplog) -> None: + def test_generate_summary_text_only_flow(self, caplog: pytest.LogCaptureFixture) -> None: model_instance = Mock() model_instance.credentials = {"k": "v"} model_instance.model_type_instance.get_model_schema.return_value = SimpleNamespace(features=[]) @@ -459,7 +459,7 @@ class TestParagraphIndexProcessor: assert summary == "vision summary" mock_extract_text.assert_not_called() - def test_generate_summary_fallbacks_for_prompt_and_result_types(self, caplog) -> None: + def test_generate_summary_fallbacks_for_prompt_and_result_types(self, caplog: pytest.LogCaptureFixture) -> None: model_instance = Mock() model_instance.credentials = {"k": "v"} model_instance.model_type_instance.get_model_schema.return_value = SimpleNamespace( @@ -503,7 +503,7 @@ class TestParagraphIndexProcessor: "Failed to convert image file to prompt message content" in record.message for record in caplog.records ) - def test_extract_images_from_text_handles_patterns_and_build_errors(self, caplog) -> None: + def test_extract_images_from_text_handles_patterns_and_build_errors(self, caplog: pytest.LogCaptureFixture) -> None: text = ( "![img](/files/11111111-1111-1111-1111-111111111111/image-preview) " "![img2](/files/22222222-2222-2222-2222-222222222222/file-preview) " @@ -554,7 +554,7 @@ class TestParagraphIndexProcessor: session.scalars.return_value = scalars_result assert ParagraphIndexProcessor._extract_images_from_text("tenant-1", "no images here", session) == [] - def test_extract_images_from_text_logs_when_build_fails(self, caplog) -> None: + def test_extract_images_from_text_logs_when_build_fails(self, caplog: pytest.LogCaptureFixture) -> None: text = "![img](/files/11111111-1111-1111-1111-111111111111/image-preview)" image_upload = SimpleNamespace( id="11111111-1111-1111-1111-111111111111", @@ -583,7 +583,7 @@ class TestParagraphIndexProcessor: assert files == [] assert sum(1 for r in caplog.records if r.levelno == logging.WARNING) == 1 - def test_extract_images_from_segment_attachments(self, caplog) -> None: + def test_extract_images_from_segment_attachments(self, caplog: pytest.LogCaptureFixture) -> None: image_upload = SimpleNamespace( id="file-1", name="image", diff --git a/api/tests/unit_tests/core/rag/indexing/processor/test_qa_index_processor.py b/api/tests/unit_tests/core/rag/indexing/processor/test_qa_index_processor.py index 4ffd0a76433..6e5a4fabbb0 100644 --- a/api/tests/unit_tests/core/rag/indexing/processor/test_qa_index_processor.py +++ b/api/tests/unit_tests/core/rag/indexing/processor/test_qa_index_processor.py @@ -351,7 +351,9 @@ class TestQAIndexProcessor: assert all_qa_documents[0].metadata["answer"] == "A test." assert all_qa_documents[1].metadata["answer"] == "Coverage." - def test_format_qa_document_logs_errors(self, processor: QAIndexProcessor, fake_flask_app, caplog) -> None: + def test_format_qa_document_logs_errors( + self, processor: QAIndexProcessor, fake_flask_app, caplog: pytest.LogCaptureFixture + ) -> None: all_qa_documents: list[Document] = [] source_document = Document(page_content="source text", metadata={"origin": "doc-1"}) diff --git a/api/tests/unit_tests/core/workflow/graph_engine/layers/test_llm_quota.py b/api/tests/unit_tests/core/workflow/graph_engine/layers/test_llm_quota.py index 12c7f8113c7..97d7e4a937b 100644 --- a/api/tests/unit_tests/core/workflow/graph_engine/layers/test_llm_quota.py +++ b/api/tests/unit_tests/core/workflow/graph_engine/layers/test_llm_quota.py @@ -4,6 +4,8 @@ from datetime import datetime from types import SimpleNamespace from unittest.mock import MagicMock, patch +import pytest + from core.app.workflow.layers.llm_quota import LLMQuotaLayer from core.errors.error import QuotaExceededError from graphon.enums import BuiltinNodeTypes, WorkflowNodeExecutionStatus @@ -122,7 +124,7 @@ def test_precheck_ignores_non_quota_node() -> None: mock_check.assert_not_called() -def test_quota_error_is_handled_in_layer(caplog) -> None: +def test_quota_error_is_handled_in_layer(caplog: pytest.LogCaptureFixture) -> None: layer = LLMQuotaLayer(tenant_id="tenant-id") stop_event = threading.Event() layer.command_channel = MagicMock() diff --git a/api/tests/unit_tests/enterprise/telemetry/test_exporter.py b/api/tests/unit_tests/enterprise/telemetry/test_exporter.py index 674a2026131..e04046a1f0d 100644 --- a/api/tests/unit_tests/enterprise/telemetry/test_exporter.py +++ b/api/tests/unit_tests/enterprise/telemetry/test_exporter.py @@ -7,6 +7,8 @@ from datetime import UTC, datetime from types import SimpleNamespace from unittest.mock import MagicMock, patch +import pytest + from configs.enterprise import EnterpriseTelemetryConfig from enterprise.telemetry.entities import EnterpriseTelemetryCounter, EnterpriseTelemetryHistogram from enterprise.telemetry.exporter import EnterpriseExporter, _datetime_to_ns, _parse_otlp_headers @@ -533,7 +535,7 @@ def test_export_span_cross_workflow_parent_context() -> None: assert kwargs["context"] is not None -def test_export_span_logs_exception_on_error(caplog) -> None: +def test_export_span_logs_exception_on_error(caplog: pytest.LogCaptureFixture) -> None: """If the span block raises, the exception is logged and context is still cleared.""" exporter, mock_tracer, mock_span = _make_exporter_with_mock_tracer() @@ -546,7 +548,7 @@ def test_export_span_logs_exception_on_error(caplog) -> None: assert "bad.span" in caplog.text -def test_export_span_invalid_trace_correlation_logs_warning(caplog) -> None: +def test_export_span_invalid_trace_correlation_logs_warning(caplog: pytest.LogCaptureFixture) -> None: """Invalid UUID for trace_correlation_override triggers a warning log.""" exporter, mock_tracer, mock_span = _make_exporter_with_mock_tracer() diff --git a/api/tests/unit_tests/events/test_update_provider_when_message_created.py b/api/tests/unit_tests/events/test_update_provider_when_message_created.py index 4b2a6438f44..f9ac5d9678e 100644 --- a/api/tests/unit_tests/events/test_update_provider_when_message_created.py +++ b/api/tests/unit_tests/events/test_update_provider_when_message_created.py @@ -4,6 +4,7 @@ from types import SimpleNamespace from unittest.mock import patch from uuid import uuid4 +import pytest from sqlalchemy import create_engine, select from sqlalchemy.engine import Engine from sqlalchemy.orm import sessionmaker @@ -122,7 +123,9 @@ def test_message_created_paid_credit_accounting_uses_paid_pool() -> None: ) -def test_capped_credit_pool_accounting_skips_exhaustion_warning_when_full_amount_is_deducted(caplog) -> None: +def test_capped_credit_pool_accounting_skips_exhaustion_warning_when_full_amount_is_deducted( + caplog: pytest.LogCaptureFixture, +) -> None: with patch( "services.credit_pool_service.CreditPoolService.deduct_credits_capped", return_value=3, diff --git a/api/tests/unit_tests/extensions/test_ext_request_logging.py b/api/tests/unit_tests/extensions/test_ext_request_logging.py index 3d2f8541f63..70e80707882 100644 --- a/api/tests/unit_tests/extensions/test_ext_request_logging.py +++ b/api/tests/unit_tests/extensions/test_ext_request_logging.py @@ -56,18 +56,19 @@ def mock_response_receiver(monkeypatch: pytest.MonkeyPatch) -> mock.Mock: return mock_log_request_finished -@pytest.fixture -def mock_logger(monkeypatch: pytest.MonkeyPatch) -> logging.Logger: - _logger = mock.MagicMock(spec=logging.Logger) - monkeypatch.setattr(ext_request_logging, "logger", _logger) - return _logger - - @pytest.fixture def enable_request_logging(monkeypatch: pytest.MonkeyPatch): monkeypatch.setattr(dify_config, "ENABLE_REQUEST_LOGGING", True) +def _captured_records(caplog: pytest.LogCaptureFixture, level: int) -> list[logging.LogRecord]: + return [ + record + for record in caplog.records + if record.name == ext_request_logging.logger.name and record.levelno == level + ] + + class TestRequestLoggingExtension: def test_receiver_should_not_be_invoked_if_configuration_is_disabled( self, @@ -108,67 +109,74 @@ class TestRequestLoggingExtension: class TestLoggingLevel: @pytest.mark.usefixtures("enable_request_logging") - def test_logging_should_be_skipped_if_level_is_above_debug(self, enable_request_logging, mock_logger): - mock_logger.isEnabledFor.return_value = False + def test_logging_should_be_skipped_if_level_is_above_debug( + self, enable_request_logging, caplog: pytest.LogCaptureFixture + ): + caplog.set_level(logging.INFO, logger=ext_request_logging.logger.name) app = _get_test_app() init_app(app) with app.test_client() as client: client.post("/", json={_KEY_NEEDLE: _VALUE_NEEDLE}) - mock_logger.debug.assert_not_called() + assert not _captured_records(caplog, logging.DEBUG) class TestRequestReceiverLogging: @pytest.mark.usefixtures("enable_request_logging") - def test_non_json_request(self, enable_request_logging, mock_logger, mock_response_receiver): - mock_logger.isEnabledFor.return_value = True + def test_non_json_request(self, enable_request_logging, caplog: pytest.LogCaptureFixture, mock_response_receiver): + caplog.set_level(logging.DEBUG, logger=ext_request_logging.logger.name) app = _get_test_app() init_app(app) with app.test_client() as client: client.post("/", data="plain text") - assert mock_logger.debug.call_count == 1 - call_args = mock_logger.debug.call_args[0] - assert "Received Request" in call_args[0] - assert call_args[1] == "POST" - assert call_args[2] == "/" - assert "Request Body" not in call_args[0] + debug_records = _captured_records(caplog, logging.DEBUG) + assert len(debug_records) == 1 + record = debug_records[0] + assert "Received Request" in record.msg + assert record.args == ("POST", "/") + assert "Request Body" not in record.msg @pytest.mark.usefixtures("enable_request_logging") - def test_json_request(self, enable_request_logging, mock_logger, mock_response_receiver): - mock_logger.isEnabledFor.return_value = True + def test_json_request(self, enable_request_logging, caplog: pytest.LogCaptureFixture, mock_response_receiver): + caplog.set_level(logging.DEBUG, logger=ext_request_logging.logger.name) app = _get_test_app() init_app(app) with app.test_client() as client: client.post("/", json={_KEY_NEEDLE: _VALUE_NEEDLE}) - assert mock_logger.debug.call_count == 1 - call_args = mock_logger.debug.call_args[0] - assert "Received Request" in call_args[0] - assert "Request Body" in call_args[0] - assert call_args[1] == "POST" - assert call_args[2] == "/" - assert _KEY_NEEDLE in call_args[3] + debug_records = _captured_records(caplog, logging.DEBUG) + assert len(debug_records) == 1 + record = debug_records[0] + assert "Received Request" in record.msg + assert "Request Body" in record.msg + assert record.args[0] == "POST" + assert record.args[1] == "/" + assert _KEY_NEEDLE in record.args[2] @pytest.mark.usefixtures("enable_request_logging") - def test_json_request_with_empty_body(self, enable_request_logging, mock_logger, mock_response_receiver): - mock_logger.isEnabledFor.return_value = True + def test_json_request_with_empty_body( + self, enable_request_logging, caplog: pytest.LogCaptureFixture, mock_response_receiver + ): + caplog.set_level(logging.DEBUG, logger=ext_request_logging.logger.name) app = _get_test_app() init_app(app) with app.test_client() as client: client.post("/", headers={"Content-Type": "application/json"}) - assert mock_logger.debug.call_count == 1 - call_args = mock_logger.debug.call_args[0] - assert "Received Request" in call_args[0] - assert "Request Body" not in call_args[0] - assert call_args[1] == "POST" - assert call_args[2] == "/" + debug_records = _captured_records(caplog, logging.DEBUG) + assert len(debug_records) == 1 + record = debug_records[0] + assert "Received Request" in record.msg + assert "Request Body" not in record.msg + assert record.args == ("POST", "/") @pytest.mark.usefixtures("enable_request_logging") - def test_json_request_with_invalid_json_as_body(self, enable_request_logging, mock_logger, mock_response_receiver): - mock_logger.isEnabledFor.return_value = True + def test_json_request_with_invalid_json_as_body( + self, enable_request_logging, caplog: pytest.LogCaptureFixture, mock_response_receiver + ): + caplog.set_level(logging.DEBUG, logger=ext_request_logging.logger.name) app = _get_test_app() init_app(app) @@ -178,50 +186,53 @@ class TestRequestReceiverLogging: headers={"Content-Type": "application/json"}, data="{", ) - assert mock_logger.debug.call_count == 0 - assert mock_logger.exception.call_count == 1 - - exception_call_args = mock_logger.exception.call_args[0] - assert exception_call_args[0] == "Failed to parse JSON request" + assert not _captured_records(caplog, logging.DEBUG) + error_records = _captured_records(caplog, logging.ERROR) + assert len(error_records) == 1 + assert error_records[0].message == "Failed to parse JSON request" class TestResponseReceiverLogging: @pytest.mark.usefixtures("enable_request_logging") - def test_non_json_response(self, enable_request_logging, mock_logger): - mock_logger.isEnabledFor.return_value = True + def test_non_json_response(self, enable_request_logging, caplog: pytest.LogCaptureFixture): + caplog.set_level(logging.DEBUG, logger=ext_request_logging.logger.name) app = _get_test_app() response = Response( "OK", headers={"Content-Type": "text/plain"}, ) _log_request_finished(app, response) - assert mock_logger.debug.call_count == 1 - call_args = mock_logger.debug.call_args[0] - assert "Response" in call_args[0] - assert "200" in call_args[1] - assert call_args[2] == "text/plain" - assert "Response Body" not in call_args[0] + debug_records = _captured_records(caplog, logging.DEBUG) + assert len(debug_records) == 1 + record = debug_records[0] + assert "Response" in record.msg + assert "200" in record.args[0] + assert record.args[1] == "text/plain" + assert "Response Body" not in record.msg @pytest.mark.usefixtures("enable_request_logging") - def test_json_response(self, enable_request_logging, mock_logger, mock_response_receiver): - mock_logger.isEnabledFor.return_value = True + def test_json_response(self, enable_request_logging, caplog: pytest.LogCaptureFixture, mock_response_receiver): + caplog.set_level(logging.DEBUG, logger=ext_request_logging.logger.name) app = _get_test_app() response = Response( json.dumps({_KEY_NEEDLE: _VALUE_NEEDLE}), headers={"Content-Type": "application/json"}, ) _log_request_finished(app, response) - assert mock_logger.debug.call_count == 1 - call_args = mock_logger.debug.call_args[0] - assert "Response" in call_args[0] - assert "Response Body" in call_args[0] - assert "200" in call_args[1] - assert call_args[2] == "application/json" - assert _KEY_NEEDLE in call_args[3] + debug_records = _captured_records(caplog, logging.DEBUG) + assert len(debug_records) == 1 + record = debug_records[0] + assert "Response" in record.msg + assert "Response Body" in record.msg + assert "200" in record.args[0] + assert record.args[1] == "application/json" + assert _KEY_NEEDLE in record.args[2] @pytest.mark.usefixtures("enable_request_logging") - def test_json_request_with_invalid_json_as_body(self, enable_request_logging, mock_logger, mock_response_receiver): - mock_logger.isEnabledFor.return_value = True + def test_json_request_with_invalid_json_as_body( + self, enable_request_logging, caplog: pytest.LogCaptureFixture, mock_response_receiver + ): + caplog.set_level(logging.DEBUG, logger=ext_request_logging.logger.name) app = _get_test_app() response = Response( @@ -229,11 +240,10 @@ class TestResponseReceiverLogging: headers={"Content-Type": "application/json"}, ) _log_request_finished(app, response) - assert mock_logger.debug.call_count == 0 - assert mock_logger.exception.call_count == 1 - - exception_call_args = mock_logger.exception.call_args[0] - assert exception_call_args[0] == "Failed to parse JSON response" + assert not _captured_records(caplog, logging.DEBUG) + error_records = _captured_records(caplog, logging.ERROR) + assert len(error_records) == 1 + assert error_records[0].message == "Failed to parse JSON response" class TestResponseUnmodified: @@ -267,7 +277,7 @@ class TestResponseUnmodified: class TestRequestFinishedInfoAccessLine: def test_info_access_log_includes_method_path_status_duration_trace_id( - self, monkeypatch: pytest.MonkeyPatch, caplog + self, monkeypatch: pytest.MonkeyPatch, caplog: pytest.LogCaptureFixture ): """Ensure INFO access line contains expected fields with computed duration and trace id.""" app = _get_test_app() diff --git a/api/tests/unit_tests/services/enterprise/test_plugin_manager_service.py b/api/tests/unit_tests/services/enterprise/test_plugin_manager_service.py index 759d9079348..b0db3bc248b 100644 --- a/api/tests/unit_tests/services/enterprise/test_plugin_manager_service.py +++ b/api/tests/unit_tests/services/enterprise/test_plugin_manager_service.py @@ -5,6 +5,7 @@ This module covers the pre-uninstall plugin hook behavior: - API failure: soft-fail (logs and does not re-raise) """ +import logging from unittest.mock import patch import pytest @@ -43,18 +44,16 @@ class TestTryPreUninstallPlugin: timeout=dify_config.ENTERPRISE_REQUEST_TIMEOUT, ) - def test_try_pre_uninstall_plugin_http_error_soft_fails(self): + def test_try_pre_uninstall_plugin_http_error_soft_fails(self, caplog: pytest.LogCaptureFixture): body = PreUninstallPluginRequest( tenant_id="tenant-456", plugin_unique_identifier="com.example.other_plugin", ) + caplog.set_level(logging.ERROR, logger="services.enterprise.plugin_manager_service") - with ( - patch( - "services.enterprise.plugin_manager_service.EnterprisePluginManagerRequest.send_request" - ) as mock_send_request, - patch("services.enterprise.plugin_manager_service.logger") as mock_logger, - ): + with patch( + "services.enterprise.plugin_manager_service.EnterprisePluginManagerRequest.send_request" + ) as mock_send_request: mock_send_request.side_effect = HTTPStatusError( "502 Bad Gateway", request=None, @@ -69,20 +68,22 @@ class TestTryPreUninstallPlugin: json={"tenant_id": "tenant-456", "plugin_unique_identifier": "com.example.other_plugin"}, timeout=dify_config.ENTERPRISE_REQUEST_TIMEOUT, ) - mock_logger.exception.assert_called_once() + assert len(caplog.records) == 1 + assert caplog.messages[0] == ( + "failed to perform pre uninstall plugin hook. tenant_id: tenant-456, " + "plugin_unique_identifier: com.example.other_plugin" + ) - def test_try_pre_uninstall_plugin_generic_exception_soft_fails(self): + def test_try_pre_uninstall_plugin_generic_exception_soft_fails(self, caplog: pytest.LogCaptureFixture): body = PreUninstallPluginRequest( tenant_id="tenant-789", plugin_unique_identifier="com.example.failing_plugin", ) + caplog.set_level(logging.ERROR, logger="services.enterprise.plugin_manager_service") - with ( - patch( - "services.enterprise.plugin_manager_service.EnterprisePluginManagerRequest.send_request" - ) as mock_send_request, - patch("services.enterprise.plugin_manager_service.logger") as mock_logger, - ): + with patch( + "services.enterprise.plugin_manager_service.EnterprisePluginManagerRequest.send_request" + ) as mock_send_request: mock_send_request.side_effect = ConnectionError("network unreachable") PluginManagerService.try_pre_uninstall_plugin(body) @@ -93,7 +94,11 @@ class TestTryPreUninstallPlugin: json={"tenant_id": "tenant-789", "plugin_unique_identifier": "com.example.failing_plugin"}, timeout=dify_config.ENTERPRISE_REQUEST_TIMEOUT, ) - mock_logger.exception.assert_called_once() + assert len(caplog.records) == 1 + assert caplog.messages[0] == ( + "failed to perform pre uninstall plugin hook. tenant_id: tenant-789, " + "plugin_unique_identifier: com.example.failing_plugin" + ) class TestCheckCredentialPolicyCompliance: diff --git a/api/tests/unit_tests/services/retention/workflow_run/test_restore_archived_workflow_run.py b/api/tests/unit_tests/services/retention/workflow_run/test_restore_archived_workflow_run.py index 628e4e594dd..4768215210e 100644 --- a/api/tests/unit_tests/services/retention/workflow_run/test_restore_archived_workflow_run.py +++ b/api/tests/unit_tests/services/retention/workflow_run/test_restore_archived_workflow_run.py @@ -8,6 +8,7 @@ and both positive and negative test scenarios. import io import json +import logging import zipfile from datetime import datetime from unittest.mock import Mock, create_autospec, patch @@ -312,16 +313,16 @@ class TestGetSchemaVersion: result = restore._get_schema_version(manifest) assert result == "1.0" - def test_missing_schema_version_defaults_to_1_0(self): + def test_missing_schema_version_defaults_to_1_0(self, caplog: pytest.LogCaptureFixture): """Should default to 1.0 when schema_version is missing.""" restore = WorkflowRunRestore() manifest = {"tables": {}} + caplog.set_level(logging.WARNING, logger="services.retention.workflow_run.restore_archived_workflow_run") - with patch("services.retention.workflow_run.restore_archived_workflow_run.logger") as mock_logger: - result = restore._get_schema_version(manifest) + result = restore._get_schema_version(manifest) assert result == "1.0" - mock_logger.warning.assert_called_once_with("Manifest missing schema_version; defaulting to 1.0") + assert "Manifest missing schema_version; defaulting to 1.0" in caplog.messages def test_unsupported_schema_version_raises_error(self): """Should raise ValueError for unsupported schema version.""" @@ -492,19 +493,19 @@ class TestRestoreTableRecords: """Tests for WorkflowRunRestore._restore_table_records method.""" @patch("services.retention.workflow_run.restore_archived_workflow_run.TABLE_MODELS") - def test_unknown_table_returns_zero(self, mock_table_models): + def test_unknown_table_returns_zero(self, mock_table_models, caplog: pytest.LogCaptureFixture): """Should return 0 for unknown table.""" restore = WorkflowRunRestore() mock_table_models.get.return_value = None mock_session = Mock() records = [{"id": "test"}] + caplog.set_level(logging.WARNING, logger="services.retention.workflow_run.restore_archived_workflow_run") - with patch("services.retention.workflow_run.restore_archived_workflow_run.logger") as mock_logger: - result = restore._restore_table_records(mock_session, "unknown_table", records, schema_version="1.0") + result = restore._restore_table_records(mock_session, "unknown_table", records, schema_version="1.0") assert result == 0 - mock_logger.warning.assert_called_once_with("Unknown table: %s", "unknown_table") + assert "Unknown table: unknown_table" in caplog.messages def test_empty_records_returns_zero(self): """Should return 0 for empty records list.""" diff --git a/api/tests/unit_tests/services/test_human_input_service.py b/api/tests/unit_tests/services/test_human_input_service.py index d9d81d66566..5c26a9ef57d 100644 --- a/api/tests/unit_tests/services/test_human_input_service.py +++ b/api/tests/unit_tests/services/test_human_input_service.py @@ -673,7 +673,7 @@ def test_enqueue_resume_workflow_not_found(mocker: MockerFixture, mock_session_f assert "WorkflowRun not found" in str(excinfo.value) -def test_enqueue_resume_app_not_found(mocker, mock_session_factory, caplog): +def test_enqueue_resume_app_not_found(mocker, mock_session_factory, caplog: pytest.LogCaptureFixture): session_factory, session = mock_session_factory service = HumanInputService(session_factory) diff --git a/api/tests/unit_tests/services/test_webhook_service.py b/api/tests/unit_tests/services/test_webhook_service.py index a2b56fe7771..d36c45d7777 100644 --- a/api/tests/unit_tests/services/test_webhook_service.py +++ b/api/tests/unit_tests/services/test_webhook_service.py @@ -1,3 +1,4 @@ +import logging from io import BytesIO from unittest.mock import MagicMock, patch @@ -159,7 +160,9 @@ class TestWebhookServiceUnit: assert result == "application/octet-stream" - def test_detect_binary_mimetype_handles_magic_exception(self, monkeypatch: pytest.MonkeyPatch): + def test_detect_binary_mimetype_handles_magic_exception( + self, monkeypatch: pytest.MonkeyPatch, caplog: pytest.LogCaptureFixture + ): """Fallback MIME type should be used when python-magic raises an exception.""" try: import magic as real_magic @@ -169,12 +172,12 @@ class TestWebhookServiceUnit: fake_magic = MagicMock() fake_magic.from_buffer.side_effect = real_magic.MagicException("magic error") monkeypatch.setattr("services.trigger.webhook_service.magic", fake_magic) + caplog.set_level(logging.DEBUG, logger="services.trigger.webhook_service") - with patch("services.trigger.webhook_service.logger", autospec=True) as mock_logger: - result = WebhookService._detect_binary_mimetype(b"binary data") + result = WebhookService._detect_binary_mimetype(b"binary data") - assert result == "application/octet-stream" - mock_logger.debug.assert_called_once() + assert result == "application/octet-stream" + assert "python-magic detection failed for octet-stream payload" in caplog.messages def test_extract_webhook_data_invalid_json(self): """Test webhook data extraction with invalid JSON.""" From f665bcac95f6a3b03d0b0315fcca8bafa34e6f06 Mon Sep 17 00:00:00 2001 From: Stephen Zhou Date: Wed, 24 Jun 2026 15:10:17 +0800 Subject: [PATCH 4/9] chore(web): clean up unused production code (#37854) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .../skills/how-to-write-component/SKILL.md | 204 +- .github/workflows/style.yml | 4 + eslint-suppressions.json | 324 +- web/.storybook/utils/form-story-wrapper.tsx | 88 - .../app-sidebar/sidebar-shell-flow.test.tsx | 151 - web/__tests__/base/form-demo-flow.test.tsx | 65 - .../billing/billing-integration.test.tsx | 79 +- web/__tests__/header/nav-flow.test.tsx | 168 - web/__tests__/navigation-utils.test.ts | 401 --- .../plugins/plugin-data-utilities.test.ts | 159 - .../plugin-page-filter-management.test.tsx | 120 - web/__tests__/xss-prevention.test.tsx | 23 +- .../__tests__/app-sidebar-dropdown.spec.tsx | 194 -- .../dataset-sidebar-dropdown.spec.tsx | 216 -- .../app-sidebar/__tests__/index.spec.tsx | 217 -- .../app-sidebar/app-sidebar-dropdown.tsx | 119 - .../app-sidebar/dataset-sidebar-dropdown.tsx | 153 - web/app/components/app-sidebar/index.tsx | 134 - .../snippet-info/__tests__/index.spec.tsx | 60 - .../app-sidebar/snippet-info/index.tsx | 46 - .../select-type-item/__tests__/index.spec.tsx | 45 - .../config-var/select-type-item/index.tsx | 47 - .../__tests__/index.spec.tsx | 908 ------ .../config/assistant-type-picker/index.tsx | 183 -- .../ctrl-btn-group/__tests__/index.spec.tsx | 42 - .../configuration/ctrl-btn-group/index.tsx | 24 - .../ctrl-btn-group/style.module.css | 6 - .../__tests__/utils.spec.ts | 29 - .../configuration/prompt-value-panel/utils.ts | 13 - .../apps/__tests__/new-app-card.spec.tsx | 283 -- web/app/components/apps/new-app-card.tsx | 186 -- .../components/base/create-resource-card.tsx | 43 - .../__tests__/index.spec.tsx | 17 - .../__tests__/placeholder.spec.tsx | 74 - .../field/mixed-variable-text-input/index.tsx | 39 - .../mixed-variable-text-input/placeholder.tsx | 49 - .../base/__tests__/index.spec.tsx | 94 - .../base/form/form-scenarios/base/index.tsx | 64 - .../base/form/form-scenarios/base/types.ts | 8 - .../demo/__tests__/contact-fields.spec.tsx | 24 - .../demo/__tests__/index.spec.tsx | 69 - .../demo/__tests__/shared-options.spec.tsx | 16 - .../demo/__tests__/types.spec.ts | 39 - .../form-scenarios/demo/contact-fields.tsx | 35 - .../base/form/form-scenarios/demo/index.tsx | 68 - .../form-scenarios/demo/shared-options.tsx | 14 - .../base/form/form-scenarios/demo/types.ts | 32 - .../input-field/__tests__/utils.spec.ts | 178 -- .../form/form-scenarios/input-field/utils.ts | 76 - .../node-panel/__tests__/field.spec.tsx | 151 - .../node-panel/__tests__/types.spec.ts | 7 - .../form/form-scenarios/node-panel/field.tsx | 240 -- .../form/form-scenarios/node-panel/types.ts | 40 - .../components/base/form/index.stories.tsx | 560 ---- .../src/image/llm/BaichuanTextCn.module.css | 5 - .../icons/src/image/llm/BaichuanTextCn.tsx | 20 - .../icons/src/image/llm/Minimax.module.css | 5 - .../base/icons/src/image/llm/Minimax.tsx | 20 - .../src/image/llm/MinimaxText.module.css | 5 - .../base/icons/src/image/llm/MinimaxText.tsx | 20 - .../icons/src/image/llm/Tongyi.module.css | 5 - .../base/icons/src/image/llm/Tongyi.tsx | 20 - .../icons/src/image/llm/TongyiText.module.css | 5 - .../base/icons/src/image/llm/TongyiText.tsx | 20 - .../src/image/llm/TongyiTextCn.module.css | 5 - .../base/icons/src/image/llm/TongyiTextCn.tsx | 20 - .../base/icons/src/image/llm/Wxyy.module.css | 5 - .../base/icons/src/image/llm/Wxyy.tsx | 20 - .../icons/src/image/llm/WxyyText.module.css | 5 - .../base/icons/src/image/llm/WxyyText.tsx | 20 - .../icons/src/image/llm/WxyyTextCn.module.css | 5 - .../base/icons/src/image/llm/WxyyTextCn.tsx | 20 - .../base/icons/src/public/billing/ArCube1.tsx | 20 - .../icons/src/public/billing/Asterisk.tsx | 20 - .../icons/src/public/billing/Buildings.tsx | 20 - .../base/icons/src/public/billing/Diamond.tsx | 20 - .../base/icons/src/public/billing/Group2.tsx | 20 - .../icons/src/public/billing/Keyframe.tsx | 20 - .../icons/src/public/billing/Sparkles.tsx | 20 - .../icons/src/public/billing/SparklesSoft.tsx | 20 - .../base/icons/src/public/common/D.tsx | 20 - .../public/common/DiagonalDividingLine.tsx | 20 - .../base/icons/src/public/common/Dify.tsx | 20 - .../base/icons/src/public/common/Lock.tsx | 20 - .../src/public/common/MessageChatSquare.tsx | 20 - .../src/public/common/MultiPathRetrieval.tsx | 20 - .../icons/src/public/common/NTo1Retrieval.tsx | 20 - .../base/icons/src/public/knowledge/File.tsx | 20 - .../icons/src/public/knowledge/Watercrawl.tsx | 20 - .../public/knowledge/dataset-card/Graph.tsx | 20 - .../base/icons/src/public/llm/Anthropic.tsx | 20 - .../icons/src/public/llm/AnthropicText.tsx | 20 - .../src/public/llm/AzureOpenaiService.tsx | 20 - .../src/public/llm/AzureOpenaiServiceText.tsx | 20 - .../base/icons/src/public/llm/Azureai.tsx | 20 - .../base/icons/src/public/llm/AzureaiText.tsx | 20 - .../base/icons/src/public/llm/Baichuan.tsx | 20 - .../icons/src/public/llm/BaichuanText.tsx | 20 - .../base/icons/src/public/llm/Chatglm.tsx | 20 - .../base/icons/src/public/llm/ChatglmText.tsx | 20 - .../base/icons/src/public/llm/Cohere.tsx | 20 - .../base/icons/src/public/llm/CohereText.tsx | 20 - .../base/icons/src/public/llm/Gpt3.tsx | 20 - .../base/icons/src/public/llm/Gpt4.tsx | 20 - .../base/icons/src/public/llm/Huggingface.tsx | 20 - .../icons/src/public/llm/HuggingfaceText.tsx | 20 - .../src/public/llm/HuggingfaceTextHub.tsx | 20 - .../icons/src/public/llm/IflytekSpark.tsx | 20 - .../icons/src/public/llm/IflytekSparkText.tsx | 20 - .../src/public/llm/IflytekSparkTextCn.tsx | 20 - .../base/icons/src/public/llm/Jina.tsx | 20 - .../base/icons/src/public/llm/JinaText.tsx | 20 - .../base/icons/src/public/llm/Localai.tsx | 20 - .../base/icons/src/public/llm/LocalaiText.tsx | 20 - .../base/icons/src/public/llm/Microsoft.tsx | 20 - .../base/icons/src/public/llm/OpenaiBlack.tsx | 20 - .../base/icons/src/public/llm/OpenaiBlue.tsx | 20 - .../base/icons/src/public/llm/OpenaiGreen.tsx | 20 - .../base/icons/src/public/llm/OpenaiTeal.tsx | 20 - .../base/icons/src/public/llm/OpenaiText.tsx | 20 - .../src/public/llm/OpenaiTransparent.tsx | 20 - .../icons/src/public/llm/OpenaiViolet.tsx | 20 - .../base/icons/src/public/llm/Openllm.tsx | 20 - .../base/icons/src/public/llm/OpenllmText.tsx | 20 - .../base/icons/src/public/llm/Replicate.tsx | 20 - .../icons/src/public/llm/ReplicateText.tsx | 20 - .../icons/src/public/llm/XorbitsInference.tsx | 20 - .../src/public/llm/XorbitsInferenceText.tsx | 20 - .../base/icons/src/public/llm/Zhipuai.tsx | 20 - .../base/icons/src/public/llm/ZhipuaiText.tsx | 20 - .../icons/src/public/llm/ZhipuaiTextCn.tsx | 20 - .../base/icons/src/public/model/Checked.tsx | 20 - .../base/icons/src/public/other/Icon3Dots.tsx | 20 - .../base/icons/src/public/plugins/Google.tsx | 20 - .../icons/src/public/plugins/WebReader.tsx | 20 - .../icons/src/public/plugins/Wikipedia.tsx | 20 - .../base/icons/src/public/thought/DataSet.tsx | 20 - .../base/icons/src/public/thought/Search.tsx | 20 - .../icons/src/public/thought/ThoughtList.tsx | 20 - .../icons/src/public/thought/WebReader.tsx | 20 - .../icons/src/vender/knowledge/Divider.tsx | 20 - .../line/alertsAndFeedback/AlertTriangle.tsx | 20 - .../line/alertsAndFeedback/ThumbsDown.tsx | 20 - .../line/alertsAndFeedback/ThumbsUp.tsx | 20 - .../vender/line/arrows/ChevronDownDouble.tsx | 20 - .../icons/src/vender/line/arrows/IconR.tsx | 20 - .../src/vender/line/arrows/RefreshCw05.tsx | 20 - .../src/vender/line/arrows/ReverseLeft.tsx | 20 - .../icons/src/vender/line/arrows/index.ts | 2 +- .../src/vender/line/communication/AiText.tsx | 20 - .../src/vender/line/communication/ChatBot.tsx | 20 - .../vender/line/communication/CuteRobot.tsx | 20 - .../line/development/ArtificialBrain.tsx | 20 - .../line/development/BarChartSquare02.tsx | 20 - .../vender/line/development/CodeBrowser.tsx | 20 - .../src/vender/line/development/Container.tsx | 20 - .../vender/line/development/Database01.tsx | 20 - .../vender/line/development/Database03.tsx | 20 - .../vender/line/development/FileHeart02.tsx | 20 - .../vender/line/development/GitBranch01.tsx | 20 - .../line/development/PromptEngineering.tsx | 20 - .../vender/line/development/PuzzlePiece01.tsx | 20 - .../line/development/TerminalSquare.tsx | 20 - .../src/vender/line/development/Variable.tsx | 20 - .../src/vender/line/development/Webhooks.tsx | 20 - .../src/vender/line/editor/AlignLeft.tsx | 20 - .../src/vender/line/editor/BezierCurve03.tsx | 20 - .../icons/src/vender/line/editor/Collapse.tsx | 20 - .../icons/src/vender/line/editor/Colors.tsx | 20 - .../src/vender/line/editor/LeftIndent02.tsx | 20 - .../vender/line/editor/LetterSpacing01.tsx | 20 - .../src/vender/line/editor/TypeSquare.tsx | 20 - .../icons/src/vender/line/files/File02.tsx | 20 - .../src/vender/line/files/FileCheck02.tsx | 20 - .../src/vender/line/files/FileDownload02.tsx | 20 - .../src/vender/line/files/FilePlus01.tsx | 20 - .../src/vender/line/files/FilePlus02.tsx | 20 - .../icons/src/vender/line/files/FileText.tsx | 20 - .../src/vender/line/files/FileUpload.tsx | 20 - .../base/icons/src/vender/line/files/index.ts | 3 - .../financeAndECommerce/CoinsStacked01.tsx | 20 - .../line/financeAndECommerce/GoldCoin.tsx | 20 - .../line/financeAndECommerce/ReceiptList.tsx | 20 - .../vender/line/financeAndECommerce/Tag01.tsx | 20 - .../icons/src/vender/line/general/AtSign.tsx | 20 - .../src/vender/line/general/Bookmark.tsx | 20 - .../src/vender/line/general/CheckDone01.tsx | 20 - .../vender/line/general/ChecklistSquare.tsx | 20 - .../src/vender/line/general/DotsGrid.tsx | 20 - .../icons/src/vender/line/general/Edit02.tsx | 20 - .../icons/src/vender/line/general/Edit04.tsx | 20 - .../icons/src/vender/line/general/Edit05.tsx | 20 - .../icons/src/vender/line/general/Hash02.tsx | 20 - .../src/vender/line/general/HelpQuestion.tsx | 20 - .../src/vender/line/general/InfoCircle.tsx | 20 - .../icons/src/vender/line/general/LogIn04.tsx | 20 - .../src/vender/line/general/LogOut01.tsx | 20 - .../src/vender/line/general/LogOut04.tsx | 20 - .../icons/src/vender/line/general/Menu01.tsx | 20 - .../icons/src/vender/line/general/Pin01.tsx | 20 - .../icons/src/vender/line/general/Refresh.tsx | 20 - .../src/vender/line/general/Settings04.tsx | 20 - .../src/vender/line/general/Target04.tsx | 20 - .../src/vender/line/general/Upload03.tsx | 20 - .../src/vender/line/general/UploadCloud01.tsx | 20 - .../icons/src/vender/line/general/index.ts | 1 - .../src/vender/line/layout/AlignLeft01.tsx | 20 - .../src/vender/line/layout/AlignRight01.tsx | 20 - .../icons/src/vender/line/layout/Grid01.tsx | 20 - .../src/vender/line/layout/LayoutGrid02.tsx | 20 - .../icons/src/vender/line/layout/index.ts | 1 - .../line/mediaAndDevices/Microphone01.tsx | 20 - .../line/mediaAndDevices/PlayCircle.tsx | 20 - .../vender/line/mediaAndDevices/SlidersH.tsx | 20 - .../vender/line/mediaAndDevices/Speaker.tsx | 20 - .../icons/src/vender/line/others/Colors.tsx | 20 - .../src/vender/line/others/SearchMenu.tsx | 20 - .../icons/src/vender/line/others/Tools.tsx | 20 - .../src/vender/line/shapes/CubeOutline.tsx | 20 - .../src/vender/line/time/ClockPlaySlim.tsx | 20 - .../src/vender/line/time/ClockRefresh.tsx | 20 - .../icons/src/vender/line/users/User01.tsx | 20 - .../icons/src/vender/line/users/Users01.tsx | 20 - .../icons/src/vender/line/weather/Stars02.tsx | 20 - .../icons/src/vender/other/AnthropicText.tsx | 20 - .../solid/FinanceAndECommerce/GoldCoin.tsx | 20 - .../solid/arrows/ArrowDownDoubleLine.tsx | 20 - .../vender/solid/arrows/ArrowUpDoubleLine.tsx | 20 - .../src/vender/solid/arrows/ChevronDown.tsx | 20 - .../src/vender/solid/arrows/HighPriority.tsx | 20 - .../src/vender/solid/communication/AiText.tsx | 20 - .../vender/solid/communication/EditList.tsx | 20 - .../solid/communication/MessageDotsCircle.tsx | 20 - .../communication/MessageHeartCircle.tsx | 20 - .../communication/MessageSmileSquare.tsx | 20 - .../src/vender/solid/communication/Send03.tsx | 20 - .../solid/development/BarChartSquare02.tsx | 20 - .../vender/solid/development/Container.tsx | 20 - .../vender/solid/development/Database02.tsx | 20 - .../vender/solid/development/Database03.tsx | 20 - .../vender/solid/development/FileHeart02.tsx | 20 - .../solid/development/PatternRecognition.tsx | 20 - .../solid/development/PromptEngineering.tsx | 20 - .../solid/development/PuzzlePiece01.tsx | 20 - .../src/vender/solid/development/Semantic.tsx | 20 - .../src/vender/solid/editor/Citations.tsx | 20 - .../icons/src/vender/solid/editor/Colors.tsx | 20 - .../src/vender/solid/editor/Paragraph.tsx | 20 - .../src/vender/solid/editor/TypeSquare.tsx | 20 - .../src/vender/solid/education/BubbleText.tsx | 20 - .../src/vender/solid/education/Heart02.tsx | 20 - .../icons/src/vender/solid/education/index.ts | 1 - .../src/vender/solid/files/FileSearch02.tsx | 20 - .../vender/solid/general/AnswerTriangle.tsx | 20 - .../src/vender/solid/general/CheckDone01.tsx | 20 - .../icons/src/vender/solid/general/Edit04.tsx | 20 - .../src/vender/solid/general/PlusCircle.tsx | 20 - .../vender/solid/general/QuestionTriangle.tsx | 20 - .../src/vender/solid/general/SearchMd.tsx | 20 - .../src/vender/solid/general/ZapNarrow.tsx | 20 - .../icons/src/vender/solid/layout/Grid01.tsx | 20 - .../mediaAndDevices/AudioSupportIcon.tsx | 20 - .../mediaAndDevices/DocumentSupportIcon.tsx | 20 - .../solid/mediaAndDevices/MagicEyes.tsx | 20 - .../solid/mediaAndDevices/MagicWand.tsx | 20 - .../solid/mediaAndDevices/Microphone01.tsx | 20 - .../src/vender/solid/mediaAndDevices/Play.tsx | 20 - .../vender/solid/mediaAndDevices/Robot.tsx | 20 - .../solid/mediaAndDevices/Sliders02.tsx | 20 - .../vender/solid/mediaAndDevices/Speaker.tsx | 20 - .../mediaAndDevices/VideoSupportIcon.tsx | 20 - .../icons/src/vender/solid/shapes/Star04.tsx | 20 - .../icons/src/vender/solid/shapes/Star06.tsx | 20 - .../icons/src/vender/solid/users/User01.tsx | 20 - .../icons/src/vender/solid/users/Users01.tsx | 20 - .../src/vender/solid/users/UsersPlus.tsx | 20 - .../src/vender/workflow/IterationStart.tsx | 20 - .../__tests__/audio-preview.spec.tsx | 113 - .../__tests__/chat-image-uploader.spec.tsx | 314 -- .../__tests__/video-preview.spec.tsx | 117 - .../base/image-uploader/audio-preview.tsx | 57 - .../image-uploader/chat-image-uploader.tsx | 159 - .../base/image-uploader/video-preview.tsx | 57 - .../base/logo/__tests__/logo-site.spec.tsx | 22 - .../components/base/logo/index.stories.tsx | 82 - web/app/components/base/logo/logo-site.tsx | 22 - .../plugins/__tests__/tree-view.spec.tsx | 58 - .../base/prompt-editor/plugins/tree-view.tsx | 19 - .../base/spinner/__tests__/index.spec.tsx | 48 - .../components/base/spinner/index.stories.tsx | 52 - web/app/components/base/spinner/index.tsx | 26 - .../__tests__/index.spec.tsx | 46 - .../with-input-validation/index.stories.tsx | 515 --- .../base/with-input-validation/index.tsx | 24 - .../__tests__/index.spec.tsx | 120 - .../billing/header-billing-btn/index.tsx | 60 - .../datasets/api/__tests__/index.spec.tsx | 24 - web/app/components/datasets/api/index.tsx | 9 - .../common/retrieval-method-info/index.tsx | 1 + .../preview-item/__tests__/index.spec.tsx | 660 ---- .../create/step-two/preview-item/index.tsx | 82 - .../__tests__/index.spec.tsx | 608 ---- .../stop-embedding-modal/index.module.css | 36 - .../create/stop-embedding-modal/index.tsx | 61 - .../jina-reader/__tests__/base.spec.tsx | 321 -- .../base/__tests__/url-input.spec.tsx | 196 -- .../website/jina-reader/base/url-input.tsx | 50 - .../online-drive/__tests__/header.spec.tsx | 22 - .../online-drive/__tests__/index.spec.tsx | 1749 ++--------- .../connect/__tests__/index.spec.tsx | 494 --- .../online-drive/connect/index.tsx | 50 - .../data-source/online-drive/header.tsx | 48 - .../__tests__/operation-item.spec.tsx | 86 - .../list/dataset-card/operation-item.tsx | 32 - .../new-dataset-card/__tests__/index.spec.tsx | 139 - .../__tests__/option.spec.tsx | 77 - .../datasets/list/new-dataset-card/index.tsx | 36 - .../datasets/list/new-dataset-card/option.tsx | 47 - .../datasets/preview/__tests__/index.spec.tsx | 25 - web/app/components/datasets/preview/index.tsx | 3 - .../header/__tests__/index.spec.tsx | 257 -- .../workplace-selector/index.tsx | 1 + .../__tests__/index.spec.tsx | 126 - .../Integrations-page/index.module.css | 24 - .../Integrations-page/index.tsx | 80 - .../key-validator/KeyInput.tsx | 78 - .../account-setting/key-validator/Operate.tsx | 99 - .../key-validator/__tests__/KeyInput.spec.tsx | 106 - .../key-validator/__tests__/Operate.spec.tsx | 103 - .../key-validator/__tests__/hooks.spec.ts | 82 - .../key-validator/__tests__/index.spec.tsx | 162 - .../key-validator/declarations.ts | 30 - .../account-setting/key-validator/hooks.ts | 32 - .../account-setting/key-validator/index.tsx | 123 - .../__tests__/config-provider.spec.tsx | 116 - .../model-auth/config-provider.tsx | 90 - .../__tests__/priority-use-tip.spec.tsx | 45 - .../provider-added-card/priority-use-tip.tsx | 24 - .../header/app-back/__tests__/index.spec.tsx | 36 - web/app/components/header/app-back/index.tsx | 37 - .../header/app-nav/__tests__/index.spec.tsx | 437 --- web/app/components/header/app-nav/index.tsx | 145 - .../dataset-nav/__tests__/index.spec.tsx | 291 -- .../components/header/dataset-nav/index.tsx | 114 - .../explore-nav/__tests__/index.spec.tsx | 48 - .../components/header/explore-nav/index.tsx | 37 - web/app/components/header/index.tsx | 120 - .../header/nav/__tests__/index.spec.tsx | 362 --- web/app/components/header/nav/index.tsx | 115 - .../nav/nav-selector/__tests__/index.spec.tsx | 306 -- .../header/nav/nav-selector/index.tsx | 241 -- .../plugins-nav/__tests__/index.spec.tsx | 115 - .../components/header/plugins-nav/index.tsx | 64 - .../header/tools-nav/__tests__/index.spec.tsx | 80 - web/app/components/header/tools-nav/index.tsx | 37 - web/app/components/next-route-state/atoms.ts | 2 - .../plugin-auth/__tests__/utils.spec.ts | 55 - .../components/plugins/plugin-auth/utils.ts | 10 - .../tool-selector/__tests__/index.spec.tsx | 2754 ----------------- .../components/__tests__/index.spec.ts | 22 - .../__tests__/tool-credentials-form.spec.tsx | 120 - .../tool-selector/components/index.ts | 2 +- .../components/tool-credentials-form.tsx | 106 - .../hooks/__tests__/index.spec.ts | 9 - .../tool-selector/hooks/index.ts | 2 - .../__tests__/constant.spec.ts | 32 - .../__tests__/index.spec.tsx | 235 +- .../filter-management/__tests__/store.spec.ts | 85 - .../plugin-page/filter-management/constant.ts | 11 - .../plugin-page/filter-management/store.ts | 27 - .../panel/input-field/editor/form/schema.ts | 4 +- .../components/share/__tests__/utils.spec.ts | 71 - web/app/components/share/utils.ts | 7 - ...use-create-snippet-from-selection.spec.tsx | 275 -- .../use-create-snippet-from-selection.tsx | 329 -- .../tools/labels/__tests__/store.spec.ts | 41 - web/app/components/tools/labels/store.ts | 15 - .../use-check-vertical-scrollbar.spec.ts | 108 - .../use-check-vertical-scrollbar.ts | 32 - .../use-workflow-interactions.spec.tsx | 308 -- .../hooks/__tests__/use-workflow-zoom.spec.ts | 86 - .../hooks/use-workflow-interactions.ts | 1 - .../workflow/hooks/use-workflow-zoom.ts | 31 - .../input-field/__tests__/index.spec.tsx | 26 - .../_base/components/input-field/add.tsx | 12 - .../_base/components/input-field/index.tsx | 24 - .../__tests__/index.spec.tsx | 114 - .../__tests__/placeholder.spec.tsx | 78 - .../mixed-variable-text-input/index.tsx | 62 - .../mixed-variable-text-input/placeholder.tsx | 52 - .../__tests__/index.spec.tsx | 52 - .../components/support-var-input/index.tsx | 68 - .../assigned-var-reference-popup.spec.tsx | 72 - .../variable/assigned-var-reference-popup.tsx | 42 - .../_base/hooks/snippet-input-field-vars.ts | 2 +- .../use-single-run-form-params.spec.ts | 144 - .../nodes/agent/use-single-run-form-params.ts | 96 - .../code/__tests__/dependency-picker.spec.tsx | 39 - .../workflow/nodes/code/dependency-picker.tsx | 94 - .../components/workflow/nodes/code/types.ts | 5 - .../nodes/http/__tests__/integration.spec.tsx | 762 ----- .../components/key-value/bulk-edit/index.tsx | 63 - .../nodes/loop/__tests__/integration.spec.tsx | 667 ---- .../components/condition-files-list-value.tsx | 105 - .../nodes/loop/components/condition-value.tsx | 87 - .../workflow/nodes/loop/insert-block.tsx | 64 - .../__tests__/input-var-list.spec.tsx | 519 ---- .../nodes/tool/components/input-var-list.tsx | 259 -- .../utils/__tests__/form-helpers.spec.ts | 308 -- .../trigger-plugin/utils/form-helpers.ts | 55 - .../__tests__/integration.spec.tsx | 546 ---- .../__tests__/node-variable-item.spec.tsx | 68 - .../components/node-variable-item.tsx | 129 - .../run/__tests__/loop-result-panel.spec.tsx | 113 - .../workflow/run/loop-result-panel.tsx | 144 - .../__tests__/graph-to-log-struct.spec.ts | 138 - .../format-log/agent/__tests__/index.spec.ts | 72 +- .../run/utils/format-log/agent/data.ts | 179 -- .../utils/format-log/graph-to-log-struct.ts | 364 --- .../iteration/__tests__/index.spec.ts | 89 +- .../run/utils/format-log/iteration/index.ts | 38 - .../format-log/loop/__tests__/index.spec.ts | 110 +- .../run/utils/format-log/loop/index.ts | 38 - .../format-log/retry/__tests__/index.spec.ts | 83 +- .../workflow/utils/__tests__/debug.spec.ts | 48 - web/app/components/workflow/utils/debug.ts | 28 - .../deployments/nav/__tests__/index.spec.tsx | 79 - .../deployments/nav/__tests__/state.spec.ts | 189 -- web/features/deployments/nav/index.tsx | 45 - web/features/deployments/nav/state.ts | 104 - web/features/deployments/route-state.ts | 7 - web/knip.config.ts | 16 + web/package.json | 1 + web/service/use-common.ts | 8 - web/utils/context.spec.ts | 253 -- web/utils/context.ts | 49 - web/utils/navigation.spec.ts | 297 -- web/utils/navigation.ts | 189 -- 438 files changed, 628 insertions(+), 33238 deletions(-) delete mode 100644 web/.storybook/utils/form-story-wrapper.tsx delete mode 100644 web/__tests__/app-sidebar/sidebar-shell-flow.test.tsx delete mode 100644 web/__tests__/base/form-demo-flow.test.tsx delete mode 100644 web/__tests__/header/nav-flow.test.tsx delete mode 100644 web/__tests__/navigation-utils.test.ts delete mode 100644 web/__tests__/plugins/plugin-data-utilities.test.ts delete mode 100644 web/__tests__/plugins/plugin-page-filter-management.test.tsx delete mode 100644 web/app/components/app-sidebar/__tests__/app-sidebar-dropdown.spec.tsx delete mode 100644 web/app/components/app-sidebar/__tests__/dataset-sidebar-dropdown.spec.tsx delete mode 100644 web/app/components/app-sidebar/__tests__/index.spec.tsx delete mode 100644 web/app/components/app-sidebar/app-sidebar-dropdown.tsx delete mode 100644 web/app/components/app-sidebar/dataset-sidebar-dropdown.tsx delete mode 100644 web/app/components/app-sidebar/index.tsx delete mode 100644 web/app/components/app-sidebar/snippet-info/__tests__/index.spec.tsx delete mode 100644 web/app/components/app-sidebar/snippet-info/index.tsx delete mode 100644 web/app/components/app/configuration/config-var/select-type-item/__tests__/index.spec.tsx delete mode 100644 web/app/components/app/configuration/config-var/select-type-item/index.tsx delete mode 100644 web/app/components/app/configuration/config/assistant-type-picker/__tests__/index.spec.tsx delete mode 100644 web/app/components/app/configuration/config/assistant-type-picker/index.tsx delete mode 100644 web/app/components/app/configuration/ctrl-btn-group/__tests__/index.spec.tsx delete mode 100644 web/app/components/app/configuration/ctrl-btn-group/index.tsx delete mode 100644 web/app/components/app/configuration/ctrl-btn-group/style.module.css delete mode 100644 web/app/components/app/configuration/prompt-value-panel/__tests__/utils.spec.ts delete mode 100644 web/app/components/app/configuration/prompt-value-panel/utils.ts delete mode 100644 web/app/components/apps/__tests__/new-app-card.spec.tsx delete mode 100644 web/app/components/apps/new-app-card.tsx delete mode 100644 web/app/components/base/create-resource-card.tsx delete mode 100644 web/app/components/base/form/components/field/mixed-variable-text-input/__tests__/index.spec.tsx delete mode 100644 web/app/components/base/form/components/field/mixed-variable-text-input/__tests__/placeholder.spec.tsx delete mode 100644 web/app/components/base/form/components/field/mixed-variable-text-input/index.tsx delete mode 100644 web/app/components/base/form/components/field/mixed-variable-text-input/placeholder.tsx delete mode 100644 web/app/components/base/form/form-scenarios/base/__tests__/index.spec.tsx delete mode 100644 web/app/components/base/form/form-scenarios/base/index.tsx delete mode 100644 web/app/components/base/form/form-scenarios/demo/__tests__/contact-fields.spec.tsx delete mode 100644 web/app/components/base/form/form-scenarios/demo/__tests__/index.spec.tsx delete mode 100644 web/app/components/base/form/form-scenarios/demo/__tests__/shared-options.spec.tsx delete mode 100644 web/app/components/base/form/form-scenarios/demo/__tests__/types.spec.ts delete mode 100644 web/app/components/base/form/form-scenarios/demo/contact-fields.tsx delete mode 100644 web/app/components/base/form/form-scenarios/demo/index.tsx delete mode 100644 web/app/components/base/form/form-scenarios/demo/shared-options.tsx delete mode 100644 web/app/components/base/form/form-scenarios/demo/types.ts delete mode 100644 web/app/components/base/form/form-scenarios/input-field/__tests__/utils.spec.ts delete mode 100644 web/app/components/base/form/form-scenarios/input-field/utils.ts delete mode 100644 web/app/components/base/form/form-scenarios/node-panel/__tests__/field.spec.tsx delete mode 100644 web/app/components/base/form/form-scenarios/node-panel/__tests__/types.spec.ts delete mode 100644 web/app/components/base/form/form-scenarios/node-panel/field.tsx delete mode 100644 web/app/components/base/form/form-scenarios/node-panel/types.ts delete mode 100644 web/app/components/base/form/index.stories.tsx delete mode 100644 web/app/components/base/icons/src/image/llm/BaichuanTextCn.module.css delete mode 100644 web/app/components/base/icons/src/image/llm/BaichuanTextCn.tsx delete mode 100644 web/app/components/base/icons/src/image/llm/Minimax.module.css delete mode 100644 web/app/components/base/icons/src/image/llm/Minimax.tsx delete mode 100644 web/app/components/base/icons/src/image/llm/MinimaxText.module.css delete mode 100644 web/app/components/base/icons/src/image/llm/MinimaxText.tsx delete mode 100644 web/app/components/base/icons/src/image/llm/Tongyi.module.css delete mode 100644 web/app/components/base/icons/src/image/llm/Tongyi.tsx delete mode 100644 web/app/components/base/icons/src/image/llm/TongyiText.module.css delete mode 100644 web/app/components/base/icons/src/image/llm/TongyiText.tsx delete mode 100644 web/app/components/base/icons/src/image/llm/TongyiTextCn.module.css delete mode 100644 web/app/components/base/icons/src/image/llm/TongyiTextCn.tsx delete mode 100644 web/app/components/base/icons/src/image/llm/Wxyy.module.css delete mode 100644 web/app/components/base/icons/src/image/llm/Wxyy.tsx delete mode 100644 web/app/components/base/icons/src/image/llm/WxyyText.module.css delete mode 100644 web/app/components/base/icons/src/image/llm/WxyyText.tsx delete mode 100644 web/app/components/base/icons/src/image/llm/WxyyTextCn.module.css delete mode 100644 web/app/components/base/icons/src/image/llm/WxyyTextCn.tsx delete mode 100644 web/app/components/base/icons/src/public/billing/ArCube1.tsx delete mode 100644 web/app/components/base/icons/src/public/billing/Asterisk.tsx delete mode 100644 web/app/components/base/icons/src/public/billing/Buildings.tsx delete mode 100644 web/app/components/base/icons/src/public/billing/Diamond.tsx delete mode 100644 web/app/components/base/icons/src/public/billing/Group2.tsx delete mode 100644 web/app/components/base/icons/src/public/billing/Keyframe.tsx delete mode 100644 web/app/components/base/icons/src/public/billing/Sparkles.tsx delete mode 100644 web/app/components/base/icons/src/public/billing/SparklesSoft.tsx delete mode 100644 web/app/components/base/icons/src/public/common/D.tsx delete mode 100644 web/app/components/base/icons/src/public/common/DiagonalDividingLine.tsx delete mode 100644 web/app/components/base/icons/src/public/common/Dify.tsx delete mode 100644 web/app/components/base/icons/src/public/common/Lock.tsx delete mode 100644 web/app/components/base/icons/src/public/common/MessageChatSquare.tsx delete mode 100644 web/app/components/base/icons/src/public/common/MultiPathRetrieval.tsx delete mode 100644 web/app/components/base/icons/src/public/common/NTo1Retrieval.tsx delete mode 100644 web/app/components/base/icons/src/public/knowledge/File.tsx delete mode 100644 web/app/components/base/icons/src/public/knowledge/Watercrawl.tsx delete mode 100644 web/app/components/base/icons/src/public/knowledge/dataset-card/Graph.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/Anthropic.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/AnthropicText.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/AzureOpenaiService.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/AzureOpenaiServiceText.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/Azureai.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/AzureaiText.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/Baichuan.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/BaichuanText.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/Chatglm.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/ChatglmText.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/Cohere.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/CohereText.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/Gpt3.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/Gpt4.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/Huggingface.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/HuggingfaceText.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/HuggingfaceTextHub.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/IflytekSpark.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/IflytekSparkText.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/IflytekSparkTextCn.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/Jina.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/JinaText.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/Localai.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/LocalaiText.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/Microsoft.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/OpenaiBlack.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/OpenaiBlue.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/OpenaiGreen.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/OpenaiTeal.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/OpenaiText.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/OpenaiTransparent.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/OpenaiViolet.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/Openllm.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/OpenllmText.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/Replicate.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/ReplicateText.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/XorbitsInference.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/XorbitsInferenceText.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/Zhipuai.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/ZhipuaiText.tsx delete mode 100644 web/app/components/base/icons/src/public/llm/ZhipuaiTextCn.tsx delete mode 100644 web/app/components/base/icons/src/public/model/Checked.tsx delete mode 100644 web/app/components/base/icons/src/public/other/Icon3Dots.tsx delete mode 100644 web/app/components/base/icons/src/public/plugins/Google.tsx delete mode 100644 web/app/components/base/icons/src/public/plugins/WebReader.tsx delete mode 100644 web/app/components/base/icons/src/public/plugins/Wikipedia.tsx delete mode 100644 web/app/components/base/icons/src/public/thought/DataSet.tsx delete mode 100644 web/app/components/base/icons/src/public/thought/Search.tsx delete mode 100644 web/app/components/base/icons/src/public/thought/ThoughtList.tsx delete mode 100644 web/app/components/base/icons/src/public/thought/WebReader.tsx delete mode 100644 web/app/components/base/icons/src/vender/knowledge/Divider.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/alertsAndFeedback/AlertTriangle.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsDown.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsUp.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/arrows/ChevronDownDouble.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/arrows/IconR.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/arrows/RefreshCw05.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/arrows/ReverseLeft.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/communication/AiText.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/communication/ChatBot.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/communication/CuteRobot.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/development/ArtificialBrain.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/development/BarChartSquare02.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/development/CodeBrowser.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/development/Container.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/development/Database01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/development/Database03.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/development/FileHeart02.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/development/GitBranch01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/development/PromptEngineering.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/development/PuzzlePiece01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/development/TerminalSquare.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/development/Variable.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/development/Webhooks.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/editor/AlignLeft.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/editor/BezierCurve03.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/editor/Collapse.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/editor/Colors.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/editor/LeftIndent02.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/editor/LetterSpacing01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/editor/TypeSquare.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/files/File02.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/files/FileCheck02.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/files/FileDownload02.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/files/FilePlus01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/files/FilePlus02.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/files/FileText.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/files/FileUpload.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/financeAndECommerce/CoinsStacked01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/financeAndECommerce/GoldCoin.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/financeAndECommerce/ReceiptList.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/financeAndECommerce/Tag01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/AtSign.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/Bookmark.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/CheckDone01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/ChecklistSquare.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/DotsGrid.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/Edit02.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/Edit04.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/Edit05.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/Hash02.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/HelpQuestion.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/InfoCircle.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/LogIn04.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/LogOut01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/LogOut04.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/Menu01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/Pin01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/Refresh.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/Settings04.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/Target04.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/Upload03.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/general/UploadCloud01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/layout/AlignLeft01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/layout/AlignRight01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/layout/Grid01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/layout/LayoutGrid02.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/layout/index.ts delete mode 100644 web/app/components/base/icons/src/vender/line/mediaAndDevices/Microphone01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/mediaAndDevices/PlayCircle.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/mediaAndDevices/SlidersH.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/mediaAndDevices/Speaker.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/others/Colors.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/others/SearchMenu.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/others/Tools.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/shapes/CubeOutline.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/time/ClockPlaySlim.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/time/ClockRefresh.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/users/User01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/users/Users01.tsx delete mode 100644 web/app/components/base/icons/src/vender/line/weather/Stars02.tsx delete mode 100644 web/app/components/base/icons/src/vender/other/AnthropicText.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/FinanceAndECommerce/GoldCoin.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/arrows/ArrowDownDoubleLine.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/arrows/ArrowUpDoubleLine.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/arrows/ChevronDown.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/arrows/HighPriority.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/communication/AiText.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/communication/EditList.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/communication/MessageDotsCircle.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/communication/MessageHeartCircle.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/communication/MessageSmileSquare.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/communication/Send03.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/development/BarChartSquare02.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/development/Container.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/development/Database02.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/development/Database03.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/development/FileHeart02.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/development/PatternRecognition.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/development/PromptEngineering.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/development/PuzzlePiece01.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/development/Semantic.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/editor/Citations.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/editor/Colors.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/editor/Paragraph.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/editor/TypeSquare.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/education/BubbleText.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/education/Heart02.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/files/FileSearch02.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/general/AnswerTriangle.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/general/CheckDone01.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/general/Edit04.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/general/PlusCircle.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/general/QuestionTriangle.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/general/SearchMd.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/general/ZapNarrow.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/layout/Grid01.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/mediaAndDevices/AudioSupportIcon.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/mediaAndDevices/DocumentSupportIcon.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicEyes.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicWand.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/mediaAndDevices/Microphone01.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/mediaAndDevices/Play.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/mediaAndDevices/Robot.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/mediaAndDevices/Sliders02.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/mediaAndDevices/Speaker.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/mediaAndDevices/VideoSupportIcon.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/shapes/Star04.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/shapes/Star06.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/users/User01.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/users/Users01.tsx delete mode 100644 web/app/components/base/icons/src/vender/solid/users/UsersPlus.tsx delete mode 100644 web/app/components/base/icons/src/vender/workflow/IterationStart.tsx delete mode 100644 web/app/components/base/image-uploader/__tests__/audio-preview.spec.tsx delete mode 100644 web/app/components/base/image-uploader/__tests__/chat-image-uploader.spec.tsx delete mode 100644 web/app/components/base/image-uploader/__tests__/video-preview.spec.tsx delete mode 100644 web/app/components/base/image-uploader/audio-preview.tsx delete mode 100644 web/app/components/base/image-uploader/chat-image-uploader.tsx delete mode 100644 web/app/components/base/image-uploader/video-preview.tsx delete mode 100644 web/app/components/base/logo/__tests__/logo-site.spec.tsx delete mode 100644 web/app/components/base/logo/index.stories.tsx delete mode 100644 web/app/components/base/logo/logo-site.tsx delete mode 100644 web/app/components/base/prompt-editor/plugins/__tests__/tree-view.spec.tsx delete mode 100644 web/app/components/base/prompt-editor/plugins/tree-view.tsx delete mode 100644 web/app/components/base/spinner/__tests__/index.spec.tsx delete mode 100644 web/app/components/base/spinner/index.stories.tsx delete mode 100644 web/app/components/base/spinner/index.tsx delete mode 100644 web/app/components/base/with-input-validation/__tests__/index.spec.tsx delete mode 100644 web/app/components/base/with-input-validation/index.stories.tsx delete mode 100644 web/app/components/base/with-input-validation/index.tsx delete mode 100644 web/app/components/billing/header-billing-btn/__tests__/index.spec.tsx delete mode 100644 web/app/components/billing/header-billing-btn/index.tsx delete mode 100644 web/app/components/datasets/api/__tests__/index.spec.tsx delete mode 100644 web/app/components/datasets/api/index.tsx delete mode 100644 web/app/components/datasets/create/step-two/preview-item/__tests__/index.spec.tsx delete mode 100644 web/app/components/datasets/create/step-two/preview-item/index.tsx delete mode 100644 web/app/components/datasets/create/stop-embedding-modal/__tests__/index.spec.tsx delete mode 100644 web/app/components/datasets/create/stop-embedding-modal/index.module.css delete mode 100644 web/app/components/datasets/create/stop-embedding-modal/index.tsx delete mode 100644 web/app/components/datasets/create/website/jina-reader/__tests__/base.spec.tsx delete mode 100644 web/app/components/datasets/create/website/jina-reader/base/__tests__/url-input.spec.tsx delete mode 100644 web/app/components/datasets/create/website/jina-reader/base/url-input.tsx delete mode 100644 web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/__tests__/header.spec.tsx delete mode 100644 web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/connect/__tests__/index.spec.tsx delete mode 100644 web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/connect/index.tsx delete mode 100644 web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/header.tsx delete mode 100644 web/app/components/datasets/list/dataset-card/__tests__/operation-item.spec.tsx delete mode 100644 web/app/components/datasets/list/dataset-card/operation-item.tsx delete mode 100644 web/app/components/datasets/list/new-dataset-card/__tests__/index.spec.tsx delete mode 100644 web/app/components/datasets/list/new-dataset-card/__tests__/option.spec.tsx delete mode 100644 web/app/components/datasets/list/new-dataset-card/index.tsx delete mode 100644 web/app/components/datasets/list/new-dataset-card/option.tsx delete mode 100644 web/app/components/datasets/preview/__tests__/index.spec.tsx delete mode 100644 web/app/components/datasets/preview/index.tsx delete mode 100644 web/app/components/header/__tests__/index.spec.tsx delete mode 100644 web/app/components/header/account-setting/Integrations-page/__tests__/index.spec.tsx delete mode 100644 web/app/components/header/account-setting/Integrations-page/index.module.css delete mode 100644 web/app/components/header/account-setting/Integrations-page/index.tsx delete mode 100644 web/app/components/header/account-setting/key-validator/KeyInput.tsx delete mode 100644 web/app/components/header/account-setting/key-validator/Operate.tsx delete mode 100644 web/app/components/header/account-setting/key-validator/__tests__/KeyInput.spec.tsx delete mode 100644 web/app/components/header/account-setting/key-validator/__tests__/Operate.spec.tsx delete mode 100644 web/app/components/header/account-setting/key-validator/__tests__/hooks.spec.ts delete mode 100644 web/app/components/header/account-setting/key-validator/__tests__/index.spec.tsx delete mode 100644 web/app/components/header/account-setting/key-validator/hooks.ts delete mode 100644 web/app/components/header/account-setting/key-validator/index.tsx delete mode 100644 web/app/components/header/account-setting/model-provider-page/model-auth/__tests__/config-provider.spec.tsx delete mode 100644 web/app/components/header/account-setting/model-provider-page/model-auth/config-provider.tsx delete mode 100644 web/app/components/header/account-setting/model-provider-page/provider-added-card/__tests__/priority-use-tip.spec.tsx delete mode 100644 web/app/components/header/account-setting/model-provider-page/provider-added-card/priority-use-tip.tsx delete mode 100644 web/app/components/header/app-back/__tests__/index.spec.tsx delete mode 100644 web/app/components/header/app-back/index.tsx delete mode 100644 web/app/components/header/app-nav/__tests__/index.spec.tsx delete mode 100644 web/app/components/header/app-nav/index.tsx delete mode 100644 web/app/components/header/dataset-nav/__tests__/index.spec.tsx delete mode 100644 web/app/components/header/dataset-nav/index.tsx delete mode 100644 web/app/components/header/explore-nav/__tests__/index.spec.tsx delete mode 100644 web/app/components/header/explore-nav/index.tsx delete mode 100644 web/app/components/header/index.tsx delete mode 100644 web/app/components/header/nav/__tests__/index.spec.tsx delete mode 100644 web/app/components/header/nav/index.tsx delete mode 100644 web/app/components/header/nav/nav-selector/__tests__/index.spec.tsx delete mode 100644 web/app/components/header/nav/nav-selector/index.tsx delete mode 100644 web/app/components/header/plugins-nav/__tests__/index.spec.tsx delete mode 100644 web/app/components/header/plugins-nav/index.tsx delete mode 100644 web/app/components/header/tools-nav/__tests__/index.spec.tsx delete mode 100644 web/app/components/header/tools-nav/index.tsx delete mode 100644 web/app/components/plugins/plugin-auth/__tests__/utils.spec.ts delete mode 100644 web/app/components/plugins/plugin-auth/utils.ts delete mode 100644 web/app/components/plugins/plugin-detail-panel/tool-selector/__tests__/index.spec.tsx delete mode 100644 web/app/components/plugins/plugin-detail-panel/tool-selector/components/__tests__/index.spec.ts delete mode 100644 web/app/components/plugins/plugin-detail-panel/tool-selector/components/__tests__/tool-credentials-form.spec.tsx delete mode 100644 web/app/components/plugins/plugin-detail-panel/tool-selector/components/tool-credentials-form.tsx delete mode 100644 web/app/components/plugins/plugin-detail-panel/tool-selector/hooks/__tests__/index.spec.ts delete mode 100644 web/app/components/plugins/plugin-detail-panel/tool-selector/hooks/index.ts delete mode 100644 web/app/components/plugins/plugin-page/filter-management/__tests__/constant.spec.ts delete mode 100644 web/app/components/plugins/plugin-page/filter-management/__tests__/store.spec.ts delete mode 100644 web/app/components/plugins/plugin-page/filter-management/constant.ts delete mode 100644 web/app/components/plugins/plugin-page/filter-management/store.ts delete mode 100644 web/app/components/share/__tests__/utils.spec.ts delete mode 100644 web/app/components/share/utils.ts delete mode 100644 web/app/components/snippets/hooks/__tests__/use-create-snippet-from-selection.spec.tsx delete mode 100644 web/app/components/snippets/hooks/use-create-snippet-from-selection.tsx delete mode 100644 web/app/components/tools/labels/__tests__/store.spec.ts delete mode 100644 web/app/components/tools/labels/store.ts delete mode 100644 web/app/components/workflow/block-selector/__tests__/use-check-vertical-scrollbar.spec.ts delete mode 100644 web/app/components/workflow/block-selector/use-check-vertical-scrollbar.ts delete mode 100644 web/app/components/workflow/hooks/__tests__/use-workflow-interactions.spec.tsx delete mode 100644 web/app/components/workflow/hooks/__tests__/use-workflow-zoom.spec.ts delete mode 100644 web/app/components/workflow/hooks/use-workflow-zoom.ts delete mode 100644 web/app/components/workflow/nodes/_base/components/input-field/__tests__/index.spec.tsx delete mode 100644 web/app/components/workflow/nodes/_base/components/input-field/add.tsx delete mode 100644 web/app/components/workflow/nodes/_base/components/input-field/index.tsx delete mode 100644 web/app/components/workflow/nodes/_base/components/mixed-variable-text-input/__tests__/index.spec.tsx delete mode 100644 web/app/components/workflow/nodes/_base/components/mixed-variable-text-input/__tests__/placeholder.spec.tsx delete mode 100644 web/app/components/workflow/nodes/_base/components/mixed-variable-text-input/index.tsx delete mode 100644 web/app/components/workflow/nodes/_base/components/mixed-variable-text-input/placeholder.tsx delete mode 100644 web/app/components/workflow/nodes/_base/components/support-var-input/__tests__/index.spec.tsx delete mode 100644 web/app/components/workflow/nodes/_base/components/support-var-input/index.tsx delete mode 100644 web/app/components/workflow/nodes/_base/components/variable/__tests__/assigned-var-reference-popup.spec.tsx delete mode 100644 web/app/components/workflow/nodes/_base/components/variable/assigned-var-reference-popup.tsx delete mode 100644 web/app/components/workflow/nodes/agent/__tests__/use-single-run-form-params.spec.ts delete mode 100644 web/app/components/workflow/nodes/agent/use-single-run-form-params.ts delete mode 100644 web/app/components/workflow/nodes/code/__tests__/dependency-picker.spec.tsx delete mode 100644 web/app/components/workflow/nodes/code/dependency-picker.tsx delete mode 100644 web/app/components/workflow/nodes/http/__tests__/integration.spec.tsx delete mode 100644 web/app/components/workflow/nodes/http/components/key-value/bulk-edit/index.tsx delete mode 100644 web/app/components/workflow/nodes/loop/__tests__/integration.spec.tsx delete mode 100644 web/app/components/workflow/nodes/loop/components/condition-files-list-value.tsx delete mode 100644 web/app/components/workflow/nodes/loop/components/condition-value.tsx delete mode 100644 web/app/components/workflow/nodes/loop/insert-block.tsx delete mode 100644 web/app/components/workflow/nodes/tool/components/__tests__/input-var-list.spec.tsx delete mode 100644 web/app/components/workflow/nodes/tool/components/input-var-list.tsx delete mode 100644 web/app/components/workflow/nodes/trigger-plugin/utils/__tests__/form-helpers.spec.ts delete mode 100644 web/app/components/workflow/nodes/trigger-plugin/utils/form-helpers.ts delete mode 100644 web/app/components/workflow/nodes/variable-assigner/__tests__/integration.spec.tsx delete mode 100644 web/app/components/workflow/nodes/variable-assigner/components/__tests__/node-variable-item.spec.tsx delete mode 100644 web/app/components/workflow/nodes/variable-assigner/components/node-variable-item.tsx delete mode 100644 web/app/components/workflow/run/__tests__/loop-result-panel.spec.tsx delete mode 100644 web/app/components/workflow/run/loop-result-panel.tsx delete mode 100644 web/app/components/workflow/run/utils/format-log/__tests__/graph-to-log-struct.spec.ts delete mode 100644 web/app/components/workflow/run/utils/format-log/agent/data.ts delete mode 100644 web/app/components/workflow/run/utils/format-log/graph-to-log-struct.ts delete mode 100644 web/app/components/workflow/utils/__tests__/debug.spec.ts delete mode 100644 web/app/components/workflow/utils/debug.ts delete mode 100644 web/features/deployments/nav/__tests__/index.spec.tsx delete mode 100644 web/features/deployments/nav/__tests__/state.spec.ts delete mode 100644 web/features/deployments/nav/index.tsx delete mode 100644 web/features/deployments/nav/state.ts delete mode 100644 web/utils/context.spec.ts delete mode 100644 web/utils/context.ts delete mode 100644 web/utils/navigation.spec.ts delete mode 100644 web/utils/navigation.ts diff --git a/.agents/skills/how-to-write-component/SKILL.md b/.agents/skills/how-to-write-component/SKILL.md index bf523070740..4a5a73088ec 100644 --- a/.agents/skills/how-to-write-component/SKILL.md +++ b/.agents/skills/how-to-write-component/SKILL.md @@ -1,71 +1,59 @@ --- name: how-to-write-component -description: React/TypeScript component style guide. Use when writing, refactoring, or reviewing React components, especially around abstraction choices, props typing, state boundaries, shared local state with Jotai atoms, API types, query/mutation contracts, navigation, memoization, wrappers, and empty-state handling. +description: Use when writing, refactoring, or reviewing React/TypeScript components in Dify web, especially decisions about component ownership, props/types, URL/query state, Jotai state, async state, generated API contracts, queries/mutations, overlays, effects, navigation, performance, and empty states. --- # How To Write A Component -Use this as the decision guide for React/TypeScript component structure. Existing code is reference material, not automatic precedent; when it conflicts with these rules, adapt the approach instead of reproducing the violation. +Use this as the component decision guide for Dify web. Existing code is reference material, not automatic precedent; if touched code violates these rules, adapt it and fix equivalent patterns in the same feature branch. + +## First Decisions + +| Question | Default | Promote or extract only when | +| --- | --- | --- | +| Where should code live? | Keep it local to the feature workflow, route, or owner. | Multiple verticals need the same stable primitive. | +| Who owns state, data, and handlers? | The lowest component that uses them. | A parent coordinates shared loading, errors, empty UI, selection, submission, navigation, or one consistent snapshot. | +| Should this become Jotai state? | Keep synchronous UI/form state in component or DOM state. | Siblings need one source of truth, the value drives atoms, or scoped workflow state must survive hidden/unmounted steps. | +| Should URL state enter Jotai? | Let Next.js route params and `nuqs` own URL state and updates. | Query atoms or shared derived atoms need a read-only bridge hydrated at the route/surface boundary. | +| Should this query/mutation become an atom? | Use TanStack Query hooks at the lowest owner. | It reads atom state, feeds derived atoms, or participates in shared Jotai workflow orchestration. | +| Should this be a helper/wrapper? | Prefer direct readable code at the use site. | The name captures a stable domain rule or the wrapper owns real behavior, validation, state, error handling, or semantics. | +| Is an Effect needed? | No. Derive during render or handle the user action in the event handler. | It synchronizes with an external system such as browser APIs, subscriptions, timers, analytics, or imperative DOM/non-React widgets. | ## Core Defaults -- Search before adding UI, hooks, helpers, or styling patterns. Reuse existing base components, feature components, hooks, utilities, and design styles when they fit. -- Group code by feature workflow, route, or ownership area: components, hooks, local types, query helpers, atoms, constants, and small utilities should live near the code that changes with them. -- Promote code to shared only when multiple verticals need the same stable primitive. Otherwise keep it local and compose shared primitives inside the owning feature. -- Prefer local code and purpose-named helpers over catch-all utility modules; do not group workflow-specific defaults, validation, payload shaping, or metadata merging in a generic utils file just because they share a DTO. -- Keep source/default selection, validation, and payload shaping close to the workflow that owns the behavior. Do not extract a shared helper just because two flows read the same DTO when their priority order, fallback behavior, or submit semantics differ. -- Prefer direct, readable conditionals at the use site for small branch-specific decisions, especially form source selection and request payload assembly. Extract only when the helper name captures a stable domain rule and removes repeated complexity without hiding flow-specific behavior. -- When fixing an invalid pattern, scan the touched feature or branch for equivalent patterns and fix them together. -- Follow Dify's CSS-first Tailwind v4 contract from `packages/dify-ui/README.md` and `packages/dify-ui/AGENTS.md`. Prefer design-system tokens, utilities, and radius mappings over generic Tailwind guidance. +- Search before adding UI, hooks, helpers, query utilities, or styling patterns. Reuse existing base components, feature components, hooks, utilities, and design styles when they fit. +- Follow Dify's CSS-first Tailwind v4 contract from `packages/dify-ui/README.md` and `packages/dify-ui/AGENTS.md`. Prefer design-system tokens, utilities, and radius mappings over generic Tailwind choices. +- Group feature code by workflow, route, or ownership area: components, hooks, local types, query helpers, atoms, constants, and small utilities should live near the code that changes with them. +- Keep source/default selection, validation, dirty checks, and payload shaping close to the workflow that owns submit behavior. Do not hide flow-specific priority order, fallback behavior, or submit semantics in generic utilities. +- Prefer direct conditionals for small branch-specific decisions, especially form source selection and request payload assembly. +- Loading states for page sections, cards, lists, tables, forms, and drawers should be skeletons scoped to the content being loaded. Use spinners only for small inline busy indicators. -## Feature Workflow Layout +## Layout And Ownership -- State-heavy wizards, drawers, modals, and secondary workflows work best as a small feature surface with route/entry files, a single feature-local state file, and feature-local UI. -- Keep `ui/` shallow with owner files that map to the workflow's real composition boundaries and major visual regions. -- Owner files contain the section components, field components, skeletons, and one-off helper components that belong to their visual region. -- Folders represent groups of related files with a shared owner and a stable reason to change together. -- The entry file handles route integration, provider wiring, close behavior, and feature surface mounting. The composition owner handles high-level workflow branching, and the closest visual owner handles section branching. +- State-heavy wizards, drawers, modals, and secondary workflows can be a small feature surface: an entry file, one feature-local state file when Jotai is actually needed, and shallow `ui/` owners that match real visual regions. +- The entry file handles route integration, provider wiring, close behavior, and surface mounting. The composition owner handles high-level workflow branching. The closest visual owner handles section branching. +- Repeated TanStack query calls in sibling components are acceptable when each component independently consumes the data; TanStack Query deduplicates and shares cache. +- Pass stable domain identity across boundaries. Do not forward derived presentation state when the receiver can derive it from its own data source. +- A component that owns a visual surface should also own data access, loading, empty, and error states for content rendered inside it unless a parent truly coordinates that state. +- Avoid prop drilling. One pass-through layer is acceptable; repeated forwarding means ownership should move down or into feature-scoped Jotai UI state. Keep server/cache state in Query and API flow. +- Do not replace prop drilling with one large view-model hook threaded through section props. Move each hook, query, derived value, and handler to the concrete section that consumes it. +- Keep callbacks in a parent only for workflow coordination such as form submission, shared selection, batch behavior, or navigation. Otherwise let the child, menu, or row own the action. -## Ownership +## Feature-Scoped Jotai -- Put local state, queries, mutations, handlers, and derived UI data in the lowest component that uses them. Extract a purpose-built owner component only when the logic has no natural home. -- Repeated TanStack query calls in sibling components are acceptable when each component independently consumes the data. Do not hoist a query only because it is duplicated; TanStack Query handles deduplication and cache sharing. -- Hoist state, queries, or callbacks to a parent only when the parent consumes the data, coordinates shared loading/error/empty UI, needs one consistent snapshot, or owns a workflow spanning children. -- Pass stable domain identity across boundaries; avoid forwarding derived presentation state when the receiver can derive it from its own data source. A component that owns a visual surface should also own the data access, loading, empty, and error states for content rendered inside it unless a parent truly coordinates that state. -- Loading states for visual surfaces should use skeleton placeholders scoped to the content that is actually loading, with shape, density, and dimensions close to the final UI. Avoid generic loading text or centered spinners for page sections, cards, lists, tables, forms, and drawers; reserve spinners for small inline busy indicators such as an in-progress status icon. -- Avoid prop drilling. One pass-through layer is acceptable; repeated forwarding means ownership should move down or into feature-scoped Jotai UI state. Keep server/cache state in query and API data flow. -- Do not replace prop drilling with one top-level hook that returns a large view model and then thread that object through section props. Move each hook, query, derived value, and handler to the concrete section that consumes it, or use feature-scoped Jotai atoms for simple shared form/UI state when siblings need the same source of truth. -- When using feature-scoped Jotai state for a form, drawer, or other secondary surface, scope the store to that surface instance when stale cross-instance state is possible. Initialize stable config at the owning boundary, then let descendants read only the atoms or purpose-named hooks they actually need. -- For Jotai-backed surfaces, put shared query atoms, mutation atoms, derived state, and write actions in the feature state file when they coordinate multiple descendants. Do not create a query or mutation atom only because the surrounding feature uses Jotai. If the query or mutation does not read atom state, feed another atom, or participate in shared workflow orchestration, use `useQuery` or `useMutation` directly at the lowest owner. -- For repeated row/menu action surfaces that need reset, hydrate the stable identity at the surface entry and scope only the primitives that truly need per-instance reset, such as open flags, drafts, or selected local options. -- Keep callbacks in a parent only for workflow coordination such as form submission, shared selection, batch behavior, or navigation. Otherwise let the child or row own its action. -- Default to uncontrolled form and DOM state. Add controlled props or atom-backed drafts only when live cross-component reactions, multi-step persistence, or external synchronization require them. - -## Feature-Scoped Jotai State - -- A module's feature-local state lives in one state file for Jotai-backed features: primitive atoms, shared query atoms, derived atoms, write-only action atoms, shared mutation atoms, submission orchestration, provider exports, and optional scope configuration. -- Keep synchronous UI state local when one component owns it, even inside Jotai-backed features. Dialog open flags, menu/popover visibility, confirmation visibility, form/input drafts, and selected local options usually belong in component state. -- Do not put simple form drafts in Jotai atoms. For edit/create forms whose fields are only read at submit time, use uncontrolled `@langgenius/dify-ui/form` and `@langgenius/dify-ui/field` controls with `defaultValue`, browser/form validation, and keyed remounts for query-backed initial values. -- Promote form state to Jotai only when another component must react to in-progress field changes, the draft must survive unmount/remount within the same scoped workflow, or multiple steps/surfaces share the same editable draft before submit. -- Keep submit-time normalization, dirty checks, and payload shaping beside the form submit handler. Do not create form atoms, field atoms, or derived can-save atoms only to mirror uncontrolled form values or disable a submit button. -- In Jotai-backed feature surfaces, never hand-roll async loading, error, or in-flight guards with `useState` or `useRef`. For async work that depends on atom state, feeds derived atoms, or participates in shared submission orchestration, model the work with `atomWithQuery` or `atomWithMutation`; write atoms should only update the inputs that drive those atoms. For component-owned remote work that does not participate in atom state, use TanStack Query hooks directly. -- Row-local async state should belong to the row owner. Use `useQuery` or `useMutation` directly for row actions that do not depend on atom state and are not consumed by other atoms. Use a per-instance query or mutation atom only when the row action participates in a Jotai-backed shared workflow or needs atom-scoped reset semantics. -- Promote UI state to an atom only when siblings need the same source of truth, the value drives a query or mutation atom, a parent workflow coordinates the state, or the state intentionally persists across hidden or unmounted descendants within a scoped surface. -- Reflect atom-backed surface-wide locks or invariants in every affected trigger. If only one row, menu, or dialog should be disabled, keep the pending or lock scope local to that row, menu, or dialog with the lowest-owner query/mutation hook unless it genuinely participates in shared atom state. -- Atom order in the state file follows the dependency graph: types/constants, editable primitives, query atoms, query-data derived atoms, readiness/business derived atoms, write actions, mutation atoms, submission orchestration, provider exports. -- Derived atom names read as business facts. Write atom names read as user or workflow commands. -- UI components read and write the exact atom they use with `useAtomValue` or `useSetAtom`. Repeated workflow semantics live in named derived atoms or write atoms. -- Non-query derived atoms return a narrow value with a clear domain name; avoid pass-through aliases or bundling unrelated UI facts. Query atoms expose the TanStack Query result object so loading, error, fetch, and pagination state stay attached to the query contract. -- Write-only atoms own synchronous state transitions that update multiple primitives, reset dependent state, or advance the workflow. Async work with loading, error, caching, retry, stale-result, or in-flight concerns should be modeled as query or mutation atoms, with write atoms only changing the inputs that drive them. -- Avoid feature hooks that aggregate form values, query results, derived state, and commands for sibling components. Prefer named derived atoms and write atoms so UI components read the exact shared fact or command they need. -- When a form library owns validation, keep submit orchestration in feature state when post-submit result or error state is shared by the surface. Avoid duplicating validation gates or request shaping in UI hooks. -- `jotai-tanstack-query` atoms use the same QueryClient as the React Query provider. Query atoms belong in feature state only when they need atom inputs, provide data to derived atoms, or coordinate a shared Jotai-backed workflow. -- Jotai scope is an optional instance-isolation tool for secondary surfaces with independent local state. Query and mutation atoms keep shared cache behavior through the shared QueryClient. -- Do not put `atomWithQuery`, `atomWithInfiniteQuery`, `atomWithMutation`, or broad derived orchestration atoms in a `ScopeProvider` just to reset a surface. Scoped derived atoms implicitly scope their dependencies, which can duplicate query client access and break shared invalidation. Leave query/mutation atoms unscoped; let them read scoped primitive inputs. -- Scope providers should list resettable primitive atoms and explicit hydration tuples. If a derived atom must be scoped, confirm that every dependency it implicitly scopes is meant to be private to that surface. -- For scoped primitives that are always hydrated by a `ScopeProvider` tuple, prefer `atomWithLazy(() => { throw new Error(...) })` when consumers should see a non-null type. This keeps missing provider hydration as a runtime invariant without leaking `T | undefined` or adding pass-through "required" derived atoms only for narrowing. -- Keep independent dialog lifecycles separate. Avoid a single discriminated "current action dialog" atom when edit, delete, and other dialogs have their own open state, loading guard, or reset behavior. -- Route-derived stable identities that do not need instance reset or scoped isolation can be hydrated at the route or layout boundary into a feature route atom. Use scoped atoms only when stale cross-instance state or per-surface reset semantics are needed. +- A Jotai-backed feature has one feature-local state file for shared primitive atoms, query atoms, derived atoms, write-only actions, mutation atoms, submission orchestration, provider exports, and optional scope configuration. +- Keep component-owned synchronous UI state local even inside Jotai features: dialog open flags, menus/popovers, confirmations, field drafts, and selected local options usually belong in component state. +- Use uncontrolled `@langgenius/dify-ui/form` and `@langgenius/dify-ui/field` controls for edit/create forms whose fields are read only at submit time. Initialize query-backed defaults with `defaultValue` and keyed remounts. +- Promote form state to atoms only when another component must react to in-progress values, a draft must survive unmount/remount in the scoped workflow, or multiple steps share the same editable draft before submit. +- Treat `useParams`, route args, and `nuqs` query state as framework-owned state. When atom logic needs those values, hydrate primitive atoms at the route or surface boundary, such as with `useHydrateAtoms(..., { dangerouslyForceHydrate: true })`; keep URL updates in the route/query-state APIs instead of write atoms. +- For async work tied to atom state, use `atomWithQuery` or `atomWithMutation`; write atoms should update only the inputs that drive those atoms. This applies to pure frontend async work as well as network requests, so do not hand-roll loading/error/in-flight state with `useState` or `useRef` for atom-orchestrated async behavior. For component-owned remote work, use `useQuery` or `useMutation` directly. +- Row-local async state belongs to the row owner unless it participates in a shared Jotai workflow or needs atom-scoped reset semantics. +- Leave query and mutation atoms unscoped so they keep shared QueryClient cache and invalidation behavior. Scope resettable primitives and explicit hydration tuples; scope a derived atom only when every dependency should be private to that surface. +- For scoped primitives that are always hydrated by `ScopeProvider`, prefer `atomWithLazy(() => { throw new Error(...) })` when consumers should see a non-null type. +- Order state files by dependency graph: types/constants, primitives, query atoms, query-data derived atoms, business/readiness derived atoms, write actions, mutation atoms, submission orchestration, provider exports. +- Name derived atoms as business facts and write atoms as user or workflow commands. Components should read or write the exact atom they need with `useAtomValue` or `useSetAtom`. +- Menu/dialog `open` state usually stays local, but a scoped atom is acceptable when a composed menu plus secondary surface would otherwise pass confusing `open`/`onClose` props through unrelated layers. Scope that primitive with the surface instance so reset behavior stays local. +- Keep independent dialog lifecycles separate. Avoid one discriminated "current action dialog" atom when dialogs have separate open state, loading guards, or reset behavior. ## Components, Props, And Types @@ -74,86 +62,56 @@ Use this as the decision guide for React/TypeScript component structure. Existin - Prefer named exports. Use default exports only where the framework requires them, such as Next.js route files. - Type simple one-off props inline. Use a named `Props` type only when reused, exported, complex, or clearer. - Use API-generated or API-returned types at component boundaries. Keep small UI conversion helpers and one-off UI extensions beside the component that needs them. -- Do not create type aliases that only rename another type. Use an alias only when it encodes a real UI concept, refinement, or reusable local contract. -- Name values by their domain role and backend API contract, and keep that name stable across the call chain, especially persistent IDs and route params. Normalize framework or route params at the boundary. -- Keep fallback and invariant checks at the lowest component that already handles that state; avoid defensive fallbacks that mask impossible states. -- Do not extract fallback helpers whose only behavior is hiding missing display data. The component that renders the surface owns the empty, disabled, hidden, or placeholder state. +- Do not create type aliases that only rename another type. Use aliases only for real UI concepts, refinements, or reusable local contracts. +- Name values by their domain role and backend API contract, especially persistent IDs and route params. Normalize framework or route params at the boundary. +- Put fallback and invariant checks in the lowest component that already handles that state. Do not extract helpers whose only behavior is hiding missing display data. -## Generated API Contracts +## Generated API And Nullable Data - Treat generated contracts as authoritative at API, query, mutation, cache, and service boundaries. For enterprise APIs, use `packages/contracts/generated/enterprise/*`. -- Do not hand-write local request/response/reply/page/cache-data types that mirror generated DTOs. Import or infer the generated type. -- Do not widen generated fields or enums for compatibility. Normalize legacy input at the boundary, then return the generated field type. -- Do not repair generated or API-returned contract fields in components unless the API contract or product requirement says they need normalization. Treat enums, statuses, and presence flags as exact contract values. -- Use generated enum objects and union types directly in props, comparisons, status logic, and i18n keys. Do not add local enum constants or parallel frontend enum/status layers unless they model real product state not represented by the API. Presentation-only tone maps should be keyed by the generated enum. -- Normalize or coerce only at a real boundary, such as user-entered forms, search, URL/query params, file names, DOM IDs, or legacy adapters. Preserve user-entered values when whitespace or formatting can be meaningful. -- Do not coerce nullable or optional API strings to `''` in query, derived model, or payload-building code. Keep `undefined` or `null` until the final boundary that requires a string. -- Do not use `value || undefined` for mutation payload fields where an empty string means "clear this value". Trim or normalize at the form boundary, then preserve `''` when the API contract treats it as an intentional update. -- Local UI models are fine for presentation, form state, select options, or guarded required-field refinements. Name them as UI concepts, not generated DTO mirrors. -- Required-value refinements are allowed only after same-branch filtering or early return. Prefer nullable-tolerant props for render-only data. -- When a component needs a stricter shape than a generated DTO, refine once at the API/query-to-UI boundary into a purpose-named UI type instead of hiding missing fields with generic fallback or coercion helpers. - -## Nullable API Data - -- Prefer nullable-tolerant call boundaries. Pass API-returned types through for render-only rows, and let the component render fallback, disabled state, or nothing. -- Narrow only where a real value is required, such as mutation params, route hrefs, select values, or query input. Build that target model with `flatMap`, a local loop, or an early return so the required value is captured in the same branch. -- If design says a field is the display value, use that field. Only the final component should decide whether a nullable display value renders a placeholder, hides content, or disables an action. -- Do not wrap required arrays or fields in null-fallback helpers. Use empty collection fallbacks only for not-yet-loaded query data or genuinely nullable collections at the owning render boundary. -- Do not drop rows only to satisfy props or React keys; use a stable fallback key when possible. -- Use conditional spreads or explicit pushes for conditional array items instead of `undefined` placeholders followed by a narrowing filter. -- Avoid truthiness type guards, `filter(Boolean)`, `filter(item => item.id)`, and `!` after those filters. -- Use type guards only for meaningful domain or runtime validation, such as enum membership, object shape, or a reusable business invariant. +- Do not hand-write DTO mirrors, widen generated fields/enums, or add parallel frontend enum/status layers unless they model product state not represented by the API. +- Use generated enum objects and union types directly in props, comparisons, status logic, and i18n keys. Presentation-only tone maps should be keyed by generated enums. +- Normalize or coerce only at real boundaries: user-entered forms, search, URL/query params, file names, DOM IDs, or legacy adapters. +- Do not coerce nullable or optional API strings to `''` in query, derived model, or payload-building code. Keep `null` or `undefined` until the final boundary requiring a string. +- Do not use `value || undefined` for mutation fields where `''` means "clear this value". Trim or normalize at the form boundary, then preserve intentional empty strings. +- Prefer nullable-tolerant render props for API-returned rows. Narrow only where a real value is required, such as mutation params, route hrefs, select values, query input, or required React keys. +- Build required values in the same branch that proves them, using `flatMap`, a local loop, or an early return. Avoid truthiness guards, `filter(Boolean)`, `filter(item => item.id)`, and `!` after filters. +- Use conditional spreads or explicit pushes for conditional array items instead of `undefined` placeholders followed by narrowing filters. +- Empty collection fallbacks are for not-yet-loaded query data or genuinely nullable collections at the owning render boundary, not for hiding required API fields. ## Queries And Mutations -- Keep `web/contract/*` as the single source of truth for API shape; follow existing domain/router patterns and the `{ params, query?, body? }` input shape. -- Consume queries directly with `useQuery(consoleQuery.xxx.queryOptions(...))` or `useQuery(marketplaceQuery.xxx.queryOptions(...))`. -- Do not promote a query or mutation to an atom just because the feature already has a state file. Use `atomWithQuery` or `atomWithMutation` only when the query/mutation reads atom state, is consumed by another atom, or is part of shared workflow orchestration. -- In `atomWithQuery` and `atomWithInfiniteQuery`, return generated `queryOptions()` or `infiniteOptions()` directly. Pass `enabled`, `retry`, `placeholderData`, `select`, and pagination options into that call instead of spreading generated options into a hand-built object. -- When prefetch and render consume the same server request, extract local query options or a query-options atom so `queryClient.prefetchQuery(...)` and `useQuery`/`atomWithQuery` share the exact generated query options. -- In `atomWithMutation`, return generated `mutationOptions()` directly when using generated clients. Put request shaping and submit orchestration in write atoms; do not rebuild mutation option objects just to pass through the generated mutation function. -- For custom query functions that do not come from generated clients, wrap the options object with TanStack `queryOptions(...)` so query atoms still return a query options contract. -- Avoid pass-through hooks and thin `web/service/use-*` wrappers that only rename `queryOptions()` or `mutationOptions()`. Extract a small `queryOptions` helper only when repeated call-site options justify it. -- Keep feature hooks for real orchestration, workflow state, or shared domain behavior. -- For TanStack cache data, use generated or query-derived types; do not create local wrappers for `getQueryData` or `getQueriesData`. -- For generated oRPC `queryOptions()` / `infiniteOptions()`, keep returning the generated options directly. When required input is missing, use a whole-input branch such as `input: condition ? validInput : skipToken` together with `enabled: Boolean(condition)` so no request runs and no fake payload is built. -- Do not put `skipToken` inside a nested placeholder payload, such as `{ params: { appInstanceId: skipToken } }`. Do not create hand-written "missing queryOptions" objects or coerce required IDs to `''`. -- Consume mutations directly with `useMutation(consoleQuery.xxx.mutationOptions(...))` or `useMutation(marketplaceQuery.xxx.mutationOptions(...))` when the mutation is owned by one component, menu, dialog, or row and its pending/error state is not consumed by feature atoms. In Jotai-backed workflow orchestration, expose mutations from feature state with `atomWithMutation` so pending/error state stays attached to the mutation atom. For component-owned custom mutation functions, use `useMutation(mutationOptions(...))` at the owner. -- Put shared cache behavior in `createTanstackQueryUtils(...experimental_defaults...)`; components may add UI feedback callbacks, but should not own shared invalidation rules. -- Component or atom mutation callbacks can handle local UI feedback such as toasts, closing dialogs, or navigation. They should not replace shared invalidation or add local cache patches for shared server state. -- For overlays that may open a heavier secondary surface, prefetch server data from the trigger/menu open event with `queryClient.prefetchQuery(queryOptions)` when the primitive exposes `onOpenChange`. Do not mount a hidden component or subscribe to a query only to warm the cache. Do not make an otherwise uncontrolled menu controlled only for prefetching. +- Keep `web/contract/*` as the API shape source of truth and follow the `{ params, query?, body? }` input shape. +- Consume generated queries with `useQuery(consoleQuery.xxx.queryOptions(...))` or `useQuery(marketplaceQuery.xxx.queryOptions(...))`. +- Consume owner-local mutations with `useMutation(consoleQuery.xxx.mutationOptions(...))` or `useMutation(marketplaceQuery.xxx.mutationOptions(...))` when pending/error state is not consumed by feature atoms. +- In `atomWithQuery`, `atomWithInfiniteQuery`, and `atomWithMutation`, return generated `queryOptions()`, `infiniteOptions()`, or `mutationOptions()` directly. Pass `enabled`, `retry`, `placeholderData`, `select`, and pagination options into the generated call instead of spreading options into a hand-built object. +- For generated oRPC options with missing required input, branch the whole input with `input: condition ? validInput : skipToken` and `enabled: Boolean(condition)`. Never place `skipToken` inside a nested placeholder payload or coerce required IDs to `''`. +- When prefetch and render use the same request, extract local query options or a query-options atom so `prefetchQuery` and `useQuery`/`atomWithQuery` share the exact options. +- For custom query or mutation functions, wrap options with TanStack `queryOptions(...)` or `mutationOptions(...)`. +- Avoid pass-through hooks and thin `web/service/use-*` wrappers that only rename generated options. Keep feature hooks for real orchestration, workflow state, or shared domain behavior. +- Put shared cache behavior in `createTanstackQueryUtils(...experimental_defaults...)`. Component or atom callbacks may handle local toasts, closing dialogs, and navigation, but should not replace shared invalidation or patch shared server state locally. +- For overlays that may open heavier secondary content, prefetch from the trigger/menu open event with `queryClient.prefetchQuery(queryOptions)` when `onOpenChange` is available. Do not mount hidden subscribers just to warm cache. - Do not use deprecated `useInvalid` or `useReset`. - Prefer `mutate(...)`; use `mutateAsync(...)` only when Promise semantics are required, and wrap awaited calls in `try/catch`. -## Component Boundaries +## Boundaries And Overlays -- Use the first level below a page or tab to organize independent page sections when it adds real structure. This layer is layout/semantic first, not automatically the data owner. -- Treat component names, semantic roles, and user- or design-marked visual regions as boundary constraints. Do not expand a child component's responsibility just because its data is useful nearby; keep adjacent UI as a sibling owner or introduce a correctly named broader owner. -- Split deeper components by the data and state each layer actually needs. Each component should access only necessary data, and ownership should stay at the lowest consumer. +- Use the first level below a page or tab to organize independent page sections when it adds structure. This layer is layout/semantic first, not automatically the data owner. +- Treat component names, semantic roles, and user- or design-marked visual regions as boundary constraints. Keep adjacent UI as a sibling owner or introduce a correctly named broader owner. - Keep cohesive forms, menu bodies, and one-off helpers local unless they need their own state, reuse, or semantic boundary. -- Separate hidden secondary surfaces from the trigger's main flow. For dialogs, dropdowns, popovers, and similar branches, extract a small local component that owns the trigger, open state, and hidden content when it would obscure the parent flow. -- Preserve composability by separating behavior ownership from layout ownership. A dropdown action may own its trigger, open state, and menu content; the caller owns placement such as slots, offsets, and alignment. -- When a dialog, dropdown, or popover component already accepts controlled `open` state, mount the surface unconditionally unless unmounting is required for performance or reset semantics. Use keyed scope or local state reset for reset behavior instead of `{open && }` wrappers. -- When opening a dialog from a menu item, keep the menu and dialog as sibling surfaces. Let the menu item command open the dialog through local state or scoped atoms, and mount the dialog outside the menu popup content. Avoid wrapping menu items with dialog triggers when the menu primitive already owns item activation and dismissal behavior. -- For dialogs and alert dialogs, keep the root component responsible for `open` wiring and put query/mutation hooks inside the content component when the work should only mount after the overlay opens. Do not put closed-surface remote work in the root just because the root owns the open atom. -- Prefer uncontrolled overlay roots when the library can own their open state. Use `onOpenChange` for side effects such as prefetching, and CSS/data selectors for visual open-state styling instead of adding controlled state only for observation. -- Avoid unnecessary DOM hierarchy. Do not add wrapper elements unless they provide layout, semantics, accessibility, state ownership, or integration with a library API; prefer fragments or styling an existing element when possible. -- Avoid shallow wrappers, hook-to-props adapter components, layout-only render-prop wrappers, children-as-pass-through composition, and prop renaming unless the wrapper adds validation, orchestration, error handling, state ownership, or a real semantic boundary. If a component only calls a hook, forwards props, or passes trigger/content through to one child, move the logic into that child or make the wrapper own a real surface. +- Separate hidden secondary surfaces from the trigger's main flow. For dialogs, dropdowns, popovers, and similar branches, extract a small local component when hidden content would obscure the parent. +- Preserve composability by separating behavior ownership from placement ownership: an action can own trigger/open/menu content while the caller owns slots, offsets, and alignment. +- When a dialog, dropdown, or popover accepts controlled `open`, mount it unconditionally unless unmounting is required for performance or reset semantics. Use keyed scope or local state reset instead of `{open && }` wrappers. +- When opening a dialog from a menu item, keep the menu and dialog as sibling surfaces. Let the menu command open the dialog, and mount the dialog outside menu popup content. +- For dialogs and alert dialogs, keep the root responsible for `open` wiring and put query/mutation hooks inside the content component when work should mount only after the overlay opens. +- Prefer uncontrolled overlay roots when the library can own open state. Use `onOpenChange` for side effects and CSS/data selectors for open-state styling. +- Avoid wrapper DOM unless it provides layout, semantics, accessibility, state ownership, or library integration. Avoid shallow wrappers, hook-to-props adapters, layout-only render props, children pass-through wrappers, and prop renaming unless they add real behavior or a real boundary. -## You Might Not Need An Effect - -- Use Effects only to synchronize with external systems such as browser APIs, non-React widgets, subscriptions, timers, analytics that must run because the component was shown, or imperative DOM integration. -- Do not use Effects to transform props or state for rendering. Calculate derived values during render, and use `useMemo` only when the calculation is actually expensive. -- Do not use Effects to handle user actions. Put action-specific logic in the event handler where the cause is known. -- Do not use Effects to copy one state value into another state value representing the same concept. Pick one source of truth and derive the rest during render. -- Do not reset or adjust state from props with an Effect. Prefer a `key` reset, storing a stable ID and deriving the selected object, or guarded same-component render-time adjustment when truly necessary. -- For forms initialized from query data, prefer keyed remounts or surface-entry hydration of form/field atoms over an Effect that copies query data into form state. -- Prefer framework data APIs or TanStack Query for data fetching instead of writing request Effects in components. -- If an Effect still seems necessary, first name the external system it synchronizes with. If there is no external system, remove the Effect and restructure the state or event flow. - -## Navigation And Performance +## Effects, Navigation, And Performance +- Use Effects only to synchronize with external systems. Do not use Effects to transform props/state for rendering, handle user actions, copy state, reset state from props, or fetch data. +- For forms initialized from query data, prefer keyed remounts or surface-entry atom hydration over Effects that copy query data into form state. +- Prefer framework data APIs or TanStack Query for data fetching. - Prefer `Link` for normal navigation. Use router APIs only for command-flow side effects such as mutation success, guarded redirects, or form submission. -- Before reaching for `memo`, first try moving changing state down to the smallest component that actually uses it so unrelated sibling trees stay untouched. -- If changing state must wrap other content, lift the unchanged content up and pass it as `children` so the stateful wrapper can update without React visiting that subtree. +- Before using `memo`, move changing state down to the smallest component that uses it. If state must wrap stable content, lift the stable content up and pass it as `children`. - Avoid `memo`, `useMemo`, and `useCallback` unless there is a clear performance reason. diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml index e4c686adb31..c80e1f3d2be 100644 --- a/.github/workflows/style.yml +++ b/.github/workflows/style.yml @@ -105,6 +105,10 @@ jobs: if: steps.changed-files.outputs.any_changed == 'true' run: vp run knip + - name: Web dead code check production + if: steps.changed-files.outputs.any_changed == 'true' + run: vp run knip:production + ts-common-style: name: TS Common runs-on: depot-ubuntu-24.04 diff --git a/eslint-suppressions.json b/eslint-suppressions.json index 48f94044d8d..ba5b7366185 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -121,11 +121,6 @@ "count": 3 } }, - "web/__tests__/navigation-utils.test.ts": { - "ts/no-explicit-any": { - "count": 1 - } - }, "web/__tests__/plugin-tool-workflow-error.test.tsx": { "ts/no-explicit-any": { "count": 2 @@ -343,14 +338,6 @@ "count": 4 } }, - "web/app/components/app-sidebar/app-sidebar-dropdown.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/app-sidebar/dataset-info/__tests__/index.spec.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 1 @@ -559,14 +546,6 @@ "count": 1 } }, - "web/app/components/app/configuration/config-var/select-type-item/index.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/app/configuration/config-var/select-var-type.tsx": { "ts/no-explicit-any": { "count": 1 @@ -616,17 +595,6 @@ "count": 4 } }, - "web/app/components/app/configuration/config/assistant-type-picker/index.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - }, - "ts/no-explicit-any": { - "count": 1 - } - }, "web/app/components/app/configuration/config/automatic/get-automatic-res.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 1 @@ -808,11 +776,6 @@ "count": 1 } }, - "web/app/components/app/configuration/prompt-value-panel/utils.ts": { - "ts/no-explicit-any": { - "count": 1 - } - }, "web/app/components/app/create-app-dialog/app-list/index.tsx": { "no-restricted-imports": { "count": 1 @@ -1001,11 +964,6 @@ "count": 1 } }, - "web/app/components/apps/new-app-card.tsx": { - "react/set-state-in-effect": { - "count": 3 - } - }, "web/app/components/apps/starred-app-card.tsx": { "jsx-a11y/no-noninteractive-element-to-interactive-role": { "count": 1 @@ -1622,17 +1580,6 @@ "count": 2 } }, - "web/app/components/base/form/components/field/mixed-variable-text-input/placeholder.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 2 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 2 - }, - "ts/no-explicit-any": { - "count": 1 - } - }, "web/app/components/base/form/components/field/variable-selector.tsx": { "no-console": { "count": 1 @@ -1648,22 +1595,12 @@ "count": 1 } }, - "web/app/components/base/form/form-scenarios/base/index.tsx": { - "react/static-components": { - "count": 2 - } - }, "web/app/components/base/form/form-scenarios/base/types.ts": { "erasable-syntax-only/enums": { "count": 1 }, "ts/no-explicit-any": { - "count": 3 - } - }, - "web/app/components/base/form/form-scenarios/demo/index.tsx": { - "no-console": { - "count": 2 + "count": 1 } }, "web/app/components/base/form/form-scenarios/input-field/__tests__/field.spec.tsx": { @@ -1684,24 +1621,6 @@ "count": 2 } }, - "web/app/components/base/form/form-scenarios/node-panel/__tests__/field.spec.tsx": { - "react/static-components": { - "count": 2 - } - }, - "web/app/components/base/form/form-scenarios/node-panel/field.tsx": { - "ts/no-explicit-any": { - "count": 1 - } - }, - "web/app/components/base/form/form-scenarios/node-panel/types.ts": { - "erasable-syntax-only/enums": { - "count": 1 - }, - "ts/no-explicit-any": { - "count": 2 - } - }, "web/app/components/base/form/hooks/index.ts": { "no-barrel-files/no-barrel-files": { "count": 3 @@ -1807,7 +1726,7 @@ }, "web/app/components/base/icons/src/vender/line/arrows/index.ts": { "no-barrel-files/no-barrel-files": { - "count": 6 + "count": 5 } }, "web/app/components/base/icons/src/vender/line/communication/index.ts": { @@ -1832,7 +1751,7 @@ }, "web/app/components/base/icons/src/vender/line/files/index.ts": { "no-barrel-files/no-barrel-files": { - "count": 6 + "count": 4 } }, "web/app/components/base/icons/src/vender/line/financeAndECommerce/index.ts": { @@ -1842,7 +1761,7 @@ }, "web/app/components/base/icons/src/vender/line/general/index.ts": { "no-barrel-files/no-barrel-files": { - "count": 11 + "count": 10 } }, "web/app/components/base/icons/src/vender/line/images/index.ts": { @@ -1850,11 +1769,6 @@ "count": 1 } }, - "web/app/components/base/icons/src/vender/line/layout/index.ts": { - "no-barrel-files/no-barrel-files": { - "count": 1 - } - }, "web/app/components/base/icons/src/vender/line/mediaAndDevices/index.ts": { "no-barrel-files/no-barrel-files": { "count": 2 @@ -1917,7 +1831,7 @@ }, "web/app/components/base/icons/src/vender/solid/education/index.ts": { "no-barrel-files/no-barrel-files": { - "count": 3 + "count": 2 } }, "web/app/components/base/icons/src/vender/solid/files/index.ts": { @@ -1986,17 +1900,6 @@ "count": 3 } }, - "web/app/components/base/image-uploader/audio-preview.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/media-has-caption": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/base/image-uploader/hooks.ts": { "ts/no-explicit-any": { "count": 4 @@ -2034,17 +1937,6 @@ "count": 2 } }, - "web/app/components/base/image-uploader/video-preview.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/media-has-caption": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/base/inline-delete-confirm/index.stories.tsx": { "no-console": { "count": 2 @@ -2594,27 +2486,6 @@ "count": 4 } }, - "web/app/components/base/with-input-validation/index.stories.tsx": { - "jsx-a11y/aria-role": { - "count": 7 - }, - "no-console": { - "count": 1 - } - }, - "web/app/components/base/with-input-validation/index.tsx": { - "ts/no-explicit-any": { - "count": 1 - } - }, - "web/app/components/billing/header-billing-btn/index.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/billing/plan/assets/index.tsx": { "no-barrel-files/no-barrel-files": { "count": 4 @@ -2892,14 +2763,6 @@ "count": 3 } }, - "web/app/components/datasets/create/step-two/preview-item/index.tsx": { - "erasable-syntax-only/enums": { - "count": 1 - }, - "react-refresh/only-export-components": { - "count": 1 - } - }, "web/app/components/datasets/create/website/base/crawled-result-item.tsx": { "jsx-a11y/label-has-associated-control": { "count": 1 @@ -3364,14 +3227,6 @@ "count": 1 } }, - "web/app/components/datasets/list/dataset-card/operation-item.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/datasets/metadata/edit-metadata-batch/add-row.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 1 @@ -3655,19 +3510,6 @@ "count": 2 } }, - "web/app/components/header/account-setting/key-validator/Operate.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 4 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 4 - } - }, - "web/app/components/header/account-setting/key-validator/declarations.ts": { - "ts/no-explicit-any": { - "count": 1 - } - }, "web/app/components/header/account-setting/members-page/edit-workspace-modal/index.tsx": { "jsx-a11y/no-autofocus": { "count": 1 @@ -3900,14 +3742,6 @@ "count": 1 } }, - "web/app/components/header/nav/index.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/main-nav/components/workspace-switcher.tsx": { "jsx-a11y/no-autofocus": { "count": 1 @@ -4044,11 +3878,6 @@ "count": 2 } }, - "web/app/components/plugins/plugin-auth/utils.ts": { - "ts/no-explicit-any": { - "count": 2 - } - }, "web/app/components/plugins/plugin-detail-panel/__tests__/operation-dropdown.spec.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 1 @@ -4212,17 +4041,9 @@ "count": 1 } }, - "web/app/components/plugins/plugin-detail-panel/tool-selector/__tests__/index.spec.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 5 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 5 - } - }, "web/app/components/plugins/plugin-detail-panel/tool-selector/components/index.ts": { "no-barrel-files/no-barrel-files": { - "count": 7 + "count": 6 } }, "web/app/components/plugins/plugin-detail-panel/tool-selector/components/reasoning-config-form.tsx": { @@ -4252,11 +4073,6 @@ "count": 3 } }, - "web/app/components/plugins/plugin-detail-panel/tool-selector/hooks/index.ts": { - "no-barrel-files/no-barrel-files": { - "count": 2 - } - }, "web/app/components/plugins/plugin-detail-panel/tool-selector/index.tsx": { "no-restricted-imports": { "count": 1 @@ -4297,14 +4113,6 @@ "count": 1 } }, - "web/app/components/plugins/plugin-page/filter-management/__tests__/index.spec.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/plugins/plugin-page/filter-management/category-filter.tsx": { "no-restricted-imports": { "count": 1 @@ -4629,11 +4437,6 @@ "count": 1 } }, - "web/app/components/share/utils.ts": { - "ts/no-explicit-any": { - "count": 2 - } - }, "web/app/components/snippet-list/components/snippet-card.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 1 @@ -4971,11 +4774,6 @@ "count": 4 } }, - "web/app/components/workflow/block-selector/use-check-vertical-scrollbar.ts": { - "react/set-state-in-effect": { - "count": 1 - } - }, "web/app/components/workflow/block-selector/use-sticky-scroll.ts": { "erasable-syntax-only/enums": { "count": 1 @@ -5342,30 +5140,6 @@ "count": 1 } }, - "web/app/components/workflow/nodes/_base/components/mixed-variable-text-input/__tests__/placeholder.spec.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, - "web/app/components/workflow/nodes/_base/components/mixed-variable-text-input/index.tsx": { - "ts/no-explicit-any": { - "count": 1 - } - }, - "web/app/components/workflow/nodes/_base/components/mixed-variable-text-input/placeholder.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 2 - }, - "ts/no-explicit-any": { - "count": 1 - } - }, "web/app/components/workflow/nodes/_base/components/next-step/operator.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 2 @@ -5421,14 +5195,6 @@ "count": 1 } }, - "web/app/components/workflow/nodes/_base/components/support-var-input/index.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/workflow/nodes/_base/components/switch-plugin-version.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 1 @@ -5627,11 +5393,6 @@ "count": 7 } }, - "web/app/components/workflow/nodes/agent/use-single-run-form-params.ts": { - "ts/no-explicit-any": { - "count": 3 - } - }, "web/app/components/workflow/nodes/answer/default.ts": { "ts/no-explicit-any": { "count": 1 @@ -5675,20 +5436,6 @@ "count": 1 } }, - "web/app/components/workflow/nodes/code/dependency-picker.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-autofocus": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - }, - "no-restricted-imports": { - "count": 1 - } - }, "web/app/components/workflow/nodes/code/types.ts": { "erasable-syntax-only/enums": { "count": 1 @@ -5784,14 +5531,6 @@ "count": 1 } }, - "web/app/components/workflow/nodes/http/components/key-value/bulk-edit/index.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/workflow/nodes/http/components/key-value/key-value-edit/index.tsx": { "ts/no-explicit-any": { "count": 2 @@ -6385,11 +6124,6 @@ "count": 1 } }, - "web/app/components/workflow/nodes/tool/components/input-var-list.tsx": { - "ts/no-explicit-any": { - "count": 7 - } - }, "web/app/components/workflow/nodes/tool/components/mixed-variable-text-input/index.tsx": { "ts/no-explicit-any": { "count": 1 @@ -6487,11 +6221,6 @@ "count": 1 } }, - "web/app/components/workflow/nodes/trigger-plugin/utils/form-helpers.ts": { - "ts/no-explicit-any": { - "count": 7 - } - }, "web/app/components/workflow/nodes/trigger-schedule/default.ts": { "regexp/no-unused-capturing-group": { "count": 2 @@ -6843,14 +6572,6 @@ "count": 1 } }, - "web/app/components/workflow/run/__tests__/loop-result-panel.spec.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/workflow/run/__tests__/special-result-panel.spec.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 1 @@ -6938,14 +6659,6 @@ "count": 2 } }, - "web/app/components/workflow/run/loop-result-panel.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/workflow/run/node.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 1 @@ -7022,26 +6735,11 @@ "count": 11 } }, - "web/app/components/workflow/run/utils/format-log/graph-to-log-struct.ts": { - "ts/no-explicit-any": { - "count": 7 - } - }, "web/app/components/workflow/run/utils/format-log/index.ts": { "ts/no-explicit-any": { "count": 2 } }, - "web/app/components/workflow/run/utils/format-log/iteration/index.ts": { - "ts/no-explicit-any": { - "count": 1 - } - }, - "web/app/components/workflow/run/utils/format-log/loop/index.ts": { - "ts/no-explicit-any": { - "count": 1 - } - }, "web/app/components/workflow/run/utils/format-log/parallel/index.ts": { "no-console": { "count": 4 @@ -7091,11 +6789,6 @@ "count": 1 } }, - "web/app/components/workflow/utils/debug.ts": { - "ts/no-explicit-any": { - "count": 1 - } - }, "web/app/components/workflow/utils/index.ts": { "no-barrel-files/no-barrel-files": { "count": 10 @@ -7924,11 +7617,6 @@ "count": 6 } }, - "web/utils/navigation.spec.ts": { - "ts/no-explicit-any": { - "count": 4 - } - }, "web/utils/tool-call.spec.ts": { "ts/no-explicit-any": { "count": 1 diff --git a/web/.storybook/utils/form-story-wrapper.tsx b/web/.storybook/utils/form-story-wrapper.tsx deleted file mode 100644 index 7503e9905d3..00000000000 --- a/web/.storybook/utils/form-story-wrapper.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import type { ReactNode } from 'react' -import { useStore } from '@tanstack/react-form' -import { useState } from 'react' -import { useAppForm } from '@/app/components/base/form' - -type UseAppFormOptions = Parameters[0] -type AppFormInstance = ReturnType - -type FormStoryWrapperProps = { - options?: UseAppFormOptions - children: (form: AppFormInstance) => ReactNode - title?: string - subtitle?: string -} - -export const FormStoryWrapper = ({ - options, - children, - title, - subtitle, -}: FormStoryWrapperProps) => { - const [lastSubmitted, setLastSubmitted] = useState(null) - const [submitCount, setSubmitCount] = useState(0) - - const form = useAppForm({ - ...options, - onSubmit: (context) => { - setSubmitCount(count => count + 1) - setLastSubmitted(context.value) - options?.onSubmit?.(context) - }, - }) - - const values = useStore(form.store, state => state.values) - const isSubmitting = useStore(form.store, state => state.isSubmitting) - const canSubmit = useStore(form.store, state => state.canSubmit) - - return ( -
-
- {(title || subtitle) && ( -
- {title &&

{title}

} - {subtitle &&

{subtitle}

} -
- )} - {children(form)} -
- -
- ) -} - -export type FormStoryRender = (form: AppFormInstance) => ReactNode diff --git a/web/__tests__/app-sidebar/sidebar-shell-flow.test.tsx b/web/__tests__/app-sidebar/sidebar-shell-flow.test.tsx deleted file mode 100644 index c1f3a1c62d4..00000000000 --- a/web/__tests__/app-sidebar/sidebar-shell-flow.test.tsx +++ /dev/null @@ -1,151 +0,0 @@ -import type { SVGProps } from 'react' -import { fireEvent, render, screen } from '@testing-library/react' -import * as React from 'react' -import { beforeEach, describe, expect, it, vi } from 'vitest' -import AppDetailNav from '@/app/components/app-sidebar' - -const mockSetDetailSidebarMode = vi.fn() - -let mockDetailSidebarMode = 'expand' -let mockPathname = '/app/app-1/logs' -let mockSelectedSegment = 'logs' -let mockIsHovering = true -let hotkeyHandler: ((event: { preventDefault: () => void }) => void) | null = null - -vi.mock('react-i18next', () => ({ - useTranslation: () => ({ - t: (key: string) => key, - }), -})) - -vi.mock('@/app/components/main-nav/storage', () => ({ - useDetailSidebarMode: () => [mockDetailSidebarMode, mockSetDetailSidebarMode], -})) - -vi.mock('@/next/navigation', () => ({ - usePathname: () => mockPathname, - useSelectedLayoutSegment: () => mockSelectedSegment, -})) - -vi.mock('@/next/link', () => ({ - default: ({ - href, - children, - className, - title, - }: { - href: string - children?: React.ReactNode - className?: string - title?: string - }) => ( - - {children} - - ), -})) - -vi.mock('ahooks', () => ({ - useHover: () => mockIsHovering, -})) - -vi.mock('@tanstack/react-hotkeys', async (importOriginal) => { - const actual = await importOriginal() - return { - ...actual, - useHotkey: (_hotkey: string, handler: (event: { preventDefault: () => void }) => void) => { - hotkeyHandler = handler - }, - } -}) - -vi.mock('@/hooks/use-breakpoints', () => ({ - default: () => 'desktop', - MediaType: { - mobile: 'mobile', - desktop: 'desktop', - }, -})) - -vi.mock('@/context/event-emitter', () => ({ - useEventEmitterContextContext: () => ({ - eventEmitter: { - useSubscription: vi.fn(), - }, - }), -})) - -vi.mock('@/context/app-context', () => ({ - useAppContext: () => ({ - isCurrentWorkspaceEditor: true, - }), -})) - -vi.mock('@langgenius/dify-ui/dropdown-menu', () => import('@/__mocks__/base-ui-dropdown-menu')) -vi.mock('@langgenius/dify-ui/tooltip', () => import('@/__mocks__/base-ui-tooltip')) - -vi.mock('@/app/components/app-sidebar/app-info', () => ({ - default: ({ - expand, - onlyShowDetail, - openState, - }: { - expand: boolean - onlyShowDetail?: boolean - openState?: boolean - }) => ( -
- ), -})) - -const MockIcon = (props: SVGProps) => - -const navigation = [ - { name: 'Overview', href: '/app/app-1/overview', icon: MockIcon, selectedIcon: MockIcon }, - { name: 'Logs', href: '/app/app-1/logs', icon: MockIcon, selectedIcon: MockIcon }, -] - -describe('App Sidebar Shell Flow', () => { - beforeEach(() => { - vi.clearAllMocks() - localStorage.clear() - mockDetailSidebarMode = 'expand' - mockPathname = '/app/app-1/logs' - mockSelectedSegment = 'logs' - mockIsHovering = true - hotkeyHandler = null - }) - - it('renders the expanded sidebar, marks the active nav item, and toggles collapse by click and shortcut', () => { - render() - - expect(screen.getByTestId('app-info')).toHaveAttribute('data-expand', 'true') - - const logsLink = screen.getByRole('link', { name: /Logs/i }) - expect(logsLink.className).toContain('bg-components-menu-item-bg-active') - - fireEvent.click(screen.getByRole('button')) - expect(mockSetDetailSidebarMode).toHaveBeenCalledWith('collapse') - - const preventDefault = vi.fn() - hotkeyHandler?.({ preventDefault }) - - expect(preventDefault).toHaveBeenCalled() - expect(mockSetDetailSidebarMode).toHaveBeenCalledWith('collapse') - }) - - it('keeps the normal sidebar on workflow routes', () => { - mockPathname = '/app/app-1/workflow' - mockSelectedSegment = 'workflow' - - render() - - expect(screen.getByTestId('app-info')).toBeInTheDocument() - expect(screen.getByRole('link', { name: /Overview/i })).toBeInTheDocument() - expect(screen.getByRole('link', { name: /Logs/i })).toBeInTheDocument() - }) -}) diff --git a/web/__tests__/base/form-demo-flow.test.tsx b/web/__tests__/base/form-demo-flow.test.tsx deleted file mode 100644 index afb36528c0f..00000000000 --- a/web/__tests__/base/form-demo-flow.test.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { render, screen, waitFor, within } from '@testing-library/react' -import userEvent from '@testing-library/user-event' -import { beforeEach, describe, expect, it, vi } from 'vitest' -import DemoForm from '@/app/components/base/form/form-scenarios/demo' - -describe('Base Form Demo Flow', () => { - const consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => {}) - - beforeEach(() => { - vi.clearAllMocks() - }) - - it('reveals contact fields and submits the composed form values through the shared form actions', async () => { - const user = userEvent.setup() - render() - - expect(screen.queryByRole('heading', { name: /contacts/i })).not.toBeInTheDocument() - - await user.type(screen.getByRole('textbox', { name: /^name$/i }), 'Alice') - await user.type(screen.getByRole('textbox', { name: /^surname$/i }), 'Smith') - await user.click(screen.getByText(/i accept the terms and conditions/i)) - - expect(await screen.findByRole('heading', { name: /contacts/i })).toBeInTheDocument() - - await user.type(screen.getByRole('textbox', { name: /^email$/i }), 'alice@example.com') - - const preferredMethodLabel = screen.getByText('Preferred Contact Method') - const preferredMethodField = preferredMethodLabel.parentElement?.parentElement - expect(preferredMethodField).toBeTruthy() - - await user.click(within(preferredMethodField as HTMLElement).getByText('Email')) - await user.click(screen.getByText('Whatsapp')) - - const submitButton = screen.getByRole('button', { name: /operation\.submit/i }) - expect(submitButton).toBeEnabled() - await user.click(submitButton) - - await waitFor(() => { - expect(consoleLogSpy).toHaveBeenCalledWith('Form submitted:', expect.objectContaining({ - name: 'Alice', - surname: 'Smith', - isAcceptingTerms: true, - contact: expect.objectContaining({ - email: 'alice@example.com', - preferredContactMethod: 'whatsapp', - }), - })) - }) - }) - - it('removes the nested contact section again when the name field is cleared', async () => { - const user = userEvent.setup() - render() - - const nameInput = screen.getByRole('textbox', { name: /^name$/i }) - await user.type(nameInput, 'Alice') - expect(await screen.findByRole('heading', { name: /contacts/i })).toBeInTheDocument() - - await user.clear(nameInput) - - await waitFor(() => { - expect(screen.queryByRole('heading', { name: /contacts/i })).not.toBeInTheDocument() - }) - }) -}) diff --git a/web/__tests__/billing/billing-integration.test.tsx b/web/__tests__/billing/billing-integration.test.tsx index 2fde9b506f4..e82a6d8eac2 100644 --- a/web/__tests__/billing/billing-integration.test.tsx +++ b/web/__tests__/billing/billing-integration.test.tsx @@ -7,7 +7,6 @@ import AnnotationFullModal from '@/app/components/billing/annotation-full/modal' import AppsFull from '@/app/components/billing/apps-full-in-dialog' import Billing from '@/app/components/billing/billing-page' import { defaultPlan, NUM_INFINITE } from '@/app/components/billing/config' -import HeaderBillingBtn from '@/app/components/billing/header-billing-btn' import PlanComp from '@/app/components/billing/plan' import { PlanUpgradeModal } from '@/app/components/billing/plan-upgrade-modal' import PriorityLabel from '@/app/components/billing/priority-label' @@ -696,83 +695,7 @@ describe('Capacity Full Components Integration', () => { }) // ═══════════════════════════════════════════════════════════════════════════ -// 5. Header Billing Button Integration -// Tests HeaderBillingBtn behavior for different plan states -// ═══════════════════════════════════════════════════════════════════════════ -describe('Header Billing Button Integration', () => { - beforeEach(() => { - vi.clearAllMocks() - setupAppContext() - }) - - it('should render UpgradeBtn (premium badge) for sandbox plan', () => { - setupProviderContext({ type: Plan.sandbox }) - - render() - - expect(screen.getByText(/upgradeBtn\.encourageShort/i)).toBeInTheDocument() - }) - - it('should render "pro" badge for professional plan', () => { - setupProviderContext({ type: Plan.professional }) - - render() - - expect(screen.getByText('pro')).toBeInTheDocument() - expect(screen.queryByText(/upgradeBtn/i)).not.toBeInTheDocument() - }) - - it('should render "team" badge for team plan', () => { - setupProviderContext({ type: Plan.team }) - - render() - - expect(screen.getByText('team')).toBeInTheDocument() - }) - - it('should return null when billing is disabled', () => { - setupProviderContext({ type: Plan.sandbox }, { enableBilling: false }) - - const { container } = render() - - expect(container.innerHTML).toBe('') - }) - - it('should return null when plan is not fetched yet', () => { - setupProviderContext({ type: Plan.sandbox }, { isFetchedPlan: false }) - - const { container } = render() - - expect(container.innerHTML).toBe('') - }) - - it('should call onClick when clicking pro/team badge in non-display-only mode', async () => { - const user = userEvent.setup() - const onClick = vi.fn() - setupProviderContext({ type: Plan.professional }) - - render() - - await user.click(screen.getByText('pro')) - - expect(onClick).toHaveBeenCalledTimes(1) - }) - - it('should not call onClick when isDisplayOnly is true', async () => { - const user = userEvent.setup() - const onClick = vi.fn() - setupProviderContext({ type: Plan.professional }) - - render() - - await user.click(screen.getByText('pro')) - - expect(onClick).not.toHaveBeenCalled() - }) -}) - -// ═══════════════════════════════════════════════════════════════════════════ -// 6. PriorityLabel Integration +// 5. PriorityLabel Integration // Tests priority badge display for different plan types // ═══════════════════════════════════════════════════════════════════════════ describe('PriorityLabel Integration', () => { diff --git a/web/__tests__/header/nav-flow.test.tsx b/web/__tests__/header/nav-flow.test.tsx deleted file mode 100644 index 33927f19da4..00000000000 --- a/web/__tests__/header/nav-flow.test.tsx +++ /dev/null @@ -1,168 +0,0 @@ -import { fireEvent, render, screen, waitFor } from '@testing-library/react' -import userEvent from '@testing-library/user-event' -import * as React from 'react' -import { beforeEach, describe, expect, it, vi } from 'vitest' -import Nav from '@/app/components/header/nav' -import { AppModeEnum } from '@/types/app' - -const mockPush = vi.fn() -const mockSetAppDetail = vi.fn() -const mockOnCreate = vi.fn() -const mockOnLoadMore = vi.fn() - -let mockSelectedSegment = 'app' -let mockIsCurrentWorkspaceEditor = true - -vi.mock('react-i18next', () => ({ - useTranslation: () => ({ - t: (key: string) => key, - }), -})) - -vi.mock('@/next/navigation', () => ({ - useSelectedLayoutSegment: () => mockSelectedSegment, - useRouter: () => ({ - push: mockPush, - }), -})) - -vi.mock('@/next/link', () => ({ - default: ({ - href, - children, - }: { - href: string - children?: React.ReactNode - }) => {children}, -})) - -vi.mock('@/app/components/app/store', () => ({ - useStore: () => mockSetAppDetail, -})) - -vi.mock('@/context/app-context', () => ({ - useAppContext: () => ({ - isCurrentWorkspaceEditor: mockIsCurrentWorkspaceEditor, - workspacePermissionKeys: mockIsCurrentWorkspaceEditor ? ['app.create_and_management'] : [], - }), -})) - -const navigationItems = [ - { - id: 'app-1', - name: 'Alpha', - link: '/app/app-1/configuration', - icon_type: 'emoji' as const, - icon: '🤖', - icon_background: '#FFEAD5', - icon_url: null, - mode: AppModeEnum.CHAT, - }, - { - id: 'app-2', - name: 'Bravo', - link: '/app/app-2/workflow', - icon_type: 'emoji' as const, - icon: '⚙️', - icon_background: '#E0F2FE', - icon_url: null, - mode: AppModeEnum.WORKFLOW, - }, -] - -const curNav = { - id: 'app-1', - name: 'Alpha', - icon_type: 'emoji' as const, - icon: '🤖', - icon_background: '#FFEAD5', - icon_url: null, - mode: AppModeEnum.CHAT, -} - -const renderNav = (nav = curNav) => { - return render( -