Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
065ce2a
feat: add IBM Accessibility Level 1 validation tracker and compliance…
deon-sanchez Jul 1, 2026
77ff778
feat(a11y): add IBM Accessibility Level 1 criteria and validation tra…
deon-sanchez Jul 1, 2026
6262d7e
feat(a11y): introduce a11y-spec-authoring skill for Playwright access…
deon-sanchez Jul 6, 2026
5bc604c
docs(a11y): update README for improved accessibility testing guidance
deon-sanchez Jul 6, 2026
a2cfe58
feat: enhance accessibility and localization in knowledge base compon…
deon-sanchez Jul 6, 2026
5d09a62
chore: update secrets baseline with new line numbers for hashed secre…
deon-sanchez Jul 6, 2026
39af62d
feat(a11y): introduce a11y-spec-authoring skill and enhance accessibi…
deon-sanchez Jul 7, 2026
cbeb7d6
feat(a11y): implement feature-specific accessibility rule suppression…
deon-sanchez Jul 7, 2026
1c1d324
merge: integrate ibm-a11y-tracker into kb-a11y
deon-sanchez Jul 7, 2026
0f7060d
Merge branch 'release-1.11.0' of https://github.com/langflow-ai/langf…
deon-sanchez Jul 7, 2026
6107988
chore: update secrets baseline and adjust line numbers for hashed sec…
deon-sanchez Jul 7, 2026
c1cd90f
feat(a11y): enhance keyboard navigation and accessibility in Knowledg…
deon-sanchez Jul 7, 2026
904dfb4
Merge branch 'release-1.11.0' of https://github.com/langflow-ai/langf…
deon-sanchez Jul 7, 2026
cf5c19b
feat(a11y): implement per-scan accessibility rule suppression and rep…
deon-sanchez Jul 7, 2026
c56c3bf
Merge branch 'release-1.11.0' of https://github.com/langflow-ai/langf…
deon-sanchez Jul 7, 2026
339f259
Merge branch 'release-1.11.0' of https://github.com/langflow-ai/langf…
deon-sanchez Jul 8, 2026
179cbc9
Merge branch 'release-1.11.0' into kb-a11y
deon-sanchez Jul 8, 2026
8b3289e
refactor(a11y): streamline accessibility rule handling and update UI …
deon-sanchez Jul 8, 2026
63f1236
Merge branch 'kb-a11y' of https://github.com/langflow-ai/langflow int…
deon-sanchez Jul 8, 2026
07d58aa
Merge branch 'release-1.11.0' into kb-a11y
deon-sanchez Jul 8, 2026
67cb4a3
feat(a11y): add frontend accessibility check skill and enhance UI com…
deon-sanchez Jul 8, 2026
99d27b2
Merge branch 'kb-a11y' of https://github.com/langflow-ai/langflow int…
deon-sanchez Jul 8, 2026
fb3ad83
feat(knowledgeBase): implement row actions for knowledge base table
deon-sanchez Jul 8, 2026
09b7f03
feat(a11y): enhance Radix components for improved accessibility
deon-sanchez Jul 8, 2026
b9c003e
refactor(a11y): clean up comments and improve code clarity
deon-sanchez Jul 8, 2026
ec82363
refactor(a11y): remove frontend accessibility check skill and enhance…
deon-sanchez Jul 8, 2026
9577a60
Merge branch 'release-1.11.0' into kb-a11y
deon-sanchez Jul 9, 2026
2268597
feat(a11y): enhance accessibility in various components
deon-sanchez Jul 9, 2026
8fa857a
Merge branch 'release-1.11.0' into kb-a11y
deon-sanchez Jul 10, 2026
dfa6a56
fix(locales): add missing commas in translation files for consistency
deon-sanchez Jul 10, 2026
4a0706d
Merge branch 'release-1.11.0' of https://github.com/langflow-ai/langf…
deon-sanchez Jul 10, 2026
6c7f9ce
Merge branch 'release-1.11.0' into kb-a11y
deon-sanchez Jul 10, 2026
957a034
Merge branch 'release-1.11.0' into kb-a11y
deon-sanchez Jul 10, 2026
dfcdf2a
fix(a11y): enhance keyboard navigation for actions in knowledge base …
deon-sanchez Jul 10, 2026
47fc93c
Merge branch 'release-1.11.0' into kb-a11y
deon-sanchez Jul 10, 2026
768f387
Merge branch 'release-1.11.0' into kb-a11y
deon-sanchez Jul 10, 2026
01ead49
Merge branch 'release-1.11.0' of https://github.com/langflow-ai/langf…
deon-sanchez Jul 13, 2026
f9a22ab
Merge branch 'release-1.11.0' into kb-a11y
deon-sanchez Jul 13, 2026
edb8308
fix(a11y): update test ID for OpenAI text embedding option in accessi…
deon-sanchez Jul 13, 2026
c92564e
Merge branch 'release-1.11.0' of https://github.com/langflow-ai/langf…
deon-sanchez Jul 13, 2026
2774e07
Merge branch 'release-1.11.0' into kb-a11y
deon-sanchez Jul 13, 2026
a9847e7
chore: regenerate secrets baseline
erichare Jul 13, 2026
9bbaf63
Merge release-1.11.0 into kb-a11y
erichare Jul 13, 2026
242d040
chore: update .gitignore and enhance IBM Level 1 audit skill document…
deon-sanchez Jul 21, 2026
c3d1e8b
Merge branch 'release-1.12.0' of https://github.com/langflow-ai/langf…
deon-sanchez Jul 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
296 changes: 148 additions & 148 deletions .secrets.baseline

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export default function CrashErrorComponent({
return (
<div className="z-50 flex h-screen w-screen items-center justify-center bg-foreground bg-opacity-50">
<div className="flex h-screen w-screen flex-col bg-background text-start shadow-lg">
<div className="m-auto grid w-1/2 justify-center gap-5 text-center">
<main className="m-auto grid w-1/2 justify-center gap-5 text-center">
<Card className="p-8">
<CardHeader>
<div className="m-auto">
Expand Down Expand Up @@ -62,7 +62,7 @@ export default function CrashErrorComponent({
</div>
</CardFooter>
</Card>
</div>
</main>
</div>
</div>
);
Expand Down
59 changes: 59 additions & 0 deletions src/frontend/src/components/common/radixAriaControlsFix/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { useEffect } from "react";

const CONTROLS_CACHE_ATTR = "data-radix-aria-controls-cache";

/**
* Radix sets aria-controls on closed popovers/selects/dialogs while the
* referenced node is aria-hidden or unmounted. IBM's checker treats that as
* aria_id_unique violation. Strip the attribute whenever the trigger is closed.
*
* The stripped value is cached on the node first: since the id Radix passes
* in is stable across renders, React's reconciler sees an "unchanged" prop
* on the next render and won't re-apply it once we've removed it from the
* DOM directly, so a trigger that closes and later reopens would otherwise
* be left with no aria-controls at all. Restoring from the cache when the
* trigger re-opens keeps that reference intact.
*/
export function RadixAriaControlsFix() {
useEffect(() => {
const fixClosedTriggers = () => {
document
.querySelectorAll('[data-state="closed"][aria-controls]')
.forEach((node) => {
const controls = node.getAttribute("aria-controls");
if (controls) node.setAttribute(CONTROLS_CACHE_ATTR, controls);
node.removeAttribute("aria-controls");
});

document
.querySelectorAll(
`[data-state="open"][${CONTROLS_CACHE_ATTR}]:not([aria-controls])`,
)
.forEach((node) => {
const cached = node.getAttribute(CONTROLS_CACHE_ATTR);
if (cached) node.setAttribute("aria-controls", cached);
});

document.querySelectorAll("[data-radix-focus-guard]").forEach((node) => {
node.setAttribute("tabindex", "-1");
node.setAttribute("aria-hidden", "true");
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== File context ==\n'
sed -n '1,140p' src/frontend/src/components/common/radixAriaControlsFix/index.tsx

printf '\n== Search for focus guard usage ==\n'
rg -n --hidden --glob '!**/node_modules/**' --glob '!**/dist/**' --glob '!**/build/**' 'data-radix-focus-guard|aria-hidden="true"|tabindex="-1"|tabIndex=\{0\}' src/frontend src | sed -n '1,200p'

printf '\n== Package versions ==\n'
python3 - <<'PY'
import json, pathlib
for path in [pathlib.Path('package.json'), pathlib.Path('src/frontend/package.json')]:
    if path.exists():
        print(f'## {path}')
        data = json.loads(path.read_text())
        deps = {}
        for k in ('dependencies','devDependencies','peerDependencies','optionalDependencies'):
            deps.update(data.get(k, {}))
        for name in ('`@radix-ui/react-focus-scope`','`@radix-ui/react-dialog`','`@radix-ui/react-popover`','`@radix-ui/react-dropdown-menu`','`@radix-ui/react-menu`'):
            if name in deps:
                print(name, deps[name])
PY

printf '\n== Relevant Radix source references in repo ==\n'
rg -n --hidden --glob '!**/node_modules/**' --glob '!**/dist/**' --glob '!**/build/**' '`@radix-ui/react-focus-scope`|focus guard|focus trap|trapped' . | sed -n '1,200p'

Repository: langflow-ai/langflow

Length of output: 28653


🌐 Web query:

Radix UI focus guard data-radix-focus-guard tabIndex 0 onFocus redirect focus-scope source

💡 Result:

In Radix UI, the data-radix-focus-guard attribute is used to identify invisible, focusable elements that ensure keyboard focus management works reliably across the entire document [1][2]. These guards are essential components injected by the @radix-ui/react-focus-guards package to help components like Dialog and Popover trap and maintain focus [1][3]. Key technical details regarding these guards include: Mechanism: Radix UI injects two invisible elements into the document body—one at the very beginning (afterbegin) and one at the very end (beforeend) [1][2]. These elements are explicitly marked with the data-radix-focus-guard attribute [1][2]. Purpose: By assigning them tabIndex={0}, Radix UI makes these elements focusable [1]. This ensures that when a user reaches the beginning or end of a focus-trapped area, the browser's focus events (like focusin and focusout) are consistently fired [1]. This allows the library's focus-trapping logic to detect when the user is trying to move focus outside the trapped region and redirect it accordingly, preventing the focus from "leaking" into the browser UI or other non-trapped areas [1][3]. Properties: To keep them invisible and non-interactive to the user, they are styled with opacity: 0, position: fixed, and pointer-events: none, while their outline is set to none [1][2]. Reference Counting: The implementation uses a reference counter to manage these guards [1]. Multiple components can "request" focus guards, but only one pair exists in the document at any time; they are only removed when the last component requiring them unmounts [1][2]. Relationship with FocusScope: While FocusGuards provides the infrastructure for capturing focus at the document edges, FocusScope is the component that performs the actual logic of trapping, looping, and restoring focus [3]. When FocusScope is set to trapped={true}, it listens for focus events and, should the focus land on a guard or attempt to exit the scope, it uses its internal logic to redirect focus back to a valid element within the designated scope [3][4].

Citations:


🌐 Web query:

@radix-ui/react-focus-scope focus guards tabIndex 0 focusin trapped source implementation

💡 Result:

In Radix UI, focus management relies on two primary utilities working in tandem: @radix-ui/react-focus-guards and @radix-ui/react-focus-scope [1][2]. Focus Guards (Implementation) Focus guards are invisible, focusable elements strategically placed in the DOM to ensure focus events are captured correctly at the document boundaries [1]. - Structure: They are elements with an empty data-radix-focus-guard attribute [1]. - Styling: They are set to tabIndex={0} (making them focusable), with CSS properties like position: fixed, opacity: 0, and pointer-events: none to remain invisible and non-obstructive [1]. - Functionality: They are injected at the very start and end of document.body [1]. When a user tabs into these guards, they provide a reliable target for the browser to trigger focusin and focusout events, which the FocusScope can then monitor [1]. This prevents "focus leakage" where focus might otherwise accidentally move into the browser's chrome or become lost when navigating at the edges of a trapped focus area [1]. Focus Scope and Trapping The FocusScope component manages the trapping of focus within a specific DOM container [2]. - Trapping Mechanism: When trapped={true}, FocusScope listens for focusin and focusout events [2]. If the focus moves to an element outside the defined scope, the component programmatically redirects it back inside [2]. - Tab Navigation: It implements a "looping" behavior: when a user tabs from the last focusable element in the scope, focus is programmatically moved back to the first element (and vice versa for Shift+Tab) [2][3]. - Implementation Logic: FocusScope uses a function—often identified in community discussions as a variation of getTabbableCandidates—to scan the DOM tree within its container [3]. It evaluates element properties, including tabIndex, to determine the order of focusable items [4][3]. - tabIndex Usage: While focus guards use tabIndex={0} to participate in the natural tab order [1], the container of the FocusScope itself often uses tabIndex={-1} [3]. This makes the container programmatically focusable (allowing it to receive focus via JavaScript) without adding it to the natural keyboard tab order [3]. These systems ensure that even in complex UI components like Modals or Popovers, keyboard focus remains strictly contained, predictable, and compliant with accessibility standards [1][2][5].

Citations:


Don't force Radix focus guards to tabindex="-1" data-radix-focus-guard elements need to stay tabbable for Radix to catch edge Tab/Shift+Tab navigation and redirect focus back into open dialogs/popovers. Remove this mutation and exclude these guards from the scanner instead.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/frontend/src/components/common/radixAriaControlsFix/index.tsx` around
lines 37 - 40, The DOM mutation in the Radix focus guard fix is making
`data-radix-focus-guard` elements untabbable, which breaks Radix edge
Tab/Shift+Tab handling. Update the logic in `radixAriaControlsFix` so it no
longer sets `tabindex="-1"` or `aria-hidden` on these guards. Instead, adjust
the scanner/exclusion logic in the same area to skip `data-radix-focus-guard`
nodes entirely while leaving their default tabbable behavior intact.

};

fixClosedTriggers();

const observer = new MutationObserver(fixClosedTriggers);
observer.observe(document.body, {
subtree: true,
childList: true,
attributes: true,
attributeFilter: ["data-state", "aria-controls"],
});

return () => observer.disconnect();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀 Performance & Scalability | 🟠 Major | ⚡ Quick win

Throttle the observer callback to avoid full-document rescans on every DOM mutation.

childList/subtree mutations aren't limited by attributeFilter, so any DOM change anywhere under document.body (e.g. table row virtualization, unrelated re-renders) triggers 3 full-document querySelectorAll scans plus writes. This can add up on pages with frequent DOM churn.

Coalesce bursts with requestAnimationFrame (or a small debounce) so the scan runs at most once per frame regardless of mutation volume.

⚡ Suggested throttling
+    let rafId: number | null = null;
+    const scheduleFixup = () => {
+      if (rafId !== null) return;
+      rafId = requestAnimationFrame(() => {
+        rafId = null;
+        fixClosedTriggers();
+      });
+    };
+
     fixClosedTriggers();
-    const observer = new MutationObserver(fixClosedTriggers);
+    const observer = new MutationObserver(scheduleFixup);
     observer.observe(document.body, {
       subtree: true,
       childList: true,
       attributes: true,
       attributeFilter: ["data-state", "aria-controls"],
     });

-    return () => observer.disconnect();
+    return () => {
+      observer.disconnect();
+      if (rafId !== null) cancelAnimationFrame(rafId);
+    };
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
fixClosedTriggers();
const observer = new MutationObserver(fixClosedTriggers);
observer.observe(document.body, {
subtree: true,
childList: true,
attributes: true,
attributeFilter: ["data-state", "aria-controls"],
});
return () => observer.disconnect();
let rafId: number | null = null;
const scheduleFixup = () => {
if (rafId !== null) return;
rafId = requestAnimationFrame(() => {
rafId = null;
fixClosedTriggers();
});
};
fixClosedTriggers();
const observer = new MutationObserver(scheduleFixup);
observer.observe(document.body, {
subtree: true,
childList: true,
attributes: true,
attributeFilter: ["data-state", "aria-controls"],
});
return () => {
observer.disconnect();
if (rafId !== null) cancelAnimationFrame(rafId);
};
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/frontend/src/components/common/radixAriaControlsFix/index.tsx` around
lines 43 - 53, The MutationObserver setup in radixAriaControlsFix should be
throttled so repeated DOM mutations do not trigger full-document rescans on
every callback. Update the fixClosedTriggers observer flow to coalesce bursts
with requestAnimationFrame or a small debounce, while keeping the existing
observer.disconnect cleanup intact. Keep the scan logic in fixClosedTriggers
unchanged, but ensure it runs at most once per frame regardless of how many
childList/subtree mutations occur.

}, []);

return null;
}

export default RadixAriaControlsFix;
14 changes: 14 additions & 0 deletions src/frontend/src/locales/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -962,6 +962,7 @@
"jsonEditor.transformError": "Umsetzungsfehler",
"knowledge.action.delete": "Löschen",
"knowledge.action.ingestFiles": "Dateien einlesen",
"knowledge.action.moreActionsFor": "Aktionen für „ {{name}} “",
"knowledge.action.stopIngestion": "Bei Verschlucken",
"knowledge.action.updateKnowledge": "Wissen auffrischen",
"knowledge.action.viewChunks": "Chunks anzeigen",
Expand All @@ -970,6 +971,8 @@
"knowledge.addSourcesDescription": "Dateien hochladen und Chunking-Einstellungen konfigurieren",
"knowledge.addSourcesTitle": "Dateien hinzufügen",
"knowledge.allSources": "Alle Quellen",
"knowledge.sourceTypeFilterLabel": "Nach Quellentyp filtern",
"knowledge.backToKnowledgeBases": "Zurück zu den Wissensdatenbanken",
"knowledge.baseCreated": "Wissensdatenbank \"{{name}}\" erstellt",
"knowledge.charsSuffix": "Zeichen",
"knowledge.chunkLabel": "Chunk- {{index}}",
Expand All @@ -991,6 +994,8 @@
"knowledge.chunksMetadataValueNoMatch": "Kein passender Wert. Drücken Sie die Eingabetaste oder wählen Sie die eingegebene Option aus.",
"knowledge.chunksMetadataValuePick": "Wählen Sie einen Wert aus oder geben Sie einen Wert ein",
"knowledge.chunksMetadataValueType": "Geben Sie einen Wert ein",
"knowledge.closeDetailsPanel": "Detailbereich schließen",
"knowledge.closeRunDetail": "Ausführungsdetails schließen",
"knowledge.collapseMetadataFor": "Metadaten für „ {{name}} “ ausblenden",
"knowledge.column.avgChunkSize": "Durchschnittliche Chunk-Größe",
"knowledge.column.chunks": "Stücke",
Expand All @@ -1006,6 +1011,7 @@
"knowledge.configureColumns": "Konfigurieren Sie das Spaltenverhalten für die Wissensdatenbank.",
"knowledge.configureSources": "Inhalt einlesen",
"knowledge.configureSourcesMaxSize": "(maximal 1 GB Upload)",
"knowledge.copyChunk": "Chunk {{index}} kopieren",
"knowledge.couldNotGeneratePreview": "Die Vorschau konnte nicht erstellt werden. Versuchen Sie, Ihre Einstellungen anzupassen.",
"knowledge.createDescription": "Geben Sie Ihrer Wissensdatenbank einen Namen, laden Sie Quellen hoch und wählen Sie ein Einbettungsmodell aus",
"knowledge.createTitle": "Wissensdatenbank erstellen",
Expand All @@ -1030,6 +1036,7 @@
"knowledge.file": "Datei",
"knowledge.fileUpload": "Dateiupload",
"knowledge.files": "Dateien",
"knowledge.firstPage": "Erste Seite",
"knowledge.flowTemplate": "Ablaufvorlage",
"knowledge.generatingPreview": "Vorschau wird erstellt...",
"knowledge.helpConfigureSources": "Inhalt einlesen",
Expand All @@ -1052,6 +1059,7 @@
"knowledge.labelNone": "Keine",
"knowledge.labelNotSelected": "Nicht ausgewählt",
"knowledge.labelSeparator": "Trennzeichen",
"knowledge.lastPage": "Letzte Seite",
"knowledge.linkedFlowsLabel": "Verknüpfte Abläufe",
"knowledge.loadingChunks": "Chunks werden geladen...",
"knowledge.loadingKnowledgeBases": "Wissensdatenbanken werden geladen...",
Expand All @@ -1074,6 +1082,8 @@
"knowledge.nTags": "{{count}} Stichwörter",
"knowledge.nameLabel": "Ihren Namen",
"knowledge.namePlaceholder": "Geben Sie einen Namen für diese Wissensdatenbank ein",
"knowledge.nextChunkPreview": "Nächste Chunk-Vorschau",
"knowledge.nextPage": "Nächste Seite",
"knowledge.noChunksFound": "Es wurden keine Chunks gefunden",
"knowledge.noDescription": "Keine Beschreibung verfügbar.",
"knowledge.noFilesSelected": "Es wurden keine Dateien ausgewählt. Zurück zum Hinzufügen von Dateien.",
Expand All @@ -1084,9 +1094,13 @@
"knowledge.oneFileOverride": "1 Datei überschreiben",
"knowledge.oneTag": "1 Tag",
"knowledge.page": "Seite",
"knowledge.pageNumberInput": "Seitenzahl",
"knowledge.pageTitle": "Wissen",
"knowledge.perPage": "Pro Seite:",
"knowledge.previousChunkPreview": "Vorherige Chunk-Vorschau",
"knowledge.previousPage": "Vorherige Seite",
"knowledge.previouslyIngested": "zuvor eingenommen",
"knowledge.removeFile": "„ {{name}} “ entfernen",
"knowledge.reviewDescription": "Zeigen Sie in der Vorschau an, wie Ihre Dateien aufgeteilt werden, und bestätigen Sie Ihre Einstellungen",
"knowledge.reviewTitle": "Überprüfen & Erstellen",
"knowledge.runId": "Lauf-ID",
Expand Down
14 changes: 14 additions & 0 deletions src/frontend/src/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -867,6 +867,12 @@
"knowledge.showing": "Showing {{start}}-{{end}} of {{total}} chunks",
"knowledge.page": "Page",
"knowledge.ofTotal": "of {{total}}",
"knowledge.backToKnowledgeBases": "Back to knowledge bases",
"knowledge.firstPage": "First page",
"knowledge.previousPage": "Previous page",
"knowledge.nextPage": "Next page",
"knowledge.lastPage": "Last page",
"knowledge.pageNumberInput": "Page number",
"modelInput.noModelsEnabled": "No Models Enabled",
"modelInput.refreshList": "Refresh List",
"modelInput.manageProviders": "Manage Model Providers",
Expand Down Expand Up @@ -925,6 +931,7 @@
"knowledge.action.stopIngestion": "Stop Ingestion",
"knowledge.action.ingestFiles": "Ingest Files",
"knowledge.action.delete": "Delete",
"knowledge.action.moreActionsFor": "Actions for {{name}}",
"knowledge.status.ready": "Ready",
"knowledge.status.ingesting": "Ingesting",
"knowledge.status.failed": "Failed",
Expand Down Expand Up @@ -1476,13 +1483,15 @@
"flowVersion.deleteDialogTitle": "Delete Version",
"flowVersion.deleteConfirmText": "This will permanently delete {{versionTag}}. This can't be undone.",
"knowledge.noDescription": "No description available.",
"knowledge.closeDetailsPanel": "Close details panel",
"knowledge.embeddingProviderLabel": "Embedding Provider",
"knowledge.sourceFilesLabel": "Source Files",
"knowledge.noSourceFiles": "No source files available.",
"knowledge.linkedFlowsLabel": "Linked Flows",
"knowledge.noLinkedFlows": "No linked flows available.",
"knowledge.chunkLabel": "Chunk {{index}}",
"knowledge.charsSuffix": "chars",
"knowledge.copyChunk": "Copy chunk {{index}}",
"deleteAccount.logoTitle": "Langflow logo",
"deleteAccount.heading": "Delete your account",
"deleteAccount.irreversibleDescription": "This action is irreversible and will permanently erase all your data and information associated with the account.",
Expand Down Expand Up @@ -1667,8 +1676,11 @@
"knowledge.labelNotSelected": "Not selected",
"knowledge.labelSeparator": "Separator",
"knowledge.noFilesSelected": "No files selected. Go back to add files.",
"knowledge.previousChunkPreview": "Previous chunk preview",
"knowledge.nextChunkPreview": "Next chunk preview",
"knowledge.summary": "Summary",
"knowledge.allSources": "All sources",
"knowledge.sourceTypeFilterLabel": "Filter by source type",
"knowledge.collapseMetadataFor": "Collapse metadata for {{name}}",
"knowledge.columnConfiguration": "Column Configuration",
"knowledge.configureColumns": "Configure column behavior for the knowledge base.",
Expand All @@ -1679,12 +1691,14 @@
"knowledge.metadataNoFields": "No metadata fields added.",
"knowledge.metadataAddField": "Add field",
"knowledge.expandMetadataFor": "Expand metadata for {{name}}",
"knowledge.removeFile": "Remove {{name}}",
"knowledge.fileUpload": "File Upload",
"knowledge.flowTemplate": "Flow Template",
"knowledge.ingestionRunDetail": "Ingestion run detail",
"knowledge.ingestionRuns": "Ingestion Runs",
"knowledge.jobId": "Job ID",
"knowledge.loadingRun": "Loading run…",
"knowledge.closeRunDetail": "Close run detail",
"knowledge.loadingRuns": "Loading runs…",
"knowledge.metadataLabel": "Metadata",
"knowledge.nFileOverrides": "{{count}} file overrides",
Expand Down
14 changes: 14 additions & 0 deletions src/frontend/src/locales/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -962,6 +962,7 @@
"jsonEditor.transformError": "Error de transformación",
"knowledge.action.delete": "Suprimir",
"knowledge.action.ingestFiles": "Importar archivos",
"knowledge.action.moreActionsFor": "Acciones para « {{name}} »",
"knowledge.action.stopIngestion": "Detener la ingestión",
"knowledge.action.updateKnowledge": "Actualizar conocimientos",
"knowledge.action.viewChunks": "Ver fragmentos",
Expand All @@ -970,6 +971,8 @@
"knowledge.addSourcesDescription": "Sube archivos y configura los ajustes de fragmentación",
"knowledge.addSourcesTitle": "Añadir archivos",
"knowledge.allSources": "Todos los orígenes",
"knowledge.sourceTypeFilterLabel": "Filtrar por tipo de origen",
"knowledge.backToKnowledgeBases": "Volver a las bases de conocimiento",
"knowledge.baseCreated": "Se ha creado la base de conocimientos \"{{name}}\"",
"knowledge.charsSuffix": "caracteres",
"knowledge.chunkLabel": "Fragmento {{index}}",
Expand All @@ -991,6 +994,8 @@
"knowledge.chunksMetadataValueNoMatch": "No se ha encontrado ningún valor coincidente. Pulsa Intro o selecciona esta opción para utilizar el texto tal y como está escrito.",
"knowledge.chunksMetadataValuePick": "Selecciona o escribe un valor",
"knowledge.chunksMetadataValueType": "Escribe un valor",
"knowledge.closeDetailsPanel": "Cerrar el panel de detalles",
"knowledge.closeRunDetail": "Cerrar el detalle de la ejecución",
"knowledge.collapseMetadataFor": "Ocultar los metadatos de {{name}}",
"knowledge.column.avgChunkSize": "Tamaño medio de los fragmentos",
"knowledge.column.chunks": "Trozos",
Expand All @@ -1006,6 +1011,7 @@
"knowledge.configureColumns": "Configura el comportamiento de las columnas de la base de conocimientos.",
"knowledge.configureSources": "Importar contenido",
"knowledge.configureSourcesMaxSize": "(1 GB como máximo de subida)",
"knowledge.copyChunk": "Copiar fragmento {{index}}",
"knowledge.couldNotGeneratePreview": "No se ha podido generar la vista previa. Prueba a modificar la configuración.",
"knowledge.createDescription": "Asigna un nombre a tu base de conocimientos, sube las fuentes y selecciona un modelo de integración",
"knowledge.createTitle": "Crear una base de conocimientos",
Expand All @@ -1030,6 +1036,7 @@
"knowledge.file": "Archivo",
"knowledge.fileUpload": "Carga de archivos",
"knowledge.files": "Archivos",
"knowledge.firstPage": "Primera página",
"knowledge.flowTemplate": "Plantilla de flujo",
"knowledge.generatingPreview": "Generando vista previa...",
"knowledge.helpConfigureSources": "Importar contenido",
Expand All @@ -1052,6 +1059,7 @@
"knowledge.labelNone": "Ninguna",
"knowledge.labelNotSelected": "No seleccionado",
"knowledge.labelSeparator": "Separador",
"knowledge.lastPage": "Última página",
"knowledge.linkedFlowsLabel": "Flujos vinculados",
"knowledge.loadingChunks": "Cargando fragmentos...",
"knowledge.loadingKnowledgeBases": "Cargando bases de datos...",
Expand All @@ -1074,6 +1082,8 @@
"knowledge.nTags": "{{count}} etiquetas",
"knowledge.nameLabel": "Nombre",
"knowledge.namePlaceholder": "Introduce un nombre para esta base de conocimientos",
"knowledge.nextChunkPreview": "Vista previa del fragmento siguiente",
"knowledge.nextPage": "Página siguiente",
"knowledge.noChunksFound": "No se han encontrado fragmentos",
"knowledge.noDescription": "No hay descripción disponible.",
"knowledge.noFilesSelected": "No hay archivos seleccionados. Vuelve atrás para añadir archivos.",
Expand All @@ -1084,9 +1094,13 @@
"knowledge.oneFileOverride": "1 archivo de sustitución",
"knowledge.oneTag": "1 etiqueta",
"knowledge.page": "Página",
"knowledge.pageNumberInput": "Número de página",
"knowledge.pageTitle": "Conocimientos",
"knowledge.perPage": "Por página:",
"knowledge.previousChunkPreview": "Vista previa del fragmento anterior",
"knowledge.previousPage": "Página anterior",
"knowledge.previouslyIngested": "ingerido previamente",
"knowledge.removeFile": "Eliminar {{name}}",
"knowledge.reviewDescription": "Previsualiza cómo se dividirán tus archivos y confirma la configuración",
"knowledge.reviewTitle": "Revisión y montaje",
"knowledge.runId": "ID de ejecución",
Expand Down
14 changes: 14 additions & 0 deletions src/frontend/src/locales/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -962,6 +962,7 @@
"jsonEditor.transformError": "Erreur de transformation",
"knowledge.action.delete": "Supprimer",
"knowledge.action.ingestFiles": "Importer des fichiers",
"knowledge.action.moreActionsFor": "Actions pour « {{name}} »",
"knowledge.action.stopIngestion": "Cesser l'ingestion",
"knowledge.action.updateKnowledge": "Actualiser ses connaissances",
"knowledge.action.viewChunks": "Afficher les segments",
Expand All @@ -970,6 +971,8 @@
"knowledge.addSourcesDescription": "Télécharger des fichiers et configurer les paramètres de fractionnement",
"knowledge.addSourcesTitle": "Ajouter des fichiers",
"knowledge.allSources": "Toutes les sources",
"knowledge.sourceTypeFilterLabel": "Filtrer par type de source",
"knowledge.backToKnowledgeBases": "Retour aux bases de connaissances",
"knowledge.baseCreated": "Création de la base de connaissances \"{{name}}\"",
"knowledge.charsSuffix": "caractères",
"knowledge.chunkLabel": "{{index}} de blocs",
Expand All @@ -991,6 +994,8 @@
"knowledge.chunksMetadataValueNoMatch": "Aucune valeur correspondante. Appuyez sur Entrée ou sélectionnez cette option pour l'utiliser telle quelle.",
"knowledge.chunksMetadataValuePick": "Sélectionnez ou saisissez une valeur",
"knowledge.chunksMetadataValueType": "Saisissez une valeur",
"knowledge.closeDetailsPanel": "Fermer le panneau de détails",
"knowledge.closeRunDetail": "Fermer le détail de l'exécution",
"knowledge.collapseMetadataFor": "Masquer les métadonnées pour {{name}}",
"knowledge.column.avgChunkSize": "Taille moyenne des blocs",
"knowledge.column.chunks": "Morceaux",
Expand All @@ -1006,6 +1011,7 @@
"knowledge.configureColumns": "Configurer le comportement des colonnes de la base de connaissances.",
"knowledge.configureSources": "Importer du contenu",
"knowledge.configureSourcesMaxSize": "(1 Go max. pour le téléchargement)",
"knowledge.copyChunk": "Copier le fragment {{index}}",
"knowledge.couldNotGeneratePreview": "Impossible de générer l'aperçu. Essayez de modifier vos paramètres.",
"knowledge.createDescription": "Donnez un nom à votre base de connaissances, téléchargez les sources et sélectionnez un modèle d'intégration",
"knowledge.createTitle": "Créer une base de connaissances",
Expand All @@ -1030,6 +1036,7 @@
"knowledge.file": "Fichier",
"knowledge.fileUpload": "Transfert de fichier",
"knowledge.files": "Fichiers",
"knowledge.firstPage": "Première page",
"knowledge.flowTemplate": "Modèle de flux",
"knowledge.generatingPreview": "Génération de l'aperçu...",
"knowledge.helpConfigureSources": "Importer du contenu",
Expand All @@ -1052,6 +1059,7 @@
"knowledge.labelNone": "Aucun",
"knowledge.labelNotSelected": "Non sélectionné",
"knowledge.labelSeparator": "Séparateur",
"knowledge.lastPage": "Dernière page",
"knowledge.linkedFlowsLabel": "Flux liés",
"knowledge.loadingChunks": "Chargement des blocs...",
"knowledge.loadingKnowledgeBases": "Chargement des bases de connaissances...",
Expand All @@ -1074,6 +1082,8 @@
"knowledge.nTags": "{{count}} balises",
"knowledge.nameLabel": "Nom",
"knowledge.namePlaceholder": "Entrez un nom pour cette base de connaissances",
"knowledge.nextChunkPreview": "Aperçu du fragment suivant",
"knowledge.nextPage": "Page suivante",
"knowledge.noChunksFound": "Aucun bloc trouvé",
"knowledge.noDescription": "Aucune description disponible.",
"knowledge.noFilesSelected": "Aucun fichier n'a été sélectionné. Retournez à la page d'ajout de fichiers.",
Expand All @@ -1084,9 +1094,13 @@
"knowledge.oneFileOverride": "1 remplacement de fichier",
"knowledge.oneTag": "1 balise",
"knowledge.page": "Page",
"knowledge.pageNumberInput": "Numéro de page",
"knowledge.pageTitle": "Connaissances",
"knowledge.perPage": "Par page :",
"knowledge.previousChunkPreview": "Aperçu du fragment précédent",
"knowledge.previousPage": "Page précédente",
"knowledge.previouslyIngested": "déjà ingéré",
"knowledge.removeFile": "Supprimer {{name}}",
"knowledge.reviewDescription": "Prévisualisez la manière dont vos fichiers seront fractionnés et validez vos paramètres",
"knowledge.reviewTitle": "Analyse et mise en place",
"knowledge.runId": "ID de l'exécution",
Expand Down
Loading
Loading