diff --git a/web/i18n/de-DE/app-debug.ts b/web/i18n/de-DE/app-debug.ts index 7824352ff8..07c9d4be99 100644 --- a/web/i18n/de-DE/app-debug.ts +++ b/web/i18n/de-DE/app-debug.ts @@ -326,6 +326,7 @@ const translation = { 'both': 'Beide', 'uploadFileTypes': 'Dateitypen hochladen', 'maxNumberOfUploads': 'Maximale Anzahl von Uploads', + 'maxNumberTip': 'Dokument < {{docLimit}}, Bild < {{imgLimit}}, Audio < {{audioLimit}}, Video < {{videoLimit}}', 'number': 'Zahl', 'editModalTitle': 'Eingabefeld bearbeiten', 'required': 'Erforderlich', diff --git a/web/i18n/de-DE/app-log.ts b/web/i18n/de-DE/app-log.ts index d9edd88d13..5c1232dfe8 100644 --- a/web/i18n/de-DE/app-log.ts +++ b/web/i18n/de-DE/app-log.ts @@ -20,6 +20,7 @@ const translation = { version: 'VERSION', tokens: 'TOKEN', startTime: 'STARTZEIT', + triggered_from: 'AUSGELÖST DURCH', }, pagination: { previous: 'Vorherige', @@ -97,6 +98,15 @@ const translation = { iteration: 'Iteration', finalProcessing: 'Endverarbeitung', }, + triggerBy: { + debugging: 'Fehlerbehebung', + appRun: 'Webanwendung', + webhook: 'Webhook', + schedule: 'Zeitplan', + plugin: 'Plugin', + ragPipelineRun: 'RAG-Pipeline', + ragPipelineDebugging: 'RAG-Debugging', + }, } export default translation diff --git a/web/i18n/de-DE/app-overview.ts b/web/i18n/de-DE/app-overview.ts index 9fa93d4aff..c27ac0c181 100644 --- a/web/i18n/de-DE/app-overview.ts +++ b/web/i18n/de-DE/app-overview.ts @@ -114,7 +114,11 @@ const translation = { }, }, launch: 'Abschießen', - enableTooltip: {}, + enableTooltip: { + description: 'Um diese Funktion zu aktivieren, fügen Sie bitte einen Benutzer-Eingabe-Knoten zum Canvas hinzu. (Kann sich bereits im Entwurf befinden, wird nach der Veröffentlichung wirksam)', + learnMore: 'Mehr erfahren', + }, + title: 'Webanwendung', }, apiInfo: { title: 'Backend-Service-API', @@ -126,7 +130,14 @@ const translation = { running: 'In Betrieb', disable: 'Deaktivieren', }, - triggerInfo: {}, + triggerInfo: { + title: 'Auslöser', + explanation: 'Verwaltung von Workflow-Triggern', + triggersAdded: '{{count}} Auslöser hinzugefügt', + noTriggerAdded: 'Kein Auslöser hinzugefügt', + triggerStatusDescription: 'Der Status des Trigger-Knotens wird hier angezeigt. (Kann bereits im Entwurf vorhanden sein, tritt nach der Veröffentlichung in Kraft)', + learnAboutTriggers: 'Erfahren Sie mehr über Auslöser', + }, disableTooltip: { triggerMode: 'Die Funktion {{feature}} wird im Trigger-Knoten-Modus nicht unterstützt.', }, diff --git a/web/i18n/de-DE/billing.ts b/web/i18n/de-DE/billing.ts index 973f866c7b..dac08eb1d0 100644 --- a/web/i18n/de-DE/billing.ts +++ b/web/i18n/de-DE/billing.ts @@ -98,6 +98,8 @@ const translation = { triggerEvents: { tooltip: 'Die Anzahl der Ereignisse, die Workflows automatisch über Plugin-, Zeitplan- oder Webhook-Auslöser starten.', unlimited: 'Unbegrenzte Auslöser-Ereignisse', + sandbox: '{{count,number}} Ereignisse auslösen', + professional: '{{count,number}} Auslöseereignisse/Monat', }, workflowExecution: { faster: 'Schnellere Arbeitsablauf-Ausführung', @@ -107,6 +109,11 @@ const translation = { }, startNodes: { unlimited: 'Unbegrenzte Auslöser/Workflows', + limited: 'Bis zu {{count}} Auslöser/Workflows', + }, + title: { + plans: 'Pläne', + description: 'Wählen Sie den Plan, der am besten zu den Bedürfnissen Ihres Teams passt.', }, }, plans: { @@ -133,17 +140,7 @@ const translation = { price: 'Benutzerdefiniert', priceTip: 'Jährliche Abrechnung nur', for: 'Für große Teams', - features: [ - 'Skalierbare Bereitstellungslösungen in Unternehmensqualität', - 'Kommerzielle Lizenzierung', - 'Exklusive Enterprise-Funktionen', - 'Mehrere Arbeitsbereiche und Unternehmensverwaltung', - 'SSO (Single Sign-On)', - 'Vereinbarte SLAs mit Dify-Partnern', - 'Erweiterte Sicherheitsfunktionen und Kontrollen', - 'Offizielle Updates und Wartung durch Dify', - 'Professioneller technischer Support', - ], + features: ['Unternehmensgerechte skalierbare Bereitstellungslösungen', 'Gewerbliche Lizenzgenehmigung', 'Exklusive Unternehmensfunktionen', 'Mehrere Arbeitsbereiche & Unternehmensverwaltung', 'SSO', 'Von Dify-Partnern ausgehandelte SLAs', 'Erweiterte Sicherheit & Steuerungen', 'Updates und Wartung offiziell von Dify', 'Professioneller technischer Support'], }, community: { description: 'Für Einzelbenutzer, kleine Teams oder nicht-kommerzielle Projekte', @@ -152,11 +149,7 @@ const translation = { price: 'Kostenlos', includesTitle: 'Kostenlose Funktionen:', name: 'Gemeinschaft', - features: [ - 'Alle Kernfunktionen im öffentlichen Repository veröffentlicht', - 'Einzelner Arbeitsbereich', - 'Entspricht der Dify Open-Source-Lizenz', - ], + features: ['Alle Kernfunktionen im öffentlichen Repository veröffentlicht', 'Einzelarbeitsbereich', 'Entspricht der Dify Open-Source-Lizenz'], }, premium: { includesTitle: 'Alles aus der Community, plus:', @@ -167,12 +160,7 @@ const translation = { comingSoon: 'Microsoft Azure- und Google Cloud-Support demnächst verfügbar', description: 'Für mittelgroße Organisationen und Teams', price: 'Skalierbar', - features: [ - 'Selbstverwaltete Zuverlässigkeit durch verschiedene Cloud-Anbieter', - 'Einzelner Arbeitsbereich', - 'Anpassung von WebApp-Logo und Branding', - 'Bevorzugter E-Mail- und Chat-Support', - ], + features: ['Selbstverwaltete Zuverlässigkeit durch verschiedene Cloud-Anbieter', 'Einzelarbeitsbereich', 'WebApp-Logo & Markenanpassung', 'Priorisierte E-Mail- und Chatsupport'], }, }, vectorSpace: { @@ -200,6 +188,7 @@ const translation = { vectorSpaceTooltip: 'Dokumente mit dem Hochqualitäts-Indexierungsmodus verbrauchen Ressourcen des Knowledge Data Storage. Wenn der Knowledge Data Storage die Grenze erreicht, werden keine neuen Dokumente hochgeladen.', perMonth: 'pro Monat', triggerEvents: 'Auslöser-Ereignisse', + resetsIn: 'Setzt in {{count,number}} Tagen zurück', }, teamMembers: 'Teammitglieder', triggerLimitModal: { diff --git a/web/i18n/de-DE/common.ts b/web/i18n/de-DE/common.ts index a615974061..98ff2eae19 100644 --- a/web/i18n/de-DE/common.ts +++ b/web/i18n/de-DE/common.ts @@ -65,10 +65,17 @@ const translation = { deleteConfirmTitle: 'Löschen?', no: 'Nein', confirmAction: 'Bitte bestätigen Sie Ihre Aktion.', + noSearchResults: 'Es wurden keine {{content}} gefunden', + resetKeywords: 'Schlüsselwörter zurücksetzen', + selectCount: '{{count}} Ausgewählt', + searchCount: 'Finde {{count}} {{content}}', + noSearchCount: '0 {{content}}', + now: 'Jetzt', }, placeholder: { input: 'Bitte eingeben', select: 'Bitte auswählen', + search: 'Suchen...', }, voice: { language: { @@ -769,6 +776,13 @@ const translation = { label: { optional: '(fakultativ)', }, + noData: 'Keine Daten', + dynamicSelect: { + error: 'Ladeoptionen konnten nicht geladen werden', + noData: 'Keine Optionen verfügbar', + loading: 'Optionen werden geladen...', + selected: '{{count}} ausgewählt', + }, } export default translation diff --git a/web/i18n/de-DE/dataset-documents.ts b/web/i18n/de-DE/dataset-documents.ts index e99585db8e..952403d3d0 100644 --- a/web/i18n/de-DE/dataset-documents.ts +++ b/web/i18n/de-DE/dataset-documents.ts @@ -81,7 +81,10 @@ const translation = { }, addUrl: 'URL hinzufügen', learnMore: 'Weitere Informationen', - sort: {}, + sort: { + uploadTime: 'Upload-Zeit', + hitCount: 'Abrufanzahl', + }, }, metadata: { title: 'Metadaten', diff --git a/web/i18n/de-DE/dataset-pipeline.ts b/web/i18n/de-DE/dataset-pipeline.ts index daf70f89ac..4198a7435a 100644 --- a/web/i18n/de-DE/dataset-pipeline.ts +++ b/web/i18n/de-DE/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'Knowledge Pipeline veröffentlicht', + tip: 'Gehe zu Dokumente, um Dokumente hinzuzufügen oder zu verwalten.', }, error: { message: 'Fehler beim Veröffentlichen der Wissenspipeline', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'Struktur', structureTooltip: 'Die Blockstruktur bestimmt, wie Dokumente aufgeteilt und indiziert werden, und bietet die Modi "Allgemein", "Über-Eltern-Kind" und "Q&A" und ist für jede Wissensdatenbank einzigartig.', + createdBy: 'Von {{author}}', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { characters: 'Zeichen', backToDataSource: 'Datenquelle', title: 'Dokumente hinzufügen', + selectOnlineDocumentTip: 'Bis zu {{count}} Seiten verarbeiten', + selectOnlineDriveTip: 'Verarbeiten Sie bis zu {{count}} Dateien, maximal {{fileSize}} MB pro Datei', }, documentSettings: { title: 'Dokument-Einstellungen', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} Seiten', + }, onlineDrive: { breadcrumbs: { allFiles: 'Alle Dateien', allBuckets: 'Alle Cloud Storage-Buckets', searchPlaceholder: 'Dateien suchen...', + searchResult: '{{searchResultsLength}} Elemente im Ordner "{{folderName}}" finden', }, emptySearchResult: 'Es wurden keine Gegenstände gefunden', resetKeywords: 'Schlüsselwörter zurücksetzen', notSupportedFileType: 'Dieser Dateityp wird nicht unterstützt', emptyFolder: 'Dieser Ordner ist leer', + notConnected: '{{name}} ist nicht verbunden', + notConnectedTip: 'Um mit {{name}} zu synchronisieren, muss zuerst eine Verbindung zu {{name}} hergestellt werden.', + }, + credentialSelector: { + name: '{{credentialName}}\'s {{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { title: 'Bestätigung', @@ -149,6 +160,7 @@ const translation = { pipelineNameAndIcon: 'Name und Symbol der Pipeline', knowledgeDescriptionPlaceholder: 'Beschreiben Sie, was in dieser Wissensdatenbank enthalten ist. Eine detaillierte Beschreibung ermöglicht es der KI, genauer auf den Inhalt des Datensatzes zuzugreifen. Wenn das Feld leer ist, verwendet Dify die Standard-Trefferstrategie. (Fakultativ)', knowledgeNameAndIconPlaceholder: 'Bitte geben Sie den Namen der Knowledge Base ein.', + configurationTip: 'Konfigurieren {{pluginName}}', } export default translation diff --git a/web/i18n/de-DE/dataset.ts b/web/i18n/de-DE/dataset.ts index 052c7e8745..e0181c8a31 100644 --- a/web/i18n/de-DE/dataset.ts +++ b/web/i18n/de-DE/dataset.ts @@ -234,6 +234,10 @@ const translation = { enabled: 'Im Dienst', disabled: 'Behindert', }, + docAllEnabled_one: '{{count}} Dokument aktiviert', + docAllEnabled_other: 'Alle {{count}} Dokumente aktiviert', + partialEnabled_one: 'Insgesamt {{count}} Dokumente, {{num}} verfügbar', + partialEnabled_other: 'Insgesamt {{count}} Dokumente, {{num}} verfügbar', } export default translation diff --git a/web/i18n/de-DE/education.ts b/web/i18n/de-DE/education.ts index 9674302c9b..ca7287142d 100644 --- a/web/i18n/de-DE/education.ts +++ b/web/i18n/de-DE/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: 'Keine Sorge - das wird sich nicht auf Ihr aktuelles Abonnement auswirken, aber Sie werden den Bildungspreis beim nächsten Verzicht nicht erhalten, es sei denn, Sie überprüfen Ihren Status erneut.', + title: 'Ihr Bildungsstatus läuft am {{date}} ab', }, stillInEducation: { title: 'Immer noch in der Ausbildung?', diff --git a/web/i18n/de-DE/pipeline.ts b/web/i18n/de-DE/pipeline.ts index 171d2fa1bc..2504c001be 100644 --- a/web/i18n/de-DE/pipeline.ts +++ b/web/i18n/de-DE/pipeline.ts @@ -28,10 +28,12 @@ const translation = { viewDetails: 'Details anzeigen', error: 'Während der Ausführung ist ein Fehler aufgetreten', loading: 'Verarbeitung... Bitte warten', + footerTip: 'Im Testlaufmodus bis zu {{count}} Abschnitte anzeigen', }, }, ragToolSuggestions: { title: 'Vorschläge für die RAG', + noRecommendationPlugins: 'Keine empfohlenen Plugins, finde mehr im Marktplatz', }, } diff --git a/web/i18n/de-DE/plugin-trigger.ts b/web/i18n/de-DE/plugin-trigger.ts new file mode 100644 index 0000000000..68f6da5a4e --- /dev/null +++ b/web/i18n/de-DE/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'Abonnements', + listNum: '{{num}} Abonnements', + empty: { + title: 'Keine Abonnements', + button: 'Neues Abonnement', + }, + createButton: { + oauth: 'Neue Anmeldung mit OAuth', + apiKey: 'Neues Abonnement mit API-Schlüssel', + manual: 'URL einfügen, um ein neues Abonnement zu erstellen', + }, + createSuccess: 'Abonnement erfolgreich erstellt', + createFailed: 'Fehler beim Erstellen des Abonnements', + maxCount: 'Max {{num}} Abonnements', + selectPlaceholder: 'Abonnement auswählen', + noSubscriptionSelected: 'Kein Abonnement ausgewählt', + subscriptionRemoved: 'Abonnement entfernt', + list: { + title: 'Abonnements', + addButton: 'Hinzufügen', + tip: 'Ereignisse über ein Abonnement empfangen', + item: { + enabled: 'Aktiviert', + disabled: 'Deaktiviert', + credentialType: { + api_key: 'API-Schlüssel', + oauth2: 'OAuth', + unauthorized: 'Handbuch', + }, + actions: { + delete: 'Löschen', + deleteConfirm: { + title: '„{{name}} löschen?“', + success: 'Abonnement {{name}} erfolgreich gelöscht', + error: 'Löschen des Abonnements {{name}} fehlgeschlagen', + content: 'Einmal gelöscht, kann dieses Abonnement nicht wiederhergestellt werden. Bitte bestätigen Sie.', + contentWithApps: 'Das aktuelle Abonnement wird von {{count}} Anwendungen referenziert. Wenn es gelöscht wird, werden die konfigurierten Anwendungen keine Abonnementereignisse mehr erhalten.', + confirm: 'Löschen bestätigen', + cancel: 'Abbrechen', + confirmInputWarning: 'Bitte geben Sie den korrekten Namen zur Bestätigung ein.', + confirmInputPlaceholder: 'Geben Sie "{{name}}" ein, um zu bestätigen.', + confirmInputTip: 'Bitte geben Sie „{{name}}“ zur Bestätigung ein.', + }, + }, + status: { + active: 'Aktiv', + inactive: 'Inaktiv', + }, + usedByNum: 'Verwendet von {{num}} Workflows', + noUsed: 'Kein Workflow verwendet', + }, + }, + addType: { + title: 'Abonnement hinzufügen', + description: 'Wählen Sie aus, wie Sie Ihr Trigger-Abonnement erstellen möchten', + options: { + apikey: { + title: 'Mit API-Schlüssel erstellen', + description: 'Abonnement automatisch mit API-Zugangsdaten erstellen', + }, + oauth: { + title: 'Erstellen Sie mit OAuth', + description: 'Bei einer Drittanbieterplattform autorisieren, um ein Abonnement zu erstellen', + clientSettings: 'OAuth-Client-Einstellungen', + clientTitle: 'OAuth-Client', + default: 'Standard', + custom: 'Benutzerdefiniert', + }, + manual: { + title: 'Manuelle Einrichtung', + description: 'URL einfügen, um ein neues Abonnement zu erstellen', + tip: 'URL auf einer Drittanbieterplattform manuell konfigurieren', + }, + }, + }, + }, + modal: { + steps: { + verify: 'Überprüfen', + configuration: 'Konfiguration', + }, + common: { + cancel: 'Abbrechen', + back: 'Zurück', + next: 'Weiter', + create: 'Erstellen', + verify: 'Überprüfen', + authorize: 'Autorisieren', + creating: 'Erstellen...', + verifying: 'Überprüfen...', + authorizing: 'Autorisierung läuft...', + }, + oauthRedirectInfo: 'Da für diesen Toolanbieter keine System-Client-Geheimnisse gefunden wurden, ist eine manuelle Einrichtung erforderlich. Für redirect_uri verwenden Sie bitte', + apiKey: { + title: 'Mit API-Schlüssel erstellen', + verify: { + title: 'Anmeldeinformationen überprüfen', + description: 'Bitte geben Sie Ihre API-Zugangsdaten ein, um den Zugriff zu überprüfen', + error: 'Überprüfung der Anmeldedaten fehlgeschlagen. Bitte überprüfen Sie Ihren API-Schlüssel.', + success: 'Anmeldedaten erfolgreich überprüft', + }, + configuration: { + title: 'Abonnement konfigurieren', + description: 'Richten Sie Ihre Abonnementparameter ein', + }, + }, + oauth: { + title: 'Mit OAuth erstellen', + authorization: { + title: 'OAuth-Autorisierung', + description: 'Erlaube Dify den Zugriff auf dein Konto', + redirectUrl: 'Weiterleitungs-URL', + redirectUrlHelp: 'Verwenden Sie diese URL in der Konfiguration Ihrer OAuth-App', + authorizeButton: 'Autorisieren mit {{provider}}', + waitingAuth: 'Warten auf die Autorisierung...', + authSuccess: 'Autorisierung erfolgreich', + authFailed: 'Fehler beim Abrufen der OAuth-Autorisierungsinformationen', + waitingJump: 'Autorisierte, warten auf den Sprung', + }, + configuration: { + title: 'Abonnement konfigurieren', + description: 'Richten Sie Ihre Abonnementparameter nach der Autorisierung ein', + success: 'OAuth-Konfiguration erfolgreich', + failed: 'OAuth-Konfiguration fehlgeschlagen', + }, + remove: { + success: 'OAuth erfolgreich entfernt', + failed: 'OAuth-Entfernung fehlgeschlagen', + }, + save: { + success: 'OAuth-Konfiguration erfolgreich gespeichert', + }, + }, + manual: { + title: 'Manuelle Einrichtung', + description: 'Konfigurieren Sie Ihr Webhook-Abonnement manuell', + logs: { + title: 'Anforderungsprotokolle', + request: 'Anfrage', + loading: 'Warten auf Anfrage von {{pluginName}}...', + }, + }, + form: { + subscriptionName: { + label: 'Abonnementname', + placeholder: 'Abonnementname eingeben', + required: 'Der Abonnementname ist erforderlich', + }, + callbackUrl: { + label: 'Rückruf-URL', + description: 'Diese URL wird Webhook-Ereignisse empfangen', + tooltip: 'Stellen Sie einen öffentlich zugänglichen Endpunkt bereit, der Callback-Anfragen vom Auslöseranbieter empfangen kann.', + placeholder: 'Generierung...', + privateAddressWarning: 'Diese URL scheint eine interne Adresse zu sein, was dazu führen kann, dass Webhook-Anfragen fehlschlagen. Sie können TRIGGER_URL auf eine öffentliche Adresse ändern.', + }, + }, + errors: { + createFailed: 'Fehler beim Erstellen des Abonnements', + verifyFailed: 'Anmeldeinformationen konnten nicht überprüft werden', + authFailed: 'Autorisierung fehlgeschlagen', + networkError: 'Netzwerkfehler, bitte versuchen Sie es erneut', + }, + }, + events: { + title: 'Verfügbare Veranstaltungen', + description: 'Ereignisse, auf die dieses Trigger-Plugin reagieren kann', + empty: 'Keine Veranstaltungen verfügbar', + event: 'Veranstaltung', + events: 'Veranstaltungen', + actionNum: '{{num}} {{event}} ENTHALTEN', + item: { + parameters: '{{count}} Parameter', + noParameters: 'Keine Parameter', + }, + output: 'Ausgabe', + }, + node: { + status: { + warning: 'Trennen', + }, + }, +} + +export default translation diff --git a/web/i18n/de-DE/plugin.ts b/web/i18n/de-DE/plugin.ts index a8fe7dfa11..18da902a6c 100644 --- a/web/i18n/de-DE/plugin.ts +++ b/web/i18n/de-DE/plugin.ts @@ -7,6 +7,7 @@ const translation = { all: 'Alle', tools: 'Werkzeuge', datasources: 'Datenquellen', + triggers: 'Auslöser', }, categorySingle: { extension: 'Erweiterung', @@ -15,6 +16,7 @@ const translation = { model: 'Modell', tool: 'Werkzeug', datasource: 'Datenquelle', + trigger: 'Auslöser', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { checkUpdate: 'Update prüfen', update: 'Aktualisieren', viewDetail: 'Im Detail sehen', + back: 'Zurück', }, toolSelector: { paramsTip1: 'Steuert LLM-Inferenzparameter.', @@ -339,6 +342,12 @@ const translation = { specifyPluginsToUpdate: 'Geben Sie die zu aktualisierenden Plugins an', updateSettings: 'Einstellungen aktualisieren', }, + readmeInfo: { + title: 'LIESMICH', + needHelpCheckReadme: 'Brauchst du Hilfe? Sieh dir die README an.', + noReadmeAvailable: 'Keine README verfügbar', + failedToFetch: 'README konnte nicht abgerufen werden', + }, } export default translation diff --git a/web/i18n/de-DE/workflow.ts b/web/i18n/de-DE/workflow.ts index 28aa8bdc19..adc279aa58 100644 --- a/web/i18n/de-DE/workflow.ts +++ b/web/i18n/de-DE/workflow.ts @@ -113,6 +113,15 @@ const translation = { currentWorkflow: 'Aktueller Arbeitsablauf', currentView: 'Aktuelle Ansicht', moreActions: 'Weitere Aktionen', + listening: 'Zuhören', + chooseStartNodeToRun: 'Wählen Sie den Startknoten zum Ausführen', + runAllTriggers: 'Alle Auslöser ausführen', + features: 'Funktionen', + featuresDescription: 'Verbessern Sie die Benutzererfahrung der Webanwendung', + featuresDocLink: 'Mehr erfahren', + needAdd: '{{node}} Knoten muss hinzugefügt werden', + needStartNode: 'Es muss mindestens ein Startknoten hinzugefügt werden', + workflowAsToolDisabledHint: 'Veröffentlichen Sie den neuesten Workflow und stellen Sie sicher, dass ein verbundener User-Input-Knoten vorhanden ist, bevor Sie ihn als Werkzeug konfigurieren.', }, env: { envPanelTitle: 'Umgebungsvariablen', @@ -219,6 +228,7 @@ const translation = { rerankModelRequired: 'Bevor Sie das Rerank-Modell aktivieren, bestätigen Sie bitte, dass das Modell in den Einstellungen erfolgreich konfiguriert wurde.', toolParameterRequired: '{{field}}: Parameter [{{param}}] ist erforderlich', noValidTool: '{{field}} kein gültiges Werkzeug ausgewählt', + startNodeRequired: 'Bitte füge zuerst einen Startknoten hinzu, bevor du {{operation}}.', }, singleRun: { testRun: 'Testlauf ', @@ -250,6 +260,21 @@ const translation = { 'addAll': 'Alles hinzufügen', 'sources': 'Quellen', 'searchDataSource': 'Datenquelle durchsuchen', + 'start': 'Start', + 'searchTrigger': 'Suchauslöser...', + 'allTriggers': 'Alle Auslöser', + 'noPluginsFound': 'Es wurden keine Plugins gefunden', + 'requestToCommunity': 'Anfragen an die Community', + 'featuredTools': 'Ausgewählt', + 'showMoreFeatured': 'Mehr anzeigen', + 'showLessFeatured': 'Weniger anzeigen', + 'installed': 'Installiert', + 'pluginByAuthor': 'Von {{author}}', + 'usePlugin': 'Werkzeug auswählen', + 'hideActions': 'Werkzeuge ausblenden', + 'noFeaturedPlugins': 'Entdecken Sie weitere Tools im Marktplatz', + 'noFeaturedTriggers': 'Entdecken Sie weitere Auslöser im Marketplace', + 'startDisabledTip': 'Trigger-Knoten und Benutzereingabeknoten schließen sich gegenseitig aus.', }, blocks: { 'start': 'Start', @@ -276,6 +301,10 @@ const translation = { 'loop-end': 'Schleife beenden', 'datasource': 'Datenquelle', 'knowledge-index': 'Wissensdatenbank', + 'originalStartNode': 'ursprünglicher Startknoten', + 'trigger-schedule': 'Zeitplan-Auslöser', + 'trigger-webhook': 'Webhook-Auslöser', + 'trigger-plugin': 'Plugin-Auslöser', }, blocksAbout: { 'start': 'Definieren Sie die Anfangsparameter zum Starten eines Workflows', @@ -300,6 +329,9 @@ const translation = { 'loop-end': 'Entspricht "break". Dieser Knoten hat keine Konfigurationselemente. Wenn der Schleifenrumpf diesen Knoten erreicht, wird die Schleife beendet.', 'datasource': 'Datenquelle Über', 'knowledge-index': 'Wissensdatenbank Über', + 'trigger-schedule': 'Zeitbasierter Workflow-Auslöser, der Workflows nach einem Zeitplan startet', + 'trigger-webhook': 'Webhook-Trigger empfängt HTTP-Pushes von Drittanbietersystemen, um Workflows automatisch auszulösen.', + 'trigger-plugin': 'Auslöser für die Integration von Drittanbietern, der Workflows anhand von Ereignissen externer Plattformen startet', }, operator: { zoomIn: 'Vergrößern', @@ -340,6 +372,8 @@ const translation = { minimize: 'Vollbildmodus beenden', scrollToSelectedNode: 'Zum ausgewählten Knoten scrollen', optional_and_hidden: '(optional & hidden)', + goTo: 'Gehe zu', + startNode: 'Startknoten', }, nodes: { common: { @@ -787,6 +821,8 @@ const translation = { parallelModeEnableTitle: 'Paralleler Modus aktiviert', parallelModeUpper: 'PARALLELER MODUS', comma: ',', + flattenOutput: 'Ausgabe abflachen', + flattenOutputDesc: 'Wenn aktiviert, werden alle Iterationsergebnisse, die Arrays sind, in ein einzelnes Array zusammengeführt. Wenn deaktiviert, behalten die Ergebnisse eine verschachtelte Array-Struktur bei.', }, note: { editor: { @@ -963,6 +999,144 @@ const translation = { embeddingModelIsInvalid: 'Einbettungsmodell ist ungültig', rerankingModelIsInvalid: 'Das Reranking-Modell ist ungültig', }, + triggerPlugin: { + authorized: 'Autorisiert', + notConfigured: 'Nicht konfiguriert', + notAuthorized: 'Nicht autorisiert', + selectSubscription: 'Abonnement auswählen', + availableSubscriptions: 'Verfügbare Abonnements', + addSubscription: 'Neue Anmeldung hinzufügen', + removeSubscription: 'Abonnement kündigen', + subscriptionRemoved: 'Abonnement erfolgreich entfernt', + error: 'Fehler', + configuration: 'Konfiguration', + remove: 'Entfernen', + or: 'ODER', + useOAuth: 'OAuth verwenden', + useApiKey: 'API-Schlüssel verwenden', + authenticationFailed: 'Authentifizierung fehlgeschlagen', + authenticationSuccess: 'Authentifizierung erfolgreich', + oauthConfigFailed: 'OAuth-Konfiguration fehlgeschlagen', + configureOAuthClient: 'OAuth-Client konfigurieren', + oauthClientDescription: 'Konfigurieren Sie OAuth-Client-Anmeldeinformationen, um die Authentifizierung zu ermöglichen', + oauthClientSaved: 'OAuth-Clientkonfiguration erfolgreich gespeichert', + configureApiKey: 'API-Schlüssel konfigurieren', + apiKeyDescription: 'API-Schlüssel-Anmeldeinformationen für die Authentifizierung konfigurieren', + apiKeyConfigured: 'API-Schlüssel erfolgreich konfiguriert', + configurationFailed: 'Konfiguration fehlgeschlagen', + failedToStart: 'Authentifizierungsablauf konnte nicht gestartet werden', + credentialsVerified: 'Anmeldedaten erfolgreich überprüft', + credentialVerificationFailed: 'Anmeldeinformationen konnten nicht überprüft werden', + verifyAndContinue: 'Überprüfen & Fortfahren', + configureParameters: 'Parameter konfigurieren', + parametersDescription: 'Trigger-Parameter und -Eigenschaften konfigurieren', + configurationComplete: 'Konfiguration abgeschlossen', + configurationCompleteDescription: 'Ihr Trigger wurde erfolgreich konfiguriert', + configurationCompleteMessage: 'Ihre Auslöserkonfiguration ist jetzt abgeschlossen und einsatzbereit.', + parameters: 'Parameter', + properties: 'Eigenschaften', + propertiesDescription: 'Zusätzliche Konfigurationseigenschaften für diesen Auslöser', + noConfigurationRequired: 'Für diesen Auslöser ist keine zusätzliche Konfiguration erforderlich.', + subscriptionName: 'Abonnementname', + subscriptionNameDescription: 'Geben Sie einen eindeutigen Namen für dieses Trigger-Abonnement ein', + subscriptionNamePlaceholder: 'Abonnementnamen eingeben...', + subscriptionNameRequired: 'Der Abonnementname ist erforderlich', + subscriptionRequired: 'Abonnement erforderlich', + }, + triggerSchedule: { + title: 'Zeitplan', + nodeTitle: 'Zeitplan-Auslöser', + notConfigured: 'Nicht konfiguriert', + useCronExpression: 'Cron-Ausdruck verwenden', + useVisualPicker: 'Visuellen Auswähler verwenden', + frequency: { + label: 'FREQUENZ', + hourly: 'Stündlich', + daily: 'Täglich', + weekly: 'Wöchentlich', + monthly: 'Monatlich', + }, + selectFrequency: 'Frequenz auswählen', + frequencyLabel: 'Frequenz', + nextExecution: 'Nächste Ausführung', + weekdays: 'Wochentage', + time: 'Zeit', + cronExpression: 'Cron-Ausdruck', + nextExecutionTime: 'NÄCHSTE AUSFÜHRUNGSZEIT', + nextExecutionTimes: 'Nächste 5 Ausführungszeiten', + startTime: 'Startzeit', + executeNow: 'Jetzt ausführen', + selectDateTime: 'Datum und Uhrzeit auswählen', + hours: 'Stunden', + minutes: 'Protokoll', + onMinute: 'In einer Minute', + days: 'Tage', + lastDay: 'Letzter Tag', + lastDayTooltip: 'Nicht alle Monate haben 31 Tage. Verwenden Sie die Option ‚Letzter Tag‘, um den letzten Tag jedes Monats auszuwählen.', + mode: 'Mode', + timezone: 'Zeitzone', + visualConfig: 'Visuelle Konfiguration', + monthlyDay: 'Monatlicher Tag', + executionTime: 'Ausführungszeit', + invalidTimezone: 'Ungültige Zeitzone', + invalidCronExpression: 'Ungültiger Cron-Ausdruck', + noValidExecutionTime: 'Es kann keine gültige Ausführungszeit berechnet werden', + executionTimeCalculationError: 'Fehler beim Berechnen der Ausführungszeiten', + invalidFrequency: 'Ungültige Frequenz', + invalidStartTime: 'Ungültige Startzeit', + startTimeMustBeFuture: 'Die Startzeit muss in der Zukunft liegen', + invalidTimeFormat: 'Ungültiges Zeitformat (erwartet HH:MM AM/PM)', + invalidWeekday: 'Ungültiger Wochentag: {{weekday}}', + invalidMonthlyDay: 'Der monatliche Tag muss zwischen 1 und 31 oder "letzter" liegen', + invalidOnMinute: 'Die Minute muss zwischen 0 und 59 liegen', + invalidExecutionTime: 'Ungültige Ausführungszeit', + executionTimeMustBeFuture: 'Die Ausführungszeit muss in der Zukunft liegen', + }, + triggerWebhook: { + title: 'Webhook-Auslöser', + nodeTitle: '🔗 Webhook-Auslöser', + configPlaceholder: 'Webhook-Trigger-Konfiguration wird hier implementiert', + webhookUrl: 'Webhook-URL', + webhookUrlPlaceholder: 'Klicken Sie auf Erstellen, um die Webhook-URL zu erstellen', + generate: 'Erzeugen', + copy: 'Kopieren', + test: 'Test', + urlGenerated: 'Webhook-URL erfolgreich erstellt', + urlGenerationFailed: 'Fehler beim Erstellen der Webhook-URL', + urlCopied: 'URL in die Zwischenablage kopiert', + method: 'Methode', + contentType: 'Inhaltstyp', + queryParameters: 'Abfrageparameter', + headerParameters: 'Header-Parameter', + requestBodyParameters: 'Anforderungs-Body-Parameter', + parameterName: 'Variablenname', + varName: 'Variablenname', + varType: 'Typ', + varNamePlaceholder: 'Variablennamen eingeben...', + required: 'Erforderlich', + addParameter: 'Hinzufügen', + addHeader: 'Hinzufügen', + noParameters: 'Keine Parameter konfiguriert', + noQueryParameters: 'Keine Abfrageparameter konfiguriert', + noHeaders: 'Keine Kopfzeilen konfiguriert', + noBodyParameters: 'Keine Körperparameter konfiguriert', + debugUrlTitle: 'Für Testläufe verwenden Sie immer diese URL', + debugUrlCopy: 'Zum Kopieren klicken', + debugUrlCopied: 'Kopiert!', + debugUrlPrivateAddressWarning: 'Diese URL scheint eine interne Adresse zu sein, was dazu führen kann, dass Webhook-Anfragen fehlschlagen. Sie können TRIGGER_URL auf eine öffentliche Adresse ändern.', + errorHandling: 'Fehlerbehandlung', + errorStrategy: 'Fehlerbehandlung', + responseConfiguration: 'Antwort', + asyncMode: 'Asynchroner Modus', + statusCode: 'Statuscode', + responseBody: 'Antworttext', + responseBodyPlaceholder: 'Schreiben Sie hier Ihren Antworttext', + headers: 'Überschriften', + validation: { + webhookUrlRequired: 'Webhook-URL ist erforderlich', + invalidParameterType: 'Ungültiger Parametertyp "{{type}}" für den Parameter "{{name}}"', + }, + }, }, tracing: { stopBy: 'Gestoppt von {{user}}', @@ -1037,6 +1211,18 @@ const translation = { export: 'exportieren', exportToolTip: 'Variable als Datei exportieren', largeDataNoExport: 'Große Datenmengen – nur teilweise Vorschau', + listening: { + title: 'Höre auf Ereignisse von Triggern...', + tip: 'Sie können jetzt Ereignisauslöser simulieren, indem Sie Testanfragen an den HTTP-{{nodeName}}-Endpunkt senden oder ihn als Rückruf-URL für das Live-Debugging von Ereignissen verwenden. Alle Ausgaben können direkt im Variableninspektor angezeigt werden.', + tipPlugin: 'Jetzt können Sie in {{- pluginName}} Ereignisse erstellen und Ausgaben dieser Ereignisse im Variableninspektor abrufen.', + tipSchedule: 'Hört auf Ereignisse von Zeitplan-Auslösern. Nächster geplanter Lauf: {{nextTriggerTime}}', + tipFallback: 'Auf eingehende Trigger-Ereignisse warten. Ausgaben werden hier angezeigt.', + defaultNodeName: 'dieser Auslöser', + defaultPluginName: 'dieses Plugin auslösen', + defaultScheduleTime: 'Nicht konfiguriert', + selectedTriggers: 'ausgewählte Auslöser', + stopButton: 'Stopp', + }, }, settingsTab: 'Einstellungen', lastRunTab: 'Letzte Ausführung', @@ -1054,11 +1240,52 @@ const translation = { noMatchingInputsFound: 'Keine übereinstimmenden Eingaben aus dem letzten Lauf gefunden.', noLastRunFound: 'Kein vorheriger Lauf gefunden', lastOutput: 'Letzte Ausgabe', + lastRunInputsCopied: '{{count}} Eingabe(n) aus dem letzten Durchlauf kopiert', }, sidebar: { exportWarning: 'Aktuelle gespeicherte Version exportieren', exportWarningDesc: 'Dies wird die derzeit gespeicherte Version Ihres Workflows exportieren. Wenn Sie ungespeicherte Änderungen im Editor haben, speichern Sie diese bitte zuerst, indem Sie die Exportoption im Workflow-Canvas verwenden.', }, + publishLimit: { + startNodeTitlePrefix: 'Upgrade auf', + startNodeTitleSuffix: 'uneingeschränkt viele Auslöser pro Arbeitsablauf freischalten', + startNodeDesc: 'Sie haben das Limit von 2 Auslösern pro Workflow für diesen Plan erreicht. Upgraden Sie, um diesen Workflow zu veröffentlichen.', + }, + error: { + startNodeRequired: 'Bitte füge zuerst einen Startknoten hinzu, bevor du {{operation}}.', + operations: { + connectingNodes: 'Knoten verbinden', + addingNodes: 'Knoten hinzufügen', + modifyingWorkflow: 'Arbeitsablauf ändern', + updatingWorkflow: 'Arbeitsablauf aktualisieren', + }, + }, + customWebhook: 'Benutzerdefinierter Webhook', + difyTeam: 'Dify-Team', + triggerStatus: { + enabled: 'AUSLÖSER', + disabled: 'AUSLÖSER • DEAKTIVIERT', + }, + entryNodeStatus: { + enabled: 'START', + disabled: 'START • DEAKTIVIERT', + }, + onboarding: { + title: 'Wählen Sie einen Startknoten, um zu beginnen', + description: 'Verschiedene Startknoten haben unterschiedliche Fähigkeiten. Keine Sorge, du kannst sie später jederzeit ändern.', + userInputFull: 'Benutzereingabe (ursprünglicher Startknoten)', + userInputDescription: 'Startknoten, der das Festlegen von Benutzereingabevariablen ermöglicht, mit Web-App, Service-API, MCP-Server und Workflow als Werkzeugfunktionen.', + trigger: 'Auslöser', + triggerDescription: 'Trigger können als Startpunkt eines Workflows dienen, wie zum Beispiel geplante Aufgaben, benutzerdefinierte Webhooks oder Integrationen mit anderen Apps.', + back: 'Zurück', + learnMore: 'Mehr erfahren', + aboutStartNode: 'über den Startknoten.', + escTip: { + press: 'Presse', + key: 'esc', + toDismiss: 'entlassen', + }, + }, } export default translation diff --git a/web/i18n/es-ES/app-debug.ts b/web/i18n/es-ES/app-debug.ts index 175272d53a..892e718d32 100644 --- a/web/i18n/es-ES/app-debug.ts +++ b/web/i18n/es-ES/app-debug.ts @@ -326,6 +326,7 @@ const translation = { 'both': 'ambos', 'single-file': 'En fila india', 'maxNumberOfUploads': 'Número máximo de cargas', + 'maxNumberTip': 'Documento < {{docLimit}}, imagen < {{imgLimit}}, audio < {{audioLimit}}, vídeo < {{videoLimit}}', 'multi-files': 'Lista de archivos', 'jsonSchema': 'Esquema JSON', 'json': 'Código JSON', diff --git a/web/i18n/es-ES/app-log.ts b/web/i18n/es-ES/app-log.ts index aeca32d420..07b8ec663f 100644 --- a/web/i18n/es-ES/app-log.ts +++ b/web/i18n/es-ES/app-log.ts @@ -19,6 +19,7 @@ const translation = { tokens: 'TOKENS', user: 'USUARIO FINAL O CUENTA', version: 'VERSIÓN', + triggered_from: 'ACTIVADO POR', }, pagination: { previous: 'Anterior', @@ -97,6 +98,15 @@ const translation = { finalProcessing: 'Procesamiento Final', }, dateFormat: 'DD/MM/YYYY', + triggerBy: { + debugging: 'Depuración', + appRun: 'Aplicación web', + webhook: 'Webhook', + schedule: 'Horario', + plugin: 'Complemento', + ragPipelineRun: 'Pipeline RAG', + ragPipelineDebugging: 'Depuración RAG', + }, } export default translation diff --git a/web/i18n/es-ES/app-overview.ts b/web/i18n/es-ES/app-overview.ts index f9e10c4b5c..978141219c 100644 --- a/web/i18n/es-ES/app-overview.ts +++ b/web/i18n/es-ES/app-overview.ts @@ -114,7 +114,11 @@ const translation = { }, }, launch: 'Lanzar', - enableTooltip: {}, + enableTooltip: { + description: 'Para habilitar esta función, por favor agrega un nodo de Entrada de Usuario al lienzo. (Puede que ya exista en el borrador, surte efecto después de publicar)', + learnMore: 'Aprender más', + }, + title: 'Aplicación web', }, apiInfo: { title: 'API del servicio backend', @@ -126,7 +130,14 @@ const translation = { running: 'En servicio', disable: 'Deshabilitar', }, - triggerInfo: {}, + triggerInfo: { + title: 'Desencadenantes', + explanation: 'Gestión de activadores de flujo de trabajo', + triggersAdded: 'Se añadieron los disparadores de {{count}}', + noTriggerAdded: 'No se agregó ningún disparador', + triggerStatusDescription: 'El estado del nodo de activación aparece aquí. (Puede que ya exista en el borrador, surte efecto después de publicar)', + learnAboutTriggers: 'Aprende sobre los desencadenantes', + }, disableTooltip: { triggerMode: 'La función {{feature}} no es compatible en el modo Nodo de disparo.', }, diff --git a/web/i18n/es-ES/billing.ts b/web/i18n/es-ES/billing.ts index de6300d6f5..6a0120adb3 100644 --- a/web/i18n/es-ES/billing.ts +++ b/web/i18n/es-ES/billing.ts @@ -98,6 +98,8 @@ const translation = { triggerEvents: { unlimited: 'Eventos de Disparo Ilimitados', tooltip: 'El número de eventos que inician automáticamente flujos de trabajo mediante desencadenadores de Plugin, Programación o Webhook.', + sandbox: '{{count,number}} Eventos de activación', + professional: '{{count,number}} Eventos activadores/mes', }, workflowExecution: { tooltip: 'Prioridad y velocidad de la cola de ejecución de flujos de trabajo.', @@ -107,6 +109,11 @@ const translation = { }, startNodes: { unlimited: 'Disparadores/flujo de trabajo ilimitados', + limited: 'Hasta {{count}} Disparadores/flujo de trabajo', + }, + title: { + plans: 'planes', + description: 'Selecciona el plan que mejor se adapte a las necesidades de tu equipo.', }, }, plans: { @@ -133,17 +140,7 @@ const translation = { for: 'Para equipos de gran tamaño', price: 'Personalizado', priceTip: 'Facturación Anual Solo', - features: [ - 'Soluciones de implementación escalables a nivel empresarial', - 'Autorización de licencia comercial', - 'Funciones exclusivas para empresas', - 'Múltiples espacios de trabajo y gestión empresarial', - 'SSO (inicio de sesión único)', - 'SLAs negociados con socios de Dify', - 'Seguridad y controles avanzados', - 'Actualizaciones y mantenimiento oficiales por parte de Dify', - 'Soporte técnico profesional', - ], + features: ['Soluciones de Despliegue Escalables de Nivel Empresarial', 'Autorización de Licencia Comercial', 'Funciones Exclusivas para Empresas', 'Múltiples espacios de trabajo y gestión empresarial', 'SSO', 'Acuerdos de nivel de servicio negociados por socios de Dify', 'Seguridad y Controles Avanzados', 'Actualizaciones y Mantenimiento por Dify Oficialmente', 'Soporte Técnico Profesional'], }, community: { includesTitle: 'Características gratuitas:', @@ -152,11 +149,7 @@ const translation = { btnText: 'Comienza con la Comunidad', name: 'Comunidad', description: 'Para usuarios individuales, pequeños equipos o proyectos no comerciales', - features: [ - 'Todas las funciones principales publicadas en el repositorio público', - 'Espacio de trabajo único', - 'Cumple con la licencia de código abierto de Dify', - ], + features: ['Todas las características principales se publican en el repositorio público', 'Espacio de trabajo único', 'Cumple con la Licencia de Código Abierto de Dify'], }, premium: { description: 'Para organizaciones y equipos de tamaño mediano', @@ -167,12 +160,7 @@ const translation = { includesTitle: 'Todo de Community, además:', name: 'Premium', for: 'Para organizaciones y equipos de tamaño mediano', - features: [ - 'Fiabilidad autogestionada mediante varios proveedores de nube', - 'Espacio de trabajo único', - 'Personalización del logotipo y la marca de la aplicación web', - 'Soporte prioritario por correo electrónico y chat', - ], + features: ['Confiabilidad autogestionada por varios proveedores de la nube', 'Espacio de trabajo único', 'Personalización de Logotipo y Marca de la Aplicación Web', 'Soporte prioritario por correo electrónico y chat'], }, }, vectorSpace: { @@ -200,6 +188,7 @@ const translation = { vectorSpaceTooltip: 'Los documentos con el modo de indexación de alta calidad consumirán recursos de Almacenamiento de Datos de Conocimiento. Cuando el Almacenamiento de Datos de Conocimiento alcanza el límite, no se subirán nuevos documentos.', triggerEvents: 'Eventos desencadenantes', perMonth: 'por mes', + resetsIn: 'Se reinicia en {{count,number}} días', }, teamMembers: 'Miembros del equipo', triggerLimitModal: { diff --git a/web/i18n/es-ES/common.ts b/web/i18n/es-ES/common.ts index 3e3ffbd8e3..8ce59419e8 100644 --- a/web/i18n/es-ES/common.ts +++ b/web/i18n/es-ES/common.ts @@ -65,6 +65,12 @@ const translation = { deleteConfirmTitle: '¿Eliminar?', yes: 'Sí', no: 'No', + noSearchResults: 'No se encontraron {{content}}', + resetKeywords: 'Restablecer palabras clave', + selectCount: '{{count}} Seleccionado', + searchCount: 'Encuentra {{count}} {{content}}', + noSearchCount: '0 {{content}}', + now: 'Ahora', }, errorMsg: { fieldRequired: '{{field}} es requerido', @@ -73,6 +79,7 @@ const translation = { placeholder: { input: 'Por favor ingresa', select: 'Por favor selecciona', + search: 'Buscar...', }, voice: { language: { @@ -769,6 +776,13 @@ const translation = { label: { optional: '(opcional)', }, + noData: 'Sin datos', + dynamicSelect: { + error: 'Error al cargar las opciones', + noData: 'No hay opciones disponibles', + loading: 'Cargando opciones...', + selected: '{{count}} seleccionado', + }, } export default translation diff --git a/web/i18n/es-ES/dataset-documents.ts b/web/i18n/es-ES/dataset-documents.ts index 389ada0a03..b640257396 100644 --- a/web/i18n/es-ES/dataset-documents.ts +++ b/web/i18n/es-ES/dataset-documents.ts @@ -81,7 +81,10 @@ const translation = { ok: 'Aceptar', }, learnMore: 'Aprende más', - sort: {}, + sort: { + uploadTime: 'Hora de subida', + hitCount: 'Conteo de Recuperaciones', + }, }, metadata: { title: 'Metadatos', diff --git a/web/i18n/es-ES/dataset-pipeline.ts b/web/i18n/es-ES/dataset-pipeline.ts index b1a07ce530..74c65177f2 100644 --- a/web/i18n/es-ES/dataset-pipeline.ts +++ b/web/i18n/es-ES/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'Publicación de Knowledge Pipeline', + tip: 'Ve a Documentos para agregar o gestionar documentos.', }, error: { message: 'No se pudo publicar la canalización de conocimiento', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'Structure', structureTooltip: 'La estructura de fragmentos determina cómo se dividen e indexan los documentos, ofreciendo modos General, Principal-Secundario y Preguntas y respuestas, y es única para cada base de conocimiento.', + createdBy: 'Por {{author}}', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { characters: 'Caracteres', title: 'Agregar documentos', backToDataSource: 'Fuente de datos', + selectOnlineDocumentTip: 'Procesar hasta {{count}} páginas', + selectOnlineDriveTip: 'Procesar hasta {{count}} archivos, máximo {{fileSize}} MB cada uno', }, documentSettings: { title: 'Parametrizaciones de documentos', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} páginas', + }, onlineDrive: { breadcrumbs: { allBuckets: 'Todos los depósitos de Cloud Storage', allFiles: 'Todos los archivos', searchPlaceholder: 'Buscar archivos...', + searchResult: 'Encontrar {{searchResultsLength}} elementos en la carpeta "{{folderName}}"', }, emptySearchResult: 'No se encontraron artículos', resetKeywords: 'Restablecer palabras clave', emptyFolder: 'Esta carpeta está vacía', notSupportedFileType: 'Este tipo de archivo no es compatible', + notConnected: '{{name}} no está conectado', + notConnectedTip: 'Para sincronizar con {{name}}, primero se debe establecer conexión con {{name}}.', + }, + credentialSelector: { + name: '{{credentialName}} de {{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { title: 'Confirmación', @@ -149,6 +160,7 @@ const translation = { pipelineNameAndIcon: 'Nombre e icono de la tubería', knowledgePermissions: 'Permisos', editPipelineInfo: 'Editar información de canalización', + configurationTip: 'Configurar {{pluginName}}', } export default translation diff --git a/web/i18n/es-ES/dataset.ts b/web/i18n/es-ES/dataset.ts index 24b8dba6a8..3d6930ba1b 100644 --- a/web/i18n/es-ES/dataset.ts +++ b/web/i18n/es-ES/dataset.ts @@ -234,6 +234,10 @@ const translation = { title: 'API de servicios', disabled: 'Discapacitado', }, + docAllEnabled_one: 'Documento {{count}} activado', + docAllEnabled_other: 'Todos los documentos {{count}} habilitados', + partialEnabled_one: 'Total de {{count}} documentos, {{num}} disponibles', + partialEnabled_other: 'Total de {{count}} documentos, {{num}} disponibles', } export default translation diff --git a/web/i18n/es-ES/education.ts b/web/i18n/es-ES/education.ts index 22980f5d2d..9ec1c531db 100644 --- a/web/i18n/es-ES/education.ts +++ b/web/i18n/es-ES/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: 'No te preocupes, esto no afectará tu suscripción actual, pero no obtendrás el descuento educativo cuando se renueve a menos que verifiques tu estado nuevamente.', + title: 'Tu estado educativo expirará el {{date}}', }, stillInEducation: { title: '¿Aún en educación?', diff --git a/web/i18n/es-ES/pipeline.ts b/web/i18n/es-ES/pipeline.ts index ba93e3f673..1233a0b0f6 100644 --- a/web/i18n/es-ES/pipeline.ts +++ b/web/i18n/es-ES/pipeline.ts @@ -28,10 +28,12 @@ const translation = { loading: 'Tratamiento... Espera', viewDetails: 'Ver detalles', error: 'Error ocurrido durante la ejecución', + footerTip: 'En modo de prueba, previsualiza hasta {{count}} fragmentos', }, }, ragToolSuggestions: { title: 'Sugerencias para el GAR', + noRecommendationPlugins: 'No hay complementos recomendados, encuentra más en Marketplace', }, } diff --git a/web/i18n/es-ES/plugin-trigger.ts b/web/i18n/es-ES/plugin-trigger.ts new file mode 100644 index 0000000000..07f5729bc8 --- /dev/null +++ b/web/i18n/es-ES/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'Suscripciones', + listNum: 'suscripciones de {{num}}', + empty: { + title: 'Sin suscripciones', + button: 'Nueva suscripción', + }, + createButton: { + oauth: 'Nueva suscripción con OAuth', + apiKey: 'Nueva suscripción con clave API', + manual: 'Pega la URL para crear una nueva suscripción', + }, + createSuccess: 'Suscripción creada con éxito', + createFailed: 'No se pudo crear la suscripción', + maxCount: 'Máximo {{num}} suscripciones', + selectPlaceholder: 'Seleccionar suscripción', + noSubscriptionSelected: 'No se ha seleccionado ninguna suscripción', + subscriptionRemoved: 'Suscripción eliminada', + list: { + title: 'Suscripciones', + addButton: 'Agregar', + tip: 'Recibir eventos mediante suscripción', + item: { + enabled: 'Habilitado', + disabled: 'Desactivado', + credentialType: { + api_key: 'Clave de API', + oauth2: 'OAuth', + unauthorized: 'Manual', + }, + actions: { + delete: 'Eliminar', + deleteConfirm: { + title: '¿Eliminar {{name}}?', + success: 'Suscripción {{name}} eliminada con éxito', + error: 'Error al eliminar la suscripción {{name}}', + content: 'Una vez eliminada, esta suscripción no se puede recuperar. Por favor, confirme.', + contentWithApps: 'La suscripción actual está referenciada por {{count}} aplicaciones. Eliminarla hará que las aplicaciones configuradas dejen de recibir eventos de suscripción.', + confirm: 'Confirmar eliminación', + cancel: 'Cancelar', + confirmInputWarning: 'Por favor, ingrese el nombre correcto para confirmar.', + confirmInputPlaceholder: 'Introduce "{{name}}" para confirmar.', + confirmInputTip: 'Por favor, introduzca “{{name}}” para confirmar.', + }, + }, + status: { + active: 'activo', + inactive: 'inactivo', + }, + usedByNum: 'Utilizado por {{num}} flujos de trabajo', + noUsed: 'No se utilizó ningún flujo de trabajo', + }, + }, + addType: { + title: 'Añadir suscripción', + description: 'Elige cómo quieres crear tu suscripción de activador', + options: { + apikey: { + title: 'Crear con clave API', + description: 'Crear suscripción automáticamente usando credenciales de API', + }, + oauth: { + title: 'Crear con OAuth', + description: 'Autorizar con una plataforma de terceros para crear una suscripción', + clientSettings: 'Configuración del cliente OAuth', + clientTitle: 'Cliente OAuth', + default: 'predeterminado', + custom: 'Personalizado', + }, + manual: { + title: 'Configuración manual', + description: 'Pega la URL para crear una nueva suscripción', + tip: 'Configurar la URL en la plataforma de terceros manualmente', + }, + }, + }, + }, + modal: { + steps: { + verify: 'Verificar', + configuration: 'Configuración', + }, + common: { + cancel: 'Cancelar', + back: 'Atrás', + next: 'Siguiente', + create: 'Crear', + verify: 'Verificar', + authorize: 'Autorizar', + creating: 'Creando...', + verifying: 'Verificando...', + authorizing: 'Autorizando...', + }, + oauthRedirectInfo: 'Dado que no se encontraron secretos de cliente del sistema para este proveedor de herramientas, es necesario configurarlo manualmente; para redirect_uri, por favor use', + apiKey: { + title: 'Crear con clave API', + verify: { + title: 'Verificar credenciales', + description: 'Por favor, proporciona tus credenciales de API para verificar el acceso', + error: 'La verificación de las credenciales falló. Por favor, revisa tu clave API.', + success: 'Credenciales verificadas con éxito', + }, + configuration: { + title: 'Configurar suscripción', + description: 'Configura los parámetros de tu suscripción', + }, + }, + oauth: { + title: 'Crear con OAuth', + authorization: { + title: 'Autorización OAuth', + description: 'Autoriza a Dify para acceder a tu cuenta', + redirectUrl: 'URL de redirección', + redirectUrlHelp: 'Utiliza esta URL en la configuración de tu aplicación OAuth', + authorizeButton: 'Autorizar con {{provider}}', + waitingAuth: 'Esperando autorización...', + authSuccess: 'Autorización exitosa', + authFailed: 'Error al obtener la información de autorización OAuth', + waitingJump: 'Autorizado, esperando para saltar', + }, + configuration: { + title: 'Configurar suscripción', + description: 'Configura los parámetros de tu suscripción después de la autorización', + success: 'Configuración de OAuth exitosa', + failed: 'La configuración de OAuth falló', + }, + remove: { + success: 'Eliminación de OAuth exitosa', + failed: 'Error al eliminar OAuth', + }, + save: { + success: 'Configuración de OAuth guardada con éxito', + }, + }, + manual: { + title: 'Configuración manual', + description: 'Configura tu suscripción al webhook manualmente', + logs: { + title: 'Registros de solicitudes', + request: 'Solicitud', + loading: 'Esperando solicitud de {{pluginName}}...', + }, + }, + form: { + subscriptionName: { + label: 'Nombre de la suscripción', + placeholder: 'Ingrese el nombre de la suscripción', + required: 'Se requiere el nombre de la suscripción', + }, + callbackUrl: { + label: 'URL de retorno de llamada', + description: 'Esta URL recibirá eventos de webhook', + tooltip: 'Proporcione un endpoint accesible públicamente que pueda recibir solicitudes de devolución de llamada del proveedor del activador.', + placeholder: 'Generando...', + privateAddressWarning: 'Esta URL parece ser una dirección interna, lo que puede hacer que las solicitudes del webhook fallen. Puede cambiar TRIGGER_URL a una dirección pública.', + }, + }, + errors: { + createFailed: 'No se pudo crear la suscripción', + verifyFailed: 'No se pudieron verificar las credenciales', + authFailed: 'Autorización fallida', + networkError: 'Error de red, por favor intenta de nuevo', + }, + }, + events: { + title: 'Eventos Disponibles', + description: 'Eventos a los que este complemento de activación puede suscribirse', + empty: 'No hay eventos disponibles', + event: 'Evento', + events: 'Eventos', + actionNum: '{{num}} {{event}} INCLUIDO', + item: { + parameters: 'parámetros {{count}}', + noParameters: 'Sin parámetros', + }, + output: 'Salida', + }, + node: { + status: { + warning: 'Desconectar', + }, + }, +} + +export default translation diff --git a/web/i18n/es-ES/plugin.ts b/web/i18n/es-ES/plugin.ts index c7810b9d27..76e9f27c39 100644 --- a/web/i18n/es-ES/plugin.ts +++ b/web/i18n/es-ES/plugin.ts @@ -7,6 +7,7 @@ const translation = { agents: 'Estrategias de los agentes', models: 'Modelos', datasources: 'Fuentes de datos', + triggers: 'Desencadenantes', }, categorySingle: { bundle: 'Haz', @@ -15,6 +16,7 @@ const translation = { model: 'Modelo', agent: 'Estrategia del agente', datasource: 'Fuente de datos', + trigger: 'Disparador', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { remove: 'Eliminar', info: 'Información del plugin', update: 'Actualizar', + back: 'Atrás', }, toolSelector: { toolLabel: 'Herramienta', @@ -340,6 +343,12 @@ const translation = { 'Para cambiar la zona horaria, ve a Configuración.', automaticUpdates: 'Actualizaciones automáticas', }, + readmeInfo: { + title: 'LEEME', + needHelpCheckReadme: '¿Necesitas ayuda? Revisa el README.', + noReadmeAvailable: 'No hay archivo README disponible', + failedToFetch: 'No se pudo obtener el README', + }, } export default translation diff --git a/web/i18n/es-ES/workflow.ts b/web/i18n/es-ES/workflow.ts index dd9519b68f..e54b8364f7 100644 --- a/web/i18n/es-ES/workflow.ts +++ b/web/i18n/es-ES/workflow.ts @@ -113,6 +113,15 @@ const translation = { currentView: 'Vista actual', currentWorkflow: 'Flujo de trabajo actual', moreActions: 'Más acciones', + listening: 'Escucha', + chooseStartNodeToRun: 'Elige el nodo de inicio para ejecutar', + runAllTriggers: 'Ejecutar todos los desencadenadores', + features: 'Características', + featuresDescription: 'Mejorar la experiencia del usuario en la aplicación web', + featuresDocLink: 'Aprender más', + needAdd: 'Se debe añadir el nodo {{node}}', + needStartNode: 'Se debe añadir al menos un nodo de inicio', + workflowAsToolDisabledHint: 'Publica el flujo de trabajo más reciente y asegúrate de que haya un nodo de Entrada de Usuario conectado antes de configurarlo como una herramienta.', }, env: { envPanelTitle: 'Variables de Entorno', @@ -219,6 +228,7 @@ const translation = { rerankModelRequired: 'Antes de activar el modelo de reclasificación, confirme que el modelo se ha configurado correctamente en la configuración.', toolParameterRequired: '{{campo}}: el parámetro [{{param}}] es obligatorio', noValidTool: '{{campo}} no se ha seleccionado ninguna herramienta válida', + startNodeRequired: 'Por favor, agregue primero un nodo de inicio antes de {{operation}}', }, singleRun: { testRun: 'Ejecución de prueba', @@ -250,6 +260,21 @@ const translation = { 'allAdded': 'Todo añadido', 'sources': 'Fuentes', 'searchDataSource': 'Fuente de datos de búsqueda', + 'start': 'Iniciar', + 'searchTrigger': 'Buscar desencadenantes...', + 'allTriggers': 'Todos los desencadenantes', + 'noPluginsFound': 'No se encontraron complementos', + 'requestToCommunity': 'Solicitudes a la comunidad', + 'featuredTools': 'Destacado', + 'showMoreFeatured': 'Mostrar más', + 'showLessFeatured': 'Mostrar menos', + 'installed': 'Instalado', + 'pluginByAuthor': 'Por {{author}}', + 'usePlugin': 'Seleccionar herramienta', + 'hideActions': 'Ocultar herramientas', + 'noFeaturedPlugins': 'Descubre más herramientas en el Marketplace', + 'noFeaturedTriggers': 'Descubre más desencadenantes en el Marketplace', + 'startDisabledTip': 'El nodo activador y el nodo de entrada del usuario son mutuamente excluyentes.', }, blocks: { 'start': 'Inicio', @@ -276,6 +301,10 @@ const translation = { 'loop-start': 'Inicio del bucle', 'knowledge-index': 'Knowledge base', 'datasource': 'Fuente de datos', + 'originalStartNode': 'nodo inicial original', + 'trigger-schedule': 'Disparador de horario', + 'trigger-webhook': 'Disparador de Webhook', + 'trigger-plugin': 'Disparador de complemento', }, blocksAbout: { 'start': 'Define los parámetros iniciales para iniciar un flujo de trabajo', @@ -300,6 +329,9 @@ const translation = { 'loop': 'Ejecuta un bucle de lógica hasta que se cumpla la condición de terminación o se alcance el conteo máximo de bucles.', 'knowledge-index': 'Base de conocimientos Acerca de', 'datasource': 'Fuente de datos Acerca de', + 'trigger-schedule': 'Disparador de flujo de trabajo basado en tiempo que inicia flujos de trabajo según un horario', + 'trigger-webhook': 'El disparador de Webhook recibe envíos HTTP de sistemas de terceros para activar automáticamente flujos de trabajo.', + 'trigger-plugin': 'Disparador de integración de terceros que inicia flujos de trabajo a partir de eventos de plataformas externas', }, operator: { zoomIn: 'Acercar', @@ -340,6 +372,8 @@ const translation = { minimize: 'Salir de pantalla completa', scrollToSelectedNode: 'Desplácese hasta el nodo seleccionado', optional_and_hidden: '(opcional y oculto)', + goTo: 'Ir a', + startNode: 'Nodo de inicio', }, nodes: { common: { @@ -787,6 +821,8 @@ const translation = { MaxParallelismDesc: 'El paralelismo máximo se utiliza para controlar el número de tareas ejecutadas simultáneamente en una sola iteración.', answerNodeWarningDesc: 'Advertencia de modo paralelo: Los nodos de respuesta, las asignaciones de variables de conversación y las operaciones de lectura/escritura persistentes dentro de las iteraciones pueden provocar excepciones.', parallelModeEnableTitle: 'Modo paralelo habilitado', + flattenOutput: 'Aplanar salida', + flattenOutputDesc: 'Cuando está habilitado, si todas las salidas de la iteración son arrays, se aplanarán en un solo array. Cuando está deshabilitado, las salidas mantendrán una estructura de array anidada.', }, note: { addNote: 'Agregar nota', @@ -963,6 +999,144 @@ const translation = { rerankingModelIsInvalid: 'El modelo de reordenación no es válido', embeddingModelIsInvalid: 'El modelo de incrustación no es válido', }, + triggerPlugin: { + authorized: 'autorizado', + notConfigured: 'No Configurado', + notAuthorized: 'No autorizado', + selectSubscription: 'Seleccionar suscripción', + availableSubscriptions: 'Suscripciones disponibles', + addSubscription: 'Agregar nueva suscripción', + removeSubscription: 'Cancelar suscripción', + subscriptionRemoved: 'Suscripción eliminada con éxito', + error: 'Error', + configuration: 'Configuración', + remove: 'Eliminar', + or: 'O', + useOAuth: 'Usar OAuth', + useApiKey: 'Usar clave API', + authenticationFailed: 'Autenticación fallida', + authenticationSuccess: 'Autenticación exitosa', + oauthConfigFailed: 'La configuración de OAuth falló', + configureOAuthClient: 'Configurar cliente OAuth', + oauthClientDescription: 'Configura las credenciales del cliente OAuth para habilitar la autenticación', + oauthClientSaved: 'Configuración del cliente OAuth guardada correctamente', + configureApiKey: 'Configurar clave API', + apiKeyDescription: 'Configurar las credenciales de la clave API para la autenticación', + apiKeyConfigured: 'Clave API configurada correctamente', + configurationFailed: 'La configuración falló', + failedToStart: 'Error al iniciar el flujo de autenticación', + credentialsVerified: 'Credenciales verificadas con éxito', + credentialVerificationFailed: 'Verificación de credenciales fallida', + verifyAndContinue: 'Verificar y continuar', + configureParameters: 'Configurar parámetros', + parametersDescription: 'Configurar parámetros y propiedades del disparador', + configurationComplete: 'Configuración completa', + configurationCompleteDescription: 'Tu disparador se ha configurado correctamente', + configurationCompleteMessage: 'Tu configuración de activadores ya está completa y lista para usar.', + parameters: 'Parámetros', + properties: 'Propiedades', + propertiesDescription: 'Propiedades de configuración adicionales para este disparador', + noConfigurationRequired: 'No se requiere configuración adicional para este disparador.', + subscriptionName: 'Nombre de la suscripción', + subscriptionNameDescription: 'Ingresa un nombre único para esta suscripción de activador', + subscriptionNamePlaceholder: 'Ingrese el nombre de la suscripción...', + subscriptionNameRequired: 'Se requiere el nombre de la suscripción', + subscriptionRequired: 'Se requiere suscripción', + }, + triggerSchedule: { + title: 'Horario', + nodeTitle: 'Disparador de horario', + notConfigured: 'No configurado', + useCronExpression: 'Usar expresión cron', + useVisualPicker: 'Usar selector visual', + frequency: { + label: 'FRECUENCIA', + hourly: 'Por hora', + daily: 'diario', + weekly: 'Semanal', + monthly: 'Mensual', + }, + selectFrequency: 'Seleccionar frecuencia', + frequencyLabel: 'Frecuencia', + nextExecution: 'Próxima ejecución', + weekdays: 'Días de la semana', + time: 'Tiempo', + cronExpression: 'Expresión Cron', + nextExecutionTime: 'PRÓXIMA HORA DE EJECUCIÓN', + nextExecutionTimes: 'Próximos 5 tiempos de ejecución', + startTime: 'Hora de inicio', + executeNow: 'Ejecución ahora', + selectDateTime: 'Seleccionar fecha y hora', + hours: 'Horas', + minutes: 'Minutos', + onMinute: 'En un minuto', + days: 'Días', + lastDay: 'Último día', + lastDayTooltip: 'No todos los meses tienen 31 días. Usa la opción \'último día\' para seleccionar el último día de cada mes.', + mode: 'Modo', + timezone: 'Zona horaria', + visualConfig: 'Configuración Visual', + monthlyDay: 'Día mensual', + executionTime: 'Tiempo de ejecución', + invalidTimezone: 'Zona horaria no válida', + invalidCronExpression: 'Expresión cron inválida', + noValidExecutionTime: 'No se puede calcular un tiempo de ejecución válido', + executionTimeCalculationError: 'Error al calcular los tiempos de ejecución', + invalidFrequency: 'Frecuencia inválida', + invalidStartTime: 'Hora de inicio no válida', + startTimeMustBeFuture: 'La hora de inicio debe ser en el futuro', + invalidTimeFormat: 'Formato de hora inválido (se esperaba HH:MM AM/PM)', + invalidWeekday: 'Día de la semana no válido: {{weekday}}', + invalidMonthlyDay: 'El día del mes debe estar entre 1 y 31 o "último"', + invalidOnMinute: 'El minuto debe estar entre 0 y 59', + invalidExecutionTime: 'Tiempo de ejecución inválido', + executionTimeMustBeFuture: 'El tiempo de ejecución debe estar en el futuro', + }, + triggerWebhook: { + title: 'Disparador de Webhook', + nodeTitle: '🔗 Disparador de Webhook', + configPlaceholder: 'La configuración del activador del webhook se implementará aquí', + webhookUrl: 'URL del webhook', + webhookUrlPlaceholder: 'Haz clic en generar para crear la URL del webhook', + generate: 'Generar', + copy: 'Copiar', + test: 'Prueba', + urlGenerated: 'URL del webhook generada con éxito', + urlGenerationFailed: 'No se pudo generar la URL del webhook', + urlCopied: 'URL copiada al portapapeles', + method: 'Método', + contentType: 'Tipo de contenido', + queryParameters: 'Parámetros de consulta', + headerParameters: 'Parámetros de encabezado', + requestBodyParameters: 'Parámetros del cuerpo de la solicitud', + parameterName: 'Nombre de la variable', + varName: 'Nombre de la variable', + varType: 'Tipo', + varNamePlaceholder: 'Ingrese el nombre de la variable...', + required: 'Requerido', + addParameter: 'Agregar', + addHeader: 'Agregar', + noParameters: 'No se han configurado parámetros', + noQueryParameters: 'No se han configurado parámetros de consulta', + noHeaders: 'No se han configurado encabezados', + noBodyParameters: 'No se configuraron parámetros de cuerpo', + debugUrlTitle: 'Para pruebas, siempre use esta URL', + debugUrlCopy: 'Haz clic para copiar', + debugUrlCopied: '¡Copiado!', + debugUrlPrivateAddressWarning: 'Esta URL parece ser una dirección interna, lo que puede hacer que las solicitudes del webhook fallen. Puede cambiar TRIGGER_URL a una dirección pública.', + errorHandling: 'Manejo de errores', + errorStrategy: 'Manejo de errores', + responseConfiguration: 'Respuesta', + asyncMode: 'Modo Asíncrono', + statusCode: 'Código de estado', + responseBody: 'Cuerpo de la respuesta', + responseBodyPlaceholder: 'Escribe aquí el cuerpo de tu respuesta', + headers: 'Encabezados', + validation: { + webhookUrlRequired: 'Se requiere la URL del webhook', + invalidParameterType: 'Tipo de parámetro inválido "{{type}}" para el parámetro "{{name}}"', + }, + }, }, tracing: { stopBy: 'Pásate por {{user}}', @@ -1037,6 +1211,18 @@ const translation = { exportToolTip: 'Exportar variable como archivo', largeData: 'Datos grandes, vista previa de solo lectura. Exportar para verlo todo.', largeDataNoExport: 'Datos grandes: solo vista previa parcial', + listening: { + title: 'Escuchando eventos desde los activadores...', + tip: 'Ahora puedes simular disparadores de eventos enviando solicitudes de prueba al endpoint HTTP {{nodeName}} o usarlo como una URL de retorno de llamada para la depuración de eventos en tiempo real. Todos los resultados se pueden ver directamente en el Inspector de Variables.', + tipPlugin: 'Ahora puedes crear eventos en {{- pluginName}} y obtener los resultados de estos eventos en el Inspector de Variables.', + tipSchedule: 'Escuchando eventos de los desencadenadores de programación.\nPróxima ejecución programada: {{nextTriggerTime}}', + tipFallback: 'Esperando eventos desencadenantes entrantes. Las salidas aparecerán aquí.', + defaultNodeName: 'este disparador', + defaultPluginName: 'este activador de plugin', + defaultScheduleTime: 'No configurado', + selectedTriggers: 'disparadores seleccionados', + stopButton: 'Para', + }, }, lastRunTab: 'Última ejecución', settingsTab: 'Ajustes', @@ -1054,11 +1240,52 @@ const translation = { copyLastRun: 'Copiar última ejecución', noMatchingInputsFound: 'No se encontraron entradas coincidentes de la última ejecución.', lastOutput: 'Última salida', + lastRunInputsCopied: '{{count}} entrada(s) copiadas de la última ejecución', }, sidebar: { exportWarning: 'Exportar la versión guardada actual', exportWarningDesc: 'Esto exportará la versión guardada actual de tu flujo de trabajo. Si tienes cambios no guardados en el editor, guárdalos primero utilizando la opción de exportar en el lienzo del flujo de trabajo.', }, + publishLimit: { + startNodeTitlePrefix: 'Actualizar a', + startNodeTitleSuffix: 'desbloquear disparadores ilimitados por flujo de trabajo', + startNodeDesc: 'Has alcanzado el límite de 2 desencadenadores por flujo de trabajo para este plan. Actualiza para publicar este flujo de trabajo.', + }, + error: { + startNodeRequired: 'Por favor, agregue primero un nodo de inicio antes de {{operation}}', + operations: { + connectingNodes: 'conectando nodos', + addingNodes: 'agregando nodos', + modifyingWorkflow: 'modificando el flujo de trabajo', + updatingWorkflow: 'actualizando flujo de trabajo', + }, + }, + customWebhook: 'Webhook personalizado', + difyTeam: 'Equipo Dify', + triggerStatus: { + enabled: 'DISPARADOR', + disabled: 'DISPARADOR • DESACTIVADO', + }, + entryNodeStatus: { + enabled: 'INICIAR', + disabled: 'INICIAR • DESACTIVADO', + }, + onboarding: { + title: 'Selecciona un nodo de inicio para comenzar', + description: 'Los diferentes nodos iniciales tienen distintas capacidades. No te preocupes, siempre puedes cambiarlos más adelante.', + userInputFull: 'Entrada del usuario (nodo de inicio original)', + userInputDescription: 'Nodo de inicio que permite establecer variables de entrada del usuario, con capacidades de herramienta para aplicación web, API de servicio, servidor MCP y flujo de trabajo.', + trigger: 'Disparador', + triggerDescription: 'Los desencadenantes pueden servir como el nodo inicial de un flujo de trabajo, como tareas programadas, webhooks personalizados o integraciones con otras aplicaciones.', + back: 'Atrás', + learnMore: 'Aprender más', + aboutStartNode: 'sobre el nodo de inicio.', + escTip: { + press: 'Prensa', + key: 'esc', + toDismiss: 'despedir', + }, + }, } export default translation diff --git a/web/i18n/fa-IR/app-debug.ts b/web/i18n/fa-IR/app-debug.ts index 5cc6840e3d..52d16cd5b4 100644 --- a/web/i18n/fa-IR/app-debug.ts +++ b/web/i18n/fa-IR/app-debug.ts @@ -575,6 +575,8 @@ const translation = { waitForFileUpload: 'لطفا منتظر بمانید تا فایل/فایل ها آپلود شوند', waitForImgUpload: 'لطفا منتظر بمانید تا تصویر آپلود شود', waitForBatchResponse: 'لطفا منتظر بمانید تا پاسخ به کار دسته ای تکمیل شود.', + nameOfKeyRequired: 'نام کلید: {{key}} الزامی است', + valueOfVarRequired: 'مقدار {{key}} نمی‌تواند خالی باشد', }, warningMessage: { timeoutExceeded: 'نتایج به دلیل مهلت زمانی نمایش داده نمی شوند. لطفا برای جمع آوری نتایج کامل به گزارش ها مراجعه کنید.', @@ -587,7 +589,13 @@ const translation = { name: 'نام فیلد ورودی کاربر', type: 'نوع ورودی', }, - varKeyError: {}, + varKeyError: { + canNoBeEmpty: '{{key}} مورد نیاز است', + tooLong: '{{key}} خیلی طولانی است. نمی‌تواند بیش از ۳۰ کاراکتر باشد', + notValid: '{{key}} نامعتبر است. فقط می‌تواند شامل حروف، اعداد و زیرخط باشد', + notStartWithNumber: '{{key}} نمی‌تواند با یک عدد شروع شود', + keyAlreadyExists: '{{key}} قبلاً موجود است', + }, otherError: { promptNoBeEmpty: 'اعلان نمی تواند خالی باشد', historyNoBeEmpty: 'سابقه مکالمه باید در اعلان تنظیم شود', @@ -665,6 +673,9 @@ const translation = { 'unitPlaceholder': 'نمایش واحدها بعد از اعداد، به عنوان مثال توکن ها', 'placeholderPlaceholder': 'متن را وارد کنید تا زمانی که فیلد خالی است نمایش داده شود', 'tooltipsPlaceholder': 'نوشتار مفیدی را که هنگام نگه داشتن ماوس روی برچسب نشان داده می شود وارد کنید', + 'description': 'تنظیم برای متغیر {{varName}}', + 'notSet': 'تنظیم نشده است، سعی کنید {{input}} را در پیش‌نویس وارد کنید', + 'maxNumberTip': 'سند < {{docLimit}}، تصویر < {{imgLimit}}، صوت < {{audioLimit}}، ویدئو < {{videoLimit}}', }, vision: { visionSettings: { @@ -677,6 +688,7 @@ const translation = { localUpload: 'آپلود محلی', title: 'تنظیمات بینایی', both: 'هر دو', + resolutionTooltip: 'رزولوشن پایین به مدل اجازه می‌دهد نسخه‌ای کم‌رزولوشن از تصویر با اندازه ۵۱۲ در ۵۱۲ دریافت کند و تصویر را با بودجه ۶۵ توکن نمایش دهد. این امکان باعث می‌شود API پاسخ‌ها را سریع‌تر بازگرداند و توکن‌های ورودی کمتری برای مواردی که نیازی به جزئیات بالا ندارند، مصرف کند.\n\nرزولوشن بالا ابتدا به مدل اجازه می‌دهد تصویر کم‌رزولوشن را ببیند و سپس کات‌های دقیقی از تصاویر ورودی به صورت مربع‌های ۵۱۲ پیکسلی بنا بر اندازه تصویر ورودی ایجاد می‌کند. هر کدام از کات‌های دقیق از دو برابر بودجه توکن استفاده می‌کنند که مجموعاً ۱۲۹ توکن می‌شود.', }, settings: 'تنظیمات', name: 'چشم انداز', @@ -705,6 +717,10 @@ const translation = { title: 'افتتاحیه مکالمه', openingQuestion: 'سوالات آغازین', noDataPlaceHolder: 'شروع مکالمه با کاربر می تواند به هوش مصنوعی کمک کند تا در برنامه های مکالمه ارتباط نزدیک تری با آنها برقرار کند.', + placeholder: 'پیام شروع خود را اینجا بنویسید، می‌توانید از متغیرها استفاده کنید، امتحان کنید تایپ {{variable}}.', + openingQuestionPlaceholder: 'می‌توانید از متغیرها استفاده کنید، امتحان کنید {{variable}} را تایپ کنید.', + varTip: 'می‌توانید از متغیرها استفاده کنید، نوع {{variable}} را امتحان کنید', + notIncludeKey: 'پیام اولیه شامل متغیر {{key}} نیست. لطفاً آن را به پیام اولیه اضافه کنید.', }, modelConfig: { modeType: { @@ -796,6 +812,8 @@ const translation = { formattingChangedText: 'با تغییر قالب بندی، ناحیه اشکال زدایی بازنشانی می شود، مطمئن هستید؟', variableTip: 'کاربران متغیرها را در یک فرم پر می کنند و به طور خودکار متغیرها را در اعلان جایگزین می کنند.', autoAddVar: 'متغیرهای تعریف نشده که در پیش اعلان ارجاع داده شده اند، آیا می خواهید آنها را به صورت ورودی کاربر اضافه کنید؟', + promptTip: 'پرومپت‌ها پاسخ‌های هوش مصنوعی را با دستورالعمل‌ها و محدودیت‌ها هدایت می‌کنند. متغیرهایی مانند {{input}} را وارد کنید. این پرومپت برای کاربران قابل مشاهده نخواهد بود.', + notSetVar: 'متغیرها به کاربران امکان می‌دهند تا هنگام پر کردن فرم‌ها، کلمات راهنما یا سخنان افتتاحیه را وارد کنند. می‌توانید امتحان کنید که \'{{input}}\' را در کلمات راهنما وارد کنید.', } export default translation diff --git a/web/i18n/fa-IR/app-log.ts b/web/i18n/fa-IR/app-log.ts index 93936e6c4e..09587da817 100644 --- a/web/i18n/fa-IR/app-log.ts +++ b/web/i18n/fa-IR/app-log.ts @@ -19,6 +19,7 @@ const translation = { tokens: 'توکن‌ها', user: 'کاربر نهایی یا حساب', version: 'نسخه', + triggered_from: 'فعال شده توسط', }, pagination: { previous: 'قبلی', @@ -97,6 +98,15 @@ const translation = { finalProcessing: 'پردازش نهایی', }, dateFormat: 'MM/DD/YYYY', + triggerBy: { + debugging: 'رفع اشکال', + appRun: 'وب اپ', + webhook: 'وب‌هوک', + schedule: 'برنامه', + plugin: 'افزونه', + ragPipelineRun: 'خط لوله RAG', + ragPipelineDebugging: 'رفع اشکال RAG', + }, } export default translation diff --git a/web/i18n/fa-IR/app-overview.ts b/web/i18n/fa-IR/app-overview.ts index a77077b922..6fede71b20 100644 --- a/web/i18n/fa-IR/app-overview.ts +++ b/web/i18n/fa-IR/app-overview.ts @@ -114,7 +114,11 @@ const translation = { }, }, launch: 'راه اندازی', - enableTooltip: {}, + enableTooltip: { + description: 'برای فعال کردن این ویژگی، لطفاً یک گره ورودی کاربر به صفحه اضافه کنید. (ممکن است قبلاً در پیش‌نویس وجود داشته باشد، بعد از انتشار اعمال می‌شود)', + learnMore: 'بیشتر بدانید', + }, + title: 'وب اپ', }, apiInfo: { title: 'API سرویس بک‌اند', @@ -126,7 +130,14 @@ const translation = { running: 'در حال سرویس‌دهی', disable: 'غیرفعال', }, - triggerInfo: {}, + triggerInfo: { + title: 'محرک‌ها', + explanation: 'مدیریت فعال‌سازی جریان کاری', + triggersAdded: '{{count}} محرک‌ها اضافه شدند', + noTriggerAdded: 'هیچ ماشه‌ای افزوده نشده است', + triggerStatusDescription: 'وضعیت گره تریگر در اینجا نمایش داده می‌شود. (ممکن است قبلاً در پیش‌نویس وجود داشته باشد، پس از انتشار اعمال می‌شود)', + learnAboutTriggers: 'با محرک‌ها آشنا شوید', + }, disableTooltip: { triggerMode: 'ویژگی {{feature}} در حالت گره تریگر پشتیبانی نمی‌شود.', }, diff --git a/web/i18n/fa-IR/billing.ts b/web/i18n/fa-IR/billing.ts index f57f7fb02f..54d7570042 100644 --- a/web/i18n/fa-IR/billing.ts +++ b/web/i18n/fa-IR/billing.ts @@ -98,6 +98,8 @@ const translation = { triggerEvents: { unlimited: 'رویدادهای ماشه‌ای نامحدود', tooltip: 'تعداد رویدادهایی که به‌طور خودکار گردش‌های کاری را از طریق افزونه، برنامه‌زمان‌بندی یا ماشه‌های وب‌هوک آغاز می‌کنند.', + sandbox: '{{count,number}} رویدادهای محرک', + professional: '{{count,number}} رویدادهای فعال‌سازی/ماه', }, workflowExecution: { faster: 'اجرای سریع‌تر جریان کاری', @@ -107,6 +109,11 @@ const translation = { }, startNodes: { unlimited: 'راه‌اندازی/فرآیندهای نامحدود', + limited: 'تا {{count}} محرک/جریان‌کاری', + }, + title: { + plans: 'طرح‌ها', + description: 'برنامه‌ای را انتخاب کنید که بهترین تناسب را با نیازهای تیم شما دارد.', }, }, plans: { @@ -133,8 +140,7 @@ const translation = { btnText: 'تماس با فروش', for: 'برای تیم‌های بزرگ', priceTip: 'فقط صورتحساب سالیانه', - features: { - }, + features: ['راه‌حل‌های مستقرسازی مقیاس‌پذیر با سطح سازمانی', 'مجوز استفاده تجاری', 'ویژگی‌های اختصاصی سازمانی', 'چند فضای کاری و مدیریت سازمانی', 'ورود یکپارچه', 'توافق‌نامه‌های سطح خدمات مذاکره شده توسط شرکای Dify', 'امنیت و کنترل‌های پیشرفته', 'به‌روزرسانی‌ها و نگهداری به‌طور رسمی توسط دیفی', 'پشتیبانی فنی حرفه‌ای'], }, community: { btnText: 'شروع کنید با جامعه', @@ -143,8 +149,7 @@ const translation = { description: 'برای کاربران فردی، تیم‌های کوچک یا پروژه‌های غیر تجاری', name: 'جامعه', for: 'برای کاربران فردی، تیم‌های کوچک یا پروژه‌های غیر تجاری', - features: { - }, + features: ['تمام ویژگی‌های اصلی تحت مخزن عمومی منتشر شدند', 'فضای کاری تنها', 'مطابق با مجوز متن باز Dify'], }, premium: { btnText: 'گرفتن نسخه پریمیوم در', @@ -155,8 +160,7 @@ const translation = { name: 'پیشرفته', priceTip: 'بر اساس بازار ابری', comingSoon: 'پشتیبانی مایکروسافت آژور و گوگل کلود به زودی در دسترس خواهد بود', - features: { - }, + features: ['قابلیت اطمینان خودمدیریتی توسط ارائه‌دهندگان مختلف ابری', 'فضای کاری تنها', 'سفارشی‌سازی لوگو و برندینگ وب‌اپ', 'پشتیبانی اولویت‌دار ایمیل و چت'], }, }, vectorSpace: { @@ -184,6 +188,7 @@ const translation = { vectorSpaceTooltip: 'سندهایی که با حالت نمایه‌سازی با کیفیت بالا تهیه می‌شوند، منابع ذخیره‌سازی داده‌های دانش را مصرف خواهند کرد. زمانی که ذخیره‌سازی داده‌های دانش به حد خود برسد، اسناد جدید بارگزاری نخواهند شد.', perMonth: 'در ماه', triggerEvents: 'رویدادهای محرک', + resetsIn: 'در {{count,number}} روز بازنشانی می‌شود', }, teamMembers: 'اعضای تیم', triggerLimitModal: { diff --git a/web/i18n/fa-IR/common.ts b/web/i18n/fa-IR/common.ts index fb81a9e98e..79a55add01 100644 --- a/web/i18n/fa-IR/common.ts +++ b/web/i18n/fa-IR/common.ts @@ -65,6 +65,12 @@ const translation = { deleteConfirmTitle: 'حذف شود؟', yes: 'بله', confirmAction: 'لطفاً اقدام خود را تأیید کنید.', + noSearchResults: 'هیچ {{content}} یافت نشد', + resetKeywords: 'بازنشانی کلمات کلیدی', + selectCount: '{{count}} انتخاب شد', + searchCount: 'یافتن {{count}} {{content}}', + noSearchCount: '0 {{content}}', + now: 'الان', }, errorMsg: { fieldRequired: '{{field}} الزامی است', @@ -73,6 +79,7 @@ const translation = { placeholder: { input: 'لطفا وارد کنید', select: 'لطفا انتخاب کنید', + search: 'جستجو...', }, voice: { language: { @@ -769,6 +776,13 @@ const translation = { label: { optional: '(اختیاری)', }, + noData: 'بدون داده', + dynamicSelect: { + error: 'بارگیری گزینه‌ها ناموفق بود', + noData: 'هیچ گزینه‌ای در دسترس نیست', + loading: 'در حال بارگذاری گزینه‌ها...', + selected: '{{count}} انتخاب شد', + }, } export default translation diff --git a/web/i18n/fa-IR/dataset-documents.ts b/web/i18n/fa-IR/dataset-documents.ts index 33432ddd9c..7987174225 100644 --- a/web/i18n/fa-IR/dataset-documents.ts +++ b/web/i18n/fa-IR/dataset-documents.ts @@ -81,7 +81,10 @@ const translation = { ok: 'تأیید', }, learnMore: 'بیشتر بدانید', - sort: {}, + sort: { + uploadTime: 'زمان بارگذاری', + hitCount: 'تعداد بازیابی', + }, }, metadata: { title: 'اطلاعات متا', diff --git a/web/i18n/fa-IR/dataset-pipeline.ts b/web/i18n/fa-IR/dataset-pipeline.ts index 8a92e250cb..407f6d162c 100644 --- a/web/i18n/fa-IR/dataset-pipeline.ts +++ b/web/i18n/fa-IR/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'خط لوله دانش منتشر شد', + tip: 'برای افزودن یا مدیریت اسناد، به اسناد بروید.', }, error: { message: 'انتشار پایپ لاین دانش ناموفق است', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'ساختار', structureTooltip: 'ساختار Chunk نحوه تقسیم و نمایه سازی اسناد را تعیین می کند - حالت های عمومی، والد-فرزند و پرسش و پاسخ را ارائه می دهد - و برای هر پایگاه دانش منحصر به فرد است.', + createdBy: 'توسط {{author}}', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { backToDataSource: 'منبع داده', characters: 'کاراکتر', title: 'اسناد را اضافه کنید', + selectOnlineDocumentTip: 'پردازش تا {{count}} صفحه', + selectOnlineDriveTip: 'پردازش تا {{count}} فایل، حداکثر {{fileSize}} مگابایت برای هر فایل', }, documentSettings: { title: 'تنظیمات سند', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} صفحه', + }, onlineDrive: { breadcrumbs: { allFiles: 'همه فایل ها', searchPlaceholder: 'فایل های جستجو...', allBuckets: 'همه سطل های ذخیره سازی ابری', + searchResult: 'یافتن {{searchResultsLength}} مورد در پوشه «{{folderName}}»', }, emptyFolder: 'این پوشه خالی است', resetKeywords: 'بازنشانی کلمات کلیدی', emptySearchResult: 'هیچ موردی یافت نشد', notSupportedFileType: 'این نوع فایل پشتیبانی نمی شود', + notConnected: '{{name}} متصل نیست', + notConnectedTip: 'برای همگام‌سازی با {{name}}، ابتدا باید اتصال به {{name}} برقرار شود.', + }, + credentialSelector: { + name: '{{pluginName}} {{credentialName}}', }, - credentialSelector: {}, conversion: { confirm: { title: 'تایید', @@ -149,6 +160,7 @@ const translation = { editPipelineInfo: 'ویرایش اطلاعات خط لوله', knowledgeNameAndIconPlaceholder: 'لطفا نام پایگاه دانش را وارد کنید', knowledgeDescriptionPlaceholder: 'آنچه در این پایگاه دانش وجود دارد را شرح دهید. توضیحات دقیق به هوش مصنوعی اجازه می دهد تا با دقت بیشتری به محتوای مجموعه داده دسترسی داشته باشد. اگر خالی باشد، Dify از استراتژی ضربه پیش فرض استفاده می کند. (اختیاری)', + configurationTip: 'پیکربندی {{pluginName}}', } export default translation diff --git a/web/i18n/fa-IR/dataset.ts b/web/i18n/fa-IR/dataset.ts index 9613ef2b7b..1c4d4d3532 100644 --- a/web/i18n/fa-IR/dataset.ts +++ b/web/i18n/fa-IR/dataset.ts @@ -234,6 +234,10 @@ const translation = { enabled: 'در حال خدمت', title: 'رابط برنامه‌نویسی سرویس', }, + docAllEnabled_one: 'سند {{count}} فعال شد', + docAllEnabled_other: 'تمام اسناد {{count}} فعال شدند', + partialEnabled_one: 'مجموعاً {{count}} سند، {{num}} موجود', + partialEnabled_other: 'مجموع {{count}} سند، {{num}} موجود', } export default translation diff --git a/web/i18n/fa-IR/education.ts b/web/i18n/fa-IR/education.ts index d5e23db782..8befbd4517 100644 --- a/web/i18n/fa-IR/education.ts +++ b/web/i18n/fa-IR/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: 'نگران نباشید — این بر اشتراک فعلی شما تأثیر نخواهد گذاشت، اما زمانیکه تمدید شود، شما تخفیف آموزشی را دریافت نخواهید کرد مگر اینکه وضعیت خود را دوباره تأیید کنید.', + title: 'وضعیت تحصیلی شما در {{date}} منقضی خواهد شد', }, stillInEducation: { title: 'آیا هنوز در حال تحصیل هستید؟', diff --git a/web/i18n/fa-IR/pipeline.ts b/web/i18n/fa-IR/pipeline.ts index e46eb7f417..3a4815f23a 100644 --- a/web/i18n/fa-IR/pipeline.ts +++ b/web/i18n/fa-IR/pipeline.ts @@ -28,10 +28,12 @@ const translation = { viewDetails: 'مشاهده جزئیات', loading: 'پردازش... لطفاً منتظر بمانید', error: 'خطا در حین اجرا رخ داد', + footerTip: 'در حالت اجرای آزمایشی، پیش‌نمایش تا {{count}} بخش', }, }, ragToolSuggestions: { title: 'پیشنهاداتی برای RAG', + noRecommendationPlugins: 'هیچ افزونه‌ای پیشنهادی وجود ندارد، برای یافتن بیشتر به بازار مراجعه کنید', }, } diff --git a/web/i18n/fa-IR/plugin-trigger.ts b/web/i18n/fa-IR/plugin-trigger.ts new file mode 100644 index 0000000000..6021266cc6 --- /dev/null +++ b/web/i18n/fa-IR/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'اشتراک‌ها', + listNum: 'اشتراک‌های {{num}}', + empty: { + title: 'بدون اشتراک', + button: 'اشتراک جدید', + }, + createButton: { + oauth: 'اشتراک جدید با OAuth', + apiKey: 'اشتراک جدید با کلید API', + manual: 'چسباندن URL برای ایجاد اشتراک جدید', + }, + createSuccess: 'اشتراک با موفقیت ایجاد شد', + createFailed: 'ایجاد اشتراک با شکست مواجه شد', + maxCount: 'حداکثر {{num}} اشتراک', + selectPlaceholder: 'انتخاب اشتراک', + noSubscriptionSelected: 'هیچ اشتراکی انتخاب نشده است', + subscriptionRemoved: 'اشتراک حذف شد', + list: { + title: 'اشتراک‌ها', + addButton: 'افزودن', + tip: 'دریافت رویدادها از طریق اشتراک', + item: { + enabled: 'فعال', + disabled: 'غیرفعال', + credentialType: { + api_key: 'کلید API', + oauth2: 'اواف', + unauthorized: 'دستی', + }, + actions: { + delete: 'حذف', + deleteConfirm: { + title: 'آیا {{name}} را حذف می‌کنید؟', + success: 'اشتراک {{name}} با موفقیت حذف شد', + error: 'حذف اشتراک {{name}} ناموفق بود', + content: 'پس از حذف، این اشتراک قابل بازیابی نخواهد بود. لطفاً تأیید کنید.', + contentWithApps: 'اشتراک فعلی توسط {{count}} برنامه مورد استفاده قرار گرفته است. حذف آن باعث می‌شود برنامه‌های پیکربندی‌شده دریافت رویدادهای اشتراک را متوقف کنند.', + confirm: 'تأیید حذف', + cancel: 'لغو', + confirmInputWarning: 'لطفاً نام صحیح را برای تأیید وارد کنید.', + confirmInputPlaceholder: 'برای تأیید «{{name}}» را وارد کنید.', + confirmInputTip: 'لطفاً برای تأیید «{{name}}» را وارد کنید.', + }, + }, + status: { + active: 'فعال', + inactive: 'غیرفعال', + }, + usedByNum: 'استفاده شده توسط {{num}} جریان‌های کاری', + noUsed: 'هیچ روند کاری استفاده نشده است', + }, + }, + addType: { + title: 'افزودن اشتراک', + description: 'انتخاب کنید که چگونه می‌خواهید اشتراک محرک خود را ایجاد کنید', + options: { + apikey: { + title: 'ایجاد با کلید API', + description: 'ایجاد اشتراک به‌صورت خودکار با استفاده از اطلاعات ورود API', + }, + oauth: { + title: 'ایجاد با OAuth', + description: 'با پلتفرم شخص ثالث مجوز بدهید تا اشتراک ایجاد شود', + clientSettings: 'تنظیمات کلاینت OAuth', + clientTitle: 'کلاینت OAuth', + default: 'پیش‌فرض', + custom: 'سفارشی', + }, + manual: { + title: 'راه‌اندازی دستی', + description: 'چسباندن URL برای ایجاد اشتراک جدید', + tip: 'تنظیم دستی URL در پلتفرم شخص ثالث', + }, + }, + }, + }, + modal: { + steps: { + verify: 'تأیید کردن', + configuration: 'پیکربندی', + }, + common: { + cancel: 'لغو', + back: 'بازگشت', + next: 'بعدی', + create: 'ایجاد کردن', + verify: 'تأیید کردن', + authorize: 'مجاز کردن', + creating: 'در حال ایجاد...', + verifying: 'در حال تأیید...', + authorizing: 'در حال مجازسازی...', + }, + oauthRedirectInfo: 'چون هیچ راز کلاینت سیستمی برای این ارائه‌دهنده ابزار پیدا نشد، تنظیم آن به صورت دستی لازم است، برای redirect_uri لطفاً استفاده کنید', + apiKey: { + title: 'ایجاد با کلید API', + verify: { + title: 'تأیید اطلاعات کاربری', + description: 'لطفاً اطلاعات API خود را برای تأیید دسترسی ارائه دهید', + error: 'تأیید اعتبار ناموفق بود. لطفاً کلید API خود را بررسی کنید.', + success: 'اعتبارات با موفقیت تأیید شد', + }, + configuration: { + title: 'پیکربندی اشتراک', + description: 'پارامترهای اشتراک خود را تنظیم کنید', + }, + }, + oauth: { + title: 'ایجاد با OAuth', + authorization: { + title: 'مجوز او‌آه‌اِس', + description: 'اجازه دهید دیفی به حساب شما دسترسی داشته باشد', + redirectUrl: 'تغییر مسیر آدرس اینترنتی', + redirectUrlHelp: 'از این URL در تنظیمات برنامه OAuth خود استفاده کنید', + authorizeButton: 'مجوزدهی با {{provider}}', + waitingAuth: 'در انتظار مجوز...', + authSuccess: 'مجوز با موفقیت صادر شد', + authFailed: 'دریافت اطلاعات مجوز OAuth ناکام ماند', + waitingJump: 'مجاز، در انتظار پرش', + }, + configuration: { + title: 'پیکربندی اشتراک', + description: 'پس از تأیید هویت، پارامترهای اشتراک خود را تنظیم کنید', + success: 'پیکربندی OAuth با موفقیت انجام شد', + failed: 'پیکربندی OAuth با شکست مواجه شد', + }, + remove: { + success: 'حذف OAuth با موفقیت انجام شد', + failed: 'حذف OAuth ناموفق بود', + }, + save: { + success: 'پیکربندی OAuth با موفقیت ذخیره شد', + }, + }, + manual: { + title: 'راه‌اندازی دستی', + description: 'اشتراک وب‌هوک خود را به‌صورت دستی تنظیم کنید', + logs: { + title: 'گزارش‌های درخواست', + request: 'درخواست', + loading: 'در انتظار درخواست از {{pluginName}}...', + }, + }, + form: { + subscriptionName: { + label: 'نام اشتراک', + placeholder: 'نام اشتراک را وارد کنید', + required: 'نام اشتراک الزامی است', + }, + callbackUrl: { + label: 'آدرس بازگشت تماس', + description: 'این آدرس URL رویدادهای وب هوک را دریافت خواهد کرد', + tooltip: 'یک نقطه دسترسی عمومی فراهم کنید که بتواند درخواست‌های بازگشتی از ارائه‌دهنده تریگر را دریافت کند.', + placeholder: 'در حال تولید...', + privateAddressWarning: 'به نظر می‌رسد این URL یک آدرس داخلی است که ممکن است باعث شود درخواست‌های وب‌هوک با شکست مواجه شوند. شما می‌توانید TRIGGER_URL را به یک آدرس عمومی تغییر دهید.', + }, + }, + errors: { + createFailed: 'ایجاد اشتراک با شکست مواجه شد', + verifyFailed: 'تأیید اطلاعات ورود ناموفق بود', + authFailed: 'مجوز ناموفق بود', + networkError: 'خطای شبکه، لطفاً دوباره تلاش کنید', + }, + }, + events: { + title: 'رویدادهای موجود', + description: 'رویدادهایی که این افزونه فعال‌سازی می‌تواند به آن‌ها مشترک شود', + empty: 'هیچ رویدادی در دسترس نیست', + event: 'رویداد', + events: 'رویدادها', + actionNum: '{{num}} {{event}} گنجانده شده', + item: { + parameters: 'پارامترهای {{count}}', + noParameters: 'هیچ پارامتری', + }, + output: 'خروجی', + }, + node: { + status: { + warning: 'قطع ارتباط', + }, + }, +} + +export default translation diff --git a/web/i18n/fa-IR/plugin.ts b/web/i18n/fa-IR/plugin.ts index 00afe21cb2..3b171a01ce 100644 --- a/web/i18n/fa-IR/plugin.ts +++ b/web/i18n/fa-IR/plugin.ts @@ -7,6 +7,7 @@ const translation = { tools: 'ابزار', extensions: 'پسوند', datasources: 'منابع داده', + triggers: 'محرک‌ها', }, categorySingle: { tool: 'ابزار', @@ -15,6 +16,7 @@ const translation = { model: 'مدل', bundle: 'بسته', datasource: 'منبع داده', + trigger: 'محرک', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { detail: 'جزئیات', viewDetail: 'نمایش جزئیات', install: 'نصب', + back: 'بازگشت', }, toolSelector: { descriptionPlaceholder: @@ -332,6 +335,12 @@ const translation = { partialUPdate: 'تنها {{num}} پلاگین زیر به‌طور خودکار به‌روزرسانی خواهد شد.', }, + readmeInfo: { + title: 'خواندنی', + needHelpCheckReadme: 'نیاز به کمک دارید؟ فایل README را بررسی کنید.', + noReadmeAvailable: 'بدون پرونده README موجود', + failedToFetch: 'بارگیری فایل README با شکست مواجه شد', + }, } export default translation diff --git a/web/i18n/fa-IR/workflow.ts b/web/i18n/fa-IR/workflow.ts index e27b8934e2..a32b7d5d84 100644 --- a/web/i18n/fa-IR/workflow.ts +++ b/web/i18n/fa-IR/workflow.ts @@ -113,6 +113,15 @@ const translation = { currentView: 'نمای فعلی', currentWorkflow: 'گردش کار فعلی', moreActions: 'اقدامات بیشتر', + listening: 'گوش دادن', + chooseStartNodeToRun: 'گره شروع را برای اجرا انتخاب کنید', + runAllTriggers: 'اجرای همه‌ی تریگرها', + features: 'ویژگی‌ها', + featuresDescription: 'بهبود تجربه کاربری برنامه وب', + featuresDocLink: 'بیشتر بدانید', + needAdd: 'باید یک گره {{node}} اضافه شود', + needStartNode: 'حداقل یک گره شروع باید اضافه شود', + workflowAsToolDisabledHint: 'آخرین جریان کاری را منتشر کنید و قبل از تنظیم آن به عنوان یک ابزار، مطمئن شوید که یک گره ورودی کاربر متصل وجود دارد.', }, env: { envPanelTitle: 'متغیرهای محیطی', @@ -219,6 +228,7 @@ const translation = { rerankModelRequired: 'قبل از روشن کردن Rerank Model، لطفا تأیید کنید که مدل با موفقیت در تنظیمات پیکربندی شده است.', noValidTool: '{{field}} هیچ ابزار معتبری انتخاب نشده است', toolParameterRequired: '{{field}}: پارامتر [{{param}}] مورد نیاز است', + startNodeRequired: 'لطفاً ابتدا یک گره شروع اضافه کنید قبل از {{operation}}', }, singleRun: { testRun: 'اجرای آزمایشی', @@ -250,6 +260,21 @@ const translation = { 'allAdded': 'همه اضافه شده است', 'sources': 'منابع', 'searchDataSource': 'منبع داده جستجو', + 'start': 'شروع', + 'searchTrigger': 'فعال‌سازی جستجو...', + 'allTriggers': 'همه‌ی محرک‌ها', + 'noPluginsFound': 'هیچ پلاگینی پیدا نشد', + 'requestToCommunity': 'درخواست‌ها از جامعه', + 'featuredTools': 'ویژه', + 'showMoreFeatured': 'نمایش بیشتر', + 'showLessFeatured': 'نمایش کمتر', + 'installed': 'نصب شده', + 'pluginByAuthor': 'توسط {{author}}', + 'usePlugin': 'انتخاب ابزار', + 'hideActions': 'ابزارها را مخفی کن', + 'noFeaturedPlugins': 'ابزارهای بیشتر را در بازار پیدا کنید', + 'noFeaturedTriggers': 'کشف محرک‌های بیشتر در بازار', + 'startDisabledTip': 'گره تریگر و گره ورودی کاربر به‌طور متقابل انحصاری هستند.', }, blocks: { 'start': 'شروع', @@ -276,6 +301,10 @@ const translation = { 'loop': 'حلقه', 'datasource': 'منبع داده', 'knowledge-index': 'پایگاه دانش', + 'originalStartNode': 'گره شروع اصلی', + 'trigger-schedule': 'راه‌اندازی زمان‌بندی', + 'trigger-webhook': 'راه‌انداز وبهوک', + 'trigger-plugin': 'راه‌انداز پلاگین', }, blocksAbout: { 'start': 'پارامترهای اولیه برای راه‌اندازی جریان کار را تعریف کنید', @@ -300,6 +329,9 @@ const translation = { 'loop': 'یک حلقه منطقی را اجرا کنید تا زمانی که شرایط خاتمه برآورده شود یا حداکثر تعداد حلقه به پایان برسد.', 'knowledge-index': 'پایگاه دانش درباره', 'datasource': 'منبع داده درباره', + 'trigger-schedule': 'راه‌اندازی گردش کار مبتنی بر زمان که گردش کارها را بر اساس برنامه آغاز می‌کند', + 'trigger-webhook': 'Webhook Trigger دریافت‌کنندهٔ push‌های HTTP از سیستم‌های شخص ثالث است تا به‌طور خودکار جریان‌های کاری را راه‌اندازی کند.', + 'trigger-plugin': 'راه‌اندازی یکپارچه‌سازی با شخص ثالث که گردش‌های کاری را از رویدادهای پلتفرم خارجی شروع می‌کند', }, operator: { zoomIn: 'بزرگ‌نمایی', @@ -340,6 +372,8 @@ const translation = { maximize: 'بیشینه‌سازی بوم', scrollToSelectedNode: 'به گره انتخاب شده بروید', optional_and_hidden: '(اختیاری و پنهان)', + goTo: 'برو به', + startNode: 'گره شروع', }, nodes: { common: { @@ -787,6 +821,8 @@ const translation = { parallelPanelDesc: 'در حالت موازی، وظایف در تکرار از اجرای موازی پشتیبانی می کنند.', MaxParallelismDesc: 'حداکثر موازی سازی برای کنترل تعداد وظایف اجرا شده به طور همزمان در یک تکرار واحد استفاده می شود.', answerNodeWarningDesc: 'هشدار حالت موازی: گره های پاسخ، تکالیف متغیر مکالمه و عملیات خواندن/نوشتن مداوم در تکرارها ممکن است باعث استثنائات شود.', + flattenOutput: 'صاف کردن خروجی', + flattenOutputDesc: 'هنگامی که فعال باشد، اگر تمام خروجی‌های تکرار آرایه باشند، آنها به یک آرایهٔ واحد تبدیل خواهند شد. هنگامی که غیرفعال باشد، خروجی‌ها ساختار آرایهٔ تو در تو را حفظ می‌کنند.', }, note: { addNote: 'افزودن یادداشت', @@ -963,6 +999,144 @@ const translation = { embeddingModelIsInvalid: 'مدل جاسازی نامعتبر است', rerankingModelIsInvalid: 'مدل رتبه‌بندی مجدد نامعتبر است', }, + triggerPlugin: { + authorized: 'مجاز', + notConfigured: 'پیکربندی نشده', + notAuthorized: 'مجوز ندارد', + selectSubscription: 'انتخاب اشتراک', + availableSubscriptions: 'اشتراک‌های موجود', + addSubscription: 'افزودن اشتراک جدید', + removeSubscription: 'لغو اشتراک', + subscriptionRemoved: 'اشتراک با موفقیت حذف شد', + error: 'خطا', + configuration: 'پیکربندی', + remove: 'حذف', + or: 'یا', + useOAuth: 'استفاده از OAuth', + useApiKey: 'استفاده از کلید API', + authenticationFailed: 'احراز هویت ناموفق بود', + authenticationSuccess: 'احراز هویت با موفقیت انجام شد', + oauthConfigFailed: 'پیکربندی OAuth با شکست مواجه شد', + configureOAuthClient: 'پیکربندی مشتری OAuth', + oauthClientDescription: 'تنظیم اطلاعات مشتری OAuth برای فعال‌سازی احراز هویت', + oauthClientSaved: 'پیکربندی کلاینت OAuth با موفقیت ذخیره شد', + configureApiKey: 'پیکربندی کلید API', + apiKeyDescription: 'تنظیم اطلاعات کلید API برای احراز هویت', + apiKeyConfigured: 'کلید API با موفقیت پیکربندی شد', + configurationFailed: 'پیکربندی ناموفق بود', + failedToStart: 'شروع فرآیند احراز هویت ناکام ماند', + credentialsVerified: 'اعتبارات با موفقیت تأیید شد', + credentialVerificationFailed: 'اعتبارسنجی مدارک ناموفق بود', + verifyAndContinue: 'تأیید و ادامه', + configureParameters: 'پیکربندی پارامترها', + parametersDescription: 'تنظیم پارامترها و ویژگی‌های تریگر', + configurationComplete: 'پیکربندی کامل شد', + configurationCompleteDescription: 'راه‌انداز شما با موفقیت پیکربندی شد', + configurationCompleteMessage: 'پیکربندی ماشه شما اکنون کامل شده و آماده استفاده است.', + parameters: 'پارامترها', + properties: 'ویژگی‌ها', + propertiesDescription: 'خصوصیات پیکربندی اضافی برای این تریگر', + noConfigurationRequired: 'برای این محرک تنظیمات اضافی لازم نیست.', + subscriptionName: 'نام اشتراک', + subscriptionNameDescription: 'یک نام منحصر به فرد برای اشتراک این تریگر وارد کنید', + subscriptionNamePlaceholder: 'نام اشتراک را وارد کنید...', + subscriptionNameRequired: 'نام اشتراک الزامی است', + subscriptionRequired: 'اشتراک لازم است', + }, + triggerSchedule: { + title: 'برنامه', + nodeTitle: 'راه‌اندازی زمان‌بندی', + notConfigured: 'پیکربندی نشده', + useCronExpression: 'استفاده از عبارت کران', + useVisualPicker: 'استفاده از انتخابگر بصری', + frequency: { + label: 'فرکانس', + hourly: 'ساعتی', + daily: 'روزانه', + weekly: 'هفتگی', + monthly: 'ماهانه', + }, + selectFrequency: 'انتخاب فرکانس', + frequencyLabel: 'فرکانس', + nextExecution: 'اجرای بعدی', + weekdays: 'روزهای هفته', + time: 'زمان', + cronExpression: 'بیان کرون', + nextExecutionTime: 'زمان اجرای بعدی', + nextExecutionTimes: '۵ زمان اجرای بعدی', + startTime: 'زمان شروع', + executeNow: 'اجرا اکنون', + selectDateTime: 'تاریخ و زمان را انتخاب کنید', + hours: 'ساعات', + minutes: 'دقایق', + onMinute: 'در دقیقه', + days: 'روزها', + lastDay: 'آخرین روز', + lastDayTooltip: 'تمام ماه‌ها ۳۱ روز ندارند. از گزینه «آخرین روز» برای انتخاب روز آخر هر ماه استفاده کنید.', + mode: 'مد', + timezone: 'منطقه زمانی', + visualConfig: 'پیکربندی بصری', + monthlyDay: 'روز ماهانه', + executionTime: 'زمان اجرا', + invalidTimezone: 'منطقه زمانی نامعتبر', + invalidCronExpression: 'عبارت کرون نامعتبر', + noValidExecutionTime: 'زمان اجرای معتبر نمی‌تواند محاسبه شود', + executionTimeCalculationError: 'محاسبه زمان‌های اجرا با شکست مواجه شد', + invalidFrequency: 'فرکانس نامعتبر', + invalidStartTime: 'زمان شروع نامعتبر', + startTimeMustBeFuture: 'زمان شروع باید در آینده باشد', + invalidTimeFormat: 'فرمت زمان نامعتبر است (انتظار می‌رفت HH:MM AM/PM باشد)', + invalidWeekday: 'روز هفته نامعتبر: {{weekday}}', + invalidMonthlyDay: 'روز ماهانه باید بین ۱ تا ۳۱ یا «آخر» باشد', + invalidOnMinute: 'دقیقه باید بین ۰ تا ۵۹ باشد', + invalidExecutionTime: 'زمان اجرای نامعتبر', + executionTimeMustBeFuture: 'زمان اجرا باید در آینده باشد', + }, + triggerWebhook: { + title: 'راه‌اندازی وبهوک', + nodeTitle: '🔗 فعال‌سازی وبهوک', + configPlaceholder: 'پیکربندی فعال‌سازی وب هوک در اینجا انجام خواهد شد', + webhookUrl: 'آدرس وب هوک', + webhookUrlPlaceholder: 'برای ایجاد آدرس وبهوک روی تولید کلیک کنید', + generate: 'تولید کردن', + copy: 'کپی', + test: 'تست', + urlGenerated: 'آدرس وبهوک با موفقیت ایجاد شد', + urlGenerationFailed: 'ایجاد URL وب‌هوک ناموفق بود', + urlCopied: 'آدرس وب‌سایت در حافظه موقت کپی شد', + method: 'روش', + contentType: 'نوع محتوا', + queryParameters: 'پارامترهای پرس‌وجو', + headerParameters: 'پارامترهای هدر', + requestBodyParameters: 'پارامترهای بدنه درخواست', + parameterName: 'نام متغیر', + varName: 'نام متغیر', + varType: 'نوع', + varNamePlaceholder: 'نام متغیر را وارد کنید...', + required: 'الزامی', + addParameter: 'افزودن', + addHeader: 'افزودن', + noParameters: 'هیچ پارامتری پیکربندی نشده است', + noQueryParameters: 'پارامترهای پرس‌وجو تنظیم نشده‌اند', + noHeaders: 'هیچ هدر پیکربندی نشده است', + noBodyParameters: 'هیچ پارامتر بدنی پیکربندی نشده است', + debugUrlTitle: 'برای اجرای آزمایشی، همیشه از این آدرس اینترنتی استفاده کنید', + debugUrlCopy: 'برای کپی کلیک کنید', + debugUrlCopied: 'کپی شد!', + debugUrlPrivateAddressWarning: 'به نظر می‌رسد این URL یک آدرس داخلی است که ممکن است باعث شود درخواست‌های وب‌هوک با شکست مواجه شوند. شما می‌توانید TRIGGER_URL را به یک آدرس عمومی تغییر دهید.', + errorHandling: 'مدیریت خطا', + errorStrategy: 'مدیریت خطا', + responseConfiguration: 'پاسخ', + asyncMode: 'حالت غیرهمزمان', + statusCode: 'کد وضعیت', + responseBody: 'بدنه پاسخ', + responseBodyPlaceholder: 'بدنه پاسخ خود را اینجا بنویسید', + headers: 'سرتیترها', + validation: { + webhookUrlRequired: 'آدرس وبهوک الزامی است', + invalidParameterType: 'نوع پارامتر نامعتبر "{{type}}" برای پارامتر "{{name}}"', + }, + }, }, tracing: { stopBy: 'متوقف شده توسط {{user}}', @@ -1037,6 +1211,18 @@ const translation = { exportToolTip: 'اکسپورت متغیر به عنوان فایل', largeData: 'داده های بزرگ، پیش نمایش فقط خواندنی صادرات برای مشاهده همه.', largeDataNoExport: 'داده های بزرگ - فقط پیش نمایش جزئی', + listening: { + title: 'در انتظار رویدادها از تریگرها...', + tip: 'اکنون می‌توانید با ارسال درخواست‌های آزمایشی به نقطه پایانی HTTP {{nodeName}} رویدادها را شبیه‌سازی کنید یا از آن به عنوان URL بازخوانی برای دیباگ رویدادهای زنده استفاده کنید. تمام خروجی‌ها را می‌توان به طور مستقیم در بازرس متغیر مشاهده کرد.', + tipPlugin: 'حال می‌توانید در {{- pluginName}} رویداد ایجاد کنید و خروجی‌های این رویدادها را در بازرس متغیرها بازیابی کنید.', + tipSchedule: 'گوش دادن به رویدادها از طریق محرک‌های زمان‌بندی شده.\nزمان اجرای بعدی برنامه‌ریزی شده: {{nextTriggerTime}}', + tipFallback: 'در انتظار رویدادهای فعال‌سازی ورودی باشید. خروجی‌ها در اینجا نمایش داده خواهند شد.', + defaultNodeName: 'این محرک', + defaultPluginName: 'این افزونه فعال می‌شود', + defaultScheduleTime: 'پیکربندی نشده', + selectedTriggers: 'تریگرهای انتخاب‌شده', + stopButton: 'توقف', + }, }, settingsTab: 'تنظیمات', lastRunTab: 'آخرین اجرا', @@ -1054,11 +1240,52 @@ const translation = { noMatchingInputsFound: 'هیچ ورودی مطابقی از آخرین اجرا یافت نشد', copyLastRunError: 'نتوانستم ورودی‌های آخرین اجرای را کپی کنم', lastOutput: 'آخرین خروجی', + lastRunInputsCopied: '{{count}} ورودی(ها) از اجرای قبلی کپی شد', }, sidebar: { exportWarning: 'صادرات نسخه ذخیره شده فعلی', exportWarningDesc: 'این نسخه فعلی ذخیره شده از کار خود را صادر خواهد کرد. اگر تغییرات غیرذخیره شده‌ای در ویرایشگر دارید، لطفاً ابتدا از گزینه صادرات در بوم کار برای ذخیره آنها استفاده کنید.', }, + publishLimit: { + startNodeTitlePrefix: 'ارتقا به', + startNodeTitleSuffix: 'فعال‌سازی تعداد نامحدود تریگر در هر جریان کاری', + startNodeDesc: 'شما به حد مجاز ۲ ماشه در هر گردش کار برای این طرح رسیده‌اید. برای انتشار این گردش کار ارتقا دهید.', + }, + error: { + startNodeRequired: 'لطفاً ابتدا یک گره شروع اضافه کنید قبل از {{operation}}', + operations: { + connectingNodes: 'اتصال گره‌ها', + addingNodes: 'افزودن گره‌ها', + modifyingWorkflow: 'تغییر جریان کاری', + updatingWorkflow: 'به‌روزرسانی جریان کاری', + }, + }, + customWebhook: 'وبهوک سفارشی', + difyTeam: 'تیم دیفی', + triggerStatus: { + enabled: 'محرک', + disabled: 'فعال‌سازی • غیرفعال', + }, + entryNodeStatus: { + enabled: 'شروع', + disabled: 'شروع • غیر فعال', + }, + onboarding: { + title: 'یک گره شروع را برای آغاز انتخاب کنید', + description: 'گره‌های شروع مختلف، قابلیت‌های متفاوتی دارند. نگران نباشید، همیشه می‌توانید بعداً آن‌ها را تغییر دهید.', + userInputFull: 'ورودی کاربر (گره شروع اصلی)', + userInputDescription: 'گره شروع که امکان تنظیم متغیرهای ورودی کاربر را دارد، با برنامه وب، API سرویس، سرور MCP و جریان کاری به عنوان قابلیت‌های ابزار.', + trigger: 'محرک', + triggerDescription: 'تریگرها می‌توانند به عنوان گره شروع یک گردش کار عمل کنند، مانند کارهای زمان‌بندی‌شده، وبهوک‌های سفارشی، یا یکپارچه‌سازی با برنامه‌های دیگر.', + back: 'بازگشت', + learnMore: 'بیشتر بدانید', + aboutStartNode: 'درباره گره شروع.', + escTip: { + press: 'چاپ', + key: 'فرار', + toDismiss: 'اخراج کردن', + }, + }, } export default translation diff --git a/web/i18n/fr-FR/app-debug.ts b/web/i18n/fr-FR/app-debug.ts index b436d27386..26ebeca68d 100644 --- a/web/i18n/fr-FR/app-debug.ts +++ b/web/i18n/fr-FR/app-debug.ts @@ -329,6 +329,7 @@ const translation = { 'multi-files': 'Liste des fichiers', 'both': 'Les deux', 'maxNumberOfUploads': 'Nombre maximal de téléchargements', + 'maxNumberTip': 'Document < {{docLimit}}, image < {{imgLimit}}, audio < {{audioLimit}}, vidéo < {{videoLimit}}', 'localUpload': 'Téléchargement local', 'single-file': 'En file indienne', 'optional': 'optionnel', @@ -540,10 +541,7 @@ const translation = { generate: 'Générer', tryIt: 'Essaie', overwriteTitle: 'Remplacer la configuration existante ?', - noDataLine2: 'L’aperçu de l’orchestration s’affichera ici.', overwriteMessage: 'L’application de cette invite remplacera la configuration existante.', - noDataLine1: 'Décrivez votre cas d’utilisation sur la gauche,', - instructionPlaceHolder: 'Rédigez des instructions claires et précises.', title: 'Générateur d’invites', apply: 'Appliquer', resTitle: 'Invite générée', diff --git a/web/i18n/fr-FR/app-log.ts b/web/i18n/fr-FR/app-log.ts index 061dad2eed..5406ae211e 100644 --- a/web/i18n/fr-FR/app-log.ts +++ b/web/i18n/fr-FR/app-log.ts @@ -19,6 +19,7 @@ const translation = { tokens: 'JETONS', user: 'UTILISATEUR FINAL OU COMPTE', version: 'VERSION', + triggered_from: 'DÉCLENCHÉ PAR', }, pagination: { previous: 'Précédent', @@ -97,6 +98,15 @@ const translation = { finalProcessing: 'Traitement final', }, dateFormat: 'JJ/MM/YYYY', + triggerBy: { + debugging: 'Débogage', + appRun: 'Application Web', + webhook: 'Webhook', + schedule: 'Programme', + plugin: 'Plugin', + ragPipelineRun: 'Pipeline RAG', + ragPipelineDebugging: 'Débogage RAG', + }, } export default translation diff --git a/web/i18n/fr-FR/app-overview.ts b/web/i18n/fr-FR/app-overview.ts index 6c873c42c2..c59d7c1cce 100644 --- a/web/i18n/fr-FR/app-overview.ts +++ b/web/i18n/fr-FR/app-overview.ts @@ -114,7 +114,11 @@ const translation = { }, }, launch: 'Lancer', - enableTooltip: {}, + enableTooltip: { + description: 'Pour activer cette fonctionnalité, veuillez ajouter un nœud d\'entrée utilisateur sur le canevas. (Peut déjà exister dans le brouillon, prend effet après publication)', + learnMore: 'En savoir plus', + }, + title: 'Application Web', }, apiInfo: { title: 'API de service Backend', @@ -126,7 +130,14 @@ const translation = { running: 'En service', disable: 'Désactiver', }, - triggerInfo: {}, + triggerInfo: { + title: 'Déclencheurs', + explanation: 'Gestion des déclencheurs de flux de travail', + triggersAdded: 'Déclencheurs ajoutés', + noTriggerAdded: 'Aucun déclencheur ajouté', + triggerStatusDescription: 'L\'état du nœud de déclenchement apparaît ici. (Peut déjà exister dans le brouillon, prend effet après publication)', + learnAboutTriggers: 'En savoir plus sur les déclencheurs', + }, disableTooltip: { triggerMode: 'La fonctionnalité {{feature}} n\'est pas prise en charge en mode Nœud Déclencheur.', }, diff --git a/web/i18n/fr-FR/billing.ts b/web/i18n/fr-FR/billing.ts index 953bbd7674..141596b367 100644 --- a/web/i18n/fr-FR/billing.ts +++ b/web/i18n/fr-FR/billing.ts @@ -98,6 +98,8 @@ const translation = { triggerEvents: { unlimited: 'Événements Déclencheurs Illimités', tooltip: 'Le nombre d\'événements qui déclenchent automatiquement des flux de travail via des déclencheurs Plugin, Planification ou Webhook.', + sandbox: '{{count,number}} Déclencher des événements', + professional: '{{count,number}} Déclenchements par mois', }, workflowExecution: { priority: 'Exécution du flux de travail prioritaire', @@ -107,6 +109,11 @@ const translation = { }, startNodes: { unlimited: 'Déclencheurs/workflows illimités', + limited: 'Jusqu\'à {{count}} déclencheurs/workflow', + }, + title: { + plans: 'plans', + description: 'Sélectionnez le plan qui correspond le mieux aux besoins de votre équipe.', }, }, plans: { @@ -129,16 +136,14 @@ const translation = { name: 'Entreprise', description: 'Obtenez toutes les capacités et le support pour les systèmes à grande échelle et critiques pour la mission.', includesTitle: 'Tout ce qui est inclus dans le plan Équipe, plus :', - features: { - }, + features: ['Solutions de déploiement évolutives de niveau entreprise', 'Autorisation de licence commerciale', 'Fonctionnalités exclusives pour les entreprises', 'Espaces de travail multiples et gestion d\'entreprise', 'SSO', 'Accords sur les SLA négociés par les partenaires Dify', 'Sécurité et Contrôles Avancés', 'Mises à jour et maintenance par Dify Officiellement', 'Assistance technique professionnelle'], for: 'Pour les équipes de grande taille', btnText: 'Contacter les ventes', priceTip: 'Facturation Annuel Seulement', price: 'Personnalisé', }, community: { - features: { - }, + features: ['Toutes les fonctionnalités principales publiées dans le dépôt public', 'Espace de travail unique', 'Conforme à la licence open source Dify'], name: 'Communauté', btnText: 'Commencez avec la communauté', for: 'Pour les utilisateurs individuels, les petites équipes ou les projets non commerciaux', @@ -147,8 +152,7 @@ const translation = { description: 'Pour les utilisateurs individuels, les petites équipes ou les projets non commerciaux', }, premium: { - features: { - }, + features: ['Fiabilité autonome par divers fournisseurs de cloud', 'Espace de travail unique', 'Personnalisation du logo et de l\'identité visuelle de l\'application web', 'Assistance prioritaire par e-mail et chat'], for: 'Pour les organisations et les équipes de taille moyenne', includesTitle: 'Tout de la communauté, en plus :', name: 'Premium', @@ -184,6 +188,7 @@ const translation = { documentsUploadQuota: 'Quota de téléchargement de documents', perMonth: 'par mois', triggerEvents: 'Événements déclencheurs', + resetsIn: 'Réinitialisations dans {{count,number}} jours', }, teamMembers: 'Membres de l\'équipe', triggerLimitModal: { diff --git a/web/i18n/fr-FR/common.ts b/web/i18n/fr-FR/common.ts index 3c8c4f0b78..e33eb75b65 100644 --- a/web/i18n/fr-FR/common.ts +++ b/web/i18n/fr-FR/common.ts @@ -65,10 +65,17 @@ const translation = { confirmAction: 'Veuillez confirmer votre action.', deleteConfirmTitle: 'Supprimer ?', yes: 'Oui', + noSearchResults: 'Aucun {{content}} n\'a été trouvé', + resetKeywords: 'Réinitialiser les mots-clés', + selectCount: '{{count}} Sélectionné', + searchCount: 'Trouver {{count}} {{content}}', + noSearchCount: '0 {{content}}', + now: 'Maintenant', }, placeholder: { input: 'Veuillez entrer', select: 'Veuillez sélectionner', + search: 'Rechercher...', }, voice: { language: { @@ -203,7 +210,6 @@ const translation = { showAppLength: 'Afficher {{length}} applications', delete: 'Supprimer le compte', deleteTip: 'La suppression de votre compte effacera définitivement toutes vos données et elles ne pourront pas être récupérées.', - deleteConfirmTip: 'Pour confirmer, veuillez envoyer ce qui suit depuis votre adresse e-mail enregistrée à ', myAccount: 'Mon compte', account: 'Compte', studio: 'Dify Studio', @@ -770,6 +776,13 @@ const translation = { label: { optional: '(facultatif)', }, + noData: 'Aucune donnée', + dynamicSelect: { + error: 'Échec du chargement des options', + noData: 'Aucune option disponible', + loading: 'Chargement des options...', + selected: '{{count}} sélectionné', + }, } export default translation diff --git a/web/i18n/fr-FR/dataset-creation.ts b/web/i18n/fr-FR/dataset-creation.ts index e162e89ff0..4232f04652 100644 --- a/web/i18n/fr-FR/dataset-creation.ts +++ b/web/i18n/fr-FR/dataset-creation.ts @@ -1,8 +1,6 @@ const translation = { steps: { header: { - creation: 'Créer des Connaissances', - update: 'Ajouter des données', fallbackRoute: 'Connaissance', }, one: 'Choisissez la source de données', diff --git a/web/i18n/fr-FR/dataset-documents.ts b/web/i18n/fr-FR/dataset-documents.ts index 53f22093ef..cda6f1fc31 100644 --- a/web/i18n/fr-FR/dataset-documents.ts +++ b/web/i18n/fr-FR/dataset-documents.ts @@ -30,7 +30,6 @@ const translation = { sync: 'Synchroniser', pause: 'Pause', resume: 'Reprendre', - download: 'Télécharger le fichier', }, index: { enable: 'Activer', @@ -82,7 +81,10 @@ const translation = { }, addUrl: 'Ajouter une URL', learnMore: 'Pour en savoir plus', - sort: {}, + sort: { + uploadTime: 'Heure de téléchargement', + hitCount: 'Nombre de récupérations', + }, }, metadata: { title: 'Métadonnées', @@ -348,7 +350,6 @@ const translation = { keywords: 'Mots Clés', addKeyWord: 'Ajouter un mot-clé', keywordError: 'La longueur maximale du mot-clé est de 20', - characters: 'personnages', hitCount: 'Nombre de récupérations', vectorHash: 'Vector hash: ', questionPlaceholder: 'ajoutez la question ici', diff --git a/web/i18n/fr-FR/dataset-hit-testing.ts b/web/i18n/fr-FR/dataset-hit-testing.ts index 0bb7c94999..3565231d1e 100644 --- a/web/i18n/fr-FR/dataset-hit-testing.ts +++ b/web/i18n/fr-FR/dataset-hit-testing.ts @@ -2,7 +2,6 @@ const translation = { title: 'Test de Récupération', desc: 'Testez l\'effet d\'impact de la Connaissance basée sur le texte de la requête donnée.', dateTimeFormat: 'JJ/MM/AAAA hh:mm A', - recents: 'Récents', table: { header: { source: 'Source', diff --git a/web/i18n/fr-FR/dataset-pipeline.ts b/web/i18n/fr-FR/dataset-pipeline.ts index bb180a4776..c206fa7430 100644 --- a/web/i18n/fr-FR/dataset-pipeline.ts +++ b/web/i18n/fr-FR/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'Pipeline de connaissances publié', + tip: 'Allez dans Documents pour ajouter ou gérer des documents.', }, error: { message: 'Échec de la publication du pipeline de connaissances', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'Structure', structureTooltip: 'La structure par blocs détermine la façon dont les documents sont divisés et indexés (en proposant les modes Général, Parent-Enfant et Q&R) et est unique à chaque base de connaissances.', + createdBy: 'Par {{author}}', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { characters: 'caractères', title: 'Ajouter des documents', backToDataSource: 'Source des données', + selectOnlineDocumentTip: 'Traiter jusqu\'à {{count}} pages', + selectOnlineDriveTip: 'Traiter jusqu\'à {{count}} fichiers, maximum {{fileSize}} Mo chacun', }, documentSettings: { title: 'Paramètres du document', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} pages', + }, onlineDrive: { breadcrumbs: { searchPlaceholder: 'Rechercher des fichiers...', allBuckets: 'Tous les compartiments de stockage dans le cloud', allFiles: 'Tous les fichiers', + searchResult: 'Trouver {{searchResultsLength}} éléments dans le dossier « {{folderName}} »', }, notSupportedFileType: 'Ce type de fichier n’est pas pris en charge', emptySearchResult: 'Aucun objet n’a été trouvé', emptyFolder: 'Ce dossier est vide', resetKeywords: 'Réinitialiser les mots-clés', + notConnected: '{{name}} n\'est pas connecté', + notConnectedTip: 'Pour se synchroniser avec {{name}}, une connexion à {{name}} doit d\'abord être établie.', + }, + credentialSelector: { + name: '{{credentialName}} de {{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { title: 'Confirmation', @@ -149,6 +160,7 @@ const translation = { knowledgeNameAndIcon: 'Nom et icône de la connaissance', inputField: 'Champ de saisie', knowledgeDescriptionPlaceholder: 'Décrivez le contenu de cette base de connaissances. Une description détaillée permet à l’IA d’accéder plus précisément au contenu de l’ensemble de données. S’il est vide, Dify utilisera la stratégie d’accès par défaut. (Facultatif)', + configurationTip: 'Configurer {{pluginName}}', } export default translation diff --git a/web/i18n/fr-FR/dataset.ts b/web/i18n/fr-FR/dataset.ts index d233fe4dfc..54a029d401 100644 --- a/web/i18n/fr-FR/dataset.ts +++ b/web/i18n/fr-FR/dataset.ts @@ -234,6 +234,10 @@ const translation = { title: 'API de service', disabled: 'désactivé', }, + docAllEnabled_one: 'Document {{count}} activé', + docAllEnabled_other: 'Tous les documents {{count}} activés', + partialEnabled_one: 'Total de {{count}} documents, {{num}} disponibles', + partialEnabled_other: 'Total de {{count}} documents, {{num}} disponibles', } export default translation diff --git a/web/i18n/fr-FR/education.ts b/web/i18n/fr-FR/education.ts index 1c36788693..90aa69bc2c 100644 --- a/web/i18n/fr-FR/education.ts +++ b/web/i18n/fr-FR/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: 'Ne vous inquiétez pas — cela n\'affectera pas votre abonnement actuel, mais vous n\'obtiendrez pas la remise éducative lors de son renouvellement à moins que vous ne vérifiiez à nouveau votre statut.', + title: 'Votre statut éducatif expirera le {{date}}', }, stillInEducation: { title: 'Encore dans l\'éducation ?', diff --git a/web/i18n/fr-FR/pipeline.ts b/web/i18n/fr-FR/pipeline.ts index 9231211d02..6ee682ff8c 100644 --- a/web/i18n/fr-FR/pipeline.ts +++ b/web/i18n/fr-FR/pipeline.ts @@ -28,10 +28,12 @@ const translation = { loading: 'Traitement... Veuillez patienter', viewDetails: 'Voir les détails', error: 'Une erreur s’est produite lors de l’exécution', + footerTip: 'En mode de test, prévisualisez jusqu\'à {{count}} morceaux', }, }, ragToolSuggestions: { title: 'Suggestions pour RAG', + noRecommendationPlugins: 'Aucun plugin recommandé, trouvez-en plus dans le Marketplace', }, } diff --git a/web/i18n/fr-FR/plugin-trigger.ts b/web/i18n/fr-FR/plugin-trigger.ts new file mode 100644 index 0000000000..4b7929c61e --- /dev/null +++ b/web/i18n/fr-FR/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'Abonnements', + listNum: 'abonnements {{num}}', + empty: { + title: 'Aucun abonnement', + button: 'Nouvel abonnement', + }, + createButton: { + oauth: 'Nouvelle abonnement avec OAuth', + apiKey: 'Nouvel abonnement avec clé API', + manual: 'Collez l\'URL pour créer un nouvel abonnement', + }, + createSuccess: 'Abonnement créé avec succès', + createFailed: 'Échec de la création de l\'abonnement', + maxCount: 'Nombre maximal d\'abonnements {{num}}', + selectPlaceholder: 'Sélectionner un abonnement', + noSubscriptionSelected: 'Aucun abonnement sélectionné', + subscriptionRemoved: 'Abonnement supprimé', + list: { + title: 'Abonnements', + addButton: 'Ajouter', + tip: 'Recevoir des événements via abonnement', + item: { + enabled: 'Activé', + disabled: 'désactivé', + credentialType: { + api_key: 'Clé API', + oauth2: 'OAuth', + unauthorized: 'Manuel', + }, + actions: { + delete: 'Supprimer', + deleteConfirm: { + title: 'Supprimer {{name}} ?', + success: 'Abonnement {{name}} supprimé avec succès', + error: 'Échec de la suppression de l\'abonnement {{name}}', + content: 'Une fois supprimé, cet abonnement ne peut pas être récupéré. Veuillez confirmer.', + contentWithApps: 'L\'abonnement actuel est référencé par {{count}} applications. Le supprimer fera en sorte que les applications configurées ne reçoivent plus d\'événements d\'abonnement.', + confirm: 'Confirmer la suppression', + cancel: 'Annuler', + confirmInputWarning: 'Veuillez entrer le nom correct pour confirmer.', + confirmInputPlaceholder: 'Entrez "{{name}}" pour confirmer.', + confirmInputTip: 'Veuillez entrer « {{name}} » pour confirmer.', + }, + }, + status: { + active: 'actif', + inactive: 'Inactif', + }, + usedByNum: 'Utilisé par {{num}} flux de travail', + noUsed: 'Aucun flux de travail utilisé', + }, + }, + addType: { + title: 'Ajouter un abonnement', + description: 'Choisissez comment vous souhaitez créer votre abonnement de déclenchement', + options: { + apikey: { + title: 'Créer avec la clé API', + description: 'Créer automatiquement un abonnement en utilisant les identifiants API', + }, + oauth: { + title: 'Créer avec OAuth', + description: 'Autoriser la plateforme tierce à créer un abonnement', + clientSettings: 'Paramètres du client OAuth', + clientTitle: 'Client OAuth', + default: 'Par défaut', + custom: 'Personnalisé', + }, + manual: { + title: 'Configuration manuelle', + description: 'Collez l\'URL pour créer un nouvel abonnement', + tip: 'Configurer l\'URL sur une plateforme tierce manuellement', + }, + }, + }, + }, + modal: { + steps: { + verify: 'Vérifier', + configuration: 'Configuration', + }, + common: { + cancel: 'Annuler', + back: 'Retour', + next: 'Suivant', + create: 'Créer', + verify: 'Vérifier', + authorize: 'Autoriser', + creating: 'Création...', + verifying: 'Vérification...', + authorizing: 'Autorisation en cours...', + }, + oauthRedirectInfo: 'Comme aucun secret client système n\'a été trouvé pour ce fournisseur d\'outil, une configuration manuelle est requise ; pour redirect_uri, veuillez utiliser', + apiKey: { + title: 'Créer avec la clé API', + verify: { + title: 'Vérifier les identifiants', + description: 'Veuillez fournir vos identifiants API pour vérifier l\'accès', + error: 'Échec de la vérification des identifiants. Veuillez vérifier votre clé API.', + success: 'Identifiants vérifiés avec succès', + }, + configuration: { + title: 'Configurer l\'abonnement', + description: 'Configurez les paramètres de votre abonnement', + }, + }, + oauth: { + title: 'Créer avec OAuth', + authorization: { + title: 'Autorisation OAuth', + description: 'Autorisez Dify à accéder à votre compte', + redirectUrl: 'URL de redirection', + redirectUrlHelp: 'Utilisez cette URL dans la configuration de votre application OAuth', + authorizeButton: 'Autoriser avec {{provider}}', + waitingAuth: 'En attente d\'autorisation...', + authSuccess: 'Autorisation réussie', + authFailed: 'Échec de l’obtention des informations d’autorisation OAuth', + waitingJump: 'Autorisé, en attente du saut', + }, + configuration: { + title: 'Configurer l\'abonnement', + description: 'Configurez les paramètres de votre abonnement après l\'autorisation', + success: 'Configuration OAuth réussie', + failed: 'Échec de la configuration OAuth', + }, + remove: { + success: 'Suppression d\'OAuth réussie', + failed: 'Échec de la suppression d\'OAuth', + }, + save: { + success: 'Configuration OAuth enregistrée avec succès', + }, + }, + manual: { + title: 'Configuration manuelle', + description: 'Configurez votre abonnement webhook manuellement', + logs: { + title: 'Journaux des requêtes', + request: 'Demande', + loading: 'En attente de la demande de {{pluginName}}...', + }, + }, + form: { + subscriptionName: { + label: 'Nom de l\'abonnement', + placeholder: 'Entrez le nom de l\'abonnement', + required: 'Le nom de l\'abonnement est requis', + }, + callbackUrl: { + label: 'URL de rappel', + description: 'Cette URL recevra des événements webhook', + tooltip: 'Fournissez un point de terminaison accessible publiquement qui peut recevoir des requêtes de rappel du fournisseur de déclenchement.', + placeholder: 'Génération...', + privateAddressWarning: 'Cette URL semble être une adresse interne, ce qui peut provoquer l\'échec des requêtes webhook. Vous pouvez changer TRIGGER_URL pour une adresse publique.', + }, + }, + errors: { + createFailed: 'Échec de la création de l\'abonnement', + verifyFailed: 'Échec de la vérification des identifiants', + authFailed: 'Autorisation échouée', + networkError: 'Erreur réseau, veuillez réessayer', + }, + }, + events: { + title: 'Événements disponibles', + description: 'Événements auxquels ce plugin de déclenchement peut s\'abonner', + empty: 'Aucun événement disponible', + event: 'Événement', + events: 'Événements', + actionNum: '{{num}} {{event}} INCLUS', + item: { + parameters: 'paramètres {{count}}', + noParameters: 'Aucun paramètre', + }, + output: 'Sortie', + }, + node: { + status: { + warning: 'Se déconnecter', + }, + }, +} + +export default translation diff --git a/web/i18n/fr-FR/plugin.ts b/web/i18n/fr-FR/plugin.ts index ee13d1d6a3..e1e7ae14ef 100644 --- a/web/i18n/fr-FR/plugin.ts +++ b/web/i18n/fr-FR/plugin.ts @@ -7,6 +7,7 @@ const translation = { bundles: 'Paquets', all: 'Tout', datasources: 'Sources des données', + triggers: 'Déclencheurs', }, categorySingle: { extension: 'Extension', @@ -15,6 +16,7 @@ const translation = { agent: 'Stratégie d’agent', bundle: 'Paquet', datasource: 'Source des données', + trigger: 'Déclencheur', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { install: 'Installer', remove: 'Enlever', detail: 'Détails', + back: 'Retour', }, toolSelector: { uninstalledLink: 'Gérer dans les plugins', @@ -339,6 +342,12 @@ const translation = { 'Seuls les {{num}} plugins suivants se mettront à jour automatiquement', nextUpdateTime: 'Prochaine mise à jour automatique : {{time}}', }, + readmeInfo: { + title: 'Lisez-moi', + needHelpCheckReadme: 'Besoin d\'aide ? Consultez le README.', + noReadmeAvailable: 'Aucun README disponible', + failedToFetch: 'Échec de la récupération du README', + }, } export default translation diff --git a/web/i18n/fr-FR/workflow.ts b/web/i18n/fr-FR/workflow.ts index c6405e0851..aaa0332b6d 100644 --- a/web/i18n/fr-FR/workflow.ts +++ b/web/i18n/fr-FR/workflow.ts @@ -113,6 +113,15 @@ const translation = { currentView: 'Vue actuelle', currentWorkflow: 'Flux de travail actuel', moreActions: 'Plus d’actions', + listening: 'Écouter', + chooseStartNodeToRun: 'Choisissez le nœud de départ pour lancer', + runAllTriggers: 'Exécuter tous les déclencheurs', + features: 'Fonctionnalités', + featuresDescription: 'Améliorer l\'expérience utilisateur de l\'application web', + featuresDocLink: 'En savoir plus', + needAdd: 'Le nœud {{node}} doit être ajouté', + needStartNode: 'Au moins un nœud de départ doit être ajouté', + workflowAsToolDisabledHint: 'Publiez le dernier flux de travail et assurez-vous qu\'un nœud d\'entrée utilisateur est connecté avant de le configurer comme outil.', }, env: { envPanelTitle: 'Variables d\'Environnement', @@ -219,6 +228,7 @@ const translation = { rerankModelRequired: 'Avant d’activer le modèle de reclassement, veuillez confirmer que le modèle a été correctement configuré dans les paramètres.', noValidTool: '{{field}} aucun outil valide sélectionné', toolParameterRequired: '{{field}} : le paramètre [{{param}}] est obligatoire', + startNodeRequired: 'Veuillez d\'abord ajouter un nœud de départ avant {{operation}}', }, singleRun: { testRun: 'Exécution de test', @@ -250,6 +260,21 @@ const translation = { 'allAdded': 'Tout ajouté', 'sources': 'Sources', 'searchDataSource': 'Source de données de recherche', + 'start': 'Démarrer', + 'searchTrigger': 'Déclencheurs de recherche...', + 'allTriggers': 'Tous les déclencheurs', + 'noPluginsFound': 'Aucun plugin n\'a été trouvé', + 'requestToCommunity': 'Demandes à la communauté', + 'featuredTools': 'En vedette', + 'showMoreFeatured': 'Afficher plus', + 'showLessFeatured': 'Afficher moins', + 'installed': 'Installé', + 'pluginByAuthor': 'Par {{author}}', + 'usePlugin': 'Sélectionner l\'outil', + 'hideActions': 'Cacher les outils', + 'noFeaturedPlugins': 'Découvrez plus d\'outils dans le Marketplace', + 'noFeaturedTriggers': 'Découvrez plus de déclencheurs dans le Marketplace', + 'startDisabledTip': 'Le nœud de déclenchement et le nœud d\'entrée utilisateur sont mutuellement exclusifs.', }, blocks: { 'start': 'Début', @@ -276,6 +301,10 @@ const translation = { 'loop-start': 'Début de boucle', 'knowledge-index': 'Base de connaissances', 'datasource': 'Source des données', + 'originalStartNode': 'nœud de départ original', + 'trigger-schedule': 'Déclencheur de programmation', + 'trigger-webhook': 'Déclencheur Webhook', + 'trigger-plugin': 'Déclencheur de plugin', }, blocksAbout: { 'start': 'Définir les paramètres initiaux pour lancer un flux de travail', @@ -300,6 +329,9 @@ const translation = { 'loop-end': 'Équivalent à "break". Ce nœud n\'a pas d\'éléments de configuration. Lorsque le corps de la boucle atteint ce nœud, la boucle se termine.', 'datasource': 'Source de données À propos', 'knowledge-index': 'Base de connaissances À propos', + 'trigger-schedule': 'Déclencheur de flux de travail basé sur le temps qui démarre les flux de travail selon un calendrier', + 'trigger-webhook': 'Le déclencheur Webhook reçoit des pushs HTTP provenant de systèmes tiers pour déclencher automatiquement des flux de travail.', + 'trigger-plugin': 'Déclencheur d’intégration tierce qui démarre des flux de travail à partir d’événements d’une plateforme externe', }, operator: { zoomIn: 'Zoomer', @@ -340,6 +372,8 @@ const translation = { minimize: 'Sortir du mode plein écran', scrollToSelectedNode: 'Faites défiler jusqu’au nœud sélectionné', optional_and_hidden: '(optionnel et caché)', + goTo: 'Aller à', + startNode: 'Nœud de départ', }, nodes: { common: { @@ -787,6 +821,8 @@ const translation = { answerNodeWarningDesc: 'Avertissement en mode parallèle : les nœuds de réponse, les affectations de variables de conversation et les opérations de lecture/écriture persistantes au sein des itérations peuvent provoquer des exceptions.', parallelModeEnableTitle: 'Mode parallèle activé', parallelMode: 'Mode parallèle', + flattenOutput: 'Aplatir la sortie', + flattenOutputDesc: 'Lorsqu\'il est activé, si toutes les sorties d\'itération sont des tableaux, elles seront aplaties en un seul tableau. Lorsqu\'il est désactivé, les sorties conserveront une structure de tableau imbriqué.', }, note: { addNote: 'Ajouter note', @@ -963,6 +999,144 @@ const translation = { rerankingModelIsInvalid: 'Le modèle de rerank est invalide', embeddingModelIsInvalid: 'Le modèle d\'intégration est invalide', }, + triggerPlugin: { + authorized: 'autorisé', + notConfigured: 'Non configuré', + notAuthorized: 'Non autorisé', + selectSubscription: 'Sélectionner un abonnement', + availableSubscriptions: 'Abonnements disponibles', + addSubscription: 'Ajouter un nouvel abonnement', + removeSubscription: 'Supprimer l\'abonnement', + subscriptionRemoved: 'Abonnement supprimé avec succès', + error: 'Erreur', + configuration: 'Configuration', + remove: 'Supprimer', + or: 'OU', + useOAuth: 'Utiliser OAuth', + useApiKey: 'Utiliser la clé API', + authenticationFailed: 'Échec de l\'authentification', + authenticationSuccess: 'Authentification réussie', + oauthConfigFailed: 'Échec de la configuration OAuth', + configureOAuthClient: 'Configurer le client OAuth', + oauthClientDescription: 'Configurez les identifiants du client OAuth pour activer l\'authentification', + oauthClientSaved: 'Configuration du client OAuth enregistrée avec succès', + configureApiKey: 'Configurer la clé API', + apiKeyDescription: 'Configurer les identifiants de clé API pour l\'authentification', + apiKeyConfigured: 'Clé API configurée avec succès', + configurationFailed: 'Échec de la configuration', + failedToStart: 'Échec du démarrage du processus d\'authentification', + credentialsVerified: 'Identifiants vérifiés avec succès', + credentialVerificationFailed: 'Échec de la vérification des identifiants', + verifyAndContinue: 'Vérifier et continuer', + configureParameters: 'Configurer les paramètres', + parametersDescription: 'Configurer les paramètres et les propriétés du déclencheur', + configurationComplete: 'Configuration terminée', + configurationCompleteDescription: 'Votre déclencheur a été configuré avec succès', + configurationCompleteMessage: 'La configuration de votre déclencheur est maintenant complète et prête à l\'emploi.', + parameters: 'Paramètres', + properties: 'Propriétés', + propertiesDescription: 'Propriétés de configuration supplémentaires pour ce déclencheur', + noConfigurationRequired: 'Aucune configuration supplémentaire n\'est requise pour ce déclencheur.', + subscriptionName: 'Nom de l\'abonnement', + subscriptionNameDescription: 'Entrez un nom unique pour cet abonnement de déclencheur', + subscriptionNamePlaceholder: 'Entrez le nom de l\'abonnement...', + subscriptionNameRequired: 'Le nom de l\'abonnement est requis', + subscriptionRequired: 'L\'abonnement est requis', + }, + triggerSchedule: { + title: 'Programme', + nodeTitle: 'Déclencheur de programmation', + notConfigured: 'Non configuré', + useCronExpression: 'Utiliser une expression cron', + useVisualPicker: 'Utiliser le sélecteur visuel', + frequency: { + label: 'FRÉQUENCE', + hourly: 'Horaire', + daily: 'Quotidien', + weekly: 'Hebdomadaire', + monthly: 'mensuel', + }, + selectFrequency: 'Sélectionner la fréquence', + frequencyLabel: 'Fréquence', + nextExecution: 'Prochaine exécution', + weekdays: 'Jours de la semaine', + time: 'Temps', + cronExpression: 'Expression Cron', + nextExecutionTime: 'PROCHAINE HEURE D\'EXÉCUTION', + nextExecutionTimes: 'Prochaines 5 exécutions', + startTime: 'Heure de début', + executeNow: 'Exécution maintenant', + selectDateTime: 'Sélectionner la date et l\'heure', + hours: 'Heures', + minutes: 'Minutes', + onMinute: 'Une minute', + days: 'Jours', + lastDay: 'Dernier jour', + lastDayTooltip: 'Tous les mois n\'ont pas 31 jours. Utilisez l\'option « dernier jour » pour sélectionner le dernier jour de chaque mois.', + mode: 'Mode', + timezone: 'Fuseau horaire', + visualConfig: 'Configuration visuelle', + monthlyDay: 'Jour mensuel', + executionTime: 'Temps d\'exécution', + invalidTimezone: 'Fuseau horaire invalide', + invalidCronExpression: 'Expression cron invalide', + noValidExecutionTime: 'Aucun temps d\'exécution valide ne peut être calculé', + executionTimeCalculationError: 'Échec du calcul des temps d\'exécution', + invalidFrequency: 'Fréquence invalide', + invalidStartTime: 'Heure de début invalide', + startTimeMustBeFuture: 'L\'heure de début doit être dans le futur', + invalidTimeFormat: 'Format d\'heure invalide (attendu HH:MM AM/PM)', + invalidWeekday: 'Jour de la semaine invalide : {{weekday}}', + invalidMonthlyDay: 'Le jour du mois doit être compris entre 1 et 31 ou "dernier"', + invalidOnMinute: 'Une minute doit être comprise entre 0 et 59', + invalidExecutionTime: 'Heure d\'exécution invalide', + executionTimeMustBeFuture: 'Le délai d\'exécution doit être dans le futur', + }, + triggerWebhook: { + title: 'Déclencheur Webhook', + nodeTitle: '🔗 Déclencheur Webhook', + configPlaceholder: 'La configuration du déclencheur webhook sera implémentée ici', + webhookUrl: 'URL du webhook', + webhookUrlPlaceholder: 'Cliquez sur générer pour créer l\'URL du webhook', + generate: 'Générer', + copy: 'Copier', + test: 'Test', + urlGenerated: 'URL du webhook générée avec succès', + urlGenerationFailed: 'Échec de la génération de l’URL du webhook', + urlCopied: 'URL copiée dans le presse-papiers', + method: 'Méthode', + contentType: 'Type de contenu', + queryParameters: 'Paramètres de requête', + headerParameters: 'Paramètres d\'en-tête', + requestBodyParameters: 'Paramètres du corps de la requête', + parameterName: 'Nom de variable', + varName: 'Nom de variable', + varType: 'Type', + varNamePlaceholder: 'Entrez le nom de la variable...', + required: 'Requis', + addParameter: 'Ajouter', + addHeader: 'Ajouter', + noParameters: 'Aucun paramètre configuré', + noQueryParameters: 'Aucun paramètre de requête configuré', + noHeaders: 'Aucun en-tête configuré', + noBodyParameters: 'Aucun paramètre de corps configuré', + debugUrlTitle: 'Pour les tests, utilisez toujours cette URL', + debugUrlCopy: 'Cliquez pour copier', + debugUrlCopied: 'Copié !', + debugUrlPrivateAddressWarning: 'Cette URL semble être une adresse interne, ce qui peut provoquer l\'échec des requêtes webhook. Vous pouvez changer TRIGGER_URL pour une adresse publique.', + errorHandling: 'Gestion des erreurs', + errorStrategy: 'Gestion des erreurs', + responseConfiguration: 'Réponse', + asyncMode: 'Mode asynchrone', + statusCode: 'Code d\'état', + responseBody: 'Corps de la réponse', + responseBodyPlaceholder: 'Écrivez ici le corps de votre réponse', + headers: 'En-têtes', + validation: { + webhookUrlRequired: 'L\'URL du webhook est requise', + invalidParameterType: 'Type de paramètre invalide "{{type}}" pour le paramètre "{{name}}"', + }, + }, }, tracing: { stopBy: 'Arrêté par {{user}}', @@ -1037,6 +1211,18 @@ const translation = { exportToolTip: 'Exporter la variable en tant que fichier', largeData: 'Données volumineuses, aperçu en lecture seule. Exporter pour tout afficher.', largeDataNoExport: 'Données volumineuses - aperçu partiel uniquement', + listening: { + title: 'En attente d\'événements provenant des déclencheurs...', + tip: 'Vous pouvez maintenant simuler des déclencheurs d\'événements en envoyant des requêtes de test au point de terminaison HTTP {{nodeName}} ou l\'utiliser comme URL de rappel pour le débogage en direct des événements. Toutes les sorties peuvent être consultées directement dans l\'Inspecteur de Variables.', + tipPlugin: 'Vous pouvez maintenant créer des événements dans {{- pluginName}} et récupérer les résultats de ces événements dans l\'Inspecteur de Variables.', + tipSchedule: 'Écoute des événements des déclencheurs de planification.\nProchaine exécution planifiée : {{nextTriggerTime}}', + tipFallback: 'Attendez les événements de déclenchement entrants. Les sorties apparaîtront ici.', + defaultNodeName: 'ce déclencheur', + defaultPluginName: 'ce plugin déclenche', + defaultScheduleTime: 'Non configuré', + selectedTriggers: 'déclencheurs sélectionnés', + stopButton: 'Arrête', + }, }, settingsTab: 'Paramètres', lastRunTab: 'Dernière Exécution', @@ -1054,11 +1240,52 @@ const translation = { noMatchingInputsFound: 'Aucune entrée correspondante trouvée dans la dernière exécution.', copyLastRunError: 'Échec de la copie des entrées de la dernière exécution', lastOutput: 'Dernière sortie', + lastRunInputsCopied: '{{count}} entrée(s) copiée(s) de la dernière exécution', }, sidebar: { exportWarning: 'Exporter la version enregistrée actuelle', exportWarningDesc: 'Cela exportera la version actuelle enregistrée de votre flux de travail. Si vous avez des modifications non enregistrées dans l\'éditeur, veuillez d\'abord les enregistrer en utilisant l\'option d\'exportation dans le canevas du flux de travail.', }, + publishLimit: { + startNodeTitlePrefix: 'Mettre à niveau vers', + startNodeTitleSuffix: 'débloquez des déclencheurs illimités par flux de travail', + startNodeDesc: 'Vous avez atteint la limite de 2 déclencheurs par flux de travail pour ce plan. Passez à une version supérieure pour publier ce flux de travail.', + }, + error: { + startNodeRequired: 'Veuillez d\'abord ajouter un nœud de départ avant {{operation}}', + operations: { + connectingNodes: 'connecter des nœuds', + addingNodes: 'ajout de nœuds', + modifyingWorkflow: 'modification du flux de travail', + updatingWorkflow: 'mise à jour du flux de travail', + }, + }, + customWebhook: 'Webhook personnalisé', + difyTeam: 'Équipe Dify', + triggerStatus: { + enabled: 'DÉCLENCHEUR', + disabled: 'DÉCLENCHEUR • DÉSACTIVÉ', + }, + entryNodeStatus: { + enabled: 'DÉMARRER', + disabled: 'DÉMARRER • DÉSACTIVÉ', + }, + onboarding: { + title: 'Sélectionnez un nœud de départ pour commencer', + description: 'Différents nœuds de départ ont différentes capacités. Ne vous inquiétez pas, vous pouvez toujours les changer plus tard.', + userInputFull: 'Entrée utilisateur (nœud de départ original)', + userInputDescription: 'Nœud de démarrage qui permet de définir des variables de saisie utilisateur, avec comme capacités d\'outil l\'application web, l\'API de service, le serveur MCP et le workflow.', + trigger: 'Déclencheur', + triggerDescription: 'Les déclencheurs peuvent servir de nœud de départ d\'un flux de travail, comme les tâches planifiées, les webhooks personnalisés ou les intégrations avec d\'autres applications.', + back: 'Retour', + learnMore: 'En savoir plus', + aboutStartNode: 'à propos du nœud de départ.', + escTip: { + press: 'Appuyer', + key: 'Échap', + toDismiss: 'rejeter', + }, + }, } export default translation diff --git a/web/i18n/hi-IN/app-debug.ts b/web/i18n/hi-IN/app-debug.ts index 03b966db99..e498b40f99 100644 --- a/web/i18n/hi-IN/app-debug.ts +++ b/web/i18n/hi-IN/app-debug.ts @@ -372,6 +372,7 @@ const translation = { 'unitPlaceholder': 'संख्याओं के बाद इकाइयों को प्रदर्शित करें, जैसे कि टोकन', 'placeholderPlaceholder': 'जब फ़ील्ड खाली हो तो दिखाने के लिए पाठ दर्ज करें', 'defaultValuePlaceholder': 'फ़ील्ड को पूर्व-जनित करने के लिए डिफ़ॉल्ट मान दर्ज करें', + 'maxNumberTip': 'दस्तावेज़ < {{docLimit}}, छवि < {{imgLimit}}, ऑडियो < {{audioLimit}}, वीडियो < {{videoLimit}}', }, vision: { name: 'विजन', diff --git a/web/i18n/hi-IN/app-log.ts b/web/i18n/hi-IN/app-log.ts index f5241b23f1..15bd50850d 100644 --- a/web/i18n/hi-IN/app-log.ts +++ b/web/i18n/hi-IN/app-log.ts @@ -19,6 +19,7 @@ const translation = { tokens: 'टोकन', user: 'अंतिम उपयोगकर्ता या खाता', version: 'संस्करण', + triggered_from: 'के द्वारा ट्रिगर', }, pagination: { previous: 'पिछला', @@ -99,6 +100,15 @@ const translation = { iteration: 'चलना', }, dateFormat: 'MM/DD/YYYY', + triggerBy: { + debugging: 'डिबगिंग', + appRun: 'वेबएप', + webhook: 'वेबहूक', + schedule: 'अनुसूची', + plugin: 'प्लगइन', + ragPipelineRun: 'RAG पाइपलाइन', + ragPipelineDebugging: 'RAG डीबगिंग', + }, } export default translation diff --git a/web/i18n/hi-IN/app-overview.ts b/web/i18n/hi-IN/app-overview.ts index 17d383f2bc..0224ed89ee 100644 --- a/web/i18n/hi-IN/app-overview.ts +++ b/web/i18n/hi-IN/app-overview.ts @@ -125,7 +125,11 @@ const translation = { }, }, launch: 'लॉन्च', - enableTooltip: {}, + enableTooltip: { + description: 'इस सुविधा को सक्षम करने के लिए कृपया कैनवास में एक उपयोगकर्ता इनपुट नोड जोड़ें। (शायद यह ड्राफ्ट में पहले से मौजूद हो, प्रकाशित करने के बाद प्रभावी होगा)', + learnMore: 'और जानें', + }, + title: 'वेब एप', }, apiInfo: { title: 'बैकएंड सेवा एपीआई', @@ -137,7 +141,14 @@ const translation = { running: 'सेवा में', disable: 'अक्षम करें', }, - triggerInfo: {}, + triggerInfo: { + title: 'ट्रिगर्स', + explanation: 'वर्कफ़्लो ट्रिगर प्रबंधन', + triggersAdded: '{{count}} ट्रिगर्स जोड़े गए', + noTriggerAdded: 'कोई ट्रिगर जोड़ा नहीं गया', + triggerStatusDescription: 'ट्रिगर नोड की स्थिति यहाँ दिखाई देगी। (शायद पहले से ड्राफ्ट में मौजूद है, प्रकाशित करने के बाद प्रभावी होगी)', + learnAboutTriggers: 'ट्रिगर्स के बारे में जानें', + }, disableTooltip: { triggerMode: 'ट्रिगर नोड मोड में {{feature}} फ़ीचर समर्थित नहीं है।', }, diff --git a/web/i18n/hi-IN/billing.ts b/web/i18n/hi-IN/billing.ts index 760c80cbbb..f517c1a11c 100644 --- a/web/i18n/hi-IN/billing.ts +++ b/web/i18n/hi-IN/billing.ts @@ -106,6 +106,8 @@ const translation = { triggerEvents: { unlimited: 'असीमित ट्रिगर इवेंट्स', tooltip: 'घटनाओं की संख्या जो प्लगइन, शेड्यूल या वेबहुक ट्रिगर के माध्यम से स्वतः वर्कफ़्लो शुरू करती हैं।', + sandbox: '{{count,number}} ट्रिगर इवेंट्स', + professional: '{{count,number}} ट्रिगर इवेंट/महीना', }, workflowExecution: { standard: 'मानक कार्यप्रवाह निष्पादन', @@ -115,6 +117,11 @@ const translation = { }, startNodes: { unlimited: 'असीमित ट्रिगर्स/कार्यप्रवाह', + limited: '{{count}} ट्रिगर्स/वर्कफ़्लो तक', + }, + title: { + plans: 'योजनाएँ', + description: 'उस योजना का चयन करें जो आपकी टीम की जरूरतों के लिए सबसे उपयुक्त हो।', }, }, plans: { @@ -140,16 +147,14 @@ const translation = { description: 'बड़े पैमाने पर मिशन-क्रिटिकल सिस्टम के लिए पूर्ण क्षमताएं और समर्थन प्राप्त करें।', includesTitle: 'टीम योजना में सब कुछ, साथ में:', - features: { - }, + features: ['एंटरप्राइज-ग्रेड स्केलेबल डिप्लॉयमेंट समाधान', 'व्यावसायिक लाइसेंस प्राधिकरण', 'विशेष एंटरप्राइज सुविधाएँ', 'कई कार्यक्षेत्र और एंटरप्राइज प्रबंधन', 'एसएसओ', 'डिफ़ी पार्टनर्स द्वारा बातचीत किए गए SLA', 'उन्नत सुरक्षा और नियंत्रण', 'Dify द्वारा आधिकारिक रूप से अपडेट और रखरखाव', 'पेशेवर तकनीकी समर्थन'], price: 'कस्टम', btnText: 'बिक्री से संपर्क करें', priceTip: 'वार्षिक बिलिंग केवल', for: 'बड़े आकार की टीमों के लिए', }, community: { - features: { - }, + features: ['सभी मुख्य फीचर्स सार्वजनिक रिपॉज़िटरी के तहत जारी किए गए', 'एकल कार्यक्षेत्र', 'Dify ओपन सोर्स लाइसेंस का पालन करता है'], description: 'व्यक्तिगत उपयोगकर्ताओं, छोटे टीमों, या गैर-व्यावसायिक परियोजनाओं के लिए', for: 'व्यक्तिगत उपयोगकर्ताओं, छोटे टीमों, या गैर-व्यावसायिक परियोजनाओं के लिए', includesTitle: 'निःशुल्क सुविधाएँ:', @@ -158,8 +163,7 @@ const translation = { price: 'मुक्त', }, premium: { - features: { - }, + features: ['विभिन्न क्लाउड प्रदाताओं द्वारा स्व-प्रबंधित विश्वसनीयता', 'एकल कार्यक्षेत्र', 'वेबऐप लोगो और ब्रांडिंग अनुकूलन', 'प्राथमिकता ईमेल और चैट सहायता'], priceTip: 'क्लाउड मार्केटप्लेस के आधार पर', name: 'प्रीमियम', btnText: 'प्रीमियम प्राप्त करें', @@ -195,6 +199,7 @@ const translation = { vectorSpaceTooltip: 'उच्च गुणवत्ता वाले अनुक्रमण मोड के साथ दस्तावेज़ों के लिए ज्ञान डेटा स्टोरेज संसाधनों का उपभोग होगा। जब ज्ञान डेटा स्टोरेज सीमा तक पहुँच जाएगा, तो नए दस्तावेज़ नहीं अपलोड किए जाएंगे।', perMonth: 'प्रति माह', triggerEvents: 'उत्तेजक घटनाएँ', + resetsIn: '{{count,number}} दिनों में रीसेट होता है', }, teamMembers: 'टीम के सदस्य', triggerLimitModal: { diff --git a/web/i18n/hi-IN/common.ts b/web/i18n/hi-IN/common.ts index e775946cb7..c0b401272f 100644 --- a/web/i18n/hi-IN/common.ts +++ b/web/i18n/hi-IN/common.ts @@ -65,6 +65,12 @@ const translation = { yes: 'हाँ', deleteConfirmTitle: 'हटाएं?', confirmAction: 'कृपया अपनी क्रिया की पुष्टि करें।', + noSearchResults: 'कोई {{content}} नहीं मिला', + resetKeywords: 'कीवर्ड रीसेट करें', + selectCount: '{{count}} चयनित', + searchCount: '{{count}} {{content}} खोजें', + noSearchCount: '0 {{content}}', + now: 'अब', }, errorMsg: { fieldRequired: '{{field}} आवश्यक है', @@ -73,6 +79,7 @@ const translation = { placeholder: { input: 'कृपया दर्ज करें', select: 'कृपया चयन करें', + search: 'खोजें...', }, voice: { language: { @@ -791,6 +798,13 @@ const translation = { label: { optional: '(अनिवार्य नहीं)', }, + noData: 'कोई डेटा नहीं', + dynamicSelect: { + error: 'विकल्प लोड करने में विफल', + noData: 'कोई विकल्प उपलब्ध नहीं है', + loading: 'विकल्प लोड हो रहे हैं...', + selected: '{{count}} चयनित', + }, } export default translation diff --git a/web/i18n/hi-IN/dataset-documents.ts b/web/i18n/hi-IN/dataset-documents.ts index 3ffe78d6e1..0fb9384a8e 100644 --- a/web/i18n/hi-IN/dataset-documents.ts +++ b/web/i18n/hi-IN/dataset-documents.ts @@ -82,7 +82,10 @@ const translation = { ok: 'ठीक है', }, learnMore: 'और जानो', - sort: {}, + sort: { + uploadTime: 'अपलोड समय', + hitCount: 'पुनः प्राप्ति गणना', + }, }, metadata: { title: 'मेटाडेटा', diff --git a/web/i18n/hi-IN/dataset-pipeline.ts b/web/i18n/hi-IN/dataset-pipeline.ts index c9836cea04..f7f7bc42bf 100644 --- a/web/i18n/hi-IN/dataset-pipeline.ts +++ b/web/i18n/hi-IN/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'ज्ञान पाइपलाइन प्रकाशित', + tip: 'दस्तावेज़ जोड़ने या प्रबंधित करने के लिए दस्तावेज़ पर जाएँ।', }, error: { message: 'ज्ञान पाइपलाइन प्रकाशित करने में विफल रहा', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'संरचना', structureTooltip: 'चंक संरचना यह निर्धारित करती है कि दस्तावेज कैसे विभाजित और अनुक्रमित होते हैं—सामान्य, माता-पिता- बच्चे, और प्रश्नोत्तर मोड प्रदान करते हुए—और यह प्रत्येक ज्ञान आधार के लिए अद्वितीय होती है।', + createdBy: '{{author}} द्वारा', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { backToDataSource: 'डेटा स्रोत', characters: 'पात्र', title: 'दस्तावेज़ जोड़ें', + selectOnlineDocumentTip: '{{count}} पृष्ठों तक प्रक्रिया करें', + selectOnlineDriveTip: '{{count}} फ़ाइलों तक संसाधित करें, प्रत्येक अधिकतम {{fileSize}} MB', }, documentSettings: { title: 'डॉक्यूमेंट सेटिंग्स', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} पृष्ठ', + }, onlineDrive: { breadcrumbs: { allFiles: 'सभी फ़ाइलें', searchPlaceholder: 'फाइलें खोजें...', allBuckets: 'सभी क्लाउड स्टोरेज बकेट्स', + searchResult: '{{folderName}} फ़ोल्डर में {{searchResultsLength}} आइटम खोजें', }, resetKeywords: 'कीवर्ड रीसेट करें', emptyFolder: 'यह फ़ोल्डर खाली है', notSupportedFileType: 'यह फ़ाइल प्रकार समर्थित नहीं है', emptySearchResult: 'कोई सामान नहीं मिला', + notConnected: '{{name}} कनेक्ट नहीं है', + notConnectedTip: '{{name}} के साथ सिंक करने के लिए, पहले {{name}} से कनेक्शन स्थापित करना आवश्यक है।', + }, + credentialSelector: { + name: '{{credentialName}} का {{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { title: 'पुष्टि', @@ -149,6 +160,7 @@ const translation = { inputField: 'इनपुट फ़ील्ड', editPipelineInfo: 'पाइपलाइन जानकारी संपादित करें', knowledgeDescriptionPlaceholder: 'इस ज्ञान आधार में क्या है इसका वर्णन करें। एक विस्तृत विवरण एआई को डेटा सेट की सामग्री को अधिक सटीकता से एक्सेस करने की अनुमति देता है। यदि खाली है, तो डिफी डिफ़ॉल्ट हिट रणनीति का उपयोग करेगा। (वैकल्पिक)', + configurationTip: '{{pluginName}} कॉन्फ़िगर करें', } export default translation diff --git a/web/i18n/hi-IN/dataset.ts b/web/i18n/hi-IN/dataset.ts index 037894fd81..3705113438 100644 --- a/web/i18n/hi-IN/dataset.ts +++ b/web/i18n/hi-IN/dataset.ts @@ -239,6 +239,10 @@ const translation = { disabled: 'अक्षम', title: 'सेवा एपीआई', }, + docAllEnabled_one: '{{count}} दस्तावेज़ सक्षम किया गया', + docAllEnabled_other: 'सभी {{count}} दस्तावेज़ सक्षम हैं', + partialEnabled_one: 'कुल {{count}} दस्तावेज़, {{num}} उपलब्ध', + partialEnabled_other: 'कुल {{count}} दस्तावेज़, {{num}} उपलब्ध', } export default translation diff --git a/web/i18n/hi-IN/education.ts b/web/i18n/hi-IN/education.ts index f8e0b5735c..c3b674123e 100644 --- a/web/i18n/hi-IN/education.ts +++ b/web/i18n/hi-IN/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: 'चिंता मत करो — यह आपके वर्तमान सदस्यता पर प्रभाव नहीं डालेगा, लेकिन जब यह नवीनीकरण होगा तो आपको शिक्षा छूट नहीं मिलेगी जब तक कि आप अपनी स्थिति को फिर से सत्यापित नहीं करते।', + title: 'आपकी शिक्षा स्थिति {{date}} को समाप्त हो जाएगी', }, stillInEducation: { title: 'क्या आप अभी भी शिक्षा में हैं?', diff --git a/web/i18n/hi-IN/pipeline.ts b/web/i18n/hi-IN/pipeline.ts index b8fbafd0c6..e7d01ec744 100644 --- a/web/i18n/hi-IN/pipeline.ts +++ b/web/i18n/hi-IN/pipeline.ts @@ -28,10 +28,12 @@ const translation = { viewDetails: 'विवरण देखें', error: 'कार्यवाही के दौरान त्रुटि हुई', loading: 'प्रसंस्करण हो रहा है... कृपया प्रतीक्षा करें', + footerTip: 'परीक्षण रन मोड में, {{count}} खंड तक पूर्वावलोकन करें', }, }, ragToolSuggestions: { title: 'आरएजी के लिए सुझाव', + noRecommendationPlugins: 'कोई सुझाए गए प्लगइन्स नहीं, और अधिक खोजें मार्केटप्लेस में', }, } diff --git a/web/i18n/hi-IN/plugin-trigger.ts b/web/i18n/hi-IN/plugin-trigger.ts new file mode 100644 index 0000000000..eb8353047d --- /dev/null +++ b/web/i18n/hi-IN/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'सदस्यताएँ', + listNum: '{{num}} सब्सक्रिप्शन्स', + empty: { + title: 'कोई सदस्यता नहीं', + button: 'नई सब्सक्रिप्शन', + }, + createButton: { + oauth: 'OAuth के साथ नई सदस्यता', + apiKey: 'एपीआई कुंजी के साथ नया सब्सक्रिप्शन', + manual: 'नई सदस्यता बनाने के लिए URL चिपकाएँ', + }, + createSuccess: 'सब्सक्रिप्शन सफलतापूर्वक बनाया गया', + createFailed: 'सब्सक्रिप्शन बनाने में असफल', + maxCount: 'अधिकतम {{num}} सदस्यताएँ', + selectPlaceholder: 'सदस्यता चुनें', + noSubscriptionSelected: 'कोई सदस्यता नहीं चुनी गई', + subscriptionRemoved: 'सदस्यता हटा दी गई', + list: { + title: 'सदस्यताएँ', + addButton: 'जोड़ें', + tip: 'सब्सक्रिप्शन के माध्यम से इवेंट प्राप्त करें', + item: { + enabled: 'सक्रिय', + disabled: 'विकलांग', + credentialType: { + api_key: 'एपीआई कुंजी', + oauth2: 'OAuth', + unauthorized: 'मैनुअल', + }, + actions: { + delete: 'हटाएँ', + deleteConfirm: { + title: 'क्या आप {{name}} को हटा देना चाहते हैं?', + success: 'सदस्यता {{name}} सफलतापूर्वक हटाई गई', + error: 'सदस्यता {{name}} हटाने में असफल', + content: 'एक बार हटा दी जाने के बाद, इस सदस्यता को पुनर्प्राप्त नहीं किया जा सकता। कृपया पुष्टि करें।', + contentWithApps: 'वर्तमान सदस्यता का संदर्भ {{count}} अनुप्रयोगों द्वारा लिया गया है। इसे हटाने से कॉन्फ़िगर किए गए अनुप्रयोग सदस्यता घटनाओं को प्राप्त करना बंद कर देंगे।', + confirm: 'हटाना पुष्टि करें', + cancel: 'रद्द करें', + confirmInputWarning: 'कृपया पुष्टि करने के लिए सही नाम दर्ज करें।', + confirmInputPlaceholder: 'पुष्टि करने के लिए "{{name}}" दर्ज करें।', + confirmInputTip: 'कृपया पुष्टि करने के लिए “{{name}}” दर्ज करें।', + }, + }, + status: { + active: 'सक्रिय', + inactive: 'निष्क्रिय', + }, + usedByNum: '{{num}} वर्कफ़्लो द्वारा उपयोग किया गया', + noUsed: 'कोई वर्कफ़्लो उपयोग नहीं किया गया', + }, + }, + addType: { + title: 'सदस्यता जोड़ें', + description: 'निर्धारित करने के लिए चुनें कि आप अपनी ट्रिगर सदस्यता कैसे बनाना चाहते हैं', + options: { + apikey: { + title: 'एपीआई कुंजी के साथ बनाएं', + description: 'API क्रेडेंशियल का उपयोग करके स्वचालित रूप से सब्सक्रिप्शन बनाएं', + }, + oauth: { + title: 'OAuth के साथ बनाएं', + description: 'सदस्यता बनाने के लिए तृतीय-पक्ष प्लेटफ़ॉर्म के साथ प्राधिकृत करें', + clientSettings: 'OAuth क्लाइंट सेटिंग्स', + clientTitle: 'OAuth क्लाइंट', + default: 'डिफ़ॉल्ट', + custom: 'कस्टम', + }, + manual: { + title: 'मैनुअल सेटअप', + description: 'नई सदस्यता बनाने के लिए URL चिपकाएँ', + tip: 'थर्ड-पार्टी प्लेटफ़ॉर्म पर URL मैन्युअली कॉन्फ़िगर करें', + }, + }, + }, + }, + modal: { + steps: { + verify: 'सत्यापित करें', + configuration: 'कॉन्फ़िगरेशन', + }, + common: { + cancel: 'रद्द करें', + back: 'वापस', + next: 'अगला', + create: 'बनाएँ', + verify: 'सत्यापित करें', + authorize: 'अधिकार देना', + creating: 'बना रहा हूँ...', + verifying: 'सत्यापित किया जा रहा है...', + authorizing: 'अधिकृत किया जा रहा है...', + }, + oauthRedirectInfo: 'चूंकि इस टूल प्रदाता के लिए कोई सिस्टम क्लाइंट सीक्रेट्स नहीं मिले, इसलिए इसे मैनुअली सेटअप करने की आवश्यकता है, redirect_uri के लिए कृपया उपयोग करें', + apiKey: { + title: 'एपीआई कुंजी के साथ बनाएं', + verify: { + title: 'क्रेडेंशियल्स सत्यापित करें', + description: 'कृपया पहुँच सत्यापित करने के लिए अपने API क्रेडेंशियल्स प्रदान करें', + error: 'सत्यापन विफल हुआ। कृपया अपनी API कुंजी जांचें।', + success: 'प्रमाण-पत्र सफलतापूर्वक सत्यापित किए गए', + }, + configuration: { + title: 'सदस्यता कॉन्फ़िगर करें', + description: 'अपनी सदस्यता सेटिंग्स सेट करें', + }, + }, + oauth: { + title: 'OAuth के साथ बनाएं', + authorization: { + title: 'OAuth प्राधिकरण', + description: 'अपने खाते तक पहुँचने के लिए Dify को अधिकृत करें', + redirectUrl: 'पुनःमार्गित करें URL', + redirectUrlHelp: 'अपने OAuth ऐप कॉन्फ़िगरेशन में इस URL का उपयोग करें', + authorizeButton: '{{provider}} के साथ प्राधिकृत करें', + waitingAuth: 'अनुमति की प्रतीक्षा कर रहे हैं...', + authSuccess: 'प्राधिकरण सफल', + authFailed: 'OAuth प्राधिकरण जानकारी प्राप्त करने में विफल', + waitingJump: 'अधिकृत, कूदने की प्रतीक्षा कर रहा है', + }, + configuration: { + title: 'सदस्यता कॉन्फ़िगर करें', + description: 'अधिकार के बाद अपनी सदस्यता पैरामीटर सेट करें', + success: 'OAuth कॉन्फ़िगरेशन सफल', + failed: 'OAuth कॉन्फ़िगरेशन विफल हुआ', + }, + remove: { + success: 'OAuth सफलतापूर्वक हटा दिया गया', + failed: 'OAuth हटाने में विफल', + }, + save: { + success: 'OAuth कॉन्फ़िगरेशन सफलतापूर्वक सहेजा गया', + }, + }, + manual: { + title: 'मैनुअल सेटअप', + description: 'अपने वेबहुक सब्सक्रिप्शन को मैन्युअली कॉन्फ़िगर करें', + logs: { + title: 'अनुरोध लॉग', + request: 'अनुरोध', + loading: '{{pluginName}} से अनुरोध की प्रतीक्षा कर रहे हैं...', + }, + }, + form: { + subscriptionName: { + label: 'सदस्यता का नाम', + placeholder: 'सब्सक्रिप्शन नाम दर्ज करें', + required: 'सदस्यता का नाम आवश्यक है', + }, + callbackUrl: { + label: 'कॉलबैक URL', + description: 'यह URL वेबहुक इवेंट प्राप्त करेगा', + tooltip: 'एक सार्वजनिक रूप से सुलभ एन्डपॉइंट प्रदान करें जो ट्रिगर प्रदाता से कॉलबैक अनुरोध प्राप्त कर सके।', + placeholder: 'उत्पादन हो रहा है...', + privateAddressWarning: 'यह URL आंतरिक पता प्रतीत होता है, जिससे वेबहुक अनुरोध विफल हो सकते हैं। आप TRIGGER_URL को एक सार्वजनिक पते में बदल सकते हैं।', + }, + }, + errors: { + createFailed: 'सब्सक्रिप्शन बनाने में असफल', + verifyFailed: 'प्रमाणीकरण सत्यापित करने में विफल', + authFailed: 'प्राधिकरण असफल', + networkError: 'नेटवर्क त्रुटि, कृपया फिर से प्रयास करें', + }, + }, + events: { + title: 'उपलब्ध कार्यक्रम', + description: 'इवेंट्स जिन्हें यह ट्रिगर प्लगइन सब्सक्राइब कर सकता है', + empty: 'कोई घटना उपलब्ध नहीं है', + event: 'घटना', + events: 'कार्यक्रम', + actionNum: '{{num}} {{event}} शामिल', + item: { + parameters: '{{count}} पैरामीटर', + noParameters: 'कोई पैरामीटर नहीं', + }, + output: 'आउटपुट', + }, + node: { + status: { + warning: 'विच्छेद करें', + }, + }, +} + +export default translation diff --git a/web/i18n/hi-IN/plugin.ts b/web/i18n/hi-IN/plugin.ts index a2a2afc339..c8a5618e1f 100644 --- a/web/i18n/hi-IN/plugin.ts +++ b/web/i18n/hi-IN/plugin.ts @@ -7,6 +7,7 @@ const translation = { tools: 'उपकरण', agents: 'एजेंट रणनीतियाँ', datasources: 'डेटा स्रोत', + triggers: 'ट्रिगर्स', }, categorySingle: { extension: 'विस्तार', @@ -15,6 +16,7 @@ const translation = { agent: 'एजेंट रणनीति', model: 'मॉडल', datasource: 'डेटा स्रोत', + trigger: 'ट्रिगर', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { install: 'स्थापित करें', detail: 'विवरण', update: 'अपडेट', + back: 'वापस', }, toolSelector: { uninstalledTitle: 'उपकरण स्थापित नहीं है', @@ -336,6 +339,12 @@ const translation = { excludeUpdate: 'निम्नलिखित {{num}} प्लगइन्स स्वचालित रूप से अपडेट नहीं होंगे', }, + readmeInfo: { + title: 'पढ़ें मुझे', + needHelpCheckReadme: 'मदद चाहिए? README देखें।', + noReadmeAvailable: 'कोई README उपलब्ध नहीं है', + failedToFetch: 'README लाने में असफल', + }, } export default translation diff --git a/web/i18n/hi-IN/workflow.ts b/web/i18n/hi-IN/workflow.ts index f739f64cf0..4da7207936 100644 --- a/web/i18n/hi-IN/workflow.ts +++ b/web/i18n/hi-IN/workflow.ts @@ -116,6 +116,15 @@ const translation = { currentView: 'वर्तमान दृश्य', currentWorkflow: 'वर्तमान कार्यप्रवाह', moreActions: 'अधिक क्रियाएँ', + listening: 'सुनना', + chooseStartNodeToRun: 'चलाने के लिए प्रारंभ नोड चुनें', + runAllTriggers: 'सभी ट्रिगर्स चलाएँ', + features: 'विशेषताएँ', + featuresDescription: 'वेब ऐप उपयोगकर्ता अनुभव को बढ़ाएं', + featuresDocLink: 'और जानें', + needAdd: '{{node}} नोड को जोड़ा जाना चाहिए', + needStartNode: 'कम से कम एक प्रारंभ नोड जोड़ा जाना चाहिए', + workflowAsToolDisabledHint: 'सबसे नया वर्कफ़्लो प्रकाशित करें और इसे टूल के रूप में कॉन्फ़िगर करने से पहले एक कनेक्टेड यूज़र इनपुट नोड सुनिश्चित करें।', }, env: { envPanelTitle: 'पर्यावरण चर', @@ -222,6 +231,7 @@ const translation = { rerankModelRequired: 'Rerank मॉडल चालू करने से पहले, कृपया पुष्टि करें कि मॉडल को सेटिंग्स में सफलतापूर्वक कॉन्फ़िगर किया गया है।', toolParameterRequired: '{{field}}: पैरामीटर [{{param}}] आवश्यक है', noValidTool: '{{field}} कोई मान्य उपकरण चयनित नहीं किया गया', + startNodeRequired: 'कृपया {{operation}} से पहले पहले एक स्टार्ट नोड जोड़ें', }, singleRun: { testRun: 'परीक्षण रन', @@ -253,6 +263,21 @@ const translation = { 'allAdded': 'सभी जोड़े गए', 'sources': 'स्रोत', 'searchDataSource': 'डेटा स्रोत की खोज करें', + 'start': 'शुरू करें', + 'searchTrigger': 'खोज ट्रिगर्स...', + 'allTriggers': 'सभी ट्रिगर्स', + 'noPluginsFound': 'कोई प्लगइन नहीं मिला', + 'requestToCommunity': 'समुदाय से अनुरोध', + 'featuredTools': 'विशेष रूप से प्रदर्शित', + 'showMoreFeatured': 'और दिखाएं', + 'showLessFeatured': 'कम दिखाएं', + 'installed': 'स्थापित', + 'pluginByAuthor': '{{author}} द्वारा', + 'usePlugin': 'उपकरण चुनें', + 'hideActions': 'उपकरण छुपाएँ', + 'noFeaturedPlugins': 'मार्केटप्लेस में और उपकरणों की खोज करें', + 'noFeaturedTriggers': 'मार्केटप्लेस में और ट्रिगर खोजें', + 'startDisabledTip': 'ट्रिगर नोड और उपयोगकर्ता इनपुट नोड परस्पर विशेष हैं।', }, blocks: { 'start': 'प्रारंभ', @@ -279,6 +304,10 @@ const translation = { 'loop-start': 'लूप प्रारंभ', 'knowledge-index': 'ज्ञान आधार', 'datasource': 'डेटा स्रोत', + 'originalStartNode': 'मूल प्रारंभ नोड', + 'trigger-schedule': 'अनुसूची ट्रिगर', + 'trigger-webhook': 'वेबहूक ट्रिगर', + 'trigger-plugin': 'प्लगइन ट्रिगर', }, blocksAbout: { 'start': 'वर्कफ़्लो लॉन्च करने के लिए प्रारंभिक पैरामीटर को परिभाषित करें', @@ -311,6 +340,9 @@ const translation = { 'loop-end': '"ब्रेक" के समान। इस नोड में कोई विन्यास आइटम नहीं हैं। जब लूप का शरीर इस नोड पर पहुँचता है, तो लूप समाप्त होता है।', 'knowledge-index': 'ज्ञान आधार के बारे में', 'datasource': 'डेटा स्रोत के बारे में', + 'trigger-schedule': 'समय-आधारित वर्कफ़्लो ट्रिगर जो वर्कफ़्लो को शेड्यूल पर शुरू करता है', + 'trigger-webhook': 'वेबहुक ट्रिगर थर्ड-पार्टी सिस्टम्स से HTTP पुश प्राप्त करता है ताकि वर्कफ़्लो को स्वचालित रूप से ट्रिगर किया जा सके।', + 'trigger-plugin': 'थर्ड-पार्टी इंटीग्रेशन ट्रिगर जो बाहरी प्लेटफ़ॉर्म घटनाओं से वर्कफ़्लो शुरू करता है', }, operator: { zoomIn: 'ज़ूम इन', @@ -352,6 +384,8 @@ const translation = { maximize: 'कैनवास का अधिकतम लाभ उठाएँ', scrollToSelectedNode: 'चुने गए नोड पर स्क्रॉल करें', optional_and_hidden: '(वैकल्पिक और छिपा हुआ)', + goTo: 'जाओ', + startNode: 'प्रारंभ नोड', }, nodes: { common: { @@ -807,6 +841,8 @@ const translation = { parallelPanelDesc: 'समानांतर मोड में, पुनरावृत्ति में कार्य समानांतर निष्पादन का समर्थन करते हैं।', MaxParallelismDesc: 'अधिकतम समांतरता का उपयोग एकल पुनरावृत्ति में एक साथ निष्पादित कार्यों की संख्या को नियंत्रित करने के लिए किया जाता है।', answerNodeWarningDesc: 'समानांतर मोड चेतावनी: उत्तर नोड्स, वार्तालाप चर असाइनमेंट, और पुनरावृत्तियों के भीतर लगातार पढ़ने/लिखने की कार्रवाई अपवाद पैदा कर सकती है।', + flattenOutput: 'आउटपुट को सपाट करें', + flattenOutputDesc: 'जब सक्षम किया जाता है, यदि सभी पुनरावृत्ति आउटपुट सरणियाँ हैं, तो उन्हें एक ही सरणी में समतल कर दिया जाएगा। जब अक्षम किया जाता है, तो आउटपुट घोंसले वाली सरणी संरचना बनाए रखेगा।', }, note: { addNote: 'नोट जोड़ें', @@ -983,6 +1019,144 @@ const translation = { rerankingModelIsInvalid: 'पुनः क्रमांकन मॉडल अमान्य है', embeddingModelIsInvalid: 'एम्बेडिंग मॉडल अमान्य है', }, + triggerPlugin: { + authorized: 'अधिकृत', + notConfigured: 'कॉन्फ़िगर नहीं किया गया', + notAuthorized: 'अधिकृत नहीं', + selectSubscription: 'सदस्यता चुनें', + availableSubscriptions: 'उपलब्ध सदस्यताएँ', + addSubscription: 'नई सदस्यता जोड़ें', + removeSubscription: 'सदस्यता हटाएँ', + subscriptionRemoved: 'सब्सक्रिप्शन सफलतापूर्वक हटा दिया गया', + error: 'त्रुटि', + configuration: 'कॉन्फ़िगरेशन', + remove: 'हटाएँ', + or: 'या', + useOAuth: 'OAuth का उपयोग करें', + useApiKey: 'API कुंजी का उपयोग करें', + authenticationFailed: 'प्रमाणीकरण विफल', + authenticationSuccess: 'प्रमाणीकरण सफल', + oauthConfigFailed: 'OAuth कॉन्फ़िगरेशन विफल हुआ', + configureOAuthClient: 'OAuth क्लाइंट कॉन्फ़िगर करें', + oauthClientDescription: 'प्रमाणीकरण सक्षम करने के लिए OAuth क्लाइंट क्रेडेंशियल्स कॉन्फ़िगर करें', + oauthClientSaved: 'OAuth क्लाइंट कॉन्फ़िगरेशन सफलतापूर्वक सहेजा गया', + configureApiKey: 'एपीआई कुंजी कॉन्फ़िगर करें', + apiKeyDescription: 'प्रमाणीकरण के लिए एपीआई कुंजी क्रेडेंशियल कॉन्फ़िगर करें', + apiKeyConfigured: 'एपीआई कुंजी सफलतापूर्वक कॉन्फ़िगर की गई', + configurationFailed: 'कॉन्फ़िगरेशन असफल हुआ', + failedToStart: 'प्रमाणीकरण प्रवाह शुरू करने में विफल', + credentialsVerified: 'प्रमाण-पत्र सफलतापूर्वक सत्यापित किए गए', + credentialVerificationFailed: 'प्रमाणीकरण विफल हुआ', + verifyAndContinue: 'सत्यापित करें और जारी रखें', + configureParameters: 'पैरामीटर कॉन्फ़िगर करें', + parametersDescription: 'ट्रिगर पैरामीटर और गुणों को कॉन्फ़िगर करें', + configurationComplete: 'कॉन्फ़िगरेशन पूरा', + configurationCompleteDescription: 'आपका ट्रिगर सफलतापूर्वक कॉन्फ़िगर किया गया है', + configurationCompleteMessage: 'आपका ट्रिगर कॉन्फ़िगरेशन अब पूरा हो गया है और उपयोग के लिए तैयार है।', + parameters: 'पैरामीटर', + properties: 'संपत्तियाँ', + propertiesDescription: 'इस ट्रिगर के लिए अतिरिक्त कॉन्फ़िगरेशन प्रॉपर्टीज़', + noConfigurationRequired: 'इस ट्रिगर के लिए किसी अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता नहीं है।', + subscriptionName: 'सदस्यता का नाम', + subscriptionNameDescription: 'इस ट्रिगर सब्सक्रिप्शन के लिए एक अद्वितीय नाम दर्ज करें', + subscriptionNamePlaceholder: 'सब्सक्रिप्शन नाम दर्ज करें...', + subscriptionNameRequired: 'सदस्यता का नाम आवश्यक है', + subscriptionRequired: 'सब्सक्रिप्शन आवश्यक है', + }, + triggerSchedule: { + title: 'अनुसूची', + nodeTitle: 'अनुसूची ट्रिगर', + notConfigured: 'कॉन्फ़िगर नहीं किया गया', + useCronExpression: 'क्रोन एक्सप्रेशन का उपयोग करें', + useVisualPicker: 'विज़ुअल पिकर का उपयोग करें', + frequency: { + label: 'आवृत्ति', + hourly: 'प्रति घंटा', + daily: 'दैनिक', + weekly: 'साप्ताहिक', + monthly: 'मासिक', + }, + selectFrequency: 'आवृत्ति चुनें', + frequencyLabel: 'आवृत्ति', + nextExecution: 'अगला निष्पादन', + weekdays: 'सप्ताह के दिन', + time: 'समय', + cronExpression: 'क्रॉन एक्सप्रेशन', + nextExecutionTime: 'अगली निष्पादन समय', + nextExecutionTimes: 'अगली 5 निष्पादन समय', + startTime: 'प्रारंभ समय', + executeNow: 'अब निष्पादन', + selectDateTime: 'तारीख़ और समय चुनें', + hours: 'घंटे', + minutes: 'मिनट', + onMinute: 'एक मिनट पर', + days: 'दिन', + lastDay: 'अंतिम दिन', + lastDayTooltip: 'सभी महीनों में 31 दिन नहीं होते। हर महीने का अंतिम दिन चुनने के लिए \'अंतिम दिन\' विकल्प का उपयोग करें।', + mode: 'मोड', + timezone: 'समय क्षेत्र', + visualConfig: 'दृश्य कॉन्फ़िगरेशन', + monthlyDay: 'मासिक दिवस', + executionTime: 'क्रियान्वयन समय', + invalidTimezone: 'अमान्य समय क्षेत्र', + invalidCronExpression: 'अमान्य क्रॉन अभिव्यक्ति', + noValidExecutionTime: 'कोई मान्य निष्पादन समय नहीं निकाला जा सकता', + executionTimeCalculationError: 'निष्पादन समय की गणना करने में असफल', + invalidFrequency: 'अमान्य आवृत्ति', + invalidStartTime: 'अमान्य प्रारंभ समय', + startTimeMustBeFuture: 'आरंभ समय भविष्य में होना चाहिए', + invalidTimeFormat: 'अमान्य समय प्रारूप (अपेक्षित HH:MM AM/PM)', + invalidWeekday: 'अमान्य सप्ताह का दिन: {{weekday}}', + invalidMonthlyDay: 'मासिक दिन 1-31 या "अंतिम" के बीच होना चाहिए', + invalidOnMinute: 'मिनट 0-59 के बीच होना चाहिए', + invalidExecutionTime: 'अमान्य निष्पादन समय', + executionTimeMustBeFuture: 'कार्यन्वयन समय भविष्य में होना चाहिए', + }, + triggerWebhook: { + title: 'वेबहूक ट्रिगर', + nodeTitle: '🔗 वेबहूक ट्रिगर', + configPlaceholder: 'Webhook ट्रिगर कॉन्फ़िगरेशन यहाँ लागू किया जाएगा', + webhookUrl: 'वेबहूक URL', + webhookUrlPlaceholder: 'वेबहुक URL बनाने के लिए जनरेट पर क्लिक करें', + generate: 'उत्पन्न करना', + copy: 'कॉपी', + test: 'परीक्षण', + urlGenerated: 'Webhook URL सफलतापूर्वक उत्पन्न किया गया', + urlGenerationFailed: 'वेबहुक URL बनाने में असफल', + urlCopied: 'URL क्लिपबोर्ड में कॉपी किया गया', + method: 'विधि', + contentType: 'सामग्री प्रकार', + queryParameters: 'क्वेरी पैरामीटर्स', + headerParameters: 'हेडर पैरामीटर्स', + requestBodyParameters: 'रिक्वेस्ट बॉडी पैरामीटर्स', + parameterName: 'चर का नाम', + varName: 'चर का नाम', + varType: 'टाइप', + varNamePlaceholder: 'चर नाम दर्ज करें...', + required: 'आवश्यक', + addParameter: 'जोड़ें', + addHeader: 'जोड़ें', + noParameters: 'कोई पैरामीटर कॉन्फ़िगर नहीं किया गया', + noQueryParameters: 'कोई क्वेरी पैरामीटर कॉन्फ़िगर नहीं किया गया', + noHeaders: 'कोई हेडर कॉन्फ़िगर नहीं किया गया', + noBodyParameters: 'कोई बॉडी पैरामीटर कॉन्फ़िगर नहीं किया गया', + debugUrlTitle: 'परीक्षण रन के लिए, हमेशा इस URL का उपयोग करें', + debugUrlCopy: 'कॉपी करने के लिए क्लिक करें', + debugUrlCopied: 'कॉपी किया गया!', + debugUrlPrivateAddressWarning: 'यह URL आंतरिक पता प्रतीत होता है, जिससे वेबहुक अनुरोध विफल हो सकते हैं। आप TRIGGER_URL को एक सार्वजनिक पते में बदल सकते हैं।', + errorHandling: 'त्रुटि प्रबंधन', + errorStrategy: 'त्रुटि प्रबंधन', + responseConfiguration: 'प्रतिक्रिया', + asyncMode: 'असिंक मोड', + statusCode: 'स्थिति कोड', + responseBody: 'प्रतिक्रिया बॉडी', + responseBodyPlaceholder: 'यहाँ अपना उत्तर正文 लिखें', + headers: 'हेडर', + validation: { + webhookUrlRequired: 'Webhook URL आवश्यक है', + invalidParameterType: 'पैरामीटर "{{name}}" के लिए अमान्य पैरामीटर प्रकार "{{type}}"', + }, + }, }, tracing: { stopBy: '{{user}} द्वारा रोका गया', @@ -1057,6 +1231,18 @@ const translation = { exportToolTip: 'फ़ाइल के रूप में निर्यात चर', largeDataNoExport: 'विशाल डेटा - केवल आंशिक पूर्वावलोकन', largeData: 'बड़ा डाटा, केवल पढ़ने के लिए पूर्वावलोकन। सभी देखने के लिए निर्यात करें।', + listening: { + title: 'ट्रिगर से घटनाओं को सुनना...', + tip: 'अब आप टेस्ट अनुरोध भेजकर HTTP {{nodeName}} एंडपॉइंट पर इवेंट ट्रिगर्स का सिमुलेशन कर सकते हैं या इसे लाइव इवेंट डिबगिंग के लिए कॉलबैक URL के रूप में उपयोग कर सकते हैं। सभी आउटपुट सीधे वेरिएबल इंस्पेक्टर में देखे जा सकते हैं।', + tipPlugin: 'अब आप {{- pluginName}} में ईवेंट बना सकते हैं, और वैरिएबल इंस्पेक्टर में इन ईवेंट्स के आउटपुट प्राप्त कर सकते हैं।', + tipSchedule: 'अनुसूची ट्रिगर्स से घटनाओं के लिए सुनना।\nअगली निर्धारित रन: {{nextTriggerTime}}', + tipFallback: 'आगामी ट्रिगर घटनाओं की प्रतीक्षा करें। आउटपुट्स यहाँ दिखाई देंगे।', + defaultNodeName: 'यह ट्रिगर', + defaultPluginName: 'यह प्लगइन ट्रिगर', + defaultScheduleTime: 'कॉन्फ़िगर नहीं किया गया', + selectedTriggers: 'चयनित ट्रिगर्स', + stopButton: 'रुकें', + }, }, settingsTab: 'सेटिंग्स', lastRunTab: 'अंतिम रन', @@ -1074,11 +1260,52 @@ const translation = { noMatchingInputsFound: 'अंतिम रन से कोई मेल खाने वाले इनपुट नहीं मिले', copyLastRunError: 'अंतिम रन इनपुट को कॉपी करने में विफल', lastOutput: 'अंतिम आउटपुट', + lastRunInputsCopied: '{{count}} इनपुट पिछली रन से कॉपी किए गए', }, sidebar: { exportWarning: 'वर्तमान सहेजी गई संस्करण निर्यात करें', exportWarningDesc: 'यह आपके कार्यप्रवाह का वर्तमान सहेजा हुआ संस्करण निर्यात करेगा। यदि आपके संपादक में कोई असहेजा किए गए परिवर्तन हैं, तो कृपया पहले उन्हें सहेजें, कार्यप्रवाह कैनवास में निर्यात विकल्प का उपयोग करके।', }, + publishLimit: { + startNodeTitlePrefix: 'अपग्रेड करें', + startNodeTitleSuffix: 'प्रत्येक वर्कफ़्लो के लिए असीमित ट्रिगर्स अनलॉक करें', + startNodeDesc: 'इस योजना के लिए आप प्रति वर्कफ़्लो 2 ट्रिगर्स की सीमा तक पहुँच चुके हैं। इस वर्कफ़्लो को प्रकाशित करने के लिए अपग्रेड करें।', + }, + error: { + startNodeRequired: 'कृपया {{operation}} से पहले एक प्रारंभ नोड जोड़ें', + operations: { + connectingNodes: 'नोड्स को जोड़ना', + addingNodes: 'नोड जोड़ना', + modifyingWorkflow: 'कार्यप्रवाह संशोधित करना', + updatingWorkflow: 'वर्कफ़्लो को अपडेट करना', + }, + }, + customWebhook: 'कस्टम वेबहुक', + difyTeam: 'डिफ़ी टीम', + triggerStatus: { + enabled: 'ट्रिगर', + disabled: 'ट्रिगर • अक्षम', + }, + entryNodeStatus: { + enabled: 'शुरू', + disabled: 'प्रारंभ • अक्षम', + }, + onboarding: { + title: 'शुरू करने के लिए एक प्रारंभिक नोड चुनें', + description: 'विभिन्न प्रारंभिक नोड्स की विभिन्न क्षमताएँ होती हैं। चिंता मत करो, आप उन्हें बाद में हमेशा बदल सकते हैं।', + userInputFull: 'उपयोगकर्ता इनपुट (मूल प्रारंभ नोड)', + userInputDescription: 'स्टार्ट नोड जो उपयोगकर्ता इनपुट वेरिएबल सेट करने की अनुमति देता है, जिसमें टूल क्षमताओं के रूप में वेब ऐप, सर्विस API, MCP सर्वर और वर्कफ़्लो शामिल हैं।', + trigger: 'ट्रिगर', + triggerDescription: 'ट्रिगर वर्कफ़्लो का प्रारंभिक नोड हो सकते हैं, जैसे कि निर्धारित कार्य, कस्टम वेबहुक, या अन्य ऐप्स के साथ एकीकरण।', + back: 'वापस', + learnMore: 'और जानें', + aboutStartNode: 'स्टार्ट नोड के बारे में।', + escTip: { + press: 'दबाएँ', + key: 'एस्केप', + toDismiss: 'अस्वीकार करना', + }, + }, } export default translation diff --git a/web/i18n/id-ID/app-annotation.ts b/web/i18n/id-ID/app-annotation.ts index bfc13c9d19..31e630c4fe 100644 --- a/web/i18n/id-ID/app-annotation.ts +++ b/web/i18n/id-ID/app-annotation.ts @@ -92,6 +92,7 @@ const translation = { title: 'Anotasi', name: 'Balas Anotasi', embeddingModelSwitchTip: 'Model vektorisasi teks anotasi, model switching akan disematkan kembali, menghasilkan biaya tambahan.', + editBy: 'Jawaban diedit oleh {{author}}', } export default translation diff --git a/web/i18n/id-ID/app-debug.ts b/web/i18n/id-ID/app-debug.ts index 3806b7adb3..02da61b319 100644 --- a/web/i18n/id-ID/app-debug.ts +++ b/web/i18n/id-ID/app-debug.ts @@ -113,6 +113,7 @@ const translation = { deleteContextVarTip: 'Variabel ini telah ditetapkan sebagai variabel kueri konteks, dan menghapusnya akan berdampak pada penggunaan normal Pengetahuan. Jika Anda masih perlu menghapusnya, silakan pilih kembali di bagian konteks.', ok: 'OKE', noVarTip: 'silakan buat variabel di bawah bagian Variabel', + deleteContextVarTitle: 'Hapus variabel “{{varName}}”?', }, notSupportSelectMulti: 'Saat ini hanya mendukung satu Pengetahuan', selectTitle: 'Pilih referensi Pengetahuan', @@ -140,6 +141,7 @@ const translation = { }, tips: 'Alat menyediakan metode panggilan API standar, mengambil input atau variabel pengguna sebagai parameter permintaan untuk mengkueri data eksternal sebagai konteks.', title: 'Perkakas', + toolsInUse: '{{count}} alat yang digunakan', }, conversationHistory: { editModal: { @@ -150,6 +152,7 @@ const translation = { description: 'Menetapkan nama awalan untuk peran percakapan', title: 'Riwayat Percakapan', learnMore: 'Pelajari lebih lanjut', + tip: 'Riwayat Percakapan tidak diaktifkan, silakan tambahkan di prompt di atas.', }, toolbox: { title: 'TOOLBOX', @@ -316,6 +319,8 @@ const translation = { waitForResponse: 'Harap tunggu hingga respons terhadap pesan sebelumnya selesai.', waitForBatchResponse: 'Harap tunggu hingga respons terhadap tugas batch selesai.', waitForFileUpload: 'Harap tunggu file/file diunggah', + nameOfKeyRequired: 'nama kunci: {{key}} diperlukan', + valueOfVarRequired: 'Nilai {{key}} tidak boleh kosong', }, warningMessage: { timeoutExceeded: 'Hasil tidak ditampilkan karena batas waktu. Silakan lihat log untuk mengumpulkan hasil lengkap.', @@ -328,7 +333,13 @@ const translation = { key: 'Kunci Variabel', name: 'Nama Bidang Input Pengguna', }, - varKeyError: {}, + varKeyError: { + canNoBeEmpty: '{{key}} wajib diisi', + tooLong: '{{key}} terlalu panjang. Tidak boleh lebih dari 30 karakter', + notValid: '{{key}} tidak valid. Hanya boleh berisi huruf, angka, dan garis bawah', + notStartWithNumber: '{{key}} tidak dapat diawali dengan angka', + keyAlreadyExists: '{{key}} sudah ada', + }, otherError: { queryNoBeEmpty: 'Kueri harus diatur dalam prompt', historyNoBeEmpty: 'Riwayat percakapan harus diatur dalam prompt', @@ -406,6 +417,9 @@ const translation = { 'startSelectedOption': 'Mulai opsi yang dipilih', 'unitPlaceholder': 'Tampilkan unit setelah angka, misalnya token', 'placeholderPlaceholder': 'Masukkan teks untuk ditampilkan saat bidang kosong', + 'description': 'Pengaturan untuk variabel {{varName}}', + 'notSet': 'Belum diatur, coba ketik {{input}} di prompt awalan', + 'maxNumberTip': 'Dokumen < {{docLimit}}, gambar < {{imgLimit}}, audio < {{audioLimit}}, video < {{videoLimit}}', }, vision: { visionSettings: { @@ -418,6 +432,7 @@ const translation = { uploadLimit: 'Batas Unggahan', resolution: 'Resolusi', url: 'URL', + resolutionTooltip: 'res rendah akan memungkinkan model menerima versi gambar resolusi rendah 512 x 512, dan merepresentasikan gambar dengan anggaran 65 token. Ini memungkinkan API memberikan respons lebih cepat dan menggunakan lebih sedikit token input untuk kasus penggunaan yang tidak memerlukan detail tinggi.\n\nres tinggi pertama-tama memungkinkan model melihat gambar resolusi rendah dan kemudian membuat potongan gambar yang lebih detail sebagai kotak 512px berdasarkan ukuran gambar input. Setiap potongan detail menggunakan dua kali anggaran token sehingga totalnya menjadi 129 token.', }, settings: 'Pengaturan', description: 'Aktifkan Penglihatan akan memungkinkan model untuk mengambil gambar dan menjawab pertanyaan tentangnya.', @@ -446,6 +461,10 @@ const translation = { title: 'Pembuka Percakapan', noDataPlaceHolder: 'Memulai percakapan dengan pengguna dapat membantu AI menjalin hubungan yang lebih dekat dengan mereka dalam aplikasi percakapan.', tooShort: 'Setidaknya 20 kata prompt awal diperlukan untuk menghasilkan pidato pembuka untuk percakapan.', + placeholder: 'Tulis pesan pembuka Anda di sini, Anda bisa menggunakan variabel, coba ketik {{variable}}.', + openingQuestionPlaceholder: 'Anda bisa menggunakan variabel, coba ketik {{variable}}.', + varTip: 'Anda dapat menggunakan variabel, coba ketik {{variable}}', + notIncludeKey: 'Prompt awal tidak menyertakan variabel: {{key}}. Harap tambahkan ke prompt awal.', }, modelConfig: { modeType: { @@ -538,6 +557,8 @@ const translation = { duplicateModel: 'Duplikat', result: 'Teks Keluaran', noResult: 'Output akan ditampilkan di sini.', + promptTip: 'Prompts membimbing respons AI dengan instruksi dan batasan. Masukkan variabel seperti {{input}}. Prompt ini tidak akan terlihat oleh pengguna.', + notSetVar: 'Variabel memungkinkan pengguna untuk memasukkan kata pemicu atau ucapan pembuka saat mengisi formulir. Anda dapat mencoba memasukkan "{{input}}" pada kata pemicu.', } export default translation diff --git a/web/i18n/id-ID/app-log.ts b/web/i18n/id-ID/app-log.ts index 9cfe4ab166..18545c8e0a 100644 --- a/web/i18n/id-ID/app-log.ts +++ b/web/i18n/id-ID/app-log.ts @@ -16,6 +16,7 @@ const translation = { input: 'Masukan', status: 'KEADAAN', runtime: 'WAKTU BERJALAN', + triggered_from: 'DIPICU OLEH', }, pagination: { previous: 'Sebelumnya', @@ -24,6 +25,7 @@ const translation = { empty: { element: { title: 'Apakah ada yang ada di sana?', + content: 'Amati dan anotasi interaksi antara pengguna akhir dan aplikasi AI di sini untuk terus meningkatkan akurasi AI. Anda dapat mencoba berbagi atau menguji Aplikasi Web sendiri, kemudian kembali ke halaman ini.', }, noChat: 'Belum ada percakapan', noOutput: 'Tidak ada keluaran', @@ -48,6 +50,7 @@ const translation = { second: 's', promptTemplateBeforeChat: 'Templat Prompt Sebelum Obrolan · Sebagai Pesan Sistem', uploadImages: 'Gambar yang Diunggah', + annotationTip: 'Peningkatan Ditandai oleh {{user}}', }, filter: { period: { @@ -66,6 +69,7 @@ const translation = { annotation: { all: 'Semua', not_annotated: 'Tidak Beranotasi', + annotated: 'Peningkatan yang Diberi Catatan ({{count}} item)', }, ascending: 'Naik', descending: 'Turun', @@ -94,6 +98,15 @@ const translation = { promptLog: 'Prompt Log', workflowSubtitle: 'Log mencatat pengoperasian Automate.', workflowTitle: 'Log Alur Kerja', + triggerBy: { + debugging: 'Men-debug', + appRun: 'Aplikasi Web', + webhook: 'Webhook', + schedule: 'Jadwal', + plugin: 'Plugin', + ragPipelineRun: 'Rangkaian RAG', + ragPipelineDebugging: 'Debugging RAG', + }, } export default translation diff --git a/web/i18n/id-ID/app-overview.ts b/web/i18n/id-ID/app-overview.ts index 0bd9b9e1c7..f1ddd74e97 100644 --- a/web/i18n/id-ID/app-overview.ts +++ b/web/i18n/id-ID/app-overview.ts @@ -9,6 +9,7 @@ const translation = { cloud: { trial: { description: 'Kuota uji coba disediakan untuk tujuan pengujian Anda. Sebelum kuota uji coba habis, harap siapkan penyedia model Anda sendiri atau beli kuota tambahan.', + title: 'Anda sedang menggunakan kuota percobaan {{providerName}}.', }, exhausted: { title: 'Kuota uji coba Anda telah habis, silakan atur APIKey Anda.', @@ -53,6 +54,7 @@ const translation = { privacyPolicyPlaceholder: 'Masukkan tautan kebijakan privasi', customDisclaimerTip: 'Teks penafian khusus akan ditampilkan di sisi klien, memberikan informasi tambahan tentang aplikasi', copyright: 'Hak cipta', + privacyPolicyTip: 'Membantu pengunjung memahami data yang dikumpulkan aplikasi, lihat Kebijakan Privasi Dify.', }, chatColorThemeInverted: 'Terbalik', invalidPrivacyPolicy: 'Tautan kebijakan privasi tidak valid. Silakan gunakan tautan valid yang dimulai dengan http atau https', @@ -111,7 +113,11 @@ const translation = { preUseReminder: 'Harap aktifkan aplikasi web sebelum melanjutkan.', regenerateNotice: 'Apakah Anda ingin membuat ulang URL publik?', explanation: 'Aplikasi web AI siap pakai', - enableTooltip: {}, + enableTooltip: { + description: 'Untuk mengaktifkan fitur ini, harap tambahkan node Input Pengguna ke kanvas. (Mungkin sudah ada di draft, berlaku setelah dipublikasikan)', + learnMore: 'Pelajari lebih lanjut', + }, + title: 'Aplikasi Web', }, apiInfo: { accessibleAddress: 'Titik Akhir API Layanan', @@ -124,7 +130,14 @@ const translation = { running: 'Berjalan', }, title: 'Ikhtisar', - triggerInfo: {}, + triggerInfo: { + title: 'Pemicu', + explanation: 'Manajemen pemicu alur kerja', + triggersAdded: '{{count}} Pemicu ditambahkan', + noTriggerAdded: 'Tidak ada pemicu yang ditambahkan', + triggerStatusDescription: 'Status node pemicu muncul di sini. (Mungkin sudah ada di draf, berlaku setelah dipublikasikan)', + learnAboutTriggers: 'Pelajari tentang Pemicu', + }, disableTooltip: { triggerMode: 'Fitur {{feature}} tidak didukung dalam mode Node Pemicu.', }, diff --git a/web/i18n/id-ID/app.ts b/web/i18n/id-ID/app.ts index 3babd9ee9d..9fcd807266 100644 --- a/web/i18n/id-ID/app.ts +++ b/web/i18n/id-ID/app.ts @@ -69,6 +69,8 @@ const translation = { useTemplate: 'Gunakan template ini', appCreateDSLErrorPart2: 'Apakah Anda ingin melanjutkan?', import: 'Mengimpor', + foundResult: 'Hasil {{count}}', + foundResults: 'Hasil {{count}}', }, newAppFromTemplate: { sidebar: { @@ -150,6 +152,9 @@ const translation = { databricksHost: 'URL Workspace Databricks', personalAccessToken: 'Token Akses Pribadi (lama)', password: 'Kata sandi', + placeholder: 'Masukkan {{key}} Anda', + viewDocsLink: 'Lihat dokumen {{key}}', + removeConfirmTitle: 'Hapus konfigurasi {{key}}?', }, expand: 'Memperluas', disabledTip: 'Silakan konfigurasi penyedia terlebih dahulu', @@ -218,6 +223,10 @@ const translation = { description: 'Menetapkan izin akses aplikasi web', title: 'Kontrol Akses Aplikasi Web', accessLabel: 'Siapa yang memiliki akses', + groups_one: 'GRUP {{count}}', + groups_other: '{{count}} KELOMPOK', + members_one: '{{count}} ANGGOTA', + members_other: '{{count}} ANGGOTA', }, publishApp: { notSetDesc: 'Saat ini tidak ada yang dapat mengakses aplikasi web. Silakan atur izin.', @@ -260,6 +269,7 @@ const translation = { noPluginsFound: 'Tidak ada plugin yang ditemukan', noKnowledgeBasesFound: 'Tidak ada basis pengetahuan yang ditemukan', tryDifferentTerm: 'Coba istilah penelusuran lain', + trySpecificSearch: 'Coba {{shortcuts}} untuk pencarian spesifik', }, groups: { apps: 'Apps', @@ -288,6 +298,9 @@ const translation = { startTyping: 'Mulai mengetik untuk mencari', selectToNavigate: 'Pilih untuk menavigasi', pressEscToClose: 'Tekan ESC untuk menutup', + resultCount: 'hasil {{count}}', + resultCount_other: 'hasil {{count}}', + inScope: 'di {{scope}}s', }, createApp: 'BUAT APLIKASI', accessControl: 'Kontrol Akses Aplikasi Web', diff --git a/web/i18n/id-ID/billing.ts b/web/i18n/id-ID/billing.ts index 4ca76cd136..ecc6046a58 100644 --- a/web/i18n/id-ID/billing.ts +++ b/web/i18n/id-ID/billing.ts @@ -8,6 +8,7 @@ const translation = { annotationQuota: 'Kuota Anotasi', perMonth: 'per bulan', triggerEvents: 'Pemicu Acara', + resetsIn: 'Diatur ulang dalam {{count,number}} hari', }, upgradeBtn: { encourage: 'Tingkatkan Sekarang', @@ -42,9 +43,12 @@ const translation = { }, messageRequest: { tooltip: 'Kredit pesan disediakan untuk membantu Anda mencoba berbagai model OpenAI dengan mudah di Dify. Kredit digunakan berdasarkan jenis model. Setelah habis, Anda dapat beralih ke kunci API OpenAI Anda sendiri.', + title: 'kredit pesan {{count,number}}', + titlePerMonth: '{{count,number}} kredit pesan/bulan', }, annotatedResponse: { tooltip: 'Pengeditan manual dan anotasi respons memberikan kemampuan menjawab pertanyaan berkualitas tinggi yang dapat disesuaikan untuk aplikasi. (Hanya berlaku di aplikasi Chat)', + title: 'Batas Kuota Anotasi {{count,number}}', }, mostPopular: 'Populer', free: 'Bebas', @@ -93,6 +97,8 @@ const translation = { triggerEvents: { unlimited: 'Peristiwa Pemicu Tak Terbatas', tooltip: 'Jumlah peristiwa yang secara otomatis memulai alur kerja melalui pemicu Plugin, Jadwal, atau Webhook.', + sandbox: '{{count,number}} Memicu Peristiwa', + professional: '{{count,number}} Pemicu Peristiwa/bulan', }, workflowExecution: { priority: 'Eksekusi Alur Kerja Prioritas', @@ -102,7 +108,21 @@ const translation = { }, startNodes: { unlimited: 'Pemicu/alur kerja tanpa batas', + limited: 'Hingga {{count}} Pemicu/alur kerja', }, + title: { + plans: 'rencana', + description: 'Pilih paket yang paling sesuai dengan kebutuhan tim Anda.', + }, + teamWorkspace: 'Ruang Kerja Tim {{count,number}}', + teamMember_one: 'Anggota Tim {{count,number}}', + teamMember_other: 'Anggota Tim {{count,number}}', + buildApps: 'Aplikasi {{count,number}}', + documents: '{{count,number}} Dokumen Pengetahuan', + vectorSpace: '{{size}} Penyimpanan Data Pengetahuan', + documentsRequestQuota: '{{count,number}} Permintaan Pengetahuan/menit', + apiRateLimitUnit: '{{count,number}}', + logsHistory: '{{days}} Riwayat log', }, plans: { sandbox: { @@ -121,8 +141,7 @@ const translation = { for: 'Untuk Tim Berukuran Menengah', }, community: { - features: { - }, + features: ['Semua Fitur Inti Dirilis di Bawah Repositori Publik', 'Ruang Kerja Tunggal', 'Mematuhi Lisensi Sumber Terbuka Dify'], price: 'Bebas', for: 'Untuk Pengguna Individu, Tim Kecil, atau Proyek Non-Komersial', name: 'Masyarakat', @@ -131,8 +150,7 @@ const translation = { includesTitle: 'Fitur Gratis:', }, premium: { - features: { - }, + features: ['Keandalan yang Dikelola Sendiri oleh Berbagai Penyedia Cloud', 'Ruang Kerja Tunggal', 'Kostumisasi Logo & Merek WebApp', 'Dukungan Email & Obrolan Prioritas'], name: 'Premi', price: 'Scalable', priceTip: 'Berdasarkan Cloud Marketplace', @@ -143,8 +161,7 @@ const translation = { btnText: 'Dapatkan Premium di', }, enterprise: { - features: { - }, + features: ['Solusi Penerapan Skala Besar Kelas Perusahaan', 'Otorisasi Lisensi Komersial', 'Fitur Eksklusif Perusahaan', 'Beberapa Ruang Kerja & Manajemen Perusahaan', 'SSO', 'SLA yang dinegosiasikan oleh Mitra Dify', 'Keamanan & Kontrol Lanjutan', 'Pembaruan dan Pemeliharaan oleh Dify Secara Resmi', 'Dukungan Teknis Profesional'], includesTitle: 'Semuanya mulai dari Premium, ditambah:', btnText: 'Hubungi Sales', price: 'Adat', diff --git a/web/i18n/id-ID/common.ts b/web/i18n/id-ID/common.ts index 732b04bb92..43ce9f9adc 100644 --- a/web/i18n/id-ID/common.ts +++ b/web/i18n/id-ID/common.ts @@ -71,13 +71,21 @@ const translation = { confirmAction: 'Silakan konfirmasi tindakan Anda.', yes: 'Ya', no: 'Tidak', + noSearchResults: 'Tidak ada {{content}} yang ditemukan', + resetKeywords: 'Atur ulang kata kunci', + selectCount: '{{count}} Dipilih', + searchCount: 'Temukan {{count}} {{content}}', + noSearchCount: '0 {{content}}', + now: 'Sekarang', }, errorMsg: { urlError: 'URL harus dimulai dengan http:// atau https://', + fieldRequired: '{{field}} wajib diisi', }, placeholder: { select: 'Silakan pilih', input: 'Silakan masuk', + search: 'Cari...', }, voice: { language: { @@ -132,6 +140,7 @@ const translation = { presence_penalty: 'Penalti kehadiran', presence_penaltyTip: 'Berapa banyak yang harus menghukum token baru berdasarkan apakah mereka muncul dalam teks sejauh ini.\nMeningkatkan kemungkinan model untuk membicarakan topik baru.', temperatureTip: 'Mengontrol keacakan: Menurunkan menghasilkan lebih sedikit penyelesaian acak. Saat suhu mendekati nol, model akan menjadi deterministik dan berulang.', + setToCurrentModelMaxTokenTip: 'Token maksimum diperbarui menjadi 80% dari token maksimum model saat ini {{maxToken}}.', }, tone: { Precise: 'Tepat', @@ -214,6 +223,11 @@ const translation = { verifyEmail: 'Memverifikasi email Anda saat ini', unAvailableEmail: 'Email ini tidak tersedia untuk sementara.', authTip: 'Setelah email Anda diubah, akun Google atau GitHub yang ditautkan ke email lama Anda tidak akan dapat lagi masuk ke akun ini.', + content1: 'Jika Anda melanjutkan, kami akan mengirim kode verifikasi ke {{email}} untuk autentikasi ulang.', + content2: 'Email Anda saat ini adalah {{email}}. Kode verifikasi telah dikirim ke alamat email ini.', + content4: 'Kami baru saja mengirimkan kode verifikasi sementara kepada Anda ke {{email}}.', + changeTo: 'Ubah ke {{email}}', + resendCount: 'Kirim ulang dalam {{count}} detik', }, account: 'Rekening', langGeniusAccount: 'Data akun', @@ -249,6 +263,7 @@ const translation = { password: 'Kata sandi', deleteTip: 'Harap dicatat, setelah dikonfirmasi, sebagai Pemilik Ruang Kerja apa pun, ruang kerja Anda akan dijadwalkan dalam antrean untuk penghapusan permanen, dan semua data pengguna Anda akan diantri untuk penghapusan permanen.', workspaceIcon: 'Ikon Ruang Kerja', + showAppLength: 'Tampilkan {{length}} aplikasi', }, members: { transferModal: { @@ -265,6 +280,10 @@ const translation = { transferLabel: 'Mentransfer kepemilikan ruang kerja ke', resend: 'Kirim Ulang', transferPlaceholder: 'Pilih anggota ruang kerja...', + warning: 'Anda akan mentransfer kepemilikan “{{workspace}}”. Ini akan berlaku segera dan tidak dapat dibatalkan.', + sendTip: 'Jika Anda melanjutkan, kami akan mengirim kode verifikasi ke {{email}} untuk autentikasi ulang.', + verifyContent: 'Email Anda saat ini adalah {{email}}.', + resendCount: 'Kirim ulang dalam {{count}} detik', }, lastActive: 'TERAKHIR AKTIF', owner: 'Pemilik', @@ -305,6 +324,7 @@ const translation = { editorTip: 'Dapat membangun & mengedit aplikasi', admin: 'Admin', normalTip: 'Hanya dapat menggunakan aplikasi, tidak dapat membuat aplikasi', + invitedAsRole: 'Diundang sebagai pengguna {{role}}', }, feedback: { subtitle: 'Tolong beri tahu kami apa yang salah dengan tanggapan ini', @@ -417,6 +437,7 @@ const translation = { }, item: { freeQuota: 'KUOTA GRATIS', + deleteDesc: '{{modelName}} sedang digunakan sebagai model penalaran sistem. Beberapa fungsi tidak akan tersedia setelah dihapus. Harap konfirmasi.', }, encrypted: { back: 'Teknologi.', @@ -507,6 +528,11 @@ const translation = { getFreeTokens: 'Dapatkan Token gratis', parametersInvalidRemoved: 'Beberapa parameter tidak valid dan telah dihapus', installDataSourceProvider: 'Pasang penyedia sumber data', + noModelFound: 'Tidak ditemukan model untuk {{model}}', + modelsNum: 'Model {{num}}', + showModelsNum: 'Tampilkan {{num}} Model', + featureSupported: '{{feature}} didukung', + apiKeyRateLimit: 'Batas kecepatan tercapai, tersedia setelah {{seconds}} detik', }, dataSource: { notion: { @@ -579,6 +605,8 @@ const translation = { about: { changeLog: 'Log perubahan', updateNow: 'Perbarui sekarang', + nowAvailable: 'Dify {{version}} kini tersedia.', + latestAvailable: 'Dify {{version}} adalah versi terbaru yang tersedia.', }, appMenus: { logs: 'Log', @@ -637,6 +665,7 @@ const translation = { thought: 'Pikiran', renameConversation: 'Ganti Nama Percakapan', conversationNamePlaceholder: 'Silakan masukkan nama percakapan', + inputPlaceholder: 'Bicaralah dengan {{botName}}', }, promptEditor: { context: { @@ -647,6 +676,7 @@ const translation = { modal: { footer: 'Anda dapat mengelola konteks di bagian Konteks di bawah.', add: 'Tambahkan Konteks', + title: '{{num}} Pengetahuan dalam Konteks', }, }, history: { @@ -692,6 +722,7 @@ const translation = { uploadFromComputerReadError: 'Pembacaan gambar gagal, silakan coba lagi.', pasteImageLinkInvalid: 'Tautan gambar tidak valid', pasteImageLinkInputPlaceholder: 'Tempel tautan gambar di sini', + uploadFromComputerLimit: 'Unggah gambar tidak boleh lebih dari {{size}} MB', }, fileUploader: { fileExtensionNotSupport: 'Ekstensi file tidak didukung', @@ -702,6 +733,7 @@ const translation = { pasteFileLinkInputPlaceholder: 'Masukkan URL...', uploadFromComputerReadError: 'Pembacaan file gagal, silakan coba lagi.', fileExtensionBlocked: 'Tipe file ini diblokir karena alasan keamanan', + uploadFromComputerLimit: 'Unggahan {{type}} tidak boleh melebihi {{size}}', }, tag: { noTag: 'Tidak ada tag', @@ -721,6 +753,7 @@ const translation = { license: { unlimited: 'Unlimited', expiring: 'Kedaluwarsa dalam satu hari', + expiring_plural: 'Kedaluwarsa dalam {{count}} hari', }, pagination: { perPage: 'Item per halaman', @@ -738,6 +771,13 @@ const translation = { label: { optional: '(opsional)', }, + noData: 'Tidak ada data', + dynamicSelect: { + error: 'Gagal memuat opsi', + noData: 'Tidak ada opsi yang tersedia', + loading: 'Memuat opsi...', + selected: '{{count}} dipilih', + }, } export default translation diff --git a/web/i18n/id-ID/dataset-creation.ts b/web/i18n/id-ID/dataset-creation.ts index 29427eb294..7bb9b18dc3 100644 --- a/web/i18n/id-ID/dataset-creation.ts +++ b/web/i18n/id-ID/dataset-creation.ts @@ -35,6 +35,8 @@ const translation = { validation: { count: 'Beberapa file tidak didukung', typeError: 'Jenis file tidak didukung', + size: 'Berkas terlalu besar. Maksimal {{size}}MB', + filesNumber: 'Anda telah mencapai batas unggah batch sebanyak {{filesNumber}}.', }, buttonSingleFile: 'Seret dan lepas file, atau', title: 'Unggah file', @@ -43,6 +45,7 @@ const translation = { button: 'Seret dan lepas file atau folder, atau', change: 'Ubah', failed: 'Upload gagal', + tip: 'Mendukung {{supportTypes}}. Maksimal {{batchCount}} dalam satu batch dan {{size}} MB masing-masing. Total maksimal {{totalCount}} file.', }, modal: { title: 'Buat Pengetahuan kosong', @@ -92,6 +95,7 @@ const translation = { firecrawlDoc: 'Dokumen Firecrawl', configureWatercrawl: 'Konfigurasikan Watercrawl', running: 'Menjalankan', + scrapTimeInfo: 'Telah mengumpulkan {{total}} halaman secara total dalam {{time}} detik', }, pagePreview: 'Pratinjau Halaman', notionSyncTitle: 'Notion tidak terhubung', @@ -183,6 +187,8 @@ const translation = { general: 'Umum', indexSettingTip: 'Untuk mengubah metode indeks & model penyematan, silakan pergi ke', qaTip: 'Saat menggunakan data Tanya Jawab terstruktur, Anda dapat membuat dokumen yang memasangkan pertanyaan dengan jawaban. Dokumen-dokumen ini diindeks berdasarkan bagian pertanyaan, memungkinkan sistem untuk mengambil jawaban yang relevan berdasarkan kesamaan kueri.', + maxLengthCheck: 'Panjang potongan maksimum sebaiknya kurang dari {{limit}}', + previewChunkCount: '{{count}} Potongan perkiraan', }, stepThree: { modelTitle: 'Apakah Anda yakin untuk berhenti menyematkan?', diff --git a/web/i18n/id-ID/dataset-documents.ts b/web/i18n/id-ID/dataset-documents.ts index 3b40750192..7fc91c1df4 100644 --- a/web/i18n/id-ID/dataset-documents.ts +++ b/web/i18n/id-ID/dataset-documents.ts @@ -81,7 +81,10 @@ const translation = { learnMore: 'Pelajari lebih lanjut', addUrl: 'Tambahkan URL', title: 'Dokumen', - sort: {}, + sort: { + uploadTime: 'Waktu Unggah', + hitCount: 'Jumlah Pengambilan', + }, }, metadata: { placeholder: { diff --git a/web/i18n/id-ID/dataset-hit-testing.ts b/web/i18n/id-ID/dataset-hit-testing.ts index d2a66eef08..82df364686 100644 --- a/web/i18n/id-ID/dataset-hit-testing.ts +++ b/web/i18n/id-ID/dataset-hit-testing.ts @@ -15,6 +15,7 @@ const translation = { }, hit: { emptyTip: 'Hasil Pengujian Pengambilan akan ditampilkan di sini', + title: '{{num}} Potongan yang Diambil', }, keyword: 'Kata kunci', noRecentTip: 'Tidak ada hasil kueri terbaru di sini', @@ -27,6 +28,7 @@ const translation = { viewChart: 'Lihat GRAFIK VAKTOR', chunkDetail: 'Detail Potongan', title: 'Tes Pengambilan', + hitChunks: 'Pukul {{num}} potongan anak', } export default translation diff --git a/web/i18n/id-ID/dataset-pipeline.ts b/web/i18n/id-ID/dataset-pipeline.ts index 01d4b6bccd..993bf79203 100644 --- a/web/i18n/id-ID/dataset-pipeline.ts +++ b/web/i18n/id-ID/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'Alur Pengetahuan Diterbitkan', + tip: 'Buka Dokumen untuk menambahkan atau mengelola dokumen.', }, error: { message: 'Gagal Menerbitkan Alur Pengetahuan', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'Struktur', structureTooltip: 'Struktur Potongan menentukan bagaimana dokumen dibagi dan diindeks—menawarkan mode Umum, Induk-Anak, dan Tanya Jawab—dan unik untuk setiap basis pengetahuan.', + createdBy: 'Oleh {{author}}', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { title: 'Tambahkan Dokumen', backToDataSource: 'Sumber Data', characters: 'Karakter', + selectOnlineDocumentTip: 'Proses hingga {{count}} halaman', + selectOnlineDriveTip: 'Proses hingga {{count}} file, maksimum {{fileSize}} MB masing-masing', }, documentSettings: { title: 'Pengaturan Dokumen', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} halaman', + }, onlineDrive: { breadcrumbs: { allFiles: 'Semua File', allBuckets: 'Semua Bucket Penyimpanan Cloud', searchPlaceholder: 'Cari file...', + searchResult: 'Temukan {{searchResultsLength}} item di folder "{{folderName}}"', }, resetKeywords: 'Mengatur ulang kata kunci', notSupportedFileType: 'Jenis file ini tidak didukung', emptySearchResult: 'Tidak ada barang yang ditemukan', emptyFolder: 'Folder ini kosong', + notConnected: '{{name}} tidak terhubung', + notConnectedTip: 'Untuk menyinkronkan dengan {{name}}, koneksi ke {{name}} harus dibuat terlebih dahulu.', + }, + credentialSelector: { + name: '{{credentialName}}\'s {{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { title: 'Konfirmasi', @@ -149,6 +160,7 @@ const translation = { knowledgeNameAndIcon: 'Nama & ikon pengetahuan', knowledgeDescriptionPlaceholder: 'Jelaskan apa yang ada di Basis Pengetahuan ini. Deskripsi terperinci memungkinkan AI mengakses konten kumpulan data dengan lebih akurat. Jika kosong, Dify akan menggunakan strategi hit default. (Opsional)', editPipelineInfo: 'Mengedit info alur', + configurationTip: 'Konfigurasikan {{pluginName}}', } export default translation diff --git a/web/i18n/id-ID/dataset.ts b/web/i18n/id-ID/dataset.ts index 4c40fdd54f..6f86ddf171 100644 --- a/web/i18n/id-ID/dataset.ts +++ b/web/i18n/id-ID/dataset.ts @@ -124,12 +124,14 @@ const translation = { checkName: { empty: 'Nama metadata tidak boleh kosong', invalid: 'Nama metadata hanya dapat berisi huruf kecil, angka, dan garis bawah dan harus dimulai dengan huruf kecil', + tooLong: 'Nama metadata tidak boleh melebihi {{max}} karakter', }, batchEditMetadata: { editMetadata: 'Edit Metadata', applyToAllSelectDocument: 'Terapkan ke semua dokumen yang dipilih', multipleValue: 'Beberapa Nilai', applyToAllSelectDocumentTip: 'Secara otomatis membuat semua metadata yang diedit di atas dan baru untuk semua dokumen yang dipilih, jika tidak, mengedit metadata hanya akan berlaku untuk dokumen yang dengannya.', + editDocumentsNum: 'Mengedit dokumen {{num}}', }, selectMetadata: { manageAction: 'Urus', @@ -146,6 +148,8 @@ const translation = { builtInDescription: 'Metadata bawaan secara otomatis diekstrak dan dihasilkan. Itu harus diaktifkan sebelum digunakan dan tidak dapat diedit.', namePlaceholder: 'Nama metadata', builtIn: 'Bawaan', + values: 'Nilai {{num}}', + deleteContent: 'Apakah Anda yakin ingin menghapus metadata "{{name}}"', }, documentMetadata: { metadataToolTip: 'Metadata berfungsi sebagai filter penting yang meningkatkan akurasi dan relevansi pengambilan informasi. Anda dapat memodifikasi dan menambahkan metadata untuk dokumen ini di sini.', @@ -227,6 +231,12 @@ const translation = { enabled: 'Sedang Beroperasi', disabled: 'Dinonaktifkan', }, + docAllEnabled_one: 'dokumen {{count}} diaktifkan', + docAllEnabled_other: 'Semua dokumen {{count}} diaktifkan', + partialEnabled_one: 'Total {{count}} dokumen, {{num}} tersedia', + partialEnabled_other: 'Total {{count}} dokumen, {{num}} tersedia', + documentsDisabled: '{{num}} dokumen dinonaktifkan - tidak aktif lebih dari 30 hari', + preprocessDocument: '{{num}} Prasekolah Dokumen', } export default translation diff --git a/web/i18n/id-ID/education.ts b/web/i18n/id-ID/education.ts index 85f74cc51e..b5c9db0877 100644 --- a/web/i18n/id-ID/education.ts +++ b/web/i18n/id-ID/education.ts @@ -42,6 +42,7 @@ const translation = { }, isAboutToExpire: { summary: 'Jangan khawatir — ini tidak akan memengaruhi langganan Anda saat ini, tetapi Anda tidak akan mendapatkan diskon pendidikan saat diperpanjang kecuali Anda memverifikasi status Anda lagi.', + title: 'Status pendidikan Anda akan berakhir pada {{date}}', }, stillInEducation: { isAboutToExpire: 'Verifikasi ulang sekarang untuk mendapatkan kupon baru untuk tahun akademik mendatang. Ini akan disimpan ke akun Anda dan siap digunakan pada perpanjangan berikutnya.', diff --git a/web/i18n/id-ID/explore.ts b/web/i18n/id-ID/explore.ts index a482d8f755..06734485d5 100644 --- a/web/i18n/id-ID/explore.ts +++ b/web/i18n/id-ID/explore.ts @@ -26,6 +26,7 @@ const translation = { appCustomize: { subTitle: 'Ikon & nama aplikasi', nameRequired: 'Nama aplikasi diperlukan', + title: 'Buat aplikasi dari {{name}}', }, category: { Entertainment: 'Hiburan', diff --git a/web/i18n/id-ID/pipeline.ts b/web/i18n/id-ID/pipeline.ts index fdf994d997..c211bfa2c8 100644 --- a/web/i18n/id-ID/pipeline.ts +++ b/web/i18n/id-ID/pipeline.ts @@ -28,10 +28,12 @@ const translation = { loading: 'Pengolahan... Harap tunggu', viewDetails: 'Lihat detail', error: 'Terjadi kesalahan selama eksekusi', + footerTip: 'Dalam mode uji coba, pratinjau hingga {{count}} potongan', }, }, ragToolSuggestions: { title: 'Saran untuk RAG', + noRecommendationPlugins: 'Tidak ada plugin yang disarankan, temukan lebih banyak di Marketplace', }, } diff --git a/web/i18n/id-ID/plugin-trigger.ts b/web/i18n/id-ID/plugin-trigger.ts new file mode 100644 index 0000000000..801637c0ad --- /dev/null +++ b/web/i18n/id-ID/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'Langganan', + listNum: 'langganan {{num}}', + empty: { + title: 'Tidak ada langganan', + button: 'Langganan baru', + }, + createButton: { + oauth: 'Langganan baru dengan OAuth', + apiKey: 'Langganan baru dengan Kunci API', + manual: 'Tempel URL untuk membuat langganan baru', + }, + createSuccess: 'Langganan berhasil dibuat', + createFailed: 'Gagal membuat langganan', + maxCount: 'Maks {{num}} langganan', + selectPlaceholder: 'Pilih langganan', + noSubscriptionSelected: 'Belum memilih langganan', + subscriptionRemoved: 'Langganan dihapus', + list: { + title: 'Langganan', + addButton: 'Tambahkan', + tip: 'Terima acara melalui Langganan', + item: { + enabled: 'Diaktifkan', + disabled: 'Dinonaktifkan', + credentialType: { + api_key: 'Kunci API', + oauth2: 'OAuth', + unauthorized: 'Manual', + }, + actions: { + delete: 'Hapus', + deleteConfirm: { + title: 'Hapus {{name}}?', + success: 'Langganan {{name}} berhasil dihapus', + error: 'Gagal menghapus langganan {{name}}', + content: 'Setelah dihapus, langganan ini tidak dapat dikembalikan. Harap konfirmasi.', + contentWithApps: 'Langganan saat ini direferensikan oleh {{count}} aplikasi. Menghapusnya akan menyebabkan aplikasi yang dikonfigurasi berhenti menerima acara langganan.', + confirm: 'Konfirmasi Hapus', + cancel: 'Batal', + confirmInputWarning: 'Silakan masukkan nama yang benar untuk konfirmasi.', + confirmInputPlaceholder: 'Masukkan "{{name}}" untuk konfirmasi.', + confirmInputTip: 'Silakan masukkan “{{name}}” untuk mengonfirmasi.', + }, + }, + status: { + active: 'Aktif', + inactive: 'Tidak aktif', + }, + usedByNum: 'Digunakan oleh {{num}} alur kerja', + noUsed: 'Tidak ada alur kerja yang digunakan', + }, + }, + addType: { + title: 'Tambah langganan', + description: 'Pilih bagaimana Anda ingin membuat langganan pemicu Anda', + options: { + apikey: { + title: 'Buat dengan Kunci API', + description: 'Buat langganan secara otomatis menggunakan kredensial API', + }, + oauth: { + title: 'Buat dengan OAuth', + description: 'Otorisasi dengan platform pihak ketiga untuk membuat langganan', + clientSettings: 'Pengaturan Klien OAuth', + clientTitle: 'Klien OAuth', + default: 'Default', + custom: 'Kustom', + }, + manual: { + title: 'Pengaturan Manual', + description: 'Tempel URL untuk membuat langganan baru', + tip: 'Konfigurasikan URL di platform pihak ketiga secara manual', + }, + }, + }, + }, + modal: { + steps: { + verify: 'Verifikasi', + configuration: 'Konfigurasi', + }, + common: { + cancel: 'Batal', + back: 'Kembali', + next: 'Berikutnya', + create: 'Buat', + verify: 'Verifikasi', + authorize: 'Otorisasi', + creating: 'Membuat...', + verifying: 'Memverifikasi...', + authorizing: 'Mengizinkan...', + }, + oauthRedirectInfo: 'Karena tidak ditemukan rahasia klien sistem untuk penyedia alat ini, pengaturannya harus dilakukan secara manual, untuk redirect_uri, silakan gunakan', + apiKey: { + title: 'Buat dengan Kunci API', + verify: { + title: 'Verifikasi Kredensial', + description: 'Silakan berikan kredensial API Anda untuk memverifikasi akses', + error: 'Verifikasi kredensial gagal. Silakan periksa kunci API Anda.', + success: 'Kredensial berhasil diverifikasi', + }, + configuration: { + title: 'Atur Langganan', + description: 'Atur parameter langganan Anda', + }, + }, + oauth: { + title: 'Buat dengan OAuth', + authorization: { + title: 'Otorisasi OAuth', + description: 'Izinkan Dify untuk mengakses akun Anda', + redirectUrl: 'URL Pengalihan', + redirectUrlHelp: 'Gunakan URL ini dalam konfigurasi aplikasi OAuth Anda', + authorizeButton: 'Otorisasi dengan {{provider}}', + waitingAuth: 'Menunggu otorisasi...', + authSuccess: 'Otorisasi berhasil', + authFailed: 'Gagal mendapatkan informasi otorisasi OAuth', + waitingJump: 'Diizinkan, menunggu lompatan', + }, + configuration: { + title: 'Atur Langganan', + description: 'Atur parameter langganan Anda setelah otorisasi', + success: 'Konfigurasi OAuth berhasil', + failed: 'Konfigurasi OAuth gagal', + }, + remove: { + success: 'Penghapusan OAuth berhasil', + failed: 'Gagal menghapus OAuth', + }, + save: { + success: 'Konfigurasi OAuth berhasil disimpan', + }, + }, + manual: { + title: 'Pengaturan Manual', + description: 'Konfigurasikan langganan webhook Anda secara manual', + logs: { + title: 'Catatan Permintaan', + request: 'Permintaan', + loading: 'Menunggu permintaan dari {{pluginName}}...', + }, + }, + form: { + subscriptionName: { + label: 'Nama Langganan', + placeholder: 'Masukkan nama langganan', + required: 'Nama langganan wajib diisi', + }, + callbackUrl: { + label: 'URL Panggilan Balik', + description: 'URL ini akan menerima event webhook', + tooltip: 'Sediakan endpoint yang dapat diakses publik yang dapat menerima permintaan callback dari penyedia pemicu.', + placeholder: 'Sedang menghasilkan...', + privateAddressWarning: 'URL ini tampaknya merupakan alamat internal, yang mungkin menyebabkan permintaan webhook gagal. Anda dapat mengubah TRIGGER_URL ke alamat publik.', + }, + }, + errors: { + createFailed: 'Gagal membuat langganan', + verifyFailed: 'Gagal memverifikasi kredensial', + authFailed: 'Otorisasi gagal', + networkError: 'Kesalahan jaringan, silakan coba lagi', + }, + }, + events: { + title: 'Acara Tersedia', + description: 'Peristiwa yang dapat diikuti oleh plugin pemicu ini', + empty: 'Tidak ada acara tersedia', + event: 'Acara', + events: 'Acara', + actionNum: '{{num}} {{event}} TERMASUK', + item: { + parameters: 'parameter {{count}}', + noParameters: 'Tidak ada parameter', + }, + output: 'Keluaran', + }, + node: { + status: { + warning: 'Putuskan sambungan', + }, + }, +} + +export default translation diff --git a/web/i18n/id-ID/plugin.ts b/web/i18n/id-ID/plugin.ts index 4064e7976d..bcf9d88b34 100644 --- a/web/i18n/id-ID/plugin.ts +++ b/web/i18n/id-ID/plugin.ts @@ -10,6 +10,7 @@ const translation = { agents: 'Strategi Agen', tools: 'Perkakas', datasources: 'Sumber Data', + triggers: 'Pemicu', }, categorySingle: { bundle: 'Bundel', @@ -18,6 +19,7 @@ const translation = { model: 'Pola', extension: 'Ekstensi', datasource: 'Sumber Data', + trigger: 'Pemicu', }, list: { source: { @@ -48,6 +50,7 @@ const translation = { viewDetail: 'Lihat Detail', install: 'Pasang', checkUpdate: 'Periksa Pembaruan', + back: 'Kembali', }, toolSelector: { descriptionLabel: 'Deskripsi alat', @@ -77,6 +80,8 @@ const translation = { ownershipTransferred: 'kepemilikan dialihkan', }, noReason: 'Plugin ini tidak digunakan lagi dan tidak akan diperbarui lagi.', + fullMessage: 'Plugin ini telah dihentikan karena {{deprecatedReason}}, dan tidak akan diperbarui lagi. Silakan gunakan {{-alternativePluginId}} sebagai gantinya.', + onlyReason: 'Plugin ini telah dihentikan penggunaannya karena {{deprecatedReason}} dan tidak akan diperbarui lagi.', }, endpoints: 'Endpoint', endpointDisableTip: 'Nonaktifkan Titik Akhir', @@ -92,6 +97,11 @@ const translation = { endpointsTip: 'Plugin ini menyediakan fungsionalitas khusus melalui titik akhir, dan Anda dapat mengonfigurasi beberapa set titik akhir untuk ruang kerja saat ini.', endpointModalTitle: 'Menyiapkan titik akhir', endpointsEmpty: 'Klik tombol \' \' untuk menambahkan titik akhir', + actionNum: '{{num}} {{action}} TERMASUK', + strategyNum: '{{num}} {{strategy}} TERMASUK', + endpointDisableContent: 'Apakah Anda ingin menonaktifkan {{name}}?', + endpointDeleteContent: 'Apakah Anda ingin menghapus {{name}}?', + modelNum: '{{num}} MODEL TERMASUK', }, debugInfo: { title: 'Debugging', @@ -150,6 +160,10 @@ const translation = { updateTimeTitle: 'Waktu pembaruan', specifyPluginsToUpdate: 'Tentukan plugin untuk diperbarui', automaticUpdates: 'Pembaruan otomatis', + excludeUpdate: 'Plugin {{num}} berikut ini tidak akan diperbarui secara otomatis', + partialUPdate: 'Hanya plugin {{num}} berikut yang akan diperbarui secara otomatis', + nextUpdateTime: 'Pembaruan otomatis berikutnya: {{time}}', + changeTimezone: 'Untuk mengubah zona waktu, pergi ke Pengaturan', }, pluginInfoModal: { repository: 'Repositori', @@ -163,6 +177,7 @@ const translation = { checkForUpdates: 'Periksa pembaruan', deleteContentLeft: 'Apakah Anda ingin menghapus', delete: 'Hapus plugin', + usedInApps: 'Plugin ini digunakan di {{num}} aplikasi.', }, installModal: { labels: { @@ -189,6 +204,9 @@ const translation = { dropPluginToInstall: 'Jatuhkan paket plugin di sini untuk menginstal', installComplete: 'Instalasi selesai', installPlugin: 'Instal Plugin', + uploadingPackage: 'Mengunggah {{packageName}}...', + readyToInstallPackages: 'Akan memasang plugin {{num}} berikut', + fromTrustSource: 'Pastikan Anda hanya menginstal plugin dari sumber yang tepercaya.', }, installFromGitHub: { installFailed: 'Instalasi gagal', @@ -210,6 +228,7 @@ const translation = { successfulTitle: 'Instal berhasil', description: 'Tentang menginstal plugin berikut', title: 'Instal Plugin', + usedInApps: 'Digunakan di {{num}} aplikasi', }, error: { fetchReleasesError: 'Tidak dapat mengambil rilis. Silakan coba lagi nanti.', @@ -233,9 +252,15 @@ const translation = { and: 'dan', difyMarketplace: 'Dify Marketplace', verifiedTip: 'Diverifikasi oleh Dify', + pluginsResult: 'hasil {{num}}', }, task: { clearAll: 'Hapus semua', + installing: 'Memasang plugin {{installingLength}}, 0 selesai.', + installingWithSuccess: 'Memasang plugin {{installingLength}}, {{successLength}} berhasil.', + installingWithError: 'Memasang {{installingLength}} plugin, {{successLength}} berhasil, {{errorLength}} gagal', + installError: 'Gagal menginstal plugin {{errorLength}}, klik untuk melihat', + installedError: 'Gagal menginstal {{errorLength}} plugin', }, auth: { customCredentialUnavailable: 'Kredensial kustom saat ini tidak tersedia', @@ -281,6 +306,15 @@ const translation = { installAction: 'Pasang', publishPlugins: 'Menerbitkan plugin', requestAPlugin: 'Minta plugin', + endpointsEnabled: '{{num}} set endpoint diaktifkan', + install: '{{num}} menginstal', + difyVersionNotCompatible: 'Versi Dify saat ini tidak kompatibel dengan plugin ini, harap perbarui ke versi minimum yang dibutuhkan: {{minimalDifyVersion}}', + readmeInfo: { + title: 'BACA SAYA', + needHelpCheckReadme: 'Butuh bantuan? Periksa README.', + noReadmeAvailable: 'Tidak ada README yang tersedia', + failedToFetch: 'Gagal mengambil README', + }, } export default translation diff --git a/web/i18n/id-ID/share.ts b/web/i18n/id-ID/share.ts index 0c2cdef762..3916812c8f 100644 --- a/web/i18n/id-ID/share.ts +++ b/web/i18n/id-ID/share.ts @@ -47,11 +47,15 @@ const translation = { batchFailed: { outputPlaceholder: 'Tidak ada konten keluaran', retry: 'Pengulangan', + info: '{{num}} eksekusi gagal', }, errorMsg: { atLeastOne: 'Silakan masukkan setidaknya satu baris dalam file yang diunggah.', empty: 'Silakan masukkan konten dalam file yang diunggah.', fileStructNotMatch: 'File CSV yang diunggah tidak cocok dengan struct.', + emptyLine: 'Baris {{rowIndex}} kosong', + invalidLine: 'Baris {{rowIndex}}: nilai {{varName}} tidak boleh kosong', + moreThanMaxLengthLine: 'Baris {{rowIndex}}: nilai {{varName}} tidak boleh lebih dari {{maxLength}} karakter', }, field: 'Kebun', queryTitle: 'Kueri konten', diff --git a/web/i18n/id-ID/tools.ts b/web/i18n/id-ID/tools.ts index 539ce5967f..ceefc1921e 100644 --- a/web/i18n/id-ID/tools.ts +++ b/web/i18n/id-ID/tools.ts @@ -234,6 +234,9 @@ const translation = { parameters: 'Parameter', noDescription: 'Tanpa deskripsi', }, + toolsCount: 'alat {{count}}', + deleteConfirmTitle: 'Apakah Anda ingin menghapus {{mcp}}?', + toolsNum: 'alat {{count}} termasuk', }, title: 'Perkakas', createCustomTool: 'Buat Alat Kustom', @@ -248,6 +251,7 @@ const translation = { builtInPromptTitle: 'Cepat', toolNameUsageTip: 'Nama panggilan alat untuk penalaran dan permintaan agen', allTools: 'Semua alat', + includeToolNum: '{{num}} {{action}} termasuk', } export default translation diff --git a/web/i18n/id-ID/workflow.ts b/web/i18n/id-ID/workflow.ts index 506b17d925..83ee9335cf 100644 --- a/web/i18n/id-ID/workflow.ts +++ b/web/i18n/id-ID/workflow.ts @@ -13,6 +13,8 @@ const translation = { desc: 'untuk terhubung', title: 'Tarik', }, + limit: 'Paralelisme terbatas pada {{num}} cabang.', + depthLimit: 'Batas lapisan bersarang paralel sebesar {{num}} lapisan', }, undo: 'Urungkan', embedIntoSite: 'Sematkan ke Situs', @@ -33,7 +35,6 @@ const translation = { addParallelNode: 'Tambahkan Node Paralel', onFailure: 'Pada Kegagalan', update: 'Pemutakhiran', - parallelRun: 'Jalankan Paralel', configure: 'Konfigurasikan', copy: 'Menyalin', redo: 'Ulangi', @@ -113,6 +114,14 @@ const translation = { currentWorkflow: 'Alur Kerja Saat Ini', viewOnly: 'Lihat Saja', restore: 'Mengembalikan', + listening: 'Mendengarkan', + chooseStartNodeToRun: 'Pilih node awal untuk dijalankan', + runAllTriggers: 'Jalankan semua pemicu', + maxTreeDepth: 'Batas maksimum {{depth}} node per cabang', + needAdd: 'Node {{node}} harus ditambahkan', + needStartNode: 'Setidaknya satu node awal harus ditambahkan', + moreActions: 'Tindakan Lain', + workflowAsToolDisabledHint: 'Terbitkan alur kerja terbaru dan pastikan ada node Input Pengguna yang terhubung sebelum mengonfigurasinya sebagai alat.', }, env: { modal: { @@ -198,6 +207,10 @@ const translation = { currentState: 'Keadaan Saat Ini', edgeDelete: 'Node terputus', nodeChange: 'Node diubah', + stepBackward_one: '{{count}} langkah mundur', + stepBackward_other: '{{count}} langkah mundur', + stepForward_one: '{{count}} melangkah maju', + stepForward_other: '{{count}} melangkah maju', }, errorMsg: { fields: { @@ -211,6 +224,11 @@ const translation = { invalidVariable: 'Variabel tidak valid', authRequired: 'Otorisasi diperlukan', rerankModelRequired: 'Model Rerank yang dikonfigurasi diperlukan', + fieldRequired: '{{field}} wajib diisi', + invalidJson: '{{field}} adalah JSON yang tidak valid', + noValidTool: '{{field}} tidak ada alat yang valid dipilih', + toolParameterRequired: '{{field}}: parameter [{{param}}] diperlukan', + startNodeRequired: 'Silakan tambahkan node awal terlebih dahulu sebelum {{operation}}', }, singleRun: { back: 'Belakang', @@ -242,6 +260,21 @@ const translation = { 'allTool': 'Semua', 'sources': 'Sumber', 'searchDataSource': 'Cari Sumber Data', + 'start': 'Mulai', + 'searchTrigger': 'Pencarian memicu...', + 'allTriggers': 'Semua pemicu', + 'noPluginsFound': 'Tidak ada plugin yang ditemukan', + 'requestToCommunity': 'Permintaan kepada komunitas', + 'featuredTools': 'Unggulan', + 'showMoreFeatured': 'Tampilkan lebih banyak', + 'showLessFeatured': 'Tampilkan lebih sedikit', + 'installed': 'Terpasang', + 'pluginByAuthor': 'Oleh {{author}}', + 'usePlugin': 'Pilih alat', + 'hideActions': 'Sembunyikan alat', + 'noFeaturedPlugins': 'Temukan lebih banyak alat di Marketplace', + 'noFeaturedTriggers': 'Temukan lebih banyak pemicu di Marketplace', + 'startDisabledTip': 'Node pemicu dan node input pengguna saling eksklusif.', }, blocks: { 'code': 'Kode', @@ -268,6 +301,10 @@ const translation = { 'variable-aggregator': 'Agregator Variabel', 'datasource': 'Sumber Data', 'knowledge-index': 'Basis Pengetahuan', + 'originalStartNode': 'node awal asli', + 'trigger-schedule': 'Pemicu Jadwal', + 'trigger-webhook': 'Pemicu Webhook', + 'trigger-plugin': 'Pemicu Plugin', }, blocksAbout: { 'template-transform': 'Mengonversi data menjadi string menggunakan sintaks templat Jinja', @@ -292,6 +329,9 @@ const translation = { 'list-operator': 'Digunakan untuk memfilter atau mengurutkan konten array.', 'datasource': 'Sumber Data Tentang', 'knowledge-index': 'Basis Pengetahuan Tentang', + 'trigger-schedule': 'Pemicu alur kerja berbasis waktu yang memulai alur kerja sesuai jadwal', + 'trigger-webhook': 'Pemicu Webhook menerima push HTTP dari sistem pihak ketiga untuk secara otomatis memicu alur kerja.', + 'trigger-plugin': 'Pemicu integrasi pihak ketiga yang memulai alur kerja dari kejadian platform eksternal', }, operator: { zoomIn: 'Perbesar', @@ -323,7 +363,6 @@ const translation = { change: 'Ubah', checklist: 'Checklist', about: 'Sekitar', - moveToThisNode: 'Pindah ke simpul ini', optional: '(opsional)', checklistTip: 'Pastikan semua masalah diselesaikan sebelum dipublikasikan', organizeBlocks: 'Mengatur simpul', @@ -339,6 +378,9 @@ const translation = { runThisStep: 'Jalankan langkah ini', maximize: 'Maksimalkan Kanvas', optional_and_hidden: '(opsional & tersembunyi)', + goTo: 'Pergi ke', + startNode: 'Mulai Node', + scrollToSelectedNode: 'Gulir ke node yang dipilih', }, nodes: { common: { @@ -374,7 +416,9 @@ const translation = { title: 'Cabang Gagal', customizeTip: 'Saat cabang gagal diaktifkan, pengecualian yang dilemparkan oleh simpul tidak akan mengakhiri proses. Sebagai gantinya, itu akan secara otomatis mengeksekusi cabang gagal yang telah ditentukan sebelumnya, memungkinkan Anda untuk secara fleksibel memberikan pesan kesalahan, laporan, perbaikan, atau tindakan lewati.', }, - partialSucceeded: {}, + partialSucceeded: { + tip: 'Ada {{num}} node dalam proses yang berjalan tidak normal, silakan pergi ke tracing untuk memeriksa log.', + }, title: 'Penanganan Kesalahan', tip: 'Strategi penanganan pengecualian, dipicu ketika simpul menemukan pengecualian.', }, @@ -388,6 +432,9 @@ const translation = { retryInterval: 'interval coba lagi', times: 'kali', retrySuccessful: 'Coba lagi berhasil', + retryTimes: 'Coba ulang {{times}} kali jika gagal', + retryFailedTimes: '{{times}} percobaan gagal', + retries: '{{num}} Percobaan Ulang', }, typeSwitch: { variable: 'Gunakan variabel', @@ -649,7 +696,9 @@ const translation = { object: 'Benda', string: 'Tali', }, - outputVars: {}, + outputVars: { + varDescribe: 'output {{groupName}}', + }, noVarTip: 'Tambahkan variabel yang akan ditetapkan', aggregationGroup: 'Grup Agregasi', title: 'Tetapkan variabel', @@ -775,6 +824,12 @@ const translation = { deleteTitle: 'Hapus Node Iterasi?', parallelModeEnableTitle: 'Mode Paralel Diaktifkan', answerNodeWarningDesc: 'Peringatan mode paralel: Simpul jawaban, penetapan variabel percakapan, dan operasi baca/tulis persisten dalam iterasi dapat menyebabkan pengecualian.', + iteration_one: '{{count}} Iterasi', + iteration_other: '{{count}} Iterasi', + error_one: 'Kesalahan {{count}}', + error_other: 'Kesalahan {{count}}', + flattenOutput: 'Ratakan Keluaran', + flattenOutputDesc: 'Saat diaktifkan, jika semua output iterasi berupa array, mereka akan digabung menjadi satu array tunggal. Saat dinonaktifkan, output akan mempertahankan struktur array bersarang.', }, loop: { ErrorMethod: { @@ -800,6 +855,13 @@ const translation = { comma: ',', finalLoopVariables: 'Variabel Loop Akhir', initialLoopVariables: 'Variabel Loop Awal', + loop_one: '{{count}} Loop', + loop_other: '{{count}} Perulangan', + error_one: 'Kesalahan {{count}}', + error_other: 'Kesalahan {{count}}', + loopMaxCountError: 'Harap masukkan jumlah loop maksimum yang valid, mulai dari 1 hingga {{maxCount}}', + currentLoopCount: 'Jumlah putaran saat ini: {{count}}', + totalLoopCount: 'Jumlah total loop: {{count}}', }, note: { editor: { @@ -826,6 +888,7 @@ const translation = { }, learnMore: 'Pelajari lebih lanjut', inputVar: 'Variabel Masukan', + supportFileTypes: 'Jenis file yang didukung: {{types}}.', }, listFilter: { outputVars: { @@ -913,6 +976,9 @@ const translation = { linkToPlugin: 'Tautan ke Plugin', parameterSchema: 'Skema Parameter', strategyNotFoundDesc: 'Versi plugin yang diinstal tidak menyediakan strategi ini.', + toolNotInstallTooltip: '{{tool}} tidak terpasang', + toolNotAuthorizedTooltip: '{{tool}} Tidak Berwenang', + strategyNotInstallTooltip: '{{strategy}} tidak terpasang', }, dataSource: { add: 'Menambahkan sumber data', @@ -940,8 +1006,148 @@ const translation = { rerankingModelIsInvalid: 'Model reranking tidak valid', embeddingModelIsInvalid: 'Model embedding tidak valid', }, + triggerPlugin: { + authorized: 'Otorisasi', + notConfigured: 'Belum Dikonfigurasi', + notAuthorized: 'Tidak Diizinkan', + selectSubscription: 'Pilih Langganan', + availableSubscriptions: 'Langganan Tersedia', + addSubscription: 'Tambah Langganan Baru', + removeSubscription: 'Hapus Langganan', + subscriptionRemoved: 'Langganan berhasil dihapus', + error: 'Kesalahan', + configuration: 'Konfigurasi', + remove: 'Hapus', + or: 'ATAU', + useOAuth: 'Gunakan OAuth', + useApiKey: 'Gunakan Kunci API', + authenticationFailed: 'Autentikasi gagal', + authenticationSuccess: 'Autentikasi berhasil', + oauthConfigFailed: 'Konfigurasi OAuth gagal', + configureOAuthClient: 'Konfigurasikan Klien OAuth', + oauthClientDescription: 'Konfigurasikan kredensial klien OAuth untuk mengaktifkan otentikasi', + oauthClientSaved: 'Konfigurasi klien OAuth berhasil disimpan', + configureApiKey: 'Konfigurasikan Kunci API', + apiKeyDescription: 'Konfigurasikan kredensial kunci API untuk otentikasi', + apiKeyConfigured: 'Kunci API berhasil dikonfigurasi', + configurationFailed: 'Konfigurasi gagal', + failedToStart: 'Gagal memulai alur autentikasi', + credentialsVerified: 'Kredensial berhasil diverifikasi', + credentialVerificationFailed: 'Verifikasi kredensial gagal', + verifyAndContinue: 'Verifikasi & Lanjutkan', + configureParameters: 'Konfigurasikan Parameter', + parametersDescription: 'Konfigurasikan parameter dan properti pemicu', + configurationComplete: 'Konfigurasi Selesai', + configurationCompleteDescription: 'Pemicu Anda telah dikonfigurasi dengan sukses', + configurationCompleteMessage: 'Konfigurasi pemicu Anda sekarang telah selesai dan siap digunakan.', + parameters: 'Parameter', + properties: 'Properti', + propertiesDescription: 'Properti konfigurasi tambahan untuk pemicu ini', + noConfigurationRequired: 'Tidak diperlukan pengaturan tambahan untuk pemicu ini.', + subscriptionName: 'Nama Langganan', + subscriptionNameDescription: 'Masukkan nama unik untuk langganan pemicu ini', + subscriptionNamePlaceholder: 'Masukkan nama langganan...', + subscriptionNameRequired: 'Nama langganan wajib diisi', + subscriptionRequired: 'Berlangganan diperlukan', + }, + triggerSchedule: { + title: 'Jadwal', + nodeTitle: 'Pemicu Jadwal', + notConfigured: 'Belum dikonfigurasi', + useCronExpression: 'Gunakan ekspresi cron', + useVisualPicker: 'Gunakan pemilih visual', + frequency: { + label: 'FREKUENSI', + hourly: 'Per jam', + daily: 'Harian', + weekly: 'Mingguan', + monthly: 'Bulanan', + }, + selectFrequency: 'Pilih frekuensi', + frequencyLabel: 'Frekuensi', + nextExecution: 'Eksekusi berikutnya', + weekdays: 'Hari kerja', + time: 'Waktu', + cronExpression: 'Ekspresi Cron', + nextExecutionTime: 'WAKTU EKSEKUSI BERIKUTNYA', + nextExecutionTimes: '5 waktu eksekusi berikutnya', + startTime: 'Waktu Mulai', + executeNow: 'Eksekusi sekarang', + selectDateTime: 'Pilih Tanggal & Waktu', + hours: 'Jam', + minutes: 'Menit', + onMinute: 'Dalam Sejuta', + days: 'Hari', + lastDay: 'Hari terakhir', + lastDayTooltip: 'Tidak semua bulan memiliki 31 hari. Gunakan opsi \'hari terakhir\' untuk memilih hari terakhir setiap bulan.', + mode: 'Mode', + timezone: 'Zona waktu', + visualConfig: 'Konfigurasi Visual', + monthlyDay: 'Hari Bulanan', + executionTime: 'Waktu Eksekusi', + invalidTimezone: 'Zona waktu tidak valid', + invalidCronExpression: 'Ekspresi cron tidak valid', + noValidExecutionTime: 'Tidak dapat menghitung waktu eksekusi yang valid', + executionTimeCalculationError: 'Gagal menghitung waktu eksekusi', + invalidFrequency: 'Frekuensi tidak valid', + invalidStartTime: 'Waktu mulai tidak valid', + startTimeMustBeFuture: 'Waktu mulai harus di masa depan', + invalidTimeFormat: 'Format waktu tidak valid (diharapkan HH:MM AM/PM)', + invalidWeekday: 'Hari kerja tidak valid: {{weekday}}', + invalidMonthlyDay: 'Hari bulanan harus antara 1-31 atau "terakhir"', + invalidOnMinute: 'Menit harus berada di antara 0-59', + invalidExecutionTime: 'Waktu eksekusi tidak valid', + executionTimeMustBeFuture: 'Waktu eksekusi harus di masa depan', + }, + triggerWebhook: { + title: 'Pemicu Webhook', + nodeTitle: '🔗 Pemicu Webhook', + configPlaceholder: 'Konfigurasi pemicu webhook akan diterapkan di sini', + webhookUrl: 'URL Webhook', + webhookUrlPlaceholder: 'Klik buat untuk membuat URL webhook', + generate: 'Hasilkan', + copy: 'Salin', + test: 'Tes', + urlGenerated: 'URL Webhook berhasil dibuat', + urlGenerationFailed: 'Gagal membuat URL webhook', + urlCopied: 'URL disalin ke papan klip', + method: 'Metode', + contentType: 'Jenis Konten', + queryParameters: 'Parameter Kueri', + headerParameters: 'Parameter Header', + requestBodyParameters: 'Parameter Body Permintaan', + parameterName: 'Nama variabel', + varName: 'Nama variabel', + varType: 'Jenis', + varNamePlaceholder: 'Masukkan nama variabel...', + required: 'Diperlukan', + addParameter: 'Tambahkan', + addHeader: 'Tambahkan', + noParameters: 'Tidak ada parameter yang dikonfigurasi', + noQueryParameters: 'Tidak ada parameter kueri yang dikonfigurasi', + noHeaders: 'Tidak ada header yang dikonfigurasi', + noBodyParameters: 'Tidak ada parameter tubuh yang dikonfigurasi', + debugUrlTitle: 'Untuk percobaan, selalu gunakan URL ini', + debugUrlCopy: 'Klik untuk menyalin', + debugUrlCopied: 'Disalin!', + debugUrlPrivateAddressWarning: 'URL ini tampaknya merupakan alamat internal, yang mungkin menyebabkan permintaan webhook gagal. Anda dapat mengubah TRIGGER_URL ke alamat publik.', + errorHandling: 'Penanganan Kesalahan', + errorStrategy: 'Penanganan Kesalahan', + responseConfiguration: 'Tanggapan', + asyncMode: 'Mode Asinkron', + statusCode: 'Kode Status', + responseBody: 'Isi Tanggapan', + responseBodyPlaceholder: 'Tulis isi tanggapan Anda di sini', + headers: 'Header', + validation: { + webhookUrlRequired: 'URL Webhook diperlukan', + invalidParameterType: 'Tipe parameter "{{type}}" tidak valid untuk parameter "{{name}}"', + }, + }, + }, + tracing: { + stopBy: 'Singgah di {{user}}', }, - tracing: {}, versionHistory: { filter: { empty: 'Tidak ada riwayat versi yang cocok ditemukan', @@ -953,6 +1159,8 @@ const translation = { editField: { releaseNotes: 'Catatan Rilis', title: 'Titel', + titleLengthLimit: 'Judul tidak boleh melebihi {{limit}} karakter', + releaseNotesLengthLimit: 'Catatan rilis tidak boleh melebihi {{limit}} karakter', }, action: { copyIdSuccess: 'ID disalin ke clipboard', @@ -1003,6 +1211,18 @@ const translation = { largeDataNoExport: 'Data besar - hanya pratinjau sebagian', exportToolTip: 'Ekspor Variabel sebagai File', largeData: 'Data besar, pratinjau baca-saja. Ekspor untuk melihat semua.', + listening: { + title: 'Mendengarkan peristiwa dari pemicu...', + tip: 'Sekarang Anda dapat mensimulasikan pemicu acara dengan mengirim permintaan uji ke endpoint HTTP {{nodeName}} atau menggunakannya sebagai URL callback untuk debugging acara secara langsung. Semua output dapat dilihat langsung di Variable Inspector.', + tipPlugin: 'Sekarang Anda dapat membuat acara di {{- pluginName}}, dan mengambil hasil dari acara ini di Inspektur Variabel.', + tipSchedule: 'Mendengarkan acara dari pemicu jadwal.\nJalankan berikutnya yang dijadwalkan: {{nextTriggerTime}}', + tipFallback: 'Tunggu event pemicu yang masuk. Output akan muncul di sini.', + defaultNodeName: 'pemicu ini', + defaultPluginName: 'pemicu plugin ini', + defaultScheduleTime: 'Belum dikonfigurasi', + selectedTriggers: 'pemicu yang dipilih', + stopButton: 'Berhenti', + }, }, relations: { noDependents: 'Tidak ada tanggungan', @@ -1020,11 +1240,52 @@ const translation = { relationsTab: 'Hubungan', lastOutput: 'Keluaran Terakhir', noLastRunFound: 'Tidak ada eksekusi sebelumnya ditemukan', + lastRunInputsCopied: '{{count}} input yang disalin dari proses terakhir', }, sidebar: { exportWarning: 'Ekspor Versi Tersimpan Saat Ini', exportWarningDesc: 'Ini akan mengekspor versi terkini dari alur kerja Anda yang telah disimpan. Jika Anda memiliki perubahan yang belum disimpan di editor, harap simpan terlebih dahulu dengan menggunakan opsi ekspor di kanvas alur kerja.', }, + publishLimit: { + startNodeTitlePrefix: 'Tingkatkan ke', + startNodeTitleSuffix: 'buka kunci pemicu tak terbatas per alur kerja', + startNodeDesc: 'Anda telah mencapai batas 2 pemicu per alur kerja untuk paket ini. Tingkatkan paket untuk mempublikasikan alur kerja ini.', + }, + error: { + startNodeRequired: 'Silakan tambahkan node awal terlebih dahulu sebelum {{operation}}', + operations: { + connectingNodes: 'menghubungkan node', + addingNodes: 'menambahkan node', + modifyingWorkflow: 'memodifikasi alur kerja', + updatingWorkflow: 'memperbarui alur kerja', + }, + }, + customWebhook: 'Webhook Kustom', + difyTeam: 'Tim Dify', + triggerStatus: { + enabled: 'PEICU', + disabled: 'PEICU • DINONAKTIFKAN', + }, + entryNodeStatus: { + enabled: 'MULAI', + disabled: 'MULAI • NONAKTIF', + }, + onboarding: { + title: 'Pilih node awal untuk memulai', + description: 'Node awal yang berbeda memiliki kemampuan yang berbeda. Jangan khawatir, kamu selalu bisa mengubahnya nanti.', + userInputFull: 'Input Pengguna (node awal asli)', + userInputDescription: 'Node awal yang memungkinkan pengaturan variabel input pengguna, dengan aplikasi web, API layanan, server MCP, dan alur kerja sebagai kemampuan alat.', + trigger: 'Pemicu', + triggerDescription: 'Pemicu dapat berfungsi sebagai node awal dari alur kerja, seperti tugas terjadwal, webhook kustom, atau integrasi dengan aplikasi lain.', + back: 'Kembali', + learnMore: 'Pelajari lebih lanjut', + aboutStartNode: 'tentang node awal.', + escTip: { + press: 'Tekan', + key: 'esc', + toDismiss: 'memberhentikan', + }, + }, } export default translation diff --git a/web/i18n/it-IT/app-debug.ts b/web/i18n/it-IT/app-debug.ts index baa58098dd..ecae1f3a2e 100644 --- a/web/i18n/it-IT/app-debug.ts +++ b/web/i18n/it-IT/app-debug.ts @@ -354,6 +354,7 @@ const translation = { 'single-file': 'File singolo', 'uploadFileTypes': 'Caricare i tipi di file', 'maxNumberOfUploads': 'Numero massimo di caricamenti', + 'maxNumberTip': 'Documento < {{docLimit}}, immagine < {{imgLimit}}, audio < {{audioLimit}}, video < {{videoLimit}}', 'multi-files': 'Elenco file', 'both': 'Ambedue', 'localUpload': 'Caricamento locale', diff --git a/web/i18n/it-IT/app-log.ts b/web/i18n/it-IT/app-log.ts index 4862898a21..1fddb2e7e9 100644 --- a/web/i18n/it-IT/app-log.ts +++ b/web/i18n/it-IT/app-log.ts @@ -20,6 +20,7 @@ const translation = { tokens: 'TOKEN', user: 'UTENTE FINALE O ACCOUNT', version: 'VERSIONE', + triggered_from: 'ATTIVATO DA', }, pagination: { previous: 'Prec', @@ -101,6 +102,15 @@ const translation = { finalProcessing: 'Elaborazione Finale', }, dateFormat: 'GG/MM/AAAA', + triggerBy: { + debugging: 'Debugging', + appRun: 'WebApp', + webhook: 'Webhook', + schedule: 'Programma', + plugin: 'Plugin', + ragPipelineRun: 'Pipeline RAG', + ragPipelineDebugging: 'Debugging RAG', + }, } export default translation diff --git a/web/i18n/it-IT/app-overview.ts b/web/i18n/it-IT/app-overview.ts index 513740e0ee..8d82ee591d 100644 --- a/web/i18n/it-IT/app-overview.ts +++ b/web/i18n/it-IT/app-overview.ts @@ -127,7 +127,11 @@ const translation = { }, }, launch: 'Lanciare', - enableTooltip: {}, + enableTooltip: { + description: 'Per abilitare questa funzione, aggiungi un nodo di input utente alla tela. (Potrebbe già esistere nella bozza, efficace dopo la pubblicazione)', + learnMore: 'Scopri di più', + }, + title: 'App Web', }, apiInfo: { title: 'API del servizio backend', @@ -139,7 +143,14 @@ const translation = { running: 'In servizio', disable: 'Disabilita', }, - triggerInfo: {}, + triggerInfo: { + title: 'Inneschi', + explanation: 'Gestione dei trigger del flusso di lavoro', + triggersAdded: 'Trigger aggiunti', + noTriggerAdded: 'Nessun trigger aggiunto', + triggerStatusDescription: 'Lo stato del nodo trigger appare qui. (Può già esistere in bozza, prende effetto dopo la pubblicazione)', + learnAboutTriggers: 'Scopri i Trigger', + }, disableTooltip: { triggerMode: 'La funzionalità {{feature}} non è supportata in modalità Nodo Trigger.', }, diff --git a/web/i18n/it-IT/billing.ts b/web/i18n/it-IT/billing.ts index 01c7a6abc0..2ec5b62fe5 100644 --- a/web/i18n/it-IT/billing.ts +++ b/web/i18n/it-IT/billing.ts @@ -106,6 +106,8 @@ const translation = { triggerEvents: { unlimited: 'Eventi di attivazione illimitati', tooltip: 'Il numero di eventi che avviano automaticamente i flussi di lavoro tramite trigger Plugin, Pianificazione o Webhook.', + sandbox: '{{count,number}} Eventi di attivazione', + professional: '{{count,number}} Eventi attivati/mese', }, workflowExecution: { priority: 'Esecuzione del flusso di lavoro prioritario', @@ -115,6 +117,11 @@ const translation = { }, startNodes: { unlimited: 'Eventi di attivazione/workflow illimitati', + limited: 'Fino a {{count}} trigger/workflow', + }, + title: { + plans: 'piani', + description: 'Seleziona il piano che meglio si adatta alle esigenze del tuo team.', }, }, plans: { @@ -140,16 +147,14 @@ const translation = { description: 'Ottieni tutte le capacità e il supporto per sistemi mission-critical su larga scala.', includesTitle: 'Tutto nel piano Team, più:', - features: { - }, + features: ['Soluzioni di Distribuzione Scalabili di Classe Aziendale', 'Autorizzazione alla Licenza Commerciale', 'Funzionalità Esclusive per le Aziende', 'Molteplici Spazi di Lavoro e Gestione Aziendale', 'SSO', 'SLA negoziati dai partner Dify', 'Sicurezza e Controlli Avanzati', 'Aggiornamenti e manutenzione ufficiali di Dify', 'Assistenza Tecnica Professionale'], price: 'Personalizzato', for: 'Per team di grandi dimensioni', btnText: 'Contatta le vendite', priceTip: 'Solo fatturazione annuale', }, community: { - features: { - }, + features: ['Tutte le funzionalità principali rilasciate nel repository pubblico', 'Spazio di lavoro singolo', 'Conforme alla Licenza Open Source Dify'], name: 'Comunità', btnText: 'Inizia con la comunità', includesTitle: 'Caratteristiche Gratuite:', @@ -158,8 +163,7 @@ const translation = { for: 'Per utenti individuali, piccole squadre o progetti non commerciali', }, premium: { - features: { - }, + features: ['Affidabilità Autogestita dai Vari Provider Cloud', 'Spazio di lavoro singolo', 'Personalizzazione del Logo e del Marchio dell\'App Web', 'Assistenza Prioritaria via Email e Chat'], name: 'Premium', priceTip: 'Basato su Cloud Marketplace', includesTitle: 'Tutto dalla Community, oltre a:', @@ -195,6 +199,7 @@ const translation = { vectorSpaceTooltip: 'I documenti con la modalità di indicizzazione ad alta qualità consumeranno risorse di Knowledge Data Storage. Quando il Knowledge Data Storage raggiunge il limite, nuovi documenti non verranno caricati.', perMonth: 'al mese', triggerEvents: 'Eventi di attivazione', + resetsIn: 'Si resetta tra {{count,number}} giorni', }, teamMembers: 'Membri del team', triggerLimitModal: { diff --git a/web/i18n/it-IT/common.ts b/web/i18n/it-IT/common.ts index 4f14727b10..4974408583 100644 --- a/web/i18n/it-IT/common.ts +++ b/web/i18n/it-IT/common.ts @@ -65,6 +65,12 @@ const translation = { yes: 'Sì', confirmAction: 'Per favore conferma la tua azione.', deleteConfirmTitle: 'Eliminare?', + noSearchResults: 'Nessun {{content}} è stato trovato', + resetKeywords: 'Reimposta parole chiave', + selectCount: '{{count}} Selezionato', + searchCount: 'Trova {{count}} {{content}}', + noSearchCount: '0 {{content}}', + now: 'Adesso', }, errorMsg: { fieldRequired: '{{field}} è obbligatorio', @@ -73,6 +79,7 @@ const translation = { placeholder: { input: 'Per favore inserisci', select: 'Per favore seleziona', + search: 'Cerca...', }, voice: { language: { @@ -799,6 +806,13 @@ const translation = { label: { optional: '(Facoltativo)', }, + noData: 'Nessun dato', + dynamicSelect: { + error: 'Caricamento delle opzioni non riuscito', + noData: 'Nessuna opzione disponibile', + loading: 'Caricamento opzioni...', + selected: '{{count}} selezionato', + }, } export default translation diff --git a/web/i18n/it-IT/dataset-documents.ts b/web/i18n/it-IT/dataset-documents.ts index c7354a8820..67c47288be 100644 --- a/web/i18n/it-IT/dataset-documents.ts +++ b/web/i18n/it-IT/dataset-documents.ts @@ -82,7 +82,10 @@ const translation = { ok: 'OK', }, learnMore: 'Ulteriori informazioni', - sort: {}, + sort: { + uploadTime: 'Ora di caricamento', + hitCount: 'Conteggio Recuperi', + }, }, metadata: { title: 'Metadati', diff --git a/web/i18n/it-IT/dataset-pipeline.ts b/web/i18n/it-IT/dataset-pipeline.ts index f3983bfdaa..acf8859db1 100644 --- a/web/i18n/it-IT/dataset-pipeline.ts +++ b/web/i18n/it-IT/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'Pipeline di conoscenza pubblicata', + tip: 'Vai a Documenti per aggiungere o gestire i documenti.', }, error: { message: 'Impossibile pubblicare la pipeline delle conoscenze', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'Struttura', structureTooltip: 'La struttura a blocchi determina il modo in cui i documenti vengono suddivisi e indicizzati, offrendo le modalità Generale, Padre-Figlio e Domande e risposte, ed è univoca per ogni knowledge base.', + createdBy: 'Da {{author}}', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { characters: 'personaggi', title: 'Aggiungi documenti', backToDataSource: 'Origine dati', + selectOnlineDocumentTip: 'Elabora fino a {{count}} pagine', + selectOnlineDriveTip: 'Elabora fino a {{count}} file, massimo {{fileSize}} MB ciascuno', }, documentSettings: { title: 'Impostazioni documento', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} pagine', + }, onlineDrive: { breadcrumbs: { allFiles: 'Tutti i file', searchPlaceholder: 'Cerca file...', allBuckets: 'Tutti i bucket di archiviazione cloud', + searchResult: 'Trova {{searchResultsLength}} elementi nella cartella "{{folderName}}"', }, emptyFolder: 'Questa cartella è vuota', resetKeywords: 'Reimposta le parole chiave', emptySearchResult: 'Nessun oggetto trovato', notSupportedFileType: 'Questo tipo di file non è supportato', + notConnected: '{{name}} non è connesso', + notConnectedTip: 'Per sincronizzarsi con {{name}}, è necessario prima stabilire la connessione a {{name}}.', + }, + credentialSelector: { + name: '{{credentialName}}\'s {{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { content: 'Questa azione è permanente. Non sarà possibile ripristinare il metodo precedente. Si prega di confermare per convertire.', @@ -149,6 +160,7 @@ const translation = { pipelineNameAndIcon: 'Nome e icona della pipeline', knowledgeNameAndIconPlaceholder: 'Inserisci il nome della Knowledge Base', knowledgeDescriptionPlaceholder: 'Descrivi cosa c\'è in questa Knowledge Base. Una descrizione dettagliata consente all\'intelligenza artificiale di accedere al contenuto del set di dati in modo più accurato. Se vuoto, Dify utilizzerà la strategia di hit predefinita. (Facoltativo)', + configurationTip: 'Configura {{pluginName}}', } export default translation diff --git a/web/i18n/it-IT/dataset.ts b/web/i18n/it-IT/dataset.ts index b874ff2f2e..709ffc635c 100644 --- a/web/i18n/it-IT/dataset.ts +++ b/web/i18n/it-IT/dataset.ts @@ -239,6 +239,10 @@ const translation = { title: 'API di servizio', enabled: 'In servizio', }, + docAllEnabled_one: '{{count}} documento abilitato', + docAllEnabled_other: 'Tutti i documenti {{count}} abilitati', + partialEnabled_one: 'Totale di {{count}} documenti, {{num}} disponibili', + partialEnabled_other: 'Totale di {{count}} documenti, {{num}} disponibili', } export default translation diff --git a/web/i18n/it-IT/education.ts b/web/i18n/it-IT/education.ts index 34ea8194f0..4f15792d0e 100644 --- a/web/i18n/it-IT/education.ts +++ b/web/i18n/it-IT/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: 'Non preoccuparti — ciò non influenzerà il tuo abbonamento attuale, ma non otterrai lo sconto per l\'istruzione al momento del rinnovo a meno che tu non verifichi nuovamente il tuo stato.', + title: 'Il tuo stato educativo scadrà il {{date}}', }, stillInEducation: { title: 'Ancora in formazione?', diff --git a/web/i18n/it-IT/pipeline.ts b/web/i18n/it-IT/pipeline.ts index 36131f5253..64014b4d1f 100644 --- a/web/i18n/it-IT/pipeline.ts +++ b/web/i18n/it-IT/pipeline.ts @@ -28,10 +28,12 @@ const translation = { loading: 'Elaborazione... Attendere prego', error: 'Si è verificato un errore durante l\'esecuzione', viewDetails: 'Mostra dettagli', + footerTip: 'In modalità di test, anteprima di fino a {{count}} frammenti', }, }, ragToolSuggestions: { title: 'Suggerimenti per RAG', + noRecommendationPlugins: 'Nessun plugin consigliato, trova di più in Marketplace', }, } diff --git a/web/i18n/it-IT/plugin-trigger.ts b/web/i18n/it-IT/plugin-trigger.ts new file mode 100644 index 0000000000..c09dfb7bf2 --- /dev/null +++ b/web/i18n/it-IT/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'Abbonamenti', + listNum: 'abbonamenti {{num}}', + empty: { + title: 'Nessun abbonamento', + button: 'Nuovo abbonamento', + }, + createButton: { + oauth: 'Nuovo abbonamento con OAuth', + apiKey: 'Nuovo abbonamento con chiave API', + manual: 'Incolla l\'URL per creare un nuovo abbonamento', + }, + createSuccess: 'Abbonamento creato con successo', + createFailed: 'Impossibile creare l\'abbonamento', + maxCount: 'Max {{num}} abbonamenti', + selectPlaceholder: 'Seleziona abbonamento', + noSubscriptionSelected: 'Nessun abbonamento selezionato', + subscriptionRemoved: 'Abbonamento rimosso', + list: { + title: 'Abbonamenti', + addButton: 'Aggiungi', + tip: 'Ricevi eventi tramite Sottoscrizione', + item: { + enabled: 'Abilitato', + disabled: 'Disabilitato', + credentialType: { + api_key: 'Chiave API', + oauth2: 'OAuth', + unauthorized: 'Manuale', + }, + actions: { + delete: 'Elimina', + deleteConfirm: { + title: 'Eliminare {{name}}?', + success: 'Abbonamento {{name}} eliminato con successo', + error: 'Impossibile eliminare l\'abbonamento {{name}}', + content: 'Una volta eliminato, questo abbonamento non può essere recuperato. Si prega di confermare.', + contentWithApps: 'L\'abbonamento attuale è referenziato da {{count}} applicazioni. La sua cancellazione farà sì che le applicazioni configurate smettano di ricevere gli eventi dell\'abbonamento.', + confirm: 'Conferma eliminazione', + cancel: 'Annulla', + confirmInputWarning: 'Per favore inserisci il nome corretto per confermare.', + confirmInputPlaceholder: 'Inserisci "{{name}}" per confermare.', + confirmInputTip: 'Per favore inserisci “{{name}}” per confermare.', + }, + }, + status: { + active: 'Attivo', + inactive: 'Inattivo', + }, + usedByNum: 'Utilizzato da {{num}} flussi di lavoro', + noUsed: 'Nessun flusso di lavoro utilizzato', + }, + }, + addType: { + title: 'Aggiungi abbonamento', + description: 'Scegli come vuoi creare il tuo abbonamento al trigger', + options: { + apikey: { + title: 'Crea con chiave API', + description: 'Crea automaticamente un abbonamento utilizzando le credenziali API', + }, + oauth: { + title: 'Crea con OAuth', + description: 'Autorizza con una piattaforma di terze parti per creare un abbonamento', + clientSettings: 'Impostazioni del client OAuth', + clientTitle: 'Client OAuth', + default: 'Predefinito', + custom: 'Personalizzato', + }, + manual: { + title: 'Configurazione manuale', + description: 'Incolla l\'URL per creare un nuovo abbonamento', + tip: 'Configura manualmente l\'URL sulla piattaforma di terze parti', + }, + }, + }, + }, + modal: { + steps: { + verify: 'Verifica', + configuration: 'Configurazione', + }, + common: { + cancel: 'Annulla', + back: 'Indietro', + next: 'Avanti', + create: 'Crea', + verify: 'Verifica', + authorize: 'Autorizzare', + creating: 'Creazione...', + verifying: 'Verifica in corso...', + authorizing: 'Autorizzazione in corso...', + }, + oauthRedirectInfo: 'Poiché non sono stati trovati segreti client di sistema per questo provider di strumenti, è necessario configurarlo manualmente; per redirect_uri, si prega di utilizzare', + apiKey: { + title: 'Crea con chiave API', + verify: { + title: 'Verifica credenziali', + description: 'Fornisci le tue credenziali API per verificare l\'accesso', + error: 'Verifica delle credenziali fallita. Controlla la tua chiave API.', + success: 'Credenziali verificate con successo', + }, + configuration: { + title: 'Configura abbonamento', + description: 'Imposta i parametri del tuo abbonamento', + }, + }, + oauth: { + title: 'Crea con OAuth', + authorization: { + title: 'Autorizzazione OAuth', + description: 'Autorizza Dify ad accedere al tuo account', + redirectUrl: 'URL di reindirizzamento', + redirectUrlHelp: 'Utilizza questo URL nella configurazione della tua app OAuth', + authorizeButton: 'Autorizza con {{provider}}', + waitingAuth: 'In attesa di autorizzazione...', + authSuccess: 'Autorizzazione riuscita', + authFailed: 'Impossibile ottenere le informazioni di autorizzazione OAuth', + waitingJump: 'Autorizzato, in attesa del salto', + }, + configuration: { + title: 'Configura abbonamento', + description: 'Configura i parametri del tuo abbonamento dopo l\'autorizzazione', + success: 'Configurazione OAuth completata con successo', + failed: 'Configurazione OAuth non riuscita', + }, + remove: { + success: 'Rimozione di OAuth riuscita', + failed: 'Rimozione OAuth fallita', + }, + save: { + success: 'Configurazione OAuth salvata con successo', + }, + }, + manual: { + title: 'Configurazione manuale', + description: 'Configura manualmente il tuo abbonamento al webhook', + logs: { + title: 'Registro delle richieste', + request: 'Richiesta', + loading: 'In attesa della richiesta da {{pluginName}}...', + }, + }, + form: { + subscriptionName: { + label: 'Nome dell\'abbonamento', + placeholder: 'Inserisci il nome dell\'abbonamento', + required: 'Il nome dell\'abbonamento è obbligatorio', + }, + callbackUrl: { + label: 'URL di richiamata', + description: 'Questa URL riceverà eventi webhook', + tooltip: 'Fornire un endpoint accessibile pubblicamente che possa ricevere richieste di callback dal fornitore del trigger.', + placeholder: 'Generazione...', + privateAddressWarning: 'Questo URL sembra essere un indirizzo interno, il che potrebbe causare il fallimento delle richieste webhook. Puoi modificare TRIGGER_URL con un indirizzo pubblico.', + }, + }, + errors: { + createFailed: 'Impossibile creare l\'abbonamento', + verifyFailed: 'Impossibile verificare le credenziali', + authFailed: 'Autorizzazione fallita', + networkError: 'Errore di rete, riprova', + }, + }, + events: { + title: 'Eventi disponibili', + description: 'Eventi a cui questo plugin trigger può iscriversi', + empty: 'Nessun evento disponibile', + event: 'Evento', + events: 'Eventi', + actionNum: '{{num}} {{event}} INCLUSO', + item: { + parameters: 'parametri {{count}}', + noParameters: 'Nessun parametro', + }, + output: 'Uscita', + }, + node: { + status: { + warning: 'Disconnetti', + }, + }, +} + +export default translation diff --git a/web/i18n/it-IT/plugin.ts b/web/i18n/it-IT/plugin.ts index ecf1b37808..ac5deb2ed3 100644 --- a/web/i18n/it-IT/plugin.ts +++ b/web/i18n/it-IT/plugin.ts @@ -7,6 +7,7 @@ const translation = { models: 'Modelli', all: 'Tutto', datasources: 'Fonti dei dati', + triggers: 'Trigger', }, categorySingle: { bundle: 'Fascio', @@ -15,6 +16,7 @@ const translation = { extension: 'Estensione', tool: 'Strumento', datasource: 'Origine dati', + trigger: 'Innescare', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { viewDetail: 'vedi dettagli', checkUpdate: 'Controlla l\'aggiornamento', info: 'Informazioni sul plugin', + back: 'Indietro', }, toolSelector: { paramsTip1: 'Controlla i parametri di inferenza LLM.', @@ -306,6 +309,12 @@ const translation = { excludeUpdate: 'I seguenti {{num}} plugin non si aggiorneranno automaticamente', updateTimeTitle: 'Tempo di aggiornamento', }, + readmeInfo: { + title: 'LEGGIMI', + needHelpCheckReadme: 'Hai bisogno di aiuto? Controlla il README.', + noReadmeAvailable: 'Nessun README disponibile', + failedToFetch: 'Impossibile recuperare il README', + }, } export default translation diff --git a/web/i18n/it-IT/workflow.ts b/web/i18n/it-IT/workflow.ts index b188bc3666..5f506285ed 100644 --- a/web/i18n/it-IT/workflow.ts +++ b/web/i18n/it-IT/workflow.ts @@ -117,6 +117,15 @@ const translation = { currentWorkflow: 'Flusso di lavoro corrente', currentView: 'Vista corrente', moreActions: 'Altre azioni', + listening: 'Ascoltando', + chooseStartNodeToRun: 'Scegli il nodo di partenza da eseguire', + runAllTriggers: 'Esegui tutti i trigger', + features: 'Caratteristiche', + featuresDescription: 'Migliorare l\'esperienza utente dell\'app web', + featuresDocLink: 'Scopri di più', + needAdd: 'È necessario aggiungere il nodo {{node}}', + needStartNode: 'Deve essere aggiunto almeno un nodo iniziale', + workflowAsToolDisabledHint: 'Pubblica il flusso di lavoro più recente e assicurati che ci sia un nodo di Input Utente collegato prima di configurarlo come strumento.', }, env: { envPanelTitle: 'Variabili d\'Ambiente', @@ -224,6 +233,7 @@ const translation = { rerankModelRequired: 'Prima di attivare il modello di reranking, conferma che il modello è stato configurato correttamente nelle impostazioni.', toolParameterRequired: '{{field}}: il parametro [{{param}}] è obbligatorio', noValidTool: '{{field}} nessuno strumento valido selezionato', + startNodeRequired: 'Per favore aggiungi prima un nodo iniziale prima di {{operation}}', }, singleRun: { testRun: 'Esecuzione Test ', @@ -255,6 +265,21 @@ const translation = { 'addAll': 'Aggiungi tutto', 'sources': 'Fonti', 'searchDataSource': 'Cerca origine dati', + 'start': 'Inizia', + 'searchTrigger': 'Trigger di ricerca...', + 'allTriggers': 'Tutti i trigger', + 'noPluginsFound': 'Nessun plugin trovato', + 'requestToCommunity': 'Richieste alla comunità', + 'featuredTools': 'In evidenza', + 'showMoreFeatured': 'Mostra di più', + 'showLessFeatured': 'Mostra di meno', + 'installed': 'Installato', + 'pluginByAuthor': 'Da {{author}}', + 'usePlugin': 'Strumento di selezione', + 'hideActions': 'Nascondi strumenti', + 'noFeaturedPlugins': 'Scopri altri strumenti nel Marketplace', + 'noFeaturedTriggers': 'Scopri altri trigger nel Marketplace', + 'startDisabledTip': 'Il nodo di attivazione e il nodo di input utente sono mutualmente esclusivi.', }, blocks: { 'start': 'Inizio', @@ -281,6 +306,10 @@ const translation = { 'loop': 'Anello', 'knowledge-index': 'Knowledge base', 'datasource': 'Origine dati', + 'originalStartNode': 'nodo iniziale originale', + 'trigger-schedule': 'Trigger di pianificazione', + 'trigger-webhook': 'Trigger Webhook', + 'trigger-plugin': 'Attivatore del plugin', }, blocksAbout: { 'start': 'Definisci i parametri iniziali per l\'avvio di un flusso di lavoro', @@ -314,6 +343,9 @@ const translation = { 'loop': 'Esegui un ciclo di logica fino a quando la condizione di terminazione non viene soddisfatta o il numero massimo di cicli viene raggiunto.', 'datasource': 'Origine dati Informazioni', 'knowledge-index': 'Base di conoscenza su', + 'trigger-schedule': 'Trigger di flusso di lavoro basato sul tempo che avvia i flussi di lavoro secondo un programma', + 'trigger-webhook': 'Il Webhook Trigger riceve invii HTTP da sistemi di terze parti per attivare automaticamente i flussi di lavoro.', + 'trigger-plugin': 'Trigger di integrazione di terze parti che avvia flussi di lavoro da eventi di piattaforme esterne', }, operator: { zoomIn: 'Zoom In', @@ -355,6 +387,8 @@ const translation = { maximize: 'Massimizza Canvas', scrollToSelectedNode: 'Scorri fino al nodo selezionato', optional_and_hidden: '(opzionale e nascosto)', + goTo: 'Vai a', + startNode: 'Nodo iniziale', }, nodes: { common: { @@ -813,6 +847,8 @@ const translation = { comma: ',', parallelPanelDesc: 'In modalità parallela, le attività nell\'iterazione supportano l\'esecuzione parallela.', answerNodeWarningDesc: 'Avviso in modalità parallela: i nodi di risposta, le assegnazioni di variabili di conversazione e le operazioni di lettura/scrittura persistenti all\'interno delle iterazioni possono causare eccezioni.', + flattenOutput: 'Appiattisci output', + flattenOutputDesc: 'Quando abilitato, se tutti i risultati delle iterazioni sono array, saranno uniti in un unico array. Quando disabilitato, i risultati manterranno una struttura di array nidificati.', }, note: { addNote: 'Aggiungi Nota', @@ -989,6 +1025,144 @@ const translation = { embeddingModelIsInvalid: 'Il modello di embedding non è valido', rerankingModelIsInvalid: 'Il modello di riorganizzazione è non valido', }, + triggerPlugin: { + authorized: 'Autorizzato', + notConfigured: 'Non configurato', + notAuthorized: 'Non autorizzato', + selectSubscription: 'Seleziona abbonamento', + availableSubscriptions: 'Abbonamenti disponibili', + addSubscription: 'Aggiungi Nuovo Abbonamento', + removeSubscription: 'Rimuovi abbonamento', + subscriptionRemoved: 'Abbonamento rimosso con successo', + error: 'Errore', + configuration: 'Configurazione', + remove: 'Rimuovi', + or: 'O', + useOAuth: 'Usa OAuth', + useApiKey: 'Usa la chiave API', + authenticationFailed: 'Autenticazione fallita', + authenticationSuccess: 'Autenticazione riuscita', + oauthConfigFailed: 'La configurazione di OAuth è fallita', + configureOAuthClient: 'Configura client OAuth', + oauthClientDescription: 'Configura le credenziali del client OAuth per abilitare l\'autenticazione', + oauthClientSaved: 'Configurazione del client OAuth salvata con successo', + configureApiKey: 'Configura la chiave API', + apiKeyDescription: 'Configura le credenziali della chiave API per l\'autenticazione', + apiKeyConfigured: 'Chiave API configurata con successo', + configurationFailed: 'Configurazione non riuscita', + failedToStart: 'Impossibile avviare il processo di autenticazione', + credentialsVerified: 'Credenziali verificate con successo', + credentialVerificationFailed: 'Verifica delle credenziali non riuscita', + verifyAndContinue: 'Verifica e continua', + configureParameters: 'Configura Parametri', + parametersDescription: 'Configura i parametri e le proprietà del trigger', + configurationComplete: 'Configurazione completata', + configurationCompleteDescription: 'Il tuo trigger è stato configurato correttamente', + configurationCompleteMessage: 'La configurazione del tuo trigger è ora completa e pronta all\'uso.', + parameters: 'Parametri', + properties: 'Proprietà', + propertiesDescription: 'Proprietà di configurazione aggiuntive per questo trigger', + noConfigurationRequired: 'Nessuna configurazione aggiuntiva necessaria per questo trigger.', + subscriptionName: 'Nome dell\'abbonamento', + subscriptionNameDescription: 'Inserisci un nome univoco per questa sottoscrizione del trigger', + subscriptionNamePlaceholder: 'Inserisci il nome dell\'abbonamento...', + subscriptionNameRequired: 'Il nome dell\'abbonamento è obbligatorio', + subscriptionRequired: 'È necessario abbonarsi', + }, + triggerSchedule: { + title: 'Programma', + nodeTitle: 'Attivatore della pianificazione', + notConfigured: 'Non configurato', + useCronExpression: 'Usa un\'espressione cron', + useVisualPicker: 'Usa il selettore visivo', + frequency: { + label: 'FREQUENZA', + hourly: 'orario', + daily: 'Quotidiano', + weekly: 'Settimanale', + monthly: 'Mensile', + }, + selectFrequency: 'Seleziona frequenza', + frequencyLabel: 'Frequenza', + nextExecution: 'Prossima esecuzione', + weekdays: 'Giorni della settimana', + time: 'Tempo', + cronExpression: 'Espressione Cron', + nextExecutionTime: 'PROSSIMA ORA DI ESECUZIONE', + nextExecutionTimes: 'Prossimi 5 tempi di esecuzione', + startTime: 'Orario di inizio', + executeNow: 'Esecuzione adesso', + selectDateTime: 'Seleziona Data e Ora', + hours: 'Ore', + minutes: 'Minuti', + onMinute: 'In un minuto', + days: 'Giorni', + lastDay: 'Ultimo giorno', + lastDayTooltip: 'Non tutti i mesi hanno 31 giorni. Usa l\'opzione \'ultimo giorno\' per selezionare l\'ultimo giorno di ogni mese.', + mode: 'Modalità', + timezone: 'Fuso orario', + visualConfig: 'Configurazione visiva', + monthlyDay: 'Giorno del mese', + executionTime: 'Tempo di esecuzione', + invalidTimezone: 'Fuso orario non valido', + invalidCronExpression: 'Espressione cron non valida', + noValidExecutionTime: 'Non è possibile calcolare un tempo di esecuzione valido', + executionTimeCalculationError: 'Impossibile calcolare i tempi di esecuzione', + invalidFrequency: 'Frequenza non valida', + invalidStartTime: 'Ora di inizio non valida', + startTimeMustBeFuture: 'L\'orario di inizio deve essere nel futuro', + invalidTimeFormat: 'Formato orario non valido (previsto HH:MM AM/PM)', + invalidWeekday: 'Giorno della settimana non valido: {{weekday}}', + invalidMonthlyDay: 'Il giorno del mese deve essere compreso tra 1 e 31 o \'ultimo\'', + invalidOnMinute: 'I minuti devono essere compresi tra 0 e 59', + invalidExecutionTime: 'Tempo di esecuzione non valido', + executionTimeMustBeFuture: 'Il tempo di esecuzione deve essere nel futuro', + }, + triggerWebhook: { + title: 'Trigger Webhook', + nodeTitle: '🔗 Trigger del Webhook', + configPlaceholder: 'La configurazione del trigger del webhook sarà implementata qui', + webhookUrl: 'URL del webhook', + webhookUrlPlaceholder: 'Fai clic su genera per creare l\'URL del webhook', + generate: 'Generare', + copy: 'Copia', + test: 'Test', + urlGenerated: 'URL del webhook generato con successo', + urlGenerationFailed: 'Impossibile generare l\'URL del webhook', + urlCopied: 'URL copiato negli appunti', + method: 'Metodo', + contentType: 'Tipo di contenuto', + queryParameters: 'Parametri di query', + headerParameters: 'Parametri dell\'intestazione', + requestBodyParameters: 'Parametri del corpo della richiesta', + parameterName: 'Nome della variabile', + varName: 'Nome della variabile', + varType: 'Tipo', + varNamePlaceholder: 'Inserisci il nome della variabile...', + required: 'Obbligatorio', + addParameter: 'Aggiungi', + addHeader: 'Aggiungi', + noParameters: 'Nessun parametro configurato', + noQueryParameters: 'Nessun parametro di query configurato', + noHeaders: 'Nessun header configurato', + noBodyParameters: 'Nessun parametro del corpo configurato', + debugUrlTitle: 'Per le prove, usa sempre questo URL', + debugUrlCopy: 'Clicca per copiare', + debugUrlCopied: 'Copiato!', + debugUrlPrivateAddressWarning: 'Questo URL sembra essere un indirizzo interno, il che potrebbe causare il fallimento delle richieste webhook. Puoi cambiare TRIGGER_URL con un indirizzo pubblico.', + errorHandling: 'Gestione degli errori', + errorStrategy: 'Gestione degli errori', + responseConfiguration: 'Risposta', + asyncMode: 'Modalità asincrona', + statusCode: 'Codice di stato', + responseBody: 'Corpo della risposta', + responseBodyPlaceholder: 'Scrivi qui il corpo della tua risposta', + headers: 'Intestazioni', + validation: { + webhookUrlRequired: 'L\'URL del webhook è obbligatorio', + invalidParameterType: 'Tipo di parametro non valido "{{type}}" per il parametro "{{name}}"', + }, + }, }, tracing: { stopBy: 'Interrotto da {{user}}', @@ -1063,6 +1237,18 @@ const translation = { largeData: 'Dati di grandi dimensioni, anteprima di sola lettura. Esporta per visualizzare tutto.', exportToolTip: 'Esporta variabile come file', largeDataNoExport: 'Dati di grandi dimensioni - solo anteprima parziale', + listening: { + title: 'In ascolto degli eventi dai trigger...', + tip: 'Ora puoi simulare i trigger degli eventi inviando richieste di prova all\'endpoint HTTP {{nodeName}} oppure usarlo come URL di callback per il debug degli eventi in tempo reale. Tutti i risultati possono essere visualizzati direttamente nel Visualizzatore di Variabili.', + tipPlugin: 'Ora puoi creare eventi in {{- pluginName}} e recuperare i risultati di questi eventi nell\'Ispettore Variabili.', + tipSchedule: 'Ascolto degli eventi dai trigger del programma.\nProssima esecuzione programmata: {{nextTriggerTime}}', + tipFallback: 'Attendere gli eventi trigger in arrivo. I risultati appariranno qui.', + defaultNodeName: 'questo trigger', + defaultPluginName: 'questo plugin attiva', + defaultScheduleTime: 'Non configurato', + selectedTriggers: 'trigger selezionati', + stopButton: 'Fermati', + }, }, settingsTab: 'Impostazioni', lastRunTab: 'Ultima corsa', @@ -1080,11 +1266,52 @@ const translation = { copyLastRunError: 'Impossibile copiare gli input dell\'ultima esecuzione', noLastRunFound: 'Nessuna esecuzione precedente trovata', lastOutput: 'Ultimo output', + lastRunInputsCopied: '{{count}} input copiato dall\'ultima esecuzione', }, sidebar: { exportWarning: 'Esporta la versione salvata corrente', exportWarningDesc: 'Questo exporterà l\'attuale versione salvata del tuo flusso di lavoro. Se hai modifiche non salvate nell\'editor, ti preghiamo di salvarle prima utilizzando l\'opzione di esportazione nel canvas del flusso di lavoro.', }, + publishLimit: { + startNodeTitlePrefix: 'Aggiorna a', + startNodeTitleSuffix: 'sblocca trigger illimitati per flusso di lavoro', + startNodeDesc: 'Hai raggiunto il limite di 2 trigger per flusso di lavoro per questo piano. Effettua l\'upgrade per pubblicare questo flusso di lavoro.', + }, + error: { + startNodeRequired: 'Per favore aggiungi prima un nodo iniziale prima di {{operation}}', + operations: { + connectingNodes: 'collegamento dei nodi', + addingNodes: 'aggiunta di nodi', + modifyingWorkflow: 'modifica del flusso di lavoro', + updatingWorkflow: 'aggiornamento del flusso di lavoro', + }, + }, + customWebhook: 'Webhook personalizzato', + difyTeam: 'Team Dify', + triggerStatus: { + enabled: 'GRILLETTO', + disabled: 'ATTIVATORE • DISABILITATO', + }, + entryNodeStatus: { + enabled: 'INIZIO', + disabled: 'AVVIO • DISABILITATO', + }, + onboarding: { + title: 'Seleziona un nodo di partenza per iniziare', + description: 'Nodi di partenza diversi hanno capacità diverse. Non preoccuparti, potrai sempre cambiarli più tardi.', + userInputFull: 'Input utente (nodo iniziale originale)', + userInputDescription: 'Nodo iniziale che consente di impostare variabili di input dell\'utente, con app web, API di servizio, server MCP e workflow come funzionalità degli strumenti.', + trigger: 'Innescare', + triggerDescription: 'I trigger possono fungere da nodo iniziale di un flusso di lavoro, come attività programmate, webhook personalizzati o integrazioni con altre app.', + back: 'Indietro', + learnMore: 'Scopri di più', + aboutStartNode: 'riguardo al nodo iniziale.', + escTip: { + press: 'Premi', + key: 'esc', + toDismiss: 'licenziare', + }, + }, } export default translation diff --git a/web/i18n/ja-JP/billing.ts b/web/i18n/ja-JP/billing.ts index 97c3dafb9b..1042591110 100644 --- a/web/i18n/ja-JP/billing.ts +++ b/web/i18n/ja-JP/billing.ts @@ -157,11 +157,7 @@ const translation = { price: '無料', btnText: 'コミュニティ版を始めましょう', includesTitle: '無料機能:', - features: [ - 'パブリックリポジトリの全コア機能', - 'シングルワークスペース', - 'Dify オープンソースライセンス準拠', - ], + features: ['パブリックリポジトリで公開されているすべてのコア機能', '単一ワークスペース', 'Dify オープンソースライセンスに準拠'], }, premium: { name: 'プレミアム', @@ -172,12 +168,7 @@ const translation = { btnText: 'プレミアム版を取得', includesTitle: 'コミュニティ版機能に加えて:', comingSoon: 'Microsoft Azure & Google Cloud 近日対応', - features: [ - 'クラウドプロバイダーによる自己管理', - 'シングルワークスペース', - 'Web アプリのロゴ&ブランドカスタマイズ', - '優先メール/チャットサポート', - ], + features: ['複数のクラウドプロバイダーでのセルフマネージド導入', '単一ワークスペース', 'Webアプリのロゴとブランディングをカスタマイズ', '優先メール/チャットサポート'], }, enterprise: { name: 'エンタープライズ', @@ -187,17 +178,7 @@ const translation = { priceTip: '年間契約専用', btnText: '営業に相談', includesTitle: 'プレミアム版機能に加えて:', - features: [ - 'エンタープライズ向け拡張ソリューション', - '商用ライセンス認可', - '企業専用機能', - 'マルチワークスペース管理', - 'シングルサインオン(SSO)', - 'Dify パートナーによる SLA 保証', - '高度なセキュリティ管理', - '公式メンテナンス&アップデート', - 'プロフェッショナル技術支援', - ], + features: ['エンタープライズ向けのスケーラブルなデプロイソリューション', '商用ライセンス認可', 'エンタープライズ専用機能', '複数ワークスペースとエンタープライズ管理', 'シングルサインオン(SSO)', 'Dify パートナーによる交渉済み SLA', '高度なセキュリティと制御', 'Dify 公式による更新とメンテナンス', 'プロフェッショナルな技術サポート'], }, }, vectorSpace: { diff --git a/web/i18n/ja-JP/common.ts b/web/i18n/ja-JP/common.ts index 53bb5301fe..984161a114 100644 --- a/web/i18n/ja-JP/common.ts +++ b/web/i18n/ja-JP/common.ts @@ -72,6 +72,11 @@ const translation = { no: 'いいえ', deleteConfirmTitle: '削除しますか?', confirmAction: '操作を確認してください。', + noSearchResults: '{{content}}は見つかりませんでした', + resetKeywords: 'キーワードをリセット', + selectCount: '{{count}}件選択済み', + searchCount: '{{count}}件の{{content}}が見つかりました', + noSearchCount: '0件の{{content}}', }, errorMsg: { fieldRequired: '{{field}}は必要です', @@ -80,6 +85,7 @@ const translation = { placeholder: { input: '入力してください', select: '選択してください', + search: '検索...', }, voice: { language: { @@ -770,6 +776,13 @@ const translation = { label: { optional: '(オプション)', }, + noData: 'データなし', + dynamicSelect: { + error: 'オプションの読み込みに失敗しました', + noData: '利用可能なオプションはありません', + loading: 'オプションを読み込み中...', + selected: '{{count}}件が選択されました', + }, } export default translation diff --git a/web/i18n/ja-JP/dataset-documents.ts b/web/i18n/ja-JP/dataset-documents.ts index 9f97a3fed8..c29c9c93ba 100644 --- a/web/i18n/ja-JP/dataset-documents.ts +++ b/web/i18n/ja-JP/dataset-documents.ts @@ -81,7 +81,10 @@ const translation = { error: 'インポートエラー', ok: 'OK', }, - sort: {}, + sort: { + uploadTime: 'アップロード時間', + hitCount: '取得回数', + }, }, metadata: { title: 'メタデータ', diff --git a/web/i18n/ja-JP/plugin-trigger.ts b/web/i18n/ja-JP/plugin-trigger.ts index a4f0a8c5df..c7453cff42 100644 --- a/web/i18n/ja-JP/plugin-trigger.ts +++ b/web/i18n/ja-JP/plugin-trigger.ts @@ -4,7 +4,6 @@ const translation = { listNum: '{{num}} サブスクリプション', empty: { title: 'サブスクリプションがありません', - description: 'イベントの受信を開始するために最初のサブスクリプションを作成してください', button: '新しいサブスクリプション', }, createButton: { @@ -33,6 +32,10 @@ const translation = { confirm: '削除', cancel: 'キャンセル', confirmInputWarning: '確認するために正しい名前を入力してください。', + success: 'サブスクリプション {{name}} は正常に削除されました', + error: 'サブスクリプション {{name}} の削除に失敗しました', + confirmInputPlaceholder: '確認するには「{{name}}」と入力してください。', + confirmInputTip: '確認のため「{{name}}」を入力してください。', }, }, status: { @@ -47,10 +50,6 @@ const translation = { title: 'サブスクリプションを追加', description: 'トリガーサブスクリプションの作成方法を選択してください', options: { - apiKey: { - title: 'API キー経由', - description: 'API 認証情報を使用してサブスクリプションを自動作成', - }, oauth: { title: 'OAuth 経由', description: 'サードパーティプラットフォームで認証してサブスクリプションを作成', @@ -75,6 +74,7 @@ const translation = { noSubscriptionSelected: 'サブスクリプションが選択されていません', selectPlaceholder: 'サブスクリプションを選択', createFailed: 'サブスクリプションの作成に失敗しました', + maxCount: '最大 {{num}} 件のサブスクリプション', }, modal: { steps: { @@ -137,31 +137,13 @@ const translation = { title: '手動設定', description: 'Webhook サブスクリプションを手動で設定', instruction: { - title: '設定手順', - step1: '1. 以下のコールバック URL をコピー', - step2: '2. サードパーティプラットフォームの Webhook 設定に移動', - step3: '3. コールバック URL を Webhook エンドポイントとして追加', - step4: '4. 受信したいイベントを設定', - step5: '5. イベントをトリガーして Webhook をテスト', - step6: '6. ここに戻って Webhook が動作していることを確認し、設定を完了', }, logs: { title: 'リクエストログ', - description: '受信 Webhook リクエストを監視', - empty: 'まだリクエストを受信していません。Webhook 設定をテストしてください。', status: { - success: '成功', - error: 'エラー', }, - expandAll: 'すべて展開', - collapseAll: 'すべて折りたたむ', - timestamp: 'タイムスタンプ', - method: 'メソッド', - path: 'パス', - headers: 'ヘッダー', - body: 'ボディ', - response: 'レスポンス', request: 'リクエスト', + loading: '{{pluginName}}からのリクエストを待っています...', }, }, form: { @@ -173,10 +155,8 @@ const translation = { callbackUrl: { label: 'コールバック URL', description: 'この URL で Webhook イベントを受信します', - copy: 'コピー', - copied: 'コピーしました!', placeholder: '生成中...', - privateAddressWarning: 'このURLは内部アドレスのようで、Webhookリクエストが失敗する可能性があります。', + privateAddressWarning: 'このURLは内部アドレスのようです。Webhookリクエストが失敗する可能性があります。TRIGGER_URL を公開アドレスに変更できます。', tooltip: 'トリガープロバイダーからのコールバックリクエストを受信できる、公開アクセス可能なエンドポイントを提供してください。', }, }, @@ -189,7 +169,7 @@ const translation = { }, events: { title: '利用可能なイベント', - description: 'このトリガープラグインが購読できるイベント', + description: 'このトリガープラグインがサブスクライブできるイベント', empty: '利用可能なイベントがありません', event: 'イベント', events: 'イベント', @@ -201,10 +181,6 @@ const translation = { output: '出力', }, provider: { - github: 'GitHub', - gitlab: 'GitLab', - notion: 'Notion', - webhook: 'Webhook', }, node: { status: { diff --git a/web/i18n/ja-JP/plugin.ts b/web/i18n/ja-JP/plugin.ts index f4eec17a82..3b7985668a 100644 --- a/web/i18n/ja-JP/plugin.ts +++ b/web/i18n/ja-JP/plugin.ts @@ -7,6 +7,7 @@ const translation = { agents: 'エージェント戦略', models: 'モデル', datasources: 'データソース', + triggers: 'トリガー', }, categorySingle: { agent: 'エージェント戦略', @@ -15,6 +16,7 @@ const translation = { tool: 'ツール', extension: '拡張', datasource: 'データソース', + trigger: 'トリガー', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { update: '更新', detail: '詳細', remove: '削除', + back: '戻る', }, toolSelector: { descriptionPlaceholder: 'ツールの目的の簡単な説明、例えば、特定の場所の温度を取得すること。', @@ -306,6 +309,12 @@ const translation = { specifyPluginsToUpdate: '更新するプラグインを指定してください', partialUPdate: '以下の{{num}}プラグインのみが自動更新されます', }, + readmeInfo: { + title: 'リードミー', + needHelpCheckReadme: '助けが必要ですか?READMEを確認してください。', + noReadmeAvailable: 'READMEは利用できません', + failedToFetch: 'README の取得に失敗しました', + }, } export default translation diff --git a/web/i18n/ja-JP/workflow.ts b/web/i18n/ja-JP/workflow.ts index 19b8d4eb3e..8644567d21 100644 --- a/web/i18n/ja-JP/workflow.ts +++ b/web/i18n/ja-JP/workflow.ts @@ -118,6 +118,10 @@ const translation = { noHistory: '履歴がありません', tagBound: 'このタグを使用しているアプリの数', moreActions: 'さらにアクション', + listening: 'リッスン中', + features: '機能', + featuresDescription: 'ウェブアプリのユーザー体験を向上させる', + featuresDocLink: 'もっと詳しく知る', }, publishLimit: { startNodeTitlePrefix: 'アップグレードして、', @@ -282,6 +286,13 @@ const translation = { 'sources': 'ソース', 'start': '始める', 'startDisabledTip': 'トリガーノードとユーザー入力ノードは互いに排他です。', + 'featuredTools': '特集', + 'showMoreFeatured': 'もっと見る', + 'showLessFeatured': '表示を減らす', + 'installed': 'インストール済み', + 'pluginByAuthor': '{{author}} によって', + 'usePlugin': 'ツールを選択', + 'hideActions': 'ツールを隠す', }, blocks: { 'start': 'ユーザー入力', @@ -837,6 +848,8 @@ const translation = { parallelModeEnableTitle: 'パラレルモード有効', MaxParallelismDesc: '最大並列処理は、1 回の反復で同時に実行されるタスクの数を制御するために使用されます。', answerNodeWarningDesc: '並列モードの警告:応答ノード、会話変数の割り当て、およびイテレーション内の永続的な読み取り/書き込み操作により、例外が発生する可能性があります。', + flattenOutput: '出力をフラット化', + flattenOutputDesc: '有効にすると、すべての反復出力が配列の場合、1つの配列にまとめてフラット化されます。無効の場合はネストされた配列構造のままです。', }, loop: { deleteTitle: 'ループノードを削除しますか?', @@ -1083,7 +1096,6 @@ const translation = { varName: '変数名', varType: 'タイプ', varNamePlaceholder: '変数名を入力...', - headerName: '変数名', required: '必須', addParameter: '追加', addHeader: '追加', @@ -1106,6 +1118,7 @@ const translation = { webhookUrlRequired: 'Webhook URLが必要です', invalidParameterType: 'パラメータ"{{name}}"の無効なパラメータタイプ"{{type}}"です', }, + debugUrlPrivateAddressWarning: 'このURLは内部アドレスのようです。Webhookリクエストが失敗する可能性があります。TRIGGER_URL を公開アドレスに変更できます。', }, triggerPlugin: { authorized: '認可された', @@ -1143,6 +1156,13 @@ const translation = { subscriptionNameDescription: 'このトリガーサブスクリプションの一意な名前を入力してください', subscriptionNamePlaceholder: 'サブスクリプション名を入力...', subscriptionNameRequired: 'サブスクリプション名は必須です', + notAuthorized: '認可されていません', + selectSubscription: 'サブスクリプションを選択', + availableSubscriptions: '利用可能なサブスクリプション', + addSubscription: '新しいサブスクリプションを追加', + removeSubscription: 'サブスクリプションを解除', + subscriptionRemoved: 'サブスクリプションが正常に削除されました', + subscriptionRequired: 'サブスクリプションが必要です', }, }, tracing: { diff --git a/web/i18n/ko-KR/app-debug.ts b/web/i18n/ko-KR/app-debug.ts index 68cbb6c345..c9e048df0e 100644 --- a/web/i18n/ko-KR/app-debug.ts +++ b/web/i18n/ko-KR/app-debug.ts @@ -326,6 +326,7 @@ const translation = { 'multi-files': '파일 목록', 'uploadFileTypes': '파일 형식 업로드', 'maxNumberOfUploads': '최대 업로드 수', + 'maxNumberTip': '문서 < {{docLimit}}, 이미지 < {{imgLimit}}, 오디오 < {{audioLimit}}, 비디오 < {{videoLimit}}', 'localUpload': '로컬 업로드', 'json': 'JSON 코드', 'jsonSchema': 'JSON 스키마', diff --git a/web/i18n/ko-KR/app-log.ts b/web/i18n/ko-KR/app-log.ts index 51cffcb374..e2b7edb10d 100644 --- a/web/i18n/ko-KR/app-log.ts +++ b/web/i18n/ko-KR/app-log.ts @@ -19,6 +19,7 @@ const translation = { tokens: '토큰', user: '엔드 유저 또는 계정', version: '버전', + triggered_from: '트리거 기준', }, pagination: { previous: '이전', @@ -98,6 +99,15 @@ const translation = { finalProcessing: '최종 처리', }, dateFormat: 'MM/DD/YYYY', + triggerBy: { + debugging: '디버깅', + appRun: '웹앱', + webhook: '웹훅', + schedule: '일정', + plugin: '플러그인', + ragPipelineRun: 'RAG 파이프라인', + ragPipelineDebugging: 'RAG 디버깅', + }, } export default translation diff --git a/web/i18n/ko-KR/app-overview.ts b/web/i18n/ko-KR/app-overview.ts index 9859c47af2..2deb709ace 100644 --- a/web/i18n/ko-KR/app-overview.ts +++ b/web/i18n/ko-KR/app-overview.ts @@ -114,7 +114,11 @@ const translation = { }, }, launch: '발사', - enableTooltip: {}, + enableTooltip: { + description: '이 기능을 사용하려면 캔버스에 사용자 입력 노드를 추가하세요. (초안에 이미 있을 수 있으며, 게시 후에 적용됩니다)', + learnMore: '자세히 알아보기', + }, + title: '웹 앱', }, apiInfo: { title: '백엔드 서비스 API', @@ -126,7 +130,14 @@ const translation = { running: '서비스 중', disable: '비활성', }, - triggerInfo: {}, + triggerInfo: { + title: '유발 요인', + explanation: '워크플로 트리거 관리', + triggersAdded: '{{count}} 트리거 추가됨', + noTriggerAdded: '트리거가 추가되지 않았습니다', + triggerStatusDescription: '트리거 노드 상태가 여기에 표시됩니다. (이미 초안에 존재할 수 있으며, 게시 후에 적용됩니다)', + learnAboutTriggers: '트리거에 대해 배우기', + }, disableTooltip: { triggerMode: '트리거 노드 모드에서는 {{feature}} 기능이 지원되지 않습니다.', }, diff --git a/web/i18n/ko-KR/billing.ts b/web/i18n/ko-KR/billing.ts index a01f1aee90..8e11037cd2 100644 --- a/web/i18n/ko-KR/billing.ts +++ b/web/i18n/ko-KR/billing.ts @@ -107,6 +107,8 @@ const translation = { triggerEvents: { unlimited: '무제한 트리거 이벤트', tooltip: '플러그인, 스케줄 또는 웹훅 트리거를 통해 워크플로를 자동으로 시작하는 이벤트 수입니다.', + sandbox: '{{count,number}} 트리거 이벤트', + professional: '{{count,number}} 트리거 이벤트/월', }, workflowExecution: { faster: '더 빠른 작업 흐름 실행', @@ -116,6 +118,11 @@ const translation = { }, startNodes: { unlimited: '무제한 트리거/워크플로', + limited: '{{count}}개의 트리거/워크플로까지', + }, + title: { + plans: '계획', + description: '팀의 필요에 가장 적합한 요금제를 선택하세요.', }, }, plans: { @@ -144,17 +151,7 @@ const translation = { btnText: '판매 문의하기', for: '대규모 팀을 위해', priceTip: '연간 청구 전용', - features: [ - '엔터프라이즈급 확장 가능한 배포 솔루션', - '상업용 라이선스 인증', - '전용 엔터프라이즈 기능', - '다중 워크스페이스 및 엔터프라이즈 관리', - 'SSO(싱글 사인온)', - 'Dify 파트너와의 협상을 통한 SLA', - '고급 보안 및 제어 기능', - 'Dify의 공식 업데이트 및 유지 관리', - '전문 기술 지원', - ], + features: ['기업용 확장 가능한 배포 솔루션', '상업용 라이선스 승인', '독점 기업 기능', '여러 작업 공간 및 기업 관리', '싱글 사인온', 'Dify 파트너가 협상한 SLA', '고급 보안 및 제어', 'Dify 공식 업데이트 및 유지 관리', '전문 기술 지원'], }, community: { btnText: '커뮤니티 시작하기', @@ -163,11 +160,7 @@ const translation = { price: '무료', includesTitle: '무료 기능:', for: '개인 사용자, 소규모 팀 또는 비상업적 프로젝트를 위한', - features: [ - '모든 핵심 기능이 공개 저장소에 공개됨', - '단일 워크스페이스', - 'Dify 오픈소스 라이선스를 준수함', - ], + features: ['모든 핵심 기능이 공개 저장소에서 릴리스되었습니다', '단일 작업 공간', 'Dify 오픈 소스 라이선스를 준수합니다'], }, premium: { btnText: '프리미엄 받기', @@ -178,12 +171,7 @@ const translation = { price: '확장 가능', for: '중규모 조직 및 팀을 위한', includesTitle: '커뮤니티의 모든 것, 여기에 추가로:', - features: [ - '다양한 클라우드 제공업체를 통한 자가 관리 신뢰성', - '단일 워크스페이스', - '웹앱 로고 및 브랜딩 커스터마이징', - '우선 이메일 및 채팅 지원', - ], + features: ['다양한 클라우드 제공업체의 자체 관리 신뢰성', '단일 작업 공간', '웹앱 로고 및 브랜딩 맞춤 설정', '우선 이메일 및 채팅 지원'], }, }, vectorSpace: { @@ -213,6 +201,7 @@ const translation = { '고품질 색인 모드를 사용하는 문서는 지식 데이터 저장소 자원을 소모합니다. 지식 데이터 저장소가 한도에 도달하면 새 문서를 업로드할 수 없습니다.', triggerEvents: '트리거 이벤트', perMonth: '월별', + resetsIn: '{{count,number}}일 후 초기화', }, teamMembers: '팀원들', triggerLimitModal: { diff --git a/web/i18n/ko-KR/common.ts b/web/i18n/ko-KR/common.ts index 22a4f918d5..0720107562 100644 --- a/web/i18n/ko-KR/common.ts +++ b/web/i18n/ko-KR/common.ts @@ -65,10 +65,17 @@ const translation = { yes: '네', deleteConfirmTitle: '삭제하시겠습니까?', confirmAction: '귀하의 행동을 확인해 주세요.', + noSearchResults: '{{content}}가(이) 발견되지 않았습니다', + resetKeywords: '키워드 재설정', + selectCount: '{{count}} 선택됨', + searchCount: '{{count}} {{content}} 찾기', + noSearchCount: '0 {{content}}', + now: '지금', }, placeholder: { input: '입력해주세요', select: '선택해주세요', + search: '검색...', }, voice: { language: { @@ -765,6 +772,13 @@ const translation = { label: { optional: '(선택 사항)', }, + noData: '데이터 없음', + dynamicSelect: { + error: '옵션 불러오기 실패', + noData: '사용 가능한 옵션이 없습니다', + loading: '옵션 불러오는 중...', + selected: '{{count}} 선택됨', + }, } export default translation diff --git a/web/i18n/ko-KR/dataset-documents.ts b/web/i18n/ko-KR/dataset-documents.ts index 8f3ddab139..fc69284a1d 100644 --- a/web/i18n/ko-KR/dataset-documents.ts +++ b/web/i18n/ko-KR/dataset-documents.ts @@ -81,7 +81,10 @@ const translation = { }, addUrl: 'URL 추가', learnMore: '더 알아보세요', - sort: {}, + sort: { + uploadTime: '업로드 시간', + hitCount: '검색 횟수', + }, }, metadata: { title: '메타데이터', diff --git a/web/i18n/ko-KR/dataset-pipeline.ts b/web/i18n/ko-KR/dataset-pipeline.ts index ebbfe23278..f6517ea192 100644 --- a/web/i18n/ko-KR/dataset-pipeline.ts +++ b/web/i18n/ko-KR/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: '지식 파이프라인 게시', + tip: '문서로 이동하여 문서를 추가하거나 관리하세요.', }, error: { message: '지식 파이프라인 게시 실패', @@ -56,6 +57,7 @@ const translation = { details: { structure: '구조', structureTooltip: '청크 구조는 문서를 분할하고 인덱싱하는 방법(일반, 부모-자식 및 Q&A 모드를 제공)을 결정하며 각 기술 자료에 고유합니다.', + createdBy: '{{author}} 작성', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { characters: '문자', backToDataSource: '데이터 소스', title: '문서 추가', + selectOnlineDocumentTip: '{{count}}페이지까지 처리', + selectOnlineDriveTip: '최대 {{fileSize}}MB 크기의 파일 {{count}}개까지 처리', }, documentSettings: { title: '문서 설정', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} 페이지', + }, onlineDrive: { breadcrumbs: { allFiles: '모든 파일', allBuckets: '모든 Cloud Storage 버킷', searchPlaceholder: '파일 검색...', + searchResult: '{{folderName}} 폴더에서 {{searchResultsLength}}개의 항목 찾기', }, emptySearchResult: '항목을 찾을 수 없습니다.', emptyFolder: '이 폴더는 비어 있습니다.', resetKeywords: '키워드 재설정', notSupportedFileType: '이 파일 형식은 지원되지 않습니다', + notConnected: '{{name}}가 연결되어 있지 않습니다', + notConnectedTip: '{{name}}와(과) 동기화하려면 먼저 {{name}}에 연결해야 합니다.', + }, + credentialSelector: { + name: '{{credentialName}}의 {{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { title: '확인', @@ -149,6 +160,7 @@ const translation = { editPipelineInfo: '파이프라인 정보 편집', knowledgeNameAndIconPlaceholder: '기술 자료의 이름을 입력하십시오.', knowledgeDescriptionPlaceholder: '이 기술 자료에 포함된 내용을 설명하십시오. 자세한 설명을 통해 AI는 데이터 세트의 콘텐츠에 보다 정확하게 액세스할 수 있습니다. 비어 있으면 Dify는 기본 히트 전략을 사용합니다. (선택 사항)', + configurationTip: '{{pluginName}} 구성', } export default translation diff --git a/web/i18n/ko-KR/dataset.ts b/web/i18n/ko-KR/dataset.ts index eb908c8fd6..44aedef58d 100644 --- a/web/i18n/ko-KR/dataset.ts +++ b/web/i18n/ko-KR/dataset.ts @@ -233,6 +233,10 @@ const translation = { title: '서비스 API', disabled: '장애인', }, + docAllEnabled_one: '{{count}} 문서 활성화됨', + docAllEnabled_other: '모든 {{count}} 문서 사용 가능', + partialEnabled_one: '총 {{count}}개의 문서 중 {{num}}개 사용 가능', + partialEnabled_other: '총 {{count}}개의 문서 중 {{num}}개 사용 가능', } export default translation diff --git a/web/i18n/ko-KR/education.ts b/web/i18n/ko-KR/education.ts index f39f97656c..db62757566 100644 --- a/web/i18n/ko-KR/education.ts +++ b/web/i18n/ko-KR/education.ts @@ -56,6 +56,7 @@ const translation = { }, isAboutToExpire: { summary: '걱정하지 마세요 — 이번 사항은 현재 구독에 영향을 주지 않지만, 다시 상태를 확인하지 않으면 갱신 시 교육 할인 혜택을 받지 못합니다.', + title: '귀하의 학력 상태는 {{date}}에 만료됩니다', }, stillInEducation: { title: '아직 학업 중이신가요?', diff --git a/web/i18n/ko-KR/pipeline.ts b/web/i18n/ko-KR/pipeline.ts index 5048c2a07e..af30eb8bfd 100644 --- a/web/i18n/ko-KR/pipeline.ts +++ b/web/i18n/ko-KR/pipeline.ts @@ -28,10 +28,12 @@ const translation = { loading: '가공... 기다리세요', viewDetails: '세부 정보보기', error: '실행 중 오류가 발생했습니다.', + footerTip: '테스트 실행 모드에서, 최대 {{count}}개의 청크를 미리보기', }, }, ragToolSuggestions: { title: 'RAG에 대한 제안', + noRecommendationPlugins: '추천 플러그인이 없습니다. 더 많은 플러그인은 마켓플레이스에서 찾아보세요.', }, } diff --git a/web/i18n/ko-KR/plugin-trigger.ts b/web/i18n/ko-KR/plugin-trigger.ts new file mode 100644 index 0000000000..edbe5c1fcd --- /dev/null +++ b/web/i18n/ko-KR/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: '구독', + listNum: '{{num}} 구독', + empty: { + title: '구독 없음', + button: '새 구독', + }, + createButton: { + oauth: 'OAuth로 새 구독', + apiKey: 'API 키를 이용한 새 구독', + manual: '새 구독을 만들려면 URL을 붙여넣으세요', + }, + createSuccess: '구독이 성공적으로 생성되었습니다', + createFailed: '구독 생성에 실패했습니다', + maxCount: '최대 {{num}} 구독', + selectPlaceholder: '구독 선택', + noSubscriptionSelected: '선택한 구독이 없습니다', + subscriptionRemoved: '구독 취소됨', + list: { + title: '구독', + addButton: '추가', + tip: '구독을 통해 이벤트 받기', + item: { + enabled: '활성화됨', + disabled: '사용하지 않음', + credentialType: { + api_key: 'API 키', + oauth2: 'OAuth', + unauthorized: '매뉴얼', + }, + actions: { + delete: '삭제', + deleteConfirm: { + title: '{{name}}을(를) 삭제하시겠습니까?', + success: '구독 {{name}}이(가) 성공적으로 삭제되었습니다', + error: '구독 {{name}} 삭제 실패', + content: '삭제하면 이 구독은 복구할 수 없습니다. 확인해주세요.', + contentWithApps: '현재 구독은 {{count}}개의 애플리케이션에서 참조되고 있습니다. 이를 삭제하면 구성된 애플리케이션이 구독 이벤트를 받지 않게 됩니다.', + confirm: '삭제 확인', + cancel: '취소', + confirmInputWarning: '확인을 위해 올바른 이름을 입력해 주세요.', + confirmInputPlaceholder: '"{{name}}"를 입력하여 확인하세요.', + confirmInputTip: '확인을 위해 “{{name}}”를 입력해 주세요.', + }, + }, + status: { + active: '활성', + inactive: '비활성', + }, + usedByNum: '{{num}} 워크플로우에서 사용됨', + noUsed: '사용된 워크플로우 없음', + }, + }, + addType: { + title: '구독 추가', + description: '트리거 구독을 생성하는 방법을 선택하세요', + options: { + apikey: { + title: 'API 키로 생성', + description: 'API 자격 증명을 사용하여 자동으로 구독 생성', + }, + oauth: { + title: 'OAuth로 생성', + description: '구독을 생성하려면 타사 플랫폼으로 인증하세요', + clientSettings: 'OAuth 클라이언트 설정', + clientTitle: 'OAuth 클라이언트', + default: '기본', + custom: '사용자 지정', + }, + manual: { + title: '수동 설정', + description: '새 구독을 만들려면 URL을 붙여넣으세요', + tip: '타사 플랫폼에서 URL을 수동으로 구성', + }, + }, + }, + }, + modal: { + steps: { + verify: '확인', + configuration: '설정', + }, + common: { + cancel: '취소', + back: '뒤로', + next: '다음', + create: '만들다', + verify: '확인', + authorize: '권한 부여', + creating: '생성 중...', + verifying: '검증 중...', + authorizing: '승인 중...', + }, + oauthRedirectInfo: '이 도구 제공자에 대한 시스템 클라이언트 비밀이 발견되지 않아 수동 설정이 필요하며, redirect_uri에는 다음을 사용해 주세요', + apiKey: { + title: 'API 키로 생성', + verify: { + title: '자격 증명 확인', + description: '액세스를 확인하려면 API 자격 증명을 제공해 주세요', + error: '자격 증명 확인에 실패했습니다. API 키를 확인해주세요.', + success: '자격 증명이 성공적으로 확인되었습니다', + }, + configuration: { + title: '구독 설정', + description: '구독 설정을 구성하세요', + }, + }, + oauth: { + title: 'OAuth로 생성', + authorization: { + title: 'OAuth 인증', + description: 'Dify가 귀하의 계정에 접근하도록 허용', + redirectUrl: '리디렉션 URL', + redirectUrlHelp: '이 URL을 OAuth 앱 구성에 사용하세요', + authorizeButton: '{{provider}}로 승인', + waitingAuth: '승인 대기 중...', + authSuccess: '승인 성공', + authFailed: 'OAuth 인증 정보를 가져오지 못했습니다', + waitingJump: '승인됨, 이륙 대기 중', + }, + configuration: { + title: '구독 설정', + description: '승인 후 구독 설정을 구성하세요', + success: 'OAuth 구성 성공', + failed: 'OAuth 구성 실패', + }, + remove: { + success: 'OAuth 제거 성공', + failed: 'OAuth 제거 실패', + }, + save: { + success: 'OAuth 구성이 성공적으로 저장되었습니다', + }, + }, + manual: { + title: '수동 설정', + description: '웹훅 구독을 수동으로 구성하세요', + logs: { + title: '요청 기록', + request: '요청', + loading: '{{pluginName}}의 요청을 기다리는 중...', + }, + }, + form: { + subscriptionName: { + label: '구독 이름', + placeholder: '구독 이름 입력', + required: '구독 이름은 필수 항목입니다', + }, + callbackUrl: { + label: '콜백 URL', + description: '이 URL은 웹훅 이벤트를 수신합니다', + tooltip: '트리거 제공자로부터 콜백 요청을 받을 수 있는 공개 접근 가능한 엔드포인트를 제공하십시오.', + placeholder: '생성 중...', + privateAddressWarning: '이 URL은 내부 주소인 것으로 보이며, 이로 인해 웹후크 요청이 실패할 수 있습니다. TRIGGER_URL을 공개 주소로 변경할 수 있습니다.', + }, + }, + errors: { + createFailed: '구독 생성에 실패했습니다', + verifyFailed: '인증 정보를 확인하지 못했습니다', + authFailed: '인증 실패', + networkError: '네트워크 오류가 발생했습니다. 다시 시도해주세요.', + }, + }, + events: { + title: '사용 가능한 이벤트', + description: '이 트리거 플러그인이 구독할 수 있는 이벤트', + empty: '이용 가능한 이벤트가 없습니다', + event: '이벤트', + events: '이벤트', + actionNum: '{{num}} {{event}} 포함', + item: { + parameters: '{{count}} 매개변수', + noParameters: '매개변수 없음', + }, + output: '출력', + }, + node: { + status: { + warning: '연결 끊기', + }, + }, +} + +export default translation diff --git a/web/i18n/ko-KR/plugin.ts b/web/i18n/ko-KR/plugin.ts index 89d6eb3317..875776d700 100644 --- a/web/i18n/ko-KR/plugin.ts +++ b/web/i18n/ko-KR/plugin.ts @@ -7,6 +7,7 @@ const translation = { tools: '도구', bundles: '번들', datasources: '데이터 소스', + triggers: '유발 요인', }, categorySingle: { extension: '확장', @@ -15,6 +16,7 @@ const translation = { bundle: '보따리', model: '모델', datasource: '데이터 소스', + trigger: '트리거', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { update: '업데이트', remove: '제거', checkUpdate: '업데이트 확인', + back: '뒤로', }, toolSelector: { empty: '\'+\' 버튼을 클릭하여 도구를 추가합니다. 여러 도구를 추가할 수 있습니다.', @@ -306,6 +309,12 @@ const translation = { specifyPluginsToUpdate: '업데이트할 플러그인을 지정하십시오.', excludeUpdate: '다음 {{num}} 플러그인은 자동 업데이트되지 않습니다.', }, + readmeInfo: { + title: '읽어보기', + needHelpCheckReadme: '도움이 필요하신가요? README를 확인하세요.', + noReadmeAvailable: '사용 가능한 README가 없습니다', + failedToFetch: 'README를 가져오지 못했습니다', + }, } export default translation diff --git a/web/i18n/ko-KR/workflow.ts b/web/i18n/ko-KR/workflow.ts index e661b6b340..c1dbeaeb55 100644 --- a/web/i18n/ko-KR/workflow.ts +++ b/web/i18n/ko-KR/workflow.ts @@ -117,6 +117,15 @@ const translation = { currentView: '현재 보기', currentWorkflow: '현재 워크플로', moreActions: '더 많은 작업', + listening: '듣기', + chooseStartNodeToRun: '실행할 시작 노드를 선택하세요', + runAllTriggers: '모든 트리거 실행', + features: '특징', + featuresDescription: '웹 앱 사용자 경험 향상', + featuresDocLink: '자세히 알아보기', + needAdd: '{{node}} 노드를 추가해야 합니다', + needStartNode: '적어도 하나의 시작 노드를 추가해야 합니다', + workflowAsToolDisabledHint: '최신 워크플로를 게시하고 도구로 구성하기 전에 연결된 사용자 입력 노드가 있는지 확인하세요.', }, env: { envPanelTitle: '환경 변수', @@ -228,6 +237,7 @@ const translation = { 'Rerank Model 을 켜기 전에 설정에서 모델이 성공적으로 구성되었는지 확인하십시오.', noValidTool: '{{field}} 유효한 도구가 선택되지 않았습니다.', toolParameterRequired: '{{field}}: 매개변수 [{{param}}] 이 필요합니다.', + startNodeRequired: '{{operation}} 전에 먼저 시작 노드를 추가해 주세요', }, singleRun: { testRun: '테스트 실행', @@ -259,6 +269,21 @@ const translation = { 'addAll': '모두 추가', 'sources': '소스', 'searchDataSource': '데이터 소스 검색', + 'start': '시작', + 'searchTrigger': '검색 트리거...', + 'allTriggers': '모든 트리거', + 'noPluginsFound': '플러그인을 찾을 수 없습니다', + 'requestToCommunity': '커뮤니티에 대한 요청', + 'featuredTools': '추천', + 'showMoreFeatured': '더 보기', + 'showLessFeatured': '간략히 보기', + 'installed': '설치됨', + 'pluginByAuthor': '{{author}} 작성', + 'usePlugin': '도구 선택', + 'hideActions': '도구 숨기기', + 'noFeaturedPlugins': '마켓플레이스에서 더 많은 도구를 발견하세요', + 'noFeaturedTriggers': '마켓플레이스에서 더 많은 트리거 발견하기', + 'startDisabledTip': '트리거 노드와 사용자 입력 노드는 상호 배타적입니다.', }, blocks: { 'start': '시작', @@ -285,6 +310,10 @@ const translation = { 'loop': '루프', 'datasource': '데이터 소스', 'knowledge-index': '기술 자료', + 'originalStartNode': '원래 시작 노드', + 'trigger-schedule': '일정 트리거', + 'trigger-webhook': '웹훅 트리거', + 'trigger-plugin': '플러그인 트리거', }, blocksAbout: { 'start': '워크플로우를 시작하기 위한 초기 매개변수를 정의합니다', @@ -321,6 +350,9 @@ const translation = { '"break"와 동일합니다. 이 노드는 구성 항목이 없습니다. 루프 본문이 이 노드에 도달하면 루프가 종료됩니다.', 'datasource': '데이터 소스 정보', 'knowledge-index': '기술 자료 정보', + 'trigger-schedule': '일정에 따라 워크플로를 시작하는 시간 기반 워크플로 트리거', + 'trigger-webhook': '웹훅 트리거는 외부 시스템에서 HTTP 푸시를 받아 워크플로를 자동으로 실행합니다.', + 'trigger-plugin': '외부 플랫폼 이벤트로 워크플로를 시작하는 타사 통합 트리거', }, operator: { zoomIn: '확대', @@ -361,6 +393,8 @@ const translation = { maximize: '캔버스 전체 화면', scrollToSelectedNode: '선택한 노드로 스크롤', optional_and_hidden: '(선택 사항 및 숨김)', + goTo: '로 이동', + startNode: '시작 노드', }, nodes: { common: { @@ -826,6 +860,8 @@ const translation = { '최대 병렬 처리는 단일 반복에서 동시에 실행되는 작업 수를 제어하는 데 사용됩니다.', answerNodeWarningDesc: '병렬 모드 경고: 응답 노드, 대화 변수 할당 및 반복 내의 지속적인 읽기/쓰기 작업으로 인해 예외가 발생할 수 있습니다.', + flattenOutput: '출력 평탄화', + flattenOutputDesc: '활성화하면, 모든 반복 결과가 배열일 경우 이를 하나의 배열로 평탄화합니다. 비활성화하면, 결과는 중첩된 배열 구조를 유지합니다.', }, note: { editor: { @@ -1011,6 +1047,144 @@ const translation = { rerankingModelIsInvalid: '재정렬 모델이 유효하지 않습니다', embeddingModelIsInvalid: '임베딩 모델이 유효하지 않습니다', }, + triggerPlugin: { + authorized: '권한이 부여된', + notConfigured: '구성되지 않음', + notAuthorized: '권한 없음', + selectSubscription: '구독 선택', + availableSubscriptions: '이용 가능한 구독', + addSubscription: '새 구독 추가', + removeSubscription: '구독 해지', + subscriptionRemoved: '구독이 성공적으로 취소되었습니다', + error: '오류', + configuration: '구성', + remove: '제거', + or: '또는', + useOAuth: 'OAuth 사용', + useApiKey: 'API 키 사용', + authenticationFailed: '인증 실패', + authenticationSuccess: '인증 성공', + oauthConfigFailed: 'OAuth 구성 실패', + configureOAuthClient: 'OAuth 클라이언트 구성', + oauthClientDescription: '인증을 활성화하려면 OAuth 클라이언트 자격 증명을 구성하세요', + oauthClientSaved: 'OAuth 클라이언트 구성이 성공적으로 저장되었습니다', + configureApiKey: 'API 키 설정', + apiKeyDescription: '인증을 위해 API 키 자격 증명을 구성합니다', + apiKeyConfigured: 'API 키가 성공적으로 설정되었습니다', + configurationFailed: '구성 실패', + failedToStart: '인증 흐름을 시작하지 못했습니다', + credentialsVerified: '자격 증명이 성공적으로 확인되었습니다', + credentialVerificationFailed: '자격 증명 확인 실패', + verifyAndContinue: '확인 후 계속', + configureParameters: '매개변수 구성', + parametersDescription: '트리거 매개변수 및 속성 구성', + configurationComplete: '구성이 완료되었습니다', + configurationCompleteDescription: '트리거가 성공적으로 설정되었습니다', + configurationCompleteMessage: '트리거 설정이 완료되었으며 이제 사용할 준비가 되었습니다.', + parameters: '매개변수', + properties: '속성', + propertiesDescription: '이 트리거에 대한 추가 구성 속성', + noConfigurationRequired: '이 트리거에는 추가 구성 필요 없습니다.', + subscriptionName: '구독 이름', + subscriptionNameDescription: '이 트리거 구독에 대한 고유한 이름을 입력하세요', + subscriptionNamePlaceholder: '구독 이름 입력...', + subscriptionNameRequired: '구독 이름은 필수 항목입니다', + subscriptionRequired: '구독이 필요합니다', + }, + triggerSchedule: { + title: '일정', + nodeTitle: '일정 트리거', + notConfigured: '구성되지 않음', + useCronExpression: '크론 표현식 사용', + useVisualPicker: '시각적 선택기 사용', + frequency: { + label: '주파수', + hourly: '시간별', + daily: '일일', + weekly: '주간', + monthly: '월간', + }, + selectFrequency: '주파수 선택', + frequencyLabel: '주파수', + nextExecution: '다음 실행', + weekdays: '주중', + time: '시간', + cronExpression: '크론 표현식', + nextExecutionTime: '다음 실행 시간', + nextExecutionTimes: '다음 5회 실행 시간', + startTime: '시작 시간', + executeNow: '지금 실행', + selectDateTime: '날짜 및 시간 선택', + hours: '시간', + minutes: '분', + onMinute: '분 안에', + days: '날들', + lastDay: '마지막 날', + lastDayTooltip: '모든 달이 31일인 것은 아닙니다. 각 달의 마지막 날을 선택하려면 \'마지막 날\' 옵션을 사용하세요.', + mode: '모드', + timezone: '시간대', + visualConfig: '시각적 구성', + monthlyDay: '월간 일', + executionTime: '실행 시간', + invalidTimezone: '잘못된 시간대', + invalidCronExpression: '잘못된 크론 표현식', + noValidExecutionTime: '유효한 실행 시간을 계산할 수 없습니다', + executionTimeCalculationError: '실행 시간을 계산하지 못했습니다', + invalidFrequency: '잘못된 주파수', + invalidStartTime: '잘못된 시작 시간', + startTimeMustBeFuture: '시작 시간은 미래여야 합니다', + invalidTimeFormat: '잘못된 시간 형식(예상 형식: HH:MM AM/PM)', + invalidWeekday: '잘못된 요일: {{weekday}}', + invalidMonthlyDay: '월별 일자는 1-31 사이이거나 "마지막"이어야 합니다', + invalidOnMinute: '분은 0에서 59 사이여야 합니다', + invalidExecutionTime: '잘못된 실행 시간', + executionTimeMustBeFuture: '실행 시간은 미래여야 합니다', + }, + triggerWebhook: { + title: '웹훅 트리거', + nodeTitle: '🔗 웹훅 트리거', + configPlaceholder: '웹훅 트리거 구성은 여기에서 구현됩니다', + webhookUrl: '웹훅 URL', + webhookUrlPlaceholder: '웹훅 URL을 생성하려면 생성 버튼을 클릭하세요', + generate: '생성', + copy: '복사', + test: '테스트', + urlGenerated: '웹훅 URL이 성공적으로 생성되었습니다', + urlGenerationFailed: '웹훅 URL 생성에 실패했습니다', + urlCopied: 'URL이 클립보드에 복사되었습니다', + method: '방법', + contentType: '콘텐츠 유형', + queryParameters: '쿼리 매개변수', + headerParameters: '헤더 매개변수', + requestBodyParameters: '요청 본문 매개변수', + parameterName: '변수 이름', + varName: '변수 이름', + varType: '타입', + varNamePlaceholder: '변수 이름 입력...', + required: '필수', + addParameter: '추가', + addHeader: '추가', + noParameters: '매개변수가 설정되지 않았습니다', + noQueryParameters: '쿼리 매개변수가 설정되지 않았습니다', + noHeaders: '헤더가 구성되지 않았습니다', + noBodyParameters: '본문 매개변수가 구성되지 않았습니다', + debugUrlTitle: '테스트 실행 시에는 항상 이 URL을 사용하세요', + debugUrlCopy: '클릭하여 복사', + debugUrlCopied: '복사됨!', + debugUrlPrivateAddressWarning: '이 URL은 내부 주소인 것으로 보이며, 이로 인해 웹후크 요청이 실패할 수 있습니다. TRIGGER_URL을 공개 주소로 변경할 수 있습니다.', + errorHandling: '오류 처리', + errorStrategy: '오류 처리', + responseConfiguration: '응답', + asyncMode: '비동기 모드', + statusCode: '상태 코드', + responseBody: '응답 본문', + responseBodyPlaceholder: '여기에 응답 내용을 작성하세요', + headers: '헤더', + validation: { + webhookUrlRequired: '웹훅 URL이 필요합니다', + invalidParameterType: '매개변수 "{{name}}"에 대한 매개변수 유형 "{{type}}"이(가) 잘못되었습니다', + }, + }, }, tracing: { stopBy: '{{user}}에 의해 중지됨', @@ -1088,6 +1262,18 @@ const translation = { largeData: '대용량 데이터, 읽기 전용 미리 보기. 모두 보도록 내보내기.', exportToolTip: '변수를 파일로 내보내기', largeDataNoExport: '대용량 데이터 - 부분 미리 보기만', + listening: { + title: '트리거 이벤트 수신 대기 중...', + tip: '이제 테스트 요청을 HTTP {{nodeName}} 엔드포인트로 보내 이벤트 트리거를 시뮬레이션하거나 실시간 이벤트 디버깅용 콜백 URL로 사용할 수 있습니다. 모든 출력은 변수 검사기에서 직접 확인할 수 있습니다.', + tipPlugin: '이제 {{- pluginName}}에서 이벤트를 생성하고, 변수 검사기에서 이러한 이벤트의 출력을 확인할 수 있습니다.', + tipSchedule: '스케줄 트리거의 이벤트를 수신 대기 중입니다.\n다음 예약 실행: {{nextTriggerTime}}', + tipFallback: '들어오는 트리거 이벤트를 대기 중입니다. 출력 결과가 여기에 표시됩니다.', + defaultNodeName: '이 트리거', + defaultPluginName: '이 플러그인 트리거', + defaultScheduleTime: '구성되지 않음', + selectedTriggers: '선택된 트리거', + stopButton: '멈춰', + }, }, settingsTab: '설정', lastRunTab: '마지막 실행', @@ -1105,11 +1291,52 @@ const translation = { noMatchingInputsFound: '지난 실행에서 일치하는 입력을 찾을 수 없습니다.', copyLastRunError: '마지막 실행 입력을 복사하는 데 실패했습니다.', lastOutput: '마지막 출력', + lastRunInputsCopied: '지난 실행에서 {{count}}개의 입력이 복사되었습니다', }, sidebar: { exportWarning: '현재 저장된 버전 내보내기', exportWarningDesc: '이 작업은 현재 저장된 워크플로우 버전을 내보냅니다. 편집기에서 저장되지 않은 변경 사항이 있는 경우, 먼저 워크플로우 캔버스의 내보내기 옵션을 사용하여 저장해 주세요.', }, + publishLimit: { + startNodeTitlePrefix: '업그레이드하기', + startNodeTitleSuffix: '워크플로마다 무제한 트리거 잠금 해제', + startNodeDesc: '이 요금제에서는 워크플로당 2개의 트리거 제한에 도달했습니다. 이 워크플로를 게시하려면 업그레이드하세요.', + }, + error: { + startNodeRequired: '{{operation}} 전에 먼저 시작 노드를 추가해 주세요', + operations: { + connectingNodes: '노드 연결', + addingNodes: '노드 추가', + modifyingWorkflow: '워크플로 수정', + updatingWorkflow: '워크플로 업데이트', + }, + }, + customWebhook: '맞춤 웹훅', + difyTeam: '디파이 팀', + triggerStatus: { + enabled: '트리거', + disabled: '트리거 • 비활성화', + }, + entryNodeStatus: { + enabled: '시작', + disabled: '시작 • 비활성', + }, + onboarding: { + title: '시작할 노드를 선택하세요', + description: '시작 노드마다 기능이 다릅니다. 걱정하지 마세요, 나중에 언제든지 변경할 수 있습니다.', + userInputFull: '사용자 입력 (원래 시작 노드)', + userInputDescription: '사용자 입력 변수를 설정할 수 있는 시작 노드로, 웹 앱, 서비스 API, MCP 서버, 워크플로우를 도구 기능으로 제공합니다.', + trigger: '트리거', + triggerDescription: '트리거는 예약된 작업, 사용자 지정 웹훅 또는 다른 앱과의 통합과 같은 워크플로우의 시작 노드로 사용할 수 있습니다.', + back: '뒤로', + learnMore: '자세히 알아보기', + aboutStartNode: '시작 노드에 대해.', + escTip: { + press: '누르다', + key: '이스케이프', + toDismiss: '해고하다', + }, + }, } export default translation diff --git a/web/i18n/pl-PL/app-debug.ts b/web/i18n/pl-PL/app-debug.ts index d38f5dd967..262b4a204f 100644 --- a/web/i18n/pl-PL/app-debug.ts +++ b/web/i18n/pl-PL/app-debug.ts @@ -349,6 +349,7 @@ const translation = { 'localUpload': 'Przesyłanie lokalne', 'uploadFileTypes': 'Typy przesyłanych plików', 'maxNumberOfUploads': 'Maksymalna liczba przesyłanych plików', + 'maxNumberTip': 'Dokument < {{docLimit}}, obraz < {{imgLimit}}, audio < {{audioLimit}}, wideo < {{videoLimit}}', 'single-file': 'Pojedynczy plik', 'content': 'Zawartość', 'multi-files': 'Lista plików', diff --git a/web/i18n/pl-PL/app-log.ts b/web/i18n/pl-PL/app-log.ts index e341c7d331..ee6aec6257 100644 --- a/web/i18n/pl-PL/app-log.ts +++ b/web/i18n/pl-PL/app-log.ts @@ -20,6 +20,7 @@ const translation = { tokens: 'TOKENY', user: 'UŻYTKOWNIK KOŃCOWY LUB KONTO', version: 'WERSJA', + triggered_from: 'URUCHOMIONE PRZEZ', }, pagination: { previous: 'Poprzedni', @@ -101,6 +102,15 @@ const translation = { finalProcessing: 'Końcowa obróbka', }, dateFormat: 'DD/MM/RRRR', + triggerBy: { + debugging: 'Debugowanie', + appRun: 'Aplikacja internetowa', + webhook: 'Webhook', + schedule: 'Harmonogram', + plugin: 'Wtyczka', + ragPipelineRun: 'Pipeline RAG', + ragPipelineDebugging: 'Debugowanie RAG', + }, } export default translation diff --git a/web/i18n/pl-PL/app-overview.ts b/web/i18n/pl-PL/app-overview.ts index ab0b4e24d5..a767f18f1b 100644 --- a/web/i18n/pl-PL/app-overview.ts +++ b/web/i18n/pl-PL/app-overview.ts @@ -125,7 +125,11 @@ const translation = { }, }, launch: 'Uruchomić', - enableTooltip: {}, + enableTooltip: { + description: 'Aby włączyć tę funkcję, dodaj węzeł Wprowadzanie użytkownika na planszę. (Może już istnieć w szkicu, zacznie działać po opublikowaniu)', + learnMore: 'Dowiedz się więcej', + }, + title: 'Aplikacja internetowa', }, apiInfo: { title: 'API usługi w tle', @@ -137,7 +141,14 @@ const translation = { running: 'W usłudze', disable: 'Wyłącz', }, - triggerInfo: {}, + triggerInfo: { + title: 'Czynniki wywołujące', + explanation: 'Zarządzanie wyzwalaczami przepływu pracy', + triggersAdded: '{{count}} Wyzwalacze dodane', + noTriggerAdded: 'Nie dodano wyzwalacza', + triggerStatusDescription: 'Status węzła wyzwalacza pojawia się tutaj. (Może już istnieć w wersji roboczej, obowiązuje po opublikowaniu)', + learnAboutTriggers: 'Dowiedz się o wyzwalaczach', + }, disableTooltip: { triggerMode: 'Funkcja {{feature}} nie jest obsługiwana w trybie węzła wyzwalającego.', }, diff --git a/web/i18n/pl-PL/billing.ts b/web/i18n/pl-PL/billing.ts index 1c38ae6a74..dd4bd5c58b 100644 --- a/web/i18n/pl-PL/billing.ts +++ b/web/i18n/pl-PL/billing.ts @@ -105,6 +105,8 @@ const translation = { triggerEvents: { unlimited: 'Nieograniczone zdarzenia wyzwalające', tooltip: 'Liczba zdarzeń, które automatycznie uruchamiają przepływy pracy za pomocą wtyczki, harmonogramu lub wyzwalaczy Webhook.', + sandbox: '{{count,number}} Wyzwalacze zdarzeń', + professional: '{{count,number}} Wywołania zdarzeń/miesiąc', }, workflowExecution: { standard: 'Standardowe wykonywanie przepływu pracy', @@ -114,6 +116,11 @@ const translation = { }, startNodes: { unlimited: 'Nieograniczone wyzwalacze/przepływ pracy', + limited: 'Do {{count}} wyzwalaczy/przepływów pracy', + }, + title: { + plans: 'plany', + description: 'Wybierz plan, który najlepiej odpowiada potrzebom Twojego zespołu.', }, }, plans: { @@ -139,16 +146,14 @@ const translation = { description: 'Uzyskaj pełne możliwości i wsparcie dla systemów o kluczowym znaczeniu dla misji.', includesTitle: 'Wszystko w planie Zespołowym, plus:', - features: { - }, + features: ['Skalowalne rozwiązania wdrożeniowe klasy korporacyjnej', 'Autoryzacja licencji komercyjnej', 'Ekskluzywne funkcje dla przedsiębiorstw', 'Wiele przestrzeni roboczych i zarządzanie przedsiębiorstwem', 'SSO', 'Negocjowane umowy SLA przez partnerów Dify', 'Zaawansowane zabezpieczenia i kontrola', 'Aktualizacje i konserwacja przez Dify oficjalnie', 'Profesjonalne wsparcie techniczne'], priceTip: 'Tylko roczne fakturowanie', btnText: 'Skontaktuj się z działem sprzedaży', for: 'Dla dużych zespołów', price: 'Niestety, nie mogę przetłumaczyć tego tekstu bez konkretnego zdania do przetłumaczenia.', }, community: { - features: { - }, + features: ['Wszystkie podstawowe funkcje udostępnione w publicznym repozytorium', 'Pojedyncza przestrzeń robocza', 'Zgodne z licencją Dify Open Source'], includesTitle: 'Darmowe funkcje:', name: 'Społeczność', price: 'Darmowy', @@ -157,8 +162,7 @@ const translation = { for: 'Dla użytkowników indywidualnych, małych zespołów lub projektów niekomercyjnych', }, premium: { - features: { - }, + features: ['Niezawodność zarządzana samodzielnie przez różnych dostawców chmury', 'Pojedyncza przestrzeń robocza', 'Dostosowywanie logo i marki aplikacji webowej', 'Priorytetowe wsparcie e-mail i czat'], description: 'Dla średnich organizacji i zespołów', for: 'Dla średnich organizacji i zespołów', name: 'Premium', @@ -194,6 +198,7 @@ const translation = { vectorSpaceTooltip: 'Dokumenty z trybem indeksowania o wysokiej jakości będą zużywać zasoby magazynu danych wiedzy. Gdy magazyn danych wiedzy osiągnie limit, nowe dokumenty nie będą przesyłane.', perMonth: 'miesięcznie', triggerEvents: 'Wydarzenia wyzwalające', + resetsIn: 'Resetuje się za {{count,number}} dni', }, teamMembers: 'Członkowie zespołu', triggerLimitModal: { diff --git a/web/i18n/pl-PL/common.ts b/web/i18n/pl-PL/common.ts index b936080e8b..9c2a0810ce 100644 --- a/web/i18n/pl-PL/common.ts +++ b/web/i18n/pl-PL/common.ts @@ -65,10 +65,17 @@ const translation = { no: 'Nie', deleteConfirmTitle: 'Usunąć?', confirmAction: 'Proszę potwierdzić swoją akcję.', + noSearchResults: 'Nie znaleziono {{content}}', + resetKeywords: 'Resetuj słowa kluczowe', + selectCount: '{{count}} Wybrane', + searchCount: 'Znajdź {{count}} {{content}}', + noSearchCount: '0 {{content}}', + now: 'Teraz', }, placeholder: { input: 'Proszę wprowadzić', select: 'Proszę wybrać', + search: 'Szukaj...', }, voice: { language: { @@ -787,6 +794,13 @@ const translation = { label: { optional: '(Opcjonalnie)', }, + noData: 'Brak danych', + dynamicSelect: { + error: 'Nie udało się załadować opcji', + noData: 'Brak dostępnych opcji', + loading: 'Ładowanie opcji...', + selected: '{{count}} wybrano', + }, } export default translation diff --git a/web/i18n/pl-PL/dataset-documents.ts b/web/i18n/pl-PL/dataset-documents.ts index ced8fc5d8f..ed8dbbedd1 100644 --- a/web/i18n/pl-PL/dataset-documents.ts +++ b/web/i18n/pl-PL/dataset-documents.ts @@ -82,7 +82,10 @@ const translation = { }, addUrl: 'Dodaj adres URL', learnMore: 'Dowiedz się więcej', - sort: {}, + sort: { + uploadTime: 'Czas przesyłania', + hitCount: 'Liczba wyszukiwań', + }, }, metadata: { title: 'Metadane', diff --git a/web/i18n/pl-PL/dataset-pipeline.ts b/web/i18n/pl-PL/dataset-pipeline.ts index 299f5ff30a..ec33211da3 100644 --- a/web/i18n/pl-PL/dataset-pipeline.ts +++ b/web/i18n/pl-PL/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'Opublikowano potok wiedzy', + tip: 'Przejdź do Dokumenty, aby dodać lub zarządzać dokumentami.', }, error: { message: 'Nie można opublikować potoku wiedzy', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'Struktura', structureTooltip: 'Struktura fragmentów określa sposób dzielenia i indeksowania dokumentów — oferując tryby Ogólne, Nadrzędny-Podrzędny oraz Q&A — i jest unikatowa dla każdej bazy wiedzy.', + createdBy: 'Przez {{author}}', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { backToDataSource: 'Źródło danych', characters: 'Znaków', title: 'Dodawanie dokumentów', + selectOnlineDocumentTip: 'Przetwórz do {{count}} stron', + selectOnlineDriveTip: 'Przetwórz do {{count}} plików, maksymalnie {{fileSize}} MB każdy', }, documentSettings: { title: 'Ustawienia dokumentu', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} strony', + }, onlineDrive: { breadcrumbs: { searchPlaceholder: 'Szukaj w plikach...', allFiles: 'Wszystkie pliki', allBuckets: 'Wszystkie zasobniki pamięci masowej w chmurze', + searchResult: 'Znajdź {{searchResultsLength}} elementów w folderze "{{folderName}}"', }, resetKeywords: 'Resetowanie słów kluczowych', emptySearchResult: 'Nie znaleziono żadnych przedmiotów', notSupportedFileType: 'Ten typ pliku nie jest obsługiwany', emptyFolder: 'Ten folder jest pusty', + notConnected: '{{name}} nie jest połączony', + notConnectedTip: 'Aby zsynchronizować się z {{name}}, najpierw należy nawiązać połączenie z {{name}}.', + }, + credentialSelector: { + name: '{{credentialName}}\'s {{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { title: 'Potwierdzenie', @@ -149,6 +160,7 @@ const translation = { knowledgeNameAndIconPlaceholder: 'Podaj nazwę Bazy Wiedzy', editPipelineInfo: 'Edytowanie informacji o potoku', knowledgeDescriptionPlaceholder: 'Opisz, co znajduje się w tej Bazie wiedzy. Szczegółowy opis umożliwia sztucznej inteligencji dokładniejszy dostęp do zawartości zestawu danych. Jeśli pole jest puste, Dify użyje domyślnej strategii trafień. (Opcjonalnie)', + configurationTip: 'Skonfiguruj {{pluginName}}', } export default translation diff --git a/web/i18n/pl-PL/dataset.ts b/web/i18n/pl-PL/dataset.ts index 1320f7b4c1..21229f54be 100644 --- a/web/i18n/pl-PL/dataset.ts +++ b/web/i18n/pl-PL/dataset.ts @@ -238,6 +238,10 @@ const translation = { disabled: 'Niepełnosprawny', enabled: 'W serwisie', }, + docAllEnabled_one: 'Dokument {{count}} włączony', + docAllEnabled_other: 'Wszystkie dokumenty {{count}} włączone', + partialEnabled_one: 'Łącznie {{count}} dokumentów, {{num}} dostępnych', + partialEnabled_other: 'Łącznie {{count}} dokumentów, {{num}} dostępnych', } export default translation diff --git a/web/i18n/pl-PL/education.ts b/web/i18n/pl-PL/education.ts index 53e31798f9..d1bad9c41b 100644 --- a/web/i18n/pl-PL/education.ts +++ b/web/i18n/pl-PL/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: 'Nie martw się — to nie wpłynie na twoją obecną subskrypcję, ale nie otrzymasz zniżki edukacyjnej przy jej odnawianiu, chyba że ponownie zweryfikujesz swój status.', + title: 'Twój status edukacyjny wygaśnie {{date}}', }, stillInEducation: { title: 'Wciąż w edukacji?', diff --git a/web/i18n/pl-PL/pipeline.ts b/web/i18n/pl-PL/pipeline.ts index 0a92277f66..0515354402 100644 --- a/web/i18n/pl-PL/pipeline.ts +++ b/web/i18n/pl-PL/pipeline.ts @@ -28,10 +28,12 @@ const translation = { loading: 'Przetwarzanie... Czekaj', error: 'Wystąpił błąd podczas wykonywania', viewDetails: 'Zobacz szczegóły', + footerTip: 'W trybie testowym, podgląd do {{count}} fragmentów', }, }, ragToolSuggestions: { title: 'Propozycje dotyczące RAG', + noRecommendationPlugins: 'Brak polecanych wtyczek, znajdź więcej w Marketplacu', }, } diff --git a/web/i18n/pl-PL/plugin-trigger.ts b/web/i18n/pl-PL/plugin-trigger.ts new file mode 100644 index 0000000000..68a79e6477 --- /dev/null +++ b/web/i18n/pl-PL/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'Subskrypcje', + listNum: 'subskrypcje {{num}}', + empty: { + title: 'Brak subskrypcji', + button: 'Nowa subskrypcja', + }, + createButton: { + oauth: 'Nowa subskrypcja z OAuth', + apiKey: 'Nowa subskrypcja z kluczem API', + manual: 'Wklej adres URL, aby utworzyć nową subskrypcję', + }, + createSuccess: 'Subskrypcja została pomyślnie utworzona', + createFailed: 'Nie udało się utworzyć subskrypcji', + maxCount: 'Maksymalnie {{num}} subskrypcji', + selectPlaceholder: 'Wybierz subskrypcję', + noSubscriptionSelected: 'Nie wybrano subskrypcji', + subscriptionRemoved: 'Subskrypcja usunięta', + list: { + title: 'Subskrypcje', + addButton: 'Dodaj', + tip: 'Odbieraj zdarzenia poprzez subskrypcję', + item: { + enabled: 'Włączone', + disabled: 'Niepełnosprawny', + credentialType: { + api_key: 'Klucz API', + oauth2: 'OAuth', + unauthorized: 'Instrukcja', + }, + actions: { + delete: 'Usuń', + deleteConfirm: { + title: 'Usunąć {{name}}?', + success: 'Subskrypcja {{name}} została pomyślnie usunięta', + error: 'Nie udało się usunąć subskrypcji {{name}}', + content: 'Po usunięciu, tej subskrypcji nie da się odzyskać. Proszę potwierdzić.', + contentWithApps: 'Aktualna subskrypcja jest wykorzystywana przez {{count}} aplikacji. Usunięcie jej spowoduje, że skonfigurowane aplikacje przestaną otrzymywać zdarzenia subskrypcji.', + confirm: 'Potwierdź usunięcie', + cancel: 'Anuluj', + confirmInputWarning: 'Proszę wpisać poprawną nazwę, aby potwierdzić.', + confirmInputPlaceholder: 'Wprowadź "{{name}}", aby potwierdzić.', + confirmInputTip: 'Proszę wpisać „{{name}}”, aby potwierdzić.', + }, + }, + status: { + active: 'Aktywny', + inactive: 'Nieaktywny', + }, + usedByNum: 'Używane przez {{num}} przepływy pracy', + noUsed: 'Nie użyto przepływu pracy', + }, + }, + addType: { + title: 'Dodaj subskrypcję', + description: 'Wybierz, jak chcesz utworzyć swoją subskrypcję wyzwalacza', + options: { + apikey: { + title: 'Twórz z kluczem API', + description: 'Automatyczne tworzenie subskrypcji przy użyciu danych uwierzytelniających API', + }, + oauth: { + title: 'Utwórz za pomocą OAuth', + description: 'Autoryzuj za pomocą platformy zewnętrznej, aby utworzyć subskrypcję', + clientSettings: 'Ustawienia klienta OAuth', + clientTitle: 'Klient OAuth', + default: 'Domyślny', + custom: 'Niestandardowy', + }, + manual: { + title: 'Ręczna konfiguracja', + description: 'Wklej adres URL, aby utworzyć nową subskrypcję', + tip: 'Skonfiguruj adres URL na platformie zewnętrznej ręcznie', + }, + }, + }, + }, + modal: { + steps: { + verify: 'Zweryfikuj', + configuration: 'Konfiguracja', + }, + common: { + cancel: 'Anuluj', + back: 'Wstecz', + next: 'Dalej', + create: 'Utwórz', + verify: 'Zweryfikuj', + authorize: 'Autoryzuj', + creating: 'Tworzenie...', + verifying: 'Weryfikacja...', + authorizing: 'Autoryzacja...', + }, + oauthRedirectInfo: 'Ponieważ nie znaleziono żadnych poufnych danych klienta systemu dla tego dostawcy narzędzi, konieczne jest ręczne skonfigurowanie. Dla redirect_uri proszę użyć', + apiKey: { + title: 'Twórz z kluczem API', + verify: { + title: 'Zweryfikuj poświadczenia', + description: 'Proszę podać swoje dane uwierzytelniające API, aby zweryfikować dostęp', + error: 'Weryfikacja poświadczeń nie powiodła się. Proszę sprawdzić swój klucz API.', + success: 'Dane uwierzytelniające zostały pomyślnie zweryfikowane', + }, + configuration: { + title: 'Skonfiguruj subskrypcję', + description: 'Skonfiguruj parametry subskrypcji', + }, + }, + oauth: { + title: 'Utwórz za pomocą OAuth', + authorization: { + title: 'Autoryzacja OAuth', + description: 'Autoryzuj Dify, aby uzyskać dostęp do Twojego konta', + redirectUrl: 'Przekieruj URL', + redirectUrlHelp: 'Użyj tego adresu URL w konfiguracji swojej aplikacji OAuth', + authorizeButton: 'Autoryzuj za pomocą {{provider}}', + waitingAuth: 'Oczekiwanie na autoryzację...', + authSuccess: 'Autoryzacja powiodła się', + authFailed: 'Nie udało się pobrać informacji autoryzacyjnych OAuth', + waitingJump: 'Autoryzowany, oczekujący na start', + }, + configuration: { + title: 'Skonfiguruj subskrypcję', + description: 'Skonfiguruj parametry subskrypcji po autoryzacji', + success: 'Konfiguracja OAuth zakończona powodzeniem', + failed: 'Konfiguracja OAuth nie powiodła się', + }, + remove: { + success: 'Usunięcie OAuth powiodło się', + failed: 'Usunięcie OAuth nie powiodło się', + }, + save: { + success: 'Konfiguracja OAuth została zapisana pomyślnie', + }, + }, + manual: { + title: 'Ręczna konfiguracja', + description: 'Skonfiguruj subskrypcję webhooka ręcznie', + logs: { + title: 'Dzienniki żądań', + request: 'Żądanie', + loading: 'Oczekiwanie na żądanie od {{pluginName}}...', + }, + }, + form: { + subscriptionName: { + label: 'Nazwa subskrypcji', + placeholder: 'Wprowadź nazwę subskrypcji', + required: 'Nazwa subskrypcji jest wymagana', + }, + callbackUrl: { + label: 'Adres URL zwrotny', + description: 'Ten adres URL będzie odbierać zdarzenia webhook', + tooltip: 'Udostępnij publicznie dostępny punkt końcowy, który może odbierać żądania wywołań zwrotnych od dostawcy wyzwalacza.', + placeholder: 'Generowanie...', + privateAddressWarning: 'Ten adres URL wydaje się być adresem wewnętrznym, co może spowodować niepowodzenie żądań webhook. Możesz zmienić TRIGGER_URL na adres publiczny.', + }, + }, + errors: { + createFailed: 'Nie udało się utworzyć subskrypcji', + verifyFailed: 'Nie udało się zweryfikować danych uwierzytelniających', + authFailed: 'Autoryzacja nie powiodła się', + networkError: 'Błąd sieci, spróbuj ponownie', + }, + }, + events: { + title: 'Dostępne wydarzenia', + description: 'Zdarzenia, na które ten wtyczka wyzwalacza może się subskrybować', + empty: 'Brak dostępnych wydarzeń', + event: 'Wydarzenie', + events: 'Wydarzenia', + actionNum: '{{num}} {{event}} WŁĄCZONE', + item: { + parameters: 'parametry {{count}}', + noParameters: 'Brak parametrów', + }, + output: 'Wynik', + }, + node: { + status: { + warning: 'Rozłącz', + }, + }, +} + +export default translation diff --git a/web/i18n/pl-PL/plugin.ts b/web/i18n/pl-PL/plugin.ts index 0d02222d8c..dcd799ae2e 100644 --- a/web/i18n/pl-PL/plugin.ts +++ b/web/i18n/pl-PL/plugin.ts @@ -7,6 +7,7 @@ const translation = { tools: 'Narzędzia', models: 'Modele', datasources: 'Źródła danych', + triggers: 'Czynniki wywołujące', }, categorySingle: { model: 'Model', @@ -15,6 +16,7 @@ const translation = { agent: 'Strategia agenta', tool: 'Narzędzie', datasource: 'Źródło danych', + trigger: 'Spust', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { install: 'Instalować', viewDetail: 'Pokaż szczegóły', info: 'Informacje o wtyczce', + back: 'Wstecz', }, toolSelector: { unsupportedContent2: 'Kliknij, aby zmienić wersję.', @@ -306,6 +309,12 @@ const translation = { changeTimezone: 'Aby zmienić strefę czasową, przejdź do Ustawienia', partialUPdate: 'Tylko następujące {{num}} wtyczki będą się automatycznie aktualizować', }, + readmeInfo: { + title: 'PRZECZYTAJMNIE', + needHelpCheckReadme: 'Potrzebujesz pomocy? Sprawdź plik README.', + noReadmeAvailable: 'Brak dostępnego pliku README', + failedToFetch: 'Nie udało się pobrać pliku README', + }, } export default translation diff --git a/web/i18n/pl-PL/workflow.ts b/web/i18n/pl-PL/workflow.ts index f30e9350f7..f8518d44a8 100644 --- a/web/i18n/pl-PL/workflow.ts +++ b/web/i18n/pl-PL/workflow.ts @@ -113,6 +113,15 @@ const translation = { currentWorkflow: 'Bieżący przepływ pracy', currentView: 'Bieżący widok', moreActions: 'Więcej akcji', + listening: 'Słuchanie', + chooseStartNodeToRun: 'Wybierz węzeł początkowy, aby uruchomić', + runAllTriggers: 'Uruchom wszystkie wyzwalacze', + features: 'Cechy', + featuresDescription: 'Ulepsz doświadczenie użytkownika w aplikacji internetowej', + featuresDocLink: 'Dowiedz się więcej', + needAdd: 'Węzeł {{node}} musi zostać dodany', + needStartNode: 'Należy dodać co najmniej jeden węzeł początkowy', + workflowAsToolDisabledHint: 'Opublikuj najnowszy przepływ pracy i upewnij się, że węzeł Wprowadzanie danych użytkownika jest połączony przed skonfigurowaniem go jako narzędzie.', }, env: { envPanelTitle: 'Zmienne Środowiskowe', @@ -219,6 +228,7 @@ const translation = { rerankModelRequired: 'Przed włączeniem Rerank Model upewnij się, że model został pomyślnie skonfigurowany w ustawieniach.', noValidTool: '{{field}} nie wybrano prawidłowego narzędzia', toolParameterRequired: '{{field}}: parametr [{{param}}] jest wymagany', + startNodeRequired: 'Najpierw dodaj węzeł początkowy przed {{operation}}', }, singleRun: { testRun: 'Testowe uruchomienie ', @@ -250,6 +260,21 @@ const translation = { 'allAdded': 'Wszystko dodane', 'sources': 'Źródeł', 'searchDataSource': 'Wyszukiwanie w źródle danych', + 'start': 'Start', + 'searchTrigger': 'Wyzwalacze wyszukiwania...', + 'allTriggers': 'Wszystkie wyzwalacze', + 'noPluginsFound': 'Nie znaleziono żadnych wtyczek', + 'requestToCommunity': 'Prośby do społeczności', + 'featuredTools': 'Polecane', + 'showMoreFeatured': 'Pokaż więcej', + 'showLessFeatured': 'Pokaż mniej', + 'installed': 'Zainstalowano', + 'pluginByAuthor': 'Przez {{author}}', + 'usePlugin': 'Wybierz narzędzie', + 'hideActions': 'Ukryj narzędzia', + 'noFeaturedPlugins': 'Odkryj więcej narzędzi w Marketplace', + 'noFeaturedTriggers': 'Odkryj więcej wyzwalaczy w Marketplace', + 'startDisabledTip': 'Węzeł wyzwalacza i węzeł wprowadzania danych przez użytkownika wzajemnie się wykluczają.', }, blocks: { 'start': 'Start', @@ -276,6 +301,10 @@ const translation = { 'loop': 'Pętla', 'knowledge-index': 'Baza wiedzy', 'datasource': 'Źródło danych', + 'originalStartNode': 'oryginalny węzeł początkowy', + 'trigger-schedule': 'Wyzwalacz harmonogramu', + 'trigger-webhook': 'Wywołanie webhooka', + 'trigger-plugin': 'Wyzwalacz wtyczki', }, blocksAbout: { 'start': 'Zdefiniuj początkowe parametry uruchamiania przepływu pracy', @@ -300,6 +329,9 @@ const translation = { 'loop-end': 'Odpowiada "break". Ten węzeł nie ma elementów konfiguracyjnych. Gdy ciało pętli dotrze do tego węzła, pętla zostaje zakończona.', 'knowledge-index': 'Baza wiedzy o', 'datasource': 'Informacje o źródle danych', + 'trigger-schedule': 'Wyzwalacz przepływu pracy oparty na czasie, który uruchamia przepływy pracy według harmonogramu', + 'trigger-webhook': 'Webhook Trigger odbiera przesyłki HTTP z systemów zewnętrznych, aby automatycznie uruchamiać procesy robocze.', + 'trigger-plugin': 'Wyzwalacz integracji zewnętrznej, który uruchamia przepływy pracy na podstawie zdarzeń z platformy zewnętrznej', }, operator: { zoomIn: 'Powiększ', @@ -340,6 +372,8 @@ const translation = { maximize: 'Maksymalizuj płótno', scrollToSelectedNode: 'Przewiń do wybranego węzła', optional_and_hidden: '(opcjonalne i ukryte)', + goTo: 'Idź do', + startNode: 'Węzeł początkowy', }, nodes: { common: { @@ -787,6 +821,8 @@ const translation = { parallelModeEnableDesc: 'W trybie równoległym zadania w iteracjach obsługują wykonywanie równoległe. Możesz to skonfigurować w panelu właściwości po prawej stronie.', answerNodeWarningDesc: 'Ostrzeżenie w trybie równoległym: węzły odpowiedzi, przypisania zmiennych konwersacji i trwałe operacje odczytu/zapisu w iteracjach mogą powodować wyjątki.', errorResponseMethod: 'Metoda odpowiedzi na błąd', + flattenOutput: 'Spłaszcz wyjście', + flattenOutputDesc: 'Po włączeniu, jeśli wszystkie wyniki iteracji są tablicami, zostaną one spłaszczone do pojedynczej tablicy. Po wyłączeniu wyniki zachowają zagnieżdżoną strukturę tablicy.', }, note: { editor: { @@ -963,6 +999,144 @@ const translation = { embeddingModelIsInvalid: 'Model osadzania jest nieprawidłowy', rerankingModelIsInvalid: 'Model ponownego rankingowania jest nieprawidłowy', }, + triggerPlugin: { + authorized: 'Autoryzowany', + notConfigured: 'Nie skonfigurowano', + notAuthorized: 'Nieautoryzowany', + selectSubscription: 'Wybierz subskrypcję', + availableSubscriptions: 'Dostępne subskrypcje', + addSubscription: 'Dodaj nową subskrypcję', + removeSubscription: 'Usuń subskrypcję', + subscriptionRemoved: 'Subskrypcja została pomyślnie usunięta', + error: 'Błąd', + configuration: 'Konfiguracja', + remove: 'Usuń', + or: 'LUB', + useOAuth: 'Użyj OAuth', + useApiKey: 'Użyj klucza API', + authenticationFailed: 'Uwierzytelnianie nie powiodło się', + authenticationSuccess: 'Uwierzytelnianie powiodło się', + oauthConfigFailed: 'Konfiguracja OAuth nie powiodła się', + configureOAuthClient: 'Skonfiguruj klienta OAuth', + oauthClientDescription: 'Skonfiguruj dane uwierzytelniające klienta OAuth, aby włączyć uwierzytelnianie', + oauthClientSaved: 'Konfiguracja klienta OAuth została pomyślnie zapisana', + configureApiKey: 'Skonfiguruj klucz API', + apiKeyDescription: 'Skonfiguruj dane uwierzytelniające klucza API', + apiKeyConfigured: 'Klucz API został pomyślnie skonfigurowany', + configurationFailed: 'Konfiguracja nie powiodła się', + failedToStart: 'Nie udało się rozpocząć procesu uwierzytelniania', + credentialsVerified: 'Dane uwierzytelniające zostały pomyślnie zweryfikowane', + credentialVerificationFailed: 'Weryfikacja poświadczeń nie powiodła się', + verifyAndContinue: 'Zweryfikuj i kontynuuj', + configureParameters: 'Skonfiguruj parametry', + parametersDescription: 'Skonfiguruj parametry i właściwości wyzwalacza', + configurationComplete: 'Konfiguracja zakończona', + configurationCompleteDescription: 'Twój wyzwalacz został pomyślnie skonfigurowany', + configurationCompleteMessage: 'Twoja konfiguracja wyzwalacza jest teraz kompletna i gotowa do użycia.', + parameters: 'Parametry', + properties: 'Właściwości', + propertiesDescription: 'Dodatkowe właściwości konfiguracji dla tego wyzwalacza', + noConfigurationRequired: 'Nie jest wymagana dodatkowa konfiguracja dla tego wyzwalacza.', + subscriptionName: 'Nazwa subskrypcji', + subscriptionNameDescription: 'Wprowadź unikalną nazwę dla tej subskrypcji wyzwalacza', + subscriptionNamePlaceholder: 'Wpisz nazwę subskrypcji...', + subscriptionNameRequired: 'Nazwa subskrypcji jest wymagana', + subscriptionRequired: 'Wymagana jest subskrypcja', + }, + triggerSchedule: { + title: 'Harmonogram', + nodeTitle: 'Wyzwalacz harmonogramu', + notConfigured: 'Nie skonfigurowano', + useCronExpression: 'Użyj wyrażenia cron', + useVisualPicker: 'Użyj selektora wizualnego', + frequency: { + label: 'CZĘSTOTLIWOŚĆ', + hourly: 'Godzinowy', + daily: 'Codziennie', + weekly: 'Cotygodniowy', + monthly: 'Miesięczny', + }, + selectFrequency: 'Wybierz częstotliwość', + frequencyLabel: 'Częstotliwość', + nextExecution: 'Następna egzekucja', + weekdays: 'Dni tygodnia', + time: 'Czas', + cronExpression: 'Wyrażenie Cron', + nextExecutionTime: 'NASTĘPNY CZAS WYKONANIA', + nextExecutionTimes: 'Następne 5 terminów wykonania', + startTime: 'Czas rozpoczęcia', + executeNow: 'Wykonaj teraz', + selectDateTime: 'Wybierz datę i godzinę', + hours: 'Godziny', + minutes: 'Minuty', + onMinute: 'Za minutę', + days: 'Dni', + lastDay: 'Ostatni dzień', + lastDayTooltip: 'Nie wszystkie miesiące mają 31 dni. Użyj opcji „ostatni dzień”, aby wybrać ostatni dzień każdego miesiąca.', + mode: 'Moda', + timezone: 'Strefa czasowa', + visualConfig: 'Konfiguracja wizualna', + monthlyDay: 'Dzień miesiąca', + executionTime: 'Czas wykonywania', + invalidTimezone: 'Nieprawidłowa strefa czasowa', + invalidCronExpression: 'Nieprawidłowe wyrażenie cron', + noValidExecutionTime: 'Nie można obliczyć prawidłowego czasu wykonania', + executionTimeCalculationError: 'Nie udało się obliczyć czasów wykonania', + invalidFrequency: 'Nieprawidłowa częstotliwość', + invalidStartTime: 'Nieprawidłowy czas rozpoczęcia', + startTimeMustBeFuture: 'Czas rozpoczęcia musi być w przyszłości', + invalidTimeFormat: 'Nieprawidłowy format godziny (oczekiwano GG:MM AM/PM)', + invalidWeekday: 'Nieprawidłowy dzień tygodnia: {{weekday}}', + invalidMonthlyDay: 'Miesięczny dzień musi być między 1 a 31 lub „ostatni”', + invalidOnMinute: 'Minuta musi mieścić się w przedziale od 0 do 59', + invalidExecutionTime: 'Nieprawidłowy czas wykonania', + executionTimeMustBeFuture: 'Czas wykonania musi być w przyszłości', + }, + triggerWebhook: { + title: 'Wywołanie webhooka', + nodeTitle: '🔗 Wyzwalacz Webhook', + configPlaceholder: 'Konfiguracja wyzwalacza webhook zostanie tutaj wdrożona', + webhookUrl: 'Adres URL webhooka', + webhookUrlPlaceholder: 'Kliknij wygeneruj, aby utworzyć adres URL webhooka', + generate: 'Generuj', + copy: 'Kopiuj', + test: 'Test', + urlGenerated: 'Adres URL webhooka został pomyślnie wygenerowany', + urlGenerationFailed: 'Nie udało się wygenerować adresu URL webhooka', + urlCopied: 'Adres URL skopiowany do schowka', + method: 'Metoda', + contentType: 'Rodzaj treści', + queryParameters: 'Parametry zapytania', + headerParameters: 'Parametry nagłówka', + requestBodyParameters: 'Parametry ciała żądania', + parameterName: 'Nazwa zmiennej', + varName: 'Nazwa zmiennej', + varType: 'Rodzaj', + varNamePlaceholder: 'Wprowadź nazwę zmiennej...', + required: 'Wymagane', + addParameter: 'Dodaj', + addHeader: 'Dodaj', + noParameters: 'Nie skonfigurowano żadnych parametrów', + noQueryParameters: 'Brak skonfigurowanych parametrów zapytania', + noHeaders: 'Nie skonfigurowano nagłówków', + noBodyParameters: 'Brak skonfigurowanych parametrów ciała', + debugUrlTitle: 'Do testów zawsze używaj tego adresu URL', + debugUrlCopy: 'Kliknij, aby skopiować', + debugUrlCopied: 'Skopiowano!', + debugUrlPrivateAddressWarning: 'Ten adres URL wydaje się być adresem wewnętrznym, co może spowodować niepowodzenie żądań webhook. Możesz zmienić TRIGGER_URL na adres publiczny.', + errorHandling: 'Obsługa błędów', + errorStrategy: 'Obsługa błędów', + responseConfiguration: 'Odpowiedź', + asyncMode: 'Tryb asynchroniczny', + statusCode: 'Kod statusu', + responseBody: 'Treść odpowiedzi', + responseBodyPlaceholder: 'Napisz tutaj treść swojej odpowiedzi', + headers: 'Nagłówki', + validation: { + webhookUrlRequired: 'Adres URL webhooka jest wymagany', + invalidParameterType: 'Nieprawidłowy typ parametru "{{type}}" dla parametru "{{name}}"', + }, + }, }, tracing: { stopBy: 'Zatrzymane przez {{user}}', @@ -1037,6 +1211,18 @@ const translation = { largeDataNoExport: 'Duże dane — tylko częściowy podgląd', largeData: 'Duże dane, podgląd tylko do odczytu. Eksportuj, aby wyświetlić wszystko.', exportToolTip: 'Eksportuj zmienną jako plik', + listening: { + title: 'Oczekiwanie na zdarzenia wywoływane przez wyzwalacze...', + tip: 'Możesz teraz symulować wywołania zdarzeń, wysyłając testowe żądania do punktu końcowego HTTP {{nodeName}} lub użyć go jako adresu URL do wywołań zwrotnych w celu debugowania zdarzeń na żywo. Wszystkie wyniki można przeglądać bezpośrednio w Inspektorze Zmiennych.', + tipPlugin: 'Teraz możesz tworzyć zdarzenia w {{- pluginName}} i pobierać wyniki z tych zdarzeń w Inspektorze Zmiennych.', + tipSchedule: 'Nasłuchiwanie zdarzeń z wyzwalaczy harmonogramu.\nNastępne zaplanowane uruchomienie: {{nextTriggerTime}}', + tipFallback: 'Oczekiwanie na nadchodzące zdarzenia wyzwalające. Wyniki pojawią się tutaj.', + defaultNodeName: 'ten wyzwalacz', + defaultPluginName: 'ten wtyczka wyzwalacz', + defaultScheduleTime: 'Nie skonfigurowano', + selectedTriggers: 'wybrane wyzwalacze', + stopButton: 'Stop', + }, }, settingsTab: 'Ustawienia', lastRunTab: 'Ostatnie uruchomienie', @@ -1054,11 +1240,52 @@ const translation = { noMatchingInputsFound: 'Nie znaleziono pasujących danych wejściowych z ostatniego uruchomienia', copyLastRunError: 'Nie udało się skopiować danych wejściowych z ostatniego uruchomienia', lastOutput: 'Ostatni wynik', + lastRunInputsCopied: '{{count}} dane wejściowe skopiowane z ostatniego uruchomienia', }, sidebar: { exportWarning: 'Eksportuj obecną zapisaną wersję', exportWarningDesc: 'To wyeksportuje aktualnie zapisaną wersję twojego przepływu pracy. Jeśli masz niesave\'owane zmiany w edytorze, najpierw je zapisz, korzystając z opcji eksportu w kanwie przepływu pracy.', }, + publishLimit: { + startNodeTitlePrefix: 'Uaktualnij do', + startNodeTitleSuffix: 'odblokuj nieograniczoną liczbę wyzwalaczy na przepływ pracy', + startNodeDesc: 'Osiągnąłeś limit 2 wyzwalaczy na przepływ pracy w tym planie. Zaktualizuj plan, aby opublikować ten przepływ pracy.', + }, + error: { + startNodeRequired: 'Najpierw dodaj węzeł początkowy przed {{operation}}', + operations: { + connectingNodes: 'łączące węzły', + addingNodes: 'dodawanie węzłów', + modifyingWorkflow: 'modyfikowanie przepływu pracy', + updatingWorkflow: 'aktualizowanie przepływu pracy', + }, + }, + customWebhook: 'Niestandardowy webhook', + difyTeam: 'Zespół Dify', + triggerStatus: { + enabled: 'WYZWALACZ', + disabled: 'WYZWALACZ • WYŁĄCZONY', + }, + entryNodeStatus: { + enabled: 'START', + disabled: 'START • WYŁĄCZONY', + }, + onboarding: { + title: 'Wybierz węzeł początkowy, aby rozpocząć', + description: 'Różne węzły początkowe mają różne możliwości. Nie martw się, zawsze możesz je później zmienić.', + userInputFull: 'Wprowadzanie użytkownika (oryginalny węzeł początkowy)', + userInputDescription: 'Węzeł startowy umożliwiający ustawianie zmiennych wejściowych użytkownika, z możliwością korzystania jako aplikacja internetowa, API usługi, serwer MCP oraz workflow.', + trigger: 'Spust', + triggerDescription: 'Wyzwalacze mogą służyć jako węzeł początkowy w przepływie pracy, na przykład zaplanowane zadania, niestandardowe webhooki lub integracje z innymi aplikacjami.', + back: 'Wstecz', + learnMore: 'Dowiedz się więcej', + aboutStartNode: 'o węźle startowym.', + escTip: { + press: 'Naciśnij', + key: 'esc', + toDismiss: 'zwolnić', + }, + }, } export default translation diff --git a/web/i18n/pt-BR/app-debug.ts b/web/i18n/pt-BR/app-debug.ts index 26194863a7..d578cb5a84 100644 --- a/web/i18n/pt-BR/app-debug.ts +++ b/web/i18n/pt-BR/app-debug.ts @@ -330,6 +330,7 @@ const translation = { 'multi-files': 'Lista de arquivos', 'single-file': 'Fila indiana', 'maxNumberOfUploads': 'Número máximo de uploads', + 'maxNumberTip': 'Documento < {{docLimit}}, imagem < {{imgLimit}}, áudio < {{audioLimit}}, vídeo < {{videoLimit}}', 'uploadFileTypes': 'Carregar tipos de arquivo', 'both': 'Ambos', 'localUpload': 'Local Upload', diff --git a/web/i18n/pt-BR/app-log.ts b/web/i18n/pt-BR/app-log.ts index 9d7e318cfe..55d654bf37 100644 --- a/web/i18n/pt-BR/app-log.ts +++ b/web/i18n/pt-BR/app-log.ts @@ -19,6 +19,7 @@ const translation = { tokens: 'TOKENS', user: 'USUÁRIO FINAL OU CONTA', version: 'VERSÃO', + triggered_from: 'ATIVADO POR', }, pagination: { previous: 'Anterior', @@ -99,6 +100,15 @@ const translation = { toolUsed: 'Ferramenta usada', }, dateFormat: 'DD/MM/AAAA', + triggerBy: { + debugging: 'Depuração', + appRun: 'Aplicativo Web', + webhook: 'Webhook', + schedule: 'Agenda', + plugin: 'Plugin', + ragPipelineRun: 'Pipeline RAG', + ragPipelineDebugging: 'Depuração RAG', + }, } export default translation diff --git a/web/i18n/pt-BR/app-overview.ts b/web/i18n/pt-BR/app-overview.ts index 37106ed15e..b31a4bb14d 100644 --- a/web/i18n/pt-BR/app-overview.ts +++ b/web/i18n/pt-BR/app-overview.ts @@ -114,7 +114,11 @@ const translation = { }, }, launch: 'Lançar', - enableTooltip: {}, + enableTooltip: { + description: 'Para ativar este recurso, adicione um nó de Entrada do Usuário ao canvas. (Pode já existir no rascunho, e entra em efeito após a publicação)', + learnMore: 'Saiba mais', + }, + title: 'Aplicativo Web', }, apiInfo: { title: 'API de Serviço de Back-end', @@ -126,7 +130,14 @@ const translation = { running: 'Em serviço', disable: 'Desabilitar', }, - triggerInfo: {}, + triggerInfo: { + title: 'Gatilhos', + explanation: 'Gerenciamento de gatilho de fluxo de trabalho', + triggersAdded: '{{count}} gatilhos adicionados', + noTriggerAdded: 'Nenhum gatilho adicionado', + triggerStatusDescription: 'O status do nó de gatilho aparece aqui. (Pode já existir no rascunho, entra em vigor após a publicação)', + learnAboutTriggers: 'Saiba mais sobre Gatilhos', + }, disableTooltip: { triggerMode: 'O recurso {{feature}} não é compatível no modo Nó de Gatilho.', }, diff --git a/web/i18n/pt-BR/billing.ts b/web/i18n/pt-BR/billing.ts index 8b5446808c..61f95bc13c 100644 --- a/web/i18n/pt-BR/billing.ts +++ b/web/i18n/pt-BR/billing.ts @@ -98,6 +98,8 @@ const translation = { triggerEvents: { unlimited: 'Eventos de Gatilho Ilimitados', tooltip: 'O número de eventos que iniciam automaticamente fluxos de trabalho através de disparadores de Plugin, Agendamento ou Webhook.', + sandbox: '{{count,number}} Acionar Eventos', + professional: '{{count,number}} Eventos de disparo/mês', }, workflowExecution: { tooltip: 'Prioridade e velocidade da fila de execução de fluxo de trabalho.', @@ -107,6 +109,11 @@ const translation = { }, startNodes: { unlimited: 'Eventos de Gatilho/fluxo de trabalho ilimitados', + limited: 'Até {{count}} Acionadores/workflow', + }, + title: { + plans: 'planos', + description: 'Selecione o plano que melhor se adapta às necessidades da sua equipe.', }, }, plans: { @@ -129,16 +136,14 @@ const translation = { name: 'Empresa', description: 'Obtenha capacidades completas e suporte para sistemas críticos em larga escala.', includesTitle: 'Tudo no plano Equipe, além de:', - features: { - }, + features: ['Soluções de Implantação Escaláveis de Nível Empresarial', 'Autorização de Licença Comercial', 'Recursos Exclusivos para Empresas', 'Múltiplos Espaços de Trabalho e Gestão Empresarial', 'SSO', 'SLAs negociados pelos parceiros da Dify', 'Segurança e Controles Avançados', 'Atualizações e Manutenção pela Dify Oficialmente', 'Suporte Técnico Profissional'], btnText: 'Contate Vendas', priceTip: 'Faturamento Anual Apenas', price: 'Custom', for: 'Para equipes de grande porte', }, community: { - features: { - }, + features: ['Todos os Recursos Principais Lançados no Repositório Público', 'Espaço de Trabalho Único', 'Está em conformidade com a Licença de Código Aberto Dify'], name: 'Comunidade', description: 'Para Usuários Individuais, Pequenas Equipes ou Projetos Não Comerciais', includesTitle: 'Recursos Gratuitos:', @@ -147,8 +152,7 @@ const translation = { for: 'Para Usuários Individuais, Pequenas Equipes ou Projetos Não Comerciais', }, premium: { - features: { - }, + features: ['Confiabilidade Autogerenciada por Diversos Provedores de Nuvem', 'Espaço de Trabalho Único', 'Personalização de Logo e Marca do WebApp', 'Suporte Prioritário por E-mail e Chat'], includesTitle: 'Tudo da Comunidade, além de:', for: 'Para organizações e equipes de médio porte', price: 'Escalável', @@ -184,6 +188,7 @@ const translation = { buildApps: 'Desenvolver Apps', perMonth: 'por mês', triggerEvents: 'Eventos de Gatilho', + resetsIn: 'Reinicia em {{count,number}} dias', }, teamMembers: 'Membros da equipe', triggerLimitModal: { diff --git a/web/i18n/pt-BR/common.ts b/web/i18n/pt-BR/common.ts index e98d5d0748..8f3fad6cbb 100644 --- a/web/i18n/pt-BR/common.ts +++ b/web/i18n/pt-BR/common.ts @@ -65,10 +65,17 @@ const translation = { yes: 'Sim', deleteConfirmTitle: 'Excluir?', confirmAction: 'Por favor, confirme sua ação.', + noSearchResults: 'Nenhum {{content}} foi encontrado', + resetKeywords: 'Redefinir palavras-chave', + selectCount: '{{count}} Selecionado', + searchCount: 'Encontre {{count}} {{content}}', + noSearchCount: '0 {{content}}', + now: 'Agora', }, placeholder: { input: 'Por favor, insira', select: 'Por favor, selecione', + search: 'Pesquisar...', }, voice: { language: { @@ -769,6 +776,13 @@ const translation = { label: { optional: '(opcional)', }, + noData: 'Sem dados', + dynamicSelect: { + error: 'Falha ao carregar opções', + noData: 'Nenhuma opção disponível', + loading: 'Carregando opções...', + selected: '{{count}} selecionado', + }, } export default translation diff --git a/web/i18n/pt-BR/dataset-documents.ts b/web/i18n/pt-BR/dataset-documents.ts index 4a799cd2b8..f53e82d711 100644 --- a/web/i18n/pt-BR/dataset-documents.ts +++ b/web/i18n/pt-BR/dataset-documents.ts @@ -81,7 +81,10 @@ const translation = { }, addUrl: 'Adicionar URL', learnMore: 'Saiba Mais', - sort: {}, + sort: { + uploadTime: 'Hora do envio', + hitCount: 'Contagem de Recuperação', + }, }, metadata: { title: 'Metadados', diff --git a/web/i18n/pt-BR/dataset-pipeline.ts b/web/i18n/pt-BR/dataset-pipeline.ts index 70c4c399c5..0348ce70e3 100644 --- a/web/i18n/pt-BR/dataset-pipeline.ts +++ b/web/i18n/pt-BR/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'Pipeline de conhecimento publicado', + tip: 'Vá para Documentos para adicionar ou gerenciar documentos.', }, error: { message: 'Falha ao publicar o pipeline de conhecimento', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'Estrutura', structureTooltip: 'A Estrutura de Partes determina como os documentos são divididos e indexados, oferecendo os modos Geral, Pai-Filho e P e Resposta, e é exclusiva para cada base de conhecimento.', + createdBy: 'Por {{author}}', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { characters: 'Caracteres', title: 'Adicionar documentos', backToDataSource: 'Fonte de dados', + selectOnlineDocumentTip: 'Processar até {{count}} páginas', + selectOnlineDriveTip: 'Processar até {{count}} arquivos, com no máximo {{fileSize}} MB cada', }, documentSettings: { title: 'Configurações do documento', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} páginas', + }, onlineDrive: { breadcrumbs: { searchPlaceholder: 'Pesquisar arquivos...', allFiles: 'Todos os arquivos', allBuckets: 'Todos os buckets do Cloud Storage', + searchResult: 'Encontrar {{searchResultsLength}} itens na pasta "{{folderName}}"', }, resetKeywords: 'Redefinir palavras-chave', notSupportedFileType: 'Este tipo de arquivo não é suportado', emptyFolder: 'Esta pasta está vazia', emptySearchResult: 'Nenhum item foi encontrado', + notConnected: '{{name}} não está conectado', + notConnectedTip: 'Para sincronizar com {{name}}, a conexão com {{name}} deve ser estabelecida primeiro.', + }, + credentialSelector: { + name: '{{credentialName}} de {{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { title: 'Confirmação', @@ -149,6 +160,7 @@ const translation = { knowledgeNameAndIcon: 'Nome e ícone do conhecimento', editPipelineInfo: 'Editar informações do pipeline', knowledgeDescriptionPlaceholder: 'Descreva o que está nesta Base de Conhecimento. Uma descrição detalhada permite que a IA acesse o conteúdo do conjunto de dados com mais precisão. Se estiver vazio, o Dify usará a estratégia de acerto padrão. (Opcional)', + configurationTip: 'Configure {{pluginName}}', } export default translation diff --git a/web/i18n/pt-BR/dataset.ts b/web/i18n/pt-BR/dataset.ts index 77cac80a19..1322a22f62 100644 --- a/web/i18n/pt-BR/dataset.ts +++ b/web/i18n/pt-BR/dataset.ts @@ -234,6 +234,10 @@ const translation = { title: 'API de Serviço', disabled: 'Desativado', }, + docAllEnabled_one: '{{count}} documento habilitado', + docAllEnabled_other: 'Todos os documentos {{count}} ativados', + partialEnabled_one: 'Total de {{count}} documentos, {{num}} disponíveis', + partialEnabled_other: 'Total de {{count}} documentos, {{num}} disponíveis', } export default translation diff --git a/web/i18n/pt-BR/education.ts b/web/i18n/pt-BR/education.ts index c062f573c6..1516df76d1 100644 --- a/web/i18n/pt-BR/education.ts +++ b/web/i18n/pt-BR/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: 'Não se preocupe — isso não afetará sua assinatura atual, mas você não receberá o desconto educacional quando ela for renovada, a menos que você verifique seu status novamente.', + title: 'Seu status educacional expirará em {{date}}', }, stillInEducation: { title: 'Ainda na educação?', diff --git a/web/i18n/pt-BR/pipeline.ts b/web/i18n/pt-BR/pipeline.ts index ba5e65ab6f..ac670c7e64 100644 --- a/web/i18n/pt-BR/pipeline.ts +++ b/web/i18n/pt-BR/pipeline.ts @@ -28,10 +28,12 @@ const translation = { loading: 'Processamento... Aguarde', error: 'Ocorreu um erro durante a execução', viewDetails: 'Ver detalhes', + footerTip: 'No modo de execução de teste, visualize até {{count}} blocos', }, }, ragToolSuggestions: { title: 'Sugestões para RAG', + noRecommendationPlugins: 'Nenhum plugin recomendado, encontre mais em Marketplace', }, } diff --git a/web/i18n/pt-BR/plugin-trigger.ts b/web/i18n/pt-BR/plugin-trigger.ts new file mode 100644 index 0000000000..d7cc597bbf --- /dev/null +++ b/web/i18n/pt-BR/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'Assinaturas', + listNum: 'Assinaturas {{num}}', + empty: { + title: 'Sem assinaturas', + button: 'Nova assinatura', + }, + createButton: { + oauth: 'Nova assinatura com OAuth', + apiKey: 'Nova assinatura com chave de API', + manual: 'Cole a URL para criar uma nova assinatura', + }, + createSuccess: 'Assinatura criada com sucesso', + createFailed: 'Falha ao criar assinatura', + maxCount: 'Máximo de {{num}} assinaturas', + selectPlaceholder: 'Selecionar assinatura', + noSubscriptionSelected: 'Nenhuma assinatura selecionada', + subscriptionRemoved: 'Assinatura removida', + list: { + title: 'Assinaturas', + addButton: 'Adicionar', + tip: 'Receber eventos via Assinatura', + item: { + enabled: 'Habilitado', + disabled: 'Desativado', + credentialType: { + api_key: 'Chave de API', + oauth2: 'OAuth', + unauthorized: 'Manual', + }, + actions: { + delete: 'Excluir', + deleteConfirm: { + title: 'Excluir {{name}}?', + success: 'Assinatura {{name}} excluída com sucesso', + error: 'Falha ao excluir a assinatura {{name}}', + content: 'Uma vez excl assinada, esta assinatura não pode ser recuperada. Por favor, confirme.', + contentWithApps: 'A assinatura atual é referenciada por {{count}} aplicativos. Excluí-la fará com que os aplicativos configurados parem de receber eventos da assinatura.', + confirm: 'Confirmar Exclusão', + cancel: 'Cancelar', + confirmInputWarning: 'Por favor, insira o nome correto para confirmar.', + confirmInputPlaceholder: 'Digite "{{name}}" para confirmar.', + confirmInputTip: 'Por favor, digite “{{name}}” para confirmar.', + }, + }, + status: { + active: 'Ativo', + inactive: 'Inativo', + }, + usedByNum: 'Usado por {{num}} fluxos de trabalho', + noUsed: 'Nenhum fluxo de trabalho usado', + }, + }, + addType: { + title: 'Adicionar assinatura', + description: 'Escolha como você deseja criar sua assinatura de gatilho', + options: { + apikey: { + title: 'Criar com Chave de API', + description: 'Criar assinatura automaticamente usando credenciais da API', + }, + oauth: { + title: 'Criar com OAuth', + description: 'Autorizar com plataforma de terceiros para criar assinatura', + clientSettings: 'Configurações do Cliente OAuth', + clientTitle: 'Cliente OAuth', + default: 'Padrão', + custom: 'Personalizado', + }, + manual: { + title: 'Configuração Manual', + description: 'Cole a URL para criar uma nova assinatura', + tip: 'Configure a URL na plataforma de terceiros manualmente', + }, + }, + }, + }, + modal: { + steps: { + verify: 'Verificar', + configuration: 'Configuração', + }, + common: { + cancel: 'Cancelar', + back: 'Voltar', + next: 'Próximo', + create: 'Criar', + verify: 'Verificar', + authorize: 'Autorizar', + creating: 'Criando...', + verifying: 'Verificando...', + authorizing: 'Autorizando...', + }, + oauthRedirectInfo: 'Nenhum segredo de cliente do sistema foi encontrado para este provedor de ferramenta, é necessário configurá-lo manualmente; para redirect_uri, por favor use', + apiKey: { + title: 'Criar com Chave de API', + verify: { + title: 'Verificar Credenciais', + description: 'Por favor, forneça suas credenciais de API para verificar o acesso', + error: 'Falha na verificação de credenciais. Por favor, verifique sua chave de API.', + success: 'Credenciais verificadas com sucesso', + }, + configuration: { + title: 'Configurar Assinatura', + description: 'Configure os parâmetros da sua assinatura', + }, + }, + oauth: { + title: 'Criar com OAuth', + authorization: { + title: 'Autorização OAuth', + description: 'Autorize o Dify a acessar sua conta', + redirectUrl: 'Redirecionar URL', + redirectUrlHelp: 'Use este URL na configuração do seu aplicativo OAuth', + authorizeButton: 'Autorizar com {{provider}}', + waitingAuth: 'Aguardando autorização...', + authSuccess: 'Autorização bem-sucedida', + authFailed: 'Falha ao obter informações de autorização OAuth', + waitingJump: 'Autorizado, aguardando decolagem', + }, + configuration: { + title: 'Configurar Assinatura', + description: 'Configure os parâmetros da sua assinatura após a autorização', + success: 'Configuração do OAuth bem-sucedida', + failed: 'Falha na configuração do OAuth', + }, + remove: { + success: 'Remoção do OAuth bem-sucedida', + failed: 'Falha ao remover OAuth', + }, + save: { + success: 'Configuração do OAuth salva com sucesso', + }, + }, + manual: { + title: 'Configuração Manual', + description: 'Configure sua assinatura de webhook manualmente', + logs: { + title: 'Registros de Solicitações', + request: 'Solicitação', + loading: 'Aguardando solicitação de {{pluginName}}...', + }, + }, + form: { + subscriptionName: { + label: 'Nome da Assinatura', + placeholder: 'Digite o nome da assinatura', + required: 'O nome da assinatura é obrigatório', + }, + callbackUrl: { + label: 'URL de Retorno de Chamada', + description: 'Esta URL receberá eventos de webhook', + tooltip: 'Forneça um endpoint acessível publicamente que possa receber solicitações de retorno de chamada do provedor de gatilho.', + placeholder: 'Gerando...', + privateAddressWarning: 'Este URL parece ser um endereço interno, o que pode fazer com que as solicitações do webhook falhem. Você pode alterar o TRIGGER_URL para um endereço público.', + }, + }, + errors: { + createFailed: 'Falha ao criar assinatura', + verifyFailed: 'Falha ao verificar as credenciais', + authFailed: 'Autorização falhou', + networkError: 'Erro de rede, por favor tente novamente', + }, + }, + events: { + title: 'Eventos Disponíveis', + description: 'Eventos aos quais este plugin de gatilho pode se inscrever', + empty: 'Nenhum evento disponível', + event: 'Evento', + events: 'Eventos', + actionNum: '{{num}} {{event}} INCLUÍDO', + item: { + parameters: 'parâmetros {{count}}', + noParameters: 'Sem parâmetros', + }, + output: 'Saída', + }, + node: { + status: { + warning: 'Desconectar', + }, + }, +} + +export default translation diff --git a/web/i18n/pt-BR/plugin.ts b/web/i18n/pt-BR/plugin.ts index fe38f4eed4..0fc620579c 100644 --- a/web/i18n/pt-BR/plugin.ts +++ b/web/i18n/pt-BR/plugin.ts @@ -7,6 +7,7 @@ const translation = { agents: 'Estratégias do agente', tools: 'Ferramentas', datasources: 'Fontes de dados', + triggers: 'Gatilhos', }, categorySingle: { model: 'Modelo', @@ -15,6 +16,7 @@ const translation = { extension: 'Extensão', tool: 'Ferramenta', datasource: 'Fonte de dados', + trigger: 'Gatilho', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { detail: 'Detalhes', remove: 'Retirar', viewDetail: 'Ver detalhes', + back: 'Voltar', }, toolSelector: { uninstalledLink: 'Gerenciar em plug-ins', @@ -306,6 +309,12 @@ const translation = { partialUPdate: 'Apenas os seguintes {{num}} plugins serão atualizados automaticamente', updateSettings: 'Atualizar Configurações', }, + readmeInfo: { + title: 'LEIA-ME', + needHelpCheckReadme: 'Precisa de ajuda? Confira o README.', + noReadmeAvailable: 'Nenhum README disponível', + failedToFetch: 'Falha ao buscar o README', + }, } export default translation diff --git a/web/i18n/pt-BR/workflow.ts b/web/i18n/pt-BR/workflow.ts index 265274c979..079cca89d8 100644 --- a/web/i18n/pt-BR/workflow.ts +++ b/web/i18n/pt-BR/workflow.ts @@ -113,6 +113,15 @@ const translation = { currentView: 'Visualização atual', currentWorkflow: 'Fluxo de trabalho atual', moreActions: 'Mais ações', + listening: 'Ouvindo', + chooseStartNodeToRun: 'Escolha o nó inicial para executar', + runAllTriggers: 'Executar todos os gatilhos', + features: 'Recursos', + featuresDescription: 'Melhorar a experiência do usuário em aplicativos web', + featuresDocLink: 'Saiba mais', + needAdd: 'O nó {{node}} deve ser adicionado', + needStartNode: 'Pelo menos um nó inicial deve ser adicionado', + workflowAsToolDisabledHint: 'Publique o fluxo de trabalho mais recente e garanta que haja um nó de Entrada do Usuário conectado antes de configurá-lo como uma ferramenta.', }, env: { envPanelTitle: 'Variáveis de Ambiente', @@ -219,6 +228,7 @@ const translation = { rerankModelRequired: 'Antes de ativar o modelo de reclassificação, confirme se o modelo foi configurado com sucesso nas configurações.', toolParameterRequired: '{{field}}: o parâmetro [{{param}}] é necessário', noValidTool: '{{field}} nenhuma ferramenta válida selecionada', + startNodeRequired: 'Por favor, adicione um nó inicial antes de {{operation}}', }, singleRun: { testRun: 'Execução de teste ', @@ -250,6 +260,21 @@ const translation = { 'allAdded': 'Todos adicionados', 'sources': 'Fontes', 'searchDataSource': 'Fonte de dados de pesquisa', + 'start': 'Começar', + 'searchTrigger': 'Gatilhos de pesquisa...', + 'allTriggers': 'Todos os gatilhos', + 'noPluginsFound': 'Nenhum plugin foi encontrado', + 'requestToCommunity': 'Solicitações à comunidade', + 'featuredTools': 'Em destaque', + 'showMoreFeatured': 'Mostrar mais', + 'showLessFeatured': 'Mostrar menos', + 'installed': 'Instalado', + 'pluginByAuthor': 'Por {{author}}', + 'usePlugin': 'Selecionar ferramenta', + 'hideActions': 'Ocultar ferramentas', + 'noFeaturedPlugins': 'Descubra mais ferramentas no Marketplace', + 'noFeaturedTriggers': 'Descubra mais gatilhos no Marketplace', + 'startDisabledTip': 'O nó de gatilho e o nó de entrada do usuário são mutuamente exclusivos.', }, blocks: { 'start': 'Iniciar', @@ -276,6 +301,10 @@ const translation = { 'loop': 'Laço', 'knowledge-index': 'Base de conhecimento', 'datasource': 'Fonte de dados', + 'originalStartNode': 'nó inicial original', + 'trigger-schedule': 'Acionador de Agendamento', + 'trigger-webhook': 'Acionador de Webhook', + 'trigger-plugin': 'Acionador de Plugin', }, blocksAbout: { 'start': 'Definir os parâmetros iniciais para iniciar um fluxo de trabalho', @@ -300,6 +329,9 @@ const translation = { 'loop': 'Execute um loop de lógica até que a condição de término seja atendida ou o número máximo de loops seja alcançado.', 'knowledge-index': 'Base de Conhecimento Sobre', 'datasource': 'Fonte de dados Sobre', + 'trigger-schedule': 'Gatilho de fluxo de trabalho baseado em tempo que inicia fluxos de trabalho em um cronograma', + 'trigger-webhook': 'O Gatinho de Webhook recebe envios HTTP de sistemas terceirizados para acionar fluxos de trabalho automaticamente.', + 'trigger-plugin': 'Gatilho de integração de terceiros que inicia fluxos de trabalho a partir de eventos de plataformas externas', }, operator: { zoomIn: 'Aproximar', @@ -340,6 +372,8 @@ const translation = { minimize: 'Sair do Modo Tela Cheia', scrollToSelectedNode: 'Role até o nó selecionado', optional_and_hidden: '(opcional & oculto)', + goTo: 'Ir para', + startNode: 'Iniciar Nó', }, nodes: { common: { @@ -787,6 +821,8 @@ const translation = { MaxParallelismDesc: 'O paralelismo máximo é usado para controlar o número de tarefas executadas simultaneamente em uma única iteração.', answerNodeWarningDesc: 'Aviso de modo paralelo: nós de resposta, atribuições de variáveis de conversação e operações persistentes de leitura/gravação em iterações podem causar exceções.', parallelPanelDesc: 'No modo paralelo, as tarefas na iteração dão suporte à execução paralela.', + flattenOutput: 'Achatar Saída', + flattenOutputDesc: 'Quando ativado, se todas as saídas de iteração forem arrays, elas serão achatadas em um único array. Quando desativado, as saídas manterão uma estrutura de array aninhada.', }, note: { editor: { @@ -963,6 +999,144 @@ const translation = { embeddingModelIsInvalid: 'O modelo de incorporação é inválido', rerankingModelIsInvalid: 'O modelo de reclassificação é inválido', }, + triggerPlugin: { + authorized: 'Autorizado', + notConfigured: 'Não Configurado', + notAuthorized: 'Não Autorizado', + selectSubscription: 'Selecionar Assinatura', + availableSubscriptions: 'Assinaturas Disponíveis', + addSubscription: 'Adicionar Nova Assinatura', + removeSubscription: 'Cancelar Assinatura', + subscriptionRemoved: 'Assinatura removida com sucesso', + error: 'Erro', + configuration: 'Configuração', + remove: 'Remover', + or: 'OU', + useOAuth: 'Usar OAuth', + useApiKey: 'Usar chave de API', + authenticationFailed: 'Autenticação falhou', + authenticationSuccess: 'Autenticação bem-sucedida', + oauthConfigFailed: 'Falha na configuração do OAuth', + configureOAuthClient: 'Configurar Cliente OAuth', + oauthClientDescription: 'Configure as credenciais de cliente OAuth para habilitar a autenticação', + oauthClientSaved: 'Configuração do cliente OAuth salva com sucesso', + configureApiKey: 'Configurar Chave de API', + apiKeyDescription: 'Configure as credenciais da chave de API para autenticação', + apiKeyConfigured: 'Chave de API configurada com sucesso', + configurationFailed: 'Configuração falhou', + failedToStart: 'Falha ao iniciar o processo de autenticação', + credentialsVerified: 'Credenciais verificadas com sucesso', + credentialVerificationFailed: 'Falha na verificação das credenciais', + verifyAndContinue: 'Verificar e Continuar', + configureParameters: 'Configurar Parâmetros', + parametersDescription: 'Configure os parâmetros e propriedades do gatilho', + configurationComplete: 'Configuração Concluída', + configurationCompleteDescription: 'Seu gatilho foi configurado com sucesso', + configurationCompleteMessage: 'Sua configuração de gatilho está agora completa e pronta para uso.', + parameters: 'Parâmetros', + properties: 'Propriedades', + propertiesDescription: 'Propriedades de configuração adicionais para este gatilho', + noConfigurationRequired: 'Nenhuma configuração adicional é necessária para este gatilho.', + subscriptionName: 'Nome da Assinatura', + subscriptionNameDescription: 'Digite um nome único para esta assinatura de gatilho', + subscriptionNamePlaceholder: 'Digite o nome da assinatura...', + subscriptionNameRequired: 'O nome da assinatura é obrigatório', + subscriptionRequired: 'É necessário assinatura', + }, + triggerSchedule: { + title: 'Agenda', + nodeTitle: 'Acionador de Agendamento', + notConfigured: 'Não configurado', + useCronExpression: 'Use expressão cron', + useVisualPicker: 'Usar seletor visual', + frequency: { + label: 'FREQUÊNCIA', + hourly: 'Por hora', + daily: 'Diário', + weekly: 'Semanal', + monthly: 'Mensal', + }, + selectFrequency: 'Selecionar frequência', + frequencyLabel: 'Frequência', + nextExecution: 'Próxima execução', + weekdays: 'Dias da semana', + time: 'Tempo', + cronExpression: 'Expressão Cron', + nextExecutionTime: 'PRÓXIMA HORA DE EXECUÇÃO', + nextExecutionTimes: 'Próximos 5 tempos de execução', + startTime: 'Hora de Início', + executeNow: 'Executar agora', + selectDateTime: 'Selecionar data e hora', + hours: 'Horas', + minutes: 'Minutos', + onMinute: 'No Minuto', + days: 'Dias', + lastDay: 'Último dia', + lastDayTooltip: 'Nem todos os meses têm 31 dias. Use a opção \'último dia\' para selecionar o último dia de cada mês.', + mode: 'Modo', + timezone: 'Fuso horário', + visualConfig: 'Configuração Visual', + monthlyDay: 'Dia do Mês', + executionTime: 'Tempo de Execução', + invalidTimezone: 'Fuso horário inválido', + invalidCronExpression: 'Expressão cron inválida', + noValidExecutionTime: 'Não é possível calcular um tempo de execução válido', + executionTimeCalculationError: 'Falha ao calcular os tempos de execução', + invalidFrequency: 'Frequência inválida', + invalidStartTime: 'Horário de início inválido', + startTimeMustBeFuture: 'O horário de início deve ser no futuro', + invalidTimeFormat: 'Formato de hora inválido (esperado HH:MM AM/PM)', + invalidWeekday: 'Dia da semana inválido: {{weekday}}', + invalidMonthlyDay: 'O dia mensal deve estar entre 1-31 ou "último"', + invalidOnMinute: 'O minuto deve estar entre 0 e 59', + invalidExecutionTime: 'Tempo de execução inválido', + executionTimeMustBeFuture: 'O horário de execução deve ser no futuro', + }, + triggerWebhook: { + title: 'Acionador de Webhook', + nodeTitle: '🔗 Acionador de Webhook', + configPlaceholder: 'A configuração do gatilho do webhook será implementada aqui', + webhookUrl: 'URL do Webhook', + webhookUrlPlaceholder: 'Clique em gerar para criar a URL do webhook', + generate: 'Gerar', + copy: 'Copiar', + test: 'Teste', + urlGenerated: 'URL do webhook gerada com sucesso', + urlGenerationFailed: 'Falha ao gerar URL do webhook', + urlCopied: 'URL copiada para a área de transferência', + method: 'Método', + contentType: 'Tipo de Conteúdo', + queryParameters: 'Parâmetros de Consulta', + headerParameters: 'Parâmetros do Cabeçalho', + requestBodyParameters: 'Parâmetros do Corpo da Requisição', + parameterName: 'Nome da variável', + varName: 'Nome da variável', + varType: 'Tipo', + varNamePlaceholder: 'Digite o nome da variável...', + required: 'Obrigatório', + addParameter: 'Adicionar', + addHeader: 'Adicionar', + noParameters: 'Nenhum parâmetro configurado', + noQueryParameters: 'Nenhum parâmetro de consulta configurado', + noHeaders: 'Nenhum cabeçalho configurado', + noBodyParameters: 'Nenhum parâmetro de corpo configurado', + debugUrlTitle: 'Para testes, sempre use este URL', + debugUrlCopy: 'Clique para copiar', + debugUrlCopied: 'Copiado!', + debugUrlPrivateAddressWarning: 'Este URL parece ser um endereço interno, o que pode fazer com que as solicitações do webhook falhem. Você pode alterar o TRIGGER_URL para um endereço público.', + errorHandling: 'Tratamento de Erros', + errorStrategy: 'Tratamento de Erros', + responseConfiguration: 'Resposta', + asyncMode: 'Modo Assíncrono', + statusCode: 'Código de Status', + responseBody: 'Corpo da Resposta', + responseBodyPlaceholder: 'Escreva o corpo da sua resposta aqui', + headers: 'Cabeçalhos', + validation: { + webhookUrlRequired: 'A URL do Webhook é obrigatória', + invalidParameterType: 'Tipo de parâmetro inválido "{{type}}" para o parâmetro "{{name}}"', + }, + }, }, tracing: { stopBy: 'Parado por {{user}}', @@ -1037,6 +1211,18 @@ const translation = { largeData: 'Dados grandes, visualização somente leitura. Exportar para ver tudo.', exportToolTip: 'Exportar variável como arquivo', largeDataNoExport: 'Dados grandes - apenas visualização parcial', + listening: { + title: 'Aguardando eventos dos gatilhos...', + tip: 'Agora você pode simular gatilhos de eventos enviando solicitações de teste para o endpoint HTTP {{nodeName}} ou usá-lo como uma URL de callback para depuração de eventos ao vivo. Todos os resultados podem ser visualizados diretamente no Inspetor de Variáveis.', + tipPlugin: 'Agora você pode criar eventos em {{- pluginName}} e recuperar resultados desses eventos no Inspetor de Variáveis.', + tipSchedule: 'Ouvindo eventos de gatilhos de agendamento.\nPróxima execução agendada: {{nextTriggerTime}}', + tipFallback: 'Aguardando eventos de gatilho. As saídas aparecerão aqui.', + defaultNodeName: 'este gatilho', + defaultPluginName: 'este gatilho de plugin', + defaultScheduleTime: 'Não configurado', + selectedTriggers: 'gatilhos selecionados', + stopButton: 'Pare', + }, }, settingsTab: 'Configurações', lastRunTab: 'Última execução', @@ -1054,11 +1240,52 @@ const translation = { noLastRunFound: 'Nenhuma execução anterior encontrada.', copyLastRun: 'Copiar Última Execução', lastOutput: 'Última Saída', + lastRunInputsCopied: '{{count}} entrada(s) copiadas da última execução', }, sidebar: { exportWarning: 'Exportar a versão salva atual', exportWarningDesc: 'Isto irá exportar a versão atual salva do seu fluxo de trabalho. Se você tiver alterações não salvas no editor, por favor, salve-as primeiro utilizando a opção de exportação na tela do fluxo de trabalho.', }, + publishLimit: { + startNodeTitlePrefix: 'Atualizar para', + startNodeTitleSuffix: 'desbloquear gatilhos ilimitados por fluxo de trabalho', + startNodeDesc: 'Você atingiu o limite de 2 gatilhos por fluxo de trabalho para este plano. Faça um upgrade para publicar este fluxo de trabalho.', + }, + error: { + startNodeRequired: 'Por favor, adicione um nó inicial antes de {{operation}}', + operations: { + connectingNodes: 'conectando nós', + addingNodes: 'adicionando nós', + modifyingWorkflow: 'modificando o fluxo de trabalho', + updatingWorkflow: 'atualizando fluxo de trabalho', + }, + }, + customWebhook: 'Webhook Personalizado', + difyTeam: 'Equipe Dify', + triggerStatus: { + enabled: 'GATILHO', + disabled: 'DISPARADOR • DESATIVADO', + }, + entryNodeStatus: { + enabled: 'INICIAR', + disabled: 'INICIAR • DESATIVADO', + }, + onboarding: { + title: 'Selecione um nó inicial para começar', + description: 'Diferentes nós iniciais têm diferentes capacidades. Não se preocupe, você sempre pode mudá-los mais tarde.', + userInputFull: 'Entrada do Usuário (nó inicial original)', + userInputDescription: 'Nó inicial que permite definir variáveis de entrada do usuário, com aplicativo web, API de serviço, servidor MCP e fluxo de trabalho como capacidades da ferramenta.', + trigger: 'Gatilho', + triggerDescription: 'Os gatilhos podem servir como o nó inicial de um fluxo de trabalho, como tarefas agendadas, webhooks personalizados ou integrações com outros aplicativos.', + back: 'Voltar', + learnMore: 'Saiba mais', + aboutStartNode: 'sobre o nó inicial.', + escTip: { + press: 'Imprensa', + key: 'esc', + toDismiss: 'dispensar', + }, + }, } export default translation diff --git a/web/i18n/ro-RO/app-debug.ts b/web/i18n/ro-RO/app-debug.ts index aacbcc4b63..9a355d1bf8 100644 --- a/web/i18n/ro-RO/app-debug.ts +++ b/web/i18n/ro-RO/app-debug.ts @@ -332,6 +332,7 @@ const translation = { 'uploadFileTypes': 'Încărcați tipuri de fișiere', 'localUpload': 'Încărcare locală', 'maxNumberOfUploads': 'Numărul maxim de încărcări', + 'maxNumberTip': 'Document < {{docLimit}}, imagine < {{imgLimit}}, audio < {{audioLimit}}, video < {{videoLimit}}', 'both': 'Ambii', 'optional': 'opțional', 'jsonSchema': 'Schema JSON', diff --git a/web/i18n/ro-RO/app-log.ts b/web/i18n/ro-RO/app-log.ts index 55f3ea2286..c8215535bb 100644 --- a/web/i18n/ro-RO/app-log.ts +++ b/web/i18n/ro-RO/app-log.ts @@ -19,6 +19,7 @@ const translation = { tokens: 'JETOANE', user: 'UTILIZATOR FINAL SAU CONT', version: 'VERSIUNE', + triggered_from: 'DECLANȘAT DE', }, pagination: { previous: 'Anterior', @@ -97,6 +98,15 @@ const translation = { finalProcessing: 'Procesare finală', }, dateFormat: 'ZZ/LL/AAAA', + triggerBy: { + debugging: 'Depanare', + appRun: 'Aplicație web', + webhook: 'Webhook', + schedule: 'Program', + plugin: 'Plugin', + ragPipelineRun: 'Flux RAG', + ragPipelineDebugging: 'Depanare RAG', + }, } export default translation diff --git a/web/i18n/ro-RO/app-overview.ts b/web/i18n/ro-RO/app-overview.ts index 00f7079ad3..1382fb9e5b 100644 --- a/web/i18n/ro-RO/app-overview.ts +++ b/web/i18n/ro-RO/app-overview.ts @@ -114,7 +114,11 @@ const translation = { }, }, launch: 'Lansa', - enableTooltip: {}, + enableTooltip: { + description: 'Pentru a activa această funcție, vă rugăm să adăugați un nod de introducere a utilizatorului pe canvas. (Poate exista deja în schiță, are efect după publicare)', + learnMore: 'Aflați mai multe', + }, + title: 'Aplicație web', }, apiInfo: { title: 'API serviciu backend', @@ -126,7 +130,14 @@ const translation = { running: 'În service', disable: 'Dezactivat', }, - triggerInfo: {}, + triggerInfo: { + title: 'Declanșatoare', + explanation: 'Gestionarea declanșatoarelor de flux de lucru', + triggersAdded: '{{count}} Declanșatoare adăugate', + noTriggerAdded: 'Niciun declanșator adăugat', + triggerStatusDescription: 'Starea nodului declanșator apare aici. (Poate exista deja în draft, devine efectivă după publicare)', + learnAboutTriggers: 'Află despre Declanșatoare', + }, disableTooltip: { triggerMode: 'Funcționalitatea {{feature}} nu este suportată în modul Nod Trigger.', }, diff --git a/web/i18n/ro-RO/billing.ts b/web/i18n/ro-RO/billing.ts index 4c5d09b28c..a0816dc8b9 100644 --- a/web/i18n/ro-RO/billing.ts +++ b/web/i18n/ro-RO/billing.ts @@ -98,6 +98,8 @@ const translation = { triggerEvents: { unlimited: 'Evenimente de declanșare nelimitate', tooltip: 'Numărul de evenimente care pornesc automat fluxuri de lucru prin declanșatoare Plugin, Programare sau Webhook.', + sandbox: '{{count,number}} Evenimente Declanșatoare', + professional: '{{count,number}} Evenimente declanșatoare/lună', }, workflowExecution: { faster: 'Executarea mai rapidă a fluxului de lucru', @@ -107,6 +109,11 @@ const translation = { }, startNodes: { unlimited: 'Declanșatori/workflow nelimitați', + limited: 'Până la {{count}} declanșatori/workflow', + }, + title: { + plans: 'planuri', + description: 'Selectați planul care se potrivește cel mai bine nevoilor echipei dvs.', }, }, plans: { @@ -129,16 +136,14 @@ const translation = { name: 'Întreprindere', description: 'Obțineți capacități și asistență complete pentru sisteme critice la scară largă.', includesTitle: 'Tot ce este în planul Echipă, plus:', - features: { - }, + features: ['Soluții de implementare scalabile la nivel de întreprindere', 'Autorizație de licență comercială', 'Funcții Exclusive pentru Afaceri', 'Mai multe spații de lucru și managementul întreprinderii', 'SSO', 'SLA-uri negociate de partenerii Dify', 'Securitate și Control Avansate', 'Actualizări și întreținere de către Dify Oficial', 'Asistență Tehnică Profesională'], for: 'Pentru echipe de mari dimensiuni', price: 'Personalizat', priceTip: 'Facturare anuală doar', btnText: 'Contactați Vânzări', }, community: { - features: { - }, + features: ['Toate Funcțiile Principale Lansate în Repositorul Public', 'Spațiu de lucru unic', 'Respectă Licența Open Source Dify'], description: 'Pentru utilizatori individuali, echipe mici sau proiecte necomerciale', btnText: 'Începe cu Comunitatea', price: 'Gratuit', @@ -147,8 +152,7 @@ const translation = { includesTitle: 'Funcții gratuite:', }, premium: { - features: { - }, + features: ['Fiabilitate autogestionată de diferiți furnizori de cloud', 'Spațiu de lucru unic', 'Personalizare logo și branding pentru aplicația web', 'Asistență prioritară prin e-mail și chat'], btnText: 'Obține Premium în', description: 'Pentru organizații și echipe de dimensiuni medii', includesTitle: 'Totul din Comunitate, plus:', @@ -184,6 +188,7 @@ const translation = { documentsUploadQuota: 'Cota de încărcare a documentelor', triggerEvents: 'Evenimente declanșatoare', perMonth: 'pe lună', + resetsIn: 'Se resetează în {{count,number}} zile', }, teamMembers: 'Membrii echipei', triggerLimitModal: { diff --git a/web/i18n/ro-RO/common.ts b/web/i18n/ro-RO/common.ts index f9b620e97e..85e29e6895 100644 --- a/web/i18n/ro-RO/common.ts +++ b/web/i18n/ro-RO/common.ts @@ -65,10 +65,17 @@ const translation = { deleteConfirmTitle: 'Ștergere?', no: 'Nu', confirmAction: 'Vă rugăm să confirmați acțiunea dumneavoastră.', + noSearchResults: 'Nu au fost găsite {{content}}', + resetKeywords: 'Resetează cuvintele cheie', + selectCount: '{{count}} Selectat', + searchCount: 'Găsește {{count}} {{content}}', + noSearchCount: '0 {{content}}', + now: 'Acum', }, placeholder: { input: 'Vă rugăm să introduceți', select: 'Vă rugăm să selectați', + search: 'Caută...', }, voice: { language: { @@ -769,6 +776,13 @@ const translation = { label: { optional: '(opțional)', }, + noData: 'Fără date', + dynamicSelect: { + error: 'Încărcarea opțiunilor a eșuat', + noData: 'Nicio opțiune disponibilă', + loading: 'Se încarcă opțiuni...', + selected: '{{count}} selectat', + }, } export default translation diff --git a/web/i18n/ro-RO/dataset-documents.ts b/web/i18n/ro-RO/dataset-documents.ts index db99c9ad1a..9471443b5c 100644 --- a/web/i18n/ro-RO/dataset-documents.ts +++ b/web/i18n/ro-RO/dataset-documents.ts @@ -81,7 +81,10 @@ const translation = { }, addUrl: 'Adăugați adresa URL', learnMore: 'Află mai multe', - sort: {}, + sort: { + uploadTime: 'Timp de încărcare', + hitCount: 'Număr de recuperări', + }, }, metadata: { title: 'Metadate', diff --git a/web/i18n/ro-RO/dataset-pipeline.ts b/web/i18n/ro-RO/dataset-pipeline.ts index f695c86c6b..947e52f2ef 100644 --- a/web/i18n/ro-RO/dataset-pipeline.ts +++ b/web/i18n/ro-RO/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'Fluxul de cunoștințe publicat', + tip: 'Accesați Documente pentru a adăuga sau a gestiona documente.', }, error: { message: 'Nu s-a reușit publicarea canalului de cunoștințe', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'Structură', structureTooltip: 'Structura de bucăți determină modul în care documentele sunt împărțite și indexate - oferind modurile General, Părinte-Copil și Întrebări și răspunsuri - și este unică pentru fiecare bază de cunoștințe.', + createdBy: 'De {{author}}', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { characters: 'Caractere', backToDataSource: 'Sursa datelor', title: 'Adăugarea documentelor', + selectOnlineDocumentTip: 'Procesează până la {{count}} pagini', + selectOnlineDriveTip: 'Procesează până la {{count}} fișiere, maximum {{fileSize}} MB fiecare', }, documentSettings: { title: 'Setări document', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} pagini', + }, onlineDrive: { breadcrumbs: { allFiles: 'Toate fișierele', allBuckets: 'Toate gălețile de stocare în cloud', searchPlaceholder: 'Căutați fișiere...', + searchResult: 'Găsește {{searchResultsLength}} articole în folderul "{{folderName}}"', }, resetKeywords: 'Resetați cuvintele cheie', emptyFolder: 'Acest folder este gol', notSupportedFileType: 'Acest tip de fișier nu este acceptat', emptySearchResult: 'Nu au fost găsite obiecte', + notConnected: '{{name}} nu este conectat', + notConnectedTip: 'Pentru a sincroniza cu {{name}}, trebuie mai întâi să se stabilească conexiunea cu {{name}}.', + }, + credentialSelector: { + name: '{{pluginName}} al/a lui {{credentialName}}', }, - credentialSelector: {}, conversion: { confirm: { title: 'Confirmare', @@ -149,6 +160,7 @@ const translation = { knowledgeNameAndIconPlaceholder: 'Vă rugăm să introduceți numele bazei de cunoștințe', knowledgeDescriptionPlaceholder: 'Descrieți ce este în această bază de cunoștințe. O descriere detaliată permite AI să acceseze mai precis conținutul setului de date. Dacă este gol, Dify va folosi strategia implicită de accesare. (Opțional)', inputField: 'Câmp de intrare', + configurationTip: 'Configurează {{pluginName}}', } export default translation diff --git a/web/i18n/ro-RO/dataset.ts b/web/i18n/ro-RO/dataset.ts index 1f78525c74..a6c4308577 100644 --- a/web/i18n/ro-RO/dataset.ts +++ b/web/i18n/ro-RO/dataset.ts @@ -234,6 +234,10 @@ const translation = { enabled: 'În serviciu', title: 'API de servicii', }, + docAllEnabled_one: 'Document {{count}} activat', + docAllEnabled_other: 'Toate documentele {{count}} activate', + partialEnabled_one: 'Total de {{count}} documente, {{num}} disponibile', + partialEnabled_other: 'Total de {{count}} documente, {{num}} disponibile', } export default translation diff --git a/web/i18n/ro-RO/education.ts b/web/i18n/ro-RO/education.ts index 7a417cb677..6e26373ed7 100644 --- a/web/i18n/ro-RO/education.ts +++ b/web/i18n/ro-RO/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: 'Nu te îngrijora — aceasta nu va afecta abonamentul tău curent, dar nu veți primi discountul educațional atunci când se reinnoiește, cu excepția cazului în care îți verifici din nou statutul.', + title: 'Starea ta educațională va expira la {{date}}', }, stillInEducation: { isAboutToExpire: 'Re-verifică acum pentru a obține un nou cupon pentru anul universitar următor. Va fi salvat în contul tău și gata de utilizat la următoarea reînnoire.', diff --git a/web/i18n/ro-RO/pipeline.ts b/web/i18n/ro-RO/pipeline.ts index 21823c44fb..c32505b6c9 100644 --- a/web/i18n/ro-RO/pipeline.ts +++ b/web/i18n/ro-RO/pipeline.ts @@ -28,10 +28,12 @@ const translation = { loading: 'Prelucrare... Te rog să aştepţi', viewDetails: 'Vezi detalii', error: 'A apărut o eroare în timpul execuției', + footerTip: 'În modul de testare, previzualizați până la {{count}} fragmente', }, }, ragToolSuggestions: { title: 'Sugestii pentru RAG', + noRecommendationPlugins: 'Nu există pluginuri recomandate, găsiți mai multe în Marketplace', }, } diff --git a/web/i18n/ro-RO/plugin-trigger.ts b/web/i18n/ro-RO/plugin-trigger.ts new file mode 100644 index 0000000000..711d41c096 --- /dev/null +++ b/web/i18n/ro-RO/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'Abonamente', + listNum: 'Abonamente {{num}}', + empty: { + title: 'Fără abonamente', + button: 'Abonament nou', + }, + createButton: { + oauth: 'Abonament nou cu OAuth', + apiKey: 'Abonament nou cu cheia API', + manual: 'Lipiți URL-ul pentru a crea un abonament nou', + }, + createSuccess: 'Abonament creat cu succes', + createFailed: 'Eșec la crearea abonamentului', + maxCount: 'Max {{num}} abonamente', + selectPlaceholder: 'Selectați abonamentul', + noSubscriptionSelected: 'Nicio abonare selectată', + subscriptionRemoved: 'Abonament eliminat', + list: { + title: 'Abonamente', + addButton: 'Adaugă', + tip: 'Primește evenimente prin abonament', + item: { + enabled: 'Activat', + disabled: 'Dezactivat', + credentialType: { + api_key: 'Cheie API', + oauth2: 'OAuth', + unauthorized: 'Manual', + }, + actions: { + delete: 'Șterge', + deleteConfirm: { + title: 'Ștergi {{name}}?', + success: 'Abonamentul {{name}} a fost șters cu succes', + error: 'Nu s-a putut șterge abonamentul {{name}}', + content: 'Odată șters, acest abonament nu poate fi recuperat. Vă rugăm să confirmați.', + contentWithApps: 'Abonamentul curent este referențiat de {{count}} aplicații. Ștergerea acestuia va determina aplicațiile configurate să înceteze să mai primească evenimentele abonamentului.', + confirm: 'Confirmă ștergerea', + cancel: 'Anulează', + confirmInputWarning: 'Vă rugăm să introduceți numele corect pentru confirmare.', + confirmInputPlaceholder: 'Introduceți "{{name}}" pentru a confirma.', + confirmInputTip: 'Vă rugăm să introduceți „{{name}}” pentru a confirma.', + }, + }, + status: { + active: 'Activ', + inactive: 'Inactiv', + }, + usedByNum: 'Folosit de {{num}} fluxuri de lucru', + noUsed: 'Niciun flux de lucru utilizat', + }, + }, + addType: { + title: 'Adaugă abonament', + description: 'Alege cum dorești să creezi abonamentul pentru declanșator', + options: { + apikey: { + title: 'Creează cu cheia API', + description: 'Creează automat abonamente folosind acreditările API', + }, + oauth: { + title: 'Creează cu OAuth', + description: 'Autentifică-te cu o platformă terță pentru a crea un abonament', + clientSettings: 'Setări client OAuth', + clientTitle: 'Client OAuth', + default: 'Implicit', + custom: 'Personalizat', + }, + manual: { + title: 'Configurare manuală', + description: 'Lipiți URL-ul pentru a crea un abonament nou', + tip: 'Configurează URL-ul pe platforma terță manual', + }, + }, + }, + }, + modal: { + steps: { + verify: 'Verifică', + configuration: 'Configurație', + }, + common: { + cancel: 'Anulează', + back: 'Înapoi', + next: 'Următor', + create: 'Creează', + verify: 'Verifică', + authorize: 'Autorizează', + creating: 'Se creează...', + verifying: 'Se verifică...', + authorizing: 'Se autorizează...', + }, + oauthRedirectInfo: 'Deoarece nu au fost găsite secrete ale clienților de sistem pentru acest furnizor de instrumente, este necesară configurarea manuală, pentru redirect_uri, vă rugăm să folosiți', + apiKey: { + title: 'Creează cu cheia API', + verify: { + title: 'Verifică acreditările', + description: 'Vă rugăm să furnizați acreditările API pentru a verifica accesul', + error: 'Verificarea acreditărilor a eșuat. Vă rugăm să verificați cheia API.', + success: 'Datele de autentificare au fost verificate cu succes', + }, + configuration: { + title: 'Configurează abonamentul', + description: 'Configurează parametrii abonamentului tău', + }, + }, + oauth: { + title: 'Creează cu OAuth', + authorization: { + title: 'Autorizare OAuth', + description: 'Permiteți lui Dify să acceseze contul dumneavoastră', + redirectUrl: 'Redirecționează URL-ul', + redirectUrlHelp: 'Folosește acest URL în configurația aplicației tale OAuth', + authorizeButton: 'Autentifică-te cu {{provider}}', + waitingAuth: 'Așteptare autorizare...', + authSuccess: 'Autorizare reușită', + authFailed: 'Eșuat la obținerea informațiilor de autorizare OAuth', + waitingJump: 'Autorizat, în așteptarea săriturii', + }, + configuration: { + title: 'Configurează abonamentul', + description: 'Configurează parametrii abonamentului după autorizare', + success: 'Configurarea OAuth a fost realizată cu succes', + failed: 'Configurarea OAuth a eșuat', + }, + remove: { + success: 'Eliminarea OAuth a fost realizată cu succes', + failed: 'Eliminarea OAuth a eșuat', + }, + save: { + success: 'Configurarea OAuth a fost salvată cu succes', + }, + }, + manual: { + title: 'Configurare manuală', + description: 'Configurează-ți abonamentul webhook manual', + logs: { + title: 'Jurnale de cereri', + request: 'Cerere', + loading: 'Așteptând cererea de la {{pluginName}}...', + }, + }, + form: { + subscriptionName: { + label: 'Numele abonamentului', + placeholder: 'Introduceți numele abonamentului', + required: 'Numele abonamentului este obligatoriu', + }, + callbackUrl: { + label: 'URL de returnare', + description: 'Acest URL va primi evenimente webhook', + tooltip: 'Oferiți un punct de acces public care să poată primi cereri de apel invers de la furnizorul de declanșare.', + placeholder: 'Generare...', + privateAddressWarning: 'Această adresă URL pare să fie una internă, ceea ce poate cauza eșecul solicitărilor webhook. Puteți schimba TRIGGER_URL cu o adresă publică.', + }, + }, + errors: { + createFailed: 'Eșec la crearea abonamentului', + verifyFailed: 'Nu s-au putut verifica acreditările', + authFailed: 'Autorizare eșuată', + networkError: 'Eroare de rețea, vă rugăm să încercați din nou', + }, + }, + events: { + title: 'Evenimente disponibile', + description: 'Evenimente la care acest plugin de declanșare se poate abona', + empty: 'Nu sunt evenimente disponibile', + event: 'Eveniment', + events: 'Evenimente', + actionNum: '{{num}} {{event}} INCLUS', + item: { + parameters: 'parametrii {{count}}', + noParameters: 'Fără parametri', + }, + output: 'Ieșire', + }, + node: { + status: { + warning: 'Deconectare', + }, + }, +} + +export default translation diff --git a/web/i18n/ro-RO/plugin.ts b/web/i18n/ro-RO/plugin.ts index 316d483bb3..547dbe0942 100644 --- a/web/i18n/ro-RO/plugin.ts +++ b/web/i18n/ro-RO/plugin.ts @@ -7,6 +7,7 @@ const translation = { extensions: 'Extensii', models: 'Modele', datasources: 'Surse de date', + triggers: 'Declanșatori', }, categorySingle: { tool: 'Unealtă', @@ -15,6 +16,7 @@ const translation = { agent: 'Strategia agentului', model: 'Model', datasource: 'Sursa datelor', + trigger: 'Declanșator', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { install: 'Instala', detail: 'Detalii', info: 'Informații despre plugin', + back: 'Înapoi', }, toolSelector: { unsupportedContent: 'Versiunea de plugin instalată nu oferă această acțiune.', @@ -306,6 +309,12 @@ const translation = { updateTime: 'Timp de actualizare', nextUpdateTime: 'Următoarea actualizare automată: {{time}}', }, + readmeInfo: { + title: 'Citiți-mă', + needHelpCheckReadme: 'Ai nevoie de ajutor? Verifică fișierul README.', + noReadmeAvailable: 'Nu există fișier README disponibil', + failedToFetch: 'Nu s-a putut prelua README', + }, } export default translation diff --git a/web/i18n/ro-RO/workflow.ts b/web/i18n/ro-RO/workflow.ts index 8d55033929..af65187c23 100644 --- a/web/i18n/ro-RO/workflow.ts +++ b/web/i18n/ro-RO/workflow.ts @@ -113,6 +113,15 @@ const translation = { currentView: 'Vizualizare curentă', currentWorkflow: 'Flux de lucru curent', moreActions: 'Mai multe acțiuni', + listening: 'Ascultând', + chooseStartNodeToRun: 'Alegeți nodul de start pentru a rula', + runAllTriggers: 'Rulează toate declanșatoarele', + features: 'Caracteristici', + featuresDescription: 'Îmbunătățește experiența utilizatorului în aplicația web', + featuresDocLink: 'Aflați mai multe', + needAdd: 'Trebuie adăugat nodul {{node}}', + needStartNode: 'Trebuie adăugat cel puțin un nod de start', + workflowAsToolDisabledHint: 'Publicați fluxul de lucru cel mai recent și asigurați-vă că există un nod de Intrare Utilizator conectat înainte de a-l configura ca instrument.', }, env: { envPanelTitle: 'Variabile de Mediu', @@ -219,6 +228,7 @@ const translation = { rerankModelRequired: 'Înainte de a activa modelul de reclasificare, vă rugăm să confirmați că modelul a fost configurat cu succes în setări.', toolParameterRequired: '{{field}}: parametrul [{{param}}] este obligatoriu', noValidTool: '{{field}} nu a fost selectat niciun instrument valid', + startNodeRequired: 'Vă rugăm să adăugați mai întâi un nod de pornire înainte de {{operation}}', }, singleRun: { testRun: 'Rulare de test ', @@ -250,6 +260,21 @@ const translation = { 'allAdded': 'Toate adăugate', 'sources': 'Surse', 'searchDataSource': 'Sursa de date de căutare', + 'start': 'Începe', + 'searchTrigger': 'Căutare declanșatoare...', + 'allTriggers': 'Toate declanșatoarele', + 'noPluginsFound': 'Nu au fost găsite plugin-uri', + 'requestToCommunity': 'Cereri către comunitate', + 'featuredTools': 'Recomandat', + 'showMoreFeatured': 'Arată mai mult', + 'showLessFeatured': 'Afișează mai puțin', + 'installed': 'Instalat', + 'pluginByAuthor': 'De {{author}}', + 'usePlugin': 'Selectează instrumentul', + 'hideActions': 'Ascunde uneltele', + 'noFeaturedPlugins': 'Descoperă mai multe instrumente în Marketplace', + 'noFeaturedTriggers': 'Descoperă mai multe declanșatoare în Marketplace', + 'startDisabledTip': 'Nodul de declanșare și nodul de intrare a utilizatorului se exclud reciproc.', }, blocks: { 'start': 'Începe', @@ -276,6 +301,10 @@ const translation = { 'loop-start': 'Întreținere buclă', 'knowledge-index': 'Cunoştinţe', 'datasource': 'Sursa datelor', + 'originalStartNode': 'nod de start original', + 'trigger-schedule': 'Declanșator Programat', + 'trigger-webhook': 'Declanșator Webhook', + 'trigger-plugin': 'Declanșator plugin', }, blocksAbout: { 'start': 'Definiți parametrii inițiali pentru lansarea unui flux de lucru', @@ -300,6 +329,9 @@ const translation = { 'loop-end': 'Echivalent cu „break”. Acest nod nu are elemente de configurare. Când corpul buclei ajunge la acest nod, bucla se termină.', 'datasource': 'Sursa de date Despre', 'knowledge-index': 'Baza de cunoștințe despre', + 'trigger-schedule': 'Declanșator de flux de lucru bazat pe timp care pornește fluxurile de lucru conform unui program', + 'trigger-webhook': 'Webhook Trigger primește push-uri HTTP de la sisteme terțe pentru a declanșa automat fluxuri de lucru.', + 'trigger-plugin': 'Declanșator de integrare terță parte care pornește fluxuri de lucru din evenimente ale platformelor externe', }, operator: { zoomIn: 'Mărește', @@ -340,6 +372,8 @@ const translation = { minimize: 'Iesi din modul pe tot ecranul', scrollToSelectedNode: 'Derulați la nodul selectat', optional_and_hidden: '(opțional și ascuns)', + goTo: 'Du-te la', + startNode: 'Nod de start', }, nodes: { common: { @@ -787,6 +821,8 @@ const translation = { parallelPanelDesc: 'În modul paralel, activitățile din iterație acceptă execuția paralelă.', MaxParallelismDesc: 'Paralelismul maxim este utilizat pentru a controla numărul de sarcini executate simultan într-o singură iterație.', answerNodeWarningDesc: 'Avertisment modul paralel: Nodurile de răspuns, atribuirea variabilelor de conversație și operațiunile persistente de citire/scriere în iterații pot cauza excepții.', + flattenOutput: 'Aplatizează ieșirea', + flattenOutputDesc: 'Când este activat, dacă toate ieșirile iterației sunt array-uri, acestea vor fi aplatizate într-un singur array. Când este dezactivat, ieșirile vor menține o structură de array-nested.', }, note: { editor: { @@ -963,6 +999,144 @@ const translation = { rerankingModelIsInvalid: 'Modelul de reordonare este invalid', embeddingModelIsInvalid: 'Modelul de încorporare este invalid', }, + triggerPlugin: { + authorized: 'Autorizat', + notConfigured: 'Nesetat', + notAuthorized: 'Neautorizat', + selectSubscription: 'Selectează abonamentul', + availableSubscriptions: 'Abonamente disponibile', + addSubscription: 'Adaugă un abonament nou', + removeSubscription: 'Anulează abonamentul', + subscriptionRemoved: 'Abonamentul a fost eliminat cu succes', + error: 'Eroare', + configuration: 'Configurație', + remove: 'Elimină', + or: 'SAU', + useOAuth: 'Folosește OAuth', + useApiKey: 'Utilizează cheia API', + authenticationFailed: 'Autentificare eșuată', + authenticationSuccess: 'Autentificare reușită', + oauthConfigFailed: 'Configurarea OAuth a eșuat', + configureOAuthClient: 'Configurează clientul OAuth', + oauthClientDescription: 'Configurează acreditările clientului OAuth pentru a permite autentificarea', + oauthClientSaved: 'Configurarea clientului OAuth a fost salvată cu succes', + configureApiKey: 'Configurează cheia API', + apiKeyDescription: 'Configurați acreditările cheii API pentru autentificare', + apiKeyConfigured: 'Cheia API a fost configurată cu succes', + configurationFailed: 'Configurarea a eșuat', + failedToStart: 'Eșec la inițierea procesului de autentificare', + credentialsVerified: 'Datele de autentificare au fost verificate cu succes', + credentialVerificationFailed: 'Verificarea acreditărilor a eșuat', + verifyAndContinue: 'Verifică și continuă', + configureParameters: 'Configurează parametrii', + parametersDescription: 'Configurează parametrii și proprietățile declanșatorului', + configurationComplete: 'Configurare completă', + configurationCompleteDescription: 'Declanșatorul tău a fost configurat cu succes', + configurationCompleteMessage: 'Configurația declanșatorului tău este acum completă și gata de utilizare.', + parameters: 'Parametri', + properties: 'Proprietăți', + propertiesDescription: 'Proprietăți suplimentare de configurare pentru acest declanșator', + noConfigurationRequired: 'Nu este necesară nicio configurare suplimentară pentru acest declanșator.', + subscriptionName: 'Numele abonamentului', + subscriptionNameDescription: 'Introduceți un nume unic pentru acest abonament al declanșatorului', + subscriptionNamePlaceholder: 'Introduceți numele abonamentului...', + subscriptionNameRequired: 'Numele abonamentului este obligatoriu', + subscriptionRequired: 'Este necesar un abonament', + }, + triggerSchedule: { + title: 'Program', + nodeTitle: 'Declanșator Programat', + notConfigured: 'Neconfigurat', + useCronExpression: 'Utilizați expresie cron', + useVisualPicker: 'Utilizați selectorul vizual', + frequency: { + label: 'FRECVENȚĂ', + hourly: 'Pe oră', + daily: 'Zilnic', + weekly: 'Săptămânal', + monthly: 'Lunar', + }, + selectFrequency: 'Selectați frecvența', + frequencyLabel: 'Frecvență', + nextExecution: 'Următoarea execuție', + weekdays: 'Zilele săptămânii', + time: 'Timp', + cronExpression: 'Expresie Cron', + nextExecutionTime: 'URMĂTOAREA ORĂ DE EXECUȚIE', + nextExecutionTimes: 'Următoarele 5 momente de execuție', + startTime: 'Ora de începere', + executeNow: 'Executare acum', + selectDateTime: 'Selectează data și ora', + hours: 'Ore', + minutes: 'Minute', + onMinute: 'Într-un minut', + days: 'Zile', + lastDay: 'Ultima zi', + lastDayTooltip: 'Nu toate lunile au 31 de zile. Folosește opțiunea \'ultima zi\' pentru a selecta ultima zi a fiecărei luni.', + mode: 'Modă', + timezone: 'Fus orar', + visualConfig: 'Configurare vizuală', + monthlyDay: 'Ziua lunară', + executionTime: 'Timp de execuție', + invalidTimezone: 'Fus orar nevalid', + invalidCronExpression: 'Expresie cron nevalidă', + noValidExecutionTime: 'Nu se poate calcula un timp de execuție valid', + executionTimeCalculationError: 'Calcularea timpilor de execuție a eșuat', + invalidFrequency: 'Frecvență invalidă', + invalidStartTime: 'Ora de început nevalidă', + startTimeMustBeFuture: 'Ora de începere trebuie să fie în viitor', + invalidTimeFormat: 'Format de oră invalid (se aștepta HH:MM AM/PM)', + invalidWeekday: 'Zi a săptămânii invalidă: {{weekday}}', + invalidMonthlyDay: 'Ziua lunară trebuie să fie între 1-31 sau „ultima”', + invalidOnMinute: 'Minutele trebuie să fie între 0 și 59', + invalidExecutionTime: 'Timp de execuție invalid', + executionTimeMustBeFuture: 'Timpul de execuție trebuie să fie în viitor', + }, + triggerWebhook: { + title: 'Declanșator Webhook', + nodeTitle: '🔗 Declanșator Webhook', + configPlaceholder: 'Configurarea declanșatorului webhook va fi implementată aici', + webhookUrl: 'URL-ul Webhook', + webhookUrlPlaceholder: 'Apasă pe generează pentru a crea URL-ul webhook', + generate: 'Generează', + copy: 'Copiază', + test: 'Test', + urlGenerated: 'URL-ul webhook a fost generat cu succes', + urlGenerationFailed: 'Eșec la generarea URL-ului webhook', + urlCopied: 'URL copiat în clipboard', + method: 'Metodă', + contentType: 'Tip de conținut', + queryParameters: 'Parametri de interogare', + headerParameters: 'Parametri de antet', + requestBodyParameters: 'Parametri ai corpului cererii', + parameterName: 'Nume variabilă', + varName: 'Nume variabilă', + varType: 'Tip', + varNamePlaceholder: 'Introduceți numele variabilei...', + required: 'Necesar', + addParameter: 'Adaugă', + addHeader: 'Adaugă', + noParameters: 'Niciun parametru configurat', + noQueryParameters: 'Nu sunt configurate parametri de interogare', + noHeaders: 'Nu sunt configurate antete', + noBodyParameters: 'Nu sunt configurate parametrii pentru corp', + debugUrlTitle: 'Pentru teste, folosește întotdeauna acest URL', + debugUrlCopy: 'Click pentru a copia', + debugUrlCopied: 'Copiat!', + debugUrlPrivateAddressWarning: 'Această adresă URL pare să fie una internă, ceea ce poate cauza eșecul solicitărilor webhook. Puteți schimba TRIGGER_URL cu o adresă publică.', + errorHandling: 'Gestionarea erorilor', + errorStrategy: 'Gestionarea erorilor', + responseConfiguration: 'Răspuns', + asyncMode: 'Mod asincron', + statusCode: 'Cod de stare', + responseBody: 'Corp de răspuns', + responseBodyPlaceholder: 'Scrieți aici corpul răspunsului dvs.', + headers: 'Antete', + validation: { + webhookUrlRequired: 'URL-ul webhook-ului este necesar', + invalidParameterType: 'Tip de parametru invalid "{{type}}" pentru parametrul "{{name}}"', + }, + }, }, tracing: { stopBy: 'Oprit de {{user}}', @@ -1037,6 +1211,18 @@ const translation = { largeDataNoExport: 'Date mari - doar previzualizare parțială', exportToolTip: 'Exportați variabila ca fișier', largeData: 'Date mari, previzualizare doar în citire. Exportați pentru a vedea totul.', + listening: { + title: 'Ascult pentru evenimente de la declanșatoare...', + tip: 'Acum puteți simula declanșatoare de evenimente trimițând cereri de test către endpointul HTTP {{nodeName}} sau îl puteți folosi ca URL de apel invers pentru depanarea evenimentelor în timp real. Toate rezultatele pot fi vizualizate direct în Inspectorul de Variabile.', + tipPlugin: 'Acum poți crea evenimente în {{- pluginName}} și poți prelua rezultatele acestor evenimente în Inspectorul de Variabile.', + tipSchedule: 'Ascultarea evenimentelor de la declanșatoarele de programare.\nUrmătoarea rulare programată: {{nextTriggerTime}}', + tipFallback: 'Așteptați evenimentele declanșatoare. Ieșirile vor apărea aici.', + defaultNodeName: 'acest declanșator', + defaultPluginName: 'acest plugin declanșează', + defaultScheduleTime: 'Neconfigurat', + selectedTriggers: 'declanșatori selectați', + stopButton: 'Oprește', + }, }, settingsTab: 'Setări', lastRunTab: 'Ultima execuție', @@ -1054,11 +1240,52 @@ const translation = { noLastRunFound: 'Niciun rulament anterior găsit', copyLastRunError: 'Nu s-au putut copia ultimele intrări de rulare', lastOutput: 'Ultimul rezultat', + lastRunInputsCopied: '{{count}} intrare(e) copiate de la ultima rulare', }, sidebar: { exportWarning: 'Exportați versiunea salvată curentă', exportWarningDesc: 'Aceasta va exporta versiunea curent salvată a fluxului dumneavoastră de lucru. Dacă aveți modificări nesalvate în editor, vă rugăm să le salvați mai întâi utilizând opțiunea de export din canvasul fluxului de lucru.', }, + publishLimit: { + startNodeTitlePrefix: 'Actualizează la', + startNodeTitleSuffix: 'deblochează declanșatoare nelimitate pentru fiecare flux de lucru', + startNodeDesc: 'Ați atins limita de 2 declanșatoare pe flux de lucru pentru acest plan. Faceți upgrade pentru a publica acest flux de lucru.', + }, + error: { + startNodeRequired: 'Vă rugăm să adăugați mai întâi un nod de pornire înainte de {{operation}}', + operations: { + connectingNodes: 'conectarea nodurilor', + addingNodes: 'adăugarea nodurilor', + modifyingWorkflow: 'modificarea fluxului de lucru', + updatingWorkflow: 'actualizarea fluxului de lucru', + }, + }, + customWebhook: 'Webhook personalizat', + difyTeam: 'Echipa Dify', + triggerStatus: { + enabled: 'DECLANȘATOR', + disabled: 'TRIGGER • DEZACTIVAT', + }, + entryNodeStatus: { + enabled: 'PORNEȘTE', + disabled: 'PORNIRE • DEZACTIVAT', + }, + onboarding: { + title: 'Selectați un nod de start pentru a începe', + description: 'Nodurile de start diferite au capabilități diferite. Nu-ți face griji, le poți schimba oricând mai târziu.', + userInputFull: 'Intrare utilizator (nod de start original)', + userInputDescription: 'Nod de pornire care permite setarea variabilelor de input ale utilizatorului, cu aplicație web, API de servicii, server MCP și flux de lucru ca funcționalități ale instrumentului.', + trigger: 'Declanșator', + triggerDescription: 'Triggerele pot servi ca nod de pornire al unui flux de lucru, cum ar fi sarcini programate, webhook-uri personalizate sau integrări cu alte aplicații.', + back: 'Înapoi', + learnMore: 'Aflați mai multe', + aboutStartNode: 'despre nodul de start.', + escTip: { + press: 'Presă', + key: 'esc', + toDismiss: 'a concedia', + }, + }, } export default translation diff --git a/web/i18n/ru-RU/app-debug.ts b/web/i18n/ru-RU/app-debug.ts index 010a2039f5..1d86e0778a 100644 --- a/web/i18n/ru-RU/app-debug.ts +++ b/web/i18n/ru-RU/app-debug.ts @@ -396,6 +396,7 @@ const translation = { 'both': 'Оба', 'localUpload': 'Локальная загрузка', 'maxNumberOfUploads': 'Максимальное количество загрузок', + 'maxNumberTip': 'Документ < {{docLimit}}, изображение < {{imgLimit}}, аудио < {{audioLimit}}, видео < {{videoLimit}}', 'uploadFileTypes': 'Типы файлов загрузки', 'single-file': 'Друг за другом', 'multi-files': 'Список файлов', diff --git a/web/i18n/ru-RU/app-log.ts b/web/i18n/ru-RU/app-log.ts index 03c5bee76b..1b5899f359 100644 --- a/web/i18n/ru-RU/app-log.ts +++ b/web/i18n/ru-RU/app-log.ts @@ -19,6 +19,7 @@ const translation = { tokens: 'ТОКЕНЫ', user: 'Конечный пользователь или аккаунт', version: 'ВЕРСИЯ', + triggered_from: 'СРАБАТЫВАЕТ ОТ', }, pagination: { previous: 'Предыдущий', @@ -97,6 +98,15 @@ const translation = { finalProcessing: 'Окончательная обработка', }, dateFormat: 'ДД/ММ/ГГГГ', + triggerBy: { + debugging: 'Отладка', + appRun: 'Веб-приложение', + webhook: 'Вебхук', + schedule: 'Расписание', + plugin: 'Плагин', + ragPipelineRun: 'Конвейер RAG', + ragPipelineDebugging: 'Отладка RAG', + }, } export default translation diff --git a/web/i18n/ru-RU/app-overview.ts b/web/i18n/ru-RU/app-overview.ts index 47a411c42c..9883975c87 100644 --- a/web/i18n/ru-RU/app-overview.ts +++ b/web/i18n/ru-RU/app-overview.ts @@ -114,7 +114,11 @@ const translation = { }, }, launch: 'Баркас', - enableTooltip: {}, + enableTooltip: { + description: 'Чтобы включить эту функцию, добавьте на холст узел ввода пользователя. (Может уже существовать в черновике, вступает в силу после публикации)', + learnMore: 'Узнать больше', + }, + title: 'Веб-приложение', }, apiInfo: { title: 'API серверной части', @@ -126,7 +130,14 @@ const translation = { running: 'В работе', disable: 'Отключено', }, - triggerInfo: {}, + triggerInfo: { + title: 'Триггеры', + explanation: 'Управление триггерами рабочего процесса', + triggersAdded: 'Добавлены триггеры', + noTriggerAdded: 'Триггер не добавлен', + triggerStatusDescription: 'Статус узла триггера отображается здесь. (Может уже существовать в черновике, вступает в силу после публикации)', + learnAboutTriggers: 'Узнайте о триггерах', + }, disableTooltip: { triggerMode: 'Функция {{feature}} не поддерживается в режиме узла триггера.', }, diff --git a/web/i18n/ru-RU/billing.ts b/web/i18n/ru-RU/billing.ts index 353d7fa26d..5ff1d778f3 100644 --- a/web/i18n/ru-RU/billing.ts +++ b/web/i18n/ru-RU/billing.ts @@ -98,6 +98,8 @@ const translation = { triggerEvents: { unlimited: 'Неограниченные триггерные события', tooltip: 'Количество событий, которые автоматически запускают рабочие процессы с помощью плагина, расписания или вебхука.', + sandbox: '{{count,number}} События триггера', + professional: '{{count,number}} Событий срабатывания/месяц', }, workflowExecution: { faster: 'Более быстрое выполнение рабочих процессов', @@ -107,6 +109,11 @@ const translation = { }, startNodes: { unlimited: 'Неограниченные триггеры/рабочий процесс', + limited: 'До {{count}} триггеров/рабочих процессов', + }, + title: { + plans: 'планы', + description: 'Выберите план, который лучше всего соответствует потребностям вашей команды.', }, }, plans: { @@ -129,16 +136,14 @@ const translation = { name: 'Корпоративный', description: 'Получите полный набор возможностей и поддержку для крупномасштабных критически важных систем.', includesTitle: 'Все в командном плане, плюс:', - features: { - }, + features: ['Масштабируемые решения для развертывания корпоративного уровня', 'Разрешение на коммерческую лицензию', 'Эксклюзивные корпоративные функции', 'Несколько рабочих пространств и корпоративное управление', 'SSO', 'Согласованные SLA с партнёрами Dify', 'Расширенные функции безопасности и управления', 'Обновления и обслуживание от Dify официально', 'Профессиональная техническая поддержка'], price: 'Пользовательский', priceTip: 'Только годовая подписка', for: 'Для команд большого размера', btnText: 'Связаться с отделом продаж', }, community: { - features: { - }, + features: ['Все основные функции выпущены в публичный репозиторий', 'Одиночное рабочее пространство', 'Соответствует лицензии с открытым исходным кодом Dify'], name: 'Сообщество', btnText: 'Начните с сообщества', price: 'Свободно', @@ -147,8 +152,7 @@ const translation = { for: 'Для отдельных пользователей, малых команд или некоммерческих проектов', }, premium: { - features: { - }, + features: ['Самоуправляемая надежность у различных облачных провайдеров', 'Одиночное рабочее пространство', 'Настройка логотипа и брендинга веб-приложения', 'Приоритетная поддержка по электронной почте и в чате'], description: 'Для средних организаций и команд', includesTitle: 'Всё из Сообщества, плюс:', priceTip: 'На основе облачного маркетплейса', @@ -184,6 +188,7 @@ const translation = { documentsUploadQuota: 'Квота на загрузку документов', perMonth: 'в месяц', triggerEvents: 'Триггерные события', + resetsIn: 'Сброс через {{count,number}} дней', }, teamMembers: 'Члены команды', triggerLimitModal: { diff --git a/web/i18n/ru-RU/common.ts b/web/i18n/ru-RU/common.ts index ecfd241358..4252f9adb7 100644 --- a/web/i18n/ru-RU/common.ts +++ b/web/i18n/ru-RU/common.ts @@ -65,6 +65,12 @@ const translation = { no: 'Нет', deleteConfirmTitle: 'Удалить?', confirmAction: 'Пожалуйста, подтвердите ваше действие.', + noSearchResults: 'Ничего {{content}} не найдено', + resetKeywords: 'Сбросить ключевые слова', + selectCount: '{{count}} Выбран', + searchCount: 'Найти {{count}} {{content}}', + noSearchCount: '0 {{content}}', + now: 'Сейчас', }, errorMsg: { fieldRequired: '{{field}} обязательно', @@ -73,6 +79,7 @@ const translation = { placeholder: { input: 'Пожалуйста, введите', select: 'Пожалуйста, выберите', + search: 'Поиск...', }, voice: { language: { @@ -769,6 +776,13 @@ const translation = { label: { optional: '(необязательно)', }, + noData: 'Нет данных', + dynamicSelect: { + error: 'Не удалось загрузить параметры', + noData: 'Нет доступных вариантов', + loading: 'Загрузка параметров...', + selected: '{{count}} выбрано', + }, } export default translation diff --git a/web/i18n/ru-RU/dataset-documents.ts b/web/i18n/ru-RU/dataset-documents.ts index 7f42139364..f5e3b68ed7 100644 --- a/web/i18n/ru-RU/dataset-documents.ts +++ b/web/i18n/ru-RU/dataset-documents.ts @@ -81,7 +81,10 @@ const translation = { ok: 'ОК', }, learnMore: 'Подробнее', - sort: {}, + sort: { + uploadTime: 'Время загрузки', + hitCount: 'Количество извлечений', + }, }, metadata: { title: 'Метаданные', diff --git a/web/i18n/ru-RU/dataset-pipeline.ts b/web/i18n/ru-RU/dataset-pipeline.ts index 1e1bdcbfa3..205de9f790 100644 --- a/web/i18n/ru-RU/dataset-pipeline.ts +++ b/web/i18n/ru-RU/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'Опубликован конвейер знаний', + tip: 'Перейдите в «Документы», чтобы добавить или управлять документами.', }, error: { message: 'Не удалось опубликовать конвейер знаний', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'Структура', structureTooltip: 'Структура блоков определяет порядок разделения и индексирования документов (в соответствии с режимами «Общие», «Родитель-потомок» и «Вопросы и ответы») и является уникальной для каждой базы знаний.', + createdBy: 'По {{author}}', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { characters: 'письмена', backToDataSource: 'Источник данных', title: 'Добавить документы', + selectOnlineDocumentTip: 'Обработать до {{count}} страниц', + selectOnlineDriveTip: 'Обрабатывайте до {{count}} файлов, максимум {{fileSize}} МБ каждый', }, documentSettings: { title: 'Настройки документа', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} страниц', + }, onlineDrive: { breadcrumbs: { allFiles: 'Все файлы', searchPlaceholder: 'Поиск файлов...', allBuckets: 'Все корзины облачного хранилища', + searchResult: 'Найти {{searchResultsLength}} элементов в папке "{{folderName}}"', }, resetKeywords: 'Сброс ключевых слов', emptyFolder: 'Эта папка пуста', emptySearchResult: 'Предметы не найдены', notSupportedFileType: 'Этот тип файлов не поддерживается', + notConnected: '{{name}} не подключен', + notConnectedTip: 'Чтобы синхронизироваться с {{name}}, сначала необходимо установить соединение с {{name}}.', + }, + credentialSelector: { + name: '{{credentialName}}\'s {{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { title: 'Подтверждение', @@ -149,6 +160,7 @@ const translation = { knowledgeNameAndIconPlaceholder: 'Пожалуйста, введите название базы знаний', editPipelineInfo: 'Редактирование сведений о воронке продаж', knowledgeDescriptionPlaceholder: 'Опишите, что входит в эту базу знаний. Подробное описание позволяет ИИ более точно получать доступ к содержимому набора данных. Если значение пусто, Dify будет использовать стратегию попадания по умолчанию. (Дополнительный)', + configurationTip: 'Настроить {{pluginName}}', } export default translation diff --git a/web/i18n/ru-RU/dataset.ts b/web/i18n/ru-RU/dataset.ts index ffc31941f1..26c363fb5f 100644 --- a/web/i18n/ru-RU/dataset.ts +++ b/web/i18n/ru-RU/dataset.ts @@ -234,6 +234,10 @@ const translation = { title: 'Сервисный API', disabled: 'Отключено', }, + docAllEnabled_one: 'Документ {{count}} включен', + docAllEnabled_other: 'Все документы {{count}} включены', + partialEnabled_one: 'Всего {{count}} документов, доступно {{num}}', + partialEnabled_other: 'Всего {{count}} документов, доступно {{num}}', } export default translation diff --git a/web/i18n/ru-RU/education.ts b/web/i18n/ru-RU/education.ts index 90ecc9c70e..c45690764a 100644 --- a/web/i18n/ru-RU/education.ts +++ b/web/i18n/ru-RU/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: 'Не волнуйся — это не повлияет на твою текущую подписку, но ты не получишь образовательную скидку при её продлении, если не подтвердишь свой статус снова.', + title: 'Статус вашего образования истечет {{date}}', }, stillInEducation: { title: 'Все еще учишься?', diff --git a/web/i18n/ru-RU/pipeline.ts b/web/i18n/ru-RU/pipeline.ts index a447a5575b..375f06afe4 100644 --- a/web/i18n/ru-RU/pipeline.ts +++ b/web/i18n/ru-RU/pipeline.ts @@ -28,10 +28,12 @@ const translation = { viewDetails: 'Подробнее', loading: 'Обработка... Подождите', error: 'Ошибка произошла во время выполнения', + footerTip: 'В режиме тестового запуска предварительный просмотр до {{count}} фрагментов', }, }, ragToolSuggestions: { title: 'Предложения по КГР', + noRecommendationPlugins: 'Рекомендуемые плагины отсутствуют, найдите больше на Marketplace', }, } diff --git a/web/i18n/ru-RU/plugin-trigger.ts b/web/i18n/ru-RU/plugin-trigger.ts new file mode 100644 index 0000000000..2208706f74 --- /dev/null +++ b/web/i18n/ru-RU/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'Подписки', + listNum: '{{num}} подписки', + empty: { + title: 'Нет подписок', + button: 'Новая подписка', + }, + createButton: { + oauth: 'Новая подписка с OAuth', + apiKey: 'Новая подписка с ключом API', + manual: 'Вставьте URL для создания новой подписки', + }, + createSuccess: 'Подписка успешно создана', + createFailed: 'Не удалось создать подписку', + maxCount: 'Макс {{num}} подписок', + selectPlaceholder: 'Выберите подписку', + noSubscriptionSelected: 'Подписка не выбрана', + subscriptionRemoved: 'Подписка удалена', + list: { + title: 'Подписки', + addButton: 'Добавить', + tip: 'Получать события через подписку', + item: { + enabled: 'Включено', + disabled: 'Отключено', + credentialType: { + api_key: 'API ключ', + oauth2: 'OAuth', + unauthorized: 'Руководство', + }, + actions: { + delete: 'Удалить', + deleteConfirm: { + title: 'Удалить {{name}}?', + success: 'Подписка {{name}} успешно удалена', + error: 'Не удалось удалить подписку {{name}}', + content: 'После удаления эта подписка не может быть восстановлена. Пожалуйста, подтвердите.', + contentWithApps: 'Текущая подписка используется {{count}} приложениями. Удаление подписки приведет к тому, что настроенные приложения перестанут получать события подписки.', + confirm: 'Подтвердить удаление', + cancel: 'Отмена', + confirmInputWarning: 'Пожалуйста, введите правильное имя для подтверждения.', + confirmInputPlaceholder: 'Введите "{{name}}", чтобы подтвердить.', + confirmInputTip: 'Пожалуйста, введите «{{name}}», чтобы подтвердить.', + }, + }, + status: { + active: 'Активный', + inactive: 'Неактивный', + }, + usedByNum: 'Используется {{num}} рабочими процессами', + noUsed: 'Рабочий процесс не используется', + }, + }, + addType: { + title: 'Добавить подписку', + description: 'Выберите, как вы хотите создать подписку на триггер', + options: { + apikey: { + title: 'Создать с помощью ключа API', + description: 'Автоматически создавать подписку с использованием учетных данных API', + }, + oauth: { + title: 'Создать с помощью OAuth', + description: 'Авторизуйтесь через стороннюю платформу, чтобы создать подписку', + clientSettings: 'Настройки клиента OAuth', + clientTitle: 'Клиент OAuth', + default: 'По умолчанию', + custom: 'Пользовательский', + }, + manual: { + title: 'Ручная настройка', + description: 'Вставьте URL для создания новой подписки', + tip: 'Настроить URL на сторонней платформе вручную', + }, + }, + }, + }, + modal: { + steps: { + verify: 'Проверить', + configuration: 'Конфигурация', + }, + common: { + cancel: 'Отмена', + back: 'Назад', + next: 'Далее', + create: 'Создать', + verify: 'Проверить', + authorize: 'Авторизовать', + creating: 'Создание...', + verifying: 'Проверка...', + authorizing: 'Авторизация...', + }, + oauthRedirectInfo: 'Так как для этого поставщика инструментов не найдены клиентские секреты системы, необходимо настроить его вручную, для redirect_uri используйте', + apiKey: { + title: 'Создать с помощью ключа API', + verify: { + title: 'Проверить учетные данные', + description: 'Пожалуйста, предоставьте свои учетные данные API для проверки доступа', + error: 'Проверка учетных данных не удалась. Пожалуйста, проверьте ваш API-ключ.', + success: 'Учётные данные успешно проверены', + }, + configuration: { + title: 'Настроить подписку', + description: 'Настройте параметры подписки', + }, + }, + oauth: { + title: 'Создать с помощью OAuth', + authorization: { + title: 'Авторизация OAuth', + description: 'Разрешить Dify доступ к вашему аккаунту', + redirectUrl: 'URL перенаправления', + redirectUrlHelp: 'Используйте этот URL в настройках вашего приложения OAuth', + authorizeButton: 'Авторизоваться с {{provider}}', + waitingAuth: 'Ожидание авторизации...', + authSuccess: 'Авторизация прошла успешно', + authFailed: 'Не удалось получить информацию об авторизации OAuth', + waitingJump: 'Авторизовано, ожидаем прыжка', + }, + configuration: { + title: 'Настроить подписку', + description: 'Настройте параметры подписки после авторизации', + success: 'Настройка OAuth выполнена успешно', + failed: 'Сбой настройки OAuth', + }, + remove: { + success: 'OAuth успешно удалён', + failed: 'Сбой при удалении OAuth', + }, + save: { + success: 'Настройка OAuth успешно сохранена', + }, + }, + manual: { + title: 'Ручная настройка', + description: 'Настройте подписку на вебхук вручную', + logs: { + title: 'Журналы запросов', + request: 'Запрос', + loading: 'Ожидание запроса от {{pluginName}}...', + }, + }, + form: { + subscriptionName: { + label: 'Название подписки', + placeholder: 'Введите название подписки', + required: 'Требуется название подписки', + }, + callbackUrl: { + label: 'URL для обратного вызова', + description: 'Этот URL будет получать события вебхука', + tooltip: 'Предоставьте общедоступную точку доступа, которая может принимать обратные вызовы от поставщика триггеров.', + placeholder: 'Генерация...', + privateAddressWarning: 'Похоже, что этот URL является внутренним адресом, из-за чего запросы вебхука могут не выполняться. Вы можете изменить TRIGGER_URL на публичный адрес.', + }, + }, + errors: { + createFailed: 'Не удалось создать подписку', + verifyFailed: 'Не удалось проверить учетные данные', + authFailed: 'Авторизация не удалась', + networkError: 'Ошибка сети, пожалуйста, попробуйте ещё раз', + }, + }, + events: { + title: 'Доступные события', + description: 'События, на которые может подписываться этот плагин триггера', + empty: 'События отсутствуют', + event: 'Событие', + events: 'События', + actionNum: '{{num}} {{event}} ВКЛЮЧЕНО', + item: { + parameters: 'параметры {{count}}', + noParameters: 'Нет параметров', + }, + output: 'Вывод', + }, + node: { + status: { + warning: 'Отключить', + }, + }, +} + +export default translation diff --git a/web/i18n/ru-RU/plugin.ts b/web/i18n/ru-RU/plugin.ts index 1e3deca872..55061a34f5 100644 --- a/web/i18n/ru-RU/plugin.ts +++ b/web/i18n/ru-RU/plugin.ts @@ -7,6 +7,7 @@ const translation = { bundles: 'Пакеты', agents: 'Агентские стратегии', datasources: 'Источники данных', + triggers: 'Триггеры', }, categorySingle: { bundle: 'Связка', @@ -15,6 +16,7 @@ const translation = { extension: 'Расширение', tool: 'Инструмент', datasource: 'Источник данных', + trigger: 'Спусковой крючок', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { install: 'Устанавливать', update: 'Обновлять', checkUpdate: 'Проверить обновление', + back: 'Назад', }, toolSelector: { placeholder: 'Выберите инструмент...', @@ -306,6 +309,12 @@ const translation = { partialUPdate: 'Только следующие {{num}} плагины будут обновляться автоматически', changeTimezone: 'Чтобы изменить часовой пояс, перейдите в Настройки', }, + readmeInfo: { + title: 'ПРОЧТИ_МЕНЯ', + needHelpCheckReadme: 'Нужна помощь? Ознакомьтесь с файлом README.', + noReadmeAvailable: 'README недоступен', + failedToFetch: 'Не удалось получить README', + }, } export default translation diff --git a/web/i18n/ru-RU/workflow.ts b/web/i18n/ru-RU/workflow.ts index 9d7c99acea..38dcd12352 100644 --- a/web/i18n/ru-RU/workflow.ts +++ b/web/i18n/ru-RU/workflow.ts @@ -113,6 +113,15 @@ const translation = { currentView: 'Текущий вид', currentWorkflow: 'Текущий рабочий процесс', moreActions: 'Больше действий', + listening: 'Слушание', + chooseStartNodeToRun: 'Выберите начальный узел для запуска', + runAllTriggers: 'Запустить все триггеры', + features: 'Функции', + featuresDescription: 'Улучшить пользовательский опыт веб-приложения', + featuresDocLink: 'Узнать больше', + needAdd: 'Необходимо добавить узел {{node}}', + needStartNode: 'Необходимо добавить хотя бы один начальный узел', + workflowAsToolDisabledHint: 'Опубликуйте последний рабочий процесс и убедитесь, что подключен узел ввода пользователя, прежде чем настраивать его как инструмент.', }, env: { envPanelTitle: 'Переменные среды', @@ -219,6 +228,7 @@ const translation = { rerankModelRequired: 'Перед включением модели повторного ранжирования убедитесь, что модель успешно настроена в настройках.', noValidTool: '{{field}} не выбран валидный инструмент', toolParameterRequired: '{{field}}: параметр [{{param}}] является обязательным', + startNodeRequired: 'Пожалуйста, сначала добавьте начальный узел перед {{operation}}', }, singleRun: { testRun: 'Тестовый запуск ', @@ -250,6 +260,21 @@ const translation = { 'allAdded': 'Все добавлено', 'sources': 'Источников', 'searchDataSource': 'Поиск источника данных', + 'start': 'Начать', + 'searchTrigger': 'Триггеры поиска...', + 'allTriggers': 'Все триггеры', + 'noPluginsFound': 'Плагины не найдены', + 'requestToCommunity': 'Запросы к сообществу', + 'featuredTools': 'Избранное', + 'showMoreFeatured': 'Показать больше', + 'showLessFeatured': 'Показать меньше', + 'installed': 'Установлено', + 'pluginByAuthor': 'По {{author}}', + 'usePlugin': 'Выбрать инструмент', + 'hideActions': 'Скрыть инструменты', + 'noFeaturedPlugins': 'Откройте больше инструментов в Маркетплейсе', + 'noFeaturedTriggers': 'Откройте больше триггеров на Маркетплейсе', + 'startDisabledTip': 'Узел триггера и узел ввода пользователя исключают друг друга.', }, blocks: { 'start': 'Начало', @@ -276,6 +301,10 @@ const translation = { 'loop-end': 'Выйти из цикла', 'knowledge-index': 'База знаний', 'datasource': 'Источник данных', + 'originalStartNode': 'исходный начальный узел', + 'trigger-schedule': 'Триггер расписания', + 'trigger-webhook': 'Вебхук-триггер', + 'trigger-plugin': 'Триггер плагина', }, blocksAbout: { 'start': 'Определите начальные параметры для запуска рабочего процесса', @@ -300,6 +329,9 @@ const translation = { 'loop': 'Выполните цикл логики до тех пор, пока не будет достигнуто условие завершения или максимальное количество итераций цикла.', 'knowledge-index': 'База знаний о компании', 'datasource': 'Источник данных О компании', + 'trigger-schedule': 'Триггер рабочего процесса на основе времени, который запускает рабочие процессы по расписанию', + 'trigger-webhook': 'Триггер вебхука получает HTTP-запросы от сторонних систем для автоматического запуска рабочих процессов.', + 'trigger-plugin': 'Триггер интеграции с третьими сторонами, который запускает рабочие процессы на основе событий внешней платформы', }, operator: { zoomIn: 'Увеличить', @@ -340,6 +372,8 @@ const translation = { maximize: 'Максимизировать холст', scrollToSelectedNode: 'Прокрутите до выбранного узла', optional_and_hidden: '(необязательно и скрыто)', + goTo: 'Перейти к', + startNode: 'Начальный узел', }, nodes: { common: { @@ -787,6 +821,8 @@ const translation = { parallelModeEnableDesc: 'В параллельном режиме задачи в итерациях поддерживают параллельное выполнение. Вы можете настроить это на панели свойств справа.', MaxParallelismDesc: 'Максимальный параллелизм используется для управления количеством задач, выполняемых одновременно в одной итерации.', answerNodeWarningDesc: 'Предупреждение о параллельном режиме: узлы ответов, присвоение переменных диалога и постоянные операции чтения и записи в итерациях могут вызывать исключения.', + flattenOutput: 'Сгладить вывод', + flattenOutputDesc: 'Когда функция включена, если все результаты итераций являются массивами, они будут объединены в один массив. Когда функция выключена, результаты сохранят вложенную структуру массивов.', }, note: { addNote: 'Добавить заметку', @@ -963,6 +999,144 @@ const translation = { rerankingModelIsInvalid: 'Модель повторной ранжировки недействительна', embeddingModelIsInvalid: 'Модель встраивания недействительна', }, + triggerPlugin: { + authorized: 'Авторизованный', + notConfigured: 'Не настроено', + notAuthorized: 'Не авторизовано', + selectSubscription: 'Выберите подписку', + availableSubscriptions: 'Доступные подписки', + addSubscription: 'Добавить новую подписку', + removeSubscription: 'Отменить подписку', + subscriptionRemoved: 'Подписка успешно удалена', + error: 'Ошибка', + configuration: 'Конфигурация', + remove: 'Удалить', + or: 'ИЛИ', + useOAuth: 'Использовать OAuth', + useApiKey: 'Использовать ключ API', + authenticationFailed: 'Ошибка аутентификации', + authenticationSuccess: 'Аутентификация успешна', + oauthConfigFailed: 'Сбой настройки OAuth', + configureOAuthClient: 'Настроить OAuth-клиент', + oauthClientDescription: 'Настройте учетные данные клиента OAuth для включения аутентификации', + oauthClientSaved: 'Конфигурация клиента OAuth успешно сохранена', + configureApiKey: 'Настроить ключ API', + apiKeyDescription: 'Настройте учетные данные ключа API для аутентификации', + apiKeyConfigured: 'API-ключ успешно настроен', + configurationFailed: 'Не удалось выполнить настройку', + failedToStart: 'Не удалось запустить процесс аутентификации', + credentialsVerified: 'Учётные данные успешно проверены', + credentialVerificationFailed: 'Проверка учетных данных не удалась', + verifyAndContinue: 'Проверить и продолжить', + configureParameters: 'Настроить параметры', + parametersDescription: 'Настройте параметры и свойства триггера', + configurationComplete: 'Конфигурация завершена', + configurationCompleteDescription: 'Ваш триггер успешно настроен', + configurationCompleteMessage: 'Ваша конфигурация триггера завершена и готова к использованию.', + parameters: 'Параметры', + properties: 'Свойства', + propertiesDescription: 'Дополнительные параметры конфигурации для этого триггера', + noConfigurationRequired: 'Дополнительная настройка для этого триггера не требуется.', + subscriptionName: 'Название подписки', + subscriptionNameDescription: 'Введите уникальное имя для этой подписки на триггер', + subscriptionNamePlaceholder: 'Введите название подписки...', + subscriptionNameRequired: 'Требуется название подписки', + subscriptionRequired: 'Требуется подписка', + }, + triggerSchedule: { + title: 'Расписание', + nodeTitle: 'Триггер расписания', + notConfigured: 'Не настроено', + useCronExpression: 'Используйте cron-выражение', + useVisualPicker: 'Использовать визуальный выбор', + frequency: { + label: 'ЧАСТОТА', + hourly: 'Почасовой', + daily: 'Ежедневно', + weekly: 'Еженедельно', + monthly: 'Ежемесячно', + }, + selectFrequency: 'Выберите частоту', + frequencyLabel: 'Частота', + nextExecution: 'Следующее исполнение', + weekdays: 'Будние дни', + time: 'Время', + cronExpression: 'Выражение Cron', + nextExecutionTime: 'ВРЕМЯ СЛЕДУЮЩЕГО ВЫПОЛНЕНИЯ', + nextExecutionTimes: 'Следующие 5 времен выполнения', + startTime: 'Время начала', + executeNow: 'Выполнение сейчас', + selectDateTime: 'Выберите дату и время', + hours: 'Часы', + minutes: 'Минуты', + onMinute: 'На минуту', + days: 'Дни', + lastDay: 'Последний день', + lastDayTooltip: 'Не все месяцы имеют 31 день. Используйте опцию «последний день», чтобы выбрать последний день каждого месяца.', + mode: 'Мода', + timezone: 'Часовой пояс', + visualConfig: 'Визуальная конфигурация', + monthlyDay: 'Ежемесячный день', + executionTime: 'Время выполнения', + invalidTimezone: 'Недопустимая временная зона', + invalidCronExpression: 'Неверное выражение cron', + noValidExecutionTime: 'Невозможно рассчитать допустимое время выполнения', + executionTimeCalculationError: 'Не удалось вычислить время выполнения', + invalidFrequency: 'Недопустимая частота', + invalidStartTime: 'Недопустимое время начала', + startTimeMustBeFuture: 'Время начала должно быть в будущем', + invalidTimeFormat: 'Неверный формат времени (ожидается ЧЧ:ММ AM/PM)', + invalidWeekday: 'Неверный день недели: {{weekday}}', + invalidMonthlyDay: 'Месячный день должен быть от 1 до 31 или "последний"', + invalidOnMinute: 'Минуты должны быть в диапазоне от 0 до 59', + invalidExecutionTime: 'Недопустимое время выполнения', + executionTimeMustBeFuture: 'Время выполнения должно быть в будущем', + }, + triggerWebhook: { + title: 'Вебхук-триггер', + nodeTitle: '🔗 Вебхук триггер', + configPlaceholder: 'Настройка срабатывания вебхука будет реализована здесь', + webhookUrl: 'URL вебхука', + webhookUrlPlaceholder: 'Нажмите «Создать», чтобы сгенерировать URL вебхука', + generate: 'Сгенерировать', + copy: 'Копировать', + test: 'Тест', + urlGenerated: 'URL вебхука успешно создан', + urlGenerationFailed: 'Не удалось создать URL вебхука', + urlCopied: 'URL скопирован в буфер обмена', + method: 'Метод', + contentType: 'Тип контента', + queryParameters: 'Параметры запроса', + headerParameters: 'Параметры заголовка', + requestBodyParameters: 'Параметры тела запроса', + parameterName: 'Имя переменной', + varName: 'Имя переменной', + varType: 'Тип', + varNamePlaceholder: 'Введите имя переменной...', + required: 'Обязательно', + addParameter: 'Добавить', + addHeader: 'Добавить', + noParameters: 'Параметры не настроены', + noQueryParameters: 'Параметры запроса не настроены', + noHeaders: 'Заголовки не настроены', + noBodyParameters: 'Параметры тела не настроены', + debugUrlTitle: 'Для тестовых запусков всегда используйте этот URL', + debugUrlCopy: 'Нажмите, чтобы скопировать', + debugUrlCopied: 'Скопировано!', + debugUrlPrivateAddressWarning: 'Похоже, что этот URL является внутренним адресом, из-за чего запросы вебхука могут не выполняться. Вы можете изменить TRIGGER_URL на публичный адрес.', + errorHandling: 'Обработка ошибок', + errorStrategy: 'Обработка ошибок', + responseConfiguration: 'Ответ', + asyncMode: 'Асинхронный режим', + statusCode: 'Код состояния', + responseBody: 'Тело ответа', + responseBodyPlaceholder: 'Напишите здесь текст вашего ответа', + headers: 'Заголовки', + validation: { + webhookUrlRequired: 'Требуется URL вебхука', + invalidParameterType: 'Неверный тип параметра "{{type}}" для параметра "{{name}}"', + }, + }, }, tracing: { stopBy: 'Остановлено {{user}}', @@ -1037,6 +1211,18 @@ const translation = { exportToolTip: 'Экспорт переменной в файл', largeData: 'Большие данные, предварительный просмотр только для чтения. Экспортируйте для просмотра всего.', largeDataNoExport: 'Большие данные - только частичный предварительный просмотр', + listening: { + title: 'Ожидание событий от триггеров...', + tip: 'Теперь вы можете имитировать срабатывание событий, отправляя тестовые запросы на HTTP {{nodeName}}-эндпоинт или использовать его в качестве URL обратного вызова для отладки живых событий. Все результаты можно просматривать непосредственно в инспекторе переменных.', + tipPlugin: 'Теперь вы можете создавать события в {{- pluginName}} и получать данные этих событий в Инспекторе переменных.', + tipSchedule: 'Прослушивание событий от триггеров расписания.\nСледующий запланированный запуск: {{nextTriggerTime}}', + tipFallback: 'Ожидайте входящие триггерные события. Результаты появятся здесь.', + defaultNodeName: 'этот триггер', + defaultPluginName: 'этот плагин срабатывает', + defaultScheduleTime: 'Не настроено', + selectedTriggers: 'выбранные триггеры', + stopButton: 'Стоп', + }, }, lastRunTab: 'Последний запуск', settingsTab: 'Настройки', @@ -1054,11 +1240,52 @@ const translation = { copyLastRunError: 'Не удалось скопировать последние входные данные выполнения', noMatchingInputsFound: 'Не найдено соответствующих входных данных из последнего запуска.', lastOutput: 'Последний вывод', + lastRunInputsCopied: '{{count}} вход(ов) скопировано из последнего запуска', }, sidebar: { exportWarning: 'Экспортировать текущую сохранённую версию', exportWarningDesc: 'Это экспортирует текущую сохранённую версию вашего рабочего процесса. Если у вас есть несохранённые изменения в редакторе, сначала сохраните их с помощью опции экспорта на полотне рабочего процесса.', }, + publishLimit: { + startNodeTitlePrefix: 'Обновить до', + startNodeTitleSuffix: 'разблокировать неограниченное количество триггеров для каждого рабочего процесса', + startNodeDesc: 'Вы достигли лимита в 2 триггера на рабочий процесс для этого плана. Обновите план, чтобы опубликовать этот рабочий процесс.', + }, + error: { + startNodeRequired: 'Пожалуйста, сначала добавьте начальный узел перед {{operation}}', + operations: { + connectingNodes: 'соединение узлов', + addingNodes: 'добавление узлов', + modifyingWorkflow: 'изменение рабочего процесса', + updatingWorkflow: 'обновление рабочего процесса', + }, + }, + customWebhook: 'Пользовательский вебхук', + difyTeam: 'Команда Dify', + triggerStatus: { + enabled: 'СПУСКОВОЙ МЕХАНИЗМ', + disabled: 'ТРЕВОГА • ОТКЛЮЧЕНО', + }, + entryNodeStatus: { + enabled: 'НАЧАТЬ', + disabled: 'СТАРТ • ОТКЛЮЧЕНО', + }, + onboarding: { + title: 'Выберите начальный узел, чтобы начать', + description: 'Разные начальные узлы имеют разные возможности. Не волнуйтесь, вы всегда сможете изменить их позже.', + userInputFull: 'Вход пользователя (исходный начальный узел)', + userInputDescription: 'Начальный узел, который позволяет задавать переменные пользовательского ввода с возможностями инструментов: веб-приложение, API сервиса, сервер MCP и рабочий процесс.', + trigger: 'Триггер', + triggerDescription: 'Триггеры могут служить начальной точкой рабочего процесса, например, для запланированных задач, пользовательских вебхуков или интеграций с другими приложениями.', + back: 'Назад', + learnMore: 'Узнать больше', + aboutStartNode: 'о стартовом узле.', + escTip: { + press: 'Нажмите', + key: 'esc', + toDismiss: 'уволить', + }, + }, } export default translation diff --git a/web/i18n/sl-SI/app-debug.ts b/web/i18n/sl-SI/app-debug.ts index 9ecb93828c..efac0efdbf 100644 --- a/web/i18n/sl-SI/app-debug.ts +++ b/web/i18n/sl-SI/app-debug.ts @@ -342,6 +342,8 @@ const translation = { waitForBatchResponse: 'Počakajte, da se konča odgovor na paketno nalogo.', queryRequired: 'Besedilo zahteve je obvezno.', waitForFileUpload: 'Prosimo, počakajte, da se datoteka/datoteke naložijo', + nameOfKeyRequired: 'ime ključa: {{key}} obvezno', + valueOfVarRequired: 'Vrednost {{key}} ne sme biti prazna', }, warningMessage: { timeoutExceeded: 'Rezultati niso prikazani zaradi časovne omejitve. Prosimo, glejte dnevnike, da zberete popolne rezultate.', @@ -354,7 +356,13 @@ const translation = { key: 'Spremenljivi ključ', name: 'Ime uporabniškega vnosnega polja', }, - varKeyError: {}, + varKeyError: { + canNoBeEmpty: '{{key}} je obvezno', + tooLong: '{{key}} je predolg. Ne sme biti daljši od 30 znakov', + notValid: '{{key}} ni veljaven. Lahko vsebuje samo črke, številke in podčrtaje', + notStartWithNumber: '{{key}} se ne more začeti s številko', + keyAlreadyExists: '{{key}} že obstaja', + }, otherError: { promptNoBeEmpty: 'Poziv ne more biti prazen', historyNoBeEmpty: 'Zgodovina pogovorov mora biti nastavljena v pozivu', @@ -432,6 +440,9 @@ const translation = { 'tooltipsPlaceholder': 'Vnos uporabnega besedila, ki se prikaže, ko premaknete kazalec miške nad oznako', 'uploadMethod': 'Način nalaganja', 'unitPlaceholder': 'Prikažite enote za številkami, npr. žetoni', + 'description': 'Nastavitev za spremenljivko {{varName}}', + 'notSet': 'Ni nastavljeno, poskusite v predpono vnesti {{input}}', + 'maxNumberTip': 'Dokument < {{docLimit}}, slika < {{imgLimit}}, avdio < {{audioLimit}}, video < {{videoLimit}}', }, vision: { visionSettings: { @@ -444,6 +455,7 @@ const translation = { title: 'Nastavitve vida', both: 'Oba', low: 'Nizek', + resolutionTooltip: 'nizka ločljivost bo modelu omogočila, da prejme različico slike nizke ločljivosti 512 x 512 in predstavi sliko z omejitvijo 65 tokenov. To omogoča API-ju, da vrne hitrejše odgovore in porabi manj vhodnih tokenov za primere uporabe, kjer visoka podrobnost ni potrebna.\n\nvisoka ločljivost bo modelu najprej omogočila, da vidi sliko nizke ločljivosti, nato pa ustvari podrobne izrezke vhodnih slik kot 512px kvadrate glede na velikost vhodne slike. Vsak od podrobnih izrezkov uporablja dvakrat večji proračun tokenov, za skupno 129 tokenov.', }, name: 'Vid', settings: 'Nastavitve', @@ -472,6 +484,10 @@ const translation = { noDataPlaceHolder: 'Začetek pogovora z uporabnikom lahko AI pomaga vzpostaviti tesnejšo povezavo z njimi v pogovornih aplikacijah.', add: 'Dodati', writeOpener: 'Odpiralnik za urejanje', + placeholder: 'Tukaj napišite svoje uvodno sporočilo, lahko uporabljate spremenljivke, poskusite tip {{variable}}.', + openingQuestionPlaceholder: 'Lahko uporabljaš spremenljivke, poskusi vpisati {{variable}}.', + varTip: 'Lahko uporabiš spremenljivke, poskusi tip {{variable}}', + notIncludeKey: 'Začetni poziv ne vključuje spremenljivke: {{key}}. Prosimo, dodajte jo v začetni poziv.', }, modelConfig: { modeType: { @@ -563,6 +579,8 @@ const translation = { publishAs: 'Objavi kot', result: 'Izhodno besedilo', variableTip: 'Uporabniki izpolnijo spremenljivke v obrazcu in samodejno zamenjajo spremenljivke v pozivu.', + promptTip: 'Pozivi usmerjajo odgovore umetne inteligence z navodili in omejitvami. Vstavite spremenljivke, kot je {{input}}. Ta poziv ne bo viden uporabnikom.', + notSetVar: 'Spremenljivke uporabnikom omogočajo, da pri izpolnjevanju obrazcev vnesejo začetne besede ali uvodne opombe. Poskusite vnesti "{{input}}" v začetne besede.', } export default translation diff --git a/web/i18n/sl-SI/app-log.ts b/web/i18n/sl-SI/app-log.ts index 318ec731aa..37e12d2093 100644 --- a/web/i18n/sl-SI/app-log.ts +++ b/web/i18n/sl-SI/app-log.ts @@ -19,6 +19,7 @@ const translation = { tokens: 'ŽETONI', user: 'Končni uporabnik ali račun', version: 'VERZIJA', + triggered_from: 'SPROŽENO Z', }, pagination: { previous: 'Prejšnja', @@ -97,6 +98,15 @@ const translation = { finalProcessing: 'Končna obdelava', }, dateFormat: 'MM/DD/LETNO', + triggerBy: { + debugging: 'Razhroščevanje', + appRun: 'Spletna aplikacija', + webhook: 'Webhook', + schedule: 'Urnik', + plugin: 'Vtičnik', + ragPipelineRun: 'RAG cevovod', + ragPipelineDebugging: 'RAG odpravljanje napak', + }, } export default translation diff --git a/web/i18n/sl-SI/app-overview.ts b/web/i18n/sl-SI/app-overview.ts index 11a3359021..f5ece15d15 100644 --- a/web/i18n/sl-SI/app-overview.ts +++ b/web/i18n/sl-SI/app-overview.ts @@ -114,7 +114,11 @@ const translation = { }, }, launch: 'Začetek', - enableTooltip: {}, + enableTooltip: { + description: 'Za omogočanje te funkcije prosimo dodajte vozlišče Uporabniški vnos na platno. (Morda že obstaja v osnutku, začne veljati po objavi)', + learnMore: 'Izvedi več', + }, + title: 'Spletna aplikacija', }, apiInfo: { title: 'API storitev v ozadju', @@ -126,7 +130,14 @@ const translation = { running: 'V storitvi', disable: 'Onemogočeno', }, - triggerInfo: {}, + triggerInfo: { + title: 'Sprožilci', + explanation: 'Upravljanje sprožilcev poteka dela', + triggersAdded: '{{count}} sprožilci dodani', + noTriggerAdded: 'Sprožilec ni dodan', + triggerStatusDescription: 'Stanje sprožilnega vozlišča se prikaže tukaj. (Morda že obstaja v osnutku, začne veljati po objavi)', + learnAboutTriggers: 'Spoznajte sprožilce', + }, disableTooltip: { triggerMode: 'Funkcija {{feature}} ni podprta v načinu vozlišča sprožilca.', }, diff --git a/web/i18n/sl-SI/billing.ts b/web/i18n/sl-SI/billing.ts index 85d0d98c67..592ddc0cea 100644 --- a/web/i18n/sl-SI/billing.ts +++ b/web/i18n/sl-SI/billing.ts @@ -98,6 +98,8 @@ const translation = { triggerEvents: { unlimited: 'Neomejeni sprožilni dogodki', tooltip: 'Število dogodkov, ki samodejno sprožijo delovne tokove prek vtičnika, urnika ali sprožilcev spletnih klicev.', + sandbox: '{{count,number}} Sprožilni dogodki', + professional: '{{count,number}} Sprožilni dogodki/mesec', }, workflowExecution: { standard: 'Izvajanje standardnega delovnega procesa', @@ -107,6 +109,11 @@ const translation = { }, startNodes: { unlimited: 'Neomejeni sprožilci/poteki dela', + limited: 'Do {{count}} sprožilcev/poteka dela', + }, + title: { + plans: 'plani', + description: 'Izberite načrt, ki najbolj ustreza potrebam vaše ekipe.', }, }, plans: { @@ -129,16 +136,14 @@ const translation = { name: 'Podjetje', description: 'Pridobite vse zmogljivosti in podporo za velike sisteme kritične za misijo.', includesTitle: 'Vse v načrtu Ekipa, plus:', - features: { - }, + features: ['Razširljive rešitve za uvajanje na ravni podjetja', 'Pooblastilo za komercialno licenco', 'Ekskluzivne funkcije za podjetja', 'Več delovnih prostorov in upravljanje podjetja', 'SSO', 'Pogajani SLA-ji s strani partnerjev Dify', 'Napredna varnost in nadzor', 'Posodobitve in vzdrževanje uradno s strani Dify', 'Strokovna tehnična podpora'], priceTip: 'Letno zaračunavanje samo', price: 'Po meri', btnText: 'Kontaktirajte prodajo', for: 'Za velike ekipe', }, community: { - features: { - }, + features: ['Vse osnovne funkcije so izdane v javni repozitorij', 'Enotno delovno okolje', 'V skladu z Dify licenco odprte kode'], includesTitle: 'Brezplačne funkcije:', price: 'Brezplačno', name: 'Skupnost', @@ -147,8 +152,7 @@ const translation = { btnText: 'Začnite s skupnostjo', }, premium: { - features: { - }, + features: ['Samo-upravljana zanesljivost različnih ponudnikov oblaka', 'Enotno delovno okolje', 'Prilagoditev logotipa in blagovne znamke spletne aplikacije', 'Prioritetna e-pošta in klepet v živo'], name: 'Premium', priceTip: 'Na podlagi oblaka Marketplace', price: 'Škalable', @@ -184,6 +188,7 @@ const translation = { buildApps: 'Gradite aplikacije', perMonth: 'na mesec', triggerEvents: 'Sprožilni dogodki', + resetsIn: 'Ponastavitve čez {{count,number}} dni', }, teamMembers: 'Člani ekipe', triggerLimitModal: { diff --git a/web/i18n/sl-SI/common.ts b/web/i18n/sl-SI/common.ts index 9a84513871..46df8938d0 100644 --- a/web/i18n/sl-SI/common.ts +++ b/web/i18n/sl-SI/common.ts @@ -65,6 +65,12 @@ const translation = { confirmAction: 'Prosimo, potrdite svoje dejanje.', deleteConfirmTitle: 'Izbrisati?', yes: 'Da', + noSearchResults: 'Ni bilo najdenih {{content}}', + resetKeywords: 'Ponastavi ključne besede', + selectCount: '{{count}} Izbrano', + searchCount: 'Najdi {{count}} {{content}}', + noSearchCount: '0 {{content}}', + now: 'Zdaj', }, errorMsg: { fieldRequired: '{{field}} je obvezno', @@ -73,6 +79,7 @@ const translation = { placeholder: { input: 'Vnesite prosim', select: 'Izberite prosim', + search: 'Išči...', }, voice: { language: { @@ -850,6 +857,13 @@ const translation = { label: { optional: '(neobvezno)', }, + noData: 'Ni podatkov', + dynamicSelect: { + error: 'Nalaganje možnosti ni uspelo', + noData: 'Ni na voljo nobenih možnosti', + loading: 'Nalaganje možnosti...', + selected: '{{count}} izbrano', + }, } export default translation diff --git a/web/i18n/sl-SI/dataset-documents.ts b/web/i18n/sl-SI/dataset-documents.ts index b63ff09fd6..a2523807c6 100644 --- a/web/i18n/sl-SI/dataset-documents.ts +++ b/web/i18n/sl-SI/dataset-documents.ts @@ -81,7 +81,10 @@ const translation = { ok: 'V redu', }, learnMore: 'Izvedi več', - sort: {}, + sort: { + uploadTime: 'Čas nalaganja', + hitCount: 'Število priklicev', + }, }, metadata: { title: 'Metapodatki', diff --git a/web/i18n/sl-SI/dataset-pipeline.ts b/web/i18n/sl-SI/dataset-pipeline.ts index 8e48450db3..25cf0d06b4 100644 --- a/web/i18n/sl-SI/dataset-pipeline.ts +++ b/web/i18n/sl-SI/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'Objavljen Knowledge Pipeline', + tip: 'Pojdite v Dokumente, da dodate ali upravljate z dokumenti.', }, error: { message: 'Objava cevovoda znanja ni uspela', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'Struktura', structureTooltip: 'Struktura kosov določa, kako so dokumenti razdeljeni in indeksirani – ponuja načine Splošno, Nadrejeno-podrejeno in Vprašanja in odgovori – in je edinstvena za vsako zbirko znanja.', + createdBy: 'Avtor {{author}}', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { characters: 'Znakov', backToDataSource: 'Vir podatkov', title: 'Dodajanje dokumentov', + selectOnlineDocumentTip: 'Obdelajte do {{count}} strani', + selectOnlineDriveTip: 'Obdelajte do {{count}} datotek, vsaka največ {{fileSize}} MB', }, documentSettings: { title: 'Nastavitve dokumenta', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} strani', + }, onlineDrive: { breadcrumbs: { allFiles: 'Vse datoteke', searchPlaceholder: 'Iskanje datotek ...', allBuckets: 'Vsa vedra za shranjevanje v oblaku', + searchResult: 'Najdi {{searchResultsLength}} predmetov v mapi "{{folderName}}"', }, resetKeywords: 'Ponastavitev ključnih besed', emptyFolder: 'Ta mapa je prazna', emptySearchResult: 'Predmeti niso bili najdeni', notSupportedFileType: 'Ta vrsta datoteke ni podprta', + notConnected: '{{name}} ni povezan', + notConnectedTip: 'Za sinhronizacijo z {{name}} je treba najprej vzpostaviti povezavo z {{name}}.', + }, + credentialSelector: { + name: '{{credentialName}}\'s {{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { title: 'Potrditev', @@ -149,6 +160,7 @@ const translation = { knowledgeNameAndIcon: 'Ime in ikona znanja', editPipelineInfo: 'Urejanje informacij o cevovodu', knowledgeDescriptionPlaceholder: 'Opišite, kaj je v tej bazi znanja. Podroben opis omogoča umetni inteligenci natančnejši dostop do vsebine nabora podatkov. Če je prazen, bo Dify uporabil privzeto strategijo zadetkov. (Neobvezno)', + configurationTip: 'Konfiguriraj {{pluginName}}', } export default translation diff --git a/web/i18n/sl-SI/dataset.ts b/web/i18n/sl-SI/dataset.ts index 817340c83a..43ccbd924a 100644 --- a/web/i18n/sl-SI/dataset.ts +++ b/web/i18n/sl-SI/dataset.ts @@ -234,6 +234,10 @@ const translation = { disabled: 'Onemogočeno', enabled: 'V storitvi', }, + docAllEnabled_one: '{{count}} dokument omogočen', + docAllEnabled_other: 'Vsi dokumenti {{count}} omogočeni', + partialEnabled_one: 'Skupno {{count}} dokumentov, na voljo {{num}}', + partialEnabled_other: 'Skupno {{count}} dokumentov, na voljo {{num}}', } export default translation diff --git a/web/i18n/sl-SI/education.ts b/web/i18n/sl-SI/education.ts index 76e26c6606..d207638e35 100644 --- a/web/i18n/sl-SI/education.ts +++ b/web/i18n/sl-SI/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: 'Ne skrbite — to ne bo vplivalo na vaše trenutno naročnino, vendar ne boste dobili izobraževalne popusti, ko se obnovi, razen če ponovno potrdite svoj status.', + title: 'Vaš status izobraževanja bo potekel {{date}}', }, stillInEducation: { title: 'Še vedno v izobraževanju?', diff --git a/web/i18n/sl-SI/pipeline.ts b/web/i18n/sl-SI/pipeline.ts index d1db2250eb..140a235c3f 100644 --- a/web/i18n/sl-SI/pipeline.ts +++ b/web/i18n/sl-SI/pipeline.ts @@ -28,10 +28,12 @@ const translation = { viewDetails: 'Poglej podrobnosti', loading: 'Predelava... Počakaj, prosim', error: 'Med izvajanjem je prišlo do napake', + footerTip: 'V načinu preizkusnega zagona si oglejte do {{count}} kosov', }, }, ragToolSuggestions: { title: 'Predlogi za RAG', + noRecommendationPlugins: 'Brez priporočenih vtičnikov, več najdete v Tržnici', }, } diff --git a/web/i18n/sl-SI/plugin-trigger.ts b/web/i18n/sl-SI/plugin-trigger.ts new file mode 100644 index 0000000000..a904be053e --- /dev/null +++ b/web/i18n/sl-SI/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'Naročnine', + listNum: '{{num}} naročnine', + empty: { + title: 'Brez naročnin', + button: 'Nova naročnina', + }, + createButton: { + oauth: 'Nova naročnina z OAuth', + apiKey: 'Nova naročnina z API ključem', + manual: 'Prilepite URL za ustvarjanje novega naročniškega paketa', + }, + createSuccess: 'Naročnina je bila uspešno ustvarjena', + createFailed: 'Ustvarjanje naročnine ni uspelo', + maxCount: 'Največ {{num}} naročnin', + selectPlaceholder: 'Izberite naročnino', + noSubscriptionSelected: 'Nobena naročnina ni izbrana', + subscriptionRemoved: 'Naročnina odstranjena', + list: { + title: 'Naročnine', + addButton: 'Dodaj', + tip: 'Prejemajte dogodke prek naročnine', + item: { + enabled: 'Omogočeno', + disabled: 'Onemogočeno', + credentialType: { + api_key: 'API ključ', + oauth2: 'OAuth', + unauthorized: 'Priročnik', + }, + actions: { + delete: 'Izbriši', + deleteConfirm: { + title: 'Izbrišem {{name}}?', + success: 'Naročnina {{name}} je bila uspešno izbrisana', + error: 'Brisanje naročnine {{name}} ni uspelo', + content: 'Ko bo ta naročnina izbrisana, je ne bo mogoče obnoviti. Prosimo, potrdite.', + contentWithApps: 'Trenutno naročnino uporablja {{count}} aplikacij. Njeno brisanje bo povzročilo, da konfigurirane aplikacije ne bodo več prejemale dogodkov naročnine.', + confirm: 'Potrdi izbris', + cancel: 'Prekliči', + confirmInputWarning: 'Prosimo, vnesite pravilno ime za potrditev.', + confirmInputPlaceholder: 'Vnesite "{{name}}" za potrditev.', + confirmInputTip: 'Prosimo vnesite “{{name}}”, da potrdite.', + }, + }, + status: { + active: 'Aktiven', + inactive: 'Neaktiven', + }, + usedByNum: 'Uporabljajo {{num}} delovni tokovi', + noUsed: 'Brez uporabljenega poteka dela', + }, + }, + addType: { + title: 'Dodaj naročnino', + description: 'Izberite, kako želite ustvariti svojo naročnino na sprožilec', + options: { + apikey: { + title: 'Ustvari z API ključem', + description: 'Samodejno ustvarite naročnino z uporabo API poverilnic', + }, + oauth: { + title: 'Ustvari z OAuth', + description: 'Pooblasti tretjo stran za ustvarjanje naročnine', + clientSettings: 'Nastavitve odjemalca OAuth', + clientTitle: 'OAuth odjemalec', + default: 'Privzeto', + custom: 'Po meri', + }, + manual: { + title: 'Ročna nastavitev', + description: 'Prilepite URL za ustvarjanje novega naročniškega paketa', + tip: 'Ročno nastavite URL na platformi tretje osebe', + }, + }, + }, + }, + modal: { + steps: { + verify: 'Preveri', + configuration: 'Konfiguracija', + }, + common: { + cancel: 'Prekliči', + back: 'Nazaj', + next: 'Naslednji', + create: 'Ustvari', + verify: 'Preveri', + authorize: 'Pooblastiti', + creating: 'Ustvarjanje...', + verifying: 'Preverjanje...', + authorizing: 'Avtorizacija...', + }, + oauthRedirectInfo: 'Ker za tega ponudnika orodja niso bili najdeni sistemski odjemalski ključni podatki, je potrebno nastaviti ročno, za redirect_uri uporabite', + apiKey: { + title: 'Ustvari z API ključem', + verify: { + title: 'Preveri poverilnice', + description: 'Prosimo, vnesite svoje API poverilnice za preverjanje dostopa', + error: 'Preverjanje poverilnic ni uspelo. Prosimo, preverite svoj API ključ.', + success: 'Poverilnice so bile uspešno preverjene', + }, + configuration: { + title: 'Konfiguriraj naročnino', + description: 'Nastavite parametre naročnine', + }, + }, + oauth: { + title: 'Ustvari z OAuth', + authorization: { + title: 'OAuth avtorizacija', + description: 'Dovoli Difyju dostop do vašega računa', + redirectUrl: 'Preusmeritveni URL', + redirectUrlHelp: 'Uporabite ta URL v konfiguraciji vaše OAuth aplikacije', + authorizeButton: 'Avtorizirajte z {{provider}}', + waitingAuth: 'Čakanje na avtorizacijo...', + authSuccess: 'Pooblastilo uspešno', + authFailed: 'Ni uspelo pridobiti informacij o OAuth pooblastilu', + waitingJump: 'Pooblaščeno, čakajoč na skok', + }, + configuration: { + title: 'Konfiguriraj naročnino', + description: 'Nastavite parametre naročnine po avtorizaciji', + success: 'OAuth konfiguracija uspešna', + failed: 'Konfiguracija OAuth je spodletela', + }, + remove: { + success: 'OAuth uspešno odstranjen', + failed: 'Odstranjevanje OAuth ni uspelo', + }, + save: { + success: 'Konfiguracija OAuth je bila uspešno shranjena', + }, + }, + manual: { + title: 'Ročna nastavitev', + description: 'Ročno konfigurirajte naročnino na spletni kavelj', + logs: { + title: 'Dnevniki zahtev', + request: 'Zahteva', + loading: 'Čakam na zahtevo od {{pluginName}}...', + }, + }, + form: { + subscriptionName: { + label: 'Ime naročnine', + placeholder: 'Vnesite ime naročnine', + required: 'Ime naročnine je obvezno', + }, + callbackUrl: { + label: 'URL za povratni klic', + description: 'Ta URL bo prejel dogodke webhook', + tooltip: 'Zagotovite javno dostopen konec, ki lahko prejema klicne zahteve od ponudnika sprožilca.', + placeholder: 'Generiranje...', + privateAddressWarning: 'Ta URL se zdi notranji naslov, kar lahko povzroči, da zahtevki webhooka ne uspejo. Lahko spremenite TRIGGER_URL v javni naslov.', + }, + }, + errors: { + createFailed: 'Ustvarjanje naročnine ni uspelo', + verifyFailed: 'Neuspešno preverjanje poverilnic', + authFailed: 'Avtorizacija ni uspela', + networkError: 'Napaka v omrežju, poskusite znova', + }, + }, + events: { + title: 'Razpoložljivi dogodki', + description: 'Dogodki, na katere se lahko ta vtičnik sprožilnika naroči', + empty: 'Ni razpoložljivih dogodkov', + event: 'Dogodek', + events: 'Dogodki', + actionNum: '{{num}} {{event}} VKLJUČENO', + item: { + parameters: '{{count}} parametri', + noParameters: 'Brez parametrov', + }, + output: 'Izhod', + }, + node: { + status: { + warning: 'Prekini povezavo', + }, + }, +} + +export default translation diff --git a/web/i18n/sl-SI/plugin.ts b/web/i18n/sl-SI/plugin.ts index e67e6bf032..ca8594df2f 100644 --- a/web/i18n/sl-SI/plugin.ts +++ b/web/i18n/sl-SI/plugin.ts @@ -10,6 +10,7 @@ const translation = { agents: 'Strategije agenta', tools: 'Orodja', datasources: 'Viri podatkov', + triggers: 'Sprožilci', }, categorySingle: { extension: 'Razširitev', @@ -18,6 +19,7 @@ const translation = { tool: 'Orodje', model: 'Model', datasource: 'Vir podatkov', + trigger: 'Sprožilec', }, list: { source: { @@ -48,6 +50,7 @@ const translation = { update: 'Posodobitev', checkUpdate: 'Preveri posodobitev', info: 'Informacije o vtičniku', + back: 'Nazaj', }, toolSelector: { unsupportedContent: 'V različici vtičnika, ki je nameščena, ta akcija ni zagotovljena.', @@ -306,6 +309,12 @@ const translation = { partialUPdate: 'Samo naslednjih {{num}} vtičnikov se bo samodejno posodabljalo.', updateSettings: 'Posodobi nastavitve', }, + readmeInfo: { + title: 'PREBERIME', + needHelpCheckReadme: 'Potrebujete pomoč? Preverite README.', + noReadmeAvailable: 'README ni na voljo', + failedToFetch: 'Neuspešno pridobivanje datoteke README', + }, } export default translation diff --git a/web/i18n/sl-SI/workflow.ts b/web/i18n/sl-SI/workflow.ts index fb1f709162..6712cca0a1 100644 --- a/web/i18n/sl-SI/workflow.ts +++ b/web/i18n/sl-SI/workflow.ts @@ -113,6 +113,15 @@ const translation = { currentView: 'Trenutni pogled', currentWorkflow: 'Trenutni potek dela', moreActions: 'Več dejanj', + listening: 'Poslušanje', + chooseStartNodeToRun: 'Izberite začetno vozlišče za zagon', + runAllTriggers: 'Zaženi vse sprožilce', + features: 'Značilnosti', + featuresDescription: 'Izboljšajte uporabniško izkušnjo spletne aplikacije', + featuresDocLink: 'Izvedi več', + needAdd: 'Povezava {{node}} mora biti dodana', + needStartNode: 'Dodati je treba vsaj eno začetno vozlišče', + workflowAsToolDisabledHint: 'Objavite najnovejše delovne tokove in zagotovite, da je pred konfiguracijo kot orodje povezan vozel za vnos uporabnika.', }, env: { modal: { @@ -219,6 +228,7 @@ const translation = { authRequired: 'Zahtevana je avtorizacija', invalidJson: '{{field}} je neveljaven JSON', fieldRequired: '{{field}} je obvezno', + startNodeRequired: 'Prosimo, najprej dodajte začetni vozel pred {{operation}}', }, singleRun: { iteration: 'Iteracija', @@ -250,6 +260,21 @@ const translation = { 'allAdded': 'Vse dodano', 'sources': 'Virov', 'searchDataSource': 'Iskanje vira podatkov', + 'start': 'Začni', + 'searchTrigger': 'Iskalni sprožilci...', + 'allTriggers': 'Vsi sprožilci', + 'noPluginsFound': 'Ni bilo najdenih nobenih vtičnikov', + 'requestToCommunity': 'Zahteve skupnosti', + 'featuredTools': 'Priporočeno', + 'showMoreFeatured': 'Pokaži več', + 'showLessFeatured': 'Pokaži manj', + 'installed': 'Nameščeno', + 'pluginByAuthor': 'Avtor: {{author}}', + 'usePlugin': 'Izberi orodje', + 'hideActions': 'Skrij orodja', + 'noFeaturedPlugins': 'Odkrijte več orodij na Tržnici', + 'noFeaturedTriggers': 'Odkrijte več sprožilcev na Tržnici', + 'startDisabledTip': 'Vozlišče sprožilca in vozlišče vnosa uporabnika se med seboj izključujeta.', }, blocks: { 'iteration': 'Iteracija', @@ -276,6 +301,10 @@ const translation = { 'variable-assigner': 'Spremenljivka agregator', 'datasource': 'Vir podatkov', 'knowledge-index': 'Baza znanja', + 'originalStartNode': 'izvorna začetna točka', + 'trigger-schedule': 'Sprožilec urnika', + 'trigger-webhook': 'Sprožilec spletnega ključa', + 'trigger-plugin': 'Sprožilec vtičnika', }, blocksAbout: { 'list-operator': 'Uporabljeno za filtriranje ali razvrščanje vsebine polja.', @@ -300,6 +329,9 @@ const translation = { 'assigner': 'Vožnji vozlišča za dodelitev spremenljivk se uporablja za dodeljevanje vrednosti spremenljivkam, ki jih je mogoče zapisati (kot so spremenljivke za pogovor).', 'datasource': 'Vir podatkov O nas', 'knowledge-index': 'Baza znanja O', + 'trigger-schedule': 'Sprožilec delovnega toka, ki se začne po urniku', + 'trigger-webhook': 'Sprožilec Webhook prejema HTTP potiske od sistemov tretjih oseb za samodejno sprožitev delovnih tokov.', + 'trigger-plugin': 'Sprožilec integracije tretje osebe, ki začne delovne tokove iz dogodkov na zunanji platformi', }, operator: { zoomOut: 'Zoomirati ven', @@ -347,6 +379,8 @@ const translation = { optional: '(neobvezno)', scrollToSelectedNode: 'Pomaknite se do izbranega vozlišča', optional_and_hidden: '(neobvezno in skrito)', + goTo: 'Pojdi na', + startNode: 'Začetni vozel', }, nodes: { common: { @@ -794,6 +828,8 @@ const translation = { deleteDesc: 'Izbris iteracijskega vozlišča bo izbrisal vsa otroška vozlišča.', parallelModeEnableDesc: 'V vzporednem načinu naloge znotraj iteracij podpirajo vzporedno izvajanje. To lahko nastavite v razdelku lastnosti na desni strani.', parallelPanelDesc: 'V paralelnem načinu naloge v iteraciji podpirajo parallelno izvajanje.', + flattenOutput: 'Izravnaj izhod', + flattenOutputDesc: 'Ko je omogočeno, bodo vsi izhodi posameznih iteracij, če so v obliki tabel, združeni v eno samo tabelo. Ko je onemogočeno, bodo izhodi ohranili strukturo gnezdene tabele.', }, loop: { ErrorMethod: { @@ -970,6 +1006,144 @@ const translation = { rerankingModelIsInvalid: 'Model prerazvrščanja ni veljaven', embeddingModelIsInvalid: 'Vdelovalni model ni veljaven', }, + triggerPlugin: { + authorized: 'Pooblaščeno', + notConfigured: 'Ni nastavljeno', + notAuthorized: 'Ni pooblaščeno', + selectSubscription: 'Izberite naročnino', + availableSubscriptions: 'Razpoložljive naročnine', + addSubscription: 'Dodaj novo naročnino', + removeSubscription: 'Odstrani naročnino', + subscriptionRemoved: 'Naročnina je bila uspešno odstranjena', + error: 'Napaka', + configuration: 'Konfiguracija', + remove: 'Odstrani', + or: 'ALI', + useOAuth: 'Uporabi OAuth', + useApiKey: 'Uporabi ključno besedo API', + authenticationFailed: 'Overjanje ni uspelo', + authenticationSuccess: 'Overjanje uspešno', + oauthConfigFailed: 'Konfiguracija OAuth je spodletela', + configureOAuthClient: 'Konfiguriraj OAuth odjemalca', + oauthClientDescription: 'Konfigurirajte poverilnice odjemalca OAuth za omogočanje preverjanja pristnosti', + oauthClientSaved: 'Konfiguracija OAuth odjemalca je bila uspešno shranjena', + configureApiKey: 'Konfiguriraj API ključ', + apiKeyDescription: 'Konfigurirajte poverilnice ključa API za overjanje', + apiKeyConfigured: 'API ključ je bil uspešno konfiguriran', + configurationFailed: 'Konfiguracija ni uspela', + failedToStart: 'Začetek avtentikacijskega procesa ni uspel', + credentialsVerified: 'Poverilnice so bile uspešno preverjene', + credentialVerificationFailed: 'Preverjanje poverilnic ni uspelo', + verifyAndContinue: 'Preveri in nadaljuj', + configureParameters: 'Konfiguriraj parametre', + parametersDescription: 'Konfigurirajte parametre in lastnosti sprožilnika', + configurationComplete: 'Konfiguracija je zaključena', + configurationCompleteDescription: 'Vaš sprožilec je bil uspešno konfiguriran', + configurationCompleteMessage: 'Vaša konfiguracija sprožilnika je zdaj dokončana in pripravljena za uporabo.', + parameters: 'Parametri', + properties: 'Lastnosti', + propertiesDescription: 'Dodatne konfiguracijske lastnosti za ta sprožilec', + noConfigurationRequired: 'Za ta sprožilec ni potrebna dodatna nastavitev.', + subscriptionName: 'Ime naročnine', + subscriptionNameDescription: 'Vnesite edinstveno ime za to naročnino na sprožilec', + subscriptionNamePlaceholder: 'Vnesite ime naročnine...', + subscriptionNameRequired: 'Ime naročnine je obvezno', + subscriptionRequired: 'Potrebna je naročnina', + }, + triggerSchedule: { + title: 'Urnik', + nodeTitle: 'Sprožilec urnika', + notConfigured: 'Ni konfigurirano', + useCronExpression: 'Uporabi cron izraz', + useVisualPicker: 'Uporabi vizualni izbirnik', + frequency: { + label: 'FREKVENCA', + hourly: 'Ura', + daily: 'Dnevno', + weekly: 'Tedensko', + monthly: 'Mesečno', + }, + selectFrequency: 'Izberite frekvenco', + frequencyLabel: 'Frekvenca', + nextExecution: 'Naslednja izvršitev', + weekdays: 'Delovni dnevi', + time: 'Čas', + cronExpression: 'Izraz Cron', + nextExecutionTime: 'NASLEDNJI ČAS IZVRŠITVE', + nextExecutionTimes: 'Naslednjih 5 časov izvajanja', + startTime: 'Začetni čas', + executeNow: 'Izvršitev zdaj', + selectDateTime: 'Izberite datum in čas', + hours: 'Ure', + minutes: 'Minute', + onMinute: 'Na minuto', + days: 'Dnevi', + lastDay: 'Zadnji dan', + lastDayTooltip: 'Ne vsi meseci imajo 31 dni. Uporabite možnost \'zadnji dan\', da izberete zadnji dan vsakega meseca.', + mode: 'Moda', + timezone: 'Časovni pas', + visualConfig: 'Vizualna konfiguracija', + monthlyDay: 'Mesečni dan', + executionTime: 'Čas izvajanja', + invalidTimezone: 'Neveljavna časovna cona', + invalidCronExpression: 'Neveljavna cron izraz', + noValidExecutionTime: 'Ni mogoče izračunati veljavnega časa izvajanja', + executionTimeCalculationError: 'Ni bilo mogoče izračunati časov izvajanja', + invalidFrequency: 'Neveljavna frekvenca', + invalidStartTime: 'Neveljaven čas začetka', + startTimeMustBeFuture: 'Začetni čas mora biti v prihodnosti', + invalidTimeFormat: 'Neveljaven format časa (pričakovano U:MM AM/PM)', + invalidWeekday: 'Neveljaven dan v tednu: {{weekday}}', + invalidMonthlyDay: 'Mesečni dan mora biti med 1 in 31 ali "zadnji"', + invalidOnMinute: 'Minute morajo biti med 0 in 59', + invalidExecutionTime: 'Neveljaven čas izvajanja', + executionTimeMustBeFuture: 'Čas izvajanja mora biti v prihodnosti', + }, + triggerWebhook: { + title: 'Sprožilec spletnega ključa', + nodeTitle: '🔗 Sprožilec Webhook', + configPlaceholder: 'Konfiguracija sprožilca webhook bo izvedena tukaj', + webhookUrl: 'URL spletnega kljuka', + webhookUrlPlaceholder: 'Kliknite ustvari za ustvarjanje URL-ja spletnega ključa', + generate: 'Ustvari', + copy: 'Kopiraj', + test: 'Preizkus', + urlGenerated: 'URL spletnega ključa je bil uspešno ustvarjen', + urlGenerationFailed: 'Ni bilo mogoče ustvariti URL-ja spletnega vtiča', + urlCopied: 'URL je bil kopiran v odložišče', + method: 'Metoda', + contentType: 'Vrsta vsebine', + queryParameters: 'Parametri poizvedbe', + headerParameters: 'Parametri glave', + requestBodyParameters: 'Parametri telesa zahteve', + parameterName: 'Ime spremenljivke', + varName: 'Ime spremenljivke', + varType: 'Tip', + varNamePlaceholder: 'Vnesite ime spremenljivke...', + required: 'Zahtevano', + addParameter: 'Dodaj', + addHeader: 'Dodaj', + noParameters: 'Nobeni parametri niso nastavljeni', + noQueryParameters: 'Ni konfiguriranih parametrov poizvedbe', + noHeaders: 'Brez konfiguriranih glavi', + noBodyParameters: 'Nobenih telesnih parametrov ni konfiguriranih', + debugUrlTitle: 'Za testne zagon vedno uporabite ta URL', + debugUrlCopy: 'Kliknite, da kopirate', + debugUrlCopied: 'Kopirano!', + debugUrlPrivateAddressWarning: 'Ta URL se zdi notranji naslov, kar lahko povzroči, da zahtevki webhooka ne uspejo. TRIGGER_URL lahko spremenite v javni naslov.', + errorHandling: 'Ravnanje z napakami', + errorStrategy: 'Ravnanje z napakami', + responseConfiguration: 'Odgovor', + asyncMode: 'Asinhroni način', + statusCode: 'Statusna koda', + responseBody: 'Telo odgovora', + responseBodyPlaceholder: 'Napišite svoje telo odgovora tukaj', + headers: 'Glave', + validation: { + webhookUrlRequired: 'URL spletnega ključa je obvezen', + invalidParameterType: 'Neveljavna vrsta parametra "{{type}}" za parameter "{{name}}"', + }, + }, }, tracing: { stopBy: 'Ohranjaj se pri {{user}}', @@ -1037,6 +1211,18 @@ const translation = { exportToolTip: 'Izvozi spremenljivko kot datoteko', largeDataNoExport: 'Veliki podatki – samo delni predogled', largeData: 'Veliki podatki, predogled samo za branje. Izvozi, če si želite ogledati vse.', + listening: { + title: 'Poslušanje dogodkov iz sprožilcev...', + tip: 'Zdaj lahko simulirate sprožilce dogodkov tako, da pošljete testne zahteve na HTTP {{nodeName}} končno točko ali jo uporabite kot URL za klicanje povratne funkcije za odpravljanje napak v živo. Vse izhode lahko neposredno ogledate v inšpektorju spremenljivk.', + tipPlugin: 'Zdaj lahko ustvarjate dogodke v {{- pluginName}} in pridobivate izhode iz teh dogodkov v Inšpektorju spremenljivk.', + tipSchedule: 'Poslušanje dogodkov iz sprožilcev urnika.\nNaslednje načrtovano izvajanje: {{nextTriggerTime}}', + tipFallback: 'Počakajte na prihajajoče sprožilne dogodke. Izhodi se bodo prikazali tukaj.', + defaultNodeName: 'ta sprožilec', + defaultPluginName: 'ta vtičnik sproži', + defaultScheduleTime: 'Ni konfigurirano', + selectedTriggers: 'izbrani sprožilci', + stopButton: 'Ustavi', + }, }, settingsTab: 'Nastavitve', lastRunTab: 'Zadnji zagon', @@ -1054,11 +1240,52 @@ const translation = { noLastRunFound: 'Nobenega prejšnjega zagona ni bilo najdenega.', noMatchingInputsFound: 'Ni podatkov, ki bi ustrezali prejšnjemu zagonu', lastOutput: 'Nazadnje izhod', + lastRunInputsCopied: '{{count}} vhod(i) kopiran(i) iz zadnjega zagona', }, sidebar: { exportWarning: 'Izvozi trenutna shranjena različica', exportWarningDesc: 'To bo izvozilo trenutno shranjeno različico vašega delovnega toka. Če imate neshranjene spremembe v urejevalniku, jih najprej shranite z uporabo možnosti izvoza na platnu delovnega toka.', }, + publishLimit: { + startNodeTitlePrefix: 'Nadgradi na', + startNodeTitleSuffix: 'odklene neomejene sprožilce na delovni tok', + startNodeDesc: 'Dosegli ste omejitev 2 sprožilcev na delovni tok za ta načrt. Nadgradite, da lahko objavite ta delovni tok.', + }, + error: { + startNodeRequired: 'Prosimo, najprej dodajte začetni vozel pred {{operation}}', + operations: { + connectingNodes: 'povezovalni vozel', + addingNodes: 'dodajanje vozlišč', + modifyingWorkflow: 'spreminjanje delovnega toka', + updatingWorkflow: 'posodabljanje delovnega procesa', + }, + }, + customWebhook: 'Prilagojeni spletni kavelj', + difyTeam: 'Ekipa Dify', + triggerStatus: { + enabled: 'SPROŽILEC', + disabled: 'SPROŽILEC • ONEMOGOČENO', + }, + entryNodeStatus: { + enabled: 'ZAČETEK', + disabled: 'ZAČNI • ONEMOGOČENO', + }, + onboarding: { + title: 'Izberite začetno vozlišče za začetek', + description: 'Različni začetni vozli imajo različne zmogljivosti. Brez skrbi, vedno jih lahko kasneje spremenite.', + userInputFull: 'Uporabniški vnos (izvorna začetna točka)', + userInputDescription: 'Začetni vozel, ki omogoča nastavitev uporabniških vhodnih spremenljivk, z zmogljivostmi orodij za spletno aplikacijo, API storitev, MCP strežnik in potek dela.', + trigger: 'Sprožilec', + triggerDescription: 'Sprožilci lahko služijo kot začetna točka delovnega toka, na primer razporejene naloge, po meri narejeni spletni oglasi ali integracije z drugimi aplikacijami.', + back: 'Nazaj', + learnMore: 'Izvedi več', + aboutStartNode: 'o začetnem vozelu.', + escTip: { + press: 'Tisk', + key: 'esc', + toDismiss: 'odpustiti', + }, + }, } export default translation diff --git a/web/i18n/th-TH/app-debug.ts b/web/i18n/th-TH/app-debug.ts index 19f350961b..21fccb7e31 100644 --- a/web/i18n/th-TH/app-debug.ts +++ b/web/i18n/th-TH/app-debug.ts @@ -98,6 +98,7 @@ const translation = { contextVarNotEmpty: 'ตัวแปรการสืบค้นบริบทต้องไม่ว่างเปล่า', deleteContextVarTip: 'ตัวแปรนี้ถูกตั้งค่าเป็นตัวแปรแบบสอบถามบริบท และการลบตัวแปรนี้จะส่งผลต่อการใช้ความรู้ตามปกติ หากคุณยังต้องการลบ โปรดเลือกใหม่ในส่วนบริบท', unableToQueryDataSet: 'ไม่สามารถสืบค้นความรู้ได้', + deleteContextVarTitle: 'ต้องการลบตัวแปร “{{varName}}” หรือไม่?', }, noDataSet: 'ไม่พบความรู้', notSupportSelectMulti: 'ปัจจุบันรองรับความรู้เพียงหนึ่งความรู้', @@ -125,6 +126,7 @@ const translation = { }, title: 'เครื่อง มือ', tips: 'เครื่องมือมีวิธีการเรียก API มาตรฐาน โดยใช้อินพุตหรือตัวแปรของผู้ใช้เป็นพารามิเตอร์คําขอสําหรับการสืบค้นข้อมูลภายนอกตามบริบท', + toolsInUse: 'เครื่องมือ {{count}} ที่ใช้งาน', }, conversationHistory: { editModal: { @@ -135,6 +137,7 @@ const translation = { description: 'ตั้งชื่อคํานําหน้าสําหรับบทบาทการสนทนา', learnMore: 'ศึกษาเพิ่มเติม', title: 'ประวัติการสนทนา', + tip: 'ประวัติการสนทนายังไม่ได้เปิดใช้งาน กรุณาเพิ่ม ในคำสั่งด้านบน', }, toolbox: { title: 'เครื่อง มือ', @@ -316,6 +319,8 @@ const translation = { waitForResponse: 'โปรดรอให้การตอบกลับข้อความก่อนหน้าเสร็จสมบูรณ์', waitForImgUpload: 'โปรดรอให้ภาพอัปโหลด', queryRequired: 'ต้องส่งข้อความคําขอ', + nameOfKeyRequired: 'ชื่อของคีย์: {{key}} จำเป็นต้องมี', + valueOfVarRequired: 'ค่า {{key}} ไม่สามารถเว้นว่างได้', }, warningMessage: { timeoutExceeded: 'ผลลัพธ์จะไม่แสดงเนื่องจากหมดเวลา โปรดดูบันทึกเพื่อรวบรวมผลลัพธ์ที่สมบูรณ์', @@ -328,7 +333,13 @@ const translation = { name: 'ชื่อฟิลด์ป้อนข้อมูลของผู้ใช้', action: 'การดําเนินการ', }, - varKeyError: {}, + varKeyError: { + canNoBeEmpty: '{{key}} จำเป็นต้องมี', + tooLong: '{{key}} ยาวเกินไป ไม่สามารถยาวกว่า 30 ตัวอักษร', + notValid: '{{key}} ไม่ถูกต้อง สามารถใช้ได้เฉพาะตัวอักษร ตัวเลข และเครื่องหมายขีดล่างเท่านั้น', + notStartWithNumber: '{{key}} ไม่สามารถเริ่มต้นด้วยตัวเลขได้', + keyAlreadyExists: '{{key}} มีอยู่แล้ว', + }, otherError: { queryNoBeEmpty: 'ต้องตั้งค่าคิวรีในพร้อมท์', promptNoBeEmpty: 'พรอมต์ไม่สามารถว่างเปล่าได้', @@ -406,6 +417,9 @@ const translation = { 'defaultValuePlaceholder': 'ป้อนค่าเริ่มต้นเพื่อเติมข้อมูลในฟิลด์ล่วงหน้า', 'placeholderPlaceholder': 'ป้อนข้อความที่จะแสดงเมื่อเขตข้อมูลว่างเปล่า', 'tooltipsPlaceholder': 'ป้อนข้อความที่เป็นประโยชน์ที่แสดงเมื่อวางเมาส์เหนือป้ายกํากับ', + 'description': 'การตั้งค่าสำหรับตัวแปร {{varName}}', + 'notSet': 'ยังไม่ได้ตั้งค่า ลองพิมพ์ {{input}} ในช่องแจ้งนำหน้า', + 'maxNumberTip': 'เอกสาร < {{docLimit}}, รูปภาพ < {{imgLimit}}, เสียง < {{audioLimit}}, วิดีโอ < {{videoLimit}}', }, vision: { visionSettings: { @@ -418,6 +432,7 @@ const translation = { uploadLimit: 'ขีดจํากัดการอัปโหลด', both: 'ทั้งสอง', url: 'URL', + resolutionTooltip: 'ความละเอียดต่ำจะช่วยให้โมเดลรับภาพเวอร์ชันความละเอียดต่ำขนาด 512 x 512 และแสดงภาพด้วยงบประมาณ 65 โทเค็น ซึ่งช่วยให้ API ตอบสนองได้เร็วขึ้นและใช้โทเค็นนำเข้าน้อยลงสำหรับกรณีการใช้งานที่ไม่ต้องการรายละเอียดสูง\n\nความละเอียดสูงจะเริ่มจากการให้โมเดลเห็นภาพความละเอียดต่ำก่อน จากนั้นสร้างการครอปภาพรายละเอียดของภาพอินพุตเป็นสี่เหลี่ยมขนาด 512px ตามขนาดภาพอินพุต แต่ละการครอปละเอียดจะใช้โทเค็นสองเท่า รวมเป็น 129 โทเค็น', }, onlySupportVisionModelTip: 'รองรับเฉพาะโมเดลการมองเห็น', name: 'การมองเห็น', @@ -446,6 +461,10 @@ const translation = { add: 'เพิ่ม', title: 'ที่เปิดการสนทนา', noDataPlaceHolder: 'การเริ่มการสนทนากับผู้ใช้สามารถช่วยให้ AI สร้างความสัมพันธ์ที่ใกล้ชิดกับพวกเขาในแอปพลิเคชันการสนทนา', + placeholder: 'เขียนข้อความเปิดของคุณที่นี่ คุณสามารถใช้ตัวแปร ลองพิมพ์ {{variable}}', + openingQuestionPlaceholder: 'คุณสามารถใช้ตัวแปร ลองพิมพ์ {{variable}} ดูสิ', + varTip: 'คุณสามารถใช้ตัวแปรได้ ลองพิมพ์ {{variable}}', + notIncludeKey: 'คำสั่งเริ่มต้นไม่ได้รวมตัวแปร: {{key}}. กรุณาเพิ่มตัวแปรนี้ในคำสั่งเริ่มต้นด้วย', }, modelConfig: { modeType: { @@ -538,6 +557,8 @@ const translation = { debugAsSingleModel: 'ดีบักเป็นโมเดลเดียว', duplicateModel: 'สำเนา', autoAddVar: 'ตัวแปรที่ไม่ได้กําหนดอ้างอิงในพรอมต์ล่วงหน้าคุณต้องการเพิ่มในแบบฟอร์มการป้อนข้อมูลของผู้ใช้หรือไม่?', + promptTip: 'พรอมต์ช่วยชี้แนะแบบตอบสนองของ AI ด้วยคำแนะนำและข้อจำกัด ใส่ตัวแปรเช่น {{input}} พรอมต์นี้จะมองไม่เห็นสำหรับผู้ใช้', + notSetVar: 'ตัวแปรช่วยให้ผู้ใช้สามารถใส่คำกระตุ้นหรือข้อคิดเห็นเริ่มต้นเมื่อกรอกแบบฟอร์ม คุณสามารถลองใส่ "{{input}}" ในคำกระตุ้นได้', } export default translation diff --git a/web/i18n/th-TH/app-log.ts b/web/i18n/th-TH/app-log.ts index 0e5758a8e1..647e1bfc15 100644 --- a/web/i18n/th-TH/app-log.ts +++ b/web/i18n/th-TH/app-log.ts @@ -19,6 +19,7 @@ const translation = { tokens: 'โท เค็น', user: 'ผู้ใช้ปลายทางหรือบัญชี', version: 'เวอร์ชัน', + triggered_from: 'ถูกกระตุ้นโดย', }, pagination: { previous: 'ก่อนหน้า', @@ -97,6 +98,15 @@ const translation = { finalProcessing: 'การประมวลผลขั้นสุดท้าย', }, dateFormat: 'วัน/เดือน/ปี', + triggerBy: { + debugging: 'การแก้ไขข้อบกพร่อง', + appRun: 'เว็บแอป', + webhook: 'เว็บฮุค', + schedule: 'ตารางเวลา', + plugin: 'ปลั๊กอิน', + ragPipelineRun: 'กระบวนการ RAG', + ragPipelineDebugging: 'การดีบัก RAG', + }, } export default translation diff --git a/web/i18n/th-TH/app-overview.ts b/web/i18n/th-TH/app-overview.ts index e3d14ffcbd..81f519ebb3 100644 --- a/web/i18n/th-TH/app-overview.ts +++ b/web/i18n/th-TH/app-overview.ts @@ -114,7 +114,11 @@ const translation = { }, }, launch: 'เรือยนต์', - enableTooltip: {}, + enableTooltip: { + description: 'เพื่อเปิดใช้งานฟีเจอร์นี้ โปรดเพิ่มโหนดการป้อนข้อมูลผู้ใช้ไปยังแคนวาส (อาจมีอยู่แล้วในร่าง ใช้งานได้หลังจากเผยแพร่)', + learnMore: 'เรียนรู้เพิ่มเติม', + }, + title: 'เว็บแอป', }, apiInfo: { title: 'API บริการแบ็กเอนด์', @@ -126,7 +130,14 @@ const translation = { running: 'ให้บริการ', disable: 'พิการ', }, - triggerInfo: {}, + triggerInfo: { + title: 'สิ่งกระตุ้น', + explanation: 'การจัดการทริกเกอร์เวิร์กโฟลว์', + triggersAdded: 'เพิ่มทริกเกอร์เรียบร้อยแล้ว', + noTriggerAdded: 'ยังไม่ได้เพิ่มทริกเกอร์', + triggerStatusDescription: 'สถานะของโหนดตัวเรียกปรากฏที่นี่ (อาจมีอยู่แล้วในร่าง และจะมีผลหลังจากเผยแพร่)', + learnAboutTriggers: 'เรียนรู้เกี่ยวกับทริกเกอร์', + }, disableTooltip: { triggerMode: 'โหมดโหนดทริกเกอร์ไม่รองรับฟีเจอร์ {{feature}}.', }, diff --git a/web/i18n/th-TH/billing.ts b/web/i18n/th-TH/billing.ts index 659eac5a3b..fb702c327b 100644 --- a/web/i18n/th-TH/billing.ts +++ b/web/i18n/th-TH/billing.ts @@ -98,6 +98,8 @@ const translation = { triggerEvents: { unlimited: 'เหตุการณ์ทริกเกอร์ไม่จำกัด', tooltip: 'จำนวนเหตุการณ์ที่เริ่มเวิร์กโฟลว์โดยอัตโนมัติผ่านปลั๊กอิน ตารางเวลา หรือทริกเกอร์เว็บฮุก', + sandbox: '{{count,number}} เหตุการณ์ทริกเกอร์', + professional: '{{count,number}} เหตุการณ์ที่ก่อให้เกิดต่อเดือน', }, workflowExecution: { standard: 'การดำเนินงานเวิร์กโฟลว์มาตรฐาน', @@ -107,6 +109,11 @@ const translation = { }, startNodes: { unlimited: 'ทริกเกอร์/เวิร์กโฟลว์ไม่จำกัด', + limited: 'สูงสุด {{count}} ตัวกระตุ้น/เวิร์กโฟลว์', + }, + title: { + plans: 'แผน', + description: 'เลือกแผนที่เหมาะสมที่สุดกับความต้องการของทีมคุณ', }, }, plans: { @@ -129,16 +136,14 @@ const translation = { name: 'กิจการ', description: 'รับความสามารถและการสนับสนุนเต็มรูปแบบสําหรับระบบที่สําคัญต่อภารกิจขนาดใหญ่', includesTitle: 'ทุกอย่างในแผนทีม รวมถึง:', - features: { - }, + features: ['โซลูชันการปรับใช้ที่ปรับขนาดได้สำหรับองค์กร', 'การอนุญาตใบอนุญาตเชิงพาณิชย์', 'ฟีเจอร์สำหรับองค์กรแบบพิเศษ', 'หลายพื้นที่ทำงานและการจัดการองค์กร', 'SSO', 'ข้อตกลงระดับการให้บริการที่เจรจาโดยพันธมิตร Dify', 'ระบบความปลอดภัยและการควบคุมขั้นสูง', 'การอัปเดตและการบำรุงรักษาโดย Dify อย่างเป็นทางการ', 'การสนับสนุนทางเทคนิคระดับมืออาชีพ'], btnText: 'ติดต่อฝ่ายขาย', price: 'ที่กำหนดเอง', for: 'สำหรับทีมขนาดใหญ่', priceTip: 'การเรียกเก็บเงินประจำปีเท่านั้น', }, community: { - features: { - }, + features: ['คุณลักษณะหลักทั้งหมดถูกปล่อยภายใต้ที่เก็บสาธารณะ', 'พื้นที่ทำงานเดียว', 'เป็นไปตามใบอนุญาตแบบเปิดของ Dify'], name: 'ชุมชน', price: 'ฟรี', includesTitle: 'คุณสมบัติเสรี:', @@ -147,8 +152,7 @@ const translation = { for: 'สำหรับผู้ใช้ส่วนบุคคล ทีมขนาดเล็ก หรือโครงการที่ไม่ใช่เชิงพาณิชย์', }, premium: { - features: { - }, + features: ['ความน่าเชื่อถือที่บริหารเองโดยผู้ให้บริการคลาวด์หลายราย', 'พื้นที่ทำงานเดียว', 'การปรับแต่งโลโก้และแบรนด์ของเว็บแอป', 'บริการอีเมลและแชทด่วน'], priceTip: 'อิงตามตลาดคลาวด์', for: 'สำหรับองค์กรและทีมขนาดกลาง', btnText: 'รับพรีเมียมใน', @@ -184,6 +188,7 @@ const translation = { vectorSpaceTooltip: 'เอกสารที่ใช้โหมดการจัดทำดัชนีคุณภาพสูงจะใช้ทรัพยากรเก็บข้อมูลความรู้ เมื่อการเก็บข้อมูลความรู้ถึงขีดจำกัด เอกสารใหม่จะไม่สามารถอัปโหลดได้.', triggerEvents: 'เหตุการณ์กระตุ้น', perMonth: 'ต่อเดือน', + resetsIn: 'รีเซ็ตในอีก {{count,number}} วัน', }, teamMembers: 'สมาชิกในทีม', triggerLimitModal: { diff --git a/web/i18n/th-TH/common.ts b/web/i18n/th-TH/common.ts index 62d9115ac9..23dfbe38a7 100644 --- a/web/i18n/th-TH/common.ts +++ b/web/i18n/th-TH/common.ts @@ -65,6 +65,12 @@ const translation = { deleteConfirmTitle: 'ลบหรือไม่?', confirmAction: 'กรุณายืนยันการกระทำของคุณ', yes: 'ใช่', + noSearchResults: 'ไม่พบ {{content}}', + resetKeywords: 'รีเซ็ตคำสำคัญ', + selectCount: '{{count}} ที่เลือก', + searchCount: 'ค้นหา {{count}} {{content}}', + noSearchCount: '0 {{content}}', + now: 'ตอนนี้', }, errorMsg: { fieldRequired: '{{field}} เป็นสิ่งจําเป็น', @@ -73,6 +79,7 @@ const translation = { placeholder: { input: 'กรุณากรอก', select: 'กรุณาเลือก', + search: 'ค้นหา...', }, voice: { language: { @@ -764,6 +771,13 @@ const translation = { label: { optional: '(ไม่บังคับ)', }, + noData: 'ไม่มีข้อมูล', + dynamicSelect: { + error: 'การโหลดตัวเลือกล้มเหลว', + noData: 'ไม่มีตัวเลือก available', + loading: 'กำลังโหลดตัวเลือก...', + selected: '{{count}} ที่ถูกเลือก', + }, } export default translation diff --git a/web/i18n/th-TH/dataset-documents.ts b/web/i18n/th-TH/dataset-documents.ts index 3555c29cd6..a9e514ea3a 100644 --- a/web/i18n/th-TH/dataset-documents.ts +++ b/web/i18n/th-TH/dataset-documents.ts @@ -81,7 +81,10 @@ const translation = { ok: 'ตกลง, ได้', }, learnMore: 'ศึกษาเพิ่มเติม', - sort: {}, + sort: { + uploadTime: 'เวลาที่อัปโหลด', + hitCount: 'จำนวนการดึงข้อมูล', + }, }, metadata: { title: 'ข้อมูลเมตา', diff --git a/web/i18n/th-TH/dataset-pipeline.ts b/web/i18n/th-TH/dataset-pipeline.ts index ec5634f606..e2358aabf7 100644 --- a/web/i18n/th-TH/dataset-pipeline.ts +++ b/web/i18n/th-TH/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'เผยแพร่ไปป์ไลน์ความรู้', + tip: 'ไปที่เอกสาร เพื่อเพิ่มหรือจัดการเอกสาร', }, error: { message: 'ไม่สามารถเผยแพร่ไปป์ไลน์ความรู้', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'โครงสร้าง', structureTooltip: 'โครงสร้างก้อนกําหนดวิธีการแยกและจัดทําดัชนีเอกสาร โดยเสนอโหมดทั่วไป ผู้ปกครอง-รอง และ Q&A และไม่ซ้ํากันสําหรับแต่ละฐานความรู้', + createdBy: 'โดย {{author}}', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { characters: 'อักขระ', backToDataSource: 'แหล่งข้อมูล', title: 'เพิ่มเอกสาร', + selectOnlineDocumentTip: 'ประมวลผลได้สูงสุด {{count}} หน้า', + selectOnlineDriveTip: 'ประมวลผลไฟล์ได้สูงสุด {{count}} ไฟล์ แต่ละไฟล์ไม่เกิน {{fileSize}} MB', }, documentSettings: { title: 'การตั้งค่าเอกสาร', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} หน้า', + }, onlineDrive: { breadcrumbs: { searchPlaceholder: 'ค้นหาไฟล์...', allFiles: 'ไฟล์ทั้งหมด', allBuckets: 'ที่เก็บข้อมูลบนคลาวด์ทั้งหมด', + searchResult: 'พบ {{searchResultsLength}} รายการในโฟลเดอร์ "{{folderName}}"', }, resetKeywords: 'รีเซ็ตคีย์เวิร์ด', emptySearchResult: 'ไม่พบสิ่งของ', notSupportedFileType: 'ไม่รองรับชนิดแฟ้มนี้', emptyFolder: 'โฟลเดอร์นี้ว่างเปล่า', + notConnected: '{{name}} ไม่ได้เชื่อมต่อ', + notConnectedTip: 'เพื่อซิงค์กับ {{name}} ต้องสร้างการเชื่อมต่อกับ {{name}} ก่อน', + }, + credentialSelector: { + name: '{{credentialName}}\'s {{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { title: 'การยืนยัน', @@ -149,6 +160,7 @@ const translation = { editPipelineInfo: 'แก้ไขข้อมูลไปป์ไลน์', pipelineNameAndIcon: 'ชื่อและไอคอนไปป์ไลน์', knowledgeDescriptionPlaceholder: 'อธิบายสิ่งที่อยู่ในฐานความรู้นี้ คําอธิบายโดยละเอียดช่วยให้ AI สามารถเข้าถึงเนื้อหาของชุดข้อมูลได้แม่นยํายิ่งขึ้น หากว่างเปล่า Dify จะใช้กลยุทธ์การโจมตีเริ่มต้น (ไม่บังคับ)', + configurationTip: 'กำหนดค่า {{pluginName}}', } export default translation diff --git a/web/i18n/th-TH/dataset.ts b/web/i18n/th-TH/dataset.ts index c4a399fbdd..8110053050 100644 --- a/web/i18n/th-TH/dataset.ts +++ b/web/i18n/th-TH/dataset.ts @@ -233,6 +233,10 @@ const translation = { disabled: 'ถูกปิดใช้งาน', title: 'บริการ API', }, + docAllEnabled_one: '{{count}} เอกสารถูกเปิดใช้งาน', + docAllEnabled_other: 'เอกสาร {{count}} ทั้งหมดเปิดใช้งานแล้ว', + partialEnabled_one: 'รวม {{count}} เอกสาร, {{num}} ใช้งานได้', + partialEnabled_other: 'รวม {{count}} เอกสาร, {{num}} ใช้งานได้', } export default translation diff --git a/web/i18n/th-TH/education.ts b/web/i18n/th-TH/education.ts index f17aa4593e..bb975f7fa1 100644 --- a/web/i18n/th-TH/education.ts +++ b/web/i18n/th-TH/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: 'ไม่ต้องกังวล — สิ่งนี้จะไม่กระทบต่อการสมัครสมาชิกปัจจุบันของคุณ แต่คุณจะไม่ได้รับส่วนลดการศึกษาขณะต่ออายุเว้นแต่คุณจะยืนยันสถานะของคุณอีกครั้ง.', + title: 'สถานะการศึกษาของคุณจะหมดอายุในวันที่ {{date}}', }, stillInEducation: { title: 'ยังอยู่ในวัยเรียนใช่ไหม?', diff --git a/web/i18n/th-TH/pipeline.ts b/web/i18n/th-TH/pipeline.ts index 6d90b553e3..57174daa64 100644 --- a/web/i18n/th-TH/pipeline.ts +++ b/web/i18n/th-TH/pipeline.ts @@ -28,10 +28,12 @@ const translation = { viewDetails: 'ดูรายละเอียด', error: 'เกิดข้อผิดพลาดระหว่างการดําเนินการ', loading: 'กำลังประมวลผล...กรุณารอ', + footerTip: 'ในโหมดทดสอบ ลองดูตัวอย่างได้สูงสุด {{count}} ชิ้น', }, }, ragToolSuggestions: { title: 'คําแนะนําสําหรับ RAG', + noRecommendationPlugins: 'ไม่มีปลั๊กอินที่แนะนำ ค้นหาเพิ่มเติมได้ใน ตลาด', }, } diff --git a/web/i18n/th-TH/plugin-trigger.ts b/web/i18n/th-TH/plugin-trigger.ts new file mode 100644 index 0000000000..abf352073c --- /dev/null +++ b/web/i18n/th-TH/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'การสมัครสมาชิก', + listNum: 'การสมัครสมาชิก {{num}}', + empty: { + title: 'ไม่มีการสมัครสมาชิก', + button: 'สมัครสมาชิกใหม่', + }, + createButton: { + oauth: 'การสมัครสมาชิกใหม่ด้วย OAuth', + apiKey: 'การสมัครสมาชิกใหม่ด้วยคีย์ API', + manual: 'วาง URL เพื่อสร้างการสมัครสมาชิกใหม่', + }, + createSuccess: 'การสมัครสมาชิกสร้างเรียบร้อยแล้ว', + createFailed: 'ไม่สามารถสร้างการสมัครสมาชิกได้', + maxCount: 'สมาชิกสูงสุด {{num}}', + selectPlaceholder: 'เลือกการสมัครสมาชิก', + noSubscriptionSelected: 'ยังไม่ได้เลือกการสมัครสมาชิก', + subscriptionRemoved: 'ยกเลิกการสมัครแล้ว', + list: { + title: 'การสมัครสมาชิก', + addButton: 'เพิ่ม', + tip: 'รับเหตุการณ์ผ่านการสมัครสมาชิก', + item: { + enabled: 'เปิดใช้งาน', + disabled: 'ปิดการใช้งาน', + credentialType: { + api_key: 'คีย์ API', + oauth2: 'OAuth', + unauthorized: 'คู่มือ', + }, + actions: { + delete: 'ลบ', + deleteConfirm: { + title: 'ลบ {{name}} หรือไม่?', + success: 'การสมัครสมาชิก {{name}} ถูกลบเรียบร้อยแล้ว', + error: 'ลบการสมัครสมาชิก {{name}} ไม่สำเร็จ', + content: 'เมื่อถูกลบแล้ว การสมัครสมาชิกนี้ไม่สามารถกู้คืนได้ กรุณายืนยัน', + contentWithApps: 'การสมัครสมาชิกปัจจุบันถูกอ้างอิงโดยแอปพลิเคชัน {{count}} การลบการสมัครสมาชิกนี้จะทำให้แอปพลิเคชันที่ถูกกำหนดค่าไม่สามารถรับเหตุการณ์การสมัครสมาชิกได้', + confirm: 'ยืนยันการลบ', + cancel: 'ยกเลิก', + confirmInputWarning: 'กรุณาใส่ชื่อที่ถูกต้องเพื่อยืนยัน', + confirmInputPlaceholder: 'ใส่ "{{name}}" เพื่อยืนยัน', + confirmInputTip: 'โปรดใส่ “{{name}}” เพื่อยืนยัน', + }, + }, + status: { + active: 'ใช้งานอยู่', + inactive: 'ไม่ทำงาน', + }, + usedByNum: 'ใช้โดยเวิร์กโฟลว์ {{num}}', + noUsed: 'ไม่ได้ใช้เวิร์กโฟลว์', + }, + }, + addType: { + title: 'เพิ่มการสมัครสมาชิก', + description: 'เลือกวิธีที่คุณต้องการสร้างการสมัครรับข้อมูลทริกเกอร์ของคุณ', + options: { + apikey: { + title: 'สร้างด้วยคีย์ API', + description: 'สร้างการสมัครสมาชิกโดยอัตโนมัติโดยใช้ข้อมูลรับรอง API', + }, + oauth: { + title: 'สร้างด้วย OAuth', + description: 'อนุญาตการใช้งานกับแพลตฟอร์มภายนอกเพื่อสร้างการสมัครสมาชิก', + clientSettings: 'การตั้งค่าไคลเอนต์ OAuth', + clientTitle: 'ไคลเอนต์ OAuth', + default: 'ค่าเริ่มต้น', + custom: 'กำหนดเอง', + }, + manual: { + title: 'การตั้งค่าแบบแมนนวล', + description: 'วาง URL เพื่อสร้างการสมัครสมาชิกใหม่', + tip: 'กำหนดค่า URL บนแพลตฟอร์มของบุคคลที่สามด้วยตนเอง', + }, + }, + }, + }, + modal: { + steps: { + verify: 'ยืนยัน', + configuration: 'การกำหนดค่า', + }, + common: { + cancel: 'ยกเลิก', + back: 'กลับ', + next: 'ถัดไป', + create: 'สร้าง', + verify: 'ยืนยัน', + authorize: 'อนุญาต', + creating: 'กำลังสร้าง...', + verifying: 'กำลังตรวจสอบ...', + authorizing: 'กำลังอนุมัติ...', + }, + oauthRedirectInfo: 'เนื่องจากไม่พบรหัสลับของระบบลูกค้าสำหรับผู้ให้บริการเครื่องมือนี้ จำเป็นต้องตั้งค่าเอง สำหรับ redirect_uri กรุณาใช้', + apiKey: { + title: 'สร้างด้วยคีย์ API', + verify: { + title: 'ตรวจสอบข้อมูลรับรอง', + description: 'กรุณาให้ข้อมูลรับรอง API ของคุณเพื่อยืนยันการเข้าถึง', + error: 'การตรวจสอบข้อมูลรับรองล้มเหลว โปรดตรวจสอบคีย์ API ของคุณ', + success: 'การยืนยันข้อมูลประจำตัวสำเร็จ', + }, + configuration: { + title: 'ตั้งค่าการสมัครสมาชิก', + description: 'ตั้งค่าพารามิเตอร์การสมัครของคุณ', + }, + }, + oauth: { + title: 'สร้างด้วย OAuth', + authorization: { + title: 'การอนุญาต OAuth', + description: 'อนุญาตให้ Dify เข้าถึงบัญชีของคุณ', + redirectUrl: 'เปลี่ยนเส้นทาง URL', + redirectUrlHelp: 'ใช้ URL นี้ในการตั้งค่าแอป OAuth ของคุณ', + authorizeButton: 'อนุญาตด้วย {{provider}}', + waitingAuth: 'กำลังรอการอนุญาต...', + authSuccess: 'การอนุญาตสำเร็จ', + authFailed: 'ไม่สามารถดึงข้อมูลการอนุญาต OAuth ได้', + waitingJump: 'ได้รับอนุญาต กำลังรอการบินขึ้น', + }, + configuration: { + title: 'ตั้งค่าการสมัครสมาชิก', + description: 'ตั้งค่าพารามิเตอร์การสมัครของคุณหลังจากได้รับอนุญาต', + success: 'การตั้งค่า OAuth สำเร็จ', + failed: 'การตั้งค่า OAuth ล้มเหลว', + }, + remove: { + success: 'การลบ OAuth สำเร็จ', + failed: 'การลบ OAuth ล้มเหลว', + }, + save: { + success: 'บันทึกการตั้งค่า OAuth สำเร็จแล้ว', + }, + }, + manual: { + title: 'การตั้งค่าด้วยตนเอง', + description: 'ตั้งค่าการสมัครสมาชิกเว็บฮุคของคุณด้วยตนเอง', + logs: { + title: 'บันทึกคำขอ', + request: 'คำขอ', + loading: 'กำลังรอคำขอจาก {{pluginName}} ...', + }, + }, + form: { + subscriptionName: { + label: 'ชื่อการสมัครสมาชิก', + placeholder: 'ใส่ชื่อการสมัครสมาชิก', + required: 'จำเป็นต้องระบุชื่อการสมัครสมาชิก', + }, + callbackUrl: { + label: 'URL สำหรับเรียกกลับ', + description: 'URL นี้จะได้รับเหตุการณ์เว็บฮุค', + tooltip: 'จัดเตรียมจุดปลายทางที่สามารถเข้าถึงได้สาธารณะเพื่อรับคำขอกลับเรียกจากผู้ให้บริการทริกเกอร์', + placeholder: 'กำลังสร้าง...', + privateAddressWarning: 'URL นี้ดูเหมือนจะเป็นที่อยู่ภายใน ซึ่งอาจทำให้การร้องขอ webhook ล้มเหลว คุณสามารถเปลี่ยน TRIGGER_URL เป็นที่อยู่สาธารณะได้', + }, + }, + errors: { + createFailed: 'ไม่สามารถสร้างการสมัครสมาชิกได้', + verifyFailed: 'ไม่สามารถตรวจสอบข้อมูลประจำตัวได้', + authFailed: 'การอนุญาตล้มเหลว', + networkError: 'เกิดข้อผิดพลาดของเครือข่าย กรุณาลองใหม่', + }, + }, + events: { + title: 'กิจกรรมที่มีอยู่', + description: 'เหตุการณ์ที่ปลั๊กอินทริกเกอร์นี้สามารถสมัครรับได้', + empty: 'ไม่มีเหตุการณ์ใดๆ', + event: 'งานกิจกรรม', + events: 'เหตุการณ์', + actionNum: '{{num}} {{event}} รวมอยู่ด้วย', + item: { + parameters: 'พารามิเตอร์ {{count}}', + noParameters: 'ไม่มีพารามิเตอร์', + }, + output: 'ผลลัพธ์', + }, + node: { + status: { + warning: 'ตัดการเชื่อมต่อ', + }, + }, +} + +export default translation diff --git a/web/i18n/th-TH/plugin.ts b/web/i18n/th-TH/plugin.ts index e8c194ff45..64705b7e04 100644 --- a/web/i18n/th-TH/plugin.ts +++ b/web/i18n/th-TH/plugin.ts @@ -7,6 +7,7 @@ const translation = { all: 'ทั้งหมด', bundles: 'ชุดรวม', datasources: 'แหล่งข้อมูล', + triggers: 'สิ่งกระตุ้น', }, categorySingle: { tool: 'เครื่องมือ', @@ -15,6 +16,7 @@ const translation = { model: 'แบบ', bundle: 'มัด', datasource: 'แหล่งข้อมูล', + trigger: 'ทริกเกอร์', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { viewDetail: 'ดูรายละเอียด', checkUpdate: 'ตรวจสอบการอัปเดต', remove: 'ถอด', + back: 'กลับ', }, toolSelector: { settings: 'การตั้งค่าผู้ใช้', @@ -306,6 +309,12 @@ const translation = { partialUPdate: 'ปลั๊กอิน {{num}} ตัวต่อไปนี้จะอัปเดตให้อัตโนมัติเท่านั้น', changeTimezone: 'ในการเปลี่ยนเขตเวลา ให้ไปที่ การตั้งค่า', }, + readmeInfo: { + title: 'อ่านฉัน', + needHelpCheckReadme: 'ต้องการความช่วยเหลือ? ตรวจสอบไฟล์ README', + noReadmeAvailable: 'ไม่มีไฟล์ README', + failedToFetch: 'ไม่สามารถดึงไฟล์ README ได้', + }, } export default translation diff --git a/web/i18n/th-TH/workflow.ts b/web/i18n/th-TH/workflow.ts index 51e9b4d088..dc14ef27ae 100644 --- a/web/i18n/th-TH/workflow.ts +++ b/web/i18n/th-TH/workflow.ts @@ -113,6 +113,15 @@ const translation = { currentWorkflow: 'เวิร์กโฟลว์ปัจจุบัน', currentView: 'ปัจจุบัน View', moreActions: 'การดําเนินการเพิ่มเติม', + listening: 'การฟัง', + chooseStartNodeToRun: 'เลือกโหนดเริ่มต้นเพื่อรัน', + runAllTriggers: 'เรียกใช้งานตัวทริกเกอร์ทั้งหมด', + features: 'คุณสมบัติ', + featuresDescription: 'ปรับปรุงประสบการณ์ผู้ใช้ของเว็บแอป', + featuresDocLink: 'เรียนรู้เพิ่มเติม', + needAdd: 'ต้องเพิ่มโหนด {{node}}', + needStartNode: 'ต้องเพิ่มโหนดเริ่มต้นอย่างน้อยหนึ่งโหนด', + workflowAsToolDisabledHint: 'เผยแพร่เวิร์กโฟลว์ล่าสุดและตรวจสอบให้แน่ใจว่ามีโหนดป้อนข้อมูลผู้ใช้เชื่อมต่อก่อนที่จะกำหนดค่าเป็นเครื่องมือ', }, env: { envPanelTitle: 'ตัวแปรสภาพแวดล้อม', @@ -219,6 +228,7 @@ const translation = { invalidVariable: 'ตัวแปรไม่ถูกต้อง', noValidTool: '{{field}} ไม่ได้เลือกเครื่องมือที่ถูกต้อง', toolParameterRequired: '{{field}}: พารามิเตอร์ [{{param}}] เป็นสิ่งจําเป็น', + startNodeRequired: 'โปรดเพิ่มโหนดเริ่มต้นก่อน {{operation}}', }, singleRun: { testRun: 'ทดสอบการทํางาน', @@ -250,6 +260,21 @@ const translation = { 'addAll': 'เพิ่มทั้งหมด', 'searchDataSource': 'ค้นหาแหล่งข้อมูล', 'sources': 'แหล่ง', + 'start': 'เริ่ม', + 'searchTrigger': 'ค้นหาทริกเกอร์...', + 'allTriggers': 'ทริกเกอร์ทั้งหมด', + 'noPluginsFound': 'ไม่พบปลั๊กอิน', + 'requestToCommunity': 'คำขอถึงชุมชน', + 'featuredTools': 'เด่น', + 'showMoreFeatured': 'แสดงเพิ่มเติม', + 'showLessFeatured': 'แสดงน้อยลง', + 'installed': 'ติดตั้งแล้ว', + 'pluginByAuthor': 'โดย {{author}}', + 'usePlugin': 'เลือกเครื่องมือ', + 'hideActions': 'ซ่อนเครื่องมือ', + 'noFeaturedPlugins': 'ค้นพบเครื่องมือเพิ่มเติมใน Marketplace', + 'noFeaturedTriggers': 'ค้นพบทริกเกอร์เพิ่มเติมใน Marketplace', + 'startDisabledTip': 'โหนดทริกเกอร์และโหนดป้อนข้อมูลของผู้ใช้ไม่สามารถใช้ร่วมกันได้', }, blocks: { 'start': 'เริ่ม', @@ -276,6 +301,10 @@ const translation = { 'loop-end': 'ออกจากลูป', 'knowledge-index': 'ฐานความรู้', 'datasource': 'แหล่งข้อมูล', + 'originalStartNode': 'โหนดเริ่มต้นเดิม', + 'trigger-schedule': 'ทริกเกอร์ตามตาราง', + 'trigger-webhook': 'ทริกเกอร์เว็บฮุค', + 'trigger-plugin': 'ทริกเกอร์ปลั๊กอิน', }, blocksAbout: { 'start': 'กําหนดพารามิเตอร์เริ่มต้นสําหรับการเปิดใช้เวิร์กโฟลว์', @@ -300,6 +329,9 @@ const translation = { 'loop-end': 'เทียบเท่ากับ "break" โหนดนี้ไม่มีรายการการกำหนดค่า เมื่อร่างกายของลูปถึงโหนดนี้ ลูปจะสิ้นสุดลง.', 'knowledge-index': 'ฐานความรู้เกี่ยวกับ', 'datasource': 'แหล่งข้อมูลเกี่ยวกับ', + 'trigger-schedule': 'ตัวทริกเกอร์เวิร์กโฟลว์ตามเวลา ซึ่งเริ่มเวิร์กโฟลว์ตามกำหนดการ', + 'trigger-webhook': 'Webhook Trigger รับการส่งข้อมูลแบบ HTTP จากระบบของบุคคลที่สามเพื่อเรียกใช้งานเวิร์กโฟลว์โดยอัตโนมัติ', + 'trigger-plugin': 'ทริกเกอร์การรวมจากบุคคลที่สามที่เริ่มการทำงานอัตโนมัติจากเหตุการณ์ของแพลตฟอร์มภายนอก', }, operator: { zoomIn: 'ซูมเข้า', @@ -340,6 +372,8 @@ const translation = { maximize: 'เพิ่มประสิทธิภาพผ้าใบ', scrollToSelectedNode: 'เลื่อนไปยังโหนดที่เลือก', optional_and_hidden: '(ตัวเลือก & ซ่อน)', + goTo: 'ไปที่', + startNode: 'เริ่มต้นโหนด', }, nodes: { common: { @@ -787,6 +821,8 @@ const translation = { removeAbnormalOutput: 'ลบเอาต์พุตที่ผิดปกติ', }, answerNodeWarningDesc: 'คําเตือนโหมดคู่ขนาน: โหนดคําตอบ การกําหนดตัวแปรการสนทนา และการดําเนินการอ่าน/เขียนแบบถาวรภายในการวนซ้ําอาจทําให้เกิดข้อยกเว้น', + flattenOutput: 'แบนผลลัพธ์', + flattenOutputDesc: 'เมื่อเปิดใช้งาน หากผลลัพธ์ของแต่ละรอบเป็นอาร์เรย์ทั้งหมด พวกมันจะถูกรวมเป็นอาร์เรย์เดียว เมื่อปิดใช้งาน ผลลัพธ์จะยังคงมีโครงสร้างอาร์เรย์ซ้อนกันอยู่', }, note: { addNote: 'เพิ่มหมายเหตุ', @@ -963,6 +999,144 @@ const translation = { embeddingModelIsInvalid: 'แบบจำลองการฝังไม่ถูกต้อง', rerankingModelIsInvalid: 'โมเดลการจัดอันดับใหม่ไม่ถูกต้อง', }, + triggerPlugin: { + authorized: 'ได้รับอนุญาต', + notConfigured: 'ยังไม่ได้ตั้งค่า', + notAuthorized: 'ไม่มีสิทธิ์', + selectSubscription: 'เลือกการสมัครสมาชิก', + availableSubscriptions: 'การสมัครสมาชิกที่มีอยู่', + addSubscription: 'เพิ่มการสมัครสมาชิกใหม่', + removeSubscription: 'ยกเลิกการสมัครสมาชิก', + subscriptionRemoved: 'ยกเลิกการสมัครสมาชิกเรียบร้อยแล้ว', + error: 'ข้อผิดพลาด', + configuration: 'การกำหนดค่า', + remove: 'ลบ', + or: 'หรือ', + useOAuth: 'ใช้ OAuth', + useApiKey: 'ใช้คีย์ API', + authenticationFailed: 'การตรวจสอบล้มเหลว', + authenticationSuccess: 'ตรวจสอบสิทธิ์สำเร็จ', + oauthConfigFailed: 'การตั้งค่า OAuth ล้มเหลว', + configureOAuthClient: 'ตั้งค่าไคลเอนต์ OAuth', + oauthClientDescription: 'กำหนดค่า OAuth client credentials เพื่อเปิดใช้งานการตรวจสอบสิทธิ์', + oauthClientSaved: 'การตั้งค่าไคลเอนต์ OAuth บันทึกเรียบร้อยแล้ว', + configureApiKey: 'ตั้งค่า API Key', + apiKeyDescription: 'กำหนดค่า API key สำหรับการตรวจสอบสิทธิ์', + apiKeyConfigured: 'ตั้งค่า API key สำเร็จแล้ว', + configurationFailed: 'การตั้งค่าไม่สำเร็จ', + failedToStart: 'ไม่สามารถเริ่มกระบวนการตรวจสอบสิทธิ์ได้', + credentialsVerified: 'การยืนยันข้อมูลประจำตัวสำเร็จ', + credentialVerificationFailed: 'การตรวจสอบข้อมูลประจำตัวล้มเหลว', + verifyAndContinue: 'ยืนยันและดำเนินการต่อ', + configureParameters: 'กำหนดค่าพารามิเตอร์', + parametersDescription: 'กำหนดค่าพารามิเตอร์และคุณสมบัติของทริกเกอร์', + configurationComplete: 'การตั้งค่าเสร็จสมบูรณ์', + configurationCompleteDescription: 'การตั้งค่าทริกเกอร์ของคุณสำเร็จแล้ว', + configurationCompleteMessage: 'การตั้งค่าตัวกระตุ้นของคุณเสร็จสมบูรณ์และพร้อมใช้งานแล้ว', + parameters: 'พารามิเตอร์', + properties: 'คุณสมบัติ', + propertiesDescription: 'คุณสมบัติการกำหนดค่าที่เพิ่มเติมสำหรับตัวกระตุ้นนี้', + noConfigurationRequired: 'ไม่จำเป็นต้องตั้งค่าเพิ่มเติมสำหรับทริกเกอร์นี้', + subscriptionName: 'ชื่อการสมัครสมาชิก', + subscriptionNameDescription: 'กรอกชื่อที่ไม่ซ้ำสำหรับการสมัครตัวกระตุ้นนี้', + subscriptionNamePlaceholder: 'ใส่ชื่อการสมัครสมาชิก...', + subscriptionNameRequired: 'จำเป็นต้องระบุชื่อการสมัครสมาชิก', + subscriptionRequired: 'ต้องสมัครสมาชิก', + }, + triggerSchedule: { + title: 'ตารางเวลา', + nodeTitle: 'ทริกเกอร์ตามตาราง', + notConfigured: 'ยังไม่ได้ตั้งค่า', + useCronExpression: 'ใช้สำนวน cron', + useVisualPicker: 'ใช้ตัวเลือกแบบภาพ', + frequency: { + label: 'ความถี่', + hourly: 'รายชั่วโมง', + daily: 'ประจำวัน', + weekly: 'รายสัปดาห์', + monthly: 'รายเดือน', + }, + selectFrequency: 'เลือกความถี่', + frequencyLabel: 'ความถี่', + nextExecution: 'การดำเนินการครั้งถัดไป', + weekdays: 'วันในสัปดาห์', + time: 'เวลา', + cronExpression: 'นิพจน์ครอน', + nextExecutionTime: 'เวลาการดำเนินการครั้งถัดไป', + nextExecutionTimes: 'เวลาการประมวลผล 5 ครั้งถัดไป', + startTime: 'เวลาเริ่มต้น', + executeNow: 'ดำเนินการตอนนี้', + selectDateTime: 'เลือกวันที่และเวลา', + hours: 'ชั่วโมง', + minutes: 'นาที', + onMinute: 'ในนาที', + days: 'วัน', + lastDay: 'วันสุดท้าย', + lastDayTooltip: 'ไม่ใช่ทุกเดือนที่จะมี 31 วัน ใช้ตัวเลือก \'วันสุดท้าย\' เพื่อเลือกวันสุดท้ายของแต่ละเดือน', + mode: 'แฟชั่น', + timezone: 'เขตเวลา', + visualConfig: 'การตั้งค่าภาพ', + monthlyDay: 'วันประจำเดือน', + executionTime: 'เวลาการดำเนินการ', + invalidTimezone: 'เขตเวลาที่ไม่ถูกต้อง', + invalidCronExpression: 'นิพจน์ cron ไม่ถูกต้อง', + noValidExecutionTime: 'ไม่สามารถคำนวณเวลาการดำเนินการที่ถูกต้องได้', + executionTimeCalculationError: 'ไม่สามารถคำนวณเวลาการดำเนินการได้', + invalidFrequency: 'ความถี่ไม่ถูกต้อง', + invalidStartTime: 'เวลาเริ่มต้นไม่ถูกต้อง', + startTimeMustBeFuture: 'เวลาที่เริ่มต้นต้องเป็นเวลาที่อยู่ในอนาคต', + invalidTimeFormat: 'รูปแบบเวลาที่ไม่ถูกต้อง (ควรเป็น HH:MM AM/PM)', + invalidWeekday: 'วันในสัปดาห์ไม่ถูกต้อง: {{weekday}}', + invalidMonthlyDay: 'วันของเดือนต้องอยู่ระหว่าง 1-31 หรือ "สุดท้าย"', + invalidOnMinute: 'นาทีต้องอยู่ระหว่าง 0-59', + invalidExecutionTime: 'เวลาการดำเนินการไม่ถูกต้อง', + executionTimeMustBeFuture: 'เวลาการดำเนินการต้องเป็นอนาคต', + }, + triggerWebhook: { + title: 'ทริกเกอร์เว็บฮุค', + nodeTitle: '🔗 ทริกเกอร์เว็บฮุค', + configPlaceholder: 'การกำหนดค่า Webhook trigger จะถูกใช้งานที่นี่', + webhookUrl: 'URL เว็บฮุก', + webhookUrlPlaceholder: 'คลิกสร้างเพื่อสร้าง URL ของเว็บฮุค', + generate: 'สร้าง', + copy: 'คัดลอก', + test: 'ทดสอบ', + urlGenerated: 'สร้าง URL Webhook สำเร็จแล้ว', + urlGenerationFailed: 'ไม่สามารถสร้าง URL ของเว็บฮุคได้', + urlCopied: 'คัดลอก URL ไปยังคลิปบอร์ดแล้ว', + method: 'วิธี', + contentType: 'ประเภทเนื้อหา', + queryParameters: 'พารามิเตอร์คำค้น', + headerParameters: 'พารามิเตอร์หัวเรื่อง', + requestBodyParameters: 'พารามิเตอร์ของเนื้อคำขอ', + parameterName: 'ชื่อของตัวแปร', + varName: 'ชื่อของตัวแปร', + varType: 'พิมพ์', + varNamePlaceholder: 'ใส่ชื่อของตัวแปร...', + required: 'จำเป็น', + addParameter: 'เพิ่ม', + addHeader: 'เพิ่ม', + noParameters: 'ยังไม่ได้ตั้งค่าพารามิเตอร์', + noQueryParameters: 'ไม่มีการตั้งค่าพารามิเตอร์การค้นหา', + noHeaders: 'ยังไม่ได้ตั้งค่าเฮดเดอร์', + noBodyParameters: 'ไม่มีการกำหนดพารามิเตอร์ของร่างกาย', + debugUrlTitle: 'สำหรับการทดสอบ ให้ใช้ URL นี้เสมอ', + debugUrlCopy: 'คลิกเพื่อคัดลอก', + debugUrlCopied: 'คัดลอกแล้ว!', + debugUrlPrivateAddressWarning: 'URL นี้ดูเหมือนจะเป็นที่อยู่ภายใน ซึ่งอาจทำให้คำขอเว็บฮุคล้มเหลวได้ คุณสามารถเปลี่ยน TRIGGER_URL เป็นที่อยู่สาธารณะได้', + errorHandling: 'การจัดการข้อผิดพลาด', + errorStrategy: 'การจัดการข้อผิดพลาด', + responseConfiguration: 'การตอบสนอง', + asyncMode: 'โหมดไม่ประสานเวลา', + statusCode: 'รหัสสถานะ', + responseBody: 'ตัวตอบสนองของเนื้อหา', + responseBodyPlaceholder: 'เขียนเนื้อหาการตอบของคุณที่นี่', + headers: 'หัวข้อ', + validation: { + webhookUrlRequired: 'ต้องระบุ URL ของ Webhook', + invalidParameterType: 'ประเภทพารามิเตอร์ "{{type}}" ไม่ถูกต้องสำหรับพารามิเตอร์ "{{name}}"', + }, + }, }, tracing: { stopBy: 'แวะที่ {{user}}', @@ -1037,6 +1211,18 @@ const translation = { exportToolTip: 'ส่งออกตัวแปรเป็นไฟล์', largeDataNoExport: 'ข้อมูลขนาดใหญ่ - แสดงตัวอย่างบางส่วนเท่านั้น', largeData: 'ข้อมูลขนาดใหญ่ ตัวอย่างแบบอ่านอย่างเดียว ส่งออกเพื่อดูทั้งหมด', + listening: { + title: 'กำลังรอฟังเหตุการณ์จากทริกเกอร์...', + tip: 'คุณสามารถจำลองการทริกเกอร์เหตุการณ์ได้โดยส่งคำขอทดสอบไปยังจุดสิ้นสุด HTTP {{nodeName}} หรือใช้มันเป็น URL สำหรับการดีบักเหตุการณ์แบบสด ผลลัพธ์ทั้งหมดสามารถดูได้โดยตรงในตัวตรวจสอบตัวแปร', + tipPlugin: 'ตอนนี้คุณสามารถสร้างกิจกรรมใน {{- pluginName}} และดึงผลลัพธ์จากกิจกรรมเหล่านี้ในตัวตรวจสอบตัวแปรได้แล้ว', + tipSchedule: 'กำลังรอฟังเหตุการณ์จากตัวเรียกใช้งานตามตาราง การทำงานครั้งถัดไปตามตาราง: {{nextTriggerTime}}', + tipFallback: 'รอเหตุการณ์ทริกเกอร์เข้ามา ผลลัพธ์จะแสดงที่นี่', + defaultNodeName: 'ทริกเกอร์นี้', + defaultPluginName: 'ปลั๊กอินนี้ทำงาน', + defaultScheduleTime: 'ยังไม่ได้ตั้งค่า', + selectedTriggers: 'ทริกเกอร์ที่เลือก', + stopButton: 'หยุด', + }, }, settingsTab: 'การตั้งค่า', lastRunTab: 'รอบสุดท้าย', @@ -1054,11 +1240,52 @@ const translation = { copyLastRunError: 'ไม่สามารถคัดลอกข้อมูลการทำงานครั้งสุดท้ายได้', noMatchingInputsFound: 'ไม่พบข้อมูลที่ตรงกันจากการรันครั้งล่าสุด', lastOutput: 'ผลลัพธ์สุดท้าย', + lastRunInputsCopied: '{{count}} อินพุต ถูกคัดลอกจากการรันครั้งล่าสุด', }, sidebar: { exportWarning: 'ส่งออกเวอร์ชันที่บันทึกปัจจุบัน', exportWarningDesc: 'นี่จะส่งออกเวอร์ชันที่บันทึกไว้ปัจจุบันของเวิร์กโฟลว์ของคุณ หากคุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึกในแก้ไข กรุณาบันทึกมันก่อนโดยใช้ตัวเลือกส่งออกในผืนผ้าใบเวิร์กโฟลว์', }, + publishLimit: { + startNodeTitlePrefix: 'อัปเกรดเป็น', + startNodeTitleSuffix: 'ปลดล็อกทริกเกอร์ไม่จำกัดต่อเวิร์กโฟลว์', + startNodeDesc: 'คุณได้ถึงขีดจำกัดของทริกเกอร์ 2 ครั้งต่อเวิร์กโฟลว์สำหรับแผนนี้แล้ว อัปเกรดเพื่อเผยแพร่เวิร์กโฟลว์นี้', + }, + error: { + startNodeRequired: 'โปรดเพิ่มโหนดเริ่มต้นก่อน {{operation}}', + operations: { + connectingNodes: 'การเชื่อมต่อโหนด', + addingNodes: 'เพิ่มโหนด', + modifyingWorkflow: 'การปรับเปลี่ยนเวิร์กโฟลว์', + updatingWorkflow: 'กำลังปรับปรุงเวิร์กโฟลว์', + }, + }, + customWebhook: 'เว็บฮุกที่กำหนดเอง', + difyTeam: 'ทีม Dify', + triggerStatus: { + enabled: 'ทริกเกอร์', + disabled: 'ทริกเกอร์ • ปิดการใช้งาน', + }, + entryNodeStatus: { + enabled: 'เริ่ม', + disabled: 'เริ่ม • ปิดใช้งาน', + }, + onboarding: { + title: 'เลือกโหนดเริ่มต้นเพื่อเริ่ม', + description: 'โหนดเริ่มต้นที่แตกต่างกันมีความสามารถที่แตกต่างกัน ไม่ต้องกังวล คุณสามารถเปลี่ยนมันได้เสมอในภายหลัง', + userInputFull: 'ข้อมูลผู้ใช้ (โหนดเริ่มต้นต้นฉบับ)', + userInputDescription: 'โหนดเริ่มต้นที่อนุญาตให้ตั้งค่าตัวแปรการป้อนข้อมูลของผู้ใช้ พร้อมความสามารถในการใช้เครื่องมือต่าง ๆ เช่น เว็บแอป, API บริการ, เซิร์ฟเวอร์ MCP และเวิร์กโฟลว์', + trigger: 'ทริกเกอร์', + triggerDescription: 'ทริกเกอร์สามารถทำหน้าที่เป็นโหนดเริ่มต้นของเวิร์กโฟลว์ได้ เช่น งานที่ตั้งเวลาไว้ เว็บฮุกแบบกำหนดเอง หรือการรวมเข้ากับแอปอื่น ๆ', + back: 'กลับ', + learnMore: 'เรียนรู้เพิ่มเติม', + aboutStartNode: 'เกี่ยวกับโหนดเริ่มต้น', + escTip: { + press: 'กด', + key: 'esc', + toDismiss: 'ปฏิเสธ', + }, + }, } export default translation diff --git a/web/i18n/tr-TR/app-debug.ts b/web/i18n/tr-TR/app-debug.ts index 6ae6ef4d98..21e25a5051 100644 --- a/web/i18n/tr-TR/app-debug.ts +++ b/web/i18n/tr-TR/app-debug.ts @@ -418,6 +418,7 @@ const translation = { 'placeholder': 'Yer tutucu', 'placeholderPlaceholder': 'Alan boş olduğunda görüntülenecek metni girin', 'defaultValuePlaceholder': 'Alanı önceden doldurmak için varsayılan değeri girin', + 'maxNumberTip': 'Belge < {{docLimit}}, resim < {{imgLimit}}, ses < {{audioLimit}}, video < {{videoLimit}}', }, vision: { name: 'Görüş', diff --git a/web/i18n/tr-TR/app-log.ts b/web/i18n/tr-TR/app-log.ts index 7b78fb452d..afaec2186b 100644 --- a/web/i18n/tr-TR/app-log.ts +++ b/web/i18n/tr-TR/app-log.ts @@ -19,6 +19,7 @@ const translation = { tokens: 'TOKENLAR', user: 'SON KULLANICI VEYA HESAP', version: 'VERSİYON', + triggered_from: 'TETİKLEYEN TARAF', }, pagination: { previous: 'Önceki', @@ -97,6 +98,15 @@ const translation = { finalProcessing: 'Son İşleme', }, dateFormat: 'GG/AA/YYYY', + triggerBy: { + debugging: 'Hata ayıklama', + appRun: 'WebUygulama', + webhook: 'Webhook', + schedule: 'Program', + plugin: 'Eklenti', + ragPipelineRun: 'RAG Boru Hattı', + ragPipelineDebugging: 'RAG Hata Ayıklama', + }, } export default translation diff --git a/web/i18n/tr-TR/app-overview.ts b/web/i18n/tr-TR/app-overview.ts index a0e79f2354..8275b02851 100644 --- a/web/i18n/tr-TR/app-overview.ts +++ b/web/i18n/tr-TR/app-overview.ts @@ -114,7 +114,11 @@ const translation = { }, }, launch: 'Başlat', - enableTooltip: {}, + enableTooltip: { + description: 'Bu özelliği etkinleştirmek için lütfen tuvale bir Kullanıcı Girişi düğümü ekleyin. (Taslakta zaten mevcut olabilir, yayınlandıktan sonra geçerli olur)', + learnMore: 'Daha fazla bilgi edin', + }, + title: 'Web Uygulaması', }, apiInfo: { title: 'Arka Uç Servis API\'si', @@ -126,7 +130,14 @@ const translation = { running: 'Hizmette', disable: 'Devre Dışı', }, - triggerInfo: {}, + triggerInfo: { + title: 'Tetikleyiciler', + explanation: 'İş akışı tetikleyici yönetimi', + triggersAdded: '{{count}} Tetikleyiciler eklendi', + noTriggerAdded: 'Hiç tetikleyici eklenmedi', + triggerStatusDescription: 'Tetikleyici düğüm durumu burada görünür. (Zaten taslakta mevcut olabilir, yayımlandıktan sonra geçerli olur)', + learnAboutTriggers: 'Tetikleyiciler hakkında bilgi edinin', + }, disableTooltip: { triggerMode: 'Trigger Düğümü modunda {{feature}} özelliği desteklenmiyor.', }, diff --git a/web/i18n/tr-TR/billing.ts b/web/i18n/tr-TR/billing.ts index 87a917dca4..91a91607d9 100644 --- a/web/i18n/tr-TR/billing.ts +++ b/web/i18n/tr-TR/billing.ts @@ -98,6 +98,8 @@ const translation = { triggerEvents: { unlimited: 'Sınırsız Tetikleme Olayları', tooltip: 'Eklenti, Zamanlama veya Webhook tetikleyicileri aracılığıyla iş akışlarını otomatik olarak başlatan etkinliklerin sayısı.', + sandbox: '{{count,number}} Tetikleyici Olaylar', + professional: '{{count,number}} Tetikleme Etkinlikleri/ay', }, workflowExecution: { faster: 'Daha Hızlı İş Akışı Yürütme', @@ -107,6 +109,11 @@ const translation = { }, startNodes: { unlimited: 'Sınırsız Tetikleyiciler/iş akışı', + limited: 'Maksimum {{count}} Tetikleyici/iş akışı', + }, + title: { + plans: 'planlar', + description: 'Ekibinizin ihtiyaçlarına en uygun planı seçin.', }, }, plans: { @@ -129,16 +136,14 @@ const translation = { name: 'Kurumsal', description: 'Büyük ölçekli kritik sistemler için tam yetenekler ve destek.', includesTitle: 'Takım plandaki her şey, artı:', - features: { - }, + features: ['Kurumsal Düzeyde Ölçeklenebilir Dağıtım Çözümleri', 'Ticari Lisans Yetkilendirmesi', 'Özel Kurumsal Özellikler', 'Birden Fazla Çalışma Alanı ve Kurumsal Yönetim', 'SSO', 'Dify Ortakları tarafından Müzakere Edilen SLA\'lar', 'Gelişmiş Güvenlik ve Kontroller', 'Dify Resmi Tarafından Güncellemeler ve Bakım', 'Profesyonel Teknik Destek'], priceTip: 'Yıllık Faturalama Sadece', for: 'Büyük boyutlu Takımlar için', btnText: 'Satış ile İletişime Geç', price: 'Özel', }, community: { - features: { - }, + features: ['Tüm Temel Özellikler Açık Depoda Yayınlandı', 'Tek Çalışma Alanı', 'Dify Açık Kaynak Lisansına uygundur'], price: 'Ücretsiz', includesTitle: 'Ücretsiz Özellikler:', name: 'Topluluk', @@ -147,8 +152,7 @@ const translation = { description: 'Bireysel Kullanıcılar, Küçük Ekipler veya Ticari Olmayan Projeler İçin', }, premium: { - features: { - }, + features: ['Çeşitli Bulut Sağlayıcıları Tarafından Kendi Kendine Yönetilen Güvenilirlik', 'Tek Çalışma Alanı', 'Web Uygulama Logo ve Marka Özelleştirmesi', 'Öncelikli E-posta ve Sohbet Desteği'], name: 'Premium', includesTitle: 'Topluluktan her şey, artı:', for: 'Orta Büyüklükteki Organizasyonlar ve Ekipler için', @@ -184,6 +188,7 @@ const translation = { documentsUploadQuota: 'Belgeler Yükleme Kotası', triggerEvents: 'Tetikleyici Olaylar', perMonth: 'ayda', + resetsIn: '{{count,number}} gün içinde sıfırlanır', }, teamMembers: 'Ekip Üyeleri', triggerLimitModal: { diff --git a/web/i18n/tr-TR/common.ts b/web/i18n/tr-TR/common.ts index 3dc63a9ff8..a9b056893c 100644 --- a/web/i18n/tr-TR/common.ts +++ b/web/i18n/tr-TR/common.ts @@ -65,6 +65,12 @@ const translation = { yes: 'Evet', deleteConfirmTitle: 'Silinsin mi?', confirmAction: 'Lütfen işleminizi onaylayın.', + noSearchResults: 'Hiç {{content}} bulunamadı', + resetKeywords: 'Anahtar kelimeleri sıfırla', + selectCount: '{{count}} Seçildi', + searchCount: '{{count}} {{content}} bul', + noSearchCount: '0 {{content}}', + now: 'Şimdi', }, errorMsg: { fieldRequired: '{{field}} gereklidir', @@ -73,6 +79,7 @@ const translation = { placeholder: { input: 'Lütfen girin', select: 'Lütfen seçin', + search: 'Ara...', }, voice: { language: { @@ -769,6 +776,13 @@ const translation = { label: { optional: '(isteğe bağlı)', }, + noData: 'Veri yok', + dynamicSelect: { + error: 'Seçenekler yüklenemedi', + noData: 'Seçenek yok', + loading: 'Seçenekler yükleniyor...', + selected: '{{count}} seçildi', + }, } export default translation diff --git a/web/i18n/tr-TR/dataset-documents.ts b/web/i18n/tr-TR/dataset-documents.ts index 0c662106c6..5608e703ba 100644 --- a/web/i18n/tr-TR/dataset-documents.ts +++ b/web/i18n/tr-TR/dataset-documents.ts @@ -81,7 +81,10 @@ const translation = { ok: 'Tamam', }, learnMore: 'Daha fazla bilgi edinin', - sort: {}, + sort: { + uploadTime: 'Yükleme Zamanı', + hitCount: 'Alım Sayısı', + }, }, metadata: { title: 'Meta Veri', diff --git a/web/i18n/tr-TR/dataset-pipeline.ts b/web/i18n/tr-TR/dataset-pipeline.ts index aee0f72c79..030be7bec8 100644 --- a/web/i18n/tr-TR/dataset-pipeline.ts +++ b/web/i18n/tr-TR/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'Bilgi İşlem Hattı Yayımlandı', + tip: 'Belgeler bölümüne giderek belgeleri ekleyebilir veya yönetebilirsiniz.', }, error: { message: 'Bilgi İşlem Hattı yayımlanamadı', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'Yapı', structureTooltip: 'Yığın Yapısı, belgelerin nasıl bölündüğünü ve dizine eklendiğini belirler (Genel, Üst-Alt ve Soru-Cevap modları sunar) ve her bilgi bankası için benzersizdir.', + createdBy: '{{author}} tarafından', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { characters: 'Karakter', backToDataSource: 'Veri Kaynağı', title: 'Belge Ekle', + selectOnlineDocumentTip: 'En fazla {{count}} sayfa işleyin', + selectOnlineDriveTip: 'Her biri en fazla {{fileSize}} MB olan {{count}} dosyaya kadar işlem yap', }, documentSettings: { title: 'Belge Ayarları', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} sayfa', + }, onlineDrive: { breadcrumbs: { allFiles: 'Tüm Dosyalar', searchPlaceholder: 'Dosyaları ara...', allBuckets: 'Tüm Bulut Depolama Paketleri', + searchResult: '{{folderName}} klasöründe {{searchResultsLength}} öğe bulun', }, emptySearchResult: 'Hiçbir öğe bulunamadı', resetKeywords: 'Anahtar kelimeleri sıfırlama', notSupportedFileType: 'Bu dosya türü desteklenmiyor', emptyFolder: 'Bu klasör boş', + notConnected: '{{name}} bağlı değil', + notConnectedTip: '{{name}} ile senkronize olmak için önce {{name}} bağlantısının kurulması gerekir.', + }, + credentialSelector: { + name: '{{credentialName}}\'un {{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { title: 'Onay', @@ -149,6 +160,7 @@ const translation = { pipelineNameAndIcon: 'İşlem hattı adı & simgesi', editPipelineInfo: 'İşlem hattı bilgilerini düzenleme', knowledgeDescriptionPlaceholder: 'Bu Bilgi Bankasında neler olduğunu açıklayın. Ayrıntılı bir açıklama, yapay zekanın veri kümesinin içeriğine daha doğru bir şekilde erişmesini sağlar. Boşsa, Dify varsayılan isabet stratejisini kullanacaktır. (İsteğe bağlı)', + configurationTip: '{{pluginName}}\'yi yapılandır', } export default translation diff --git a/web/i18n/tr-TR/dataset.ts b/web/i18n/tr-TR/dataset.ts index 7dcbc6a1d4..f7d8570a19 100644 --- a/web/i18n/tr-TR/dataset.ts +++ b/web/i18n/tr-TR/dataset.ts @@ -234,6 +234,10 @@ const translation = { enabled: 'Hizmette', title: 'Servis API\'si', }, + docAllEnabled_one: '{{count}} belgesi etkinleştirildi', + docAllEnabled_other: 'Tüm {{count}} belgeleri etkinleştirildi', + partialEnabled_one: 'Toplam {{count}} belge, {{num}} mevcut', + partialEnabled_other: 'Toplam {{count}} belge, {{num}} mevcut', } export default translation diff --git a/web/i18n/tr-TR/education.ts b/web/i18n/tr-TR/education.ts index c1677f7946..3c6204581f 100644 --- a/web/i18n/tr-TR/education.ts +++ b/web/i18n/tr-TR/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: 'Endişelenmeyin — bu mevcut aboneliğinizi etkilemeyecek, ancak durumunuzu tekrar doğrulamazsanız yenilendiğinde eğitim indirimi almayacaksınız.', + title: 'Eğitim durumunuz {{date}} tarihinde sona erecektir', }, stillInEducation: { title: 'Hala eğitimde misin?', diff --git a/web/i18n/tr-TR/pipeline.ts b/web/i18n/tr-TR/pipeline.ts index 7c50cadb90..1b0c5e5238 100644 --- a/web/i18n/tr-TR/pipeline.ts +++ b/web/i18n/tr-TR/pipeline.ts @@ -28,10 +28,12 @@ const translation = { loading: 'Işleme... Lütfen bekleyin', viewDetails: 'Ayrıntıları görüntüleme', error: 'Yürütme sırasında hata oluştu', + footerTip: 'Test çalıştırma modunda, {{count}} parçaya kadar önizleme yapabilirsiniz', }, }, ragToolSuggestions: { title: 'RAG için Öneriler', + noRecommendationPlugins: 'Önerilen eklenti yok, daha fazlasını Marketplace içinde bulabilirsiniz', }, } diff --git a/web/i18n/tr-TR/plugin-trigger.ts b/web/i18n/tr-TR/plugin-trigger.ts new file mode 100644 index 0000000000..46995edd7f --- /dev/null +++ b/web/i18n/tr-TR/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'Abonelikler', + listNum: '{{num}} abonelikler', + empty: { + title: 'Abonelik yok', + button: 'Yeni abonelik', + }, + createButton: { + oauth: 'OAuth ile yeni abonelik', + apiKey: 'API Anahtarı ile yeni abonelik', + manual: 'Yeni bir abonelik oluşturmak için URL\'yi yapıştırın', + }, + createSuccess: 'Abonelik başarıyla oluşturuldu', + createFailed: 'Abonelik oluşturulamadı', + maxCount: 'Maksimum {{num}} abonelik', + selectPlaceholder: 'Abonelik seç', + noSubscriptionSelected: 'Hiçbir abonelik seçilmedi', + subscriptionRemoved: 'Abonelik kaldırıldı', + list: { + title: 'Abonelikler', + addButton: 'Ekle', + tip: 'Abonelik aracılığıyla etkinlikleri alın', + item: { + enabled: 'Etkin', + disabled: 'Devre Dışı', + credentialType: { + api_key: 'API Anahtarı', + oauth2: 'OAuth', + unauthorized: 'Kılavuz', + }, + actions: { + delete: 'Sil', + deleteConfirm: { + title: '{{name}} silinsin mi?', + success: 'Abonelik {{name}} başarıyla silindi', + error: 'Abonelik {{name}} silinemedi', + content: 'Bir kez silindiğinde, bu abonelik kurtarılamaz. Lütfen onaylayın.', + contentWithApps: 'Mevcut abonelik {{count}} uygulama tarafından referans gösterilmektedir. Bunu silmek, yapılandırılmış uygulamaların abonelik olaylarını almamasına neden olacaktır.', + confirm: 'Silmeyi Onayla', + cancel: 'İptal', + confirmInputWarning: 'Onaylamak için lütfen doğru adı girin.', + confirmInputPlaceholder: '"{{name}}" yazın ve onaylayın.', + confirmInputTip: 'Lütfen onaylamak için “{{name}}” girin.', + }, + }, + status: { + active: 'Aktif', + inactive: 'Etkin değil', + }, + usedByNum: '{{num}} iş akışı tarafından kullanılıyor', + noUsed: 'Hiç işlem akışı kullanılmadı', + }, + }, + addType: { + title: 'Abonelik ekle', + description: 'Tetikleyici aboneliğinizi nasıl oluşturmak istediğinizi seçin', + options: { + apikey: { + title: 'API Anahtarı ile Oluştur', + description: 'API kimlik bilgilerini kullanarak otomatik olarak abonelik oluştur', + }, + oauth: { + title: 'OAuth ile oluştur', + description: 'Abonelik oluşturmak için üçüncü taraf platformla yetkilendirme yap', + clientSettings: 'OAuth İstemci Ayarları', + clientTitle: 'OAuth İstemcisi', + default: 'Varsayılan', + custom: 'Özel', + }, + manual: { + title: 'Manuel Kurulum', + description: 'Yeni bir abonelik oluşturmak için URL\'yi yapıştırın', + tip: 'URL\'yi üçüncü taraf platformda manuel olarak yapılandır', + }, + }, + }, + }, + modal: { + steps: { + verify: 'Doğrula', + configuration: 'Yapılandırma', + }, + common: { + cancel: 'İptal', + back: 'Geri', + next: 'Sonraki', + create: 'Oluştur', + verify: 'Doğrula', + authorize: 'Yetkilendir', + creating: 'Oluşturuluyor...', + verifying: 'Doğrulanıyor...', + authorizing: 'Yetkilendiriliyor...', + }, + oauthRedirectInfo: 'Bu araç sağlayıcı için sistem istemci gizli anahtarları bulunamadığından, yönlendirme_uri için manuel olarak ayarlamanız gerekmektedir, lütfen kullanın', + apiKey: { + title: 'API Anahtarı ile Oluştur', + verify: { + title: 'Kimlik Bilgilerini Doğrula', + description: 'Erişimi doğrulamak için lütfen API kimlik bilgilerinizi sağlayın', + error: 'Kimlik doğrulama başarısız oldu. Lütfen API anahtarınızı kontrol edin.', + success: 'Kimlik bilgileri başarıyla doğrulandı', + }, + configuration: { + title: 'Aboneliği Yapılandır', + description: 'Abonelik parametrelerinizi ayarlayın', + }, + }, + oauth: { + title: 'OAuth ile oluştur', + authorization: { + title: 'OAuth Yetkilendirmesi', + description: 'Dify\'nin hesabınıza erişmesine izin verin', + redirectUrl: 'Yönlendirme URL\'si', + redirectUrlHelp: 'Bu URL\'yi OAuth uygulama yapılandırmanızda kullanın', + authorizeButton: '{{provider}} ile yetkilendir', + waitingAuth: 'Yetkilendirme bekleniyor...', + authSuccess: 'Yetkilendirme başarılı', + authFailed: 'OAuth yetkilendirme bilgileri alınamadı', + waitingJump: 'Yetkili, atlama için bekliyor', + }, + configuration: { + title: 'Aboneliği Yapılandır', + description: 'Yetkilendirmeden sonra abonelik parametrelerinizi ayarlayın', + success: 'OAuth yapılandırması başarılı', + failed: 'OAuth yapılandırması başarısız oldu', + }, + remove: { + success: 'OAuth kaldırma başarılı', + failed: 'OAuth kaldırma başarısız oldu', + }, + save: { + success: 'OAuth yapılandırması başarıyla kaydedildi', + }, + }, + manual: { + title: 'Manuel Kurulum', + description: 'Webhook aboneliğinizi manuel olarak yapılandırın', + logs: { + title: 'İstek Kayıtları', + request: 'Talep', + loading: '{{pluginName}}\'dan istek bekleniyor...', + }, + }, + form: { + subscriptionName: { + label: 'Abonelik Adı', + placeholder: 'Abonelik adını girin', + required: 'Abonelik adı gereklidir', + }, + callbackUrl: { + label: 'Geri Arama URL\'si', + description: 'Bu URL webhook olaylarını alacaktır', + tooltip: 'Tetikleyici sağlayıcısından geri arama istekleri alabilecek genel erişime açık bir uç nokta sağlayın.', + placeholder: 'Oluşturuluyor...', + privateAddressWarning: 'Bu URL dahili bir adres gibi görünüyor ve bu, webhook isteklerinin başarısız olmasına neden olabilir. TRIGGER_URL\'i halka açık bir adresle değiştirebilirsiniz.', + }, + }, + errors: { + createFailed: 'Abonelik oluşturulamadı', + verifyFailed: 'Kimlik bilgileri doğrulanamadı', + authFailed: 'Yetkilendirme başarısız', + networkError: 'Ağ hatası, lütfen tekrar deneyin', + }, + }, + events: { + title: 'Mevcut Etkinlikler', + description: 'Bu tetikleyici eklentisinin abone olabileceği etkinlikler', + empty: 'Hiç etkinlik yok', + event: 'Etkinlik', + events: 'Etkinlikler', + actionNum: '{{num}} {{event}} DAHİL', + item: { + parameters: '{{count}} parametreleri', + noParameters: 'Parametre yok', + }, + output: 'Çıktı', + }, + node: { + status: { + warning: 'Bağlantıyı kes', + }, + }, +} + +export default translation diff --git a/web/i18n/tr-TR/plugin.ts b/web/i18n/tr-TR/plugin.ts index 0b2fa684b3..8aa60e0e7b 100644 --- a/web/i18n/tr-TR/plugin.ts +++ b/web/i18n/tr-TR/plugin.ts @@ -7,6 +7,7 @@ const translation = { tools: 'Araçları', extensions: 'Uzantı -ları', datasources: 'Veri Kaynakları', + triggers: 'Tetikleyiciler', }, categorySingle: { tool: 'Alet', @@ -15,6 +16,7 @@ const translation = { agent: 'Temsilci Stratejisi', model: 'Model', datasource: 'Veri Kaynağı', + trigger: 'Tetik', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { info: 'Eklenti Bilgileri', viewDetail: 'ayrıntılara bakın', update: 'Güncelleştirmek', + back: 'Geri', }, toolSelector: { uninstalledContent: 'Bu eklenti yerel/GitHub deposundan yüklenir. Lütfen kurulumdan sonra kullanın.', @@ -306,6 +309,12 @@ const translation = { changeTimezone: 'Zaman dilimini değiştirmek için Ayarlar sekmesine gidin', partialUPdate: 'Sadece aşağıdaki {{num}} eklenti otomatik olarak güncellenecek', }, + readmeInfo: { + title: 'OKUMA MESELESİ', + needHelpCheckReadme: 'Yardıma mı ihtiyacınız var? README dosyasına bakın.', + noReadmeAvailable: 'README mevcut değil', + failedToFetch: 'README alınamadı', + }, } export default translation diff --git a/web/i18n/tr-TR/workflow.ts b/web/i18n/tr-TR/workflow.ts index df4f9c8093..2d0bae73de 100644 --- a/web/i18n/tr-TR/workflow.ts +++ b/web/i18n/tr-TR/workflow.ts @@ -113,6 +113,15 @@ const translation = { currentView: 'Geçerli Görünüm', currentWorkflow: 'Mevcut İş Akışı', moreActions: 'Daha Fazla Eylem', + listening: 'Dinleme', + chooseStartNodeToRun: 'Çalıştırmak için başlangıç düğümünü seçin', + runAllTriggers: 'Tüm tetikleyicileri çalıştır', + features: 'Özellikler', + featuresDescription: 'Web uygulaması kullanıcı deneyimini geliştirin', + featuresDocLink: 'Daha fazla bilgi edin', + needAdd: '{{node}} düğümü eklenmelidir', + needStartNode: 'En az bir başlangıç düğümü eklenmelidir', + workflowAsToolDisabledHint: 'En son iş akışını yayınlayın ve bunu bir araç olarak yapılandırmadan önce bağlı bir Kullanıcı Girdisi düğümünün olduğundan emin olun.', }, env: { envPanelTitle: 'Çevre Değişkenleri', @@ -219,6 +228,7 @@ const translation = { rerankModelRequired: 'Yeniden Sıralama Modelini açmadan önce, lütfen ayarlarda modelin başarıyla yapılandırıldığını onaylayın.', toolParameterRequired: '{{field}}: [{{param}}] parametresi gereklidir', noValidTool: '{{field}} geçerli bir araç seçilmedi', + startNodeRequired: 'Lütfen {{operation}} işleminden önce önce bir başlangıç düğümü ekleyin', }, singleRun: { testRun: 'Test Çalıştırma', @@ -250,6 +260,21 @@ const translation = { 'addAll': 'Hepsini ekle', 'sources': 'Kaynak', 'searchDataSource': 'Veri Kaynağında Arama Yapın', + 'start': 'Başlat', + 'searchTrigger': 'Arama tetikleyicileri...', + 'allTriggers': 'Tüm tetikleyiciler', + 'noPluginsFound': 'Hiç eklenti bulunamadı', + 'requestToCommunity': 'Topluluğa yapılan talepler', + 'featuredTools': 'Öne Çıkan', + 'showMoreFeatured': 'Daha fazla göster', + 'showLessFeatured': 'Daha az göster', + 'installed': 'Yüklendi', + 'pluginByAuthor': '{{author}} tarafından', + 'usePlugin': 'Araç seç', + 'hideActions': 'Araçları gizle', + 'noFeaturedPlugins': 'Marketplace\'te daha fazla araç keşfedin', + 'noFeaturedTriggers': 'Marketplace\'te daha fazla tetikleyici keşfedin', + 'startDisabledTip': 'Tetikleyici düğümü ve kullanıcı girişi düğümü birbirini dışlar.', }, blocks: { 'start': 'Başlat', @@ -276,6 +301,10 @@ const translation = { 'loop': 'Döngü', 'knowledge-index': 'Bilgi bankası', 'datasource': 'Veri Kaynağı', + 'originalStartNode': 'orijinal başlangıç düğümü', + 'trigger-schedule': 'Zamanlayıcı Tetikleyici', + 'trigger-webhook': 'Webhook Tetikleyici', + 'trigger-plugin': 'Eklenti Tetikleyicisi', }, blocksAbout: { 'start': 'Bir iş akışını başlatmak için başlangıç parametrelerini tanımlayın', @@ -300,6 +329,9 @@ const translation = { 'loop-end': '"break" ile eşdeğerdir. Bu düğümün yapılandırma öğesi yoktur. Döngü gövdesi bu düğüme ulaştığında, döngü sona erer.', 'datasource': 'Veri Kaynağı Hakkında', 'knowledge-index': 'Bilgi tabanı hakkında', + 'trigger-schedule': 'Zaman tabanlı iş akışı tetikleyicisi, iş akışlarını bir takvime göre başlatır', + 'trigger-webhook': 'Webhook Tetikleyicisi, üçüncü taraf sistemlerden gelen HTTP iletilerini alarak iş akışlarını otomatik olarak başlatır.', + 'trigger-plugin': 'Üçüncü taraf entegrasyon tetikleyicisi, dış platform olaylarından iş akışlarını başlatır', }, operator: { zoomIn: 'Yakınlaştır', @@ -340,6 +372,8 @@ const translation = { maximize: 'Kanvası Maksimize Et', scrollToSelectedNode: 'Seçili düğüme kaydırma', optional_and_hidden: '(isteğe bağlı ve gizli)', + goTo: 'Git', + startNode: 'Başlangıç Düğümü', }, nodes: { common: { @@ -788,6 +822,8 @@ const translation = { answerNodeWarningDesc: 'Paralel mod uyarısı: Yinelemeler içindeki yanıt düğümleri, konuşma değişkeni atamaları ve kalıcı okuma/yazma işlemleri özel durumlara neden olabilir.', parallelModeEnableDesc: 'Paralel modda, yinelemeler içindeki görevler paralel yürütmeyi destekler. Bunu sağdaki özellikler panelinde yapılandırabilirsiniz.', MaxParallelismDesc: 'Maksimum paralellik, tek bir yinelemede aynı anda yürütülen görevlerin sayısını kontrol etmek için kullanılır.', + flattenOutput: 'Çıktıyı Düzleştir', + flattenOutputDesc: 'Etkinleştirildiğinde, eğer tüm yineleme çıktıları dizilerse, bunlar tek bir dizi halinde düzleştirilecektir. Devre dışı bırakıldığında ise çıktılar iç içe diziler şeklini koruyacaktır.', }, note: { addNote: 'Not Ekle', @@ -964,6 +1000,144 @@ const translation = { rerankingModelIsInvalid: 'Yeniden sıralama modeli geçersiz', embeddingModelIsInvalid: 'Gömme modeli geçersiz', }, + triggerPlugin: { + authorized: 'Yetkili', + notConfigured: 'Yapılandırılmadı', + notAuthorized: 'Yetkisiz', + selectSubscription: 'Abonelik Seç', + availableSubscriptions: 'Mevcut Abonelikler', + addSubscription: 'Yeni Abonelik Ekle', + removeSubscription: 'Aboneliği Kaldır', + subscriptionRemoved: 'Abonelik başarıyla kaldırıldı', + error: 'Hata', + configuration: 'Yapılandırma', + remove: 'Kaldır', + or: 'VEYA', + useOAuth: 'OAuth Kullan', + useApiKey: 'API Anahtarını Kullan', + authenticationFailed: 'Kimlik doğrulama başarısız', + authenticationSuccess: 'Kimlik doğrulama başarılı', + oauthConfigFailed: 'OAuth yapılandırması başarısız oldu', + configureOAuthClient: 'OAuth İstemcisini Yapılandır', + oauthClientDescription: 'Kimlik doğrulamayı etkinleştirmek için OAuth istemci kimlik bilgilerini yapılandırın', + oauthClientSaved: 'OAuth istemci yapılandırması başarıyla kaydedildi', + configureApiKey: 'API Anahtarını Yapılandır', + apiKeyDescription: 'Kimlik doğrulama için API anahtarı kimlik bilgilerini yapılandırın', + apiKeyConfigured: 'API anahtarı başarıyla yapılandırıldı', + configurationFailed: 'Yapılandırma başarısız', + failedToStart: 'Kimlik doğrulama akışı başlatılamadı', + credentialsVerified: 'Kimlik bilgileri başarıyla doğrulandı', + credentialVerificationFailed: 'Kimlik bilgileri doğrulaması başarısız oldu', + verifyAndContinue: 'Doğrula ve Devam Et', + configureParameters: 'Parametreleri Yapılandır', + parametersDescription: 'Tetikleyici parametrelerini ve özelliklerini yapılandır', + configurationComplete: 'Yapılandırma Tamamlandı', + configurationCompleteDescription: 'Tetikleyiciniz başarıyla yapılandırıldı', + configurationCompleteMessage: 'Tetikleyici yapılandırmanız artık tamamlandı ve kullanıma hazır.', + parameters: 'Parametreler', + properties: 'Özellikler', + propertiesDescription: 'Bu tetikleyici için ek yapılandırma özellikleri', + noConfigurationRequired: 'Bu tetikleyici için ek yapılandırma gerekmez.', + subscriptionName: 'Abonelik Adı', + subscriptionNameDescription: 'Bu tetikleyici aboneliği için benzersiz bir ad girin', + subscriptionNamePlaceholder: 'Abonelik adını girin...', + subscriptionNameRequired: 'Abonelik adı gereklidir', + subscriptionRequired: 'Abonelik gereklidir', + }, + triggerSchedule: { + title: 'Program', + nodeTitle: 'Zamanlayıcı Tetikleyici', + notConfigured: 'Yapılandırılmadı', + useCronExpression: 'Cron ifadesi kullan', + useVisualPicker: 'Görsel seçici kullan', + frequency: { + label: 'FREKANSLIK', + hourly: 'Saatlik', + daily: 'Günlük', + weekly: 'Haftalık', + monthly: 'Aylık', + }, + selectFrequency: 'Frekansı seç', + frequencyLabel: 'Frekans', + nextExecution: 'Bir sonraki idam', + weekdays: 'Hafta günleri', + time: 'Zaman', + cronExpression: 'Cron ifadesi', + nextExecutionTime: 'SONRAKİ YÜRÜTME ZAMANI', + nextExecutionTimes: 'Sonraki 5 yürütme zamanı', + startTime: 'Başlangıç Saati', + executeNow: 'Şimdi yürüt', + selectDateTime: 'Tarih ve Saat Seç', + hours: 'Saatler', + minutes: 'Dakikalar', + onMinute: 'On Dakika', + days: 'Günler', + lastDay: 'Son gün', + lastDayTooltip: 'Tüm ayların 31 günü yoktur. Her ayın son gününü seçmek için \'son gün\' seçeneğini kullanın.', + mode: 'Moda', + timezone: 'Saat dilimi', + visualConfig: 'Görsel Konfigürasyon', + monthlyDay: 'Aylık Gün', + executionTime: 'Çalıştırma Süresi', + invalidTimezone: 'Geçersiz saat dilimi', + invalidCronExpression: 'Geçersiz cron ifadesi', + noValidExecutionTime: 'Geçerli bir yürütme süresi hesaplanamıyor', + executionTimeCalculationError: 'Çalıştırma süreleri hesaplanamadı', + invalidFrequency: 'Geçersiz frekans', + invalidStartTime: 'Geçersiz başlangıç zamanı', + startTimeMustBeFuture: 'Başlangıç zamanı gelecekte olmalıdır', + invalidTimeFormat: 'Geçersiz saat formatı (beklenen HH:MM AM/PM)', + invalidWeekday: 'Geçersiz hafta günü: {{weekday}}', + invalidMonthlyDay: 'Aylık gün 1-31 arasında veya "son" olmalıdır', + invalidOnMinute: 'Dakika 0-59 arasında olmalıdır', + invalidExecutionTime: 'Geçersiz yürütme süresi', + executionTimeMustBeFuture: 'Yürütme zamanı gelecekte olmalıdır', + }, + triggerWebhook: { + title: 'Webhook Tetikleyici', + nodeTitle: '🔗 Webhook Tetikleyici', + configPlaceholder: 'Webhook tetikleyici yapılandırması burada uygulanacak', + webhookUrl: 'Webhook URL', + webhookUrlPlaceholder: 'Webhook URL\'si oluşturmak için oluştur\'a tıklayın', + generate: 'Oluştur', + copy: 'Kopyala', + test: 'Test', + urlGenerated: 'Webhook URL başarıyla oluşturuldu', + urlGenerationFailed: 'Webhook URL\'si oluşturulamadı', + urlCopied: 'URL panoya kopyalandı', + method: 'Yöntem', + contentType: 'İçerik Türü', + queryParameters: 'Sorgu Parametreleri', + headerParameters: 'Başlık Parametreleri', + requestBodyParameters: 'İstek Gövdesi Parametreleri', + parameterName: 'Değişken adı', + varName: 'Değişken adı', + varType: 'Tür', + varNamePlaceholder: 'Değişken adı girin...', + required: 'Gerekli', + addParameter: 'Ekle', + addHeader: 'Ekle', + noParameters: 'Hiç parametre yapılandırılmadı', + noQueryParameters: 'Sorgu parametresi yapılandırılmadı', + noHeaders: 'Başlıklar yapılandırılmamış', + noBodyParameters: 'Hiçbir gövde parametresi yapılandırılmamış', + debugUrlTitle: 'Test çalışmaları için her zaman bu URL\'yi kullanın', + debugUrlCopy: 'Kopyalamak için tıkla', + debugUrlCopied: 'Kopyalandı!', + debugUrlPrivateAddressWarning: 'Bu URL dahili bir adres gibi görünüyor ve bu, webhook isteklerinin başarısız olmasına neden olabilir. TRIGGER_URL\'i halka açık bir adresle değiştirebilirsiniz.', + errorHandling: 'Hata Yönetimi', + errorStrategy: 'Hata Yönetimi', + responseConfiguration: 'Yanıt', + asyncMode: 'Asenkron Mod', + statusCode: 'Durum Kodu', + responseBody: 'Yanıt Gövdesi', + responseBodyPlaceholder: 'Yanıt metninizi buraya yazın', + headers: 'Başlıklar', + validation: { + webhookUrlRequired: 'Webhook URL\'si gerekli', + invalidParameterType: '"{{name}}" parametresi için geçersiz parametre türü "{{type}}"', + }, + }, }, tracing: { stopBy: '{{user}} tarafından durduruldu', @@ -1038,6 +1212,18 @@ const translation = { largeDataNoExport: 'Büyük veri - yalnızca kısmi önizleme', largeData: 'Büyük veri, salt okunur önizleme. Tümünü görüntülemek için dışa aktarın.', exportToolTip: 'Değişkeni Dosya Olarak Dışa Aktar', + listening: { + title: 'Tetikleyicilerden olaylar dinleniyor...', + tip: 'Artık test istekleri göndererek HTTP {{nodeName}} uç noktasında olay tetikleyicilerini simüle edebilir veya canlı olay hata ayıklama için bir geri arama URL\'si olarak kullanabilirsiniz. Tüm çıktılar, Değişken Denetleyicisinde doğrudan görüntülenebilir.', + tipPlugin: 'Artık {{- pluginName}} içinde etkinlikler oluşturabilir ve bu etkinliklerden elde edilen çıktıları Değişken Denetleyicisinde görebilirsiniz.', + tipSchedule: 'Zamanlayıcı tetikleyicilerinden etkinlikleri dinleme. Bir sonraki planlanan çalıştırma: {{nextTriggerTime}}', + tipFallback: 'Gelen tetikleyici olaylarını bekleyin. Çıktılar burada görünecektir.', + defaultNodeName: 'bu tetik', + defaultPluginName: 'bu eklenti tetikleyici', + defaultScheduleTime: 'Yapılandırılmadı', + selectedTriggers: 'seçilen tetikleyiciler', + stopButton: 'Dur', + }, }, lastRunTab: 'Son Koşu', settingsTab: 'Ayarlar', @@ -1055,11 +1241,52 @@ const translation = { noMatchingInputsFound: 'Son çalışmadan eşleşen giriş bulunamadı.', copyLastRunError: 'Son çalışma girdilerini kopyalamak başarısız oldu.', lastOutput: 'Son Çıktı', + lastRunInputsCopied: 'Son çalıştırmadan {{count}} girdi kopyalandı', }, sidebar: { exportWarning: 'Mevcut Kaydedilmiş Versiyonu Dışa Aktar', exportWarningDesc: 'Bu, çalışma akışınızın mevcut kaydedilmiş sürümünü dışa aktaracaktır. Editörde kaydedilmemiş değişiklikleriniz varsa, lütfen önce bunları çalışma akışı alanındaki dışa aktarma seçeneğini kullanarak kaydedin.', }, + publishLimit: { + startNodeTitlePrefix: 'Yükselt', + startNodeTitleSuffix: 'her iş akışı için sınırsız tetikleyici aç', + startNodeDesc: 'Bu plan için bir iş akışında 2 tetikleyici sınırına ulaştınız. Bu iş akışını yayınlamak için yükseltme yapın.', + }, + error: { + startNodeRequired: 'Lütfen {{operation}} işleminden önce önce bir başlangıç düğümü ekleyin', + operations: { + connectingNodes: 'düğümleri bağlamak', + addingNodes: 'düğüm ekleme', + modifyingWorkflow: 'iş akışını değiştirme', + updatingWorkflow: 'iş akışını güncelleme', + }, + }, + customWebhook: 'Özel Webhook', + difyTeam: 'Dify Ekibi', + triggerStatus: { + enabled: 'TETİK', + disabled: 'TETİKLEYİCİ • DEVRE DIŞI', + }, + entryNodeStatus: { + enabled: 'BAŞLAT', + disabled: 'BAŞLAT • ENGELLİ', + }, + onboarding: { + title: 'Başlamak için bir başlangıç düğümü seçin', + description: 'Farklı başlangıç düğümlerinin farklı yetenekleri vardır. Endişelenmeyin, bunları her zaman daha sonra değiştirebilirsiniz.', + userInputFull: 'Kullanıcı Girdisi (orijinal başlangıç düğümü)', + userInputDescription: 'Kullanıcı giriş değişkenlerini ayarlamaya imkan veren başlangıç düğümü; araç olarak web uygulaması, servis API\'si, MCP sunucusu ve iş akışı özelliklerine sahiptir.', + trigger: 'Tetik', + triggerDescription: 'Tetikleyiciler, zamanlanmış görevler, özel web kancaları veya diğer uygulamalarla entegrasyonlar gibi bir iş akışının başlangıç düğümü olarak hizmet edebilir.', + back: 'Geri', + learnMore: 'Daha fazla bilgi edin', + aboutStartNode: 'başlangıç düğümü hakkında.', + escTip: { + press: 'Basın', + key: 'esc', + toDismiss: 'reddetmek', + }, + }, } export default translation diff --git a/web/i18n/uk-UA/app-debug.ts b/web/i18n/uk-UA/app-debug.ts index 212a6ca2a9..c593d2a730 100644 --- a/web/i18n/uk-UA/app-debug.ts +++ b/web/i18n/uk-UA/app-debug.ts @@ -345,6 +345,7 @@ const translation = { 'localUpload': 'Локальне завантаження', 'uploadFileTypes': 'Типи файлів для завантаження', 'maxNumberOfUploads': 'Максимальна кількість завантажень', + 'maxNumberTip': 'Документ < {{docLimit}}, зображення < {{imgLimit}}, аудіо < {{audioLimit}}, відео < {{videoLimit}}', 'jsonSchema': 'JSON схема', 'optional': 'додатковий', 'json': 'JSON Код', diff --git a/web/i18n/uk-UA/app-log.ts b/web/i18n/uk-UA/app-log.ts index 63fc63111a..666bf8c888 100644 --- a/web/i18n/uk-UA/app-log.ts +++ b/web/i18n/uk-UA/app-log.ts @@ -19,6 +19,7 @@ const translation = { tokens: 'ТОКЕНИ', user: 'КІНЦЕВИЙ КОРИСТУВАЧ АБО ОБЛІКОВИЙ ЗАПИС', version: 'ВЕРСІЯ', + triggered_from: 'АКТИВУЄТЬСЯ ВІД', }, pagination: { previous: 'Попередня', @@ -97,6 +98,15 @@ const translation = { finalProcessing: 'Остаточна обробка', }, dateFormat: 'ДД/ММ/РРРР', + triggerBy: { + debugging: 'Налагодження', + appRun: 'Веб-додаток', + webhook: 'Вебхук', + schedule: 'Розклад', + plugin: 'Плагін', + ragPipelineRun: 'Конвеєр RAG', + ragPipelineDebugging: 'Виправлення помилок RAG', + }, } export default translation diff --git a/web/i18n/uk-UA/app-overview.ts b/web/i18n/uk-UA/app-overview.ts index a42397bb38..f71567b2da 100644 --- a/web/i18n/uk-UA/app-overview.ts +++ b/web/i18n/uk-UA/app-overview.ts @@ -114,7 +114,11 @@ const translation = { }, }, launch: 'Запуску', - enableTooltip: {}, + enableTooltip: { + description: 'Щоб увімкнути цю функцію, будь ласка, додайте вузол вводу користувача на полотно. (Може вже існувати в чернетці, набирає чинності після публікації)', + learnMore: 'Дізнатися більше', + }, + title: 'Веб-додаток', }, apiInfo: { title: 'API сервісу Backend', @@ -126,7 +130,14 @@ const translation = { running: 'У роботі', disable: 'Вимкнути', }, - triggerInfo: {}, + triggerInfo: { + title: 'Тригери', + explanation: 'Управління тригером робочого процесу', + triggersAdded: 'Додано тригери', + noTriggerAdded: 'Триггер не додано', + triggerStatusDescription: 'Статус вузла тригера відображається тут. (Може вже існувати в чернетці, набирає чинності після публікації)', + learnAboutTriggers: 'Дізнайтеся про тригери', + }, disableTooltip: { triggerMode: 'Функція {{feature}} не підтримується в режимі вузла тригера.', }, diff --git a/web/i18n/uk-UA/billing.ts b/web/i18n/uk-UA/billing.ts index 3096c4aec1..86e970ef02 100644 --- a/web/i18n/uk-UA/billing.ts +++ b/web/i18n/uk-UA/billing.ts @@ -98,6 +98,8 @@ const translation = { triggerEvents: { unlimited: 'Необмежена кількість тригерних подій', tooltip: 'Кількість подій, які автоматично запускають робочі процеси через тригери Плагіна, Розкладу або Вебхука.', + sandbox: '{{count,number}} Тригери подій', + professional: '{{count,number}} тригерні події/місяць', }, workflowExecution: { faster: 'Швидше виконання робочого процесу', @@ -107,6 +109,11 @@ const translation = { }, startNodes: { unlimited: 'Необмежені тригери/робочі процеси', + limited: 'До {{count}} тригерів/робочих процесів', + }, + title: { + plans: 'плани', + description: 'Виберіть план, який найкраще відповідає потребам вашої команди.', }, }, plans: { @@ -129,16 +136,14 @@ const translation = { name: 'Ентерпрайз', description: 'Отримайте повні можливості та підтримку для масштабних критично важливих систем.', includesTitle: 'Все, що входить до плану Team, плюс:', - features: { - }, + features: ['Масштабовані рішення для розгортання корпоративного рівня', 'Авторизація комерційної ліцензії', 'Ексклюзивні корпоративні функції', 'Кілька робочих просторів та управління підприємством', 'SSO', 'Укладені SLA партнерами Dify', 'Розширена безпека та контроль', 'Оновлення та обслуговування від Dify офіційно', 'Професійна технічна підтримка'], btnText: 'Зв\'язатися з відділом продажу', priceTip: 'Тільки річна оплата', for: 'Для великих команд', price: 'Користувацький', }, community: { - features: { - }, + features: ['Всі основні функції опубліковані у публічному репозиторії', 'Один робочий простір', 'Відповідає ліцензії відкритого програмного забезпечення Dify'], btnText: 'Розпочніть з громади', includesTitle: 'Безкоштовні можливості:', for: 'Для індивідуальних користувачів, малих команд або некомерційних проектів', @@ -147,8 +152,7 @@ const translation = { name: 'Спільнота', }, premium: { - features: { - }, + features: ['Самокерована надійність від різних хмарних постачальників', 'Один робочий простір', 'Налаштування логотипу та бренду WebApp', 'Пріоритетна підтримка електронної пошти та чату'], description: 'Для середніх підприємств та команд', btnText: 'Отримайте Преміум у', price: 'Масштабований', @@ -184,6 +188,7 @@ const translation = { vectorSpace: 'Сховище даних знань', perMonth: 'на місяць', triggerEvents: 'Тригерні події', + resetsIn: 'Скидання через {{count,number}} днів', }, teamMembers: 'Члени команди', triggerLimitModal: { diff --git a/web/i18n/uk-UA/common.ts b/web/i18n/uk-UA/common.ts index 941200d3a4..11d294709e 100644 --- a/web/i18n/uk-UA/common.ts +++ b/web/i18n/uk-UA/common.ts @@ -65,10 +65,17 @@ const translation = { no: 'Ні', deleteConfirmTitle: 'Видалити?', confirmAction: 'Будь ласка, підтвердіть свої дії.', + noSearchResults: 'Жодного {{content}} не знайдено', + resetKeywords: 'Скинути ключові слова', + selectCount: '{{count}} вибрано', + searchCount: 'Знайти {{count}} {{content}}', + noSearchCount: '0 {{content}}', + now: 'Зараз', }, placeholder: { input: 'Будь ласка, введіть текст', select: 'Будь ласка, оберіть параметр', + search: 'Пошук...', }, voice: { language: { @@ -770,6 +777,13 @@ const translation = { label: { optional: '(необов\'язково)', }, + noData: 'Немає даних', + dynamicSelect: { + error: 'Не вдалося завантажити параметри', + noData: 'Немає доступних опцій', + loading: 'Завантаження параметрів...', + selected: '{{count}} вибрано', + }, } export default translation diff --git a/web/i18n/uk-UA/dataset-documents.ts b/web/i18n/uk-UA/dataset-documents.ts index 3b7cd48e05..2cbcc301fc 100644 --- a/web/i18n/uk-UA/dataset-documents.ts +++ b/web/i18n/uk-UA/dataset-documents.ts @@ -81,7 +81,10 @@ const translation = { }, addUrl: 'Додати URL-адресу', learnMore: 'Дізнатися більше', - sort: {}, + sort: { + uploadTime: 'Час завантаження', + hitCount: 'Кількість отримань', + }, }, metadata: { title: 'Метадані', diff --git a/web/i18n/uk-UA/dataset-pipeline.ts b/web/i18n/uk-UA/dataset-pipeline.ts index 019553506f..0d8473c30e 100644 --- a/web/i18n/uk-UA/dataset-pipeline.ts +++ b/web/i18n/uk-UA/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'Опубліковано портфель знань', + tip: 'Перейдіть до Документів, щоб додати або керувати документами.', }, error: { message: 'Не вдалося опублікувати конвеєр знань', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'Структура', structureTooltip: 'Структура фрагментів визначає, як документи розділяються та індексуються (пропонуючи режими «Загальні», «Батьки-дочірні елементи» та «Запитання й відповіді»), і є унікальною для кожної бази знань.', + createdBy: 'Автор: {{author}}', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { characters: 'Символів', backToDataSource: 'Джерело даних', title: 'Додати документи', + selectOnlineDocumentTip: 'Обробити до {{count}} сторінок', + selectOnlineDriveTip: 'Обробляйте до {{count}} файлів, максимум {{fileSize}} МБ кожен', }, documentSettings: { title: 'Параметри документа', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} сторінок', + }, onlineDrive: { breadcrumbs: { allFiles: 'Всі файли', searchPlaceholder: 'Пошук файлів...', allBuckets: 'Усі сегменти хмарного сховища', + searchResult: 'Знайдено {{searchResultsLength}} елементів у папці "{{folderName}}"', }, emptyFolder: 'Ця папка порожня', emptySearchResult: 'Предметів не знайдено', resetKeywords: 'Скидання ключових слів', notSupportedFileType: 'Цей тип файлу не підтримується', + notConnected: '{{name}} не підключено', + notConnectedTip: 'Щоб синхронізувати з {{name}}, спершу потрібно встановити з’єднання з {{name}}.', + }, + credentialSelector: { + name: '{{credentialName}}\'s {{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { title: 'Підтвердження', @@ -149,6 +160,7 @@ const translation = { pipelineNameAndIcon: 'Назва та піктограма воронки продажів', editPipelineInfo: 'Як редагувати інформацію про воронку продажів', knowledgeDescriptionPlaceholder: 'Опишіть, що є в цій Базі знань. Детальний опис дозволяє штучному інтелекту більш точно отримати доступ до вмісту набору даних. Якщо значення порожнє, Dify використовуватиме стратегію удару за замовчуванням. (Необов\'язково)', + configurationTip: 'Налаштувати {{pluginName}}', } export default translation diff --git a/web/i18n/uk-UA/dataset.ts b/web/i18n/uk-UA/dataset.ts index ba565e64d0..b316c77d7e 100644 --- a/web/i18n/uk-UA/dataset.ts +++ b/web/i18n/uk-UA/dataset.ts @@ -235,6 +235,10 @@ const translation = { enabled: 'У службі', title: 'Сервісний API', }, + docAllEnabled_one: '{{count}} документ увімкнено', + docAllEnabled_other: 'Усі документи {{count}} увімкнено', + partialEnabled_one: 'Всього {{count}} документів, доступно {{num}}', + partialEnabled_other: 'Всього {{count}} документів, доступно {{num}}', } export default translation diff --git a/web/i18n/uk-UA/education.ts b/web/i18n/uk-UA/education.ts index a19b63accf..3cde4bb5b7 100644 --- a/web/i18n/uk-UA/education.ts +++ b/web/i18n/uk-UA/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: 'Не хвилюйтеся — це не вплине на вашу поточну підписку, але ви не отримаєте знижку на освіту при її поновленні, якщо знову не підтвердите свій статус.', + title: 'Статус вашої освіти закінчиться {{date}}', }, stillInEducation: { title: 'Все ще навчаєшся?', diff --git a/web/i18n/uk-UA/pipeline.ts b/web/i18n/uk-UA/pipeline.ts index 47a9b40050..ac38d80dad 100644 --- a/web/i18n/uk-UA/pipeline.ts +++ b/web/i18n/uk-UA/pipeline.ts @@ -28,10 +28,12 @@ const translation = { loading: 'Обробки... Будь ласка, зачекай', viewDetails: 'Перегляд докладних відомостей', error: 'Під час виконання сталася помилка', + footerTip: 'У режимі тестового запуску перегляньте до {{count}} фрагментів', }, }, ragToolSuggestions: { title: 'Пропозиції щодо RAG', + noRecommendationPlugins: 'Рекомендованих плагінів немає, знайдіть більше на Маркетплейсі', }, } diff --git a/web/i18n/uk-UA/plugin-trigger.ts b/web/i18n/uk-UA/plugin-trigger.ts new file mode 100644 index 0000000000..1e02b28282 --- /dev/null +++ b/web/i18n/uk-UA/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'Підписки', + listNum: '{{num}} підписки', + empty: { + title: 'Немає підписок', + button: 'Нова підписка', + }, + createButton: { + oauth: 'Нова підписка з OAuth', + apiKey: 'Нова підписка з ключем API', + manual: 'Вставте URL, щоб створити нову підписку', + }, + createSuccess: 'Підписку успішно створено', + createFailed: 'Не вдалося створити підписку', + maxCount: 'Макс {{num}} підписок', + selectPlaceholder: 'Виберіть підписку', + noSubscriptionSelected: 'Підписка не обрана', + subscriptionRemoved: 'Підписку видалено', + list: { + title: 'Підписки', + addButton: 'Додати', + tip: 'Отримувати події через підписку', + item: { + enabled: 'Увімкнено', + disabled: 'Вимкнено', + credentialType: { + api_key: 'API ключ', + oauth2: 'OAuth', + unauthorized: 'Посібник', + }, + actions: { + delete: 'Видалити', + deleteConfirm: { + title: 'Видалити {{name}}?', + success: 'Підписку {{name}} успішно видалено', + error: 'Не вдалося видалити підписку {{name}}', + content: 'Після видалення цю підписку неможливо буде відновити. Будь ласка, підтвердіть.', + contentWithApps: 'Поточна підписка використовується {{count}} додатками. Видалення підписки призведе до того, що налаштовані додатки перестануть отримувати події підписки.', + confirm: 'Підтвердити видалення', + cancel: 'Скасувати', + confirmInputWarning: 'Будь ласка, введіть правильне ім’я для підтвердження.', + confirmInputPlaceholder: 'Введіть "{{name}}", щоб підтвердити.', + confirmInputTip: 'Будь ласка, введіть «{{name}}», щоб підтвердити.', + }, + }, + status: { + active: 'Активний', + inactive: 'Неактивний', + }, + usedByNum: 'Використовується в {{num}} робочих процесах', + noUsed: 'Жодного робочого процесу не використано', + }, + }, + addType: { + title: 'Додати підписку', + description: 'Виберіть, як ви хочете створити підписку на тригер', + options: { + apikey: { + title: 'Створити за допомогою ключа API', + description: 'Автоматично створювати підписку за допомогою облікових даних API', + }, + oauth: { + title: 'Створити з OAuth', + description: 'Авторизуйтеся через сторонню платформу, щоб створити підписку', + clientSettings: 'Налаштування клієнта OAuth', + clientTitle: 'Клієнт OAuth', + default: 'За замовчуванням', + custom: 'Налаштований', + }, + manual: { + title: 'Ручне налаштування', + description: 'Вставте URL, щоб створити нову підписку', + tip: 'Налаштуйте URL на сторонній платформі вручну', + }, + }, + }, + }, + modal: { + steps: { + verify: 'Перевірити', + configuration: 'Налаштування', + }, + common: { + cancel: 'Скасувати', + back: 'Назад', + next: 'Далі', + create: 'Створити', + verify: 'Перевірити', + authorize: 'Авторизувати', + creating: 'Створення...', + verifying: 'Перевірка...', + authorizing: 'Авторизація...', + }, + oauthRedirectInfo: 'Оскільки для цього постачальника інструментів не знайдено жодних системних секретів клієнта, необхідно налаштувати його вручну, для redirect_uri, будь ласка, використовуйте', + apiKey: { + title: 'Створити за допомогою ключа API', + verify: { + title: 'Перевірити облікові дані', + description: 'Будь ласка, надайте свої облікові дані API для перевірки доступу', + error: 'Перевірка облікових даних не вдалася. Будь ласка, перевірте свій API-ключ.', + success: 'Облікові дані успішно перевірено', + }, + configuration: { + title: 'Налаштувати підписку', + description: 'Налаштуйте параметри вашої підписки', + }, + }, + oauth: { + title: 'Створити з OAuth', + authorization: { + title: 'Авторизація OAuth', + description: 'Дозвольте Dify отримати доступ до вашого акаунту', + redirectUrl: 'URL перенаправлення', + redirectUrlHelp: 'Використайте цей URL у налаштуваннях вашого OAuth-додатку', + authorizeButton: 'Авторизуйтеся за допомогою {{provider}}', + waitingAuth: 'Очікування авторизації...', + authSuccess: 'Авторизація успішна', + authFailed: 'Не вдалося отримати інформацію про авторизацію OAuth', + waitingJump: 'Дозволено, очікування стрибка', + }, + configuration: { + title: 'Налаштувати підписку', + description: 'Налаштуйте параметри підписки після авторизації', + success: 'Конфігурація OAuth успішна', + failed: 'Не вдалося налаштувати OAuth', + }, + remove: { + success: 'OAuth успішно видалено', + failed: 'Не вдалося видалити OAuth', + }, + save: { + success: 'Конфігурацію OAuth успішно збережено', + }, + }, + manual: { + title: 'Ручне налаштування', + description: 'Налаштуйте підписку на вебхук вручну', + logs: { + title: 'Журнали запитів', + request: 'Запит', + loading: 'Очікується запит від {{pluginName}}...', + }, + }, + form: { + subscriptionName: { + label: 'Назва підписки', + placeholder: 'Введіть назву підписки', + required: 'Потрібно вказати назву підписки', + }, + callbackUrl: { + label: 'URL зворотного виклику', + description: 'Цей URL буде отримувати події вебхука', + tooltip: 'Надайте загальнодоступну кінцеву точку, яка може приймати запити зворотного виклику від постачальника тригерів.', + placeholder: 'Генерація...', + privateAddressWarning: 'Цей URL, схоже, є внутрішньою адресою, що може спричинити помилки у запитах вебхука. Ви можете змінити TRIGGER_URL на публічну адресу.', + }, + }, + errors: { + createFailed: 'Не вдалося створити підписку', + verifyFailed: 'Не вдалося перевірити облікові дані', + authFailed: 'Авторизація не вдалася', + networkError: 'Помилка мережі, будь ласка, спробуйте ще раз', + }, + }, + events: { + title: 'Доступні події', + description: 'Події, на які цей плагін тригера може підписатися', + empty: 'Події відсутні', + event: 'Подія', + events: 'Події', + actionNum: '{{num}} {{event}} ВКЛЮЧЕНО', + item: { + parameters: '{{count}} параметри', + noParameters: 'Немає параметрів', + }, + output: 'Вихід', + }, + node: { + status: { + warning: 'Відключити', + }, + }, +} + +export default translation diff --git a/web/i18n/uk-UA/plugin.ts b/web/i18n/uk-UA/plugin.ts index 586fb70707..2d2683026d 100644 --- a/web/i18n/uk-UA/plugin.ts +++ b/web/i18n/uk-UA/plugin.ts @@ -7,6 +7,7 @@ const translation = { extensions: 'Розширення', agents: 'Стратегії агентів', datasources: 'Джерела даних', + triggers: 'Тригери', }, categorySingle: { agent: 'Стратегія агента', @@ -15,6 +16,7 @@ const translation = { extension: 'Збільшення', model: 'Модель', datasource: 'Джерело даних', + trigger: 'Спусковий механізм', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { checkUpdate: 'Перевірити Оновлення', update: 'Оновлювати', info: 'Інформація про плагін', + back: 'Назад', }, toolSelector: { placeholder: 'Виберіть інструмент...', @@ -306,6 +309,12 @@ const translation = { changeTimezone: 'Щоб змінити часовий пояс, перейдіть до Налаштування', partialUPdate: 'Тільки наступні {{num}} плагіни будуть автоматично оновлюватися', }, + readmeInfo: { + title: 'Прочитай мене', + needHelpCheckReadme: 'Потрібна допомога? Перегляньте README.', + noReadmeAvailable: 'README недоступний', + failedToFetch: 'Не вдалося отримати README', + }, } export default translation diff --git a/web/i18n/uk-UA/workflow.ts b/web/i18n/uk-UA/workflow.ts index 95425f0a32..f3877f17a5 100644 --- a/web/i18n/uk-UA/workflow.ts +++ b/web/i18n/uk-UA/workflow.ts @@ -113,6 +113,15 @@ const translation = { currentView: 'Поточний вигляд', currentWorkflow: 'Поточний робочий процес', moreActions: 'Більше дій', + listening: 'Слухання', + chooseStartNodeToRun: 'Виберіть початковий вузол для запуску', + runAllTriggers: 'Запустити всі тригери', + features: 'Особливості', + featuresDescription: 'Покращити користувацький досвід веб-додатку', + featuresDocLink: 'Дізнатися більше', + needAdd: 'Потрібно додати вузол {{node}}', + needStartNode: 'Потрібно додати щонайменше один початковий вузол', + workflowAsToolDisabledHint: 'Опублікуйте останній робочий процес і переконайтеся, що перед налаштуванням його як інструменту є підключений вузол введення користувача.', }, env: { envPanelTitle: 'Змінні середовища', @@ -219,6 +228,7 @@ const translation = { rerankModelRequired: 'Перед увімкненням Rerank Model, будь ласка, підтвердьте, що модель успішно налаштована в налаштуваннях.', noValidTool: '{{field}} не вибрано дійсного інструменту', toolParameterRequired: '{{field}}: параметр [{{param}}] обов\'язковий', + startNodeRequired: 'Будь ласка, спершу додайте стартовий вузол перед {{operation}}', }, singleRun: { testRun: 'Тестовий запуск', @@ -250,6 +260,21 @@ const translation = { 'allAdded': 'Всі додані', 'sources': 'Джерел', 'searchDataSource': 'Пошук у джерелі даних', + 'start': 'Почати', + 'searchTrigger': 'Пошук тригерів...', + 'allTriggers': 'Всі тригери', + 'noPluginsFound': 'Плагіни не знайдено', + 'requestToCommunity': 'Запити до спільноти', + 'featuredTools': 'Рекомендоване', + 'showMoreFeatured': 'Показати більше', + 'showLessFeatured': 'Показати менше', + 'installed': 'Встановлено', + 'pluginByAuthor': 'Автор: {{author}}', + 'usePlugin': 'Вибрати інструмент', + 'hideActions': 'Сховати інструменти', + 'noFeaturedPlugins': 'Відкрийте більше інструментів у Маркетплейсі', + 'noFeaturedTriggers': 'Дізнайтеся більше тригерів у Маркетплейсі', + 'startDisabledTip': 'Вузол тригера та вузол введення користувача взаємовиключні.', }, blocks: { 'start': 'Початок', @@ -276,6 +301,10 @@ const translation = { 'loop-end': 'Вихід з циклу', 'datasource': 'Джерело даних', 'knowledge-index': 'База знань', + 'originalStartNode': 'оригінальний початковий вузол', + 'trigger-schedule': 'Тригер розкладу', + 'trigger-webhook': 'Тригер вебхука', + 'trigger-plugin': 'Тригер плагіна', }, blocksAbout: { 'start': 'Визначте початкові параметри для запуску робочого потоку', @@ -300,6 +329,9 @@ const translation = { 'loop-end': 'Еквівалентно "перерві". Цей вузол не має елементів конфігурації. Коли тіло циклу досягає цього вузла, цикл завершується.', 'datasource': 'Джерело даних про', 'knowledge-index': 'База знань про нас', + 'trigger-schedule': 'Триггер робочого процесу, що запускає робочі процеси за розкладом', + 'trigger-webhook': 'Тригер вебхука отримує HTTP-запити від сторонніх систем для автоматичного запуску робочих процесів.', + 'trigger-plugin': 'Тригер інтеграції сторонніх розробників, який запускає робочі процеси з подій зовнішньої платформи', }, operator: { zoomIn: 'Збільшити', @@ -340,6 +372,8 @@ const translation = { maximize: 'Максимізувати полотно', scrollToSelectedNode: 'Прокрутіть до вибраного вузла', optional_and_hidden: '(необов\'язково & приховано)', + goTo: 'Перейти до', + startNode: 'Початковий вузол', }, nodes: { common: { @@ -787,6 +821,8 @@ const translation = { parallelModeEnableDesc: 'У паралельному режимі завдання всередині ітерацій підтримують паралельне виконання. Ви можете налаштувати це на панелі властивостей праворуч.', MaxParallelismDesc: 'Максимальний паралелізм використовується для контролю числа завдань, що виконуються одночасно за одну ітерацію.', answerNodeWarningDesc: 'Попередження в паралельному режимі: вузли відповідей, призначення змінних розмови та постійні операції читання/запису в межах ітерацій можуть спричинити винятки.', + flattenOutput: 'Вирівняти результат', + flattenOutputDesc: 'Коли ввімкнено, якщо всі результати ітерацій є масивами, вони будуть об\'єднані в один масив. Коли вимкнено, результати збережуть вкладену структуру масивів.', }, note: { editor: { @@ -963,6 +999,144 @@ const translation = { embeddingModelIsInvalid: 'Модель вбудовування недійсна', rerankingModelIsInvalid: 'Модель переналаштування недійсна', }, + triggerPlugin: { + authorized: 'Авторизований', + notConfigured: 'Не налаштовано', + notAuthorized: 'Не авторизовано', + selectSubscription: 'Вибрати підписку', + availableSubscriptions: 'Доступні підписки', + addSubscription: 'Додати нову підписку', + removeSubscription: 'Скасувати підписку', + subscriptionRemoved: 'Підписку успішно видалено', + error: 'Помилка', + configuration: 'Налаштування', + remove: 'Видалити', + or: 'АБО', + useOAuth: 'Використовувати OAuth', + useApiKey: 'Використати ключ API', + authenticationFailed: 'Аутентифікація не вдалася', + authenticationSuccess: 'Аутентифікація успішна', + oauthConfigFailed: 'Не вдалося налаштувати OAuth', + configureOAuthClient: 'Налаштувати OAuth-клієнта', + oauthClientDescription: 'Налаштуйте облікові дані клієнта OAuth для активації автентифікації', + oauthClientSaved: 'Конфігурацію клієнта OAuth успішно збережено', + configureApiKey: 'Налаштувати ключ API', + apiKeyDescription: 'Налаштувати ключ API для автентифікації', + apiKeyConfigured: 'Ключ API успішно налаштовано', + configurationFailed: 'Не вдалося налаштувати', + failedToStart: 'Не вдалося запустити процес аутентифікації', + credentialsVerified: 'Облікові дані успішно перевірено', + credentialVerificationFailed: 'Перевірка облікових даних не вдалася', + verifyAndContinue: 'Підтвердити та продовжити', + configureParameters: 'Налаштувати параметри', + parametersDescription: 'Налаштуйте параметри та властивості тригера', + configurationComplete: 'Налаштування завершено', + configurationCompleteDescription: 'Ваш тригер успішно налаштовано', + configurationCompleteMessage: 'Ваша конфігурація тригера тепер завершена і готова до використання.', + parameters: 'Параметри', + properties: 'Властивості', + propertiesDescription: 'Додаткові властивості конфігурації для цього тригера', + noConfigurationRequired: 'Додаткове налаштування для цього тригера не потрібне.', + subscriptionName: 'Назва підписки', + subscriptionNameDescription: 'Введіть унікальне ім’я для цієї підписки на тригер', + subscriptionNamePlaceholder: 'Введіть назву підписки...', + subscriptionNameRequired: 'Потрібна назва підписки', + subscriptionRequired: 'Потрібна підписка', + }, + triggerSchedule: { + title: 'Розклад', + nodeTitle: 'Тригер розкладу', + notConfigured: 'Не налаштовано', + useCronExpression: 'Використовувати cron-вираз', + useVisualPicker: 'Використати візуальний вибір', + frequency: { + label: 'ЧАСТОТА', + hourly: 'Погодинно', + daily: 'Щодня', + weekly: 'Щотижня', + monthly: 'Щомісячно', + }, + selectFrequency: 'Виберіть частоту', + frequencyLabel: 'Частота', + nextExecution: 'Наступне виконання', + weekdays: 'Будні дні', + time: 'Час', + cronExpression: 'Вираз Cron', + nextExecutionTime: 'ЧАС НАСТУПНОГО ВИКОНАННЯ', + nextExecutionTimes: 'Наступні 5 разів виконання', + startTime: 'Час початку', + executeNow: 'Виконання зараз', + selectDateTime: 'Вибрати дату та час', + hours: 'Години', + minutes: 'Хвилини', + onMinute: 'Що хвилина', + days: 'Дні', + lastDay: 'Останній день', + lastDayTooltip: 'Не всі місяці мають 31 день. Використовуйте опцію «останній день», щоб вибрати останній день кожного місяця.', + mode: 'Мода', + timezone: 'Часовий пояс', + visualConfig: 'Візуальна конфігурація', + monthlyDay: 'Щомісячний день', + executionTime: 'Час виконання', + invalidTimezone: 'Неправильний часовий пояс', + invalidCronExpression: 'Недійсний cron вираз', + noValidExecutionTime: 'Не можна обчислити допустимий час виконання', + executionTimeCalculationError: 'Не вдалося обчислити час виконання', + invalidFrequency: 'Неприпустима частота', + invalidStartTime: 'Недійсний час початку', + startTimeMustBeFuture: 'Час початку має бути в майбутньому', + invalidTimeFormat: 'Неправильний формат часу (очікується ГГ:ХХ AM/PM)', + invalidWeekday: 'Недійсний день тижня: {{weekday}}', + invalidMonthlyDay: 'Місячний день повинен бути між 1-31 або «останній»', + invalidOnMinute: 'Хвилина повинна бути в межах 0-59', + invalidExecutionTime: 'Недійсний час виконання', + executionTimeMustBeFuture: 'Час виконання має бути в майбутньому', + }, + triggerWebhook: { + title: 'Тригер вебхука', + nodeTitle: '🔗 Тригер вебхука', + configPlaceholder: 'Налаштування тригера вебхука буде реалізовано тут', + webhookUrl: 'URL вебхука', + webhookUrlPlaceholder: 'Натисніть «Створити», щоб згенерувати URL вебхука', + generate: 'Створити', + copy: 'Копіювати', + test: 'Тест', + urlGenerated: 'URL вебхука успішно згенеровано', + urlGenerationFailed: 'Не вдалося створити URL вебхука', + urlCopied: 'URL скопійовано в буфер обміну', + method: 'Метод', + contentType: 'Тип вмісту', + queryParameters: 'Параметри запиту', + headerParameters: 'Параметри заголовка', + requestBodyParameters: 'Параметри тіла запиту', + parameterName: 'Ім\'я змінної', + varName: 'Ім\'я змінної', + varType: 'Тип', + varNamePlaceholder: 'Введіть назву змінної...', + required: 'Обов\'язково', + addParameter: 'Додати', + addHeader: 'Додати', + noParameters: 'Параметри не налаштовані', + noQueryParameters: 'Параметри запиту не налаштовані', + noHeaders: 'Заголовки не налаштовані', + noBodyParameters: 'Параметри тіла не налаштовані', + debugUrlTitle: 'Для тестових запусків завжди використовуйте цей URL', + debugUrlCopy: 'Натисніть, щоб скопіювати', + debugUrlCopied: 'Скопійовано!', + debugUrlPrivateAddressWarning: 'Цей URL, схоже, є внутрішньою адресою, що може спричинити помилки у запитах вебхука. Ви можете змінити TRIGGER_URL на публічну адресу.', + errorHandling: 'Обробка помилок', + errorStrategy: 'Обробка помилок', + responseConfiguration: 'Відповідь', + asyncMode: 'Асинхронний режим', + statusCode: 'Код стану', + responseBody: 'Тіло відповіді', + responseBodyPlaceholder: 'Напишіть тут текст вашої відповіді', + headers: 'Заголовки', + validation: { + webhookUrlRequired: 'Потрібен URL вебхука', + invalidParameterType: 'Недійсний тип параметра "{{type}}" для параметра "{{name}}"', + }, + }, }, tracing: { stopBy: 'Зупинено користувачем {{user}}', @@ -1037,6 +1211,18 @@ const translation = { exportToolTip: 'Експортувати змінну як файл', largeDataNoExport: 'Великі дані - лише частковий попередній перегляд', largeData: 'Великий обсяг даних, попередній перегляд лише для читання. Експортуйте, щоб переглянути всі.', + listening: { + title: 'Очікування подій від тригерів...', + tip: 'Тепер ви можете імітувати спрацювання подій, надсилаючи тестові запити на HTTP {{nodeName}}-кінечну точку або використати її як URL зворотного виклику для налагодження живих подій. Всі результати можна переглянути безпосередньо у Переглядачі змінних.', + tipPlugin: 'Тепер ви можете створювати події в {{- pluginName}} та отримувати результати цих подій у Інспекторі змінних.', + tipSchedule: 'Прослуховування подій від тригерів розкладу. Наступний запланований запуск: {{nextTriggerTime}}', + tipFallback: 'Очікуйте вхідних подій тригера. Вихідні дані з’являться тут.', + defaultNodeName: 'цей тригер', + defaultPluginName: 'цей плагін спрацьовує', + defaultScheduleTime: 'Не налаштовано', + selectedTriggers: 'вибрані тригери', + stopButton: 'Зупинись', + }, }, lastRunTab: 'Останній запуск', settingsTab: 'Налаштування', @@ -1054,11 +1240,52 @@ const translation = { copyLastRunError: 'Не вдалося скопіювати вхідні дані останнього виконання', noMatchingInputsFound: 'Не знайдено відповідних вхідних даних з останнього запуску', lastOutput: 'Останній вихід', + lastRunInputsCopied: 'Скопійовано {{count}} введення(в) з останнього запуску', }, sidebar: { exportWarning: 'Експортувати поточну збережену версію', exportWarningDesc: 'Це експортує поточну збережену версію вашого робочого процесу. Якщо у вас є незбережені зміни в редакторі, будь ласка, спочатку збережіть їх, використовуючи опцію експорту на полотні робочого процесу.', }, + publishLimit: { + startNodeTitlePrefix: 'Оновити до', + startNodeTitleSuffix: 'розблокувати необмежену кількість тригерів на робочий процес', + startNodeDesc: 'Ви досягли ліміту в 2 тригери на робочий процес для цього плану. Оновіть план, щоб опублікувати цей робочий процес.', + }, + error: { + startNodeRequired: 'Будь ласка, спершу додайте стартовий вузол перед {{operation}}', + operations: { + connectingNodes: 'підключення вузлів', + addingNodes: 'додавання вузлів', + modifyingWorkflow: 'модифікація робочого процесу', + updatingWorkflow: 'оновлення робочого процесу', + }, + }, + customWebhook: 'Користувацький вебхук', + difyTeam: 'Команда Dify', + triggerStatus: { + enabled: 'СПУСКОВИЙ МЕХАНІЗМ', + disabled: 'ТРІГЕР • ВІДСУТНІЙ', + }, + entryNodeStatus: { + enabled: 'ПОЧАТОК', + disabled: 'СТАРТ • ВІДКЛЮЧЕНО', + }, + onboarding: { + title: 'Виберіть початковий вузол, щоб почати', + description: 'Різні початкові вузли мають різні можливості. Не хвилюйся, ти завжди можеш змінити їх пізніше.', + userInputFull: 'Ввід користувача (оригінальний початковий вузол)', + userInputDescription: 'Початковий вузол, який дозволяє встановлювати змінні користувача, з можливостями веб-додатку, API сервісу, сервера MCP та робочого процесу як інструментів.', + trigger: 'Спусковий механізм', + triggerDescription: 'Тригери можуть слугувати стартовим вузлом робочого процесу, наприклад, запланованими завданнями, користувацькими вебхуками або інтеграціями з іншими додатками.', + back: 'Назад', + learnMore: 'Дізнатися більше', + aboutStartNode: 'про початковий вузол.', + escTip: { + press: 'Преса', + key: 'esc', + toDismiss: 'звільнити', + }, + }, } export default translation diff --git a/web/i18n/vi-VN/app-debug.ts b/web/i18n/vi-VN/app-debug.ts index 6ea4e428c2..150dfe488b 100644 --- a/web/i18n/vi-VN/app-debug.ts +++ b/web/i18n/vi-VN/app-debug.ts @@ -327,6 +327,7 @@ const translation = { 'content': 'Nội dung', 'multi-files': 'Danh sách tập tin', 'maxNumberOfUploads': 'Số lượt tải lên tối đa', + 'maxNumberTip': 'Tài liệu < {{docLimit}}, hình ảnh < {{imgLimit}}, âm thanh < {{audioLimit}}, video < {{videoLimit}}', 'json': 'Mã JSON', 'checkbox': 'Hộp kiểm', 'optional': 'tùy chọn', diff --git a/web/i18n/vi-VN/app-log.ts b/web/i18n/vi-VN/app-log.ts index 121a06d8b6..d3f24a4d63 100644 --- a/web/i18n/vi-VN/app-log.ts +++ b/web/i18n/vi-VN/app-log.ts @@ -19,6 +19,7 @@ const translation = { tokens: 'TOKEN', user: 'NGƯỜI DÙNG CUỐI HOẶC TÀI KHOẢN', version: 'PHIÊN BẢN', + triggered_from: 'KÍCH HOẠT BỞI', }, pagination: { previous: 'Trước', @@ -97,6 +98,15 @@ const translation = { }, agentLog: 'Nhật ký đại lý', dateFormat: 'MM/DD/YYYY', + triggerBy: { + debugging: 'Gỡ lỗi', + appRun: 'Ứng dụng web', + webhook: 'Webhook', + schedule: 'Lịch trình', + plugin: 'Tiện ích mở rộng', + ragPipelineRun: 'Chuỗi Xử lý RAG', + ragPipelineDebugging: 'Gỡ lỗi RAG', + }, } export default translation diff --git a/web/i18n/vi-VN/app-overview.ts b/web/i18n/vi-VN/app-overview.ts index 705d0bf192..7c2e51da4e 100644 --- a/web/i18n/vi-VN/app-overview.ts +++ b/web/i18n/vi-VN/app-overview.ts @@ -114,7 +114,11 @@ const translation = { }, }, launch: 'Phóng', - enableTooltip: {}, + enableTooltip: { + description: 'Để kích hoạt tính năng này, vui lòng thêm một nút Nhập Người Dùng vào bảng điều khiển. (Có thể đã tồn tại trong bản nháp, có hiệu lực sau khi xuất bản)', + learnMore: 'Tìm hiểu thêm', + }, + title: 'Ứng dụng web', }, apiInfo: { title: 'API dịch vụ backend', @@ -126,7 +130,14 @@ const translation = { running: 'Đang hoạt động', disable: 'Đã tắt', }, - triggerInfo: {}, + triggerInfo: { + title: 'Nguyên nhân kích hoạt', + explanation: 'Quản lý kích hoạt quy trình làm việc', + triggersAdded: '{{count}} Kích hoạt đã được thêm', + noTriggerAdded: 'Chưa thêm trình kích hoạt', + triggerStatusDescription: 'Trạng thái nút kích hoạt sẽ hiển thị ở đây. (Có thể đã tồn tại trong bản nháp, có hiệu lực sau khi xuất bản)', + learnAboutTriggers: 'Tìm hiểu về Các trình kích hoạt', + }, disableTooltip: { triggerMode: 'Tính năng {{feature}} không được hỗ trợ trong chế độ Nút Kích hoạt.', }, diff --git a/web/i18n/vi-VN/billing.ts b/web/i18n/vi-VN/billing.ts index 1500fbc14e..8eb1ead6a4 100644 --- a/web/i18n/vi-VN/billing.ts +++ b/web/i18n/vi-VN/billing.ts @@ -98,6 +98,8 @@ const translation = { triggerEvents: { unlimited: 'Sự kiện Kích hoạt Không giới hạn', tooltip: 'Số lượng sự kiện tự động kích hoạt quy trình làm việc thông qua Plugin, Lịch trình hoặc Webhook.', + sandbox: '{{count,number}} Kích hoạt Sự kiện', + professional: '{{count,number}} Sự kiện kích hoạt/tháng', }, workflowExecution: { faster: 'Thực hiện quy trình làm việc nhanh hơn', @@ -107,6 +109,11 @@ const translation = { }, startNodes: { unlimited: 'Kích hoạt/quy trình làm việc không giới hạn', + limited: 'Tối đa {{count}} kích hoạt/quy trình', + }, + title: { + plans: 'kế hoạch', + description: 'Chọn gói phù hợp nhất với nhu cầu của đội bạn.', }, }, plans: { @@ -129,16 +136,14 @@ const translation = { name: 'Doanh nghiệp', description: 'Nhận toàn bộ khả năng và hỗ trợ cho các hệ thống quan trọng cho nhiệm vụ quy mô lớn.', includesTitle: 'Tất cả trong kế hoạch Nhóm, cộng thêm:', - features: { - }, + features: ['Giải pháp triển khai mở rộng cấp doanh nghiệp', 'Giấy phép thương mại', 'Tính năng Doanh nghiệp Độc quyền', 'Nhiều Không Gian Làm Việc & Quản Lý Doanh Nghiệp', 'Đăng nhập một lần', 'Các SLA đã được đàm phán bởi các Đối tác Dify', 'Bảo mật & Kiểm soát Nâng cao', 'Cập nhật và Bảo trì bởi Dify chính thức', 'Hỗ trợ Kỹ thuật Chuyên nghiệp'], price: 'Tùy chỉnh', for: 'Dành cho các đội lớn', priceTip: 'Chỉ thanh toán hàng năm', btnText: 'Liên hệ với Bộ phận Bán hàng', }, community: { - features: { - }, + features: ['Tất cả các Tính năng Cốt lõi được Phát hành Dưới Kho Lưu trữ Công khai', 'Không gian làm việc đơn', 'Tuân thủ Giấy phép Mã nguồn mở Dify'], description: 'Dành cho người dùng cá nhân, nhóm nhỏ hoặc các dự án phi thương mại', name: 'Cộng đồng', btnText: 'Bắt đầu với Cộng đồng', @@ -147,8 +152,7 @@ const translation = { includesTitle: 'Tính năng miễn phí:', }, premium: { - features: { - }, + features: ['Độ tin cậy tự quản lý bởi các nhà cung cấp đám mây khác nhau', 'Không gian làm việc đơn', 'Tùy chỉnh Logo & Thương hiệu WebApp', 'Hỗ trợ Email & Trò chuyện Ưu tiên'], comingSoon: 'Hỗ trợ Microsoft Azure & Google Cloud Sẽ Đến Sớm', priceTip: 'Dựa trên Thị trường Đám mây', btnText: 'Nhận Premium trong', @@ -184,6 +188,7 @@ const translation = { buildApps: 'Xây dựng ứng dụng', triggerEvents: 'Các sự kiện kích hoạt', perMonth: 'mỗi tháng', + resetsIn: 'Đặt lại sau {{count,number}} ngày', }, teamMembers: 'Các thành viên trong nhóm', triggerLimitModal: { diff --git a/web/i18n/vi-VN/common.ts b/web/i18n/vi-VN/common.ts index b929854555..131306edc4 100644 --- a/web/i18n/vi-VN/common.ts +++ b/web/i18n/vi-VN/common.ts @@ -65,10 +65,17 @@ const translation = { yes: 'Vâng', deleteConfirmTitle: 'Xóa?', confirmAction: 'Vui lòng xác nhận hành động của bạn.', + noSearchResults: 'Không tìm thấy {{content}} nào', + resetKeywords: 'Đặt lại từ khóa', + selectCount: '{{count}} Đã chọn', + searchCount: 'Tìm {{count}} {{content}}', + noSearchCount: '0 {{content}}', + now: 'Bây giờ', }, placeholder: { input: 'Vui lòng nhập', select: 'Vui lòng chọn', + search: 'Tìm kiếm...', }, voice: { language: { @@ -769,6 +776,13 @@ const translation = { label: { optional: '(tùy chọn)', }, + noData: 'Không có dữ liệu', + dynamicSelect: { + error: 'Tải tùy chọn thất bại', + noData: 'Không có tùy chọn nào', + loading: 'Đang tải tùy chọn...', + selected: '{{count}} đã chọn', + }, } export default translation diff --git a/web/i18n/vi-VN/dataset-documents.ts b/web/i18n/vi-VN/dataset-documents.ts index b8f2b8bd01..866f4f2b04 100644 --- a/web/i18n/vi-VN/dataset-documents.ts +++ b/web/i18n/vi-VN/dataset-documents.ts @@ -81,7 +81,10 @@ const translation = { }, addUrl: 'Thêm URL', learnMore: 'Tìm hiểu thêm', - sort: {}, + sort: { + uploadTime: 'Thời gian tải lên', + hitCount: 'Số lần truy xuất', + }, }, metadata: { title: 'Siêu dữ liệu', diff --git a/web/i18n/vi-VN/dataset-pipeline.ts b/web/i18n/vi-VN/dataset-pipeline.ts index d89c659877..a785b1b7d8 100644 --- a/web/i18n/vi-VN/dataset-pipeline.ts +++ b/web/i18n/vi-VN/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: 'Knowledge Pipeline đã xuất bản', + tip: 'Đi tới Tài liệu để thêm hoặc quản lý các tài liệu.', }, error: { message: 'Không thể xuất bản quy trình kiến thức', @@ -56,6 +57,7 @@ const translation = { details: { structure: 'Cấu trúc', structureTooltip: 'Chunk Structure xác định cách các tài liệu được phân tách và lập chỉ mục — cung cấp các chế độ General, Parent-Child và Q&A — và là duy nhất cho mỗi cơ sở tri thức.', + createdBy: 'Bởi {{author}}', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { characters: 'Ký tự', backToDataSource: 'Nguồn dữ liệu', title: 'Thêm tài liệu', + selectOnlineDocumentTip: 'Xử lý lên đến {{count}} trang', + selectOnlineDriveTip: 'Xử lý tối đa {{count}} tệp, mỗi tệp tối đa {{fileSize}} MB', }, documentSettings: { title: 'Cài đặt tài liệu', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} trang', + }, onlineDrive: { breadcrumbs: { allFiles: 'Tất cả các tập tin', allBuckets: 'Tất cả các bộ lưu trữ đám mây', searchPlaceholder: 'Tìm kiếm tệp...', + searchResult: 'Tìm {{searchResultsLength}} mục trong thư mục "{{folderName}}"', }, emptySearchResult: 'Không có vật phẩm nào được tìm thấy', notSupportedFileType: 'Loại tệp này không được hỗ trợ', emptyFolder: 'Thư mục này trống', resetKeywords: 'Đặt lại từ khóa', + notConnected: '{{name}} không được kết nối', + notConnectedTip: 'Để đồng bộ với {{name}}, trước tiên phải thiết lập kết nối với {{name}}.', + }, + credentialSelector: { + name: '{{credentialName}}\'s {{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { title: 'Sự xác nhận', @@ -149,6 +160,7 @@ const translation = { editPipelineInfo: 'Chỉnh sửa thông tin quy trình', knowledgeNameAndIconPlaceholder: 'Vui lòng nhập tên của Cơ sở kiến thức', knowledgeDescriptionPlaceholder: 'Mô tả những gì có trong Cơ sở kiến thức này. Mô tả chi tiết cho phép AI truy cập nội dung của tập dữ liệu chính xác hơn. Nếu trống, Dify sẽ sử dụng chiến lược hit mặc định. (Tùy chọn)', + configurationTip: 'Cấu hình {{pluginName}}', } export default translation diff --git a/web/i18n/vi-VN/dataset.ts b/web/i18n/vi-VN/dataset.ts index 7248ecdcaa..2b609139b8 100644 --- a/web/i18n/vi-VN/dataset.ts +++ b/web/i18n/vi-VN/dataset.ts @@ -234,6 +234,10 @@ const translation = { disabled: 'Vô hiệu hóa', title: 'Giao diện lập trình dịch vụ', }, + docAllEnabled_one: 'Tài liệu {{count}} đã được kích hoạt', + docAllEnabled_other: 'Tất cả các tài liệu {{count}} đã được kích hoạt', + partialEnabled_one: 'Tổng cộng {{count}} tài liệu, {{num}} có sẵn', + partialEnabled_other: 'Tổng cộng {{count}} tài liệu, {{num}} có sẵn', } export default translation diff --git a/web/i18n/vi-VN/education.ts b/web/i18n/vi-VN/education.ts index 503887af45..5dfe1c0a14 100644 --- a/web/i18n/vi-VN/education.ts +++ b/web/i18n/vi-VN/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: 'Đừng lo — điều này sẽ không ảnh hưởng đến gói đăng ký hiện tại của bạn, nhưng bạn sẽ không nhận được giảm giá giáo dục khi nó tự động gia hạn trừ khi bạn xác minh lại trạng thái của mình.', + title: 'Tình trạng giáo dục của bạn sẽ hết hạn vào {{date}}', }, stillInEducation: { title: 'Vẫn đang học tập?', diff --git a/web/i18n/vi-VN/pipeline.ts b/web/i18n/vi-VN/pipeline.ts index 9ed178b44e..e66fe0bf78 100644 --- a/web/i18n/vi-VN/pipeline.ts +++ b/web/i18n/vi-VN/pipeline.ts @@ -28,10 +28,12 @@ const translation = { loading: 'Xử lý... Hãy chờ', error: 'Lỗi xảy ra trong quá trình thực thi', viewDetails: 'Xem chi tiết', + footerTip: 'Trong chế độ chạy thử, xem trước tối đa {{count}} phần', }, }, ragToolSuggestions: { title: 'Gợi ý cho RAG', + noRecommendationPlugins: 'Không có plugin được đề xuất, tìm thêm trong Chợ', }, } diff --git a/web/i18n/vi-VN/plugin-trigger.ts b/web/i18n/vi-VN/plugin-trigger.ts new file mode 100644 index 0000000000..e164486e30 --- /dev/null +++ b/web/i18n/vi-VN/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: 'Đăng ký', + listNum: 'Đăng ký {{num}}', + empty: { + title: 'Không có đăng ký', + button: 'Đăng ký mới', + }, + createButton: { + oauth: 'Đăng ký mới với OAuth', + apiKey: 'Đăng ký mới với Khóa API', + manual: 'Dán URL để tạo đăng ký mới', + }, + createSuccess: 'Đăng ký đã được tạo thành công', + createFailed: 'Tạo đăng ký thất bại', + maxCount: 'Tối đa {{num}} lượt đăng ký', + selectPlaceholder: 'Chọn gói đăng ký', + noSubscriptionSelected: 'Chưa chọn gói đăng ký', + subscriptionRemoved: 'Đã hủy đăng ký', + list: { + title: 'Đăng ký', + addButton: 'Thêm', + tip: 'Nhận sự kiện qua Đăng ký', + item: { + enabled: 'Đã bật', + disabled: 'Vô hiệu hóa', + credentialType: { + api_key: 'Khóa API', + oauth2: 'OAuth', + unauthorized: 'Hướng dẫn', + }, + actions: { + delete: 'Xóa', + deleteConfirm: { + title: 'Xóa {{name}}?', + success: 'Đăng ký {{name}} đã được xóa thành công', + error: 'Không thể xóa đăng ký {{name}}', + content: 'Một khi đã xóa, gói đăng ký này sẽ không thể phục hồi. Vui lòng xác nhận.', + contentWithApps: 'Gói đăng ký hiện tại đang được {{count}} ứng dụng tham chiếu. Xóa nó sẽ khiến các ứng dụng đã cấu hình ngừng nhận các sự kiện từ gói đăng ký.', + confirm: 'Xác nhận xóa', + cancel: 'Hủy', + confirmInputWarning: 'Vui lòng nhập tên chính xác để xác nhận.', + confirmInputPlaceholder: 'Nhập "{{name}}" để xác nhận.', + confirmInputTip: 'Vui lòng nhập “{{name}}” để xác nhận.', + }, + }, + status: { + active: 'Hoạt động', + inactive: 'Không hoạt động', + }, + usedByNum: 'Được sử dụng bởi {{num}} quy trình làm việc', + noUsed: 'Không sử dụng quy trình công việc', + }, + }, + addType: { + title: 'Thêm đăng ký', + description: 'Chọn cách bạn muốn tạo đăng ký trình kích hoạt của mình', + options: { + apikey: { + title: 'Tạo bằng Khóa API', + description: 'Tự động tạo đăng ký bằng thông tin xác thực API', + }, + oauth: { + title: 'Tạo bằng OAuth', + description: 'Ủy quyền với nền tảng bên thứ ba để tạo đăng ký', + clientSettings: 'Cài đặt khách hàng OAuth', + clientTitle: 'Khách hàng OAuth', + default: 'Mặc định', + custom: 'Tùy chỉnh', + }, + manual: { + title: 'Cài đặt thủ công', + description: 'Dán URL để tạo đăng ký mới', + tip: 'Cấu hình URL trên nền tảng của bên thứ ba thủ công', + }, + }, + }, + }, + modal: { + steps: { + verify: 'Xác minh', + configuration: 'Cấu hình', + }, + common: { + cancel: 'Hủy', + back: 'Quay lại', + next: 'Tiếp theo', + create: 'Tạo', + verify: 'Xác minh', + authorize: 'Ủy quyền', + creating: 'Đang tạo...', + verifying: 'Đang xác minh...', + authorizing: 'Đang cấp quyền...', + }, + oauthRedirectInfo: 'Vì không tìm thấy bí mật khách hàng hệ thống cho nhà cung cấp công cụ này, cần phải thiết lập thủ công, đối với redirect_uri, vui lòng sử dụng', + apiKey: { + title: 'Tạo bằng Khóa API', + verify: { + title: 'Xác minh thông tin đăng nhập', + description: 'Vui lòng cung cấp thông tin xác thực API của bạn để xác minh quyền truy cập', + error: 'Xác minh thông tin không thành công. Vui lòng kiểm tra lại khóa API của bạn.', + success: 'Thông tin đăng nhập đã được xác minh thành công', + }, + configuration: { + title: 'Cấu hình đăng ký', + description: 'Thiết lập các tham số đăng ký của bạn', + }, + }, + oauth: { + title: 'Tạo bằng OAuth', + authorization: { + title: 'Ủy quyền OAuth', + description: 'Cho phép Dify truy cập vào tài khoản của bạn', + redirectUrl: 'Chuyển hướng URL', + redirectUrlHelp: 'Sử dụng URL này trong cấu hình ứng dụng OAuth của bạn', + authorizeButton: 'Ủy quyền với {{provider}}', + waitingAuth: 'Đang chờ cấp quyền...', + authSuccess: 'Ủy quyền thành công', + authFailed: 'Không thể lấy thông tin xác thực OAuth', + waitingJump: 'Được phép, đang chờ nhảy', + }, + configuration: { + title: 'Cấu hình đăng ký', + description: 'Thiết lập các thông số đăng ký của bạn sau khi được cấp quyền', + success: 'Cấu hình OAuth thành công', + failed: 'Cấu hình OAuth thất bại', + }, + remove: { + success: 'Xóa OAuth thành công', + failed: 'Xóa OAuth thất bại', + }, + save: { + success: 'Cấu hình OAuth đã được lưu thành công', + }, + }, + manual: { + title: 'Cài đặt thủ công', + description: 'Cấu hình đăng ký webhook của bạn thủ công', + logs: { + title: 'Nhật ký yêu cầu', + request: 'Yêu cầu', + loading: 'Đang chờ yêu cầu từ {{pluginName}}...', + }, + }, + form: { + subscriptionName: { + label: 'Tên thuê bao', + placeholder: 'Nhập tên gói đăng ký', + required: 'Tên đăng ký là bắt buộc', + }, + callbackUrl: { + label: 'URL gọi lại', + description: 'URL này sẽ nhận các sự kiện webhook', + tooltip: 'Cung cấp một endpoint có thể truy cập công khai để nhận các yêu cầu gọi lại từ nhà cung cấp kích hoạt.', + placeholder: 'Đang tạo...', + privateAddressWarning: 'URL này có vẻ là một địa chỉ nội bộ, điều này có thể khiến các yêu cầu webhook thất bại. Bạn có thể thay đổi TRIGGER_URL sang một địa chỉ công khai.', + }, + }, + errors: { + createFailed: 'Tạo đăng ký thất bại', + verifyFailed: 'Xác minh thông tin đăng nhập thất bại', + authFailed: 'Ủy quyền thất bại', + networkError: 'Lỗi mạng, vui lòng thử lại', + }, + }, + events: { + title: 'Các sự kiện có sẵn', + description: 'Các sự kiện mà plugin kích hoạt này có thể đăng ký', + empty: 'Không có sự kiện nào', + event: 'Sự kiện', + events: 'Sự kiện', + actionNum: '{{num}} {{event}} ĐÃ BAO GỒM', + item: { + parameters: 'tham số {{count}}', + noParameters: 'Không có tham số', + }, + output: 'Đầu ra', + }, + node: { + status: { + warning: 'Ngắt kết nối', + }, + }, +} + +export default translation diff --git a/web/i18n/vi-VN/plugin.ts b/web/i18n/vi-VN/plugin.ts index 316bdee1b2..6eb4e9fbe5 100644 --- a/web/i18n/vi-VN/plugin.ts +++ b/web/i18n/vi-VN/plugin.ts @@ -7,6 +7,7 @@ const translation = { agents: 'Chiến lược đại lý', models: 'Mô hình', datasources: 'Nguồn dữ liệu', + triggers: 'Kích hoạt', }, categorySingle: { agent: 'Chiến lược đại lý', @@ -15,6 +16,7 @@ const translation = { model: 'Mẫu', bundle: 'Bó', datasource: 'Nguồn dữ liệu', + trigger: 'Kích hoạt', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { remove: 'Triệt', install: 'Cài đặt', checkUpdate: 'Kiểm tra cập nhật', + back: 'Quay lại', }, toolSelector: { descriptionPlaceholder: 'Mô tả ngắn gọn về mục đích của công cụ, ví dụ: lấy nhiệt độ cho một vị trí cụ thể.', @@ -306,6 +309,12 @@ const translation = { partialUPdate: 'Chỉ có {{num}} plugin sau đây sẽ tự động cập nhật', changeTimezone: 'Để thay đổi múi giờ, hãy vào Cài đặt', }, + readmeInfo: { + title: 'ĐỌC_TÔI', + needHelpCheckReadme: 'Cần giúp đỡ? Xem tệp README.', + noReadmeAvailable: 'Không có README', + failedToFetch: 'Không thể lấy README', + }, } export default translation diff --git a/web/i18n/vi-VN/workflow.ts b/web/i18n/vi-VN/workflow.ts index 4fe45a8cc6..6496e7adc1 100644 --- a/web/i18n/vi-VN/workflow.ts +++ b/web/i18n/vi-VN/workflow.ts @@ -113,6 +113,15 @@ const translation = { currentWorkflow: 'Quy trình làm việc hiện tại', currentView: 'Hiện tại View', moreActions: 'Hành động khác', + listening: 'Nghe', + chooseStartNodeToRun: 'Chọn nút bắt đầu để chạy', + runAllTriggers: 'Chạy tất cả các trình kích hoạt', + features: 'Tính năng', + featuresDescription: 'Cải thiện trải nghiệm người dùng trên ứng dụng web', + featuresDocLink: 'Tìm hiểu thêm', + needAdd: 'Phải thêm nút {{node}}', + needStartNode: 'Phải thêm ít nhất một nút bắt đầu', + workflowAsToolDisabledHint: 'Xuất bản quy trình làm việc mới nhất và đảm bảo một nút Nhập liệu Người dùng kết nối trước khi cấu hình nó như một công cụ.', }, env: { envPanelTitle: 'Biến Môi Trường', @@ -219,6 +228,7 @@ const translation = { rerankModelRequired: 'Trước khi bật Mô hình xếp hạng lại, vui lòng xác nhận rằng mô hình đã được định cấu hình thành công trong cài đặt.', noValidTool: '{{field}} không chọn công cụ hợp lệ nào', toolParameterRequired: '{{field}}: tham số [{{param}}] là bắt buộc', + startNodeRequired: 'Vui lòng thêm một nút bắt đầu trước {{operation}}', }, singleRun: { testRun: 'Chạy thử nghiệm ', @@ -250,6 +260,21 @@ const translation = { 'addAll': 'Thêm tất cả', 'sources': 'Nguồn', 'searchDataSource': 'Tìm kiếm nguồn dữ liệu', + 'start': 'Bắt đầu', + 'searchTrigger': 'Tìm kiếm kích hoạt...', + 'allTriggers': 'Tất cả các trình kích hoạt', + 'noPluginsFound': 'Không tìm thấy plugin nào', + 'requestToCommunity': 'Yêu cầu gửi đến cộng đồng', + 'featuredTools': 'Nổi bật', + 'showMoreFeatured': 'Hiển thị thêm', + 'showLessFeatured': 'Hiện ít hơn', + 'installed': 'Đã cài đặt', + 'pluginByAuthor': 'Bởi {{author}}', + 'usePlugin': 'Chọn công cụ', + 'hideActions': 'Ẩn công cụ', + 'noFeaturedPlugins': 'Khám phá thêm các công cụ trong Marketplace', + 'noFeaturedTriggers': 'Khám phá thêm các yếu tố kích hoạt trong Marketplace', + 'startDisabledTip': 'Nút kích hoạt và nút nhập liệu của người dùng là loại trừ lẫn nhau.', }, blocks: { 'start': 'Bắt đầu', @@ -276,6 +301,10 @@ const translation = { 'loop-start': 'Bắt đầu vòng lặp', 'datasource': 'Nguồn dữ liệu', 'knowledge-index': 'Cơ sở kiến thức', + 'originalStartNode': 'nút bắt đầu gốc', + 'trigger-schedule': 'Kích hoạt theo lịch', + 'trigger-webhook': 'Kích hoạt Webhook', + 'trigger-plugin': 'Kích hoạt Plugin', }, blocksAbout: { 'start': 'Định nghĩa các tham số ban đầu để khởi chạy quy trình làm việc', @@ -300,6 +329,9 @@ const translation = { 'loop-end': 'Tương đương với "dừng lại". Nút này không có các mục cấu hình. Khi thân vòng lặp đến nút này, vòng lặp sẽ kết thúc.', 'datasource': 'Nguồn dữ liệu Giới thiệu', 'knowledge-index': 'Cơ sở kiến thức về', + 'trigger-schedule': 'Trình kích hoạt quy trình làm việc theo thời gian bắt đầu các quy trình làm việc theo lịch', + 'trigger-webhook': 'Webhook Trigger nhận các yêu cầu HTTP từ các hệ thống bên thứ ba để tự động kích hoạt các quy trình làm việc.', + 'trigger-plugin': 'Kích hoạt tích hợp bên thứ ba khởi chạy quy trình từ các sự kiện trên nền tảng bên ngoài', }, operator: { zoomIn: 'Phóng to', @@ -340,6 +372,8 @@ const translation = { minimize: 'Thoát chế độ toàn màn hình', scrollToSelectedNode: 'Cuộn đến nút đã chọn', optional_and_hidden: '(tùy chọn & ẩn)', + goTo: 'Đi tới', + startNode: 'Nút Bắt đầu', }, nodes: { common: { @@ -787,6 +821,8 @@ const translation = { answerNodeWarningDesc: 'Cảnh báo chế độ song song: Các nút trả lời, bài tập biến hội thoại và các thao tác đọc/ghi liên tục trong các lần lặp có thể gây ra ngoại lệ.', parallelModeEnableDesc: 'Trong chế độ song song, các tác vụ trong các lần lặp hỗ trợ thực thi song song. Bạn có thể định cấu hình điều này trong bảng thuộc tính ở bên phải.', parallelModeUpper: 'CHẾ ĐỘ SONG SONG', + flattenOutput: 'Làm phẳng đầu ra', + flattenOutputDesc: 'Khi bật, nếu tất cả các kết quả vòng lặp là mảng, chúng sẽ được gộp thành một mảng duy nhất. Khi tắt, các kết quả sẽ giữ nguyên cấu trúc mảng lồng nhau.', }, note: { editor: { @@ -963,6 +999,144 @@ const translation = { embeddingModelIsInvalid: 'Mô hình nhúng không hợp lệ', rerankingModelIsInvalid: 'Mô hình xếp hạng lại không hợp lệ', }, + triggerPlugin: { + authorized: 'Được ủy quyền', + notConfigured: 'Chưa được cấu hình', + notAuthorized: 'Không được ủy quyền', + selectSubscription: 'Chọn gói đăng ký', + availableSubscriptions: 'Các gói đăng ký có sẵn', + addSubscription: 'Thêm đăng ký mới', + removeSubscription: 'Hủy đăng ký', + subscriptionRemoved: 'Đã hủy đăng ký thành công', + error: 'Lỗi', + configuration: 'Cấu hình', + remove: 'Xóa', + or: 'HOẶC', + useOAuth: 'Sử dụng OAuth', + useApiKey: 'Sử dụng Khóa API', + authenticationFailed: 'Xác thực thất bại', + authenticationSuccess: 'Xác thực thành công', + oauthConfigFailed: 'Cấu hình OAuth thất bại', + configureOAuthClient: 'Cấu hình Khách hàng OAuth', + oauthClientDescription: 'Cấu hình thông tin đăng nhập OAuth của khách hàng để kích hoạt xác thực', + oauthClientSaved: 'Cấu hình khách hàng OAuth đã được lưu thành công', + configureApiKey: 'Cấu hình Khóa API', + apiKeyDescription: 'Cấu hình thông tin xác thực khóa API để xác thực', + apiKeyConfigured: 'Khóa API đã được cấu hình thành công', + configurationFailed: 'Cấu hình thất bại', + failedToStart: 'Không thể bắt đầu quy trình xác thực', + credentialsVerified: 'Thông tin đăng nhập đã được xác minh thành công', + credentialVerificationFailed: 'Xác minh thông tin đăng nhập thất bại', + verifyAndContinue: 'Xác minh & Tiếp tục', + configureParameters: 'Cấu hình tham số', + parametersDescription: 'Cấu hình tham số và thuộc tính của bộ kích hoạt', + configurationComplete: 'Cấu hình hoàn tất', + configurationCompleteDescription: 'Bộ kích hoạt của bạn đã được cấu hình thành công', + configurationCompleteMessage: 'Cấu hình kích hoạt của bạn đã hoàn tất và sẵn sàng sử dụng.', + parameters: 'Tham số', + properties: 'Thuộc tính', + propertiesDescription: 'Các thuộc tính cấu hình bổ sung cho bộ kích hoạt này', + noConfigurationRequired: 'Không cần cấu hình thêm cho bộ kích hoạt này.', + subscriptionName: 'Tên thuê bao', + subscriptionNameDescription: 'Nhập tên duy nhất cho đăng ký kích hoạt này', + subscriptionNamePlaceholder: 'Nhập tên gói đăng ký...', + subscriptionNameRequired: 'Tên đăng ký là bắt buộc', + subscriptionRequired: 'Cần phải đăng ký', + }, + triggerSchedule: { + title: 'Lịch trình', + nodeTitle: 'Kích hoạt theo lịch', + notConfigured: 'Chưa được cấu hình', + useCronExpression: 'Sử dụng biểu thức cron', + useVisualPicker: 'Sử dụng trình chọn trực quan', + frequency: { + label: 'Tần suất', + hourly: 'Theo giờ', + daily: 'Hàng ngày', + weekly: 'Hàng tuần', + monthly: 'Hàng tháng', + }, + selectFrequency: 'Chọn tần suất', + frequencyLabel: 'Tần số', + nextExecution: 'Lần thi hành tiếp theo', + weekdays: 'Các ngày trong tuần', + time: 'Thời gian', + cronExpression: 'Biểu thức Cron', + nextExecutionTime: 'THỜI GIAN THỰC THI TIẾP THEO', + nextExecutionTimes: '5 lần thực thi tiếp theo', + startTime: 'Thời gian bắt đầu', + executeNow: 'Thực thi ngay', + selectDateTime: 'Chọn Ngày & Giờ', + hours: 'Giờ', + minutes: 'Phút', + onMinute: 'Trong một phút', + days: 'Ngày', + lastDay: 'Ngày cuối cùng', + lastDayTooltip: 'Không phải tất cả các tháng đều có 31 ngày. Sử dụng tùy chọn \'ngày cuối cùng\' để chọn ngày cuối cùng của mỗi tháng.', + mode: 'Chế độ', + timezone: 'Múi giờ', + visualConfig: 'Cấu hình trực quan', + monthlyDay: 'Ngày hàng tháng', + executionTime: 'Thời gian thực hiện', + invalidTimezone: 'Múi giờ không hợp lệ', + invalidCronExpression: 'Biểu thức cron không hợp lệ', + noValidExecutionTime: 'Không thể tính toán thời gian thực thi hợp lệ', + executionTimeCalculationError: 'Không thể tính toán thời gian thực thi', + invalidFrequency: 'Tần số không hợp lệ', + invalidStartTime: 'Thời gian bắt đầu không hợp lệ', + startTimeMustBeFuture: 'Thời gian bắt đầu phải là trong tương lai', + invalidTimeFormat: 'Định dạng giờ không hợp lệ (dự kiến HH:MM SA/CH)}', + invalidWeekday: 'Ngày trong tuần không hợp lệ: {{weekday}}', + invalidMonthlyDay: 'Ngày trong tháng phải nằm giữa 1-31 hoặc là "cuối cùng"', + invalidOnMinute: 'Phút phải nằm trong khoảng từ 0 đến 59', + invalidExecutionTime: 'Thời gian thực thi không hợp lệ', + executionTimeMustBeFuture: 'Thời gian thực thi phải nằm trong tương lai', + }, + triggerWebhook: { + title: 'Kích hoạt Webhook', + nodeTitle: '🔗 Kích hoạt Webhook', + configPlaceholder: 'Cấu hình kích hoạt webhook sẽ được thực hiện ở đây', + webhookUrl: 'URL Webhook', + webhookUrlPlaceholder: 'Nhấp vào tạo để tạo URL webhook', + generate: 'Tạo', + copy: 'Sao chép', + test: 'Kiểm tra', + urlGenerated: 'Đã tạo URL webhook thành công', + urlGenerationFailed: 'Không thể tạo URL webhook', + urlCopied: 'Đã sao chép URL vào bộ nhớ tạm', + method: 'Phương pháp', + contentType: 'Loại Nội Dung', + queryParameters: 'Tham số truy vấn', + headerParameters: 'Tham số tiêu đề', + requestBodyParameters: 'Tham số trong thân yêu cầu', + parameterName: 'Tên biến', + varName: 'Tên biến', + varType: 'Loại', + varNamePlaceholder: 'Nhập tên biến...', + required: 'Bắt buộc', + addParameter: 'Thêm', + addHeader: 'Thêm', + noParameters: 'Chưa cấu hình tham số nào', + noQueryParameters: 'Chưa cấu hình tham số truy vấn', + noHeaders: 'Chưa cấu hình tiêu đề', + noBodyParameters: 'Chưa cấu hình tham số thân', + debugUrlTitle: 'Đối với các lần chạy thử, luôn sử dụng URL này', + debugUrlCopy: 'Nhấn để sao chép', + debugUrlCopied: 'Đã sao chép!', + debugUrlPrivateAddressWarning: 'URL này dường như là một địa chỉ nội bộ, điều này có thể khiến các yêu cầu webhook không thành công. Bạn có thể thay đổi TRIGGER_URL thành một địa chỉ công khai.', + errorHandling: 'Xử lý lỗi', + errorStrategy: 'Xử lý lỗi', + responseConfiguration: 'Phản hồi', + asyncMode: 'Chế độ không đồng bộ', + statusCode: 'Mã trạng thái', + responseBody: 'Nội dung phản hồi', + responseBodyPlaceholder: 'Viết nội dung phản hồi của bạn ở đây', + headers: 'Tiêu đề', + validation: { + webhookUrlRequired: 'Cần có URL Webhook', + invalidParameterType: 'Loại tham số không hợp lệ "{{type}}" cho tham số "{{name}}"', + }, + }, }, tracing: { stopBy: 'Dừng bởi {{user}}', @@ -1037,6 +1211,18 @@ const translation = { exportToolTip: 'Xuất biến dưới dạng tệp', largeData: 'Dữ liệu lớn, xem trước chỉ đọc. Xuất để xem tất cả.', largeDataNoExport: 'Dữ liệu lớn - chỉ xem trước một phần', + listening: { + title: 'Đang lắng nghe các sự kiện từ các kích hoạt...', + tip: 'Bạn giờ có thể mô phỏng các trình kích hoạt sự kiện bằng cách gửi các yêu cầu thử nghiệm tới điểm cuối HTTP {{nodeName}} hoặc sử dụng nó như một URL phản hồi để gỡ lỗi sự kiện trực tiếp. Tất cả các kết quả đầu ra có thể được xem trực tiếp trong Trình Kiểm tra Biến.', + tipPlugin: 'Bây giờ bạn có thể tạo các sự kiện trong {{- pluginName}} và lấy kết quả từ các sự kiện này trong Trình kiểm tra Biến.', + tipSchedule: 'Lắng nghe sự kiện từ các tác nhân kích hoạt theo lịch. Chạy theo lịch tiếp theo: {{nextTriggerTime}}', + tipFallback: 'Chờ các sự kiện kích hoạt đến. Các kết quả sẽ xuất hiện ở đây.', + defaultNodeName: 'cái nút kích hoạt này', + defaultPluginName: 'plugin này kích hoạt', + defaultScheduleTime: 'Chưa được cấu hình', + selectedTriggers: 'cac trình kích hoạt đã chọn', + stopButton: 'Dừng lại', + }, }, settingsTab: 'Cài đặt', lastRunTab: 'Chạy Lần Cuối', @@ -1054,11 +1240,52 @@ const translation = { copyLastRun: 'Sao chép lần chạy cuối', copyLastRunError: 'Không thể sao chép đầu vào của lần chạy trước', lastOutput: 'Đầu ra cuối cùng', + lastRunInputsCopied: '{{count}} đầu vào đã được sao chép từ lần chạy trước', }, sidebar: { exportWarning: 'Xuất Phiên Bản Đã Lưu Hiện Tại', exportWarningDesc: 'Điều này sẽ xuất phiên bản hiện tại đã được lưu của quy trình làm việc của bạn. Nếu bạn có những thay đổi chưa được lưu trong trình soạn thảo, vui lòng lưu chúng trước bằng cách sử dụng tùy chọn xuất trong bản vẽ quy trình.', }, + publishLimit: { + startNodeTitlePrefix: 'Nâng cấp lên', + startNodeTitleSuffix: 'mở khóa số lần kích hoạt không giới hạn cho mỗi quy trình làm việc', + startNodeDesc: 'Bạn đã đạt giới hạn 2 trình kích hoạt cho mỗi quy trình làm việc trong gói này. Nâng cấp để xuất bản quy trình làm việc này.', + }, + error: { + startNodeRequired: 'Vui lòng thêm một nút bắt đầu trước {{operation}}', + operations: { + connectingNodes: 'kết nối các nút', + addingNodes: 'thêm nút', + modifyingWorkflow: 'chỉnh sửa quy trình công việc', + updatingWorkflow: 'cập nhật quy trình công việc', + }, + }, + customWebhook: 'Webhook Tùy Chỉnh', + difyTeam: 'Đội ngũ Dify', + triggerStatus: { + enabled: 'KÍCH HOẠT', + disabled: 'KÍCH HOẠT • VÔ HIỆU HÓA', + }, + entryNodeStatus: { + enabled: 'BẮT ĐẦU', + disabled: 'BẮT ĐẦU • VÔ HIỆU HÓA', + }, + onboarding: { + title: 'Chọn một nút bắt đầu để bắt đầu', + description: 'Các nút bắt đầu khác nhau có những khả năng khác nhau. Đừng lo, bạn luôn có thể thay đổi chúng sau này.', + userInputFull: 'Nhập người dùng (nút bắt đầu gốc)', + userInputDescription: 'Nút bắt đầu cho phép thiết lập các biến nhập liệu của người dùng, với ứng dụng web, API dịch vụ, máy chủ MCP và quy trình làm việc như các khả năng công cụ.', + trigger: 'Kích hoạt', + triggerDescription: 'Các trình kích hoạt có thể hoạt động như nút bắt đầu của một quy trình làm việc, chẳng hạn như tác vụ theo lịch, webhook tùy chỉnh hoặc tích hợp với các ứng dụng khác.', + back: 'Quay lại', + learnMore: 'Tìm hiểu thêm', + aboutStartNode: 'về nút bắt đầu.', + escTip: { + press: 'Báo chí', + key: 'thoát', + toDismiss: 'sa thải', + }, + }, } export default translation diff --git a/web/i18n/zh-Hans/workflow.ts b/web/i18n/zh-Hans/workflow.ts index 792ffc7842..1228a5c8a8 100644 --- a/web/i18n/zh-Hans/workflow.ts +++ b/web/i18n/zh-Hans/workflow.ts @@ -11,6 +11,7 @@ const translation = { publishUpdate: '发布更新', run: '测试运行', running: '运行中', + listening: '监听中', chooseStartNodeToRun: '选择启动节点进行运行', runAllTriggers: '运行所有触发器', inRunMode: '在运行模式中', @@ -1095,7 +1096,6 @@ const translation = { varName: '变量名', varType: '类型', varNamePlaceholder: '输入变量名...', - headerName: '变量名', required: '必填', addParameter: '添加', addHeader: '添加', @@ -1118,6 +1118,7 @@ const translation = { webhookUrlRequired: '需要提供Webhook URL', invalidParameterType: '参数"{{name}}"的参数类型"{{type}}"无效', }, + debugUrlPrivateAddressWarning: '此 URL 似乎是内部地址,可能导致 webhook 请求失败。您可以将 TRIGGER_URL 更改为公共地址。', }, triggerPlugin: { authorized: '已授权', @@ -1156,6 +1157,12 @@ const translation = { subscriptionNamePlaceholder: '输入订阅名称...', subscriptionNameRequired: '订阅名称是必需的', subscriptionRequired: '需要配置订阅', + notAuthorized: '未授权', + selectSubscription: '选择订阅', + availableSubscriptions: '可用订阅', + addSubscription: '添加新订阅', + removeSubscription: '取消订阅', + subscriptionRemoved: '订阅已成功取消', }, }, tracing: { diff --git a/web/i18n/zh-Hant/app-debug.ts b/web/i18n/zh-Hant/app-debug.ts index aa636e424d..b66fcb9816 100644 --- a/web/i18n/zh-Hant/app-debug.ts +++ b/web/i18n/zh-Hant/app-debug.ts @@ -292,7 +292,6 @@ const translation = { 'required': '必填', 'hide': '隱藏', 'errorMsg': { - varNameRequired: '變數名稱必填', labelNameRequired: '顯示名稱必填', varNameCanBeRepeat: '變數名稱不能重複', atLeastOneOption: '至少需要一個選項', @@ -328,6 +327,7 @@ const translation = { 'localUpload': '本地上傳', 'single-file': '單個檔', 'maxNumberOfUploads': '最大上傳次數', + 'maxNumberTip': '文件 < {{docLimit}}, 圖片 < {{imgLimit}}, 音訊 < {{audioLimit}}, 影片 < {{videoLimit}}', 'checkbox': '核取方塊', 'optional': '可選的', 'jsonSchema': 'JSON Schema', diff --git a/web/i18n/zh-Hant/app-log.ts b/web/i18n/zh-Hant/app-log.ts index 7b3f33c3bc..6873eece96 100644 --- a/web/i18n/zh-Hant/app-log.ts +++ b/web/i18n/zh-Hant/app-log.ts @@ -19,6 +19,7 @@ const translation = { tokens: 'TOKENS', user: '使用者或賬戶', version: '版本', + triggered_from: '由…觸發', }, pagination: { previous: '上一頁', @@ -97,6 +98,15 @@ const translation = { finalProcessing: '最終處理', }, dateFormat: '月/日/年', + triggerBy: { + debugging: '除錯', + appRun: '網頁應用程式', + webhook: 'Webhook', + schedule: '時間表', + plugin: '插件', + ragPipelineRun: 'RAG 流程', + ragPipelineDebugging: 'RAG 除錯', + }, } export default translation diff --git a/web/i18n/zh-Hant/app-overview.ts b/web/i18n/zh-Hant/app-overview.ts index 5bd8203171..cbf2d15ff9 100644 --- a/web/i18n/zh-Hant/app-overview.ts +++ b/web/i18n/zh-Hant/app-overview.ts @@ -114,7 +114,11 @@ const translation = { }, }, launch: '發射', - enableTooltip: {}, + enableTooltip: { + description: '要啟用此功能,請在畫布上添加一個使用者輸入節點。(可能草稿中已存在,發布後生效)', + learnMore: '了解更多', + }, + title: '網頁應用程式', }, apiInfo: { title: '後端服務 API', @@ -126,7 +130,14 @@ const translation = { running: '執行中', disable: '已停用', }, - triggerInfo: {}, + triggerInfo: { + title: '觸發因素', + explanation: '工作流程觸發管理', + triggersAdded: '{{count}} 已新增觸發器', + noTriggerAdded: '未添加觸發器', + triggerStatusDescription: '觸發節點狀態將顯示於此。(可能已存在於草稿中,發布後生效)', + learnAboutTriggers: '了解觸發因素', + }, disableTooltip: { triggerMode: '觸發節點模式不支援 {{feature}} 功能。', }, diff --git a/web/i18n/zh-Hant/billing.ts b/web/i18n/zh-Hant/billing.ts index 5a8d13ff66..b56d02eaa3 100644 --- a/web/i18n/zh-Hant/billing.ts +++ b/web/i18n/zh-Hant/billing.ts @@ -98,6 +98,8 @@ const translation = { triggerEvents: { unlimited: '無限觸發事件', tooltip: '透過插件、排程或 Webhook 觸發器自動啟動工作流程的事件數量。', + sandbox: '{{count,number}} 觸發事件', + professional: '{{count,number}} 觸發事件/月', }, workflowExecution: { standard: '標準工作流程執行', @@ -107,6 +109,11 @@ const translation = { }, startNodes: { unlimited: '無限觸發器/工作流程', + limited: '最多 {{count}} 個觸發器/工作流程', + }, + title: { + plans: '計劃', + description: '選擇最適合您團隊需求的方案。', }, }, plans: { @@ -129,16 +136,14 @@ const translation = { name: 'Enterprise', description: '獲得大規模關鍵任務系統的完整功能和支援。', includesTitle: 'Team 計劃中的一切,加上:', - features: { - }, + features: ['企業級可擴展部署解決方案', '商業許可授權', '專屬企業功能', '多工作區與企業管理', '單一登入', '由 Dify 合作夥伴協商的服務水平協議', '進階安全與控制', 'Dify 官方的更新與維護', '專業技術支援'], price: '自訂', btnText: '聯繫銷售', priceTip: '年度計費のみ', for: '適用於大規模團隊', }, community: { - features: { - }, + features: ['所有核心功能已在公共存儲庫中釋出', '單一工作區', '符合 Dify 開源授權'], includesTitle: '免費功能:', btnText: '開始使用社區', name: '社區', @@ -147,8 +152,7 @@ const translation = { price: '免費', }, premium: { - features: { - }, + features: ['由各雲端服務提供商自主管理的可靠性', '單一工作區', 'WebApp 標誌與品牌自訂', '優先電子郵件與聊天支援'], for: '適用於中型組織和團隊', comingSoon: '微軟 Azure 與 Google Cloud 支持即將推出', priceTip: '根據雲端市場', @@ -184,6 +188,7 @@ const translation = { teamMembers: '團隊成員', perMonth: '每月', triggerEvents: '觸發事件', + resetsIn: '{{count,number}} 天後重置', }, teamMembers: '團隊成員', triggerLimitModal: { diff --git a/web/i18n/zh-Hant/common.ts b/web/i18n/zh-Hant/common.ts index 51cdcf8a0b..cbcdea4462 100644 --- a/web/i18n/zh-Hant/common.ts +++ b/web/i18n/zh-Hant/common.ts @@ -65,10 +65,17 @@ const translation = { confirmAction: '請確認您的操作。', deleteConfirmTitle: '刪除?', no: '不', + noSearchResults: '未找到 {{content}}', + resetKeywords: '重置關鍵字', + selectCount: '{{count}} 已選', + searchCount: '找到 {{count}} {{content}}', + noSearchCount: '0 {{content}}', + now: '現在', }, placeholder: { input: '請輸入', select: '請選擇', + search: '搜尋...', }, voice: { language: { @@ -161,7 +168,6 @@ const translation = { workspace: '工作空間', createWorkspace: '建立工作空間', helpCenter: '查看幫助文件', - communityFeedback: '使用者反饋', roadmap: '路線圖', community: '社群', about: '關於', @@ -770,6 +776,13 @@ const translation = { label: { optional: '(選用)', }, + noData: '無資料', + dynamicSelect: { + error: '載入選項失敗', + noData: '沒有可用選項', + loading: '正在載入選項...', + selected: '{{count}} 已選擇', + }, } export default translation diff --git a/web/i18n/zh-Hant/dataset-documents.ts b/web/i18n/zh-Hant/dataset-documents.ts index f37490e674..b5d7ced4d1 100644 --- a/web/i18n/zh-Hant/dataset-documents.ts +++ b/web/i18n/zh-Hant/dataset-documents.ts @@ -81,7 +81,10 @@ const translation = { }, addUrl: '新增 URL', learnMore: '瞭解更多資訊', - sort: {}, + sort: { + uploadTime: '上傳時間', + hitCount: '檢索次數', + }, }, metadata: { title: '元資料', diff --git a/web/i18n/zh-Hant/dataset-pipeline.ts b/web/i18n/zh-Hant/dataset-pipeline.ts index 5dc287a7c9..f1c8157c22 100644 --- a/web/i18n/zh-Hant/dataset-pipeline.ts +++ b/web/i18n/zh-Hant/dataset-pipeline.ts @@ -34,6 +34,7 @@ const translation = { publishPipeline: { success: { message: '知識流水線已發布', + tip: '前往文件以新增或管理文件。', }, error: { message: '無法發佈知識流水線', @@ -56,6 +57,7 @@ const translation = { details: { structureTooltip: '區塊結構會決定文件的分割和索引方式 (提供一般、父子和問答模式),而且每個知識庫都是唯一的。', structure: '建築物', + createdBy: '由 {{author}}', }, testRun: { steps: { @@ -112,23 +114,32 @@ const translation = { title: '新增文件', characters: '角色', backToDataSource: '資料來源', + selectOnlineDocumentTip: '處理最多 {{count}} 頁', + selectOnlineDriveTip: '處理最多 {{count}} 個檔案,每個檔案最大 {{fileSize}} MB', }, documentSettings: { title: '文件設定', }, - onlineDocument: {}, + onlineDocument: { + pageSelectorTitle: '{{name}} 頁', + }, onlineDrive: { breadcrumbs: { allBuckets: '所有雲端儲存貯體', searchPlaceholder: '搜尋檔案...', allFiles: '所有檔案', + searchResult: '在「{{folderName}}」資料夾中找到 {{searchResultsLength}} 項目', }, resetKeywords: '重設關鍵字', notSupportedFileType: '不支援此檔案類型', emptySearchResult: '沒有找到任何物品', emptyFolder: '此資料夾是空的', + notConnected: '{{name}} 未連接', + notConnectedTip: '要與 {{name}} 同步,必須先建立與 {{name}} 的連線。', + }, + credentialSelector: { + name: '{{credentialName}}的{{pluginName}}', }, - credentialSelector: {}, conversion: { confirm: { title: '證實', @@ -149,6 +160,7 @@ const translation = { inputField: '輸入欄位', knowledgePermissions: '權限', editPipelineInfo: '編輯管線資訊', + configurationTip: '配置 {{pluginName}}', } export default translation diff --git a/web/i18n/zh-Hant/dataset.ts b/web/i18n/zh-Hant/dataset.ts index 2f9cbc4eff..d508c9be19 100644 --- a/web/i18n/zh-Hant/dataset.ts +++ b/web/i18n/zh-Hant/dataset.ts @@ -234,6 +234,10 @@ const translation = { title: '服務 API', disabled: '已停用', }, + docAllEnabled_one: '{{count}} 文件已啟用', + docAllEnabled_other: '所有 {{count}} 文件已啟用', + partialEnabled_one: '共 {{count}} 份文件,{{num}} 份可用', + partialEnabled_other: '共 {{count}} 份文件,{{num}} 份可用', } export default translation diff --git a/web/i18n/zh-Hant/education.ts b/web/i18n/zh-Hant/education.ts index 36197996e0..49e97155d6 100644 --- a/web/i18n/zh-Hant/education.ts +++ b/web/i18n/zh-Hant/education.ts @@ -52,6 +52,7 @@ const translation = { }, isAboutToExpire: { summary: '別擔心 — 這不會影響你當前的訂閱,但當它續訂時,如果你沒有重新確認你的身份,你將不會獲得教育折扣。', + title: '您的教育狀態將於 {{date}} 到期', }, stillInEducation: { title: '仍在接受教育嗎?', diff --git a/web/i18n/zh-Hant/pipeline.ts b/web/i18n/zh-Hant/pipeline.ts index df434a9fad..26c08768d4 100644 --- a/web/i18n/zh-Hant/pipeline.ts +++ b/web/i18n/zh-Hant/pipeline.ts @@ -28,10 +28,12 @@ const translation = { viewDetails: '查看詳情', error: '執行期間發生錯誤', loading: '處理中...請稍候', + footerTip: '在測試運行模式下,可預覽最多 {{count}} 個區塊', }, }, ragToolSuggestions: { title: 'RAG 的建議', + noRecommendationPlugins: '沒有推薦的插件,請在 市場 中尋找更多', }, } diff --git a/web/i18n/zh-Hant/plugin-trigger.ts b/web/i18n/zh-Hant/plugin-trigger.ts new file mode 100644 index 0000000000..c5c7012be7 --- /dev/null +++ b/web/i18n/zh-Hant/plugin-trigger.ts @@ -0,0 +1,186 @@ +const translation = { + subscription: { + title: '訂閱', + listNum: '{{num}} 訂閱', + empty: { + title: '無訂閱', + button: '新訂閱', + }, + createButton: { + oauth: '使用 OAuth 的新訂閱', + apiKey: '使用 API 金鑰的新訂閱', + manual: '貼上網址以建立新訂閱', + }, + createSuccess: '訂閱已成功建立', + createFailed: '建立訂閱失敗', + maxCount: '最多 {{num}} 訂閱', + selectPlaceholder: '選擇訂閱', + noSubscriptionSelected: '未選擇訂閱', + subscriptionRemoved: '已取消訂閱', + list: { + title: '訂閱', + addButton: '添加', + tip: '透過訂閱接收事件', + item: { + enabled: '已啟用', + disabled: '已停用', + credentialType: { + api_key: 'API 金鑰', + oauth2: 'OAuth', + unauthorized: '手冊', + }, + actions: { + delete: '刪除', + deleteConfirm: { + title: '刪除 {{name}}?', + success: '訂閱 {{name}} 已成功刪除', + error: '無法刪除訂閱 {{name}}', + content: '一旦刪除,此訂閱將無法恢復。請確認。', + contentWithApps: '當前訂閱被 {{count}} 個應用程式引用。刪除它將導致已配置的應用程式停止接收訂閱事件。', + confirm: '確認刪除', + cancel: '取消', + confirmInputWarning: '請輸入正確的名稱以確認。', + confirmInputPlaceholder: '輸入「{{name}}」以確認。', + confirmInputTip: '請輸入「{{name}}」以確認。', + }, + }, + status: { + active: '活躍', + inactive: '未啟用', + }, + usedByNum: '被 {{num}} 工作流程使用', + noUsed: '未使用工作流程', + }, + }, + addType: { + title: '新增訂閱', + description: '選擇您想要建立觸發訂閱的方式', + options: { + apikey: { + title: '使用 API 金鑰創建', + description: '使用 API 憑證自動建立訂閱', + }, + oauth: { + title: '使用 OAuth 創建', + description: '授權第三方平台以建立訂閱', + clientSettings: 'OAuth 客戶端設定', + clientTitle: 'OAuth 用戶端', + default: '預設', + custom: '自訂', + }, + manual: { + title: '手動設定', + description: '貼上網址以建立新訂閱', + tip: '手動在第三方平台上配置 URL', + }, + }, + }, + }, + modal: { + steps: { + verify: '驗證', + configuration: '配置', + }, + common: { + cancel: '取消', + back: '返回', + next: '下一步', + create: '創建', + verify: '驗證', + authorize: '授權', + creating: '正在建立...', + verifying: '驗證中…', + authorizing: '授權中…', + }, + oauthRedirectInfo: '由於未找到此工具提供者的系統用戶端密鑰,需要手動設定,至於 redirect_uri,請使用', + apiKey: { + title: '使用 API 金鑰創建', + verify: { + title: '驗證憑證', + description: '請提供您的 API 憑證以驗證存取權限', + error: '憑證驗證失敗。請檢查您的 API 金鑰。', + success: '憑證驗證成功', + }, + configuration: { + title: '設定訂閱', + description: '設定您的訂閱參數', + }, + }, + oauth: { + title: '使用 OAuth 創建', + authorization: { + title: 'OAuth 授權', + description: '授權 Dify 存取您的帳戶', + redirectUrl: '重新導向網址', + redirectUrlHelp: '在您的 OAuth 應用程式設定中使用此 URL', + authorizeButton: '使用 {{provider}} 授權', + waitingAuth: '等待授權中...', + authSuccess: '授權成功', + authFailed: '無法取得 OAuth 認證資訊', + waitingJump: '已授權,等待起跳', + }, + configuration: { + title: '設定訂閱', + description: '授權後設定您的訂閱參數', + success: 'OAuth 配置成功', + failed: 'OAuth 配置失敗', + }, + remove: { + success: 'OAuth 移除成功', + failed: 'OAuth 移除失敗', + }, + save: { + success: 'OAuth 設定已成功保存', + }, + }, + manual: { + title: '手動設定', + description: '手動配置您的 Webhook 訂閱', + logs: { + title: '請求日誌', + request: '請求', + loading: '正在等待來自 {{pluginName}} 的請求...', + }, + }, + form: { + subscriptionName: { + label: '訂閱名稱', + placeholder: '輸入訂閱名稱', + required: '需要訂閱名稱', + }, + callbackUrl: { + label: '回呼網址', + description: '此 URL 將接收 webhook 事件', + tooltip: '提供一個可公開訪問的端點,以接收來自觸發提供者的回調請求。', + placeholder: '生成中...', + privateAddressWarning: '此 URL 似乎是內部位址,可能會導致 webhook 請求失敗。您可以將 TRIGGER_URL 更改為公開位址。', + }, + }, + errors: { + createFailed: '建立訂閱失敗', + verifyFailed: '驗證憑證失敗', + authFailed: '授權失敗', + networkError: '網絡錯誤,請再試一次', + }, + }, + events: { + title: '可用活動', + description: '此觸發插件可以訂閱的事件', + empty: '沒有可用的活動', + event: '活動', + events: '活動', + actionNum: '{{num}} {{event}} 已包含', + item: { + parameters: '{{count}} 參數', + noParameters: '無參數', + }, + output: '輸出', + }, + node: { + status: { + warning: '斷開連接', + }, + }, +} + +export default translation diff --git a/web/i18n/zh-Hant/plugin.ts b/web/i18n/zh-Hant/plugin.ts index ade3125a47..5ec8936257 100644 --- a/web/i18n/zh-Hant/plugin.ts +++ b/web/i18n/zh-Hant/plugin.ts @@ -7,6 +7,7 @@ const translation = { all: '都', bundles: '束', datasources: '資料來源', + triggers: '觸發因素', }, categorySingle: { model: '型', @@ -15,6 +16,7 @@ const translation = { tool: '工具', bundle: '捆', datasource: '資料來源', + trigger: '觸發器', }, list: { source: { @@ -45,6 +47,7 @@ const translation = { viewDetail: '查看詳情', update: '更新', checkUpdate: '檢查更新', + back: '返回', }, toolSelector: { uninstalledContent: '此插件是從 local/GitHub 儲存庫安裝的。請在安裝後使用。', @@ -306,6 +309,12 @@ const translation = { specifyPluginsToUpdate: '指定要更新的插件', changeTimezone: '要更改時區,請前往設定', }, + readmeInfo: { + title: '自述檔', + needHelpCheckReadme: '需要幫忙嗎?查看自述檔。', + noReadmeAvailable: '沒有可用的自述文件', + failedToFetch: '無法獲取 README', + }, } export default translation diff --git a/web/i18n/zh-Hant/workflow.ts b/web/i18n/zh-Hant/workflow.ts index a12f348f93..1e28cd1825 100644 --- a/web/i18n/zh-Hant/workflow.ts +++ b/web/i18n/zh-Hant/workflow.ts @@ -39,7 +39,6 @@ const translation = { maxTreeDepth: '每個分支最大限制 {{depth}} 個節點', needAdd: '必須新增{{node}}節點', needOutputNode: '必須新增輸出節點', - needEndNode: '必須新增結束節點', needAnswerNode: '必須新增直接回覆節點', workflowProcess: '工作流', notRunning: '尚未運行', @@ -115,6 +114,14 @@ const translation = { currentView: '當前檢視', currentWorkflow: '當前工作流程', moreActions: '更多動作', + listening: '聆聽', + chooseStartNodeToRun: '選擇要執行的起始節點', + runAllTriggers: '執行所有觸發器', + features: '功能', + featuresDescription: '提升網頁應用程式的使用者體驗', + featuresDocLink: '了解更多', + needStartNode: '至少必須新增一個起始節點', + workflowAsToolDisabledHint: '發布最新的工作流程,並確保在將其配置為工具之前有一個已連接的使用者輸入節點。', }, publishLimit: { startNodeTitlePrefix: '升級以', @@ -226,6 +233,7 @@ const translation = { rerankModelRequired: '在開啟 Rerank 模型之前,請在設置中確認模型配置成功。', toolParameterRequired: '{{field}}:参數 [{{param}}] 為必填項', noValidTool: '{{field}} 未選擇有效工具', + startNodeRequired: '請先新增一個起始節點,再執行 {{operation}}', }, singleRun: { testRun: '測試運行', @@ -261,6 +269,17 @@ const translation = { 'searchDataSource': '搜尋資料來源', 'noFeaturedPlugins': '前往 Marketplace 查看更多工具', 'noFeaturedTriggers': '前往 Marketplace 查看更多觸發器', + 'start': '開始', + 'noPluginsFound': '未找到任何插件', + 'requestToCommunity': '對社群的請求', + 'featuredTools': '精選', + 'showMoreFeatured': '顯示更多', + 'showLessFeatured': '顯示較少', + 'installed': '已安裝', + 'pluginByAuthor': '由 {{author}}', + 'usePlugin': '選取工具', + 'hideActions': '隱藏工具', + 'startDisabledTip': '觸發節點與使用者輸入節點是互斥的。', }, blocks: { 'start': '開始', @@ -287,6 +306,10 @@ const translation = { 'loop-end': '退出循環', 'knowledge-index': '知識庫', 'datasource': '資料來源', + 'originalStartNode': '原始起始節點', + 'trigger-schedule': '排程觸發', + 'trigger-webhook': 'Webhook 觸發', + 'trigger-plugin': '插件觸發器', }, blocksAbout: { 'start': '定義一個 workflow 流程啟動的參數', @@ -311,6 +334,9 @@ const translation = { 'loop': '執行邏輯迴圈,直到滿足終止條件或達到最大迴圈次數。', 'datasource': '資料來源 關於', 'knowledge-index': '知識庫 關於', + 'trigger-schedule': '基於時間的工作流程觸發器,可按計劃啟動工作流程', + 'trigger-webhook': 'Webhook 觸發器接收來自第三方系統的 HTTP 推送,以自動觸發工作流程。', + 'trigger-plugin': '第三方整合觸發器,從外部平台事件啟動工作流程', }, operator: { zoomIn: '放大', @@ -351,6 +377,8 @@ const translation = { maximize: '最大化畫布', scrollToSelectedNode: '捲動至選取的節點', optional_and_hidden: '(可選且隱藏)', + goTo: '前往', + startNode: '起始節點', }, nodes: { common: { @@ -798,6 +826,8 @@ const translation = { answerNodeWarningDesc: '並行模式警告:反覆運算中的應答節點、對話變數賦值和持久讀/寫操作可能會導致異常。', error_other: '{{count}}錯誤', MaxParallelismDesc: '最大並行度用於控制在單個反覆運算中同時執行的任務數。', + flattenOutput: '展平成輸出', + flattenOutputDesc: '啟用時,如果所有的迭代輸出都是陣列,它們將被展平成單一陣列。禁用時,輸出將保持巢狀陣列結構。', }, note: { editor: { @@ -974,6 +1004,144 @@ const translation = { rerankingModelIsInvalid: '重排序模型無效', embeddingModelIsInvalid: '嵌入模型無效', }, + triggerPlugin: { + authorized: '已授權', + notConfigured: '未設定', + notAuthorized: '未被授權', + selectSubscription: '選擇訂閱', + availableSubscriptions: '可用訂閱', + addSubscription: '新增訂閱', + removeSubscription: '取消訂閱', + subscriptionRemoved: '訂閱已成功移除', + error: '錯誤', + configuration: '配置', + remove: '移除', + or: '或', + useOAuth: '使用 OAuth', + useApiKey: '使用 API 金鑰', + authenticationFailed: '驗證失敗', + authenticationSuccess: '驗證成功', + oauthConfigFailed: 'OAuth 配置失敗', + configureOAuthClient: '配置 OAuth 客戶端', + oauthClientDescription: '配置 OAuth 客戶端憑證以啟用身份驗證', + oauthClientSaved: 'OAuth 用戶端設定已成功儲存', + configureApiKey: '配置 API 金鑰', + apiKeyDescription: '配置 API 金鑰憑證以進行身份驗證', + apiKeyConfigured: 'API 金鑰設定成功', + configurationFailed: '配置失敗', + failedToStart: '啟動驗證流程失敗', + credentialsVerified: '憑證驗證成功', + credentialVerificationFailed: '憑證驗證失敗', + verifyAndContinue: '驗證並繼續', + configureParameters: '配置參數', + parametersDescription: '配置觸發器參數和屬性', + configurationComplete: '配置完成', + configurationCompleteDescription: '您的觸發器已成功配置', + configurationCompleteMessage: '您的觸發器配置現已完成並可使用。', + parameters: '參數', + properties: '屬性', + propertiesDescription: '此觸發器的額外配置屬性', + noConfigurationRequired: '此觸發器無需額外配置。', + subscriptionName: '訂閱名稱', + subscriptionNameDescription: '為此觸發器訂閱輸入一個唯一名稱', + subscriptionNamePlaceholder: '輸入訂閱名稱...', + subscriptionNameRequired: '需要訂閱名稱', + subscriptionRequired: '需要訂閱', + }, + triggerSchedule: { + title: '時間表', + nodeTitle: '排程觸發', + notConfigured: '未配置', + useCronExpression: '使用 cron 表達式', + useVisualPicker: '使用視覺選擇器', + frequency: { + label: '頻率', + hourly: '每小時', + daily: '每日', + weekly: '每週', + monthly: '每月', + }, + selectFrequency: '選擇頻率', + frequencyLabel: '頻率', + nextExecution: '下一次執行', + weekdays: '平日', + time: '時間', + cronExpression: 'Cron 表達式', + nextExecutionTime: '下一次執行時間', + nextExecutionTimes: '接下來的 5 次執行時間', + startTime: '開始時間', + executeNow: '立即執行', + selectDateTime: '選擇日期和時間', + hours: '小時', + minutes: '分鐘', + onMinute: '在一分鐘內', + days: '天', + lastDay: '最後一天', + lastDayTooltip: '並非所有月份都有31天。使用「最後一天」選項來選擇每個月的最後一天。', + mode: '時尚', + timezone: '時區', + visualConfig: '視覺配置', + monthlyDay: '每月日', + executionTime: '執行時間', + invalidTimezone: '無效的時區', + invalidCronExpression: '無效的 cron 表達式', + noValidExecutionTime: '無法計算有效的執行時間', + executionTimeCalculationError: '無法計算執行時間', + invalidFrequency: '無效頻率', + invalidStartTime: '開始時間無效', + startTimeMustBeFuture: '開始時間必須是未來的時間', + invalidTimeFormat: '時間格式無效(預期為 HH:MM AM/PM)', + invalidWeekday: '無效的星期日:{{weekday}}', + invalidMonthlyDay: '每月日期必須在 1 到 31 之間或為「最後一天」', + invalidOnMinute: '分鐘必須介於 0 到 59 之間', + invalidExecutionTime: '無效的執行時間', + executionTimeMustBeFuture: '執行時間必須在未來', + }, + triggerWebhook: { + title: 'Webhook 觸發', + nodeTitle: '🔗 網路鉤子觸發', + configPlaceholder: 'Webhook 觸發配置將在此實施', + webhookUrl: 'Webhook 網址', + webhookUrlPlaceholder: '點擊生成以創建 webhook URL', + generate: '生成', + copy: '複製', + test: '測試', + urlGenerated: 'Webhook URL 已成功生成', + urlGenerationFailed: '無法生成網絡掛鉤 URL', + urlCopied: 'URL 已複製到剪貼簿', + method: '方法', + contentType: '內容類型', + queryParameters: '查詢參數', + headerParameters: '標頭參數', + requestBodyParameters: '請求主體參數', + parameterName: '變數名稱', + varName: '變數名稱', + varType: '類型', + varNamePlaceholder: '輸入變數名稱...', + required: '必填', + addParameter: '添加', + addHeader: '添加', + noParameters: '未設定任何參數', + noQueryParameters: '未配置查詢參數', + noHeaders: '未配置標頭', + noBodyParameters: '未配置任何正文參數', + debugUrlTitle: '在測試運行中,請始終使用此 URL', + debugUrlCopy: '點擊複製', + debugUrlCopied: '已複製!', + debugUrlPrivateAddressWarning: '此 URL 似乎是內部位址,可能會導致 webhook 請求失敗。您可以將 TRIGGER_URL 更改為公開位址。', + errorHandling: '錯誤處理', + errorStrategy: '錯誤處理', + responseConfiguration: '回應', + asyncMode: '非同步模式', + statusCode: '狀態碼', + responseBody: '回應正文', + responseBodyPlaceholder: '在這裡撰寫您的回覆內容', + headers: '標題', + validation: { + webhookUrlRequired: '需要 Webhook URL', + invalidParameterType: '參數 "{{name}}" 的類型 "{{type}}" 無效', + }, + }, }, tracing: { stopBy: '由{{user}}終止', @@ -1077,11 +1245,47 @@ const translation = { noMatchingInputsFound: '在上次運行中未找到匹配的輸入', noLastRunFound: '沒有找到之前的運行', lastOutput: '最後的輸出', + lastRunInputsCopied: '從上次運行複製的 {{count}} 個輸入', }, sidebar: { exportWarning: '導出當前保存的版本', exportWarningDesc: '這將導出當前保存的工作流程版本。如果您在編輯器中有未保存的更改,請先通過使用工作流程畫布中的導出選項來保存它們。', }, + error: { + startNodeRequired: '請先新增一個起始節點,再執行 {{operation}}', + operations: { + connectingNodes: '連接節點', + addingNodes: '新增節點', + modifyingWorkflow: '修改工作流程', + updatingWorkflow: '更新工作流程', + }, + }, + customWebhook: '自訂 Webhook', + difyTeam: 'Dify 團隊', + triggerStatus: { + enabled: '觸發', + disabled: '觸發器 • 已停用', + }, + entryNodeStatus: { + enabled: '開始', + disabled: '開始 • 已停用', + }, + onboarding: { + title: '選擇一個起始節點開始', + description: '不同的起始節點有不同的能力。別擔心,你之後總是可以更改它們。', + userInputFull: '使用者輸入(原始起始節點)', + userInputDescription: '啟動節點,允許設定使用者輸入變數,工具功能包括網頁應用程式、服務 API、MCP 伺服器和工作流程。', + trigger: '觸發器', + triggerDescription: '觸發器可以作為工作流程的起始節點,例如排程任務、自訂網絡掛鉤或與其他應用程式的整合。', + back: '返回', + learnMore: '了解更多', + aboutStartNode: '關於起始節點。', + escTip: { + press: '新聞媒體', + key: '取消', + toDismiss: '解僱', + }, + }, } export default translation