From d56d74b3877192af37961ea6c78cbcf0ec70f343 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 23 Apr 2026 19:39:06 +0900 Subject: [PATCH 01/51] refac --- src/lib/components/chat/Messages.svelte | 117 +----------------- .../components/chat/Messages/Message.svelte | 13 +- 2 files changed, 13 insertions(+), 117 deletions(-) diff --git a/src/lib/components/chat/Messages.svelte b/src/lib/components/chat/Messages.svelte index 151f89fb2a..51a75f1242 100644 --- a/src/lib/components/chat/Messages.svelte +++ b/src/lib/components/chat/Messages.svelte @@ -60,102 +60,7 @@ export let messagesCount: number | null = 8; let messagesLoading = false; - // Off-screen message unloading. Heights are measured on scroll so spacers - // always match real sizes — no scroll jumps, no feedback loops needed. - const OVERSCAN = 3; - const DEFAULT_HEIGHT = 150; - let visibleStart = 0; - let visibleEnd = 0; - let messageHeights = new Map(); - let topSpacerHeight = 0; - let bottomSpacerHeight = 0; - let pendingCull = null; - - // Helper: get height for a message (cached or default) - const heightOf = (id) => messageHeights.get(id) ?? DEFAULT_HEIGHT; - - /** Measure all currently rendered message elements and cache their heights */ - const measureMessageHeights = () => { - const elements = document - .getElementById('messages-container') - ?.querySelectorAll('[role="listitem"]'); - if (!elements) return; - - messageHeights = new Map([ - ...messageHeights, - ...Array.from(elements) - .map((el, i) => [messages[visibleStart + i]?.id, el.getBoundingClientRect().height]) - .filter(([id]) => id != null) - ]); - }; - - /** Compute visible range from current scroll position and apply */ - const updateVisibleRange = () => { - const container = document.getElementById('messages-container'); - if (!container || messages.length === 0) return; - - const st = container.scrollTop; - const ch = container.clientHeight; - - // Build prefix sums from measured heights - const prefixSums = messages.reduce( - (acc, m) => [...acc, acc[acc.length - 1] + heightOf(m.id)], - [0] - ); - - const firstVisible = Math.max(0, prefixSums.findIndex((h) => h > st) - 1); - const lastVisible = prefixSums.findIndex((h) => h > st + ch); - - // Only cull messages that have been measured (so spacer height is accurate) - // findIndex returns -1 when all are measured → no limit on culling - const firstUnmeasured = messages.findIndex((m) => !messageHeights.has(m.id)); - const cullLimit = firstUnmeasured === -1 ? messages.length : firstUnmeasured; - - visibleStart = Math.max(0, Math.min(firstVisible - OVERSCAN, cullLimit)); - visibleEnd = Math.min( - messages.length, - (lastVisible === -1 ? messages.length : lastVisible) + OVERSCAN - ); - topSpacerHeight = prefixSums[visibleStart] ?? 0; - bottomSpacerHeight = (prefixSums[messages.length] ?? 0) - (prefixSums[visibleEnd] ?? 0); - }; - - /** Scroll handler: measure every frame, cull via rAF (same throttle as pendingRebuild) */ - const handleContainerScroll = () => { - measureMessageHeights(); - - // Don't cull during progressive loading - if (messagesLoading) return; - - if (!pendingCull) { - pendingCull = requestAnimationFrame(() => { - pendingCull = null; - updateVisibleRange(); - }); - } - }; - - let scrollListenerAttached = false; - - const attachScrollListener = () => { - if (scrollListenerAttached) return; - const container = document.getElementById('messages-container'); - if (!container) return; - - container.addEventListener('scroll', handleContainerScroll, { passive: true }); - scrollListenerAttached = true; - }; - - onMount(() => { - attachScrollListener(); - }); - onDestroy(() => { - const container = document.getElementById('messages-container'); - if (container && scrollListenerAttached) { - container.removeEventListener('scroll', handleContainerScroll); - } - cancelAnimationFrame(pendingCull); cancelAnimationFrame(pendingRebuild); }); @@ -169,12 +74,6 @@ buildMessages(); - // Show all messages during progressive loading (no culling) - visibleStart = 0; - visibleEnd = messages.length; - topSpacerHeight = 0; - bottomSpacerHeight = 0; - await tick(); messagesLoading = false; @@ -201,7 +100,6 @@ } messages = _messages.reverse(); - visibleEnd = messages.length; }; // Throttle message list rebuilds to once per animation frame during streaming. @@ -220,8 +118,6 @@ cancelAnimationFrame(pendingRebuild); pendingRebuild = null; buildMessages(); - // No explicit culling needed — scrollToBottom will fire a scroll event, - // which triggers handleContainerScroll → rAF → updateVisibleRange } else if (_messages) { // Content update (streaming) — throttle to once per frame if (!pendingRebuild) { @@ -570,13 +466,7 @@ {/if}
diff --git a/src/lib/components/chat/Messages/Message.svelte b/src/lib/components/chat/Messages/Message.svelte index d9ca32492a..b161aa8556 100644 --- a/src/lib/components/chat/Messages/Message.svelte +++ b/src/lib/components/chat/Messages/Message.svelte @@ -49,7 +49,7 @@ role="listitem" class="flex flex-col justify-between px-5 mb-3 w-full {($settings?.widescreenMode ?? null) ? 'max-w-full' - : 'max-w-5xl'} mx-auto rounded-lg group" + : 'max-w-5xl'} mx-auto rounded-lg group message-listitem" > {#if history.messages[messageId]} {#if history.messages[messageId].role === 'user'} @@ -128,3 +128,14 @@ {/if} {/if}
+ + + From 83f3a9c5434770eabef48759733b60b18f1d98c5 Mon Sep 17 00:00:00 2001 From: Algorithm5838 <108630393+Algorithm5838@users.noreply.github.com> Date: Thu, 23 Apr 2026 22:26:11 +0300 Subject: [PATCH 02/51] fix: remove reactive label from onDestroy in Markdown --- src/lib/components/chat/Messages/Markdown.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/chat/Messages/Markdown.svelte b/src/lib/components/chat/Messages/Markdown.svelte index d0b54b6528..3cbef944e4 100644 --- a/src/lib/components/chat/Messages/Markdown.svelte +++ b/src/lib/components/chat/Messages/Markdown.svelte @@ -82,7 +82,7 @@ $: updateHandler(content); // Throttle parsing to once per animation frame while streaming - $: onDestroy(() => { + onDestroy(() => { cancelAnimationFrame(pendingUpdate); }); From a4eb10269e37e33263cd5324be33a492506d5040 Mon Sep 17 00:00:00 2001 From: Kylapaallikko Date: Fri, 24 Apr 2026 08:33:06 +0300 Subject: [PATCH 03/51] Update fi-FI translation.json (#24010) Added missing translations. --- src/lib/i18n/locales/fi-FI/translation.json | 198 ++++++++++---------- 1 file changed, 99 insertions(+), 99 deletions(-) diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index 16501646eb..c21491242b 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -33,13 +33,13 @@ "{{user}}'s Chats": "{{user}}:n keskustelut", "{{webUIName}} Backend Required": "{{webUIName}}-backend vaaditaan", "*Prompt node ID(s) are required for image generation": "Kuvan luomiseen vaaditaan kehote-solmun ID(t)", - "1 hour before": "", + "1 hour before": "1 tunti ennen", "1 Source": "1 lähde", - "10 minutes before": "", - "15 minutes before": "", + "10 minutes before": "10 minuuttia ennen", + "15 minutes before": "15 minuuttia ennen", "1m_time_ago": "", - "30 minutes before": "", - "5 minutes before": "", + "30 minutes before": "30 minuuttia ennen", + "5 minutes before": "5 minuuttia ennen", "A collaboration channel where people join as members": "Yhteistyökanava, johon ihmiset liittyvät jäseninä", "A discussion channel where access is controlled by groups and permissions": "Keskustelukanava, johon pääsyä rajoitetaan ryhmillä ja käyttöoikeuksilla", "A new version (v{{LATEST_VERSION}}) is now available.": "Uusi versio (v{{LATEST_VERSION}}) on nyt saatavilla.", @@ -52,7 +52,7 @@ "Access Control": "Käyttöoikeuksien hallinta", "Access Grants": "Käyttöoikeudet", "Access List": "Pääsylista", - "Access updated": "", + "Access updated": "Käyttöoikeus päivitetty", "Accessible to all users": "Käytettävissä kaikille käyttäjille", "Account": "Tili", "Account Activation Pending": "Tilin aktivointi odottaa", @@ -78,11 +78,11 @@ "Add content here": "Lisää sisältöä tähän", "Add Custom Parameter": "Lisää mukautettu parametri", "Add Custom Prompt": "Lisää mukautettu kehote", - "Add description": "", + "Add description": "Lisää kuvaus", "Add Details": "Lisää yksityiskohtia", "Add Files": "Lisää tiedostoja", "Add Image": "Lisää kuva", - "Add location": "", + "Add location": "Lisää sijainti", "Add Member": "Lisää jäsen", "Add Members": "Lisää jäseniä", "Add Memory": "Lisää muistiin", @@ -99,7 +99,7 @@ "Add webpage": "Lisää verkkosivu", "Add your Open Terminal URL and API key in Settings → Integrations.": "Lisää Open Terminal verkko-osoite ja API-avain Asetukset → Integraatiot", "Additional Config": "Lisäasetukset", - "Additional configuration options for marker. This should be a JSON string with key-value pairs. For example, '{\"key\": \"value\"}'. Supported keys include: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level": "", + "Additional configuration options for marker. This should be a JSON string with key-value pairs. For example, '{\"key\": \"value\"}'. Supported keys include: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level": "Lisäasetukset merkille. Tämä tulisi olla JSON-merkkijono, jossa on avain-arvo-pareja. Esimerkiksi '{\"key\": \"value\"}'. Tuetut avaimet sisältävät: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level.", "Additional feedback comments": "Lisäpalautteen kommentit", "Additional Parameters": "Lisäparametrit", "Adds filenames, titles, sections, and snippets into the BM25 text to improve lexical recall.": "Lisää tiedostonimiä, otsikoita, osioita ja katkelmia BM25-tekstiin leksikaalisen muistamisen parantamiseksi.", @@ -118,7 +118,7 @@ "AI": "AI", "All": "Kaikki", "All chats have been unarchived.": "Kaikki keskustelut poistettu arkistosta.", - "All day": "", + "All day": "Koko päivä", "All models are now hidden": "Kaikki mallit ovat nyt piilotettu", "All models are now visible": "Kaikki mallit ovat nyt näkyvissä", "All models deleted successfully": "Kaikki mallit poistettu onnistuneesti", @@ -152,7 +152,7 @@ "Allowed File Extensions": "Hyväksytyt tiedostomuodot", "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "Hyväksyty tiedostomuodot. Erittele tiedostomuodot pilkulla. Jätä tyhjäksi kaikille tiedostomuodoille.", "Already have an account?": "Onko sinulla jo tili?", - "Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "", + "Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "Vaihtoehto top_p:lle, ja sen tavoitteena on varmistaa laadun ja monimuotoisuuden tasapaino. Parametri p edustaa vähimmäistodennäköisyyttä, jonka on oltava tokenin huomioimiseksi suhteessa todennäköisimmän tokenin todennäköisyyteen. Esimerkiksi, kun p=0.05 ja todennäköisin tokenilla on todennäköisyys 0.9, logitit, joiden arvo on alle 0.045, suodatetaan pois.", "Always": "Aina", "Always Collapse Code Blocks": "Pienennä aina koodilohkot", "Always Expand Details": "Laajenna aina tiedot", @@ -191,7 +191,7 @@ "Are you sure you want to archive all chats? This action cannot be undone.": "Haluatko varmasti arkistoida kaikki keskustelut? Tätä toimintoa ei voi peruuttaa.", "Are you sure you want to clear all memories? This action cannot be undone.": "Haluatko varmasti tyhjentää kaikki muistot? Tätä toimintoa ei voi peruuttaa.", "Are you sure you want to delete \"{{NAME}}\"?": "Haluatko varmasti poistaa \"{{NAME}}\"?", - "Are you sure you want to delete **{{modelName}}**?": "", + "Are you sure you want to delete **{{modelName}}**?": "Haluatko varmasti poistaa **{{modelName}}**?", "Are you sure you want to delete all chats? This action cannot be undone.": "Haluatko varmasti poistaa kaikki keskustelut? Tätä toimintoa ei voi peruuttaa.", "Are you sure you want to delete this channel?": "Haluatko varmasti poistaa tämän kanavan?", "Are you sure you want to delete this connection? This action cannot be undone.": "Haluatko varmasti poistaa yhteyden? Tätä toimintoa ei voi peruuttaa.", @@ -207,9 +207,9 @@ "Ask a question": "Kysy kysymys", "Assistant": "Avustaja", "Async Embedding Processing": "Asynkroninen upotus prosessointi", - "At time of event": "", + "At time of event": "Tapahtumahetkellä", "Attach File From Knowledge": "Liitä tiedosto tietämyksestä", - "Attach Files": "", + "Attach Files": "Liitä tiedostoja", "Attach Knowledge": "Liitä tietoa", "Attach Notes": "Liitä muistiinpanoja", "Attach Webpage": "Liitä verkkosivu", @@ -232,13 +232,13 @@ "AUTOMATIC1111 Base URL": "AUTOMATIC1111 verkko-osoite", "AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 verkko-osoite vaaditaan.", "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "Lisää järjestelmätyökaluja automaattisesti natiivissa toimintokutsutilassa (esim. aikaleimat, muisti, keskusteluhistoria, muistiinpanot jne.)", - "Automation": "", - "Automation created": "", - "Automation Name": "", - "Automation title": "", - "Automation triggered": "", - "Automation updated": "", - "Automations": "", + "Automation": "Automaatio", + "Automation created": "Automaatio luotu", + "Automation Name": "Automaation nimi", + "Automation title": "Automaation otsikko", + "Automation triggered": "Automaatio laukaistu", + "Automation updated": "Automaatio päivitetty", + "Automations": "Automaatiot", "Available list": "Käytettävissä oleva luettelo", "Available models": "Käytettävissä olevat mallit", "Available Tools": "Käytettävissä olevat työkalut", @@ -269,7 +269,7 @@ "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Tiettyjen tokeneiden tehostaminen tai rankaiseminen rajoitetuista vastauksista. Poikkeaman arvot rajoitetaan välille -100 ja 100 (mukaan lukien). (Oletus: ei mitään)", "Brave": "", "Brave Search API Key": "Brave Search API -avain", - "Break down complex requests into trackable steps": "", + "Break down complex requests into trackable steps": "Pilko monimutkaiset pyynnöt seurattaviin vaiheisiin", "Browse and query knowledge bases": "Selaa ja hae tietokannoista", "Builtin Tools": "Sisäänrakennetut työkalut", "Bullet List": "Luettelo", @@ -282,8 +282,8 @@ "Bypass Web Loader": "Ohita verkkolataaja", "Cache Base Model List": "Malli luettelon välimuisti", "Calendar": "Kalenteri", - "Calendar deleted": "", - "Calendars": "", + "Calendar deleted": "Kalenteri poistettu", + "Calendars": "Kalenterit", "Call": "Puhelu", "Call feature is not supported when using Web STT engine": "Puhelutoimintoa ei tueta käytettäessä web-puheentunnistusmoottoria", "Camera": "Kamera", @@ -405,7 +405,7 @@ "Concurrent Requests": "Samanaikaiset pyynnöt", "Config": "Määritykset", "Config imported successfully": "Määritysten tuonti onnistui", - "Configuration": "", + "Configuration": "Määritys", "Configure": "Määritä", "Confirm": "Vahvista", "Confirm Password": "Vahvista salasana", @@ -420,7 +420,7 @@ "Connect to your own OpenAPI compatible external tool servers.": "Yhdistä omat ulkopuoliset OpenAPI yhteensopivat työkalu palvelimet.", "Connected ({{type}})": "Yhdistetty ({{type}})", "Connection failed": "Yhteys epäonnistui", - "Connection lost. Reconnecting...": "", + "Connection lost. Reconnecting...": "Yhteys katkaistu. Yhdistetään uudelleen...", "Connection successful": "Yhteys onnistui", "Connection Type": "Yhteystyyppi", "Connections": "Yhteydet", @@ -452,7 +452,7 @@ "Copy Last Response": "Kopioi viimeisin vastaus", "Copy link": "Kopioi linkki", "Copy Link": "Kopioi linkki", - "Copy Path": "", + "Copy Path": "Kopioi polku", "Copy Prompt": "Kopioi kehote", "Copy Share Link": "Kopioi jakolinkki", "Copy to clipboard": "Kopioi leikepöydälle", @@ -468,7 +468,7 @@ "Create a new note": "Luo uusi muistiinpano", "Create Account": "Luo tili", "Create Admin Account": "Luo ylläpitäjätili", - "Create and manage scheduled automations": "", + "Create and manage scheduled automations": "Luo ja hallinnoi aikataulutettuja automaatioita", "Create Channel": "Luo kanava", "Create Folder": "Luo kansio", "Create Image": "Luo kuva", @@ -478,7 +478,7 @@ "Create new secret key": "Luo uusi salainen avain", "Create note": "Luo muistiinpano", "Create Note": "Luo muistiinpano", - "Create scheduled prompts that run automatically on a recurring basis.": "", + "Create scheduled prompts that run automatically on a recurring basis.": "Luo aikataulutettuja kehotteita, jotka suoritetaan automaattisesti toistuvasti.", "Create your first note by clicking on the plus button below.": "Luo ensimmäinen muistiinpanosi painamalla alla olevaa plus painiketta.", "Created at": "Luotu", "Created At": "Luotu", @@ -494,14 +494,14 @@ "Custom Gender": "Muu sukupuoli", "Custom Parameter Name": "Mukautetun parametrin nimi", "Custom Parameter Value": "Mukautetun parametrin arvo", - "Daily": "", + "Daily": "Päivittäin", "Daily Messages": "Päivittäiset viestit", "Danger Zone": "Vaara-alue", "Dark": "Tumma", "Data Controls": "Datan hallinta", "Database": "Tietokanta", "Datalab Marker API": "Datalab Marker API", - "Day": "", + "Day": "Päivä", "DD/MM/YYYY": "DD/MM/YYYY", "DDGS Backend": "DDGS-taustajärjestelmä", "December": "joulukuu", @@ -532,12 +532,12 @@ "Delete All": "Poista kaikki", "Delete All Chats": "Poista kaikki keskustelut", "Delete all contents inside this folder": "Poista kaikki sisällöt tästä kansiosta", - "Delete automation?": "", - "Delete calendar": "", - "Delete Calendar": "", + "Delete automation?": "Poista automaatio?", + "Delete calendar": "Poista kalenteri", + "Delete Calendar": "Poista kalenteri", "Delete Chat": "Poista keskustelu", "Delete chat?": "Haluatko varmasti poistaa tämän keskustelun?", - "Delete Event": "", + "Delete Event": "Poista tapahtuma?", "Delete File": "Poista tiedosto", "Delete folder?": "Haluatko varmasti poistaa tämän kansion?", "Delete function?": "Haluatko varmasti poistaa tämän toiminnon?", @@ -680,7 +680,7 @@ "Embedding Concurrent Requests": "Samanaikaiset upotuspyynnöt", "Embedding Model": "Upotusmalli", "Embedding Model Engine": "Upotusmallin moottori", - "Emojis": "", + "Emojis": "Emojit", "Empty message": "Tyhjä viesti", "Enable All": "Ota kaikki käyttöön", "Enable API Keys": "Ota API-avaimet käyttöön", @@ -772,7 +772,7 @@ "Enter Perplexity Search API URL": "Aseta Perplexity Search API verkko-osoite", "Enter Playwright Timeout": "Aseta Playwright aikakatkaisu", "Enter Playwright WebSocket URL": "Aseta Playwright WebSocket-aikakatkaisu", - "Enter prompt here.": "", + "Enter prompt here.": "Kirjoita kehote tähän.", "Enter proxy URL (e.g. https://user:password@host:port)": "Kirjoita välityspalvelimen verkko-osoite (esim. https://käyttäjä:salasana@host:portti)", "Enter reasoning effort": "Kirjoita päättelyn määrä", "Enter Score": "Kirjoita pistemäärä", @@ -797,7 +797,7 @@ "Enter system prompt here": "Kirjoita järjestelmäkehote tähän", "Enter Tavily API Key": "Kirjoita Tavily API -avain", "Enter Tavily Extract Depth": "Kirjoita Tavily pominta syvyys", - "Enter the prompt instructions for this automation...": "", + "Enter the prompt instructions for this automation...": "Kirjoita kehotteen ohjeet tälle automaatiolle...", "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Kirjoita julkinen WebUI verkko-osoitteesi. Verkko-osoitetta käytetään osoitteiden luontiin ilmoituksissa.", "Enter the URL of the function to import": "Kirjoita tuotavan toiminnon verkko-osoite", "Enter the URL to import": "Kirjoita tuotavan verkko-osoite", @@ -831,23 +831,23 @@ "Enter your webhook URL": "Kirjoita webhook osoitteesi", "Entra ID": "Entra ID", "Environment Variables": "Ympäristömuuttujat", - "Ephemeral": "", + "Ephemeral": "Tilapäinen", "Error": "Virhe", "ERROR": "VIRHE", "Error accessing directory": "Virhe hakemistoa avattaessa", "Error accessing Google Drive: {{error}}": "Virhe yhdistäessä Google Drive: {{error}}", "Error accessing media devices.": "Virhe medialaitteita käytettäessä.", - "Error deleting model: {{error}}": "", + "Error deleting model: {{error}}": "Virhe mallia poistaessa: {{error}}", "Error starting recording.": "Virhe nauhoitusta aloittaessa.", "Error unloading model: {{error}}": "Virhe mallia ladattaessa: {{error}}", "Error uploading file: {{error}}": "Virhe ladattaessa tiedostoa: {{error}}", "Error: A model with the ID '{{modelId}}' already exists. Please select a different ID to proceed.": "Virhe: Malli '{{modelId}}' on jo käytössä. Valitse toinen ID jatkaaksesi.", "Error: Model ID cannot be empty. Please enter a valid ID to proceed.": "Virhe: Mallin ID ei voi olla tyhjä. Kirjoita ID jatkaaksesi.", "Evaluations": "Arvioinnit", - "Event created": "", - "Event deleted": "", - "Event title": "", - "Event updated": "", + "Event created": "Tapahtuma luotu", + "Event deleted": "Tapahtuma poistettu", + "Event title": "Tapahtuman otsikko", + "Event updated": "Tapahtuma päivitetty", "Exa API Key": "Exa API -avain", "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Esimerkki: (&(objectClass=inetOrgPerson)(uid=%s))", "Example: ALL": "Esimerkki: KAIKKI", @@ -859,7 +859,7 @@ "Execute code": "Suorita koodi", "Execute code for analysis": "Suorita koodi analysointia varten", "Executing **{{NAME}}**...": "Suoritetaan **{{NAME}}**...", - "Execution Logs": "", + "Execution Logs": "Suorituslokit", "Expand": "Laajenna", "Experimental": "Kokeellinen", "Explain": "Selitä", @@ -869,8 +869,8 @@ "Export": "Vie", "Export All Archived Chats": "Vie kaikki arkistoidut keskustelut", "Export All Chats (All Users)": "Vie kaikki keskustelut (kaikki käyttäjät)", - "Export as CSV": "", - "Export as JSON": "", + "Export as CSV": "Vie CSV-tiedostona", + "Export as JSON": "Vie JSON:na", "Export chat (.json)": "Vie keskustelu (.json)", "Export Chats": "Vie keskustelut", "Export Config": "Vie asetukset", @@ -896,7 +896,7 @@ "Failed to connect to {{URL}} terminal server": "Yhdistäminen {{URL}} päätepalvelimeen epäonnistui", "Failed to copy link": "Linkin kopiointi epäonnistui", "Failed to create API Key.": "API-avaimen luonti epäonnistui.", - "Failed to delete calendar": "", + "Failed to delete calendar": "Kalenterin poistaminen epäonnistui", "Failed to delete note": "Muistiinpanon poistaminen epäonnistui", "Failed to download image": "Kuvan lataaminen epäonnistui", "Failed to extract content from the file: {{error}}": "Tiedoston sisällön pomiminen epäonnistui: {{error}}", @@ -1068,7 +1068,7 @@ "History": "Historia", "Home": "Koti", "Host": "Palvelin", - "Hourly": "", + "Hourly": "Tunneittain", "Hourly Messages": "Tuntikohtaiset viestit", "How can I help you today?": "Miten voin auttaa sinua tänään?", "How would you rate this response?": "Kuinka arvioisit tätä vastausta?", @@ -1128,7 +1128,7 @@ "Insert Suggestion Prompt to Input": "Lisää kehote ehdotus syötteeseen", "Install from Github URL": "Asenna Github-URL:stä", "Instant Auto-Send After Voice Transcription": "Heti automaattinen lähetys äänitunnistuksen jälkeen", - "Instructions": "", + "Instructions": "Ohjeistukset", "Integration": "Integrointi", "Integrations": "Integraatiot", "Interface": "Käyttöliittymä", @@ -1188,7 +1188,7 @@ "Last 90 days": "Viimeiset 90 päivää", "Last Active": "Viimeksi aktiivinen", "Last Modified": "Viimeksi muokattu", - "Last ran": "", + "Last ran": "Viimeksi suoritettu", "Last reply": "Viimeksi vastattu", "LDAP": "LDAP", "LDAP server updated": "LDAP-palvelin päivitetty", @@ -1218,7 +1218,7 @@ "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "Rajoita samanaikaisia hakukyselyitä. 0 = rajoittamaton (oletus). Aseta arvoon 1 peräkkäistä suoritusta varten (suositellaan API-rajapinnoille, joilla on tiukat nopeusrajoitukset, kuten Brave-ilmaistaso).", "Limits the number of concurrent embedding requests. Set to 0 for unlimited.": "Rajoittaa samanaikaisten upotuspyyntöjen määrää. Arvolla 0 ei rajoituksia.", "List": "Lista", - "List calendars, search, create, update, and delete calendar events": "", + "List calendars, search, create, update, and delete calendar events": "Listaa kalenterit, hae, luo, päivitä ja poista kalenteritapahtumia", "Listening...": "Kuuntelee...", "Live": "Live", "Llama.cpp": "Llama.cpp", @@ -1229,7 +1229,7 @@ "local": "paikallinen", "Local": "Paikallinen", "Local Task Model": "Paikallinen työmalli", - "Location": "", + "Location": "Sijainti", "Location access not allowed": "Ei pääsyä sijaintitietoihin", "Lost": "Mennyt", "Low": "Matala", @@ -1297,15 +1297,15 @@ "Model": "Malli", "Model '{{modelName}}' has been successfully downloaded.": "Malli '{{modelName}}' ladattiin onnistuneesti.", "Model '{{modelTag}}' is already in queue for downloading.": "Malli '{{modelTag}}' on jo jonossa ladattavaksi.", - "Model {{modelId}} not found": "", - "Model {{modelName}} deleted successfully": "", + "Model {{modelId}} not found": "Malli {{modelId}} ei löytynyt", + "Model {{modelName}} deleted successfully": "Malli {{modelName}} poistettu onnistuneesti", "Model {{modelName}} is not vision capable": "Malli {{modelName}} ei kykene näkökykyyn", "Model {{name}} is now {{status}}": "Malli {{name}} on nyt {{status}}", "Model {{name}} is now hidden": "Malli {{name}} on nyt piilotettu", "Model {{name}} is now visible": "Malli {{name}} on nyt näkyvissä", "Model accepts file inputs": "Malli hyväksyy tiedostosyötteet", "Model accepts image inputs": "Malli hyväksyy kuvasyötteitä", - "Model can access Open Terminal for command execution and file management": "", + "Model can access Open Terminal for command execution and file management": "Malli voi käyttää Open Terminal-toimintoa komentojen suorittamiseen ja tiedostojen hallintaan.", "Model can execute code and perform calculations": "Malli voi suorittaa koodia ja laskelmia", "Model can generate images based on text prompts": "Malli voi luoda kuvia tekstikehotteiden perusteella", "Model can search the web for information": "Malli voi hakea tietoa verkosta", @@ -1339,8 +1339,8 @@ "Models Sharing": "Mallien jako", "Mojeek": "", "Mojeek Search API Key": "Mojeek Search API -avain", - "Month": "", - "Monthly": "", + "Month": "Kuukausi", + "Monthly": "Kuukausittain", "More": "Lisää", "More Concise": "Lyhyemmin", "More options": "Lisää vaihtoehtoja", @@ -1351,14 +1351,14 @@ "Name": "Nimi", "Name and ID are required, please fill them out": "Nimi ja ID vaaditaan, täytä puuttuvat kentät", "Name your knowledge base": "Anna tietokannalle nimi", - "Name, prompt, and model are required": "", + "Name, prompt, and model are required": "Nimi, kehote ja malli ovat pakollisia", "Native": "Natiivi", - "Never": "", + "Never": "Ei koskaan", "New": "Uusi", - "New Automation": "", + "New Automation": "Uusi automaatio", "New Button": "Uusi painike", "New Chat": "Uusi keskustelu", - "New Event": "", + "New Event": "Uusi tapahtuma", "New File": "Uusi tiedosto", "New Folder": "Uusi kansio", "New Function": "Uusi toiminto", @@ -1375,11 +1375,11 @@ "New Webhook": "Uusi Webhook", "new-channel": "uusi-kanava", "Next message": "Seuraava viesti", - "Next run": "", + "Next run": "Seuraava suoritus", "No access grants. Private to you.": "Ei käyttöoikeuksia. Yksityinen sinulle.", "No activity data": "Ei aktiivisuustietoja", "No authentication": "Ei todennusta", - "No automations found": "", + "No automations found": "Automaatioita ei löytynyt", "No chats found": "Keskuteluja ei löytynyt", "No chats found for this user.": "Käyttäjän keskusteluja ei löytynyt.", "No chats found.": "Keskusteluja ei löytynyt", @@ -1390,7 +1390,7 @@ "No data": "Ei dataa", "No data found": "Dataa ei löytynyt", "No distance available": "Etäisyyttä ei saatavilla", - "No execution logs available yet": "", + "No execution logs available yet": "Suorituslokeja ei saatavilla", "No expiration can pose security risks.": "Vanhenemisen laittamatta jättäminen voi altistaa tietoturvariskeille.", "No feedback found": "Ei palautetta", "No file selected": "Tiedostoa ei ole valittu", @@ -1437,7 +1437,7 @@ "Not factually correct": "Ei faktuaalisesti oikein", "Not helpful": "Ei hyödyllinen", "Not Registered": "Ei kirjautunut", - "Not scheduled": "", + "Not scheduled": "Ei aikataulutettu", "Note": "Muistiinpano", "Note deleted successfully": "Muistiinpano poistettiin onnistuneesti", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Huomautus: Jos asetat vähimmäispistemäärän, haku palauttaa vain sellaiset asiakirjat, joiden pistemäärä on vähintään vähimmäismäärä.", @@ -1462,7 +1462,7 @@ "Ollama Cloud API Key": "Ollama Cloud API avain", "Ollama Version": "Ollama-versio", "On": "Päällä", - "Once": "", + "Once": "Kerran", "OneDrive": "OneDrive", "Only active when \"Paste Large Text as File\" setting is toggled on.": "Aktiivinen vain, kun \"Liitä suuri teksti tiedostona\" -asetus on käytössä.", "Only active when the chat input is in focus and an LLM is generating a response.": "Aktiivinen vain, kun tekstikenttä on kohdistettuna ja LLM luo vastausta.", @@ -1528,8 +1528,8 @@ "Password": "Salasana", "Passwords do not match.": "Salasanat eivät täsmää", "Paste Large Text as File": "Liitä suuri teksti tiedostona", - "Path copied": "", - "Paused": "", + "Path copied": "Polku kopioitu", + "Paused": "Keskeytetty", "PDF document (.pdf)": "PDF-asiakirja (.pdf)", "PDF Extract Images (OCR)": "Poimi kuvat PDF:stä (OCR)", "PDF Loader Mode": "PDF latausmoodi", @@ -1548,7 +1548,7 @@ "Persistent": "Pysyvä", "Personalization": "Personointi", "Pin": "Kiinnitä", - "Pin to Sidebar": "", + "Pin to Sidebar": "Kiinnitä sivupalkkiin", "Pinned": "Kiinnitetty", "Pinned Messages": "Kiinnitetyt viestit", "Pinned Models": "Kiinnitetyt mallit", @@ -1635,8 +1635,8 @@ "Reason": "Päättely", "Reasoning Effort": "Päättelyn määrä", "Reasoning Tags": "Päättely tagit", - "Recently Used": "", - "Reconnected": "", + "Recently Used": "Viimeeksi käytetty", + "Reconnected": "Yhdistetty", "Record": "Nauhoita", "Record voice": "Nauhoita ääntä", "Redirecting you to Open WebUI Community": "Ohjataan sinut OpenWebUI-yhteisöön", @@ -1660,7 +1660,7 @@ "Relevance": "Relevanssi", "Relevance Threshold": "Relevanssikynnys", "Remember Dismissal": "Muista sulkeminen", - "Reminder": "", + "Reminder": "Muistutus", "Remove": "Poista", "Remove {{MODELID}} from list.": "Poista {{MODELID}} listalta", "Remove action": "Poista toiminto", @@ -1673,7 +1673,7 @@ "Renamed to {{name}}": "Nimetty uudelleen {{name}}", "Render Markdown in Previews": "Renderöi Markdown esikatseluissa", "Reorder Models": "Uudelleenjärjestä malleja", - "Repeats": "", + "Repeats": "Toistot", "Reply": "Vastaa", "Reply in Thread": "Vastaa ketjussa", "Reply to thread...": "Vastaa ketjussa...", @@ -1707,8 +1707,8 @@ "RTL": "RTL", "Run": "Suorita", "Run All": "Suorita kaikki", - "Run now": "", - "Run Now": "", + "Run now": "Suorita nyt", + "Run Now": "Suorita nyt", "Running": "Käynnissä", "Running...": "Käynnissä...", "Runs embedding tasks concurrently to speed up processing. Turn off if rate limits become an issue.": "Suorittaa upotustehtäviä samanaikaisesti käsittelyn nopeuttamiseksi. Poista käytöstä, jos kutsurajoituksesta tulee ongelma.", @@ -1720,15 +1720,15 @@ "Save Chat": "Tallenna keskustelu", "Saved": "Tallennettu", "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Keskustelulokien tallentaminen suoraan selaimen tallennustilaan ei ole enää tuettu. Lataa ja poista keskustelulokit napsauttamalla alla olevaa painiketta. Älä huoli, voit helposti tuoda keskustelulokit takaisin backendiin", - "Schedule": "", - "Scheduled time must be in the future": "", + "Schedule": "Aikataulu", + "Scheduled time must be in the future": "Aikataulutetun ajan on oltava tulevaisuudessa", "Scroll On Branch Change": "Vieritä haaran vaihtoon", "Search": "Haku", "Search a model": "Hae mallia", "Search all emojis": "Hae emojeista", "Search and manage user memories": "Hae ja hallinnoi käyttäjien muistoja", "Search and view user chat history": "Hae ja tarkastele käyttäjän keskusteluhistoriaa", - "Search Automations": "", + "Search Automations": "Etsi automaatioita", "Search Base": "Hakupohja", "Search channels and channel messages": "Hae kanavia ja kanavaviestejä", "Search Chats": "Hae keskusteluja", @@ -1798,7 +1798,7 @@ "Select how to split message text for TTS requests": "Valitse, miten viestit jaetaan TTS-pyyntöjä varten", "Select Knowledge": "Valitse tietämys", "Select Method": "Valitse metodi", - "Select model": "", + "Select model": "Valitse malli", "Select only one model to call": "Valitse vain yksi malli kutsuttavaksi", "Select view": "Valitse näkymä", "Selected model: {{modelName}}": "Valittu malli: {{modelName}}", @@ -1907,12 +1907,12 @@ "Start a new conversation": "Aloita uusi keskustelu", "Start of the channel": "Kanavan alku", "Start Tag": "Aloitus tagi", - "Starting in {{count}} minutes_one": "", - "Starting in {{count}} minutes_other": "", - "Starting in 1 minute": "", + "Starting in {{count}} minutes_one": "Aloitetaan {{count}} minutes_one", + "Starting in {{count}} minutes_other": "Aloitetaan {{count}} minutes_other", + "Starting in 1 minute": "Aloitetaan minuutin kuluttua", "Starting kernel...": "Käynnistetään kerneliä...", - "Starting now": "", - "State": "", + "Starting now": "Aloitetaan nyt", + "State": "Tila", "Status": "Tila", "Status cleared successfully": "Tila poistettu onnistuneesti", "Status updated successfully": "Tila päivitetty onnistuneesti", @@ -1923,7 +1923,7 @@ "Stop Download": "Lopeta lataus", "Stop Generating": "Lopeta generointi", "Stop Sequence": "Lopetussekvenssi", - "Storage": "", + "Storage": "Käyttötila", "Stream Chat Response": "Striimaa keskusteluvastaus", "Stream Delta Chunk Size": "Striimin delta-lohkon koko", "Streamable HTTP": "Streamable HTTP", @@ -1964,10 +1964,10 @@ "Talk to Model": "Puhu mallille", "Tap to interrupt": "Napauta keskeyttääksesi", "Task List": "Tehtävälista", - "Task Management": "", + "Task Management": "Tehtävien hallinta", "Task Model": "Työmalli", "Tasks": "Tehtävät", - "tasks completed": "", + "tasks completed": "Tehtävät suoritettu", "Tavily API Key": "Tavily API -avain", "Tavily Extract Depth": "Tavily poiminta syvyys", "Tell us more:": "Kerro lisää:", @@ -1999,7 +1999,7 @@ "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Pisteytyksen tulee olla arvo välillä 0,0 (0 %) ja 1,0 (100 %).", "The stream delta chunk size for the model. Increasing the chunk size will make the model respond with larger pieces of text at once.": "Mallin striimin delta-lohkon koko. Lohkon koon kasvattaminen saa mallin vastaamaan kerralla suuremmilla tekstipaloilla.", "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "Mallin lämpötila. Lisäämällä lämpötilaa mallin vastaukset ovat luovempia.", - "The Weight of BM25 Hybrid Search. 0 more semantic, 1 more lexical. Default 0.5": "", + "The Weight of BM25 Hybrid Search. 0 more semantic, 1 more lexical. Default 0.5": "BM25-hybridihaun painoarvo. 0 semanttista, 1 leksikaalista. Oletusarvo 0,5", "The width in pixels to compress images to. Leave empty for no compression.": "Leveys pikseleinä, johon kuvat pakataan. Jätä tyhjäksi, jos et halua pakkausta.", "Theme": "Teema", "There was an error syncing your stats. Please try again.": "Tilastojen synkronoinnissa tapahtui virhe. Yritä uudelleen.", @@ -2024,7 +2024,7 @@ "This will delete {{NAME}} and all its contents.": "Tämä poistaa {{NAME}} ja kaikki sen sisällöt.", "This will delete all models including custom models": "Tämä poistaa kaikki mallit mukaan lukien mukautetut mallit", "This will delete all models including custom models and cannot be undone.": "Tämä poistaa kaikki mallit, mukaan lukien mukautetut mallit, eikä sitä voi peruuttaa.", - "This will permanently delete the calendar \"{{name}}\" and all its events. This action cannot be undone.": "", + "This will permanently delete the calendar \"{{name}}\" and all its events. This action cannot be undone.": "Tämä poistaa pysyvästi kalenterin \"{{name}}\" ja kaikki sen tapahtumat. Tätä toimintoa ei voi peruuttaa.", "This will reset the knowledge base and sync all files. Do you wish to continue?": "Tämä nollaa tietokannan ja synkronoi kaikki tiedostot. Haluatko jatkaa?", "Thorough explanation": "Perusteellinen selitys", "Thought": "Ajatus", @@ -2036,7 +2036,7 @@ "Tika": "Tika", "Tika Server URL required.": "Tika palvelimen verkko-osoite vaaditaan.", "Tiktoken": "Tiktoken", - "Time": "", + "Time": "Aika", "Time & Calculation": "Aika ja laskenta", "Timeout": "Aikakatkaisu", "Title": "Otsikko", @@ -2044,7 +2044,7 @@ "Title cannot be an empty string.": "Otsikko ei voi olla tyhjä merkkijono.", "Title Generation": "Otsikon luonti", "Title Generation Prompt": "Otsikon luontikehote", - "Title is required": "", + "Title is required": "Otsikko on pakollinen", "TLS": "TLS", "To access the available model names for downloading,": "Päästäksesi käsiksi ladattavissa oleviin mallinimiin,", "To access the GGUF models available for downloading,": "Päästäksesi käsiksi ladattavissa oleviin GGUF-malleihin,", @@ -2055,7 +2055,7 @@ "To select toolkits here, add them to the \"Tools\" workspace first.": "Valitaksesi työkalusettejä tässä, lisää ne ensin \"Työkalut\"-työtilaan.", "Toast notifications for new updates": "Ilmoituspopuppien näyttäminen uusista päivityksistä", "Today": "Tänään", - "Today at": "", + "Today at": "Tänään", "Today at {{LOCALIZED_TIME}}": "Tänään {{LOCALIZED_TIME}}", "Toggle {{COUNT}} sources": "Näytä/piilota {{COUNT}} lähdettä", "Toggle 1 source": "Näytä/piilota 1 lähde", @@ -2111,7 +2111,7 @@ "Unloads {{FROM_NOW}}": "Purkuja {{FROM_NOW}}", "Unlock mysteries": "Selvitä arvoituksia", "Unpin": "Irrota kiinnitys", - "Unpin from Sidebar": "", + "Unpin from Sidebar": "Irrota sivupalkista", "Unravel secrets": "Avaa salaisuuksia", "Unshare Chat": "Lopeta keskustelun jakaminen", "Unsupported file type.": "Ei tuettu tiedostotyyppi", @@ -2196,7 +2196,7 @@ "Waiting for upload...": "Odottaa latausta...", "Warning": "Varoitus", "Warning:": "Varoitus:", - "Warning: Enabling this will allow users to run scheduled prompts automatically.": "", + "Warning: Enabling this will allow users to run scheduled prompts automatically.": "Varoitus: Tämän käyttöönotto sallii käyttäjien suorittaa aikataulutettuja kehotteita automaattisesti.", "Warning: Enabling this will allow users to upload arbitrary code on the server.": "Varoitus: Tämän käyttöönotto sallii käyttäjien ladata mielivaltaista koodia palvelimelle.", "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Varoitus: Jupyter käyttö voi mahdollistaa mielivaltaiseen koodin suorittamiseen, mikä voi aiheuttaa tietoturvariskejä - käytä äärimmäisen varoen.", "We_day_of_week": "", @@ -2216,15 +2216,15 @@ "WebUI will make requests to \"{{url}}\"": "WebUI lähettää pyyntöjä osoitteeseen \"{{url}}\"", "WebUI will make requests to \"{{url}}/api/chat\"": "WebUI lähettää pyyntöjä osoitteeseen \"{{url}}/api/chat\"", "WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI lähettää pyyntöjä osoitteeseen \"{{url}}/chat/completions\"", - "Week": "", - "Weekly": "", + "Week": "Viikko", + "Weekly": "Viikoittain", "What are you trying to achieve?": "Mitä yrität saavuttaa?", "What are you working on?": "Mitä olet työskentelemässä?", "What is NOT shared:": "Mitä EI jaeta:", "What is shared:": "Mitä jaetaan:", "What's New in": "Mitä uutta", "What's on your mind?": "Mitä ajattelet?", - "When": "", + "When": "Milloin", "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Kun käytössä, malli vastaa jokaiseen chatviestiin reaaliajassa, tuottaen vastauksen heti kun käyttäjä lähettää viestin. Tämä tila on hyödyllinen reaaliaikaisissa chat-sovelluksissa, mutta voi vaikuttaa suorituskykyyn hitaammilla laitteistoilla.", "wherever you are": "missä tahansa oletkin", "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "Sivutetaanko tuloste. Jokainen sivu erotetaan toisistaan vaakasuoralla viivalla ja sivunumerolla. Oletusarvo ei käytössä.", @@ -2235,7 +2235,7 @@ "Width": "Leveys", "Wikipedia": "", "Won": "Voitti", - "Working Directory": "", + "Working Directory": "Työhakemisto", "Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Toimii top-k:n kanssa. Korkeampi arvo (esim. 0.95) johtaa monipuolisempaan tekstiin, kun taas matalampi arvo (esim. 0.5) tuottaa kohdennetumpaa ja konservatiivisempaa teksti.", "Workspace": "Työtila", "Workspace Permissions": "Työtilan käyttöoikeudet", From d47993385a450411e4cdb90b204cc351dd71a212 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 14:35:15 +0900 Subject: [PATCH 04/51] refac --- backend/requirements.txt | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index 9aaa3aad5d..3437ab7652 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -23,7 +23,7 @@ httpx[socks,http2,zstd,cli,brotli]==0.28.1 starsessions[redis]==2.2.1 python-mimeparse==2.0.0 -sqlalchemy==2.0.48 +sqlalchemy[asyncio]==2.0.48 aiosqlite==0.21.0 asyncpg==0.30.0 alembic==1.18.4 diff --git a/pyproject.toml b/pyproject.toml index b6d07a61f7..e405188cb4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ dependencies = [ "starsessions[redis]==2.2.1", "python-mimeparse==2.0.0", - "sqlalchemy==2.0.48", + "sqlalchemy[asyncio]==2.0.48", "aiosqlite==0.21.0", "asyncpg==0.30.0", "alembic==1.18.4", From 91d98702666d57a6bcaa6bd8406651d314f0e914 Mon Sep 17 00:00:00 2001 From: Teay Date: Fri, 24 Apr 2026 07:38:12 +0200 Subject: [PATCH 05/51] i18n: update ko-KR translations (conflict solved) (#23949) * i18n: update ko-KR translations * i18n: fix missing ko-KR translations and reviewed pr-bot recommendation --- src/lib/i18n/locales/ko-KR/translation.json | 1295 +++++++++---------- 1 file changed, 630 insertions(+), 665 deletions(-) diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index e29c402508..2acbd0b8a1 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -12,46 +12,41 @@ "{{COUNT}} Available Tools": "사용 가능한 도구 {{COUNT}}개", "{{COUNT}} characters": "{{COUNT}} 문자", "{{COUNT}} extracted lines": "추출된 줄 {{COUNT}}개", - "{{COUNT}} files": "", + "{{COUNT}} files": "{{COUNT}}개 파일", "{{COUNT}} hidden lines": "숨겨진 줄 {{COUNT}}개", - "{{COUNT}} members": "", + "{{COUNT}} members": "{{COUNT}}명의 멤버", "{{COUNT}} Replies": "답글 {{COUNT}}개", - "{{COUNT}} Rows": "", - "{{count}} selected_other": "", + "{{COUNT}} Rows": "{{COUNT}}개 행", + "{{count}} selected_other": "{{count}}개 선택됨", "{{COUNT}} Sources": "{{COUNT}}개의 소스", "{{COUNT}} words": "{{COUNT}} 단어", - "{{COUNT}}d_time_ago": "", - "{{COUNT}}h_time_ago": "", - "{{COUNT}}m_time_ago": "", - "{{COUNT}}w_time_ago": "", - "{{COUNT}}y_time_ago": "", - "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "", + "{{COUNT}}d_time_ago": "{{COUNT}}일 전", + "{{COUNT}}h_time_ago": "{{COUNT}}시간 전", + "{{COUNT}}m_time_ago": "{{COUNT}}분 전", + "{{COUNT}}w_time_ago": "{{COUNT}}주 전", + "{{COUNT}}y_time_ago": "{{COUNT}}년 전", + "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "{{LOCALIZED_DATE}}일 {{LOCALIZED_TIME}}시", "{{model}} download has been canceled": "{{model}} 다운로드가 취소되었습니다.", - "{{modelName}} profile image": "", - "{{NAMES}} reacted with {{REACTION}}": "", + "{{modelName}} profile image": "{{modelName}} 프로필 이미지", + "{{NAMES}} reacted with {{REACTION}}": "{{NAMES}} 님이 {{REACTION}}으로 반응했습니다", "{{user}}'s Chats": "{{user}}의 채팅", "{{webUIName}} Backend Required": "{{webUIName}} 백엔드가 필요합니다.", "*Prompt node ID(s) are required for image generation": "이미지 생성에는 프롬프트 노드 ID가 필요합니다.", - "1 hour before": "", - "1 Source": "소스1", - "10 minutes before": "", - "15 minutes before": "", - "1m_time_ago": "", - "30 minutes before": "", - "5 minutes before": "", - "A collaboration channel where people join as members": "", - "A discussion channel where access is controlled by groups and permissions": "", + "1 Source": "소스 1", + "1m_time_ago": "1분 전", + "A collaboration channel where people join as members": "사람들이 멤버로 참여하는 협업 채널", + "A discussion channel where access is controlled by groups and permissions": "그룹과 권한으로 접근이 제어되는 토론 채널", "A new version (v{{LATEST_VERSION}}) is now available.": "새로운 버전 (v{{LATEST_VERSION}})을 사용할 수 있습니다.", - "A private conversation between you and selected users": "", + "A private conversation between you and selected users": "나와 선택한 사용자 간의 비공개 대화", "A task model is used when performing tasks such as generating titles for chats and web search queries": "작업 모델은 채팅 및 웹 검색 쿼리에 대한 제목 생성 등의 작업 수행 시 사용됩니다.", "a user": "사용자", "About": "정보", - "Accept Autocomplete Generation\nJump to Prompt Variable": "", + "Accept Autocomplete Generation\nJump to Prompt Variable": "자동완성 생성 수락\n프롬프트 변수로 이동", "Access": "접근", "Access Control": "접근 제어", - "Access Grants": "", - "Access List": "", - "Access updated": "", + "Access Grants": "접근 권한", + "Access List": "접근 목록", + "Access updated": "접근 업데이트", "Accessible to all users": "모든 사용자가 이용할 수 있음", "Account": "계정", "Account Activation Pending": "계정 활성화 대기", @@ -64,65 +59,62 @@ "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "채팅 입력창에 \"{{COMMAND}}\"을 입력해 명령을 실행하세요.", "Active": "활성", "Active Users": "활성 사용자", - "Activity": "", + "Activity": "활동", "Add": "추가", "Add a model ID": "모델 ID 추가", "Add a short description about what this model does": "모델의 기능에 대한 간단한 설명 추가", "Add a tag": "태그 추가", - "Add a tag...": "", - "Add Access": "", + "Add a tag...": "태그 추가...", + "Add Access": "접근 권한 추가", "Add Arena Model": "아레나 모델 추가", "Add Connection": "연결 추가", "Add Content": "내용 추가", "Add content here": "여기에 내용을 추가하세요", "Add Custom Parameter": "사용자 정의 매개변수 추가", "Add Custom Prompt": "사용자 정의 프롬프트 추가", - "Add description": "", "Add Details": "디테일 추가", "Add Files": "파일 추가", - "Add Image": "", - "Add location": "", + "Add Image": "이미지 추가", "Add Member": "멤버 추가", "Add Members": "멤버 추가", "Add Memory": "메모리 추가", "Add Model": "모델 추가", "Add Reaction": "리액션 추가", - "Add tag": "", + "Add tag": "태그 추가", "Add Tag": "태그 추가", - "Add Terminal": "", - "Add Terminal Connection": "", + "Add Terminal": "터미널 추가", + "Add Terminal Connection": "터미널 연결 추가", "Add text content": "글 추가", - "Add to favorites": "", + "Add to favorites": "즐겨찾기에 추가", "Add User": "사용자 추가", "Add User Group": "사용자 그룹 추가", - "Add webpage": "", - "Add your Open Terminal URL and API key in Settings → Integrations.": "", + "Add webpage": "웹페이지 추가", + "Add your Open Terminal URL and API key in Settings → Integrations.": "설정 → 통합에서 Open Terminal URL과 API 키를 추가하세요.", "Additional Config": "추가 설정", "Additional configuration options for marker. This should be a JSON string with key-value pairs. For example, '{\"key\": \"value\"}'. Supported keys include: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level": "Marker에 대한 추가 설정 옵션입니다. 키-값 쌍으로 이루어진 JSON 문자열이어야 합니다. 예를 들어, '{\"key\": \"value\"}'와 같습니다. 지원되는 키는 다음과 같습니다: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level", - "Additional feedback comments": "", + "Additional feedback comments": "추가 피드백 의견", "Additional Parameters": "추가 매개변수", - "Adds filenames, titles, sections, and snippets into the BM25 text to improve lexical recall.": "", + "Adds filenames, titles, sections, and snippets into the BM25 text to improve lexical recall.": "어휘 검색 재현율을 높이기 위해 BM25 텍스트에 파일명, 제목, 섹션, 스니펫을 추가합니다.", "Adjusting these settings will apply changes universally to all users.": "이 설정을 조정하면 모든 사용자에게 변경 사항이 일괄 적용됩니다.", "admin": "관리자", "Admin": "관리자", - "Admin Contact Email": "", + "Admin Contact Email": "관리자 이메일", "Admin Panel": "관리자 패널", "Admin Settings": "관리자 설정", "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "관리자는 항상 모든 도구에 접근할 수 있지만, 사용자는 워크스페이스에서 모델마다 도구를 할당받아야 합니다.", - "Advanced": "", + "Advanced": "고급", "Advanced Parameters": "고급 매개변수", - "Advanced parameters for MinerU parsing (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)": "", + "Advanced parameters for MinerU parsing (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)": "MinerU 파싱을 위한 고급 매개변수(enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)", "Advanced Params": "고급 매개변수", "After updating or changing the embedding model, you must reindex the knowledge base for the changes to take effect. You can do this using the \"Reindex\" button below.": "임베딩 모델을 업데이트하거나 변경 후 변경 사항을 적용하려면 지식 베이스를 다시 인덱싱해야 합니다. 아래의 \"재색인\" 버튼을 사용하여 수행할 수 있습니다.", - "AI": "", + "AI": "AI", "All": "전체", "All chats have been unarchived.": "모든 채팅이 보관 해제되었습니다.", - "All day": "", - "All models are now hidden": "", - "All models are now visible": "", + "All models are now hidden": "모든 모델이 이제 숨김 처리되었습니다", + "All models are now visible": "모든 모델이 이제 표시됩니다", "All models deleted successfully": "성공적으로 모든 모델이 삭제되었습니다", - "All time": "", - "All Users": "", + "All time": "전체 기간", + "All Users": "모든 사용자", "Allow Call": "음성 통화 허용", "Allow Chat Controls": "채팅 제어 허용", "Allow Chat Delete": "채팅 삭제 허용", @@ -137,16 +129,16 @@ "Allow File Upload": "파일 업로드 허용", "Allow Multiple Models in Chat": "채팅에서 여러 모델 허용", "Allow non-local voices": "외부 음성 허용", - "Allow public write access": "", - "Allow Rate Response": "", + "Allow public write access": "공개 쓰기 접근 허용", + "Allow Rate Response": "응답 평가 허용", "Allow Regenerate Response": "응답 재생성 허용", - "Allow Sharing With Users": "", + "Allow Sharing With Users": "사용자와 공유 허용", "Allow Speech to Text": "음성 텍스트 변환 허용", "Allow Temporary Chat": "임시 채팅 허용", "Allow Text to Speech": "텍스트 음성 변환 허용", "Allow User Location": "사용자 위치 활용 허용", "Allow Voice Interruption in Call": "음성 기능에서 음성 방해 허용", - "Allow Web Upload": "", + "Allow Web Upload": "웹 업로드 허용", "Allowed Endpoints": "허용 엔드포인트", "Allowed File Extensions": "허용 파일 확장자", "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "업로드할 수 있는 파일 확장자. 여러 확장자를 구분하기 위해 쉼표로 구분합니다. 모든 파일 유형을 허용하려면 비워두세요.", @@ -165,50 +157,48 @@ "and {{COUNT}} more": "그리고 {{COUNT}}개 더", "and create a new shared link.": "새로운 공유 링크를 생성합니다.", "Android": "안드로이드", - "Anyone": "", + "Anyone": "누구나", "API Base URL": "API 기본 URL", "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "Datalab Marker 서비스의 API URL. 기본값: https://www.datalab.to/api/v1/marker", "API Key": "API 키", "API Key created.": "API 키가 생성되었습니다.", "API Key Endpoint Restrictions": "API 키 엔드포인트 제한", "API keys": "API 키", - "API Keys": "", - "API Mode": "", - "API Timeout": "", - "API Type": "", + "API Keys": "API 키", + "API Mode": "API 모드", + "API Timeout": "API 시간 초과", + "API Type": "API 유형", "API Version": "API 버전", - "API Version is required": "", + "API Version is required": "API 버전이 필요합니다", "Application DN": "Application DN", "Application DN Password": "Application DN 비밀번호", "applies to all users with the \"user\" role": "\"사용자\" 권한의 모든 사용자에게 적용됩니다", "April": "4월", "Archive": "보관", - "Archive All": "", + "Archive All": "모두 보관", "Archive All Chats": "모든 채팅 보관", "Archived Chats": "보관된 채팅", "archived-chat-export": "보관된 채팅 내보내기", - "Are you sure you want to archive all chats? This action cannot be undone.": "", + "Are you sure you want to archive all chats? This action cannot be undone.": "정말 모든 채팅을 보관하시겠습니까? 이 작업은 되돌릴 수 없습니다.", "Are you sure you want to clear all memories? This action cannot be undone.": "정말 모든 메모리를 지우시겠습니까? 이 작업은 되돌릴 수 없습니다.", - "Are you sure you want to delete \"{{NAME}}\"?": "", - "Are you sure you want to delete **{{modelName}}**?": "", - "Are you sure you want to delete all chats? This action cannot be undone.": "", + "Are you sure you want to delete \"{{NAME}}\"?": "정말 \"{{NAME}}\"을 삭제하시겠습니까?", + "Are you sure you want to delete all chats? This action cannot be undone.": "정말 모든 채팅을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", "Are you sure you want to delete this channel?": "정말 이 채널을 삭제하시겠습니까?", - "Are you sure you want to delete this connection? This action cannot be undone.": "", - "Are you sure you want to delete this memory? This action cannot be undone.": "", + "Are you sure you want to delete this connection? This action cannot be undone.": "정말 이 연결을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "Are you sure you want to delete this memory? This action cannot be undone.": "정말 이 메모리를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", "Are you sure you want to delete this message?": "정말 이 메시지를 삭제하시겠습니까?", - "Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "", - "Are you sure you want to delete this?": "", + "Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "정말 이 버전을 삭제하시겠습니까? 하위 버전은 이 버전의 상위 버전에 다시 연결됩니다.", + "Are you sure you want to delete this?": "정말 이 항목을 삭제하시겠습니까?", "Are you sure you want to unarchive all archived chats?": "정말 보관된 모든 채팅을 보관 해제하시겠습니까?", "Arena Models": "Arena 모델", "Artifacts": "아티팩트", - "Asc": "", + "Asc": "오름차순", "Ask": "질문", "Ask a question": "질문하기", "Assistant": "어시스턴트", - "Async Embedding Processing": "", - "At time of event": "", + "Async Embedding Processing": "비동기 임베딩 처리", "Attach File From Knowledge": "지식 기반에서 파일 첨부", - "Attach Files": "", + "Attach Files": "첨부 파일", "Attach Knowledge": "지식 기반 첨부", "Attach Notes": "노트 첨부", "Attach Webpage": "웹페이지 첨부", @@ -221,7 +211,7 @@ "Authenticate": "인증하다", "Authentication": "인증", "Auto": "자동", - "Auto (Random)": "", + "Auto (Random)": "자동 (랜덤)", "Auto-Copy Response to Clipboard": "응답을 클립보드에 자동 복사", "Auto-playback response": "응답 자동 재생", "Autocomplete Generation": "자동완성 생성", @@ -230,16 +220,16 @@ "AUTOMATIC1111 Api Auth String": "Automatic1111 API 인증 문자", "AUTOMATIC1111 Base URL": "AUTOMATIC1111 기본 URL", "AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 기본 URL 설정이 필요합니다.", - "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "", - "Automation": "", - "Automation created": "", - "Automation Name": "", - "Automation title": "", - "Automation triggered": "", - "Automation updated": "", - "Automations": "", + "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "네이티브 함수 호출 모드에서 시스템 도구(예: 타임스탬프, 메모리, 채팅 기록, 노트 등)를 자동으로 삽입합니다.", + "Automation": "자동", + "Automation created": "자동 생성", + "Automation Name": "자동 생성된 이름", + "Automation title": "자동 생성된 제목", + "Automation triggered": "자동 시행", + "Automation updated": "자동 업데이트", + "Automations": "자동", "Available list": "가능한 목록", - "Available models": "", + "Available models": "사용 가능한 모델", "Available Tools": "사용 가능한 도구", "available users": "사용 가능 사용자", "available!": "사용 가능!", @@ -253,11 +243,11 @@ "Banners": "배너", "Base Model (From)": "기본 모델(시작)", "Base Model List Cache speeds up access by fetching base models only at startup or on settings save—faster, but may not show recent base model changes.": "기본 모델 목록 캐시는 시작 시 또는 설정 저장 시에만 기본 모델을 불러와 접근 속도를 높여줍니다. 이는 더 빠르지만, 최근 기본 모델 변경 사항이 반영되지 않을 수 있습니다.", - "Bearer": "", + "Bearer": "보유자", "before": "이전", "Being lazy": "게으름 피우기", "Beta": "베타", - "Bing": "", + "Bing": "Bing", "Bing Search V7 Endpoint": "Bing Search V7 엔드포인트", "Bing Search V7 Subscription Key": "Bing Search V7 구독 키", "Bio": "소개", @@ -266,42 +256,40 @@ "Bocha Search API Key": "Bocha Search API 키", "Bold": "굵게", "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "특정 토큰을 가중 상향/하향하여 응답을 제약합니다. 값은 -100 ~ 100(기본값: 없음)", - "Brave": "", + "Brave": "Brave", "Brave Search API Key": "Brave Search API 키", - "Break down complex requests into trackable steps": "", - "Browse and query knowledge bases": "", - "Builtin Tools": "", + "Break down complex requests into trackable steps": "복잡한 요청을 추적 가능한 단계로 나누세요", + "Browse and query knowledge bases": "지식 기반 탐색 및 쿼리", + "Builtin Tools": "내장(빌트인) 도구", "Bullet List": "글머리 기호 목록", "Button ID": "버튼 ID", "Button Label": "버튼 레이블", "Button Prompt": "버튼 프롬프트", - "by {{name}}": "", + "by {{name}}": "작성자: {{name}}", "By {{name}}": "작성자: {{name}}", "Bypass Embedding and Retrieval": "임베딩 검색 우회", "Bypass Web Loader": "웹 콘텐츠 불러오기 생략", "Cache Base Model List": "기본 모델 목록 캐시", "Calendar": "캘린더", - "Calendar deleted": "", - "Calendars": "", "Call": "음성 기능", "Call feature is not supported when using Web STT engine": "웹 STT 엔진 사용 시, 음성 기능은 지원되지 않습니다.", "Camera": "카메라", "Cancel": "취소", - "Cancel download of {{model}}": "", - "Cannot create an empty note.": "", - "Cannot delete the production version": "", + "Cancel download of {{model}}": "{{model}} 다운로드 취소", + "Cannot create an empty note.": "빈 노트를 생성할 수 없습니다.", + "Cannot delete the production version": "이 프로덕션 버전은 삭제할 수 없습니다.", "Capabilities": "기능", "Capture": "캡처", "Capture Audio": "오디오 캡처", "Certificate Path": "인증서 경로", - "Change folder icon": "", + "Change folder icon": "폴더 아이콘 변경", "Change Password": "비밀번호 변경", - "Change User Role": "", + "Change User Role": "사용자 역할 변경", "Channel": "채널", "Channel deleted successfully": "채널 삭제 성공", "Channel Name": "채널 이름", "Channel name cannot be empty.": "채널 이름은 비워둘 수 없습니다.", - "Channel name must be less than 128 characters": "", + "Channel name must be less than 128 characters": "채널 이름은 128자 미만이어야 합니다", "Channel Type": "채널 타입", "Channel updated successfully": "채널 업데이트 성공", "Channels": "채널", @@ -309,35 +297,35 @@ "Character limit for autocomplete generation input": "자동 완성 생성 입력 문자 제한", "Chart new frontiers": "새로운 영역 개척", "Chat": "채팅", - "Chat archived.": "", + "Chat archived.": "채팅 보관됨.", "Chat Background Image": "채팅 배경 이미지", "Chat Bubble UI": "버블형 채팅 UI", - "Chat Completions": "", + "Chat Completions": "채팅 완성", "Chat Conversation": "채팅 대화", "Chat direction": "채팅 방향", - "Chat exported successfully": "", - "Chat History": "", + "Chat exported successfully": "채팅 내보내기 성공", + "Chat History": "채팅 기록", "Chat ID": "채팅 ID", "Chat moved successfully": "채팅 이동 성공", "Chat Permissions": "채팅 권한", "Chat Tags Auto-Generation": "채팅 태그 자동생성", - "Chat unshared successfully.": "", - "chats": "", + "Chat unshared successfully.": "채팅 공유 해제 성공", + "chats": "채팅", "Chats": "채팅", "Check Again": "다시 확인", "Check for updates": "업데이트 확인", "Checking for updates...": "업데이트 확인중...", "Choose a model before saving...": "저장하기 전에 모델을 선택하세요...", - "Chunk Min Size Target": "", + "Chunk Min Size Target": "최소 청크 크기 목표", "Chunk Overlap": "청크 중첩", "Chunk Size": "청크 크기", - "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "", + "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "이 임계값보다 작은 청크는 가능한 경우 이웃한 청크와 병합됩니다. 병합을 비활성화하려면 0으로 설정하세요.", "Ciphers": "암호", "Citation": "인용", "Citations": "인용", "Clear memory": "메모리 초기화", "Clear Memory": "메모리 지우기", - "Clear search": "", + "Clear search": "검색 초기화", "Clear status": "상태 초기화", "click here": "여기를 클릭하세요", "Click here for filter guides.": "필터 가이드를 보려면 여기를 클릭하세요.", @@ -352,30 +340,30 @@ "Click here to upload a workflow.json file.": "workflow.json 파일을 업로드하려면 여기를 클릭하세요", "click here.": "여기를 클릭하세요.", "Click on the user role button to change a user's role.": "사용자 역할 버튼을 클릭하여 사용자의 역할을 변경하세요.", - "Click to connect": "", - "Click to copy ID": "", - "Client ID": "", - "Client Secret": "", + "Click to connect": "연결하려면 클릭하세요", + "Click to copy ID": "ID를 복사하려면 클릭하세요", + "Client ID": "클라이언트 ID", + "Client Secret": "클라이언트 시크릿", "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "클립보드 쓰기 권한이 거부되었습니다. 브라우저 설정에서 권한을 허용해주세요.", "Clone": "복제", "Clone Chat": "채팅 복제", "Clone of {{TITLE}}": "{{TITLE}}의 복제본", "Close": "닫기", "Close Banner": "배너 닫기", - "Close chat controls": "", - "Close citation modal": "", + "Close chat controls": "채팅 제어 닫기", + "Close citation modal": "인용 모달 닫기", "Close Configure Connection Modal": "연결 설정 닫기", - "Close feedback": "", + "Close feedback": "피드백 닫기", "Close modal": "닫기", - "Close Modal": "", + "Close Modal": "모달 닫기", "Close settings modal": "설정 닫기", "Close Sidebar": "사이드바 닫기", - "cloud": "", + "cloud": "클라우드", "CMU ARCTIC speaker embedding name": "CMU ARCTIC 화자 임베딩 이름", "Code Block": "코드 블록", "Code Editor": "코드 편집기", "Code execution": "코드 실행", - "Code Execution": "", + "Code Execution": "코드 실행", "Code Execution Engine": "코드 실행 엔진", "Code Execution Timeout": "코드 실행 시간 초과", "Code formatted successfully": "코드 포맷팅이 성공적으로 완료되었습니다.", @@ -385,7 +373,7 @@ "Collaboration channel where people join as members": "사람들이 멤버로 참여하는 협업 채널", "Collapse": "접기", "Collection": "컬렉션", - "Collections": "", + "Collections": "컬렉션", "Color": "색상", "ComfyUI": "ComfyUI", "ComfyUI API Key": "ComfyUI API 키", @@ -394,32 +382,31 @@ "ComfyUI Workflow": "ComfyUI 워크플로", "ComfyUI Workflow Nodes": "ComfyUI 워크플로 노드", "Comma separated Node Ids (e.g. 1 or 1,2)": "쉼표로 구분된 노드 아이디 (예: 1 또는 1,2)", - "command": "", + "command": "명령", "Command": "명령", "Comment": "주석", - "Commit Message": "", - "Community Reviews": "", + "Commit Message": "커밋 메시지", + "Community Reviews": "커뮤니티 리뷰", "Completions": "완성됨", "Compress Images in Channels": "채널에 이미지들 압축하기", "Concurrent Requests": "동시 요청 수", - "Config": "", + "Config": "구성", "Config imported successfully": "구성을 성공적으로 가져왔습니다", - "Configuration": "", + "Configuration": "구성", "Configure": "구성", "Confirm": "확인", "Confirm Password": "비밀번호 확인", - "Confirm Prompt from Embed": "", + "Confirm Prompt from Embed": "임베드에서 확인 프롬프트", "Confirm your action": "작업 확인", "Confirm your new password": "새로운 비밀번호를 한 번 더 입력해 주세요", "Confirm Your Password": "비밀번호를 확인해주세요", - "Connect to an AI provider to start chatting": "", - "Connect to Open Terminal instances to browse files and use them as always-on tools. Only one can be active at a time.": "", - "Connect to Open Terminal instances. All users will have access to file browsing and terminal tools through these servers.": "", + "Connect to an AI provider to start chatting": "AI 제공자에 연결하여 채팅을 시작하세요", + "Connect to Open Terminal instances to browse files and use them as always-on tools. Only one can be active at a time.": "파일을 탐색하고 항상 켜진 도구로 사용하려면 Open Terminal 인스턴스에 연결하세요. 한 번에 하나만 활성화할 수 있습니다.", + "Connect to Open Terminal instances. All users will have access to file browsing and terminal tools through these servers.": "Open Terminal 인스턴스에 연결합니다. 모든 사용자는 이 서버를 통해 파일 탐색과 터미널 도구를 사용할 수 있습니다.", "Connect to your own OpenAI compatible API endpoints.": "OpenAI 호환 API 엔드포인트에 연결합니다.", "Connect to your own OpenAPI compatible external tool servers.": "OpenAPI 호환 외부 도구 서버에 연결합니다.", - "Connected ({{type}})": "", + "Connected ({{type}})": "{{type}}에 연결됨", "Connection failed": "연결 실패", - "Connection lost. Reconnecting...": "", "Connection successful": "연결 성공", "Connection Type": "연결 방식", "Connections": "연결", @@ -429,7 +416,7 @@ "Contact Admin for WebUI Access": "WebUI 접속을 위해서는 관리자에게 연락에 연락하십시오", "Content": "내용", "Content Extraction Engine": "콘텐츠 추출 엔진", - "Content lengths (character counts only)": "", + "Content lengths (character counts only)": "콘텐츠 길이(문자 수만)", "Continue Response": "응답 이어 받기", "Continue with {{provider}}": "{{provider}}로 계속", "Continue with Email": "이메일로 계속", @@ -444,30 +431,30 @@ "Copied shared chat URL to clipboard!": "채팅 공유 URL이 클립보드에 복사되었습니다!", "Copied to clipboard": "클립보드에 복사되었습니다", "Copy": "복사", - "Copy API Key": "", - "Copy content": "", + "Copy API Key": "API 키 복사", + "Copy content": "콘텐츠 복사", "Copy Formatted Text": "서식 있는 텍스트 복사", "Copy Last Code Block": "마지막 코드 블록 복사", "Copy Last Response": "마지막 응답 복사", "Copy link": "링크 복사", "Copy Link": "링크 복사", - "Copy Path": "", - "Copy Prompt": "", - "Copy Share Link": "", + "Copy Path": "경로 복사", + "Copy Prompt": "프롬프트 복사", + "Copy Share Link": "공유 링크 복사", "Copy to clipboard": "클립보드에 복사", - "Copy Token": "", - "Copy URL": "", + "Copy Token": "토큰 복사", + "Copy URL": "URL 복사", "Copying to clipboard was successful!": "성공적으로 클립보드에 복사되었습니다!", "CORS must be properly configured by the provider to allow requests from Open WebUI.": "Open WebUI의 요청을 허용하려면 공급자가 CORS를 올바르게 구성해야 합니다.", - "Could not read file.": "", - "CPU": "", + "Could not read file.": "파일을 읽을 수 없습니다.", + "CPU": "CPU", "Create": "생성", "Create a knowledge base": "지식 기반 생성", "Create a model": "모델 생성", "Create a new note": "새 노트 생성", "Create Account": "계정 생성", "Create Admin Account": "관리자 계정 생성", - "Create and manage scheduled automations": "", + "Create and manage scheduled automations": "예약된 자동화를 생성하고 관리합니다", "Create Channel": "채널 생성", "Create Folder": "폴더 생성", "Create Image": "이미지 생성", @@ -475,37 +462,37 @@ "Create Model": "모델 생성", "Create new key": "새로운 키 생성", "Create new secret key": "새로운 비밀 키 생성", - "Create note": "", + "Create note": "노트 생성", "Create Note": "노트 생성", - "Create scheduled prompts that run automatically on a recurring basis.": "", + "Create scheduled prompts that run automatically on a recurring basis.": "반복적으로 자동으로 실행되는 예약 프롬프트를 생성합니다.", "Create your first note by clicking on the plus button below.": "아래의 플러스 버튼을 클릭하여 첫 번째 노트를 생성하세요.", "Created at": "생성일", "Created At": "생성일", "Created by": "작성자", - "Created by you": "", - "Created on {{date}}": "", + "Created by you": "당신이 생성함", + "Created on {{date}}": "{{date}}에 생성됨", "CSV Import": "CSV 가져오기", "Ctrl+Enter to Send": "Ctrl+Enter로 보내기", "Current Model": "현재 모델", "Current Password": "현재 비밀번호", "Custom": "사용자 정의", "Custom description enabled": "사용자 정의 설명 활성화됨", - "Custom Gender": "", + "Custom Gender": "사용자 정의 성별", "Custom Parameter Name": "사용자 정의 매개변수 이름", "Custom Parameter Value": "사용자 정의 매개변수 값", - "Daily": "", - "Daily Messages": "", + "Daily": "매일", + "Daily Messages": "일일 메시지", "Danger Zone": "위험 기능", "Dark": "다크", "Data Controls": "데이터 제어", "Database": "데이터베이스", "Datalab Marker API": "Datalab Marker API", - "Day": "", + "Day": "일", "DD/MM/YYYY": "YYYY/MM/DD", - "DDGS Backend": "", + "DDGS Backend": "DDGS 백엔드", "December": "12월", - "Decrease UI Scale": "", - "Deepgram": "", + "Decrease UI Scale": "UI 크기 축소", + "Deepgram": "Deepgram", "Default": "기본값", "Default (Open AI)": "기본값 (Open AI)", "Default (SentenceTransformers)": "기본값 (SentenceTransformers)", @@ -513,7 +500,7 @@ "Default description enabled": "기본 설명 활성화됨", "Default Features": "기본 기능", "Default Filters": "기본 필터", - "Default Group": "", + "Default Group": "기본 그룹", "Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model's built-in tool-calling capabilities, but requires the model to inherently support this feature.": "기본 모드는 실행 전에 도구를 한 번 호출하여 더 다양한 모델에서 작동합니다. 기본 모드는 모델에 내장된 도구 호출 기능을 활용하지만, 모델이 이 기능을 본질적으로 지원해야 합니다.", "Default Model": "기본 모델", "Default model updated": "기본 모델이 업데이트되었습니다.", @@ -524,56 +511,53 @@ "Default to ALL": "기본값: 전체", "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "집중적이고 관련성 있는 콘텐츠 추출을 위해 세분화된 검색을 기본으로 하며, 대부분의 경우에 권장됩니다.", "Default User Role": "기본 사용자 역할", - "Defaults": "", + "Defaults": "기본값", "Delete": "삭제", - "Delete {{name}}": "", + "Delete {{name}}": "{{name}} 삭제", "Delete a model": "모델 삭제", - "Delete All": "", + "Delete All": "모두 삭제", "Delete All Chats": "모든 채팅 삭제", - "Delete all contents inside this folder": "", - "Delete automation?": "", - "Delete calendar": "", - "Delete Calendar": "", + "Delete all contents inside this folder":"이 폴더 내 모든 콘텐츠 삭제", + "Delete automation?": "자동 삭제하시겠습니까?", "Delete Chat": "채팅 삭제", "Delete chat?": "채팅을 삭제하시겠습니까?", - "Delete Event": "", - "Delete File": "", + "Delete File": "파일 삭제", "Delete folder?": "폴더를 삭제하시겠습니까?", "Delete function?": "함수를 삭제하시겠습니까?", - "Delete Memory?": "", + "Delete Memory?": "메모리를 삭제하시겠습니까?", "Delete Message": "메시지 삭제", "Delete message?": "메시지를 삭제하시겠습니까?", "Delete Model": "모델 삭제", "Delete note?": "노트를 삭제하시겠습니까?", "Delete prompt?": "프롬프트를 삭제하시겠습니까?", - "Delete skill?": "", + "Delete skill?": "스킬을 삭제하시겠습니까?", "delete this link": "이 링크를 삭제합니다.", "Delete tool?": "도구를 삭제하시겠습니까?", "Delete User": "사용자 삭제", - "Delete Version": "", - "Deleted": "", + "Delete Version": "버전 삭제", + "Deleted": "삭제됨", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} 삭제됨", "Deleted {{name}}": "{{name}}을(를) 삭제했습니다.", - "Deleted {{ok}} of {{total}} items": "", + "Deleted {{ok}} of {{total}} items": "총 {{total}}개 항목 중 {{ok}}개가 삭제되었습니다.", "Deleted User": "삭제된 사용자", "Deployment names are required for Azure OpenAI": "Azure OpenAI 사용 시 배포 이름은 필수입니다.", - "Desc": "", - "Describe the edit...": "", - "Describe the image...": "", - "Describe what changed...": "", + "Desc": "내림차순", + "Describe the edit...": "편집 내용 설명...", + "Describe the image...": "이미지 설명...", + "Describe what changed...": "변경 내용 설명...", "Describe your knowledge base and objectives": "지식 기반에 대한 설명과 목적을 입력하세요", "Description": "설명", - "Deselect": "", + "Deselect": "선택 해제", "Detect Artifacts Automatically": "아티팩트 자동 감지", "Dictate": "마이크 사용", "Didn't fully follow instructions": "완전히 지침을 따르지 않음", - "Direct": "", + "Direct": "직접", "Direct Connections": "직접 연결", "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "직접 연결을 통해 사용자는 자체 OpenAI 호환 API 엔드포인트에 연결할 수 있습니다.", "Direct Message": "1:1 메시지", "Direct Tool Servers": "다이렉트 도구 서버", - "Directory selection was cancelled": "", - "Disable All": "", + "Directory selection was cancelled": "디렉토리 선택이 취소되었습니다.", + "Disable All": "모두 비활성화", "Disable Code Interpreter": "코드 인터프리터 비활성화", "Disable Image Extraction": "이미지 추출 비활성화", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "PDF에서 이미지 추출을 비활성화합니다. Use LLM이 활성화된 경우 이미지는 자동으로 캡션이 달립니다. 기본값은 False입니다.", @@ -588,7 +572,7 @@ "Discover, download, and explore custom prompts": "사용자 정의 프롬프트 검색, 다운로드 및 탐색", "Discover, download, and explore custom tools": "사용자 정의 도구 검색, 다운로드 및 탐색", "Discover, download, and explore model presets": "모델 사전 설정 검색, 다운로드 및 탐색", - "Discussion channel where access is based on groups and permissions": "", + "Discussion channel where access is based on groups and permissions": "그룹과 권한을 기반으로 액세스하는 토론 채널", "Display": "표시", "Display chat title in tab": "탭에 채팅 목록 표시", "Display Emoji in Call": "음성기능에서 이모지 표시", @@ -599,16 +583,16 @@ "Dive into knowledge": "지식 탐구", "Do not install functions from sources you do not fully trust.": "불분명한 출처를 가진 함수를 설치하지마세요", "Do not install tools from sources you do not fully trust.": "불분명한 출처를 가진 도구를 설치하지마세요", - "Do you want to sync your usage stats with Open WebUI Community?": "", - "Docling": "", - "Docling Parameters": "", + "Do you want to sync your usage stats with Open WebUI Community?": "사용 통계를 Open WebUI 커뮤니티와 동기화하시겠습니까?", + "Docling": "Docling", + "Docling Parameters": "Docling 매개변수", "Docling Server URL required.": "Docling 서버 URL이 필요합니다.", "Document": "문서", - "Document Intelligence": "", - "Document Intelligence endpoint required.": "", - "Document Intelligence Model": "", + "Document Intelligence": "문서 인텔리전스", + "Document Intelligence endpoint required.": "문서 인텔리전스 엔드포인트가 필요합니다.", + "Document Intelligence Model": "문서 인텔리전스 모델", "Documentation": "문서", - "Documents": "", + "Documents": "문서", "does not make any external connections, and your data stays securely on your locally hosted server.": "외부와 어떠한 연결도 하지 않으며, 데이터는 로컬에서 호스팅되는 서버에 안전하게 유지됩니다.", "Domain Filter List": "도메인 필터 목록", "don't fetch random pipelines from sources you don't trust.": "신뢰하지 않는 출처에서 임의의 파이프라인을 가져오지 마세요.", @@ -619,34 +603,34 @@ "Done": "완료됨", "Download": "다운로드", "Download & Delete": "다운로드 및 삭제", - "Download as JSON": "", + "Download as JSON": "JSON으로 다운로드", "Download as SVG": "SVG로 다운로드", "Download canceled": "다운로드 취소", "Download Database": "데이터베이스 다운로드", - "Downloading stats...": "", + "Downloading stats...": "통계 다운로드 중...", "Draw": "그리기", "Drop any files here to upload": "여기에 파일을 끌어다 놓아 업로드하세요", - "Drop files here": "", - "Drop files here to upload": "", - "DuckDuckGo": "", + "Drop files here": "파일을 여기에 끌어다 놓으세요", + "Drop files here to upload": "업로드할 파일을 여기에 끌어다 놓으세요", + "DuckDuckGo": "DuckDuckGo", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "예: '30초','10분'. 올바른 시간 단위는 '초', '분', '시'입니다.", - "e.g. 'low', 'medium', 'high'": "", + "e.g. 'low', 'medium', 'high'": "예: '낮음', '중간', '높음'", "e.g. \"json\" or a JSON schema": "예: \\\"json\\\" 또는 JSON 스키마", "e.g. 60": "예: 60", "e.g. A filter to remove profanity from text": "예: 텍스트에서 비속어를 제거하는 필터", - "e.g. about the Roman Empire": "", - "e.g. alloy, echo, shimmer": "", - "e.g. Code Review Guidelines": "", - "e.g. code-review-guidelines": "", + "e.g. about the Roman Empire": "예: 로마 제국에 대해", + "e.g. alloy, echo, shimmer": "예: alloy, echo, shimmer", + "e.g. Code Review Guidelines": "예: 코드 리뷰 가이드라인", + "e.g. code-review-guidelines": "예: code-review-guidelines", "e.g. en": "예: en", "e.g. My Filter": "예: 내 필터", "e.g. My Tools": "예: 내 도구", "e.g. my_filter": "예: my_filter", "e.g. my_tools": "예: my_tools", "e.g. pdf, docx, txt": "예: pdf, docx, txt", - "e.g. Step-by-step instructions for code reviews": "", - "e.g. Tell me a fun fact": "", - "e.g. Tell me a fun fact about the Roman Empire": "", + "e.g. Step-by-step instructions for code reviews": "예: 코드 리뷰를 위한 단계별 지침", + "e.g. Tell me a fun fact": "예: 재미있는 사실을 말해주세요", + "e.g. Tell me a fun fact about the Roman Empire": "예: 로마 제국에 대한 재미있는 사실을 말해주세요", "e.g. Tools for performing various operations": "예: 다양한 작업을 수행하는 도구", "e.g., 3, 4, 5 (leave blank for default)": "예: 3, 4, 5 (기본값을 위해 비워 두세요)", "e.g., audio/wav,audio/mpeg,video/* (leave blank for defaults)": "예: audio/wav,audio/mpeg,video/* (기본값은 빈칸)", @@ -659,55 +643,55 @@ "Edit Default Permissions": "기본 권한 편집", "Edit Folder": "폴더 편집", "Edit Image": "이미지 편집", - "Edit Last Message": "", + "Edit Last Message": "마지막 메시지 편집", "Edit Memory": "메모리 편집", - "Edit Prompt": "", - "Edit Terminal Connection": "", + "Edit Prompt": "프롬프트 편집", + "Edit Terminal Connection": "터미널 연결 편집", "Edit User": "사용자 편집", "Edit User Group": "사용자 그룹 편집", - "Edit workflow.json content": "", + "Edit workflow.json content": "workflow.json 콘텐츠 편집", "edited": "수정됨", "Edited": "수정됨", "Editing": "수정중", "Eject": "추출", - "Eject model": "", + "Eject model": "모델 추출", "ElevenLabs": "ElevenLabs", "Email": "이메일", "Embark on adventures": "모험을 떠나기", "Embedding": "임베딩", "Embedding Batch Size": "임베딩 배치 크기", - "Embedding Concurrent Requests": "", + "Embedding Concurrent Requests": "임베딩 동시 요청 수", "Embedding Model": "임베딩 모델", "Embedding Model Engine": "임베딩 모델 엔진", - "Emojis": "", - "Empty message": "", - "Enable All": "", - "Enable API Keys": "", + "Emojis": "이모티콘", + "Empty message": "빈 메시지", + "Enable All": "모두 활성화", + "Enable API Keys": "API 키 활성화", "Enable autocomplete generation for chat messages": "채팅 메시지에 대한 자동 완성 생성 활성화", "Enable Code Execution": "코드 실행 활성화", "Enable Code Interpreter": "코드 인터프리터 활성화", "Enable Community Sharing": "커뮤니티 공유 활성화", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "모델 데이터가 RAM에서 스왑 아웃되는 것을 방지하기 위해 메모리 잠금(mlock)을 활성화합니다. 이 옵션은 모델의 작업 페이지 집합을 RAM에 잠가 디스크로 스왑 아웃되지 않도록 보장합니다. 이는 페이지 폴트를 피하고 빠른 데이터 액세스를 보장하여 성능을 유지하는 데 도움이 될 수 있습니다.", "Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "모델 데이터를 로드하기 위해 메모리 매핑(mmap)을 활성화합니다. 이 옵션을 사용하면 시스템이 디스크 파일을 RAM에 있는 것처럼 처리하여 디스크 스토리지를 RAM의 확장으로 사용할 수 있습니다. 이는 더 빠른 데이터 액세스를 허용하여 모델 성능을 향상시킬 수 있습니다. 그러나 모든 시스템에서 올바르게 작동하지 않을 수 있으며 상당한 양의 디스크 공간을 소비할 수 있습니다.", - "Enable Message Queue": "", + "Enable Message Queue": "메시지 큐 활성화", "Enable Message Rating": "메시지 평가 활성화", "Enable Mirostat sampling for controlling perplexity.": "퍼플렉서티 제어를 위해 Mirostat 샘플링 활성화", "Enable New Sign Ups": "새 회원가입 활성화", - "Enable, disable, or customize the reasoning tags used by the model. \"Enabled\" uses default tags, \"Disabled\" turns off reasoning tags, and \"Custom\" lets you specify your own start and end tags.": "", + "Enable, disable, or customize the reasoning tags used by the model. \"Enabled\" uses default tags, \"Disabled\" turns off reasoning tags, and \"Custom\" lets you specify your own start and end tags.": "모델이 사용하는 추론 태그를 활성화, 비활성화 또는 사용자 지정할 수 있습니다. \"활성화됨\"은 기본 태그를 사용하고, \"비활성화됨\"은 추론 태그를 끄며, \"사용자 지정\"은 직접 시작 및 종료 태그를 지정할 수 있습니다.", "Enabled": "활성화됨", "End Tag": "종료 태그", "Endpoint URL": "엔드포인트 URL", "Enforce Temporary Chat": "임시 채팅 강제 적용", "Enhance": "향상", - "Enrich Hybrid Search Text": "", + "Enrich Hybrid Search Text": "하이브리드 검색 텍스트 강화", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSV 파일에 이름, 이메일, 비밀번호, 역할 4개의 열이 순서대로 포함되어 있는지 확인하세요.", "Enter {{role}} message here": "여기에 {{role}} 메시지 입력", "Enter a detail about yourself for your LLMs to recall": "자신에 대한 세부사항을 입력하여 LLM들이 기억할 수 있도록 하세요.", "Enter a title for the pending user info overlay. Leave empty for default.": "대기 중인 사용자 정보 오버레이의 제목을 입력하세요. 비워두면 기본값이 사용됩니다.", "Enter a watermark for the response. Leave empty for none.": "응답에 사용할 워터마크를 입력하세요. 비워두면 워터마크가 적용되지 않습니다.", - "Enter additional headers in JSON format": "", - "Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "", - "Enter additional parameters in JSON format": "", + "Enter additional headers in JSON format": "추가 헤더를 JSON 형식으로 입력하세요", + "Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "추가 헤더를 JSON 형식으로 입력하세요(예: {\"X-Custom-Header\": \"value\"})", + "Enter additional parameters in JSON format": "추가 매개변수를 JSON 형식으로 입력하세요", "Enter api auth string (e.g. username:password)": "API 인증 문자 입력 (예: 사용자 이름:비밀번호)", "Enter Application DN": "애플리케이션 DN 입력", "Enter Application DN Password": "애플리케이션 DN 비밀번호 입력", @@ -716,7 +700,7 @@ "Enter Bocha Search API Key": "Bocha 검색 API 키 입력", "Enter Brave Search API Key": "Brave Search API Key 입력", "Enter certificate path": "인증서 경로 입력", - "Enter Chunk Min Size Target": "", + "Enter Chunk Min Size Target": "청크 최소 크기 목표 입력", "Enter Chunk Overlap": "청크 중첩 입력", "Enter Chunk Size": "청크 크기 입력", "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "쉼표로 구분된 \\\"토큰:편향_값\\\" 쌍 입력 (예: 5432:100, 413:-100)", @@ -725,12 +709,12 @@ "Enter Datalab Marker API Base URL": "Datalab Marker API URL 입력", "Enter Datalab Marker API Key": "Datalab Marker API 키 입력", "Enter description": "설명 입력", - "Enter Docling API Key": "", + "Enter Docling API Key": "Docling API 키 입력", "Enter Docling Server URL": "Docling 서버 URL 입력", "Enter Document Intelligence Endpoint": "Document Intelligence 엔드포인트 입력", "Enter Document Intelligence Key": "Document Intelligence 키 입력", - "Enter Document Intelligence Model": "", - "Enter domains separated by commas (e.g., example.com,site.org,!excludedsite.com)": "", + "Enter Document Intelligence Model": "Document Intelligence 모델 입력", + "Enter domains separated by commas (e.g., example.com,site.org,!excludedsite.com)": "쉼표로 구분하여 도메인을 입력하세요(예: example.com,site.org,!excludedsite.com)", "Enter Exa API Key": "Exa API 키 입력", "Enter External Document Loader API Key": "외부 문서 로더 API 키 입력", "Enter External Document Loader URL": "외부 문서 로더 URL 입력", @@ -740,15 +724,15 @@ "Enter External Web Search URL": "외부 웹 검색 URL 입력", "Enter Firecrawl API Base URL": "Firecrawl API 기본 URL 입력", "Enter Firecrawl API Key": "Firecrawl API 키 입력", - "Enter Firecrawl Timeout": "", + "Enter Firecrawl Timeout": "Firecrawl 시간 초과 입력", "Enter folder name": "폴더 이름 입력", - "Enter function name filter list (e.g. func1, !func2)": "", + "Enter function name filter list (e.g. func1, !func2)": "함수 이름 필터 목록을 입력하세요(예: func1, !func2)", "Enter Github Raw URL": "Github Raw URL 입력", "Enter Google PSE API Key": "Google PSE API 키 입력", "Enter Google PSE Engine Id": "Google PSE 엔진 ID 입력", "Enter hex color (e.g. #FF0000)": "색상 hex 입력 (예: #FF0000)", "Enter Image Size (e.g. 512x512)": "이미지 크기 입력(예: 512x512)", - "Enter Jina API Base URL": "", + "Enter Jina API Base URL": "Jina API 기본 URL 입력", "Enter Jina API Key": "Jina API 키 입력", "Enter JSON config (e.g., {\"disable_links\": true})": "JSON 설정 입력 (예: {\"disable_links\": true})", "Enter Jupyter Password": "Jupyter 비밀번호 입력", @@ -757,7 +741,7 @@ "Enter Kagi Search API Key": "Kagi Search API 키 입력", "Enter Key Behavior": "키 동작 입력", "Enter language codes": "언어 코드 입력", - "Enter MinerU API Key": "", + "Enter MinerU API Key": "MinerU API 키 입력", "Enter Mistral API Base URL": "Mistral API Base URL 입력", "Enter Mistral API Key": "Mistral API 키 입력", "Enter Model ID": "모델 ID 입력", @@ -768,17 +752,17 @@ "Enter Number of Steps (e.g. 50)": "단계 수 입력(예: 50)", "Enter Ollama Cloud API Key": "Ollama 클라우드 API 키 입력", "Enter Perplexity API Key": "Perplexity API 키 입력", - "Enter Perplexity Search API URL": "", + "Enter Perplexity Search API URL": "Perplexity 검색 API URL 입력", "Enter Playwright Timeout": "Playwright 시간 초과 입력", "Enter Playwright WebSocket URL": "Playwright WebSocket URL 입력", - "Enter prompt here.": "", + "Enter prompt here.": "여기에 프롬프트를 입력하세요.", "Enter proxy URL (e.g. https://user:password@host:port)": "프록시 URL 입력(예: https://user:password@host:port)", "Enter reasoning effort": "추론 난이도", "Enter Score": "점수 입력", "Enter SearchApi API Key": "SearchApi API 키 입력", "Enter SearchApi Engine": "SearchApi 엔진 입력", "Enter Searxng Query URL": "Searxng 쿼리 URL 입력", - "Enter Searxng search language": "", + "Enter Searxng search language": "Searxng 검색 언어 입력", "Enter Seed": "Seed 입력", "Enter SerpApi API Key": "SerpApi API 키 입력", "Enter SerpApi Engine": "SerpApi 엔진 입력", @@ -788,7 +772,7 @@ "Enter server host": "서버 호스트 입력", "Enter server label": "서버 레이블 입력", "Enter server port": "서버 포트 입력", - "Enter skill instructions in markdown...": "", + "Enter skill instructions in markdown...": "마크다운 형식으로 스킬 지침을 입력하세요...", "Enter Sougou Search API sID": "Sougou 검색 API sID 입력", "Enter Sougou Search API SK": "Sougou 검색 API SK 입력", "Enter stop sequence": "중지 시퀀스 입력", @@ -796,7 +780,7 @@ "Enter system prompt here": "여기에 시스템 프롬프트 입력", "Enter Tavily API Key": "Tavily API 키 입력", "Enter Tavily Extract Depth": "Tavily 추출 깊이 입력", - "Enter the prompt instructions for this automation...": "", + "Enter the prompt instructions for this automation...": "이 자동화의 프롬프트 지침을 입력하세요...", "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "WebUI의 공개 URL을 입력해 주세요. 이 URL은 알림에서 링크를 생성하는 데 사용합니다.", "Enter the URL of the function to import": "가져올 함수의 URL 입력", "Enter the URL to import": "가져올 URL 입력", @@ -812,9 +796,9 @@ "Enter Yacy Password": "Yacy 비밀번호 입력", "Enter Yacy URL (e.g. http://yacy.example.com:8090)": "Yacy URL 입력(예: http://yacy.example.com:8090)", "Enter Yacy Username": "Yacy 사용자 이름 입력", - "Enter Yandex Web Search API Key": "", - "Enter Yandex Web Search URL": "", - "Enter You.com API Key": "", + "Enter Yandex Web Search API Key": "Yandex 웹 검색 API 키 입력", + "Enter Yandex Web Search URL": "Yandex 웹 검색 URL 입력", + "Enter You.com API Key": "You.com API 키 입력", "Enter your code here...": "여기에 코드를 입력하세요...", "Enter your current password": "현재 비밀번호를 입력해 주세요", "Enter Your Email": "이메일 입력", @@ -828,25 +812,21 @@ "Enter Your Role": "역할 입력", "Enter Your Username": "사용자 이름 입력", "Enter your webhook URL": "웹훅 URL을 입력해 주세요", - "Entra ID": "", - "Environment Variables": "", - "Ephemeral": "", + "Entra ID": "Entra ID", + "Environment Variables": "환경 변수", + "Ephemeral": "임시", "Error": "오류", "ERROR": "오류", "Error accessing directory": "디렉토리 액세스 오류", "Error accessing Google Drive: {{error}}": "Google Drive 액세스 오류: {{error}}", "Error accessing media devices.": "미디어 장치 액세스 오류", - "Error deleting model: {{error}}": "", + "Error deleting model: {{error}}": "모델 삭제 중 오류: {{error}}", "Error starting recording.": "녹화 시작 오류", "Error unloading model: {{error}}": "모델 언로드 오류: {{error}}", "Error uploading file: {{error}}": "파일 업로드 오류: {{error}}", - "Error: A model with the ID '{{modelId}}' already exists. Please select a different ID to proceed.": "", - "Error: Model ID cannot be empty. Please enter a valid ID to proceed.": "", + "Error: A model with the ID '{{modelId}}' already exists. Please select a different ID to proceed.": "오류: ID가 '{{modelId}}'인 모델이 이미 존재합니다. 계속하려면 다른 ID를 선택하세요.", + "Error: Model ID cannot be empty. Please enter a valid ID to proceed.": "오류: 모델 ID는 비워둘 수 없습니다. 계속하려면 유효한 ID를 입력하세요.", "Evaluations": "평가", - "Event created": "", - "Event deleted": "", - "Event title": "", - "Event updated": "", "Exa API Key": "Exa API 키", "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "예: (&(objectClass=inetOrgPerson)(uid=%s))", "Example: ALL": "예: 전체", @@ -855,24 +835,24 @@ "Example: sAMAccountName or uid or userPrincipalName": "예: sAMAccountName or uid or userPrincipalName", "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "라이선스의 좌석 수를 초과했습니다. 좌석 수를 늘리려면 지원팀에 문의해 주세요.", "Exclude": "미포함", - "Execute code": "", + "Execute code": "코드 실행", "Execute code for analysis": "분석을 위한 코드 실행", "Executing **{{NAME}}**...": "**{{NAME}}** 실행 중...", - "Execution Logs": "", + "Execution Logs": "실행 로그", "Expand": "확장", "Experimental": "실험적", "Explain": "설명", "Explore the cosmos": "우주 탐험", - "Explored": "", - "Exploring": "", + "Explored": "탐색 완료", + "Exploring": "탐색 중", "Export": "내보내기", "Export All Archived Chats": "모든 보관된 채팅 내보내기", "Export All Chats (All Users)": "모든 채팅 내보내기(모든 사용자)", - "Export as CSV": "", - "Export as JSON": "", + "Export as CSV": "CSV로 내보내기", + "Export as JSON": "JSON으로 내보내기", "Export chat (.json)": "채팅 내보내기 (.json)", "Export Chats": "채팅 내보내기", - "Export Config": "", + "Export Config": "설정 내보내기", "Export Models": "모델 내보내기", "Export Prompts": "프롬프트 내보내기", "Export to CSV": "CSV로 내보내기", @@ -888,29 +868,28 @@ "Fade Effect for Streaming Text": "스트리밍 텍스트에 대한 페이드 효과", "Failed to add file.": "파일추가에 실패했습니다", "Failed to add members": "멤버 추가에 실패했습니다", - "Failed to archive chat.": "", - "Failed to attach file": "", + "Failed to archive chat.": "채팅 보관에 실패했습니다.", + "Failed to attach file": "파일 첨부에 실패했습니다", "Failed to clear status": "상태 초기화에 실패했습니다", "Failed to connect to {{URL}} OpenAPI tool server": "{{URL}} OpenAPI 도구 서버 연결 실패", - "Failed to connect to {{URL}} terminal server": "", + "Failed to connect to {{URL}} terminal server": "{{URL}} 터미널 서버 연결에 실패했습니다", "Failed to copy link": "링크 복사 실패", "Failed to create API Key.": "API 키 생성에 실패했습니다.", - "Failed to delete calendar": "", "Failed to delete note": "노트 삭제 실패", - "Failed to download image": "", + "Failed to download image": "이미지 다운로드에 실패했습니다", "Failed to extract content from the file: {{error}}": "파일 내용 추출 실패: {{error}}", "Failed to extract content from the file.": "파일 내용 추출 실패.", "Failed to fetch models": "모델 조회 실패", "Failed to generate title": "제목 생성 실패", "Failed to import models": "모델 가져오기 실패", "Failed to load chat preview": "채팅 미리보기 로드 실패", - "Failed to load DOCX file. Please try downloading it instead.": "", - "Failed to load Excel/CSV file. Please try downloading it instead.": "", + "Failed to load DOCX file. Please try downloading it instead.": "DOCX 파일을 불러오지 못했습니다. 대신 다운로드해 보세요.", + "Failed to load Excel/CSV file. Please try downloading it instead.": "Excel/CSV 파일을 불러오지 못했습니다. 대신 다운로드해 보세요.", "Failed to load file content.": "파일 내용 로드 실패.", - "Failed to load Interface settings": "", - "Failed to load PPTX file. Please try downloading it instead.": "", + "Failed to load Interface settings": "인터페이스 설정을 불러오지 못했습니다", + "Failed to load PPTX file. Please try downloading it instead.": "PPTX 파일을 불러오지 못했습니다. 대신 다운로드해 보세요.", "Failed to move chat": "채팅 이동 실패", - "Failed to process URL: {{url}}": "", + "Failed to process URL: {{url}}": "URL 처리에 실패했습니다: {{url}}", "Failed to read clipboard contents": "클립보드 내용 가져오기를 실패하였습니다", "Failed to remove member": "멤버 삭제에 실패했습니다", "Failed to render diagram": "다이어그램을 표시할 수 없습니다", @@ -918,40 +897,40 @@ "Failed to save connections": "연결 저장 실패", "Failed to save conversation": "대화 저장 실패", "Failed to save models configuration": "모델 구성 저장 실패", - "Failed to save policy: {{error}}": "", - "Failed to save terminal servers": "", - "Failed to unshare chat.": "", + "Failed to save policy: {{error}}": "정책 저장에 실패했습니다: {{error}}", + "Failed to save terminal servers": "터미널 서버 저장에 실패했습니다", + "Failed to unshare chat.": "채팅 공유 해제에 실패했습니다.", "Failed to update settings": "설정 업데이트에 실패하였습니다", "Failed to update status": "상태 업데이트에 실패하였습니다", "Failed to upload file.": "파일 업로드에 실패했습니다.", "Features": "기능", "Features Permissions": "기능 권한", "February": "2월", - "Feedback": "", - "Feedback Activity": "", - "Feedback deleted successfully": "", + "Feedback": "피드백", + "Feedback Activity": "피드백 활동", + "Feedback deleted successfully": "피드백이 성공적으로 삭제되었습니다", "Feedback Details": "피드백 상세내용", "Feedback History": "피드백 기록", "Feel free to add specific details": "자세한 내용을 자유롭게 추가하세요.", "Female": "여성", - "Fetch URL Content Length Limit": "", + "Fetch URL Content Length Limit": "URL 콘텐츠 길이 제한 가져오기", "File": "파일", "File added successfully.": "파일이 성공적으로 추가되었습니다", - "File attached to chat": "", - "File browser": "", - "File content": "", + "File attached to chat": "파일이 채팅에 첨부되었습니다", + "File browser": "파일 브라우저", + "File content": "파일 내용", "File content updated successfully.": "내용이 성공적으로 업데이트되었습니다", - "File Context": "", - "File deleted successfully.": "", + "File Context": "파일 컨텍스트", + "File deleted successfully.": "파일이 성공적으로 삭제되었습니다.", "File Mode": "파일 모드", - "File name": "", + "File name": "파일 이름", "File not found.": "파일을 찾을 수 없습니다.", "File removed successfully.": "파일이 성공적으로 삭제되었습니다", "File size should not exceed {{maxSize}} MB.": "파일 사이즈가 {{maxSize}} MB를 초과하면 안됩니다.", "File Upload": "파일 업로드", "File uploaded successfully": "파일이 성공적으로 업로드되었습니다", "File uploaded!": "파일이 업로드되었습니다!", - "Filename": "", + "Filename": "파일명", "Files": "파일", "Filter": "필터", "Filter is now globally disabled": "전반적으로 필터 비활성화됨", @@ -960,28 +939,28 @@ "Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Fingerprint spoofing 감지: 이니셜을 아바타로 사용할 수 없습니다. 기본 프로필 이미지로 설정합니다.", "Firecrawl API Base URL": "Firecrawl API 기본 URL", "Firecrawl API Key": "Firecrawl API 키", - "Firecrawl Timeout (s)": "", - "Floating Quick Actions": "", + "Firecrawl Timeout (s)": "Firecrawl 시간 초과(초)", + "Floating Quick Actions": "플로팅 퀵 액션", "Focus Chat Input": "채팅 입력창에 포커스", "Folder": "폴더", "Folder Background Image": "폴더 배경 이미지", - "Folder created successfully": "", + "Folder created successfully": "폴더가 성공적으로 생성되었습니다", "Folder deleted successfully": "성공적으로 폴더가 삭제되었습니다", - "Folder Max File Count": "", - "Folder name": "", + "Folder Max File Count": "폴더 최대 파일 수", + "Folder name": "폴더 이름", "Folder Name": "폴더 이름", "Folder name cannot be empty.": "폴더 이름을 작성해주세요", "Folder name updated successfully": "성공적으로 폴더 이름이 저장되었습니다", - "Folder options": "", + "Folder options": "폴더 옵션", "Folder updated successfully": "폴더가 성공적으로 업데이트되었습니다", "Folders": "폴더", "Follow up": "후속 질문", "Follow Up Generation": "후속 질문 생성", "Follow Up Generation Prompt": "후속 질문 생성 프롬프트", - "Follow up: {{question}}": "", + "Follow up: {{question}}": "후속 질문: {{question}}", "Follow-Up Auto-Generation": "후속 질문 자동 생성", "Followed instructions perfectly": "지시를 완벽히 수행함", - "for placeholders": "", + "for placeholders": "플레이스홀더용", "Force OCR": "OCR 강제 적용", "Force OCR on all pages of the PDF. This can lead to worse results if you have good text in your PDFs. Defaults to False.": "PDF의 모든 페이지에 대해 OCR을 강제로 적용합니다. PDF에 좋은 텍스트가 포함된 경우 결과가 더 나빠질 수 있습니다. 기본값은 False입니다.", "Forge new paths": "새로운 경로 만들기", @@ -989,10 +968,10 @@ "Format Lines": "줄 서식", "Format the lines in the output. Defaults to False. If set to True, the lines will be formatted to detect inline math and styles.": "출력되는 줄에 서식을 적용합니다. 기본값은 False입니다. 이 옵션을 True로 하면, 인라인 수식 및 스타일을 감지하도록 줄에 서식이 적용됩니다.", "Formatting may be inconsistent from source.": "출처에서의 서식이 일관되지 않을 수 있습니다.", - "Forward": "", + "Forward": "전달", "Forwards system user OAuth access token to authenticate": "인증을 위해 시스템 사용자 OAuth 액세스 토큰을 전달합니다.", "Forwards system user session credentials to authenticate": "인증을 위해 시스템 사용자 세션 자격 증명 전달", - "Fr_day_of_week": "", + "Fr_day_of_week": "Fr_day_of_week", "Full Context Mode": "전체 컨텍스트 모드", "Function": "함수", "Function Calling": "함수 호출", @@ -1004,82 +983,82 @@ "Function is now globally disabled": "전반적으로 함수 비활성화됨", "Function is now globally enabled": "전반적으로 함수 활성화됨", "Function Name": "함수 이름", - "Function Name Filter List": "", + "Function Name Filter List": "함수 이름 필터 목록", "Function updated successfully": "성공적으로 함수가 업데이트되었습니다", "Functions": "함수", "Functions allow arbitrary code execution.": "함수가 임의의 코드를 실행하도록 허용하였습니다", "Functions imported successfully": "성공적으로 함수를 가져왔습니다", - "Gemini": "", - "Gemini API Key": "", + "Gemini": "Gemini", + "Gemini API Key": "Gemini API 키", "Gemini API Key is required.": "Gemini API 키가 필요합니다.", - "Gemini Base URL": "", - "Gemini Endpoint Method": "", + "Gemini Base URL": "Gemini 기본 URL", + "Gemini Endpoint Method": "Gemini 엔드포인트 방식", "Gender": "성별", "General": "일반", "Generate": "생성", "Generate an image": "이미지 생성", - "Generate and edit images": "", - "Generate Message Pair": "", + "Generate and edit images": "이미지 생성 및 편집", + "Generate Message Pair": "메시지 쌍 생성", "Generated Image": "생성된 이미지", - "Generated images will appear here": "", + "Generated images will appear here": "생성된 이미지가 여기에 표시됩니다", "Generating search query": "검색 쿼리 생성", "Generating...": "생성 중...", - "Get current time and perform date/time calculations": "", + "Get current time and perform date/time calculations": "현재 시간을 가져오고 날짜/시간 계산을 수행합니다", "Get information on {{name}} in the UI": "UI에서 {{name}} 정보 확인", "Get started": "시작하기", "Get started with {{WEBUI_NAME}}": "{{WEBUI_NAME}} 시작하기", "Global": "글로벌", "Good Response": "좋은 응답", - "Google": "", + "Google": "Google", "Google Drive": "구글 드라이브", "Google PSE API Key": "Google PSE API 키", "Google PSE Engine Id": "Google PSE 엔진 ID", - "Gravatar": "", - "Grid": "", - "Grokipedia": "", - "Group Channel": "", + "Gravatar": "Gravatar", + "Grid": "그리드", + "Grokipedia": "Grokipedia", + "Group Channel": "그룹 채널", "Group created successfully": "성공적으로 그룹을 생성했습니다", "Group deleted successfully": "성공적으로 그룹을 삭제했습니다", "Group Description": "그룹 설명", "Group Name": "그룹 명", "Group updated successfully": "성공적으로 그룹을 수정했습니다", - "groups": "", + "groups": "그룹들", "Groups": "그룹", "H1": "제목 1", "H2": "제목 2", "H3": "제목 3", "Haptic Feedback": "햅틱 피드백", - "Headers": "", - "Headers must be a valid JSON object": "", - "Height": "", + "Headers": "헤더", + "Headers must be a valid JSON object": "헤더는 유효한 JSON 객체여야 합니다", + "Height": "높이", "Hello, {{name}}": "안녕하세요, {{name}}", "Help": "도움말", - "Help the community discover great models": "", + "Help the community discover great models": "커뮤니티가 훌륭한 모델을 발견하도록 도와주세요", "Hex Color": "Hex 색상", "Hex Color - Leave empty for default color": "Hex 색상 - 기본 색상의 경우 빈 상태로 유지", - "Hidden": "", + "Hidden": "숨겨짐", "Hide": "숨기기", - "Hide All": "", + "Hide All": "모두 숨기기", "Hide from Sidebar": "사이드바에서 숨기기", "Hide Model": "모델 숨기기", - "High": "", + "High": "높은", "High Contrast Mode": "고대비 모드", - "History": "", + "History": "기록", "Home": "홈", "Host": "호스트", - "Hourly": "", - "Hourly Messages": "", + "Hourly": "시간별", + "Hourly Messages": "시간별 메시지", "How can I help you today?": "무엇을 도와드릴까요?", "How would you rate this response?": "이 응답을 어떻게 평가하시겠어요?", - "HTML": "", - "http://localhost:8000": "", - "https://mineru.net/api/v4": "", + "HTML": "HTML", + "http://localhost:8000": "http://localhost:8000", + "https://mineru.net/api/v4": "https://mineru.net/api/v4", "Hybrid Search": "하이브리드 검색", "I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "저는 제 행동의 의미를 읽고 이해했음을 인정합니다. 임의 코드 실행과 관련된 위험을 인지하고 있으며 출처의 신뢰성을 확인했습니다.", "ID": "ID", - "ID cannot contain \":\" or \"|\" characters": "", - "ID copied to clipboard": "", - "Idle Timeout": "", + "ID cannot contain \":\" or \"|\" characters": "ID는 \":\" 또는 \"|\" 문자를 포함할 수 없습니다", + "ID copied to clipboard": "ID가 클립보드에 복사되었습닙다", + "Idle Timeout": "Idle 시간 초과", "iframe Sandbox Allow Forms": "iframe 샌드박스 허용 양식", "iframe Sandbox Allow Same Origin": "iframe 샌드박스에서 동일한 오리진 허용", "Ignite curiosity": "호기심 자극", @@ -1087,8 +1066,8 @@ "Image Compression": "이미지 압축", "Image Compression Height": "이미지 압축 높이", "Image Compression Width": "이미지 압축 너비", - "Image Edit": "", - "Image Edit Engine": "", + "Image Edit": "이미지 편집", + "Image Edit Engine": "이미지 편집 엔진", "Image Generation": "이미지 생성", "Image Generation Engine": "이미지 생성 엔진", "Image Max Compression Size": "이미지 최대 압축 크기", @@ -1097,29 +1076,29 @@ "Image Prompt Generation": "이미지 프롬프트 생성", "Image Prompt Generation Prompt": "이미지 프롬프트를 생성하기 위한 프롬프트", "Image Size": "이미지 크기", - "Images": "", + "Images": "이미지들", "Import": "가져오기", "Import Chats": "채팅 가져오기", - "Import Config": "", + "Import Config": "구성 가져오기", "Import From Link": "링크에서 가져오기", - "Import Models": "", - "Import Prompts": "", - "Import successful": "", - "Import Tools": "", + "Import Models": "모델 가져오기", + "Import Prompts": "프롬프트 가져오기", + "Import successful": "가져오기 성공", + "Import Tools": "도구 가져오기", "Important Update": "중요 업데이트", - "Inactive": "", + "Inactive": "비활성화", "Include": "포함", "Include `--api-auth` flag when running stable-diffusion-webui": "stable-diffusion-webui를 실행 시 `--api-auth` 플래그를 포함하세요", "Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui를 실행 시 `--api` 플래그를 포함하세요", "Includes SharePoint": "SharePoint 포함", - "Increase UI Scale": "", + "Increase UI Scale": "UI 크기 증가", "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "생성된 텍스트의 피드백에 알고리즘이 얼마나 빨리 반응하는지에 영향을 미칩니다. 학습률이 낮을수록 조정 속도가 느려지고 학습률이 높아지면 알고리즘의 반응 속도가 빨라집니다.", "Info": "정보", - "Initials": "", - "Inject file content into conversation context": "", + "Initials": "초기", + "Inject file content into conversation context": "파일 콘텐츠를 대화 컨텍스트에 삽입", "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "전체 콘텐츠를 포괄적인 처리를 위해 컨텍스트로 삽입하세요. 이는 복잡한 쿼리에 권장됩니다.", "Input": "입력", - "Input Key (e.g. text, unet_name, steps)": "", + "Input Key (e.g. text, unet_name, steps)": "입력 키 (예: text, unet_name, steps)", "Input Variables": "변수 입력", "Insert": "삽입", "Insert Follow-Up Prompt to Input": "후속 질문을 메시지 입력란에 삽입(자동 전송 없이)", @@ -1127,29 +1106,29 @@ "Insert Suggestion Prompt to Input": "입력할 제안 프롬프트 삽입", "Install from Github URL": "Github URL에서 설치", "Instant Auto-Send After Voice Transcription": "음성 변환 후 즉시 자동 전송", - "Instructions": "", + "Instructions": "지침", "Integration": "통합", "Integrations": "통합", "Interface": "인터페이스", - "Interface Settings Access": "", + "Interface Settings Access": "인터페이스 설정 접근", "Invalid file content": "잘못된 파일 내용", "Invalid file format.": "잘못된 파일 형식", "Invalid JSON file": "잘못된 JSON 파일", - "Invalid JSON format for ComfyUI Edit Workflow.": "", - "Invalid JSON format for ComfyUI Workflow.": "", - "Invalid JSON format for Parameters": "", - "Invalid JSON format in {{NAME}}": "", + "Invalid JSON format for ComfyUI Edit Workflow.": "잘못된 ComfyUI 편집 워크플로우 JSON 형식입니다.", + "Invalid JSON format for ComfyUI Workflow.": "잘못된 ComfyUI 워크플로우 JSON 형식입니다.", + "Invalid JSON format for Parameters": "잘못된 파라미터 JSON 형식입니다.", + "Invalid JSON format in {{NAME}}": "잘못된 JSON 형식 in {{NAME}}", "Invalid JSON format in Additional Config": "추가 설정에 잘못된 JSON 형식 입력", - "Invalid JSON format in MinerU Parameters": "", + "Invalid JSON format in MinerU Parameters": "MinerU 파라미터에 잘못된 JSON 형식 입력", "is typing...": "입력 중...", "Italic": "기울임", "January": "1월", - "Jina API Base URL": "", + "Jina API Base URL": "Jina API 기본 URL", "Jina API Key": "Jina API 키", "join our Discord for help.": "도움말을 보려면 Discord에 가입하세요.", "JSON": "JSON", "JSON Preview": "JSON 미리 보기", - "JSON Spec": "", + "JSON Spec": "JSON 스펙", "July": "7월", "June": "6월", "Jupyter Auth": "Jupyter 인증", @@ -1162,85 +1141,83 @@ "Key": "키", "Key is required": "키가 필요합니다", "Keyboard shortcuts": "키보드 단축키", - "Keyboard Shortcuts": "", + "Keyboard Shortcuts": "키보드 단축키", "Knowledge": "지식 기반", "Knowledge Access": "지식 기반 접근", "Knowledge Base": "지식 기반", "Knowledge created successfully.": "성공적으로 지식 기반이 생성되었습니다", "Knowledge deleted successfully.": "성공적으로 지식 기반이 삭제되었습니다", "Knowledge Description": "지식 기반 설명", - "Knowledge exported successfully": "", + "Knowledge exported successfully": "성공적으로 지식 기반이 내보내졌습니다", "Knowledge Name": "지식 기반 이름", "Knowledge Public Sharing": "지식 기반 공개 공유", "Knowledge reset successfully.": "성공적으로 지식 기반이 초기화되었습니다", - "Knowledge Sharing": "", + "Knowledge Sharing": "지식 기반 공유", "Knowledge updated successfully": "성공적으로 지식 기반이 업데이트되었습니다", "Kokoro.js (Browser)": "Kokoro.js (브라우저)", - "Kokoro.js Dtype": "", + "Kokoro.js Dtype": "Kokoro.js 데이터 유형", "Label": "라벨", "Landing Page Mode": "랜딩페이지 모드", "Language": "언어", "Language Locales": "언어 로케일", - "Last 24 hours": "", - "Last 30 days": "", - "Last 7 days": "", - "Last 90 days": "", + "Last 24 hours": "최근 24시간", + "Last 30 days": "최근 30일", + "Last 7 days": "최근 7일", + "Last 90 days": "최근 90일", "Last Active": "최근 활동", "Last Modified": "마지막 수정", - "Last ran": "", + "Last ran": "마지막 실행", "Last reply": "마지막 답글", - "LDAP": "", + "LDAP": "LDAP", "LDAP server updated": "LDAP 서버가 업데이트되었습니다", "Leaderboard": "리더보드", - "Learn more": "", + "Learn more": "자세히 알아보기", "Learn More": "자세히 알아보기", - "Learn more about Open Terminal": "", + "Learn more about Open Terminal": "Open Terminal에 대해 자세히 알아보기", "Learn more about OpenAPI tool servers.": "OpenAPI 도구 서버에 대해 자세히 알아보세요.", - "Learn more about Voxtral transcription.": "", - "Leave a public review for {{modelName}}": "", + "Learn more about Voxtral transcription.": "Voxtral 변환에 대해 자세히 알아보세요.", + "Leave a public review for {{modelName}}": "{{modelName}}에 대한 공개 리뷰 남기기", "Leave empty for no compression": "압축하지 않으려면 비워 두세요", "Leave empty for unlimited": "제한하지 않으려면 비워 두세요", "Leave empty to include all models from \"{{url}}\" endpoint": "\"{{url}}\" 엔드포인트의 모든 모델을 포함하려면 비워 두세요", "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "\"{{url}}/api/tags\" 엔드포인트의 모든 모델을 포함하려면 비워 두세요", "Leave empty to include all models from \"{{url}}/models\" endpoint": "\"{{url}}/models\" 엔드포인트의 모든 모델을 포함하려면 비워 두세요", "Leave empty to include all models or select specific models": "비워두면 모든 모델이 포함되며, 특정 모델을 선택할 수도 있습니다.", - "Leave empty to use first admin user": "", - "Leave empty to use the default config, or enter a valid json (see https://yandex.cloud/en/docs/search-api/api-ref/WebSearch/search#yandex.cloud.searchapi.v2.WebSearchRequest)": "", + "Leave empty to use first admin user": "첫 번째 관리자 사용자로 사용하려면 비워 두세요", + "Leave empty to use the default config, or enter a valid json (see https://yandex.cloud/en/docs/search-api/api-ref/WebSearch/search#yandex.cloud.searchapi.v2.WebSearchRequest)": "기본 구성을 사용하려면 비워 두세요, 또는 유효한 json을 입력하세요 (https://yandex.cloud/en/docs/search-api/api-ref/WebSearch/search#yandex.cloud.searchapi.v2.WebSearchRequest 참조)", "Leave empty to use the default model (voxtral-mini-latest).": "비워두면 기본 모델(voxtral-mini-latest)을 사용합니다.", "Leave empty to use the default prompt, or enter a custom prompt": "기본 프롬프트를 사용하기 위해 빈칸으로 남겨두거나, 커스텀 프롬프트를 입력하세요", "Leave model field empty to use the default model.": "기본 모델을 사용하려면 모델 필드를 비워 두세요.", - "Legacy": "", + "Legacy": "레거시", "lexical": "어휘적", "License": "라이선스", "Lift List": "리스트 올리기", "Light": "라이트", - "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "", - "Limits the number of concurrent embedding requests. Set to 0 for unlimited.": "", - "List": "", - "List calendars, search, create, update, and delete calendar events": "", + "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "동시 검색 쿼리 수를 제한합니다. 0은 무제한(기본값)입니다. 순차 실행하려면 1로 설정하세요(Brave 무료 요금제처럼 엄격한 속도 제한이 있는 API에 권장됩니다).", + "Limits the number of concurrent embedding requests. Set to 0 for unlimited.": "동시 임베딩 요청 수를 제한합니다. 무제한은 0으로 설정하세요.", + "List": "목록", "Listening...": "듣는 중...", - "Live": "", + "Live": "실시간", "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "LLM에 오류가 있을 수 있습니다. 중요한 정보는 확인이 필요합니다.", "Loader": "로더", "Loading Kokoro.js...": "Kokoro.js 로딩 중...", "Loading...": "로딩 중...", - "local": "", + "local": "로컬", "Local": "로컬", "Local Task Model": "로컬 작업 모델", - "Location": "", "Location access not allowed": "위치 접근이 허용되지 않습니다", "Lost": "패배", - "Low": "", + "Low": "낮음", "LTR": "LTR", "Made by Open WebUI Community": "OpenWebUI 커뮤니티에 의해 개발됨", "Make password visible in the user interface": "비밀번호 보이기", "Make sure to export a workflow.json file as API format from ComfyUI.": "꼭 workflow.json 파일을 ComfyUI의 API 형식대로 내보내세요", "Male": "남성", "Manage": "관리", - "Manage Connections": "", + "Manage Connections": "연결 관리", "Manage Direct Connections": "다이렉트 연결 관리", - "Manage Files": "", + "Manage Files": "파일 관리", "Manage Models": "모델 관리", "Manage Ollama": "Ollama 관리", "Manage Ollama API Connections": "Ollama API 연결 관리", @@ -1250,24 +1227,24 @@ "Manage your account information.": "계정 정보를 관리하세요.", "March": "3월", "Markdown": "마크다운", - "Markdown Header Text Splitter": "", + "Markdown Header Text Splitter": "마크다운 헤더 텍스트 분할기", "Max Speakers": "최대 화자 수", "Max Upload Count": "업로드 최대 수", "Max Upload Size": "업로드 최대 사이즈", - "Maximum characters to return from fetched URLs. Leave empty for no limit.": "", - "Maximum number of files allowed per folder.": "", - "Maximum number of files per folder is {{max}}.": "", + "Maximum characters to return from fetched URLs. Leave empty for no limit.": "가져온 URL에서 반환할 최대 문자 수입니다. 제한이 없으면 비워 두세요.", + "Maximum number of files allowed per folder.": "폴더당 허용되는 최대 파일 수입니다.", + "Maximum number of files per folder is {{max}}.": "폴더당 파일 수의 최대값은 {{max}}입니다.", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "최대 3개의 모델을 동시에 다운로드할 수 있습니다. 나중에 다시 시도하세요.", "May": "5월", - "MBR": "", - "MCP": "", + "MBR": "MBR", + "MCP": "MCP", "MCP support is experimental and its specification changes often, which can lead to incompatibilities. OpenAPI specification support is directly maintained by the Open WebUI team, making it the more reliable option for compatibility.": "MCP 지원은 실험적이며 명세가 자주 변경되므로, 호환성 문제가 발생할 수 있습니다. Open WebUI 팀이 OpenAPI 명세 지원을 직접 유지·관리하고 있어, 호환성 측면에서는 더 신뢰할 수 있는 선택입니다.", - "Medium": "", + "Medium": "중간", "Member removed successfully": "멤버 삭제에 성공했습니다", - "members": "", + "members": "멤버들", "Members": "멤버", "Members added successfully": "멤버 추가에 성공했습니다", - "Memories": "", + "Memories": "메모리", "Memories accessible by LLMs will be shown here.": "LLM에서 접근할 수 있는 메모리는 여기에 표시됩니다.", "Memory": "메모리", "Memory added successfully": "성공적으로 메모리가 추가되었습니다", @@ -1277,38 +1254,38 @@ "Merge Responses": "응답들 결합하기", "Merged Response": "결합된 응답", "Message": "메시지", - "Message counts and response timestamps": "", - "Message counts are based on assistant responses.": "", + "Message counts and response timestamps": "메시지 수와 응답 타임스탬프", + "Message counts are based on assistant responses.": "메시지 수는 어시스턴트 응답을 기준으로 계산됩니다.", "Message rating should be enabled to use this feature": "이 기능을 사용하려면 메시지 평가가 활성화되어야합니다", - "messages": "", - "Messages": "", + "messages": "메시지들", + "Messages": "메시지", "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "링크 생성 후에 보낸 메시지는 공유되지 않습니다. URL이 있는 사용자는 공유된 채팅을 볼 수 있습니다.", - "Microsoft OneDrive": "", + "Microsoft OneDrive": "Microsoft OneDrive", "Microsoft OneDrive (personal)": "Microsoft OneDrive (개인용)", "Microsoft OneDrive (work/school)": "Microsoft OneDrive (회사/학교용)", - "min": "", - "MinerU": "", + "min": "분", + "MinerU": "MinerU", "MinerU API Key required for Cloud API mode.": "클라우드 API 모드를 사용하려면 MinerU API 키가 필요합니다.", - "Mistral OCR": "", + "Mistral OCR": "Mistral OCR", "Mistral OCR API Key required.": "Mistral OCR API Key가 필요합니다.", - "MistralAI": "", - "Mo_day_of_week": "", + "MistralAI": "MistralAI", + "Mo_day_of_week": "Mo_day_of_week", "Model": "모델", "Model '{{modelName}}' has been successfully downloaded.": "모델 '{{modelName}}'이/가 성공적으로 다운로드되었습니다.", "Model '{{modelTag}}' is already in queue for downloading.": "모델 '{{modelTag}}'은/는 이미 다운로드 대기열에 있습니다.", - "Model {{modelId}} not found": "", - "Model {{modelName}} deleted successfully": "", + "Model {{modelId}} not found": "모델 {{modelId}}을/를 찾을 수 없습니다", + "Model {{modelName}} deleted successfully": "모델 {{modelName}}이/가 성공적으로 삭제되었습니다", "Model {{modelName}} is not vision capable": "모델 {{modelName}}은/는 비전을 사용할 수 없습니다.", "Model {{name}} is now {{status}}": "모델 {{name}}은/는 이제 {{status}} 상태입니다.", "Model {{name}} is now hidden": "모델 {{name}}은/는 이제 숨겨졌습니다.", "Model {{name}} is now visible": "모델 {{name}}은/는 이제 볼 수 있습니다.", "Model accepts file inputs": "모델에 파일 입력을 허용합니다", "Model accepts image inputs": "모델에 이미지 입력을 허용합니다", - "Model can access Open Terminal for command execution and file management": "", + "Model can access Open Terminal for command execution and file management": "모델이 명령 실행과 파일 관리를 위해 Open Terminal에 접근할 수 있습니다.", "Model can execute code and perform calculations": "모델이 코드를 실행하고 계산을 수행할 수 있습니다.", "Model can generate images based on text prompts": "모델이 텍스트 프롬프트를 기반으로 이미지를 생성할 수 있습니다.", "Model can search the web for information": "모델이 웹에서 정보를 검색할 수 있습니다.", - "Model Capabilities": "", + "Model Capabilities": "모델 성능", "Model created successfully!": "성공적으로 모델이 생성되었습니다", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "모델 파일 시스템 경로가 감지되었습니다. 업데이트하려면 모델 단축 이름이 필요하며 계속할 수 없습니다.", "Model Filtering": "모델 필터링", @@ -1318,16 +1295,16 @@ "Model Name": "모델 이름", "Model name already exists, please choose a different one": "이 모델 이름은 이미 존재합니다. 다른 이름을 선택해주세요.", "Model Name is required.": "모델 이름이 필요합니다", - "Model names and usage frequency": "", - "Model not found": "", + "Model names and usage frequency": "모델 이름과 사용 빈도", + "Model not found": "모델을 찾을 수 없습니다", "Model not selected": "모델이 선택되지 않았습니다.", - "Model Parameters": "", + "Model Parameters": "모델 매개변수", "Model Params": "모델 매개변수", "Model Permissions": "모델 권한", - "Model responses or outputs": "", + "Model responses or outputs": "모델 응답 또는 출력", "Model unloaded successfully": "성공적으로 모델이 언로드되었습니다", "Model updated successfully": "성공적으로 모델이 업데이트되었습니다", - "Model Usage": "", + "Model Usage": "모델 사용량", "Model(s) do not support file upload": "모델이 파일 업로드를 지원하지 않습니다", "Modelfile Content": "모델 파일 내용", "Models": "모델", @@ -1335,50 +1312,48 @@ "Models configuration saved successfully": "모델 구성이 성공적으로 저장되었습니다", "Models imported successfully": "모델을 성공적으로 가져왔습니다.", "Models Public Sharing": "모델 공개 공유", - "Models Sharing": "", - "Mojeek": "", + "Models Sharing": "모델 공유", + "Mojeek": "Mojeek", "Mojeek Search API Key": "Mojeek Search API 키", - "Month": "", - "Monthly": "", + "Monthly": "월간", "More": "더보기", "More Concise": "더 간결하게", - "More options": "", + "More options": "추가 옵션", "More Options": "추가 설정", "Move": "이동", - "Moved {{name}}": "", - "My Terminal": "", + "Moved {{name}}": "{{name}} 이동됨", + "My Terminal": "내 터미널", "Name": "이름", - "Name and ID are required, please fill them out": "", + "Name and ID are required, please fill them out": "이름과 ID는 필수입니다. 작성해주세요", "Name your knowledge base": "지식 기반 이름을 지정하세요", - "Name, prompt, and model are required": "", + "Name, prompt, and model are required": "이름, 프롬프트, 및 모델은 필수입니다", "Native": "네이티브", - "Never": "", - "New": "", - "New Automation": "", + "Never": "절대", + "New": "새로 만들기", + "New Automation": "새로운 자동", "New Button": "새 버튼", "New Chat": "새 채팅", - "New Event": "", - "New File": "", + "New File": "새 파일", "New Folder": "새 폴더", "New Function": "새 함수", - "New Group": "", + "New Group": "새 그룹", "New Knowledge": "새 지식 기반", "New Model": "새 모델", - "New Note": "", + "New Note": "새 노트", "New Password": "새 비밀번호", "New Prompt": "새 프롬프트", - "New Skill": "", - "New Temporary Chat": "", - "New Terminal": "", + "New Skill": "새 기능", + "New Temporary Chat": "새 임시 채팅", + "New Terminal": "새 터미널", "New Tool": "새 도구", - "New Webhook": "", + "New Webhook": "새 Webhook", "new-channel": "새 채널", "Next message": "다음 메시지", - "Next run": "", - "No access grants. Private to you.": "", - "No activity data": "", - "No authentication": "", - "No automations found": "", + "Next run": "다음 실행", + "No access grants. Private to you.": "접근 권한이 없습니다. 개인용입니다.", + "No activity data": "활동 데이터가 없습니다", + "No authentication": "권한 인증이 없습니다", + "No automations found": "자동화된 항목을 찾을 수 없습니다.", "No chats found": "채팅을 찾을 수 없습니다", "No chats found for this user.": "이 사용자에 대한 채팅을 찾을 수 없습니다.", "No chats found.": "채팅을 찾을 수 없습니다.", @@ -1386,57 +1361,57 @@ "No content found": "내용을 찾을 수 없습니다", "No content to speak": "음성 출력할 내용을 찾을 수 없습니다", "No conversation to save": "저장할 대화가 없습니다", - "No data": "", - "No data found": "", + "No data": "데이터가 없습니다", + "No data found": "데이터를 찾을 수 없습니다", "No distance available": "거리 불가능", - "No execution logs available yet": "", + "No execution logs available yet": "아직 실행 로그가 없습니다", "No expiration can pose security risks.": "만료 기한이 없으면 보안 위험이 발생할 수 있습니다.", - "No feedback found": "", + "No feedback found": "피드백을 찾을 수 없습니다", "No file selected": "파일이 선택되지 않았습니다", - "No files found": "", - "No files in this knowledge base.": "", - "No files yet. Upload files or run Python code to create them.": "", + "No files found": "파일을 찾을 수 없습니다", + "No files in this knowledge base.": "이 지식 기반에 파일이 없습니다.", + "No files yet. Upload files or run Python code to create them.": "아직 파일이 없습니다. 파일을 업로드하거나 Python 코드를 실행하여 생성하세요.", "No functions found": "함수를 찾을 수 없습니다", - "No groups found": "", - "No history available": "", + "No groups found": "그룹을 찾을 수 없습니다", + "No history available": "사용 기록이 없습니다", "No HTML, CSS, or JavaScript content found.": "HTML, CSS, JavaScript이 발견되지 않았습니다", "No inference engine with management support found": "관리 지원이 포함된 추론 엔진을 찾을 수 없습니다", - "No kernel": "", - "No knowledge bases found.": "", + "No kernel": "커널이 없습니다", + "No knowledge bases found.": "지식 기반을 찾을 수 없습니다", "No knowledge found": "지식 기반을 찾을 수 없습니다", - "No limit": "", + "No limit": "제한이 없습니다", "No memories to clear": "메모리를 정리할 수 없습니다", "No model IDs": "모델 ID가 없습니다", - "No models available": "", + "No models available": "사용 가능한 모델이 없습니다", "No models found": "모델을 찾을 수 없습니다", "No models selected": "모델이 선택되지 않았습니다", "No Notes": "노트가 없습니다", "No notes found": "노트를 찾을 수 없습니다", - "No one": "", + "No one": "없음", "No pinned messages": "고정된 메시지가 없습니다", "No prompts found": "프롬프트를 찾을 수 없습니다", "No results": "결과가 없습니다", "No results found": "결과를 찾을 수 없습니다", "No search query generated": "검색어가 생성되지 않았습니다", - "No servers detected": "", - "No skills found": "", + "No servers detected": "서버가 감지되지 않았습니다", + "No skills found": "기능을 찾을 수 없습니다", "No source available": "사용 가능한 소스가 없습니다.", "No sources found": "소스를 찾을 수 없습니다", "No suggestion prompts": "추천 프롬프트가 없습니다", - "No Terminal connection configured.": "", - "No terminal connections configured.": "", - "No tool server connections configured.": "", + "No Terminal connection configured.": "터미널 연결이 구성되지 않았습니다.", + "No terminal connections configured.": "터미널 연결이 구성되지 않았습니다.", + "No tool server connections configured.": "도구 서버 연결이 구성되지 않았습니다.", "No tools found": "도구를 찾을 수 없습니다", "No users were found.": "사용자를 찾을 수 없습니다", "No valves": "밸브가 없습니다", "No valves to update": "업데이트 할 밸브가 없습니다", - "No webhooks yet": "", - "Node Ids": "Ids 가 없습니다", + "No webhooks yet": "webhook이 아직 없습니다", + "Node Ids": "노드 ID", "None": "없음", "Not factually correct": "사실상 맞지 않습니다", "Not helpful": "도움이 되지않습니다", "Not Registered": "등록되지 않았습니다", - "Not scheduled": "", + "Not scheduled": "예약되지 않았습니다", "Note": "노트", "Note deleted successfully": "노트가 성공적으로 삭제되었습니다", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "참고: 최소 점수를 설정하면, 검색 결과로 최소 점수 이상의 점수를 가진 문서만 반환합니다.", @@ -1447,9 +1422,9 @@ "Notification Webhook": "알림 웹훅", "Notifications": "알림", "November": "11월", - "OAuth": "", - "OAuth 2.1": "", - "OAuth 2.1 (Static)": "", + "OAuth": "OAuth", + "OAuth 2.1": "OAuth 2.1", + "OAuth 2.1 (Static)": "OAuth 2.1 (Static)", "OAuth ID": "OAuth ID", "October": "10월", "Off": "끄기", @@ -1458,10 +1433,10 @@ "Ollama": "Ollama", "Ollama API": "Ollama API", "Ollama API settings updated": "Ollama API 세팅이 업데이트 되었습니다.", - "Ollama Cloud API Key": "", + "Ollama Cloud API Key": "Ollama Cloud API Key", "Ollama Version": "Ollama 버전", "On": "켜기", - "Once": "", + "Once": "Once", "OneDrive": "OneDrive", "Only active when \"Paste Large Text as File\" setting is toggled on.": "\"긴 텍스트를 파일로 붙여넣기\" 설정이 켜져 있을 때만 작동합니다.", "Only active when the chat input is in focus and an LLM is generating a response.": "채팅 입력창이 선택되어 있고 LLM이 응답을 생성 중일 때만 작동합니다.", @@ -1473,65 +1448,65 @@ "Only invited users can access": "초대된 사용자만 접근할 수 있습니다.", "Only markdown files are allowed": "마크다운 파일만 허용됩니다", "Only select users and groups with permission can access": "권한이 있는 사용자와 그룹만 접근 가능합니다.", - "Only sync new/updated chats": "", + "Only sync new/updated chats": "새로운/업데이트된 채팅만 동기화", "Oops! Looks like the URL is invalid. Please double-check and try again.": "이런! URL이 잘못된 것 같습니다. 다시 한번 확인하고 다시 시도해주세요.", "Oops! There are files still uploading. Please wait for the upload to complete.": "이런! 파일이 계속 업로드중 입니다. 업로드가 완료될 때까지 잠시만 기다려주세요.", "Oops! There was an error in the previous response.": "이런! 이전 응답에 에러가 있었던 것 같습니다.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "이런! 지원되지 않는 방식(프론트엔드만)을 사용하고 계십니다. 백엔드에서 WebUI를 제공해주세요.", "Open file": "파일 열기", "Open in full screen": "전체화면으로 열기", - "Open in new tab": "", + "Open in new tab": "새 탭에서 열기", "Open link": "링크 열기", "Open modal to configure connection": "연결 설정 열기", - "Open Modal To Manage Floating Quick Actions": "", - "Open Modal To Manage Image Compression": "", - "Open Model Selector": "", + "Open Modal To Manage Floating Quick Actions": "플로팅 빠른 작업 관리를 위한 모달 열기", + "Open Modal To Manage Image Compression": "이미지 압축 관리를 위한 모달 열기", + "Open Model Selector": "모델 선택기 열기", "Open Settings": "설정 열기", "Open Sidebar": "사이드바 열기", - "Open Terminal": "", + "Open Terminal": "터미널 열기", "Open User Profile Menu": "사용자 프로필 메뉴 열기", "Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI는 모든 OpenAPI 서버에서 제공하는 도구를 사용할 수 있습니다.", "Open WebUI uses faster-whisper internally.": "Open WebUI는 내부적으로 패스트 위스퍼를 사용합니다.", "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI는 SpeechT5와 CMU Arctic 스피커 임베딩을 사용합니다.", - "Open WebUI version": "", + "Open WebUI version": "Open WebUI 버전", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "열린 WebUI 버젼(v{{OPEN_WEBUI_VERSION}})은 최소 버젼 (v{{REQUIRED_VERSION}})보다 낮습니다", "OpenAI": "OpenAI", "OpenAI API": "OpenAI API", - "OpenAI API Base URL": "", + "OpenAI API Base URL": "OpenAI API 기본 URL", "OpenAI API Key": "OpenAI API 키", "OpenAI API Key is required.": "OpenAI API 키가 필요합니다.", "OpenAI API settings updated": "OpenAI API 설정이 업데이트되었습니다.", "OpenAI API Version": "OpenAI API 버전", "OpenAI URL/Key required.": "OpenAI URL/키가 필요합니다.", - "OpenAPI": "", - "OpenAPI Spec": "", + "OpenAPI": "OpenAPI", + "OpenAPI Spec": "OpenAPI 사양", "openapi.json URL or Path": "openapi.json URL 또는 경로", - "optional": "", - "Optional": "", + "optional": "선택 사항", + "Optional": "선택 사항", "or": "또는", "Ordered List": "번호 목록", "Other": "기타", - "out of": "", - "Output": "", + "out of": "의", + "Output": "출력", "OUTPUT": "출력", "Output format": "출력 형식", "Output Format": "출력 형식", "Overview": "개요", "page": "페이지", - "Page": "", - "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", + "Page": "페이지", + "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "페이지 모드는 페이지마다 하나의 문서를 생성합니다. 단일 모드는 모든 페이지를 하나의 문서로 결합하여 페이지 경계를 넘어 더 나은 청킹을 제공합니다.", "Paginate": "페이지 나누기", "Parameters": "매개변수", - "Parent message not found": "", - "Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.": "", + "Parent message not found": "상위 메시지를 찾을 수 없습니다.", + "Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.": "커뮤니티 리더보드와 평가에 참여하세요! 집계된 사용 통계를 동기화하면 Open WebUI의 연구과 개선을 지원합니다. 귀하의 개인정보는 최우선으로 보호됩니다: 메시지 내용은 절대 공유되지 않습니다.", "Password": "비밀번호", "Passwords do not match.": "비밀번호가 일치하지 않습니다.", "Paste Large Text as File": "큰 텍스트를 파일로 붙여넣기", - "Path copied": "", - "Paused": "", + "Path copied": "경로가 복사되었습니다.", + "Paused": "일시정지됨", "PDF document (.pdf)": "PDF 문서(.pdf)", "PDF Extract Images (OCR)": "PDF 이미지 추출(OCR)", - "PDF Loader Mode": "", + "PDF Loader Mode": "PDF 로더 모드", "pending": "보류 중", "Pending": "보류", "Pending User Overlay Content": "대기 중인 사용자 오버레이 내용", @@ -1542,20 +1517,20 @@ "Permissions": "권한", "Perplexity API Key": "Perplexity API 키", "Perplexity Model": "Perplexity 모델", - "Perplexity Search API URL": "", + "Perplexity Search API URL": "Perplexity 검색 API URL", "Perplexity Search Context Usage": "Perplexity 검색 컨텍스트 사용", - "Persistent": "", + "Persistent": "지속적", "Personalization": "개인화", "Pin": "고정", - "Pin to Sidebar": "", + "Pin to Sidebar": "사이드바에 고정", "Pinned": "고정됨", "Pinned Messages": "고정된 메시지", - "Pinned Models": "", + "Pinned Models": "고정된 모델", "Pioneer insights": "혁신적인 발견", "Pipe": "파이프", "Pipeline deleted successfully": "성공적으로 파이프라인이 삭제되었습니다.", "Pipeline downloaded successfully": "성공적으로 파이프라인이 설치되었습니다.", - "Pipelines": "", + "Pipelines": "파이프라인", "Pipelines are a plugin system with arbitrary code execution —": "Pipelines는 임의 코드 실행이 가능한 플러그인 시스템입니다 —", "Pipelines Not Detected": "파이프라인이 발견되지 않았습니다.", "Pipelines Valves": "파이프라인 밸브", @@ -1565,7 +1540,7 @@ "Playwright Timeout (ms)": "Playwright 시간 초과 (ms)", "Playwright WebSocket URL": "Playwright WebSocket URL", "Please carefully review the following warnings:": "다음 주의를 조심히 확인해주십시오", - "Please connect all required integrations before sending a message": "", + "Please connect all required integrations before sending a message": "모든 필요한 통합을 연결한 후 메시지를 보내세요", "Please do not close the settings page while loading the model.": "모델을 로드하는 동안 설정 페이지를 닫지 마세요.", "Please enter a message or attach a file.": "메시지를 입력하거나 파일을 첨부해 주세요.", "Please enter a prompt": "프롬프트를 입력해주세요", @@ -1574,7 +1549,7 @@ "Please enter a valid path": "올바른 경로를 입력하세요", "Please enter a valid URL": "올바른 URL을 입력하세요", "Please enter a valid URL.": "올바른 URL을 입력하세요.", - "Please enter Client ID and Client Secret": "", + "Please enter Client ID and Client Secret": "Client ID와 Client Secret을 입력하세요", "Please fill in all fields.": "모두 빈칸없이 채워주세요", "Please register the OAuth client": "OAuth clith를 등록해주세요", "Please save the connection to persist the OAuth client information and do not change the ID": "OAuth 클라이언트 정보를 저장하려면 연결을 저장하고 ID를 변경하지 마세요.", @@ -1584,9 +1559,9 @@ "Please select a valid JSON file": "올바른 Json 파일을 선택해 주세요", "Please select at least one user for Direct Message channel.": "1:1 메시지 채널에 참여할 사용자를 최소 한 명 선택해주세요.", "Please wait until all files are uploaded.": "모든 파일이 업로드될 때까지 기다려 주세요.", - "Policy ID": "", + "Policy ID": "정책 ID", "Port": "포트", - "Ports": "", + "Ports": "포트", "Positive attitude": "긍정적인 자세", "Prefer not to say": "언급하고 싶지 않습니다.", "Prefix ID": "Prefix ID", @@ -1598,55 +1573,54 @@ "Previous message": "이전 메시지", "Private": "비공개", "Private conversation between selected users": "선택한 사용자 간의 비공개 대화", - "Production version updated": "", + "Production version updated": " production 버전이 업데이트되었습니다.", "Profile": "프로필", "Prompt": "프롬프트", "Prompt Autocompletion": "프롬프트 자동 완성", "Prompt Content": "프롬프트 내용", "Prompt created successfully": "성공적으로 프롬프트를 생성했습니다", - "Prompt Name": "", - "Prompt Suggestions": "", + "Prompt Name": "프롬프트 이름", + "Prompt Suggestions": "프롬프트 제안", "Prompt updated successfully": "성공적으로 프롬프트를 수정했습니다", "Prompts": "프롬프트", "Prompts Access": "프롬프트 접근", "Prompts Public Sharing": "프롬프트 공개 공유", "Prompts Sharing": "프롬프트 공유", - "Provider Type": "", + "Provider Type": "제공자 유형", "Public": "공개", "Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com에서 \"{{searchValue}}\" 가져오기", "Pull a model from Ollama.com": "Ollama.com에서 모델 가져오기(pull)", "Pull Model": "모델 pull", - "Pyodide file browser": "", + "Pyodide file browser": "Pyodide 파일 브라우저", "Query Generation Prompt": "쿼리 생성 프롬프트", "Querying": "쿼리 진행중", "Quick Actions": "빠른 작업", "RAG Template": "RAG 템플릿", - "Ran {{COUNT}} analyses": "", - "Ran {{COUNT}} analysis": "", - "Rate {{rating}} out of 10": "", + "Ran {{COUNT}} analyses": "{{COUNT}}개의 분석이 실행되었습니다", + "Ran {{COUNT}} analysis": "{{COUNT}}개의 분석이 실행되었습니다", + "Rate {{rating}} out of 10": "{{rating}}/10 점 평가", "Rating": "평가", "Re-rank models by topic similarity": "주제 유사성으로 모델을 재정렬하기", "Read": "읽기", "Read Aloud": "읽어주기", "Read more →": "더 읽기 →", - "Read Only": "", - "Read-Only Access": "", + "Read Only": "읽기 전용", + "Read-Only Access": "읽기 전용 접근", "Reason": "근거", "Reasoning Effort": "추론 난이도", "Reasoning Tags": "추론 태그", - "Recently Used": "", - "Reconnected": "", + "Recently Used": "최근 사용", "Record": "녹음", "Record voice": "음성 녹음", "Redirecting you to Open WebUI Community": "OpenWebUI 커뮤니티로 리디렉션 중", "Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "넌센스를 생성할 확률을 줄입니다. 값이 높을수록(예: 100) 더 다양한 답변을 제공하는 반면, 값이 낮을수록(예: 10) 더 보수적입니다.", "Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "스스로를 \"사용자\" 라고 지칭하세요. (예: \"사용자는 영어를 배우고 있습니다\")", "Reference Chats": "채팅 참조", - "Refresh": "", + "Refresh": "새로 고침", "Refused when it shouldn't have": "허용되지 않았지만 허용되어야 합니다.", "Regenerate": "재생성", "Regenerate Menu": "메뉴 재생성", - "Regenerate Response": "", + "Regenerate Response": "응답 재생성", "Register Again": "재등록", "Register Client": "클라이언트 등록", "Registered": "등록됨", @@ -1659,26 +1633,25 @@ "Relevance": "관련도", "Relevance Threshold": "관련성 임계값", "Remember Dismissal": "다시 보지 않기", - "Reminder": "", "Remove": "삭제", "Remove {{MODELID}} from list.": "{{MODELID}}를 목록에서 제거.", - "Remove action": "", + "Remove action": "작업 제거", "Remove file": "파일 삭제", "Remove File": "파일 삭제", - "Remove from favorites": "", + "Remove from favorites": "즐겨찾기에서 제거", "Remove image": "이미지 삭제", "Remove Model": "모델 삭제", "Rename": "이름 변경", - "Renamed to {{name}}": "", - "Render Markdown in Previews": "", + "Renamed to {{name}}": "{{name}}(으)로 이름 변경", + "Render Markdown in Previews": "미리보기에서 마크다운 렌더링", "Reorder Models": "모델 재정렬", - "Repeats": "", + "Repeats": "반복", "Reply": "답장", "Reply in Thread": "스레드로 답장하기", "Reply to thread...": "스레드로 답장하기...", "Replying to {{NAME}}": "{{NAME}}에게 답장하는 중", - "required": "", - "Reranking Batch Size": "", + "required": "필수", + "Reranking Batch Size": "리랭킹 배치 사이즈", "Reranking Engine": "Reranking 엔진", "Reranking Model": "Reranking 모델", "Reset": "초기화", @@ -1691,26 +1664,26 @@ "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "웹사이트 권한이 거부되어 응답 알림을 활성화할 수 없습니다. 필요한 접근 권한을 부여하려면 브라우저 설정을 확인해 주세요.", "Response splitting": "응답 나누기", "Response Watermark": "응답 워터마크", - "Responses": "", - "Restart": "", + "Responses": "응답", + "Restart": "재시작", "Result": "결과", "RESULT": "결과", "Retrieval": "검색", "Retrieval Query Generation": "검색 쿼리 생성", - "Retrieved {{count}} sources": "", - "Retrieved {{count}} sources_other": "", + "Retrieved {{count}} sources": "{{count}}개의 소스 검색됨", + "Retrieved {{count}} sources_other": "{{count}}개의 소스 검색됨", "Retrieved 1 source": "검색된 source 1개", "Rich Text Input for Chat": "다양한 텍스트 서식 사용", "Role": "역할", "RTL": "RTL", "Run": "실행", - "Run All": "", - "Run now": "", - "Run Now": "", + "Run All": "모두 실행", + "Run now": "지금 실행", + "Run Now": "지금 실행", "Running": "실행 중", "Running...": "실행 중...", - "Runs embedding tasks concurrently to speed up processing. Turn off if rate limits become an issue.": "", - "Sa_day_of_week": "", + "Runs embedding tasks concurrently to speed up processing. Turn off if rate limits become an issue.": "임베딩 작업을 동시에 실행하여 처리 속도를 높입니다. 속도 제한이 문제가 되면 끄세요.", + "Sa_day_of_week": "Sa_day_of_week", "Save": "저장", "Save & Create": "저장 및 생성", "Save & Update": "저장 및 업데이트", @@ -1718,20 +1691,20 @@ "Save Chat": "채팅 저장", "Saved": "저장됨", "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "브라우저의 저장소에 채팅 로그를 직접 저장하는 것은 더 이상 지원되지 않습니다. 아래 버튼을 클릭하여 채팅 로그를 다운로드하고 삭제하세요. 걱정 마세요. 백엔드를 통해 채팅 로그를 쉽게 다시 가져올 수 있습니다.", - "Schedule": "", - "Scheduled time must be in the future": "", + "Schedule": "일정", + "Scheduled time must be in the future": "예약 시간은 미래여야 합니다", "Scroll On Branch Change": "브랜치 변경 시 스크롤", "Search": "검색", "Search a model": "모델 검색", "Search all emojis": "모든 이모지 검색", - "Search and manage user memories": "", - "Search and view user chat history": "", - "Search Automations": "", + "Search and manage user memories":"사용자 기억 검색 및 관리", + "Search and view user chat history":"사용자 채팅 기록 검색 및 보기", + "Search Automations": "자동 검색", "Search Base": "검색 기반", - "Search channels and channel messages": "", + "Search channels and channel messages": "채널 및 채널 메시지 검색", "Search Chats": "채팅 검색", "Search Collection": "컬렉션 검색", - "Search Files": "", + "Search Files": "파일 검색", "Search Filters": "필터 검색", "search for archived chats": "보관된 채팅 검색", "search for folders": "폴더 검색", @@ -1739,20 +1712,20 @@ "search for shared chats": "공유된 채팅 검색", "search for tags": "태그 검색", "Search Functions": "함수 검색", - "Search Groups": "", + "Search Groups": "그룹 검색", "Search In Models": "모델에서 검색", "Search Knowledge": "지식 기반 검색", - "Search Memories": "", + "Search Memories": "메모리 검색", "Search Models": "모델 검색", "Search Notes": "노트 검색", "Search options": "검색 옵션", "Search Prompts": "프롬프트 검색", "Search Result Count": "검색 결과 수", - "Search Skills": "", + "Search Skills": "스킬 검색", "Search the internet": "인터넷 검색", - "Search the web and fetch URLs": "", + "Search the web and fetch URLs": "웹에서 검색하고 URL 가져오기", "Search Tools": "검색 도구", - "Search, view, and manage user notes": "", + "Search, view, and manage user notes": "사용자 노트 검색, 보기, 및 관리", "SearchApi API Key": "SearchApi API 키", "SearchApi Engine": "SearchApi 엔진", "Searched {{count}} sites": "{{count}}개 사이트 검색됨", @@ -1761,12 +1734,12 @@ "Searching Knowledge for \"{{searchQuery}}\"": "\"{{searchQuery}}\"에 대한 지식 기반 검색 중", "Searching the web": "웹에서 검색 중...", "Searxng Query URL": "Searxng 쿼리 URL", - "Searxng search language (all, en, es, de, fr, etc.)": "", + "Searxng search language (all, en, es, de, fr, etc.)": "Searxng 검색 언어 (all, en, es, de, fr, etc.)", "See readme.md for instructions": "설명은 readme.md를 참조하세요.", "See what's new": "새로운 기능 보기", "Seed": "시드", "Select": "선택", - "Select {{modelName}} model": "", + "Select {{modelName}} model": "{{modelName}} 모델 선택", "Select a base model": "기본 모델 선택", "Select a base model (e.g. llama3, gpt-4o)": "기본 모델 선택 (예: llama3, gpt-4o)", "Select a conversation to preview": "대화를 선택하여 미리 보기", @@ -1779,34 +1752,34 @@ "Select a model (optional)": "모델 선택 (선택사항)", "Select a pipeline": "파이프라인 선택", "Select a pipeline url": "파이프라인 URL 선택", - "Select a reranking model engine": "", + "Select a reranking model engine": "리랭킹 모델 엔진 선택", "Select a role": "역할 선택", "Select a theme": "테마 선택", "Select a tool": "도구 선택", "Select a voice": "음성 선택", - "Select All": "", + "Select All": "모두 선택", "Select an auth method": "인증 방법 선택", "Select an embedding model engine": "임베딩 모델 엔진 선택", "Select an engine": "엔진 선택", "Select an Ollama instance": "Ollama 인스턴스 선택", - "Select an option": "", + "Select an option": "옵션 선택", "Select an output format": "출력 형식 선택", "Select dtype": "dtype 선택", "Select Engine": "엔진 선택", "Select how to split message text for TTS requests": "TTS 요청에 대한 메시지 텍스트 분할 방법 선택", "Select Knowledge": "지식 기반 선택", - "Select Method": "", - "Select model": "", + "Select Method": "방법 선택", + "Select model": "모델 선택", "Select only one model to call": "음성 기능을 위해서는 모델을 하나만 선택해야 합니다.", - "Select view": "", - "Selected model: {{modelName}}": "", + "Select view": "보기 선택", + "Selected model: {{modelName}}": "선택된 모델: {{modelName}}", "Selected model(s) do not support image inputs": "선택한 모델은 이미지 입력을 지원하지 않습니다.", - "Selected Models": "", + "Selected Models": "선택된 모델들", "semantic": "의미적", "Send": "보내기", "Send a Message": "메시지 보내기", "Send message": "메시지 보내기", - "Send now": "", + "Send now": "지금 보내기", "Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "'stream_options: { include_usage: true }' 요청 보내기 \n지원되는 제공자가 토큰 사용 정보를 응답할 예정입니다", "September": "9월", "SerpApi API Key": "SerpApi API 키", @@ -1814,16 +1787,16 @@ "Serper API Key": "Serper API 키", "Serply API Key": "Serply API 키", "Serpstack API Key": "Serpstack API 키", - "Server connection failed": "", + "Server connection failed": "서버 연결 실패", "Server connection verified": "서버 연결 확인됨", "Session": "세션", "Set as default": "기본값으로 설정", - "Set as Production": "", + "Set as Production": "프로덕션으로 설정", "Set embedding model": "임베딩 모델 설정", "Set embedding model (e.g. {{model}})": "임베딩 모델 설정 (예: {{model}})", "Set reranking model (e.g. {{model}})": "Reranking 모델 설정 (예: {{model}})", - "Set the default models that are automatically selected for all users when a new chat is created.": "", - "Set the models that are automatically pinned to the sidebar for all users.": "", + "Set the default models that are automatically selected for all users when a new chat is created.": "새 채팅이 생성될 때 모든 사용자에게 자동으로 선택되는 기본 모델을 설정합니다.", + "Set the models that are automatically pinned to the sidebar for all users.": "모든 사용자에게 자동으로 사이드바에 고정되는 모델을 설정합니다.", "Set the number of layers, which will be off-loaded to GPU. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "GPU에 오프로드될 레이어 수를 설정합니다. 이 값을 높이면 GPU 가속에 최적화된 모델의 성능이 크게 향상될 수 있지만 더 많은 전력과 GPU 리소스를 소비할 수도 있습니다.", "Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "계산에 사용되는 작업자 스레드 수를 설정합니다. 이 옵션은 들어오는 요청을 동시에 처리하는 데 사용되는 스레드 수를 제어합니다. 이 값을 높이면 동시성이 높은 워크로드에서 성능을 향상시킬 수 있지만 더 많은 CPU 리소스를 소비할 수도 있습니다.", "Set Voice": "음성 설정", @@ -1837,29 +1810,29 @@ "Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "중단 시퀀스를 설정합니다. 이 패턴이 발생하면 LLM은 텍스트 생성을 중단하고 반환합니다. 여러 중단 패턴은 모델 파일에서 여러 개의 별도 중단 매개변수를 지정하여 설정할 수 있습니다.", "Setting": "설정", "Settings": "설정", - "Settings Permissions": "", + "Settings Permissions": "설정 권한", "Settings saved successfully!": "설정이 성공적으로 저장되었습니다!", "Share": "공유", "Share Chat": "채팅 공유", - "Share link copied to clipboard.": "", + "Share link copied to clipboard.": "공유 링크가 클립보드에 복사되었습니다.", "Share to Open WebUI Community": "OpenWebUI 커뮤니티에 공유", "Share your background and interests": "당신의 배경과 관심사를 공유하세요", - "Shared Chats": "", - "Shared with you": "", + "Shared Chats": "공유된 채팅", + "Shared with you": "당신과 공유됨", "Sharing Permissions": "권한 공유", "Show": "보기", "Show \"What's New\" modal on login": "로그인시 \"새로운 기능\" 모달 보기", "Show Admin Details in Account Pending Overlay": "사용자용 계정 보류 설명창에, 관리자 상세 정보 노출", - "Show All": "", - "Show all ({{COUNT}} characters)": "", - "Show Files": "", + "Show All": "모두 보기", + "Show all ({{COUNT}} characters)": "모든 ({{COUNT}} 문자) 보기", + "Show Files": "파일 보기", "Show Formatting Toolbar": "서식 툴바 표시", "Show image preview": "이미지 미리보기", "Show Model": "모델 보기", "Show Shortcuts": "단축키 보기", "Show your support!": "당신의 응원을 보내주세요!", "Showcased creativity": "창의성 발휘", - "Showing all messages (user + assistant) per user.": "", + "Showing all messages (user + assistant) per user.": "사용자당 모든 메시지(사용자 + 어시스턴트) 표시.", "Sign in": "로그인", "Sign in to {{WEBUI_NAME}}": "{{WEBUI_NAME}} 로그인", "Sign in to {{WEBUI_NAME}} with LDAP": "LDAP로 {{WEBUI_NAME}}에 로그인", @@ -1868,72 +1841,69 @@ "Sign up to {{WEBUI_NAME}}": "{{WEBUI_NAME}} 가입", "Significantly improves accuracy by using an LLM to enhance tables, forms, inline math, and layout detection. Will increase latency. Defaults to False.": "LLM을 활용하여 표, 양식, 인라인 수식 및 레이아웃 감지 정확도를 대폭 개선합니다. 하지만 지연 시간이 증가할 수 있습니다. 기본값은 False입니다.", "Signing in to {{WEBUI_NAME}}": "{{WEBUI_NAME}}로 가입중", - "Single": "", + "Single": "단일", "Sink List": "리스트 내리기", - "sk-1234": "", - "Skill created successfully": "", - "Skill deleted successfully": "", - "Skill Description": "", - "Skill ID": "", - "Skill imported successfully": "", - "Skill Instructions": "", - "Skill Name": "", - "Skill updated successfully": "", - "Skills": "", - "Skills Access": "", - "Skills Public Sharing": "", - "Skills Sharing": "", + "sk-1234": "sk-1234", + "Skill created successfully": "스킬이 성공적으로 생성되었습니다.", + "Skill deleted successfully": "스킬이 성공적으로 삭제되었습니다.", + "Skill Description": "스킬 설명", + "Skill ID": "스킬 ID", + "Skill imported successfully": "스킬이 성공적으로 가져와졌습니다.", + "Skill Instructions": "스킬 지침", + "Skill Name": "스킬 이름", + "Skill updated successfully": "스킬이 성공적으로 업데이트되었습니다.", + "Skills": "스킬", + "Skills Access": "스킬 접근", + "Skills Public Sharing": "스킬 공개 공유", + "Skills Sharing": "스킬 공유", "Skip Cache": "캐시 무시", "Skip the cache and re-run the inference. Defaults to False.": "캐시를 무시하고 추론을 다시 실행합니다. 기본값은 False입니다.", "Something went wrong :/": "무언가 잘못 되었습니다 :/", - "Sonar": "", - "Sonar Deep Research": "", - "Sonar Pro": "", - "Sonar Reasoning": "", - "Sonar Reasoning Pro": "", - "Sort": "", - "Sort by": "", - "Sougou Search API sID": "", - "Sougou Search API SK": "", + "Sonar": "Sonar", + "Sonar Deep Research": "Sonar Deep Research", + "Sonar Pro": "Sonar Pro", + "Sonar Reasoning": "Sonar Reasoning", + "Sonar Reasoning Pro": "Sonar Reasoning Pro", + "Sort": "정렬", + "Sort by": "정렬 기준", + "Sougou Search API sID": "Sougou Search API sID", + "Sougou Search API SK": "Sougou Search API SK", "Source": "출처", "Speech Playback Speed": "음성 재생 속도", "Speech recognition error: {{error}}": "음성 인식 오류: {{error}}", "Speech-to-Text": "음성-텍스트 변환", "Speech-to-Text Engine": "음성-텍스트 변환 엔진", - "Speech-to-Text Language": "", - "Split documents by markdown headers before applying character/token splitting.": "", + "Speech-to-Text Language": "음성-텍스트 변환 언어", + "Split documents by markdown headers before applying character/token splitting.": "문자/토큰 분할을 적용하기 전에 마크다운 헤더로 문서를 분할합니다.", "Start a new conversation": "새 대화 시작", "Start of the channel": "채널 시작", "Start Tag": "시작 태그", - "Starting in {{count}} minutes_other": "", - "Starting in 1 minute": "", - "Starting kernel...": "", - "Starting now": "", - "State": "", + "Starting kernel...": "커널 시작 중...", + "State": "상태", "Status": "상태", "Status cleared successfully": "상태 초기화에 성공했습니다", "Status updated successfully": "상태 업데이트에 성공했습니다", "Status Updates": "상태 업데이트", "STDOUT/STDERR": "STDOUT/STDERR", - "Steps": "", + "Steps": "단계", "Stop": "정지", - "Stop Download": "", + "Stop Download": "다운로드 중지", "Stop Generating": "생성 중지", "Stop Sequence": "중지 시퀀스", - "Storage": "", + "Storage": "저장소", "Stream Chat Response": "스트림 채팅 응답", "Stream Delta Chunk Size": "스트림 델타 청크 크기", - "Streamable HTTP": "", + "Streamable HTTP": "스트림 가능한 HTTP", "Strikethrough": "취소선", "Strip Existing OCR": "기존 OCR 제거", "Strip existing OCR text from the PDF and re-run OCR. Ignored if Force OCR is enabled. Defaults to False.": "PDF에서 기존 OCR 텍스트를 제거하고 OCR을 다시 실행합니다. Force OCR이 활성화된 경우 무시됩니다. 기본값은 False입니다.", "STT Model": "STT 모델", "STT Settings": "STT 설정", "Stylized PDF Export": "서식이 적용된 PDF 내보내기", - "Su_day_of_week": "", - "Submit question": "", - "Submit suggestion": "", - "Subtitle": "", + "Su_day_of_week": "Su_day_of_week", + "Submit question": "질문 제출", + "Submit suggestion": "제안 제출", + "Subtitle": "부제목", "Success": "성공", "Successfully imported {{userCount}} users.": "성공적으로 {{userCount}}명의 사용자를 가져왔습니다.", "Successfully updated.": "성공적으로 업데이트되었습니다.", @@ -1942,14 +1912,14 @@ "Support": "지원", "Support this plugin:": "플러그인 지원", "Supported MIME Types": "지원하는 MIME 타입", - "Sync": "", - "Sync Complete!": "", + "Sync": "동기화", + "Sync Complete!": "동기화 완료!", "Sync directory": "디렉토리 연동", - "Sync Failed": "", - "Sync Usage Stats": "", - "Syncing stats...": "", - "Syncing...": "", - "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "", + "Sync Failed": "동기화 실패", + "Sync Usage Stats": "동기화 사용 통계", + "Syncing stats...": "동기화 통계...", + "Syncing...": "동기화 중...", + "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "마지막 동기화 타임스탬프 이후 업데이트된 채팅만 동기화합니다. 모든 채팅을 다시 동기화하려면 비활성화하세요.", "System": "시스템", "System Instructions": "시스템 지침", "System Prompt": "시스템 프롬프트", @@ -1958,25 +1928,25 @@ "Tags Generation": "태그 생성", "Tags Generation Prompt": "태그 생성 프롬프트", "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "꼬리 자유 샘플링은 출력에서 확률이 낮은 토큰의 영향을 줄이기 위해 사용됩니다. 값이 클수록(예: 2.0) 이러한 토큰의 영향이 더 줄어들며, 1.0으로 설정하면 이 기능은 비활성화됩니다.", - "Talk to Model": "", + "Talk to Model": "모델과 대화", "Tap to interrupt": "탭하여 중단", "Task List": "작업 목록", - "Task Management": "", + "Task Management": "작업 관리", "Task Model": "작업 모델", "Tasks": "작업", - "tasks completed": "", + "tasks completed": "작업 완료", "Tavily API Key": "Tavily API 키", "Tavily Extract Depth": "Tabily 깊이 추출", "Tell us more:": "더 알려주세요:", "Temperature": "온도", "Temporary Chat": "임시 채팅", "Temporary Chat by Default": "임시 채팅을 기본값으로", - "Terminal": "", - "Terminal servers saved": "", + "Terminal": "터미널", + "Terminal servers saved": "터미널 서버 저장됨", "Text Splitter": "텍스트 나누기", "Text-to-Speech": "텍스트-음성 변환", "Text-to-Speech Engine": "텍스트-음성 변환 엔진", - "Th_day_of_week": "", + "Th_day_of_week": "Th_day_of_week", "Thanks for your feedback!": "피드백 감사합니다!", "The Application Account DN you bind with for search": "검색을 위해 바인딩하는 애플리케이션 계정 DN", "The base to search for users": "사용자를 검색할 수 있는 기반", @@ -1994,20 +1964,20 @@ "The output format for the text. Can be 'json', 'markdown', or 'html'. Defaults to 'markdown'.": "텍스트의 출력 형식입니다. 'json', 'markdown', 또는 'html'이 될 수 있습니다. 기본값은 'markdown'입니다.", "The passwords you entered don't quite match. Please double-check and try again.": "입력한 비밀번호가 일치하지 않습니다. 확인 후 다시 시도해 주세요.", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "점수는 0.0(0%)에서 1.0(100%) 사이의 값이어야 합니다.", - "The stream delta chunk size for the model. Increasing the chunk size will make the model respond with larger pieces of text at once.": "", + "The stream delta chunk size for the model. Increasing the chunk size will make the model respond with larger pieces of text at once.": "모델의 스트림 델타 청크 크기입니다. 청크 크기를 늘리면 모델이 한 번에 더 큰 텍스트 조각으로 응답하게 됩니다.", "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "모델의 온도. 온도를 높이면 모델이 더 창의적으로 답변할 수 있습니다.", "The Weight of BM25 Hybrid Search. 0 more semantic, 1 more lexical. Default 0.5": "BM25 하이브리드 검색의 가중치. 0에 가까울수록 의미(semantic) 기반, 1에 가까울수록 어휘(lexical) 기반. 기본값 0.5", "The width in pixels to compress images to. Leave empty for no compression.": "이미지를 압축할 픽셀 너비입니다. 압축하지 않으려면 비워 두세요.", "Theme": "테마", - "There was an error syncing your stats. Please try again.": "", + "There was an error syncing your stats. Please try again.": "통계 동기화 중 오류가 발생했습니다. 다시 시도해 주세요.", "Thinking...": "생각 중...", "This action cannot be undone. Do you wish to continue?": "이 행동은 되돌릴 수 없습니다. 계속 하시겠습니까?", "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "{{createdAt}}에 {{channelName}} 채널이 처음 만들어졌습니다. 대화를 시작해보세요.", "This chat won't appear in history and your messages will not be saved.": "이 채팅은 기록에 나타나지 않으며 메시지가 저장되지 않습니다.", "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "이렇게 하면 소중한 대화 내용이 백엔드 데이터베이스에 안전하게 저장됩니다. 감사합니다!", - "This feature is currently experimental and may not work as expected.": "", + "This feature is currently experimental and may not work as expected.": "이 기능은 현재 실험 중이며 예상대로 작동하지 않을 수 있습니다.", "This feature is experimental and may be modified or discontinued without notice.": "이 기능은 실험 중이며, 사전 통보 없이 수정되거나 중단될 수 있습니다.", - "This folder is empty": "", + "This folder is empty": "이 폴더는 비어 있습니다.", "This is a default user permission and will remain enabled.": "이것은 기본 사용자 권한이며 계속 활성화됩니다.", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "이것은 실험적 기능으로, 예상대로 작동하지 않을 수 있으며 언제든지 변경될 수 있습니다.", "This model is not publicly available. Please select another model.": "이 모델은 공개적으로 사용할 수 없습니다. 다른 모델을 선택해주세요.", @@ -2021,50 +1991,48 @@ "This will delete {{NAME}} and all its contents.": "{{NAME}}모든 내용을 삭제합니다.", "This will delete all models including custom models": "이렇게 하면 사용자 지정 모델을 포함한 모든 모델이 삭제됩니다", "This will delete all models including custom models and cannot be undone.": "이렇게 하면 사용자 지정 모델을 포함한 모든 모델이 삭제되며 실행 취소할 수 없습니다.", - "This will permanently delete the calendar \"{{name}}\" and all its events. This action cannot be undone.": "", "This will reset the knowledge base and sync all files. Do you wish to continue?": "지식 기반과 모든 파일 연동을 초기화합니다. 계속 하시겠습니까?", "Thorough explanation": "완전한 설명", - "Thought": "", + "Thought": "생각", "Thought for {{DURATION}}": "{{DURATION}} 동안 생각함", "Thought for {{DURATION}} seconds": "{{DURATION}}초 동안 생각함", "Thought for less than a second": "1초 미만 동안 생각함", "Thread": "스레드", - "Thumbs up/down ratings from users on model responses": "", - "Tika": "", + "Thumbs up/down ratings from users on model responses": "모델 응답에 대한 사용자들의 좋아요/싫어요 평가", + "Tika": "Tika", "Tika Server URL required.": "Tika 서버 URL이 필요합니다.", "Tiktoken": "틱토큰 (Tiktoken)", - "Time": "", - "Time & Calculation": "", - "Timeout": "", + "Time": "시간", + "Time & Calculation":"시간 및 계산", + "Timeout": "시간 초과", "Title": "제목", "Title Auto-Generation": "제목 자동 생성", "Title cannot be an empty string.": "제목은 빈 문자열일 수 없습니다.", "Title Generation": "제목 생성", "Title Generation Prompt": "제목 생성 프롬프트", - "Title is required": "", "TLS": "TLS", "To access the available model names for downloading,": "다운로드 가능한 모델명을 확인하려면,", "To access the GGUF models available for downloading,": "다운로드 가능한 GGUF 모델을 확인하려면,", "To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "WebUI에 접속하려면 관리자에게 문의하십시오. 관리자는 관리자 패널에서 사용자 상태를 관리할 수 있습니다.", "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "지식 기반을 여기에 첨부하려면. \"지식 기반\" 워크스페이스에 먼저 추가하세요", "To learn more about available endpoints, visit our documentation.": "사용 가능한 엔드포인트에 대해 자세히 알아보려면 문서를 방문하세요.", - "To select skills here, add them to the \"Skills\" workspace first.": "", + "To select skills here, add them to the \"Skills\" workspace first.": "여기서 스킬을 선택하려면, \"스킬\" 워크스페이스에 먼저 추가하세요.", "To select toolkits here, add them to the \"Tools\" workspace first.": "여기서 도구를 선택하려면, \"도구\" 워크스페이스에 먼저 추가하세요.", "Toast notifications for new updates": "새 업데이트 알림", "Today": "오늘", - "Today at": "", + "Today at": "오늘은", "Today at {{LOCALIZED_TIME}}": "오늘 {{LOCALIZED_TIME}}", - "Toggle {{COUNT}} sources": "", - "Toggle 1 source": "", - "Toggle details": "", - "Toggle Dictation": "", - "Toggle Sidebar": "", - "Toggle status history": "", + "Toggle {{COUNT}} sources": "{{COUNT}} 소스 토글", + "Toggle 1 source": "1 소스 토글", + "Toggle details": "세부 정보 토글", + "Toggle Dictation": "음성 입력 토글", + "Toggle Sidebar": "사이드바 토글", + "Toggle status history": "상태 기록 토글", "Toggle whether current connection is active.": "현재 연결 활성화 여부 설정", "Token": "토큰", - "Token counts are estimates and may not reflect actual API usage": "", - "tokens": "", - "Tokens": "", + "Token counts are estimates and may not reflect actual API usage": "토큰 수는 추정치이며 실제 API 사용량을 반영하지 않을 수 있습니다.", + "tokens": "토큰", + "Tokens": "토큰", "Too verbose": "너무 장황합니다", "Tool created successfully": "성공적으로 도구가 생성되었습니다.", "Tool deleted successfully": "성공적으로 도구가 삭제되었습니다.", @@ -2081,7 +2049,7 @@ "Tools have a function calling system that allows arbitrary code execution.": "도구에 임의 코드 실행을 허용하는 함수가 포함되어 있습니다.", "Tools Public Sharing": "도구 공개 및 공유", "Tools Sharing": "도구 공유", - "Top": "", + "Top": "상위", "Top K": "Top K", "Top K Reranker": "Top K 리랭커", "Transformers": "트랜스포머", @@ -2092,13 +2060,13 @@ "TTS Model": "TTS 모델", "TTS Settings": "TTS 설정", "TTS Voice": "TTS 음성", - "Tu_day_of_week": "", + "Tu_day_of_week": "Tu_day_of_week", "Type": "입력", - "Type here...": "", + "Type here...": "여기에 입력하세요...", "Type Hugging Face Resolve (Download) URL": "Hugging Face Resolve (다운로드) URL 입력", "Uh-oh! There was an issue with the response.": "이런! 응답에 문제가 발생했습니다.", "UI": "UI", - "UI Scale": "", + "UI Scale": "UI 크기", "Unarchive All": "모두 보관 해제", "Unarchive All Archived Chats": "보관된 모든 채팅을 보관 해제", "Unarchive Chat": "채팅 보관 해제", @@ -2108,9 +2076,8 @@ "Unloads {{FROM_NOW}}": "{{FROM_NOW}} 언로드", "Unlock mysteries": "미스터리 풀기", "Unpin": "고정 해제", - "Unpin from Sidebar": "", "Unravel secrets": "비밀 풀기", - "Unshare Chat": "", + "Unshare Chat": "채팅 공유 해제", "Unsupported file type.": "지원하지 않는 파일 형식", "Untagged": "태그 해제", "Untitled": "제목 없음", @@ -2131,32 +2098,32 @@ "Upload Files": "파일 업로드", "Upload Model": "모델 업로드", "Upload Pipeline": "업로드 파이프라인", - "Upload profile image": "", + "Upload profile image": "프로필 이미지 업로드", "Upload Progress": "업로드 진행 상황", - "Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "", - "Uploaded files or images": "", + "Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "업로드 진행 상황: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)", + "Uploaded files or images": "업로드된 파일 또는 이미지", "Uploading file...": "파일 업로드중...", - "Uploading...": "", + "Uploading...": "업로드 중...", "URL": "URL", "URL is required": "URL이 필요합니다.", "URL Mode": "URL 모드", "Usage": "사용량", - "Use": "", + "Use": "사용", "Use '#' in the prompt input to load and include your knowledge.": "프롬프트 입력에서 '#'를 사용하여 지식 기반을 불러오고 포함하세요.", "Use /v1/chat/completions endpoint instead of /v1/audio/transcriptions for potentially better accuracy.": "더 정확한 결과를 얻으려면 /v1/audio/transcriptions 대신 /v1/chat/completions 엔드포인트를 사용해 보세요.", "Use Chat Completions API": "Chat Completions API 사용", - "Use groups to organize your users and assign permissions.": "", + "Use groups to organize your users and assign permissions.": "그룹을 사용하여 사용자를 조직하고 권한을 할당하세요.", "Use LLM": "LLM 사용", "Use no proxy to fetch page contents.": "페이지 콘텐츠를 가져오려면 프록시를 사용하지 마세요.", "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "http_proxy 및 https_proxy 환경 변수로 지정된 프록시를 사용하여 페이지 콘텐츠를 가져옵니다.", "user": "사용자", "User": "사용자", - "User Activity": "", + "User Activity": "사용자 활동", "User Groups": "사용자 그룹", "User location successfully retrieved.": "성공적으로 사용자의 위치를 불러왔습니다", "User menu": "사용자 메뉴", - "User ratings (thumbs up/down)": "", - "User Status": "", + "User ratings (thumbs up/down)": "사용자 평가 (좋아요/싫어요)", + "User Status": "사용자 상태", "User Webhooks": "사용자 웹훅", "Username": "사용자 이름", "users": "사용자", @@ -2176,27 +2143,27 @@ "Verify SSL Certificate": "SSL 인증서 확인", "Version": "버전", "Version {{selectedVersion}} of {{totalVersions}}": "버전 {{totalVersions}}의 {{selectedVersion}}", - "Version deleted": "", + "Version deleted": "버전이 삭제되었습니다", "View Replies": "답글 보기", "View Result from **{{NAME}}**": "**{{NAME}}**의 결과 보기", - "View source: {{name}}": "", - "View source: {{title}}": "", + "View source: {{name}}": "소스 보기: {{name}}", + "View source: {{title}}": "소스 보기: {{title}}", "Visibility": "공개 범위", - "Visible": "", - "Visible to all users": "", + "Visible": "공개", + "Visible to all users": "모든 사용자에게 공개", "Vision": "비전", "Voice": "음성", "Voice Input": "음성 입력", "Voice mode": "음성 모드 사용", "Voice Mode Custom Prompt": "음성 모드 사용자 지정 프롬프트", - "Voice Mode Prompt": "", - "Waiting for upload...": "", + "Voice Mode Prompt": "음성 모드 프롬프트", + "Waiting for upload...": "업로드 기다리는 중...", "Warning": "경고", "Warning:": "주의:", - "Warning: Enabling this will allow users to run scheduled prompts automatically.": "", + "Warning: Enabling this will allow users to run scheduled prompts automatically.": "주의: 이 기능을 활성화하면 사용자가 예약된 프롬프트를 자동으로 실행할 수 있습니다.", "Warning: Enabling this will allow users to upload arbitrary code on the server.": "주의: 이 기능을 활성화하면 사용자가 서버에 임의 코드를 업로드할 수 있습니다.", "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "경고: Jupyter 실행은 임의의 코드 실행을 가능하게 하여 심각한 보안 위험을 초래합니다. — 매우 신중하게 진행하세요.", - "We_day_of_week": "", + "We_day_of_week": "We_day_of_week", "Web": "웹", "Web API": "웹 API", "Web Loader Engine": "웹 로더 엔진", @@ -2204,50 +2171,48 @@ "Web Search Engine": "웹 검색 엔진", "Web Search in Chat": "채팅에서 웹 검색", "Web Search Query Generation": "웹 검색 쿼리 생성", - "Webhook Name": "", + "Webhook Name": "웹훅 이름", "Webhook URL": "웹훅 URL", - "Webhooks": "", - "Webpage URLs": "", + "Webhooks": "웹훅", + "Webpage URLs": "웹페이지 URL", "WebUI Settings": "WebUI 설정", - "WebUI URL": "", + "WebUI URL": "WebUI URL", "WebUI will make requests to \"{{url}}\"": "WebUI가 \"{{url}}\"로 요청을 보냅니다", "WebUI will make requests to \"{{url}}/api/chat\"": "WebUI가 \"{{url}}/api/chat\"로 요청을 보냅니다", "WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI가 \"{{url}}/chat/completions\"로 요청을 보냅니다", - "Week": "", - "Weekly": "", + "Weekly": "주간", "What are you trying to achieve?": "무엇을 성취하고 싶으신가요?", "What are you working on?": "어떤 작업을 하고 계신가요?", - "What is NOT shared:": "", - "What is shared:": "", + "What is NOT shared:": "공유되지 않는 것:", + "What is shared:": "공유되는 것:", "What's New in": "새로운 기능:", "What's on your mind?": "무슨 생각을 하고 계신가요?", - "When": "", "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "활성화하면 모델이 각 채팅 메시지에 실시간으로 응답하여 사용자가 메시지를 보내는 즉시 응답을 생성합니다. 이 모드는 실시간 채팅 애플리케이션에 유용하지만, 느린 하드웨어에서는 성능에 영향을 미칠 수 있습니다.", "wherever you are": "당신이 어디에 있든", "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "출력을 페이지로 나눌지 여부입니다. 각 페이지는 구분선과 페이지 번호로 구분됩니다. 기본값은 False입니다.", "Whisper (Local)": "Whisper (로컬)", - "Who can share to this group": "", + "Who can share to this group": "누가 이 그룹에 공유할 수 있나요", "Why?": "이유는?", "Widescreen Mode": "와이드스크린 모드", - "Width": "", - "Wikipedia": "", + "Width": "너비", + "Wikipedia": "위키피디아", "Won": "승리", - "Working Directory": "", + "Working Directory": "작업 디렉토리", "Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "top-k와 함께 작동합니다. 값이 높을수록(예: 0.95) 더 다양한 텍스트가 생성되고, 값이 낮을수록(예: 0.5) 더 집중적이고 보수적인 텍스트가 생성됩니다.", "Workspace": "워크스페이스", "Workspace Permissions": "워크스페이스 권한", "Write": "작성", - "Write a summary in 50 words that summarizes {{topic}}.": "[주제 또는 키워드]에 대한 50단어 요약문을 작성하시오.", + "Write a summary in 50 words that summarizes {{topic}}.": "{{topic}}에 대한 50단어 요약문을 작성하시오.", "Write something...": "내용을 입력하세요…", "Write your model system prompt content here\ne.g.) You are Mario from Super Mario Bros, acting as an assistant.": "여기에 모델 시스템 프롬프트 내용을 작성하세요\n예: 당신은 Super Mario Bros의 마리오로서, 어시스턴트 역할을 합니다.", "Yacy Instance URL": "Yacy 인스턴스 URL", "Yacy Password": "Yacy 비밀번호", "Yacy Username": "Yacy 사용자 이름", - "Yahoo": "", - "Yandex": "", - "Yandex Web Search API Key": "", - "Yandex Web Search config": "", - "Yandex Web Search URL": "", + "Yahoo": "야후", + "Yandex": "얀덱스", + "Yandex Web Search API Key": "얀덱스 웹 검색 API 키", + "Yandex Web Search config": "얀덱스 웹 검색 구성", + "Yandex Web Search URL": "얀덱스 웹 검색 URL", "Yesterday": "어제", "Yesterday at {{LOCALIZED_TIME}}": "어제 {{LOCALIZED_TIME}}", "You": "당신", @@ -2255,29 +2220,29 @@ "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "최대 {{maxCount}}개의 파일과만 동시에 대화할 수 있습니다 ", "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "아래 '관리' 버튼으로 메모리를 추가하여 LLM들과의 상호작용을 개인화할 수 있습니다. 이를 통해 더 유용하고 맞춤화된 경험을 제공합니다.", "You cannot upload an empty file.": "빈 파일을 업로드 할 수 없습니다", - "You do not have permission to edit this model": "", - "You do not have permission to edit this prompt.": "", - "You do not have permission to edit this skill.": "", - "You do not have permission to edit this tool": "", - "You do not have permission to make this public": "", - "You do not have permission to send messages in this channel.": "", - "You do not have permission to send messages in this thread.": "", - "You do not have permission to upload files to this knowledge base.": "", + "You do not have permission to edit this model": "이 모델을 편집할 권한이 없습니다", + "You do not have permission to edit this prompt.": "이 프롬프트를 편집할 권한이 없습니다", + "You do not have permission to edit this skill.": "이 기술을 편집할 권한이 없습니다", + "You do not have permission to edit this tool": "이 도구를 편집할 권한이 없습니다", + "You do not have permission to make this public": "이 것을 공개할 권한이 없습니다", + "You do not have permission to send messages in this channel.": "이 채널에 메시지를 보내할 권한이 없습니다", + "You do not have permission to send messages in this thread.": "이 스레드에 메시지를 보내할 권한이 없습니다", + "You do not have permission to upload files to this knowledge base.": "이 지식 베이스에 파일을 업로드할 권한이 없습니다", "You do not have permission to upload files.": "파일을 업로드할 권한이 없습니다.", - "You do not have permission to upload web content.": "", + "You do not have permission to upload web content.": "웹 콘텐츠를 업로드할 권한이 없습니다", "You have no archived conversations.": "채팅을 보관한 적이 없습니다.", - "You have no shared conversations.": "", + "You have no shared conversations.": "공유된 대화가 없습니다.", "You have shared this chat": "이 채팅을 공유했습니다.", - "You.com API Key": "", + "You.com API Key": "You.com API 키", "You're a helpful assistant.": "당신은 유용한 어시스턴트입니다.", "You're now logged in.": "로그인되었습니다.", "Your Account": "계정", "Your account status is currently pending activation.": "현재 계정은 아직 활성화되지 않았습니다.", - "Your browser does not support the audio tag.": "", - "Your browser does not support the video tag.": "", + "Your browser does not support the audio tag.": "당신의 브라우저는 오디오 태그를 지원하지 않습니다.", + "Your browser does not support the video tag.": "당신의 브라우저는 비디오 태그를 지원하지 않습니다.", "Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "당신의 모든 기여는 곧바로 플러그인 개발자에게 갑니다; Open WebUI는 수수료를 받지 않습니다. 다만, 선택한 후원 플랫폼은 수수료를 가져갈 수 있습니다.", - "Your message text or inputs": "", - "Your usage stats have been successfully synced.": "", + "Your message text or inputs": "당신의 메시지 텍스트 또는 입력값", + "Your usage stats have been successfully synced.": "당신의 사용 통계가 성공적으로 동기화되었습니다.", "YouTube": "유튜브", "Youtube Language": "Youtube 언어", "Youtube Proxy URL": "Youtube 프록시 URL" From 9b577868c81a690c700a913206ae5d1ffcfd55e8 Mon Sep 17 00:00:00 2001 From: joaoback <156559121+joaoback@users.noreply.github.com> Date: Fri, 24 Apr 2026 02:38:33 -0300 Subject: [PATCH 06/51] i18n: add pt-BR translations for newly added UI items and consistency pass (#23954) New **pt-BR** translations for items introduced in the latest releases, plus a consistency/quality pass across existing strings (grammar, tone, capitalization, pluralization). Placeholders and hotkeys preserved. No logic changes. --- src/lib/i18n/locales/pt-BR/translation.json | 72 ++++++++++----------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index bde1024811..ca721304fe 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -34,13 +34,13 @@ "{{user}}'s Chats": "Chats de {{user}}", "{{webUIName}} Backend Required": "Backend {{webUIName}} necessário", "*Prompt node ID(s) are required for image generation": "*Prompt node ID(s) são obrigatórios para gerar imagens", - "1 hour before": "", + "1 hour before": "1 hora antes", "1 Source": "1 Origem", - "10 minutes before": "", - "15 minutes before": "", + "10 minutes before": "10 minutos antes", + "15 minutes before": "15 minutos antes", "1m_time_ago": "1m atrás", - "30 minutes before": "", - "5 minutes before": "", + "30 minutes before": "30 minutos antes", + "5 minutes before": "5 minutos antes", "A collaboration channel where people join as members": "Um canal de colaboração onde as pessoas se juntam como membros.", "A discussion channel where access is controlled by groups and permissions": "Um canal de discussão onde o acesso é controlado por grupos e permissões.", "A new version (v{{LATEST_VERSION}}) is now available.": "Uma nova versão (v{{LATEST_VERSION}}) está disponível.", @@ -79,11 +79,11 @@ "Add content here": "Adicionar conteúdo aqui", "Add Custom Parameter": "Adicionar parâmetro personalizado", "Add Custom Prompt": "Adicionar prompt personalizado", - "Add description": "", + "Add description": "Adicionar descrição", "Add Details": "Adicionar detalhes", "Add Files": "Adicionar Arquivos", "Add Image": "Adicionar imagem", - "Add location": "", + "Add location": "Adicionar localização", "Add Member": "Adicionar membro", "Add Members": "Adicionar membros", "Add Memory": "Adicionar Memória", @@ -119,7 +119,7 @@ "AI": "IA", "All": "Tudo", "All chats have been unarchived.": "Todos os chats foram desarquivados.", - "All day": "", + "All day": "O dia todo", "All models are now hidden": "Todos os modelos estão agora ocultos", "All models are now visible": "Todos os modelos estão agora visíveis", "All models deleted successfully": "Todos os modelos foram excluídos com sucesso", @@ -208,7 +208,7 @@ "Ask a question": "Faça uma pergunta", "Assistant": "Assistente", "Async Embedding Processing": "Processamento de Embedding assíncrono", - "At time of event": "", + "At time of event": "No horário do evento", "Attach File From Knowledge": "Anexar arquivo da base de conhecimento", "Attach Files": "Anexar arquivos", "Attach Knowledge": "Anexar Base de Conhecimento", @@ -283,8 +283,8 @@ "Bypass Web Loader": "Ignorar carregador da Web", "Cache Base Model List": "Lista de modelos base de cache", "Calendar": "Calendário", - "Calendar deleted": "", - "Calendars": "", + "Calendar deleted": "Calendário excluído", + "Calendars": "Calendários", "Call": "Chamada", "Call feature is not supported when using Web STT engine": "O recurso de chamada não é suportado ao usar o mecanismo Web STT", "Camera": "Câmera", @@ -421,7 +421,7 @@ "Connect to your own OpenAPI compatible external tool servers.": "Conecte-se aos seus próprios servidores de ferramentas externas compatíveis com OpenAPI.", "Connected ({{type}})": "Conectado ({{type}})", "Connection failed": "Falha na conexão", - "Connection lost. Reconnecting...": "", + "Connection lost. Reconnecting...": "Conexão perdida. Reconectando...", "Connection successful": "Conexão bem-sucedida", "Connection Type": "Tipo de conexão", "Connections": "Conexões", @@ -534,11 +534,11 @@ "Delete All Chats": "Excluir Todos os Chats", "Delete all contents inside this folder": "Apague todo o conteúdo desta pasta.", "Delete automation?": "Excluir automação?", - "Delete calendar": "", - "Delete Calendar": "", + "Delete calendar": "Excluir calendário", + "Delete Calendar": "Excluir Calendário", "Delete Chat": "Excluir Chat", "Delete chat?": "Excluir chat?", - "Delete Event": "", + "Delete Event": "Excluir Evento", "Delete File": "Excluir arquivo", "Delete folder?": "Excluir pasta?", "Delete function?": "Excluir função?", @@ -845,10 +845,10 @@ "Error: A model with the ID '{{modelId}}' already exists. Please select a different ID to proceed.": "Erro: Já existe um modelo com o ID '{{modelId}}'. Selecione um ID diferente para prosseguir.", "Error: Model ID cannot be empty. Please enter a valid ID to proceed.": "Erro: O ID do modelo não pode estar vazio. Insira um ID válido para prosseguir.", "Evaluations": "Avaliações", - "Event created": "", - "Event deleted": "", - "Event title": "", - "Event updated": "", + "Event created": "Evento criado", + "Event deleted": "Evento excluído", + "Event title": "Título do evento", + "Event updated": "Evento atualizado", "Exa API Key": "Chave da API Exa", "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Exemplo: (&(objectClass=inetOrgPerson)(uid=%s))", "Example: ALL": "Exemplo: ALL", @@ -897,7 +897,7 @@ "Failed to connect to {{URL}} terminal server": "Falha ao conectar ao servidor de terminal {{URL}}", "Failed to copy link": "Falha ao copiar o link", "Failed to create API Key.": "Falha ao criar a Chave API.", - "Failed to delete calendar": "", + "Failed to delete calendar": "Falha ao excluir calendário", "Failed to delete note": "Falha ao excluir a nota", "Failed to download image": "Falha ao baixar a imagem", "Failed to extract content from the file: {{error}}": "Falha ao extrair conteúdo do arquivo: {{error}}", @@ -1219,7 +1219,7 @@ "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "Limitar consultas de pesquisa simultâneas. 0 = ilimitado (padrão). Defina como 1 para execução sequencial (recomendado para APIs com limites de taxa rígidos, como o nível gratuito do Brave).", "Limits the number of concurrent embedding requests. Set to 0 for unlimited.": "Limita o número de solicitações simultâneas de embedding. Defina como 0 para ilimitado.", "List": "Lista", - "List calendars, search, create, update, and delete calendar events": "", + "List calendars, search, create, update, and delete calendar events": "Listar calendários, pesquisar, criar, atualizar e excluir eventos do calendário", "Listening...": "Escutando...", "Live": "Ao vivo", "Llama.cpp": "Llama.cpp", @@ -1230,7 +1230,7 @@ "local": "local", "Local": "Local", "Local Task Model": "Modelo de Tarefa Local", - "Location": "", + "Location": "Localização", "Location access not allowed": "Acesso ao local não permitido", "Lost": "Perdeu", "Low": "Baixo", @@ -1340,7 +1340,7 @@ "Models Sharing": "Compartilhamento de Modelos", "Mojeek": "Mojeek", "Mojeek Search API Key": "Chave de API Mojeek Search", - "Month": "", + "Month": "Mês", "Monthly": "Mensal", "More": "Mais", "More Concise": "Mais conciso", @@ -1359,7 +1359,7 @@ "New Automation": "Nova Automação", "New Button": "Novo Botão", "New Chat": "Novo Chat", - "New Event": "", + "New Event": "Novo Evento", "New File": "Novo Arquivo", "New Folder": "Nova Pasta", "New Function": "Nova Função", @@ -1637,7 +1637,7 @@ "Reasoning Effort": "Esforço de raciocínio", "Reasoning Tags": "Tags de raciocínio", "Recently Used": "Usado recentemente", - "Reconnected": "", + "Reconnected": "Reconectado", "Record": "Gravar", "Record voice": "Gravar voz", "Redirecting you to Open WebUI Community": "Redirecionando você para a Comunidade OpenWebUI", @@ -1661,7 +1661,7 @@ "Relevance": "Relevância", "Relevance Threshold": "Limiar de Relevância", "Remember Dismissal": "Lembrar da dispensa", - "Reminder": "", + "Reminder": "Lembrete", "Remove": "Remover", "Remove {{MODELID}} from list.": "Remover {{MODELID}} da lista.", "Remove action": "Remover ação", @@ -1909,12 +1909,12 @@ "Start a new conversation": "Iniciar uma nova conversa", "Start of the channel": "Início do canal", "Start Tag": "Tag inicial", - "Starting in {{count}} minutes_one": "", - "Starting in {{count}} minutes_many": "", - "Starting in {{count}} minutes_other": "", - "Starting in 1 minute": "", + "Starting in {{count}} minutes_one": "Começando em {{count}} minuto", + "Starting in {{count}} minutes_many": "Começando em {{count}} minutos", + "Starting in {{count}} minutes_other": "Começando em {{count}} minutos", + "Starting in 1 minute": "Começando em 1 minuto", "Starting kernel...": "Iniciando kernel...", - "Starting now": "", + "Starting now": "Começando agora", "State": "Estado", "Status": "Status", "Status cleared successfully": "Status liberado com sucesso", @@ -2027,7 +2027,7 @@ "This will delete {{NAME}} and all its contents.": "Esta ação excluirá {{NAME}} e todos seus conteúdos.", "This will delete all models including custom models": "Isto vai excluir todos os modelos, incluindo personalizados", "This will delete all models including custom models and cannot be undone.": "Isto vai excluir todos os modelos, incluindo personalizados e não pode ser desfeito.", - "This will permanently delete the calendar \"{{name}}\" and all its events. This action cannot be undone.": "", + "This will permanently delete the calendar \"{{name}}\" and all its events. This action cannot be undone.": "Esta ação excluirá permanentemente o calendário \"{{name}}\" e todos os seus eventos. Esta ação não pode ser desfeita.", "This will reset the knowledge base and sync all files. Do you wish to continue?": "Esta ação resetará a base de conhecimento e sincronizará todos os arquivos. Deseja continuar?", "Thorough explanation": "Explicação detalhada", "Thought": "Pensamento", @@ -2047,7 +2047,7 @@ "Title cannot be an empty string.": "O Título não pode ser uma string vazia.", "Title Generation": "Geração de Títulos", "Title Generation Prompt": "Prompt de Geração de Título", - "Title is required": "", + "Title is required": "O título é obrigatório", "TLS": "TLS", "To access the available model names for downloading,": "Para acessar os nomes de modelos disponíveis para download,", "To access the GGUF models available for downloading,": "Para acessar os modelos GGUF disponíveis para download,", @@ -2114,7 +2114,7 @@ "Unloads {{FROM_NOW}}": "Descarrega {{FROM_NOW}}", "Unlock mysteries": "Desvendar mistérios", "Unpin": "Desfixar", - "Unpin from Sidebar": "", + "Unpin from Sidebar": "Desfixar da barra lateral", "Unravel secrets": "Desvendar segredos", "Unshare Chat": "Cancelar compartilhamento do chat", "Unsupported file type.": "Tipo de arquivo não suportado.", @@ -2219,7 +2219,7 @@ "WebUI will make requests to \"{{url}}\"": "A WebUI fará requisições para \"{{url}}\"", "WebUI will make requests to \"{{url}}/api/chat\"": "A WebUI fará requisições para \"{{url}}/api/chat\".", "WebUI will make requests to \"{{url}}/chat/completions\"": "A WebUI fará requisições para \"{{url}}/chat/completions\".", - "Week": "", + "Week": "Semana", "Weekly": "Semanal", "What are you trying to achieve?": "O que está tentando alcançar?", "What are you working on?": "No que está trabalhando?", @@ -2227,7 +2227,7 @@ "What is shared:": "O que é compartilhado", "What's New in": "O que há de novo em", "What's on your mind?": "O que você tem em mente?", - "When": "", + "When": "Quando", "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Quando habilitado, o modelo responderá a cada mensagem de chat em tempo real, gerando uma resposta assim que o usuário enviar uma mensagem. Este modo é útil para aplicativos de chat ao vivo, mas pode impactar o desempenho em hardware mais lento.", "wherever you are": "onde quer que você esteja.", "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "Se a saída deve ser paginada. Cada página será separada por uma régua horizontal e um número de página. O padrão é Falso.", From f6bd08c852f65683d6357a935993f6ce5d3e4c37 Mon Sep 17 00:00:00 2001 From: tcx4c70 Date: Fri, 24 Apr 2026 13:39:45 +0800 Subject: [PATCH 07/51] fix(utils): Switch throttle decorator to async (#23979) After migration to async db operations, the throttle decorator also needs to support async. Since the decorator is only used for async funcs now, we can just switch it to async instead of supporting sync and async at the same time. Signed-off-by: Adam Tao --- backend/open_webui/utils/misc.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/utils/misc.py b/backend/open_webui/utils/misc.py index 670a94b512..5af84dd5cd 100644 --- a/backend/open_webui/utils/misc.py +++ b/backend/open_webui/utils/misc.py @@ -843,9 +843,9 @@ def throttle(interval: float = 10.0): last_calls = {} lock = threading.Lock() - def wrapper(*args, **kwargs): + async def wrapper(*args, **kwargs): if interval is None: - return func(*args, **kwargs) + return await func(*args, **kwargs) key = (args, freeze(kwargs)) now = time.time() @@ -855,7 +855,7 @@ def throttle(interval: float = 10.0): if now - last_calls.get(key, 0) < interval: return None last_calls[key] = now - return func(*args, **kwargs) + return await func(*args, **kwargs) return wrapper From 89669f3fa1a75ca2b38afe4dd345ae97132af302 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 14:40:17 +0900 Subject: [PATCH 08/51] refac --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index e405188cb4..3d458de753 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ dependencies = [ "aiocache==0.12.3", "aiofiles==25.1.0", "starlette-compress==1.7.0", - "Brotli==1.1.0", + "Brotli==1.2.0", "httpx[socks,http2,zstd,cli,brotli]==0.28.1", "starsessions[redis]==2.2.1", "python-mimeparse==2.0.0", From 4dc5c1eb4f885e0ace1d676d87ae34d9c82e1266 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 15:00:47 +0900 Subject: [PATCH 09/51] refac --- backend/open_webui/utils/telemetry/metrics.py | 107 +++++++++++++----- backend/open_webui/utils/telemetry/setup.py | 2 +- 2 files changed, 81 insertions(+), 28 deletions(-) diff --git a/backend/open_webui/utils/telemetry/metrics.py b/backend/open_webui/utils/telemetry/metrics.py index 26216b6ca4..a1d1dcb7cb 100644 --- a/backend/open_webui/utils/telemetry/metrics.py +++ b/backend/open_webui/utils/telemetry/metrics.py @@ -17,8 +17,10 @@ high-cardinality label sets. from __future__ import annotations +import datetime +import logging import time -from typing import Dict, List, Sequence, Any +from typing import Dict, Iterable, List, Optional from base64 import b64encode from fastapi import FastAPI, Request @@ -36,6 +38,8 @@ from opentelemetry.sdk.metrics.export import ( PeriodicExportingMetricReader, ) from opentelemetry.sdk.resources import Resource +from sqlalchemy import Engine, func, select +from sqlalchemy.orm import Session from open_webui.env import ( OTEL_SERVICE_NAME, @@ -46,7 +50,47 @@ from open_webui.env import ( OTEL_METRICS_EXPORTER_OTLP_INSECURE, OTEL_METRICS_EXPORT_INTERVAL_MILLIS, ) -from open_webui.models.users import Users +from open_webui.models.users import User + +logger = logging.getLogger(__name__) + + +# --------------------------------------------------------------------------- +# Sync DB helpers for OTel gauge callbacks +# +# The OTel Python SDK calls observable-instrument callbacks *synchronously* +# from a background collection thread — async callbacks are NOT supported +# (the SDK does not ``await`` the return value). +# +# Rather than bridging into the async event loop, we run plain synchronous +# SQL queries using the sync engine that is already available at setup time. +# This avoids any cross-thread / cross-loop concerns entirely. +# --------------------------------------------------------------------------- + + +def _count_total_users(db_engine: Engine) -> Optional[int]: + """Return the total number of registered users (sync).""" + with Session(db_engine) as session: + return session.execute(select(func.count()).select_from(User)).scalar() + + +def _count_active_users(db_engine: Engine) -> Optional[int]: + """Return the number of users active within the last 3 minutes (sync).""" + three_minutes_ago = int(time.time()) - 180 + with Session(db_engine) as session: + return session.execute( + select(func.count()).select_from(User).filter(User.last_active_at >= three_minutes_ago) + ).scalar() + + +def _count_users_active_today(db_engine: Engine) -> Optional[int]: + """Return the number of users active since midnight today (sync).""" + now = int(datetime.datetime.now().timestamp()) + today_midnight = now - (now % 86400) + with Session(db_engine) as session: + return session.execute( + select(func.count()).select_from(User).filter(User.last_active_at > today_midnight) + ).scalar() def _build_meter_provider(resource: Resource) -> MeterProvider: @@ -106,7 +150,7 @@ def _build_meter_provider(resource: Resource) -> MeterProvider: return provider -def setup_metrics(app: FastAPI, resource: Resource) -> None: +def setup_metrics(app: FastAPI, resource: Resource, db_engine: Engine) -> None: """Attach OTel metrics middleware to *app* and initialise provider.""" metrics.set_meter_provider(_build_meter_provider(resource)) @@ -124,32 +168,46 @@ def setup_metrics(app: FastAPI, resource: Resource) -> None: unit='ms', ) - async def observe_active_users( - options: metrics.CallbackOptions, - ) -> Sequence[metrics.Observation]: - return [ - metrics.Observation( - value=await Users.get_active_user_count(), - ) - ] + # -- Observable gauge callbacks ---------------------------------------- + # These are called synchronously by the OTel SDK from a background + # collection thread. They use the sync DB engine directly — no async + # bridging required. - async def observe_total_registered_users( + def observe_total_users( options: metrics.CallbackOptions, - ) -> Sequence[metrics.Observation]: - # IMPORTANT: Use get_num_users() for efficient COUNT(*) query. - # Do NOT use len(get_users()["users"]) - it loads ALL user records into memory, - # causing connection pool exhaustion on high-latency databases (e.g., Aurora). - return [ - metrics.Observation( - value=await Users.get_num_users() or 0, - ) - ] + ) -> Iterable[metrics.Observation]: + try: + value = _count_total_users(db_engine) + if value is not None: + yield metrics.Observation(value=value) + except Exception: + logger.debug('Failed to observe total users', exc_info=True) + + def observe_active_users( + options: metrics.CallbackOptions, + ) -> Iterable[metrics.Observation]: + try: + value = _count_active_users(db_engine) + if value is not None: + yield metrics.Observation(value=value) + except Exception: + logger.debug('Failed to observe active users', exc_info=True) + + def observe_users_active_today( + options: metrics.CallbackOptions, + ) -> Iterable[metrics.Observation]: + try: + value = _count_users_active_today(db_engine) + if value is not None: + yield metrics.Observation(value=value) + except Exception: + logger.debug('Failed to observe users active today', exc_info=True) meter.create_observable_gauge( name='webui.users.total', description='Total number of registered users', unit='users', - callbacks=[observe_total_registered_users], + callbacks=[observe_total_users], ) meter.create_observable_gauge( @@ -159,11 +217,6 @@ def setup_metrics(app: FastAPI, resource: Resource) -> None: callbacks=[observe_active_users], ) - async def observe_users_active_today( - options: metrics.CallbackOptions, - ) -> Sequence[metrics.Observation]: - return [metrics.Observation(value=await Users.get_num_users_active_today())] - meter.create_observable_gauge( name='webui.users.active.today', description='Number of users active since midnight today', diff --git a/backend/open_webui/utils/telemetry/setup.py b/backend/open_webui/utils/telemetry/setup.py index 744dced2d0..14f10ef97f 100644 --- a/backend/open_webui/utils/telemetry/setup.py +++ b/backend/open_webui/utils/telemetry/setup.py @@ -55,4 +55,4 @@ def setup(app: FastAPI, db_engine: Engine): # set up metrics only if enabled if ENABLE_OTEL_METRICS: - setup_metrics(app, resource) + setup_metrics(app, resource, db_engine) From d0e51bde5d23a23c8bcfe526bf2f6f4aca0ac557 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 15:03:29 +0900 Subject: [PATCH 10/51] refac --- backend/open_webui/routers/audio.py | 17 ++++++++++------- src/lib/components/admin/Settings/Audio.svelte | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/backend/open_webui/routers/audio.py b/backend/open_webui/routers/audio.py index 5260bd873c..c69be124e5 100644 --- a/backend/open_webui/routers/audio.py +++ b/backend/open_webui/routers/audio.py @@ -576,7 +576,7 @@ async def speech(request: Request, user=Depends(get_verified_user)): async with aiohttp.ClientSession(timeout=timeout, trust_env=True) as session: mistral_payload = { 'input': payload.get('input', ''), - 'model': request.app.state.config.TTS_MODEL or 'mistral-tts-latest', + 'model': request.app.state.config.TTS_MODEL or 'voxtral-mini-tts-2603', 'voice_id': payload.get('voice', ''), 'response_format': 'mp3', } @@ -1345,7 +1345,7 @@ async def get_available_models(request: Request) -> list[dict]: except Exception as e: log.error(f'Error fetching models: {str(e)}') elif request.app.state.config.TTS_ENGINE == 'mistral': - available_models = [{'id': 'mistral-tts-latest'}] + available_models = [{'id': 'voxtral-mini-tts-2603'}] return available_models @@ -1431,11 +1431,14 @@ async def get_available_voices(request) -> dict: response.raise_for_status() voices_data = await response.json() - for voice in voices_data: - voice_id = voice.get('voice_id', voice.get('id', '')) - voice_name = voice.get('name', voice_id) - if voice_id: - available_voices[voice_id] = voice_name + # Mistral returns a paginated response: {"items": [...], "page": ..., "total": ...} + voices_list = voices_data.get('items', []) if isinstance(voices_data, dict) else voices_data + for voice in voices_list: + if isinstance(voice, dict): + voice_id = voice.get('voice_id', voice.get('id', '')) + voice_name = voice.get('name', voice_id) + if voice_id: + available_voices[voice_id] = voice_name except Exception as e: log.error(f'Error fetching Mistral voices: {str(e)}') diff --git a/src/lib/components/admin/Settings/Audio.svelte b/src/lib/components/admin/Settings/Audio.svelte index 427f2e6965..271c5b8fa9 100644 --- a/src/lib/components/admin/Settings/Audio.svelte +++ b/src/lib/components/admin/Settings/Audio.svelte @@ -525,7 +525,7 @@ TTS_MODEL = 'tts-1'; } else if (e.target?.value === 'mistral') { TTS_VOICE = ''; - TTS_MODEL = 'mistral-tts-latest'; + TTS_MODEL = 'voxtral-mini-tts-2603'; } else { TTS_VOICE = ''; TTS_MODEL = ''; From 0e311a95a7ba953aceaa1eac3525af83fe2fb980 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 15:16:37 +0900 Subject: [PATCH 11/51] refac --- backend/open_webui/retrieval/web/firecrawl.py | 4 ++-- backend/open_webui/retrieval/web/utils.py | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/retrieval/web/firecrawl.py b/backend/open_webui/retrieval/web/firecrawl.py index 4af302c0de..8cd18e1ef2 100644 --- a/backend/open_webui/retrieval/web/firecrawl.py +++ b/backend/open_webui/retrieval/web/firecrawl.py @@ -30,7 +30,7 @@ def search_firecrawl( timeout=count * 3 + 10, ) response.raise_for_status() - data = response.json().get('data', {}) + data = response.json().get('data', []) results = [ SearchResult( @@ -38,7 +38,7 @@ def search_firecrawl( title=r.get('title', ''), snippet=r.get('description', ''), ) - for r in data.get('web', []) + for r in (data if isinstance(data, list) else []) ] if filter_list: diff --git a/backend/open_webui/retrieval/web/utils.py b/backend/open_webui/retrieval/web/utils.py index cd5c3a946d..9cb0c1abd7 100644 --- a/backend/open_webui/retrieval/web/utils.py +++ b/backend/open_webui/retrieval/web/utils.py @@ -5,6 +5,8 @@ import socket import ssl import urllib.parse import urllib.request + +import requests from datetime import datetime, time, timedelta from typing import ( Any, From 58bc254809bac2432f1af6927e2cf24e09707d51 Mon Sep 17 00:00:00 2001 From: goodbey857 <76645482+goodbey857@users.noreply.github.com> Date: Fri, 24 Apr 2026 14:19:37 +0800 Subject: [PATCH 12/51] feat: add PaddleOCR-vl loader support and implement retrieval router infrastructure (#23945) Co-authored-by: Tim Baek Co-authored-by: joaoback <156559121+joaoback@users.noreply.github.com> --- README.md | 2 +- backend/open_webui/config.py | 12 ++ backend/open_webui/main.py | 4 + backend/open_webui/retrieval/loaders/main.py | 11 +- .../retrieval/loaders/paddleocr_vl.py | 127 ++++++++++++++++++ backend/open_webui/retrieval/utils.py | 2 + backend/open_webui/routers/retrieval.py | 16 +++ .../admin/Settings/Documents.svelte | 21 +++ src/lib/i18n/locales/en-US/translation.json | 3 + src/lib/i18n/locales/zh-CN/translation.json | 3 + 10 files changed, 199 insertions(+), 2 deletions(-) create mode 100644 backend/open_webui/retrieval/loaders/paddleocr_vl.py diff --git a/README.md b/README.md index 1885f4f6f1..3c4bee98c9 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ For more information, be sure to check out our [Open WebUI Documentation](https: - 💾 **Persistent Artifact Storage**: Built-in key-value storage API for artifacts, enabling features like journals, trackers, leaderboards, and collaborative tools with both personal and shared data scopes across sessions. -- 📚 **Local RAG Integration**: Dive into the future of chat interactions with groundbreaking Retrieval Augmented Generation (RAG) support using your choice of 9 vector databases and multiple content extraction engines (Tika, Docling, Document Intelligence, Mistral OCR, External loaders). Load documents directly into chat or add files to your document library, effortlessly accessing them using the `#` command before a query. +- 📚 **Local RAG Integration**: Dive into the future of chat interactions with groundbreaking Retrieval Augmented Generation (RAG) support using your choice of 9 vector databases and multiple content extraction engines (Tika, Docling, Document Intelligence, Mistral OCR, PaddleOCR-vl, External loaders). Load documents directly into chat or add files to your document library, effortlessly accessing them using the `#` command before a query. - 🔍 **Web Search for RAG**: Perform web searches using 15+ providers including `SearXNG`, `Google PSE`, `Brave Search`, `Kagi`, `Mojeek`, `Tavily`, `Perplexity`, `serpstack`, `serper`, `Serply`, `DuckDuckGo`, `SearchApi`, `SerpApi`, `Bing`, `Jina`, `Exa`, `Sougou`, `Azure AI Search`, and `Ollama Cloud`, injecting results directly into your chat experience. diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index d2c88cb2fb..06178d385c 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -2827,6 +2827,18 @@ MISTRAL_OCR_API_KEY = PersistentConfig( os.getenv('MISTRAL_OCR_API_KEY', ''), ) +PADDLEOCR_VL_BASE_URL = PersistentConfig( + 'PADDLEOCR_VL_BASE_URL', + 'rag.paddleocr_vl_base_url', + os.getenv('PADDLEOCR_VL_BASE_URL', 'http://localhost:8080'), +) + +PADDLEOCR_VL_TOKEN = PersistentConfig( + 'PADDLEOCR_VL_TOKEN', + 'rag.paddleocr_vl_token', + os.getenv('PADDLEOCR_VL_TOKEN', ''), +) + BYPASS_EMBEDDING_AND_RETRIEVAL = PersistentConfig( 'BYPASS_EMBEDDING_AND_RETRIEVAL', 'rag.bypass_embedding_and_retrieval', diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index ba7f74c830..d6f4f4c7af 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -303,6 +303,8 @@ from open_webui.config import ( DOCUMENT_INTELLIGENCE_MODEL, MISTRAL_OCR_API_BASE_URL, MISTRAL_OCR_API_KEY, + PADDLEOCR_VL_BASE_URL, + PADDLEOCR_VL_TOKEN, RAG_TEXT_SPLITTER, ENABLE_MARKDOWN_HEADER_TEXT_SPLITTER, TIKTOKEN_ENCODING_NAME, @@ -1023,6 +1025,8 @@ app.state.config.DOCUMENT_INTELLIGENCE_KEY = DOCUMENT_INTELLIGENCE_KEY app.state.config.DOCUMENT_INTELLIGENCE_MODEL = DOCUMENT_INTELLIGENCE_MODEL app.state.config.MISTRAL_OCR_API_BASE_URL = MISTRAL_OCR_API_BASE_URL app.state.config.MISTRAL_OCR_API_KEY = MISTRAL_OCR_API_KEY +app.state.config.PADDLEOCR_VL_BASE_URL = PADDLEOCR_VL_BASE_URL +app.state.config.PADDLEOCR_VL_TOKEN = PADDLEOCR_VL_TOKEN app.state.config.MINERU_API_MODE = MINERU_API_MODE app.state.config.MINERU_API_URL = MINERU_API_URL app.state.config.MINERU_API_KEY = MINERU_API_KEY diff --git a/backend/open_webui/retrieval/loaders/main.py b/backend/open_webui/retrieval/loaders/main.py index 7dc9df37ce..27c81f7f81 100644 --- a/backend/open_webui/retrieval/loaders/main.py +++ b/backend/open_webui/retrieval/loaders/main.py @@ -23,7 +23,7 @@ from open_webui.retrieval.loaders.external_document import ExternalDocumentLoade from open_webui.retrieval.loaders.mistral import MistralLoader from open_webui.retrieval.loaders.datalab_marker import DatalabMarkerLoader from open_webui.retrieval.loaders.mineru import MinerULoader - +from open_webui.retrieval.loaders.paddleocr_vl import PaddleOCRVLLoader from open_webui.env import GLOBAL_LOG_LEVEL, REQUESTS_VERIFY @@ -399,6 +399,15 @@ class Loader: api_key=self.kwargs.get('MISTRAL_OCR_API_KEY'), file_path=file_path, ) + elif ( + self.engine == 'paddleocr_vl' + and self.kwargs.get('PADDLEOCR_VL_TOKEN') != '' + ): + loader = PaddleOCRVLLoader( + api_url=self.kwargs.get('PADDLEOCR_VL_BASE_URL'), + token=self.kwargs.get('PADDLEOCR_VL_TOKEN'), + file_path=file_path, + ) else: if file_ext == 'pdf': loader = PyPDFLoader( diff --git a/backend/open_webui/retrieval/loaders/paddleocr_vl.py b/backend/open_webui/retrieval/loaders/paddleocr_vl.py new file mode 100644 index 0000000000..ab7632b3f8 --- /dev/null +++ b/backend/open_webui/retrieval/loaders/paddleocr_vl.py @@ -0,0 +1,127 @@ +import base64 +import os +import requests +import logging +import sys +from typing import List + +from langchain_core.documents import Document +from open_webui.env import GLOBAL_LOG_LEVEL + +logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL) +log = logging.getLogger(__name__) + +class PaddleOCRVLLoader: + """Loader that uses PaddleOCR-vl API to extract text from PDF/images.""" + + def __init__( + self, + api_url: str, + token: str, + file_path: str, + ): + if not api_url or not token: + raise ValueError("PaddleOCR-vl API URL and Token are required.") + if not os.path.exists(file_path): + raise FileNotFoundError(f"File not found at {file_path}") + + self.api_url = api_url.rstrip('/') + self.token = token + self.file_path = file_path + self.file_name = os.path.basename(file_path) + + def load(self) -> List[Document]: + log.info(f"Processing with PaddleOCR-vl: {self.file_path}") + + try: + with open(self.file_path, "rb") as file: + file_bytes = file.read() + file_data = base64.b64encode(file_bytes).decode("ascii") + except Exception as e: + log.error(f"Failed to read file {self.file_path}: {e}") + raise + + headers = { + "Authorization": f"token {self.token}", + "Content-Type": "application/json" + } + + # Detect fileType based on file extension + ext = self.file_path.lower().split('.')[-1] + image_extensions = ['png', 'jpg', 'jpeg', 'bmp', 'tiff', 'webp'] + file_type = 1 if ext in image_extensions else 0 + + payload = { + "file": file_data, + "fileType": file_type, + "useDocOrientationClassify": False, + "useDocUnwarping": False, + "useChartRecognition": False, + } + + try: + response = requests.post(f"{self.api_url}/layout-parsing", json=payload, headers=headers) + response.raise_for_status() + + result = response.json().get("result", {}) + layout_results = result.get("layoutParsingResults", []) + + documents = [] + total_pages = len(layout_results) + skipped_pages = 0 + + for i, res in enumerate(layout_results): + markdown_text = res.get("markdown", {}).get("text", "") + + if isinstance(markdown_text, str): + cleaned_content = markdown_text.strip() + else: + cleaned_content = str(markdown_text).strip() + + if not cleaned_content: + skipped_pages += 1 + continue + + documents.append( + Document( + page_content=cleaned_content, + metadata={ + "page": i, + "page_label": i + 1, + "total_pages": total_pages, + "file_name": self.file_name, + "processing_engine": "paddleocr-vl" + } + ) + ) + + if skipped_pages > 0: + log.info(f"PaddleOCR-vl: Processed {len(documents)} pages, skipped {skipped_pages} empty pages.") + + if not documents: + log.warning("No valid text content found by PaddleOCR-vl.") + return [ + Document( + page_content="No valid text content found in document", + metadata={ + "error": "no_valid_pages", + "file_name": self.file_name, + "processing_engine": "paddleocr-vl" + } + ) + ] + + return documents + + except Exception as e: + log.error(f"Error calling PaddleOCR-vl: {e}") + return [ + Document( + page_content=f"Error during OCR processing: {e}", + metadata={ + "error": "processing_failed", + "file_name": self.file_name, + "processing_engine": "paddleocr-vl" + } + ) + ] diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index fb5a46c2b0..b1aec78656 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -114,6 +114,8 @@ def build_loader_from_config(request): DOCUMENT_INTELLIGENCE_MODEL=config.DOCUMENT_INTELLIGENCE_MODEL, MISTRAL_OCR_API_BASE_URL=config.MISTRAL_OCR_API_BASE_URL, MISTRAL_OCR_API_KEY=config.MISTRAL_OCR_API_KEY, + PADDLEOCR_VL_BASE_URL=config.PADDLEOCR_VL_BASE_URL, + PADDLEOCR_VL_TOKEN=config.PADDLEOCR_VL_TOKEN, MINERU_API_MODE=config.MINERU_API_MODE, MINERU_API_URL=config.MINERU_API_URL, MINERU_API_KEY=config.MINERU_API_KEY, diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index fea00143e6..01ef1d8886 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -480,6 +480,8 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): 'DOCUMENT_INTELLIGENCE_MODEL': request.app.state.config.DOCUMENT_INTELLIGENCE_MODEL, 'MISTRAL_OCR_API_BASE_URL': request.app.state.config.MISTRAL_OCR_API_BASE_URL, 'MISTRAL_OCR_API_KEY': request.app.state.config.MISTRAL_OCR_API_KEY, + 'PADDLEOCR_VL_BASE_URL': request.app.state.config.PADDLEOCR_VL_BASE_URL, + 'PADDLEOCR_VL_TOKEN': request.app.state.config.PADDLEOCR_VL_TOKEN, # MinerU settings 'MINERU_API_MODE': request.app.state.config.MINERU_API_MODE, 'MINERU_API_URL': request.app.state.config.MINERU_API_URL, @@ -686,6 +688,8 @@ class ConfigForm(BaseModel): DOCUMENT_INTELLIGENCE_MODEL: Optional[str] = None MISTRAL_OCR_API_BASE_URL: Optional[str] = None MISTRAL_OCR_API_KEY: Optional[str] = None + PADDLEOCR_VL_BASE_URL: Optional[str] = None + PADDLEOCR_VL_TOKEN: Optional[str] = None # MinerU settings MINERU_API_MODE: Optional[str] = None @@ -887,6 +891,16 @@ async def update_rag_config(request: Request, form_data: ConfigForm, user=Depend if form_data.MISTRAL_OCR_API_KEY is not None else request.app.state.config.MISTRAL_OCR_API_KEY ) + request.app.state.config.PADDLEOCR_VL_BASE_URL = ( + form_data.PADDLEOCR_VL_BASE_URL + if form_data.PADDLEOCR_VL_BASE_URL is not None + else request.app.state.config.PADDLEOCR_VL_BASE_URL + ) + request.app.state.config.PADDLEOCR_VL_TOKEN = ( + form_data.PADDLEOCR_VL_TOKEN + if form_data.PADDLEOCR_VL_TOKEN is not None + else request.app.state.config.PADDLEOCR_VL_TOKEN + ) # MinerU settings request.app.state.config.MINERU_API_MODE = ( @@ -1152,6 +1166,8 @@ async def update_rag_config(request: Request, form_data: ConfigForm, user=Depend 'DOCUMENT_INTELLIGENCE_MODEL': request.app.state.config.DOCUMENT_INTELLIGENCE_MODEL, 'MISTRAL_OCR_API_BASE_URL': request.app.state.config.MISTRAL_OCR_API_BASE_URL, 'MISTRAL_OCR_API_KEY': request.app.state.config.MISTRAL_OCR_API_KEY, + 'PADDLEOCR_VL_BASE_URL': request.app.state.config.PADDLEOCR_VL_BASE_URL, + 'PADDLEOCR_VL_TOKEN': request.app.state.config.PADDLEOCR_VL_TOKEN, # MinerU settings 'MINERU_API_MODE': request.app.state.config.MINERU_API_MODE, 'MINERU_API_URL': request.app.state.config.MINERU_API_URL, diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index eeb6b18b10..a2349e78e5 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -184,6 +184,13 @@ toast.error($i18n.t('Mistral OCR API Key required.')); return; } + if ( + RAGConfig.CONTENT_EXTRACTION_ENGINE === 'paddleocr_vl' && + RAGConfig.PADDLEOCR_VL_BASE_URL === '' + ) { + toast.error($i18n.t('PaddleOCR-vl API URL required.')); + return; + } if ( RAGConfig.CONTENT_EXTRACTION_ENGINE === 'mineru' && @@ -356,6 +363,7 @@ + @@ -657,6 +665,19 @@ bind:value={RAGConfig.MISTRAL_OCR_API_KEY} /> + {:else if RAGConfig.CONTENT_EXTRACTION_ENGINE === 'paddleocr_vl'} +
+ + +
{:else if RAGConfig.CONTENT_EXTRACTION_ENGINE === 'mineru'}
diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index ad0f42f733..36ad93ad61 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -775,6 +775,8 @@ "Enter prompt here.": "", "Enter proxy URL (e.g. https://user:password@host:port)": "", "Enter reasoning effort": "", + "Enter PaddleOCR-vl API Token": "", + "Enter PaddleOCR-vl API Base URL": "", "Enter Score": "", "Enter SearchApi API Key": "", "Enter SearchApi Engine": "", @@ -1518,6 +1520,7 @@ "Output format": "", "Output Format": "", "Overview": "", + "PaddleOCR-vl": "", "page": "", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index ce09ad948c..9678d24eeb 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -774,6 +774,8 @@ "Enter prompt here.": "在此输入提示词。", "Enter proxy URL (e.g. https://user:password@host:port)": "输入代理地址(例如:https://用户名:密码@主机名:端口)", "Enter reasoning effort": "输入推理努力", + "Enter PaddleOCR-vl API Token": "输入 PaddleOCR-vl 接口密钥", + "Enter PaddleOCR-vl API Base URL": "输入 PaddleOCR-vl API 基础地址", "Enter Score": "输入评分", "Enter SearchApi API Key": "输入 SearchApi 接口密钥", "Enter SearchApi Engine": "输入 SearchApi 引擎", @@ -1517,6 +1519,7 @@ "Output format": "输出格式", "Output Format": "输出格式", "Overview": "概述", + "PaddleOCR-vl": "PaddleOCR-vl", "page": "页", "Page": "页模式", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "页模式将为每个页面创建一个文档;单文档模式则将所有页面合并为一个文档,以便更好地进行跨页分块。", From 90584ab6f317ea71719dc0a5dfce8a2418f17fb6 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 15:21:37 +0900 Subject: [PATCH 13/51] refac --- backend/open_webui/main.py | 74 +++++++++++++------------- backend/open_webui/utils/middleware.py | 50 ++++++++++------- 2 files changed, 67 insertions(+), 57 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index d6f4f4c7af..d75f1af4f4 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -1869,17 +1869,15 @@ async def chat_completion( except asyncio.CancelledError: log.info('Chat processing was cancelled') try: - event_emitter = await get_event_emitter(metadata) - if event_emitter: - await asyncio.shield( - event_emitter( - {'type': 'chat:tasks:cancel'}, - ) - ) - except Exception as e: + async def emit_cancel_event(): + event_emitter = await get_event_emitter(metadata) + if event_emitter: + await event_emitter({'type': 'chat:tasks:cancel'}) + + await asyncio.shield(emit_cancel_event()) + except Exception: pass - finally: - raise # re-raise to ensure proper task cancellation handling + raise # re-raise to ensure proper task cancellation handling except Exception as e: error_detail = e.detail if isinstance(e, HTTPException) else str(e) log.error('Error processing chat payload: %s', error_detail) @@ -1911,36 +1909,38 @@ async def chat_completion( except Exception: pass finally: - # Clean up MCP clients. Shield the entire block from - # CancelledError so disconnect() can finish even when the - # task is being stopped. Each client is isolated so one - # failure doesn't skip the rest. - try: - if mcp_clients := metadata.get('mcp_clients'): + # Clean up MCP clients and emit chat:active=false. + # Shield the entire block from CancelledError so cleanup + # can finish even when the task is being stopped. + async def cleanup_process_chat(): + try: + if mcp_clients := metadata.get('mcp_clients'): - async def _cleanup_mcp(): - for client in reversed(list(mcp_clients.values())): - try: - await client.disconnect() - except Exception as e: - log.debug(f'Error disconnecting MCP client: {e}') + async def cleanup_mcp_clients(): + for client in reversed(list(mcp_clients.values())): + try: + await client.disconnect() + except Exception as e: + log.debug(f'Error disconnecting MCP client: {e}') + + await asyncio.wait_for(cleanup_mcp_clients(), timeout=10.0) + except asyncio.TimeoutError: + log.warning('MCP client cleanup timed out after 10 s') + except Exception as e: + log.debug(f'Error cleaning up MCP clients: {e}') + + try: + if metadata.get('chat_id'): + event_emitter = await get_event_emitter(metadata, update_db=False) + if event_emitter: + await event_emitter({'type': 'chat:active', 'data': {'active': False}}) + except Exception as e: + log.debug(f'Error emitting chat:active: {e}') - await asyncio.wait_for( - asyncio.shield(_cleanup_mcp()), - timeout=10.0, - ) - except asyncio.TimeoutError: - log.warning('MCP client cleanup timed out after 10 s') - except Exception as e: - log.debug(f'Error cleaning up MCP clients: {e}') - # Emit chat:active=false when task completes try: - if metadata.get('chat_id'): - event_emitter = await get_event_emitter(metadata, update_db=False) - if event_emitter: - await event_emitter({'type': 'chat:active', 'data': {'active': False}}) - except Exception as e: - log.debug(f'Error emitting chat:active: {e}') + await asyncio.shield(cleanup_process_chat()) + except (asyncio.CancelledError, Exception): + pass # Fan out: one task per model if metadata.get('session_id') and metadata.get('chat_id'): diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 8d3b6dd267..fa6c65f36d 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -4269,6 +4269,8 @@ async def streaming_chat_response_handler(response, ctx): 'data': data, } ) + except (asyncio.CancelledError, KeyboardInterrupt): + raise except Exception as e: done = 'data: [DONE]' in line if done: @@ -4971,31 +4973,39 @@ async def streaming_chat_response_handler(response, ctx): await outlet_filter_handler(ctx) except asyncio.CancelledError: log.warning('Task was cancelled!') - try: - await asyncio.shield(event_emitter({'type': 'chat:tasks:cancel'})) + # Close the response body iterator to trigger cleanup + # in stream_wrapper's finally block and release the + # upstream connection. Without this, the async + # generator is orphaned and may spin in anyio internals. + if hasattr(response, 'body_iterator') and hasattr(response.body_iterator, 'aclose'): + try: + await asyncio.shield(response.body_iterator.aclose()) + except (asyncio.CancelledError, Exception): + pass + + async def save_cancelled_state(): + await event_emitter({'type': 'chat:tasks:cancel'}) if not ENABLE_REALTIME_CHAT_SAVE: - # Save message in the database - await asyncio.shield( - Chats.upsert_message_to_chat_by_id_and_message_id( - metadata['chat_id'], - metadata['message_id'], - { - 'done': True, - 'content': serialize_output(output), - 'output': output, - }, - ) + await Chats.upsert_message_to_chat_by_id_and_message_id( + metadata['chat_id'], + metadata['message_id'], + { + 'done': True, + 'content': serialize_output(output), + 'output': output, + }, ) else: - await asyncio.shield( - Chats.upsert_message_to_chat_by_id_and_message_id( - metadata['chat_id'], - metadata['message_id'], - {'done': True}, - ) + await Chats.upsert_message_to_chat_by_id_and_message_id( + metadata['chat_id'], + metadata['message_id'], + {'done': True}, ) - except Exception: + + try: + await asyncio.shield(save_cancelled_state()) + except (asyncio.CancelledError, Exception): pass raise # re-raise CancelledError for proper propagation From 6ecba194474d770225da6a9b2cb6a067204b0719 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 15:21:52 +0900 Subject: [PATCH 14/51] refac --- backend/open_webui/utils/redis.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/utils/redis.py b/backend/open_webui/utils/redis.py index cb570cb45a..e14a0079ec 100644 --- a/backend/open_webui/utils/redis.py +++ b/backend/open_webui/utils/redis.py @@ -21,6 +21,8 @@ from open_webui.env import ( log = logging.getLogger(__name__) +MAX_RETRY_COUNT = REDIS_SENTINEL_MAX_RETRY_COUNT + # Let not our connections be timed out but deliver them from # partition. For the cache and the socket and the uptime @@ -38,7 +40,7 @@ class SentinelRedisProxy: def _master(self): return self._sentinel.master_for(self._service, **self._kw) - async def __getattr__(self, item): + def __getattr__(self, item): master = self._master() orig_attr = getattr(master, item) From 258e9f917bc17def60e0800d5872396da9427e18 Mon Sep 17 00:00:00 2001 From: Jacob Leksan <63938553+jmleksan@users.noreply.github.com> Date: Fri, 24 Apr 2026 02:25:54 -0400 Subject: [PATCH 15/51] Enhance image loading performance by adding preload links and setting loading attributes for logos in app.html (#24011) --- src/app.html | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/app.html b/src/app.html index d75d1ead00..285164d02f 100644 --- a/src/app.html +++ b/src/app.html @@ -71,6 +71,16 @@ metaThemeColorTag.setAttribute('content', '#171717'); } + const preloadHref = document.documentElement.classList.contains('dark') + ? '/static/splash-dark.png' + : '/static/splash.png'; + const preload = document.createElement('link'); + preload.rel = 'preload'; + preload.as = 'image'; + preload.href = preloadHref; + preload.setAttribute('fetchpriority', 'high'); + document.head.appendChild(preload); + window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => { if (localStorage.theme === 'system') { if (e.matches) { @@ -90,6 +100,8 @@ logo.id = 'logo'; logo.style = 'position: absolute; width: auto; height: 6rem; top: 44%; left: 50%; transform: translateX(-50%); display:block;'; + logo.loading = 'eager'; + logo.fetchPriority = 'high'; logo.src = isDarkMode ? '/static/splash-dark.png' : '/static/splash.png'; document.addEventListener('DOMContentLoaded', function () { @@ -139,6 +151,8 @@ id="logo-her" style="width: auto; height: 13rem" src="/static/splash.png" + loading="eager" + fetchpriority="high" class="animate-pulse-fast" /> From b73538ece7611902f86d5b1152eeccc3b31d1bde Mon Sep 17 00:00:00 2001 From: RomualdYT Date: Fri, 24 Apr 2026 08:26:53 +0200 Subject: [PATCH 16/51] feat(ui): add citation source overflow badge (#23918) --- src/lib/components/chat/Messages/Citations.svelte | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lib/components/chat/Messages/Citations.svelte b/src/lib/components/chat/Messages/Citations.svelte index 8f0d93ce6d..fab5dae51e 100644 --- a/src/lib/components/chat/Messages/Citations.svelte +++ b/src/lib/components/chat/Messages/Citations.svelte @@ -183,6 +183,14 @@ }} /> {/each} + {#if citations.length > 3} + + {/if}
{/if}
From b87c7555740dc87c69eea9704750bbbfdcb3db0f Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 15:29:36 +0900 Subject: [PATCH 17/51] refac --- backend/open_webui/main.py | 50 +++++++++++--------------- backend/open_webui/utils/mcp/client.py | 22 ++++++------ 2 files changed, 31 insertions(+), 41 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index d75f1af4f4..b56659e721 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -1909,37 +1909,29 @@ async def chat_completion( except Exception: pass finally: - # Clean up MCP clients and emit chat:active=false. - # Shield the entire block from CancelledError so cleanup - # can finish even when the task is being stopped. - async def cleanup_process_chat(): - try: - if mcp_clients := metadata.get('mcp_clients'): - - async def cleanup_mcp_clients(): - for client in reversed(list(mcp_clients.values())): - try: - await client.disconnect() - except Exception as e: - log.debug(f'Error disconnecting MCP client: {e}') - - await asyncio.wait_for(cleanup_mcp_clients(), timeout=10.0) - except asyncio.TimeoutError: - log.warning('MCP client cleanup timed out after 10 s') - except Exception as e: - log.debug(f'Error cleaning up MCP clients: {e}') - - try: - if metadata.get('chat_id'): - event_emitter = await get_event_emitter(metadata, update_db=False) - if event_emitter: - await event_emitter({'type': 'chat:active', 'data': {'active': False}}) - except Exception as e: - log.debug(f'Error emitting chat:active: {e}') + # MCP cleanup — MUST run in the SAME asyncio task as + # connect() because the MCP SDK's streamablehttp_client + # uses anyio task groups whose cancel scopes enforce + # same-task exit. Do NOT wrap in asyncio.shield() or + # asyncio.wait_for() — both create a new task. + # MCPClient.disconnect() self-shields via + # anyio.CancelScope(shield=True). + try: + if mcp_clients := metadata.get('mcp_clients'): + for client in reversed(list(mcp_clients.values())): + try: + await client.disconnect() + except Exception as e: + log.debug(f'Error disconnecting MCP client: {e}') + except Exception as e: + log.debug(f'Error cleaning up MCP clients: {e}') try: - await asyncio.shield(cleanup_process_chat()) - except (asyncio.CancelledError, Exception): + if metadata.get('chat_id'): + event_emitter = await get_event_emitter(metadata, update_db=False) + if event_emitter: + await event_emitter({'type': 'chat:active', 'data': {'active': False}}) + except Exception: pass # Fan out: one task per model diff --git a/backend/open_webui/utils/mcp/client.py b/backend/open_webui/utils/mcp/client.py index effe4b1637..759bcc0a31 100644 --- a/backend/open_webui/utils/mcp/client.py +++ b/backend/open_webui/utils/mcp/client.py @@ -155,20 +155,18 @@ class MCPClient: self.session = None try: - await asyncio.wait_for( - asyncio.shield(exit_stack.aclose()), - timeout=5.0, - ) - except asyncio.TimeoutError: + # IMPORTANT: Do NOT use asyncio.shield() or asyncio.wait_for() + # here — both create a new asyncio task. The MCP SDK's + # streamablehttp_client uses anyio task groups / cancel scopes + # that MUST be exited in the same task they were entered in. + # Using anyio.CancelScope(shield=True) protects from + # CancelledError while staying in the current task. + with anyio.CancelScope(shield=True): + with anyio.fail_after(5.0): + await exit_stack.aclose() + except TimeoutError: log.warning('MCPClient.disconnect() timed out after 5 s') except RuntimeError as exc: - # The MCP SDK's streamable_http transport uses anyio task - # groups and async generators internally. When we close - # a session that was interrupted mid-flight these can - # raise RuntimeError ("aclose(): asynchronous generator is - # already running" or "Attempted to exit cancel scope in a - # different task"). Swallowing the error here prevents the - # orphaned coroutines from spinning at 100 % CPU. log.debug('MCPClient.disconnect() suppressed RuntimeError: %s', exc) except Exception as exc: log.debug('MCPClient.disconnect() error: %s', exc) From 6089de0b1790275d13834a62c5598611217b7147 Mon Sep 17 00:00:00 2001 From: Lucas Date: Fri, 24 Apr 2026 08:30:06 +0200 Subject: [PATCH 18/51] i18n: enhance and expand Dutch language translations (#23944) --- src/lib/i18n/locales/nl-NL/translation.json | 2454 +++++++++---------- 1 file changed, 1227 insertions(+), 1227 deletions(-) diff --git a/src/lib/i18n/locales/nl-NL/translation.json b/src/lib/i18n/locales/nl-NL/translation.json index 4651d33fc5..dbaf9bcb13 100644 --- a/src/lib/i18n/locales/nl-NL/translation.json +++ b/src/lib/i18n/locales/nl-NL/translation.json @@ -1,228 +1,228 @@ { - "-1 for no limit, or a positive integer for a specific limit": "-1 voor geen limiet, of een positief getal voor een specifiek limiet", - "'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w', of '-1' for geen vervaldatum.", + "-1 for no limit, or a positive integer for a specific limit": "-1 voor geen limiet, of een positief getal voor een specifieke limiet", + "'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w', of '-1' voor geen vervaldatum.", "(e.g. `sh webui.sh --api --api-auth username_password`)": "(bv. `sh webui.sh --api --api-auth gebruikersnaam_wachtwoord`)", "(e.g. `sh webui.sh --api`)": "(bv. `sh webui.sh --api`)", "(latest)": "(nieuwste)", - "(leave blank for to use commercial endpoint)": "(laat leeg voor een comercieel endpoint)", - "[Last] dddd [at] h:mm A": "", - "[Today at] h:mm A": "", - "[Yesterday at] h:mm A": "", - "{{ models }}": "{{ modellen }}", + "(leave blank for to use commercial endpoint)": "(laat leeg om een commercieel endpoint te gebruiken)", + "[Last] dddd [at] h:mm A": "[Vorige] dddd [om] h:mm A", + "[Today at] h:mm A": "[Vandaag om] h:mm A", + "[Yesterday at] h:mm A": "[Gisteren om] h:mm A", + "{{ models }}": "{{ models }}", "{{COUNT}} Available Tools": "{{COUNT}} beschikbare tools", "{{COUNT}} characters": "{{COUNT}} karakters", - "{{COUNT}} extracted lines": "", - "{{COUNT}} files": "", + "{{COUNT}} extracted lines": "{{COUNT}} geextraheerde regels", + "{{COUNT}} files": "{{COUNT}} bestanden", "{{COUNT}} hidden lines": "{{COUNT}} verborgen regels", - "{{COUNT}} members": "", + "{{COUNT}} members": "{{COUNT}} leden", "{{COUNT}} Replies": "{{COUNT}} antwoorden", - "{{COUNT}} Rows": "", - "{{count}} selected_one": "", - "{{count}} selected_other": "", - "{{COUNT}} Sources": "", + "{{COUNT}} Rows": "{{COUNT}} rijen", + "{{count}} selected_one": "{{count}} geselecteerd", + "{{count}} selected_other": "{{count}} geselecteerd", + "{{COUNT}} Sources": "{{COUNT}} bronnen", "{{COUNT}} words": "{{COUNT}} woorden", - "{{COUNT}}d_time_ago": "", - "{{COUNT}}h_time_ago": "", - "{{COUNT}}m_time_ago": "", - "{{COUNT}}w_time_ago": "", - "{{COUNT}}y_time_ago": "", - "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "", - "{{model}} download has been canceled": "", - "{{modelName}} profile image": "", - "{{NAMES}} reacted with {{REACTION}}": "", - "{{user}}'s Chats": "{{user}}'s chats", + "{{COUNT}}d_time_ago": "{{COUNT}}d geleden", + "{{COUNT}}h_time_ago": "{{COUNT}}u geleden", + "{{COUNT}}m_time_ago": "{{COUNT}}m geleden", + "{{COUNT}}w_time_ago": "{{COUNT}}w geleden", + "{{COUNT}}y_time_ago": "{{COUNT}}j geleden", + "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "{{LOCALIZED_DATE}} om {{LOCALIZED_TIME}}", + "{{model}} download has been canceled": "Download van {{model}} is geannuleerd", + "{{modelName}} profile image": "Profielafbeelding van {{modelName}}", + "{{NAMES}} reacted with {{REACTION}}": "{{NAMES}} reageerden met {{REACTION}}", + "{{user}}'s Chats": "Chats van {{user}}", "{{webUIName}} Backend Required": "{{webUIName}} Backend verplicht", - "*Prompt node ID(s) are required for image generation": "*Prompt node ID('s) zijn vereist voor het genereren van afbeeldingen", - "1 hour before": "", - "1 Source": "", - "10 minutes before": "", - "15 minutes before": "", - "1m_time_ago": "", - "30 minutes before": "", - "5 minutes before": "", - "A collaboration channel where people join as members": "", - "A discussion channel where access is controlled by groups and permissions": "", + "*Prompt node ID(s) are required for image generation": "*Prompt node ID(s) zijn vereist voor het genereren van afbeeldingen", + "1 Source": "1 bron", + "1m_time_ago": "1m geleden", + "A collaboration channel where people join as members": "Een samenwerkingskanaal waar mensen als leden kunnen deelnemen", + "A discussion channel where access is controlled by groups and permissions": "Een discussiekanaal waar toegang wordt beheerd via groepen en machtigingen", + "1 hour before": "1 uur voor", + "10 minutes before": "10 minuten voor", + "15 minutes before": "15 minuten voor", + "30 minutes before": "30 minuten voor", + "5 minutes before": "5 minuten voor", "A new version (v{{LATEST_VERSION}}) is now available.": "Een nieuwe versie (v{{LATEST_VERSION}}) is nu beschikbaar", - "A private conversation between you and selected users": "", + "A private conversation between you and selected users": "Een privégesprek tussen jou en geselecteerde gebruikers", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Een taakmodel wordt gebruikt bij het uitvoeren van taken zoals het genereren van titels voor chats en zoekopdrachten op het internet", "a user": "een gebruiker", "About": "Over", - "Accept Autocomplete Generation\nJump to Prompt Variable": "", + "Accept Autocomplete Generation\nJump to Prompt Variable": "Accepteer automatische aanvulling\nGa naar promptvariabele", "Access": "Toegang", "Access Control": "Toegangsbeheer", - "Access Grants": "", - "Access List": "", - "Access updated": "", + "Access Grants": "Toegangsrechten", + "Access List": "Toegangslijst", + "Access updated": "Toegang bijgewerkt", "Accessible to all users": "Toegankelijk voor alle gebruikers", "Account": "Account", "Account Activation Pending": "Accountactivatie in afwachting", - "Accurate information": "Accurate informatie", + "Accurate information": "Nauwkeurige informatie", "Action": "Actie", - "Action not found": "", + "Action not found": "Actie niet gevonden", "Action Required for Chat Log Storage": "Actie vereist voor het opslaan van het chatlog", "Actions": "Acties", "Activate": "Activeren", "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Activeer dit commando door \"/{{COMMAND}}\" in de chat te typen", "Active": "Actief", "Active Users": "Actieve gebruikers", - "Activity": "", + "Activity": "Activiteit", "Add": "Toevoegen", "Add a model ID": "Voeg een model-ID toe", "Add a short description about what this model does": "Voeg een korte beschrijving toe over wat dit model doet", "Add a tag": "Voeg een tag toe", - "Add a tag...": "", - "Add Access": "", + "Add a tag...": "Voeg een tag toe...", + "Add Access": "Toegang toevoegen", "Add Arena Model": "Voeg arenamodel toe", "Add Connection": "Voeg verbinding toe", "Add Content": "Voeg content toe", "Add content here": "Voeg hier content toe", - "Add Custom Parameter": "", - "Add Custom Prompt": "", - "Add description": "", - "Add Details": "", + "Add Custom Parameter": "Aangepaste parameter toevoegen", + "Add Custom Prompt": "Aangepaste prompt toevoegen", + "Add Details": "Details toevoegen", "Add Files": "Voeg bestanden toe", - "Add Image": "", - "Add location": "", - "Add Member": "", - "Add Members": "", + "Add Image": "Afbeelding toevoegen", + "Add Member": "Lid toevoegen", + "Add Members": "Leden toevoegen", + "Add description": "Voeg beschrijving toe", + "Add location": "Voeg locatie toe", "Add Memory": "Voeg geheugen toe", "Add Model": "Voeg model toe", "Add Reaction": "Voeg reactie toe", - "Add tag": "", + "Add tag": "Tag toevoegen", "Add Tag": "Voeg tag toe", - "Add Terminal": "", - "Add Terminal Connection": "", + "Add Terminal": "Terminal toevoegen", + "Add Terminal Connection": "Terminalverbinding toevoegen", "Add text content": "Voeg tekstinhoud toe", - "Add to favorites": "", + "Add to favorites": "Aan favorieten toevoegen", "Add User": "Voeg gebruiker toe", "Add User Group": "Voeg gebruikersgroep toe", - "Add webpage": "", - "Add your Open Terminal URL and API key in Settings → Integrations.": "", + "Add webpage": "Webpagina toevoegen", + "Add your Open Terminal URL and API key in Settings → Integrations.": "Voeg je Open Terminal-URL en API-sleutel toe in Instellingen -> Integraties.", "Additional Config": "Extra configuratie", - "Additional configuration options for marker. This should be a JSON string with key-value pairs. For example, '{\"key\": \"value\"}'. Supported keys include: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level": "", - "Additional feedback comments": "", - "Additional Parameters": "", - "Adds filenames, titles, sections, and snippets into the BM25 text to improve lexical recall.": "", + "Additional configuration options for marker. This should be a JSON string with key-value pairs. For example, '{\"key\": \"value\"}'. Supported keys include: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level": "Aanvullende configuratieopties voor marker. Dit moet een JSON-string met key-value paren zijn. Bijvoorbeeld: '{\"key\": \"value\"}'. Ondersteunde sleutels zijn: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level", + "Additional feedback comments": "Aanvullende feedbackopmerkingen", + "Additional Parameters": "Aanvullende parameters", + "Adds filenames, titles, sections, and snippets into the BM25 text to improve lexical recall.": "Voegt bestandsnamen, titels, secties en fragmenten toe aan de BM25-tekst om lexicale herkenning te verbeteren.", "Adjusting these settings will apply changes universally to all users.": "Het aanpassen van deze instellingen zal universeel worden toegepast op alle gebruikers.", "admin": "beheerder", "Admin": "Beheerder", - "Admin Contact Email": "", + "Admin Contact Email": "E-mailadres van beheerder", "Admin Panel": "Beheerderspaneel", "Admin Settings": "Beheerdersinstellingen", "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Beheerders hebben altijd toegang tot alle gereedschappen; gebruikers moeten gereedschap toegewezen krijgen per model in de werkruimte.", - "Advanced": "", + "Advanced": "Geavanceerd", "Advanced Parameters": "Geavanceerde parameters", - "Advanced parameters for MinerU parsing (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)": "", + "Advanced parameters for MinerU parsing (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)": "Geavanceerde parameters voor MinerU-parsing (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)", "Advanced Params": "Geavanceerde params", - "After updating or changing the embedding model, you must reindex the knowledge base for the changes to take effect. You can do this using the \"Reindex\" button below.": "", - "AI": "", + "After updating or changing the embedding model, you must reindex the knowledge base for the changes to take effect. You can do this using the \"Reindex\" button below.": "Na het bijwerken of wijzigen van het embeddingmodel moet je de kennisbank opnieuw indexeren voordat de wijzigingen van kracht worden. Je kunt dit doen met de knop \"Reindex\" hieronder.", + "AI": "AI", "All": "Alle", - "All chats have been unarchived.": "", - "All day": "", - "All models are now hidden": "", - "All models are now visible": "", + "All chats have been unarchived.": "Alle chats zijn gedearchiveerd.", + "All models are now hidden": "Alle modellen zijn nu verborgen", + "All models are now visible": "Alle modellen zijn nu zichtbaar", + "All day": "De hele dag", "All models deleted successfully": "Alle modellen zijn succesvol verwijderd", - "All time": "", - "All Users": "", + "All time": "Altijd", + "All Users": "Alle gebruikers", "Allow Call": "Bellen toestaan", "Allow Chat Controls": "Chatbesturing toestaan", "Allow Chat Delete": "Chatverwijdering toestaan", "Allow Chat Edit": "Chatwijziging toestaan", - "Allow Chat Export": "", - "Allow Chat Params": "", - "Allow Chat Share": "", - "Allow Chat System Prompt": "", - "Allow Chat Valves": "", - "Allow Continue Response": "", - "Allow Delete Messages": "", + "Allow Chat Export": "Chat exporteren toestaan", + "Allow Chat Params": "Chatparameters toestaan", + "Allow Chat Share": "Chat delen toestaan", + "Allow Chat System Prompt": "Systeemprompt voor chat toestaan", + "Allow Chat Valves": "Chatkleppen toestaan", + "Allow Continue Response": "Doorgaan met antwoord toestaan", + "Allow Delete Messages": "Berichten verwijderen toestaan", "Allow File Upload": "Bestandenupload toestaan", - "Allow Multiple Models in Chat": "", + "Allow Multiple Models in Chat": "Meerdere modellen in chat toestaan", "Allow non-local voices": "Niet-lokale stemmen toestaan", - "Allow public write access": "", - "Allow Rate Response": "", - "Allow Regenerate Response": "", - "Allow Sharing With Users": "", - "Allow Speech to Text": "", + "Allow public write access": "Openbare schrijftoegang toestaan", + "Allow Rate Response": "Reactiebeoordeling toestaan", + "Allow Regenerate Response": "Antwoord opnieuw genereren toestaan", + "Allow Sharing With Users": "Delen met gebruikers toestaan", + "Allow Speech to Text": "Spraak-naar-tekst toestaan", "Allow Temporary Chat": "Tijdelijke chat toestaan", - "Allow Text to Speech": "", + "Allow Text to Speech": "Tekst-naar-spraak toestaan", "Allow User Location": "Gebruikerslocatie toestaan", "Allow Voice Interruption in Call": "Stemonderbreking tijdens gesprek toestaan", - "Allow Web Upload": "", + "Allow Web Upload": "Webupload toestaan", "Allowed Endpoints": "Endpoints toestaan", - "Allowed File Extensions": "", - "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "", + "Allowed File Extensions": "Toegestane bestandsextensies", + "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "Toegestane bestandsextensies voor uploaden. Scheid meerdere extensies met komma's. Laat leeg voor alle bestandstypen.", "Already have an account?": "Heb je al een account?", - "Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "Alternatief voor top_p, en streeft naar een evenwicht tussen kwaliteit en variatie. De parameter p vertegenwoordigt de minimumwaarschijnlijkheid dat een token in aanmerking wordt genomen, in verhouding tot de waarschijnlijkheid van het meest waarschijnlijke token. Bijvoorbeeld, met p=0,05 en het meest waarschijnlijke token met een waarschijnlijkheid van 0,9, worden logits met een waarde kleiner dan 0,045 uitgefilterd.", + "Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "Alternatief voor top_p, en streeft naar een evenwicht tussen kwaliteit en variatie. De parameter p vertegenwoordigt de minimumwaarschijnlijkheid dat een token in aanmerking wordt genomen, in verhouding tot de waarschijnlijkheid van het meest waarschijnlijke token. Bijvoorbeeld, met p=0.05 en het meest waarschijnlijke token met een waarschijnlijkheid van 0.9, worden logits met een waarde kleiner dan 0.045 uitgefilterd.", "Always": "Altijd", "Always Collapse Code Blocks": "Codeblokken altijd inklappen", "Always Expand Details": "Details altijd uitklappen", - "Always Play Notification Sound": "", + "Always Play Notification Sound": "Meldingsgeluid altijd afspelen", "Amazing": "Geweldig", "an assistant": "een assistent", - "An error occurred while fetching the explanation": "", - "Analytics": "", + "An error occurred while fetching the explanation": "Er is een fout opgetreden bij het ophalen van de uitleg", + "Analytics": "Analyse", "Analyzed": "Geanalyseerd", "Analyzing...": "Aan het analyseren...", "and {{COUNT}} more": "en {{COUNT}} meer", "and create a new shared link.": "en maak een nieuwe gedeelde link.", - "Android": "", - "Anyone": "", + "Android": "Android", + "Anyone": "Iedereen", "API Base URL": "API Base URL", - "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "", + "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "API base URL voor de Datalab Marker-service. Standaard: https://www.datalab.to/api/v1/marker", "API Key": "API-sleutel", "API Key created.": "API-sleutel aangemaakt.", "API Key Endpoint Restrictions": "API-sleutel endpoint-beperkingen", "API keys": "API-sleutels", - "API Keys": "", - "API Mode": "", - "API Timeout": "", - "API Type": "", - "API Version": "", - "API Version is required": "", + "API Keys": "API-sleutels", + "API Mode": "API-modus", + "API Timeout": "API-time-out", + "API Type": "API-type", + "API Version": "API-versie", + "API Version is required": "API-versie is vereist", "Application DN": "Applicatie DN", - "Application DN Password": "Applicatie", + "Application DN Password": "Applicatie-DN-wachtwoord", "applies to all users with the \"user\" role": "wordt op alle gebruikers met de \"gebruikersrol\" toegepast", - "April": "April", + "April": "april", "Archive": "Archief", - "Archive All": "", + "Archive All": "Alles archiveren", "Archive All Chats": "Archiveer alle chats", - "Archived Chats": "Chatrecord", + "Archived Chats": "Gearchiveerde chats", "archived-chat-export": "gearchiveerde-chat-export", - "Are you sure you want to archive all chats? This action cannot be undone.": "", + "Are you sure you want to archive all chats? This action cannot be undone.": "Weet je zeker dat je alle chats wilt archiveren? Deze actie kan niet ongedaan worden gemaakt.", "Are you sure you want to clear all memories? This action cannot be undone.": "Weet je zeker dat je alle herinneringen wil verwijderen? Deze actie kan niet ongedaan worden gemaakt.", - "Are you sure you want to delete \"{{NAME}}\"?": "", - "Are you sure you want to delete **{{modelName}}**?": "", - "Are you sure you want to delete all chats? This action cannot be undone.": "", + "Are you sure you want to delete \"{{NAME}}\"?": "Weet je zeker dat je \"{{NAME}}\" wilt verwijderen?", + "Are you sure you want to delete all chats? This action cannot be undone.": "Weet je zeker dat je alle chats wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", + "Are you sure you want to delete **{{modelName}}**?": "Weet je zeker dat je **{{modelName}}** wilt verwijderen?", "Are you sure you want to delete this channel?": "Weet je zeker dat je dit kanaal wil verwijderen?", - "Are you sure you want to delete this connection? This action cannot be undone.": "", - "Are you sure you want to delete this memory? This action cannot be undone.": "", + "Are you sure you want to delete this connection? This action cannot be undone.": "Weet je zeker dat je deze verbinding wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", + "Are you sure you want to delete this memory? This action cannot be undone.": "Weet je zeker dat je dit geheugen wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", "Are you sure you want to delete this message?": "Weet je zeker dat je dit bericht wil verwijderen?", - "Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "", - "Are you sure you want to delete this?": "", + "Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "Weet je zeker dat je deze versie wilt verwijderen? Onderliggende versies worden opnieuw gekoppeld aan de bovenliggende versie.", + "Are you sure you want to delete this?": "Weet je zeker dat je dit wilt verwijderen?", "Are you sure you want to unarchive all archived chats?": "Weet je zeker dat je alle gearchiveerde chats wil onarchiveren?", "Arena Models": "Arenamodellen", "Artifacts": "Artefacten", - "Asc": "", + "Asc": "Oplopend", "Ask": "Vraag", "Ask a question": "Stel een vraag", "Assistant": "Assistent", - "Async Embedding Processing": "", - "At time of event": "", - "Attach File From Knowledge": "", - "Attach Files": "", - "Attach Knowledge": "", - "Attach Notes": "", - "Attach Webpage": "", - "Attention to detail": "Attention to detail", + "Async Embedding Processing": "Asynchrone embeddingverwerking", + "Attach File From Knowledge": "Bestand uit kennis toevoegen", + "Attach Knowledge": "Kennis toevoegen", + "Attach Notes": "Notities toevoegen", + "Attach Webpage": "Webpagina toevoegen", + "Attention to detail": "Aandacht voor detail", + "Attach Files": "Bestanden toevoegen", + "At time of event": "Op het moment van de gebeurtenis", "Attribute for Mail": "Attribuut voor mail", "Attribute for Username": "Attribuut voor gebruikersnaam", "Audio": "Audio", - "August": "Augustus", - "Auth": "", + "August": "augustus", + "Auth": "Authenticatie", "Authenticate": "Authenticeer", "Authentication": "Authenticatie", - "Auto": "", - "Auto (Random)": "", + "Auto": "Automatisch", + "Auto (Random)": "Auto (Willekeurig)", "Auto-Copy Response to Clipboard": "Antwoord automatisch kopiëren naar klembord", "Auto-playback response": "Automatisch afspelen van antwoord", "Autocomplete Generation": "Automatische aanvullingsgeneratie", @@ -231,17 +231,17 @@ "AUTOMATIC1111 Api Auth String": "Automatic1111 Api Auth String", "AUTOMATIC1111 Base URL": "AUTOMATIC1111 Basis-URL", "AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Basis-URL is verplicht", - "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "", - "Automation": "", - "Automation created": "", - "Automation Name": "", - "Automation title": "", - "Automation triggered": "", - "Automation updated": "", - "Automations": "", + "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "Systeemtools automatisch injecteren in native functieaanroepmodus (bijv. tijdstempels, geheugen, chatgeschiedenis, notities, enz.)", + "Automation": "Automatisering", + "Automation created": "Automatisering aangemaakt", + "Automation Name": "Naam van automatisering", + "Automation title": "Titel van automatisering", + "Automation triggered": "Automatisering geactiveerd", + "Automation updated": "Automatisering bijgewerkt", + "Automations": "Automatiseringen", "Available list": "Beschikbare lijst", - "Available models": "", - "Available Tools": "", + "Available models": "Beschikbare modellen", + "Available Tools": "Beschikbare tools", "available users": "beschikbare gebruikers", "available!": "beschikbaar!", "Away": "Afwezig", @@ -253,93 +253,93 @@ "Bad Response": "Ongeldig antwoord", "Banners": "Banners", "Base Model (From)": "Basismodel (Vanaf)", - "Base Model List Cache speeds up access by fetching base models only at startup or on settings save—faster, but may not show recent base model changes.": "", - "Bearer": "", + "Base Model List Cache speeds up access by fetching base models only at startup or on settings save—faster, but may not show recent base model changes.": "Cache voor basismodellen versnelt de toegang door basismodellen alleen op te halen bij het opstarten of bij het opslaan van instellingen. Dit is sneller, maar toont mogelijk geen recente wijzigingen in basismodellen.", + "Bearer": "Bearer", "before": "voor", "Being lazy": "Lui zijn", "Beta": "Beta", - "Bing": "", + "Bing": "Bing", "Bing Search V7 Endpoint": "Bing Search V7 Endpoint", "Bing Search V7 Subscription Key": "Bing Search V7 Subscription Key", - "Bio": "", - "Birth Date": "", - "BM25 Weight": "", + "Bio": "Bio", + "Birth Date": "Geboortedatum", + "BM25 Weight": "BM25-gewicht", "Bocha Search API Key": "Bocha Search API-sleutel", - "Bold": "", + "Bold": "Vet", "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Versterken of bestraffen van specifieke tokens voor beperkte reacties. Biaswaarden worden geklemd tussen -100 en 100 (inclusief). (Standaard: none)", - "Brave": "", + "Brave": "Brave", "Brave Search API Key": "Brave Search API-sleutel", - "Break down complex requests into trackable steps": "", - "Browse and query knowledge bases": "", - "Builtin Tools": "", - "Bullet List": "", - "Button ID": "", - "Button Label": "", - "Button Prompt": "", - "by {{name}}": "", - "By {{name}}": "Op {{name}}", - "Bypass Embedding and Retrieval": "Embedding en ophalen omzeilen ", - "Bypass Web Loader": "", - "Cache Base Model List": "", + "Browse and query knowledge bases": "Kennisbanken doorzoeken en bevragen", + "Builtin Tools": "Ingebouwde tools", + "Bullet List": "Lijst met opsommingstekens", + "Button ID": "Knop-ID", + "Button Label": "Knoplabel", + "Button Prompt": "Knopprompt", + "by {{name}}": "door {{name}}", + "By {{name}}": "Door {{name}}", + "Bypass Embedding and Retrieval": "Embedding en ophalen omzeilen", + "Bypass Web Loader": "Webloader omzeilen", + "Cache Base Model List": "Basismodellijst cachen", + "Break down complex requests into trackable steps": "Splits complexe verzoeken op in traceerbare stappen", "Calendar": "Agenda", - "Calendar deleted": "", - "Calendars": "", + "Calendar deleted": "Agenda verwijderd", + "Calendars": "Agenda's", "Call": "Oproep", "Call feature is not supported when using Web STT engine": "Belfunctie wordt niet ondersteund bij gebruik van de Web STT engine", "Camera": "Camera", "Cancel": "Annuleren", - "Cancel download of {{model}}": "", - "Cannot create an empty note.": "", - "Cannot delete the production version": "", + "Cancel download of {{model}}": "Download van {{model}} annuleren", + "Cannot create an empty note.": "Kan geen lege notitie maken.", + "Cannot delete the production version": "Kan de productieversie niet verwijderen", "Capabilities": "Mogelijkheden", "Capture": "Vastleggen", "Capture Audio": "Audio opnemen", "Certificate Path": "Pad naar certificaat", - "Change folder icon": "", + "Change folder icon": "Mappictogram wijzigen", "Change Password": "Wijzig Wachtwoord", - "Change User Role": "", - "Channel": "", - "Channel deleted successfully": "", + "Change User Role": "Gebruikersrol wijzigen", + "Channel": "Kanaal", + "Channel deleted successfully": "Kanaal succesvol verwijderd", "Channel Name": "Kanaalnaam", - "Channel name cannot be empty.": "", - "Channel name must be less than 128 characters": "", - "Channel Type": "", - "Channel updated successfully": "", + "Channel name cannot be empty.": "Kanaalnaam mag niet leeg zijn.", + "Channel name must be less than 128 characters": "Kanaalnaam moet korter zijn dan 128 tekens", + "Channel Type": "Kanaaltype", + "Channel updated successfully": "Kanaal succesvol bijgewerkt", "Channels": "Kanalen", "Character": "Karakter", "Character limit for autocomplete generation input": "Karakterlimiet voor automatische generatieinvoer", "Chart new frontiers": "Verken nieuwe grenzen", "Chat": "Chat", - "Chat archived.": "", + "Chat archived.": "Chat gearchiveerd.", "Chat Background Image": "Chatachtergrond", "Chat Bubble UI": "Chatbubble-UI", - "Chat Completions": "", - "Chat Conversation": "", + "Chat Completions": "Chataanvullingen", + "Chat Conversation": "Chatgesprek", "Chat direction": "Chatrichting", - "Chat exported successfully": "", - "Chat History": "", - "Chat ID": "", - "Chat moved successfully": "", + "Chat exported successfully": "Chat succesvol geexporteerd", + "Chat History": "Chatgeschiedenis", + "Chat ID": "Chat-ID", + "Chat moved successfully": "Chat succesvol verplaatst", "Chat Permissions": "Chattoestemmingen", "Chat Tags Auto-Generation": "Chatlabels automatisch genereren", - "Chat unshared successfully.": "", - "chats": "", + "Chat unshared successfully.": "Chatdeling succesvol opgeheven.", + "chats": "chats", "Chats": "Chats", "Check Again": "Controleer Opnieuw", "Check for updates": "Controleer op updates", "Checking for updates...": "Controleren op updates...", "Choose a model before saving...": "Kies een model voordat je opslaat...", - "Chunk Min Size Target": "", + "Chunk Min Size Target": "Target minimale chunkgrootte", "Chunk Overlap": "Chunkoverlap", "Chunk Size": "Chunkgrootte", - "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "", + "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "Chunks die kleiner zijn dan deze drempel worden, waar mogelijk, samengevoegd met aangrenzende chunks. Stel in op 0 om samenvoegen uit te schakelen.", "Ciphers": "Versleutelingen", "Citation": "Citaat", "Citations": "Citaten", "Clear memory": "Geheugen wissen", "Clear Memory": "Geheugen wissen", - "Clear search": "", - "Clear status": "", + "Clear search": "Zoekopdracht wissen", + "Clear status": "Status wissen", "click here": "klik hier", "Click here for filter guides.": "Klik hier voor filterhulp.", "Click here for help.": "Klik hier voor hulp.", @@ -348,89 +348,89 @@ "Click here to learn more about faster-whisper and see the available models.": "Klik hier om meer te leren over faster-whisper en de beschikbare modellen te bekijken.", "Click here to see available models.": "Klik hier om beschikbare modellen te zien", "Click here to select": "Klik hier om te selecteren", - "Click here to select a csv file.": "Klik hier om een csv file te selecteren.", + "Click here to select a csv file.": "Klik hier om een csv bestand te selecteren.", "Click here to select a py file.": "Klik hier om een py-bestand te selecteren.", "Click here to upload a workflow.json file.": "Klik hier om een workflow.json-bestand te uploaden.", "click here.": "klik hier.", "Click on the user role button to change a user's role.": "Klik op de gebruikersrol knop om de rol van een gebruiker te wijzigen.", - "Click to connect": "", - "Click to copy ID": "", - "Client ID": "", - "Client Secret": "", + "Click to connect": "Klik om te verbinden", + "Click to copy ID": "Klik om ID te kopiëren", + "Client ID": "Client-ID", + "Client Secret": "Clientgeheim", "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Klembord schrijftoestemming geweigerd. Kijk je browserinstellingen na om de benodigde toestemming te geven.", "Clone": "Kloon", "Clone Chat": "Kloon chat", "Clone of {{TITLE}}": "Kloon van {{TITLE}}", "Close": "Sluiten", - "Close Banner": "", - "Close chat controls": "", - "Close citation modal": "", - "Close Configure Connection Modal": "", - "Close feedback": "", - "Close modal": "", - "Close Modal": "", - "Close settings modal": "", - "Close Sidebar": "", - "cloud": "", - "CMU ARCTIC speaker embedding name": "", - "Code Block": "", - "Code Editor": "", + "Close Banner": "Banner sluiten", + "Close chat controls": "Chatbediening sluiten", + "Close citation modal": "Citatiemodal sluiten", + "Close Configure Connection Modal": "Modal Verbinding configureren sluiten", + "Close feedback": "Feedback sluiten", + "Close modal": "Modal sluiten", + "Close Modal": "Modal sluiten", + "Close settings modal": "Instellingenmodal sluiten", + "Close Sidebar": "Zijbalk sluiten", + "cloud": "cloud", + "CMU ARCTIC speaker embedding name": "CMU ARCTIC-spreker-embeddingnaam", + "Code Block": "Codeblok", + "Code Editor": "Code-editor", "Code execution": "Code uitvoeren", - "Code Execution": "", + "Code Execution": "Code-uitvoer", "Code Execution Engine": "Code-uitvoer engine", "Code Execution Timeout": "Code-uitvoer time-out", "Code formatted successfully": "Code succesvol geformateerd", "Code Interpreter": "Code-interpretatie", "Code Interpreter Engine": "Code-interpretatie engine", "Code Interpreter Prompt Template": "Code-interpretatie promptsjabloon", - "Collaboration channel where people join as members": "", + "Collaboration channel where people join as members": "Samenwerkingskanaal waar mensen als leden deelnemen", "Collapse": "Inklappen", "Collection": "Verzameling", - "Collections": "", + "Collections": "Verzamelingen", "Color": "Kleur", "ComfyUI": "ComfyUI", "ComfyUI API Key": "ComfyUI API-sleutel", "ComfyUI Base URL": "ComfyUI Base URL", - "ComfyUI Base URL is required.": "ComfyUI Base URL is required.", + "ComfyUI Base URL is required.": "ComfyUI-basis-URL is vereist.", "ComfyUI Workflow": "ComfyUI workflow", "ComfyUI Workflow Nodes": "ComfyUI workflowknopen", - "Comma separated Node Ids (e.g. 1 or 1,2)": "", - "command": "", + "Comma separated Node Ids (e.g. 1 or 1,2)": "Door komma's gescheiden node-ID's (bijv. 1 of 1,2)", + "command": "commando", "Command": "Commando", "Comment": "Reactie", - "Commit Message": "", - "Community Reviews": "", + "Commit Message": "Commitbericht", + "Community Reviews": "Communitybeoordelingen", "Completions": "Voltooiingen", - "Compress Images in Channels": "", + "Compress Images in Channels": "Afbeeldingen in kanalen comprimeren", "Concurrent Requests": "Gelijktijdige verzoeken", - "Config": "", - "Config imported successfully": "", - "Configuration": "", + "Config": "Configuratie", + "Config imported successfully": "Configuratie succesvol geimporteerd", + "Configuration": "Configuratie", "Configure": "Configureer", "Confirm": "Bevestigen", "Confirm Password": "Bevestig wachtwoord", - "Confirm Prompt from Embed": "", + "Confirm Prompt from Embed": "Prompt uit embed bevestigen", "Confirm your action": "Bevestig je actie", "Confirm your new password": "Bevestig je nieuwe wachtwoord", - "Confirm Your Password": "", - "Connect to an AI provider to start chatting": "", - "Connect to Open Terminal instances to browse files and use them as always-on tools. Only one can be active at a time.": "", - "Connect to Open Terminal instances. All users will have access to file browsing and terminal tools through these servers.": "", + "Confirm Your Password": "Bevestig je wachtwoord", + "Connect to an AI provider to start chatting": "Verbind met een AI-provider om te beginnen met chatten", + "Connect to Open Terminal instances to browse files and use them as always-on tools. Only one can be active at a time.": "Verbind met Open Terminal-instanties om bestanden te doorzoeken en ze te gebruiken als altijd-beschikbare tools. Slechts een kan tegelijk actief zijn.", + "Connect to Open Terminal instances. All users will have access to file browsing and terminal tools through these servers.": "Verbind met Open Terminal-instanties. Alle gebruikers krijgen via deze servers toegang tot bestandsverkenning en terminaltools.", "Connect to your own OpenAI compatible API endpoints.": "Verbind met je eigen OpenAI-compatibele API-endpoints", "Connect to your own OpenAPI compatible external tool servers.": "Verbind met je eigen OpenAPI-compatibele externe gereedschapservers", - "Connected ({{type}})": "", + "Connected ({{type}})": "Verbonden ({{type}})", "Connection failed": "Connectie mislukt", - "Connection lost. Reconnecting...": "", + "Connection lost. Reconnecting...": "Verbinding verbroken. Opnieuw verbinden...", "Connection successful": "Connectie succesvol", - "Connection Type": "Connectie type", + "Connection Type": "Connectietype", "Connections": "Verbindingen", - "Connections saved successfully": "", - "Connections settings updated": "", + "Connections saved successfully": "Verbindingen succesvol opgeslagen", + "Connections settings updated": "Verbindingsinstellingen bijgewerkt", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "Beperkt de redeneerinspanning voor redeneermodellen. Alleen van toepassing op redeneermodellen van specifieke providers die redeneerinspanning ondersteunen.", "Contact Admin for WebUI Access": "Neem contact op met de beheerder voor WebUI-toegang", "Content": "Inhoud", "Content Extraction Engine": "Inhoudsextractie engine", - "Content lengths (character counts only)": "", + "Content lengths (character counts only)": "Inhoudslengtes (alleen tekentellingen)", "Continue Response": "Doorgaan met antwoord", "Continue with {{provider}}": "Ga verder met {{provider}}", "Continue with Email": "Ga door met E-mail", @@ -438,83 +438,83 @@ "Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "Bepaal hoe berichttekst wordt opgesplitst voor TTS-verzoeken. 'Leestekens' splitst op in zinnen, 'alinea's' splitst op in paragrafen en 'geen' houdt het bericht als een enkele string.", "Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "Controleer de herhaling van tokenreeksen in de gegenereerde tekst. Een hogere waarde (bijv. 1,5) zal herhalingen sterker bestraffen, terwijl een lagere waarde (bijv. 1,1) milder zal zijn. Bij 1 is het uitgeschakeld.", "Controls": "Besturingselementen", - "Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "", - "Conversation saved successfully": "", + "Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "Regelt de balans tussen samenhang en diversiteit van de uitvoer. Een lagere waarde resulteert in meer gerichte en samenhangende tekst.", + "Conversation saved successfully": "Gesprek succesvol opgeslagen", "Copied": "Gekopieerd", - "Copied link to clipboard": "", + "Copied link to clipboard": "Link gekopieerd naar klembord", "Copied shared chat URL to clipboard!": "URL van gedeelde gesprekspagina gekopieerd naar klembord!", "Copied to clipboard": "Gekopieerd naar klembord", "Copy": "Kopieer", - "Copy API Key": "", - "Copy content": "", + "Copy API Key": "API-sleutel kopiëren", + "Copy content": "Inhoud kopiëren", "Copy Formatted Text": "Kopieer opgemaakte tekst", - "Copy Last Code Block": "", - "Copy Last Response": "", - "Copy link": "Kopiëer link", + "Copy Last Code Block": "Laatste codeblok kopiëren", + "Copy Last Response": "Laatste antwoord kopiëren", + "Copy link": "Kopieer link", "Copy Link": "Kopieer link", - "Copy Path": "", - "Copy Prompt": "", - "Copy Share Link": "", + "Copy Prompt": "Prompt kopiëren", + "Copy Share Link": "Deellink kopiëren", + "Copy Path": "Pad kopiëren", "Copy to clipboard": "Kopieer naar klembord", - "Copy Token": "", - "Copy URL": "", + "Copy Token": "Token kopiëren", + "Copy URL": "URL kopiëren", "Copying to clipboard was successful!": "Kopiëren naar klembord was succesvol!", "CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS moet goed geconfigureerd zijn bij de provider om verzoeken van Open WebUI toe te staan", - "Could not read file.": "", - "CPU": "", + "Could not read file.": "Kon bestand niet lezen.", + "CPU": "CPU", "Create": "Aanmaken", "Create a knowledge base": "Maak een kennisbasis aan", "Create a model": "Een model maken", - "Create a new note": "", + "Create a new note": "Een nieuwe notitie maken", "Create Account": "Maak account", "Create Admin Account": "Maak admin-account", - "Create and manage scheduled automations": "", + "Create and manage scheduled automations": "Maak en beheer geplande automatiseringen", "Create Channel": "Maak kanaal", - "Create Folder": "", - "Create Image": "", - "Create Knowledge": "Creër kennis", - "Create Model": "", + "Create Folder": "Map maken", + "Create Image": "Afbeelding maken", + "Create Knowledge": "Creëer kennis", + "Create Model": "Model maken", "Create new key": "Maak nieuwe sleutel", "Create new secret key": "Maak nieuwe geheime sleutel", - "Create note": "", + "Create note": "Notitie maken", "Create Note": "Maak notitie", - "Create scheduled prompts that run automatically on a recurring basis.": "", - "Create your first note by clicking on the plus button below.": "", + "Create your first note by clicking on the plus button below.": "Maak je eerste notitie door op de plusknop hieronder te klikken.", + "Create scheduled prompts that run automatically on a recurring basis.": "Maak geplande prompts die automatisch op terugkerende basis worden uitgevoerd.", "Created at": "Gemaakt op", "Created At": "Gemaakt op", "Created by": "Gemaakt door", - "Created by you": "", - "Created on {{date}}": "", + "Created by you": "Gemaakt door jou", + "Created on {{date}}": "Gemaakt op {{date}}", "CSV Import": "CSV import", "Ctrl+Enter to Send": "Ctrl+Enter om te sturen", "Current Model": "Huidig model", "Current Password": "Huidig wachtwoord", "Custom": "Aangepast", - "Custom description enabled": "", - "Custom Gender": "", - "Custom Parameter Name": "", - "Custom Parameter Value": "", - "Daily": "", - "Daily Messages": "", + "Custom description enabled": "Aangepaste beschrijving ingeschakeld", + "Custom Gender": "Aangepast geslacht", + "Custom Parameter Name": "Naam van aangepaste parameter", + "Custom Parameter Value": "Waarde van aangepaste parameter", + "Daily Messages": "Dagelijkse berichten", + "Daily": "Dagelijks", "Danger Zone": "Gevarenzone", "Dark": "Donker", - "Data Controls": "", + "Data Controls": "Gegevensbeheer", "Database": "Database", - "Datalab Marker API": "", - "Day": "", - "DD/MM/YYYY": "", - "DDGS Backend": "", - "December": "December", - "Decrease UI Scale": "", - "Deepgram": "", + "Datalab Marker API": "Datalab Marker-API", + "DD/MM/YYYY": "DD/MM/JJJJ", + "DDGS Backend": "DDGS-backend", + "December": "december", + "Decrease UI Scale": "UI-schaal verkleinen", + "Deepgram": "Deepgram", + "Day": "Dag", "Default": "Standaard", "Default (Open AI)": "Standaard (Open AI)", "Default (SentenceTransformers)": "Standaard (SentenceTransformers)", - "Default action buttons will be used.": "", - "Default description enabled": "", - "Default Features": "", - "Default Filters": "", - "Default Group": "", + "Default action buttons will be used.": "Standaardactieknoppen worden gebruikt.", + "Default description enabled": "Standaardbeschrijving ingeschakeld", + "Default Features": "Standaardfuncties", + "Default Filters": "Standaardfilters", + "Default Group": "Standaardgroep", "Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model's built-in tool-calling capabilities, but requires the model to inherently support this feature.": "De standaardmodus werkt met een breder scala aan modellen door gereedschappen één keer aan te roepen voordat ze worden uitgevoerd. De native modus maakt gebruik van de ingebouwde mogelijkheden van het model om gereedschappen aan te roepen, maar vereist dat het model deze functie inherent ondersteunt.", "Default Model": "Standaardmodel", "Default model updated": "Standaardmodel bijgewerkt", @@ -525,59 +525,59 @@ "Default to ALL": "Standaard op ALL", "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "Standaard gesegmenteerd ophalen voor gerichte en relevante inhoudsextractie, dit wordt aanbevolen voor de meeste gevallen.", "Default User Role": "Standaard gebruikersrol", - "Defaults": "", + "Defaults": "Standaardwaarden", "Delete": "Verwijderen", - "Delete {{name}}": "", + "Delete {{name}}": "{{name}} verwijderen", "Delete a model": "Verwijder een model", - "Delete All": "", + "Delete All": "Alles verwijderen", "Delete All Chats": "Verwijder alle chats", - "Delete all contents inside this folder": "", - "Delete automation?": "", - "Delete calendar": "", - "Delete Calendar": "", + "Delete all contents inside this folder": "Alle inhoud in deze map verwijderen", + "Delete calendar": "Verwijder kalender", + "Delete Calendar": "Verwijder kalender", "Delete Chat": "Verwijder chat", "Delete chat?": "Verwijder chat?", - "Delete Event": "", - "Delete File": "", + "Delete File": "Bestand verwijderen", + "Delete automation?": "Verwijder automatisering?", + "Delete Event": "Verwijder gebeurtenis?", "Delete folder?": "Verwijder map?", "Delete function?": "Verwijder functie?", - "Delete Memory?": "", + "Delete Memory?": "Geheugen verwijderen?", "Delete Message": "Verwijder bericht", "Delete message?": "Bericht verwijderen?", - "Delete Model": "", + "Delete Model": "Model verwijderen", "Delete note?": "Notitie verwijderen?", "Delete prompt?": "Verwijder prompt?", - "Delete skill?": "", + "Delete skill?": "Vaardigheid verwijderen?", "delete this link": "verwijder deze link", "Delete tool?": "Verwijder tool?", "Delete User": "Verwijder gebruiker", - "Delete Version": "", - "Deleted": "", + "Delete Version": "Versie verwijderen", + "Deleted": "Verwijderd", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} is verwijderd", "Deleted {{name}}": "{{name}} verwijderd", - "Deleted {{ok}} of {{total}} items": "", + "Deleted {{ok}} of {{total}} items": "{{ok}} van {{total}} items verwijderd", "Deleted User": "Gebruiker verwijderd", - "Deployment names are required for Azure OpenAI": "", - "Desc": "", - "Describe the edit...": "", - "Describe the image...": "", - "Describe what changed...": "", + "Deployment names are required for Azure OpenAI": "Implementatienamen zijn vereist voor Azure OpenAI", + "Desc": "Aflopend", + "Describe the edit...": "Beschrijf de bewerking...", + "Describe the image...": "Beschrijf de afbeelding...", + "Describe what changed...": "Beschrijf wat er is gewijzigd...", "Describe your knowledge base and objectives": "Beschrijf je kennisbasis en doelstellingen", "Description": "Beschrijving", - "Deselect": "", - "Detect Artifacts Automatically": "", - "Dictate": "", + "Deselect": "Deselecteren", + "Detect Artifacts Automatically": "Artefacten automatisch detecteren", + "Dictate": "Dicteren", "Didn't fully follow instructions": "Heeft niet alle instructies gevolgd", "Direct": "Direct", "Direct Connections": "Directe verbindingen", "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Directe verbindingen stellen gebruikers in staat om met hun eigen OpenAI compatibele API-endpoints te verbinden.", - "Direct Message": "", - "Direct Tool Servers": "", - "Directory selection was cancelled": "", - "Disable All": "", - "Disable Code Interpreter": "", - "Disable Image Extraction": "", - "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", + "Direct Message": "Direct bericht", + "Direct Tool Servers": "Directe toolservers", + "Directory selection was cancelled": "Mapselectie is geannuleerd", + "Disable All": "Alles uitschakelen", + "Disable Code Interpreter": "Code-interpretatie uitschakelen", + "Disable Image Extraction": "Afbeeldingsextractie uitschakelen", + "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Schakel afbeeldingsextractie uit de PDF uit. Als Use LLM is ingeschakeld, krijgen afbeeldingen automatisch beschrijvingen. Standaard is False.", "Disabled": "Uitgeschakeld", "Discover a function": "Ontdek een functie", "Discover a model": "Ontdek een model", @@ -589,126 +589,126 @@ "Discover, download, and explore custom prompts": "Ontdek, download en verken aangepaste prompts", "Discover, download, and explore custom tools": "Ontdek, download en verken aangepaste gereedschappen", "Discover, download, and explore model presets": "Ontdek, download en verken model presets", - "Discussion channel where access is based on groups and permissions": "", + "Discussion channel where access is based on groups and permissions": "Discussiekanaal waarbij toegang is gebaseerd op groepen en machtigingen", "Display": "Toon", - "Display chat title in tab": "", + "Display chat title in tab": "Chattitel weergeven in tabblad", "Display Emoji in Call": "Emoji tonen tijdens gesprek", - "Display Multi-model Responses in Tabs": "", + "Display Multi-model Responses in Tabs": "Multimodelantwoorden in tabbladen weergeven", "Display the username instead of You in the Chat": "Toon de gebruikersnaam in plaats van Jij in de Chat", "Displays citations in the response": "Toon citaten in het antwoord", - "Displays status updates (e.g., web search progress) in the response": "", - "Dive into knowledge": "Duik in kennis", + "Displays status updates (e.g., web search progress) in the response": "Toont statusupdates (bijv. voortgang van webzoekopdrachten) in het antwoord", + "Dive into knowledge": "Verken kennis", "Do not install functions from sources you do not fully trust.": "Installeer geen functies vanuit bronnen die je niet volledig vertrouwt", "Do not install tools from sources you do not fully trust.": "Installeer geen tools vanuit bronnen die je niet volledig vertrouwt.", - "Do you want to sync your usage stats with Open WebUI Community?": "", + "Do you want to sync your usage stats with Open WebUI Community?": "Wil je je gebruiksstatistieken synchroniseren met Open WebUI Community?", "Docling": "Docling", - "Docling Parameters": "", + "Docling Parameters": "Docling-parameters", "Docling Server URL required.": "Docling server-URL benodigd", "Document": "Document", "Document Intelligence": "Document Intelligence", - "Document Intelligence endpoint required.": "", - "Document Intelligence Model": "", + "Document Intelligence endpoint required.": "Document Intelligence-endpoint is vereist.", + "Document Intelligence Model": "Document Intelligence-model", "Documentation": "Documentatie", - "Documents": "", + "Documents": "Documenten", "does not make any external connections, and your data stays securely on your locally hosted server.": "maakt geen externe verbindingen, en je gegevens blijven veilig op je lokaal gehoste server.", "Domain Filter List": "Domein-filterlijst", "don't fetch random pipelines from sources you don't trust.": "Haal geen willekeurige pipelines op van onbetrouwbare bronnen.", "Don't have an account?": "Heb je geen account?", - "don't install random functions from sources you don't trust.": "installeer geen willekeurige functies van bronnen die je niet vertrouwd", - "don't install random tools from sources you don't trust.": "installeer geen willekeurige gereedschappen van bronnen die je niet vertrouwd", + "don't install random functions from sources you don't trust.": "installeer geen willekeurige functies van bronnen die je niet vertrouwt", + "don't install random tools from sources you don't trust.": "installeer geen willekeurige gereedschappen van bronnen die je niet vertrouwt", "Don't like the style": "Vind je de stijl niet mooi?", "Done": "Voltooid", "Download": "Download", "Download & Delete": "Downloaden en verwijderen", - "Download as JSON": "", + "Download as JSON": "Download als JSON", "Download as SVG": "Download als SVG", "Download canceled": "Download geannuleerd", "Download Database": "Download database", - "Downloading stats...": "", + "Downloading stats...": "Statistieken downloaden...", "Draw": "Teken", - "Drop any files here to upload": "", - "Drop files here": "", - "Drop files here to upload": "", - "DuckDuckGo": "", + "Drop any files here to upload": "Sleep bestanden hierheen om te uploaden", + "Drop files here": "Sleep bestanden hierheen", + "Drop files here to upload": "Sleep bestanden hierheen om te uploaden", + "DuckDuckGo": "DuckDuckGo", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "bijv. '30s', '10m'. Geldige tijdseenheden zijn 's', 'm', 'h'.", - "e.g. 'low', 'medium', 'high'": "", + "e.g. 'low', 'medium', 'high'": "bijv. 'laag', 'gemiddeld', 'hoog'", "e.g. \"json\" or a JSON schema": "bijv. \"json\" of een JSON-schema", "e.g. 60": "bijv. 60", - "e.g. A filter to remove profanity from text": "bijv. Een filter om gevloek uit tekst te verwijderen", - "e.g. about the Roman Empire": "", - "e.g. alloy, echo, shimmer": "", - "e.g. Code Review Guidelines": "", - "e.g. code-review-guidelines": "", - "e.g. en": "", + "e.g. A filter to remove profanity from text": "bijv. Een filter om uit tekst te verwijderen", + "e.g. about the Roman Empire": "bijv. over het Romeinse Rijk", + "e.g. alloy, echo, shimmer": "bijv. alloy, echo, shimmer", + "e.g. Code Review Guidelines": "bijv. Richtlijnen voor codebeoordeling", + "e.g. code-review-guidelines": "bijv. richtlijnen-voor-codebeoordeling", + "e.g. en": "bijv. en", "e.g. My Filter": "bijv. Mijn filter", "e.g. My Tools": "bijv. Mijn gereedschappen", "e.g. my_filter": "bijv. mijn_filter", "e.g. my_tools": "bijv. mijn_gereedschappen", - "e.g. pdf, docx, txt": "", - "e.g. Step-by-step instructions for code reviews": "", - "e.g. Tell me a fun fact": "", - "e.g. Tell me a fun fact about the Roman Empire": "", + "e.g. pdf, docx, txt": "bijv. pdf, docx, txt", + "e.g. Step-by-step instructions for code reviews": "bijv. Stapsgewijze instructies voor codebeoordelingen", + "e.g. Tell me a fun fact": "bijv. Vertel me een leuk weetje", + "e.g. Tell me a fun fact about the Roman Empire": "bijv. Vertel me een leuk weetje over het Romeinse Rijk", "e.g. Tools for performing various operations": "Gereedschappen om verschillende bewerkingen uit te voeren", - "e.g., 3, 4, 5 (leave blank for default)": "", - "e.g., audio/wav,audio/mpeg,video/* (leave blank for defaults)": "", - "e.g., en-US,ja-JP (leave blank for auto-detect)": "", - "e.g., westus (leave blank for eastus)": "", + "e.g., 3, 4, 5 (leave blank for default)": "bijv. 3, 4, 5 (laat leeg voor standaard)", + "e.g., audio/wav,audio/mpeg,video/* (leave blank for defaults)": "bijv. audio/wav,audio/mpeg,video/* (laat leeg voor standaardwaarden)", + "e.g., en-US,ja-JP (leave blank for auto-detect)": "bijv. en-US,ja-JP (laat leeg voor automatische detectie)", + "e.g., westus (leave blank for eastus)": "bijv. westus (laat leeg voor eastus)", "Edit": "Wijzig", "Edit Arena Model": "Bewerk arenamodel", "Edit Channel": "Bewerk kanaal", "Edit Connection": "Bewerk connectie", "Edit Default Permissions": "Bewerk standaardrechten", - "Edit Folder": "", - "Edit Image": "", - "Edit Last Message": "", + "Edit Folder": "Map bewerken", + "Edit Image": "Afbeelding bewerken", + "Edit Last Message": "Laatste bericht bewerken", "Edit Memory": "Bewerk geheugen", - "Edit Prompt": "", - "Edit Terminal Connection": "", + "Edit Prompt": "Prompt bewerken", + "Edit Terminal Connection": "Terminalverbinding bewerken", "Edit User": "Wijzig gebruiker", "Edit User Group": "Bewerk gebruikergroep", - "Edit workflow.json content": "", - "edited": "", - "Edited": "", - "Editing": "", - "Eject": "", - "Eject model": "", + "Edit workflow.json content": "workflow.json-inhoud bewerken", + "edited": "bewerkt", + "Edited": "Bewerkt", + "Editing": "Bewerken", + "Eject": "Uitwerpen", + "Eject model": "Model uitwerpen", "ElevenLabs": "ElevenLabs", "Email": "E-mail", "Embark on adventures": "Ga op avonturen", "Embedding": "Embedding", "Embedding Batch Size": "Embedding batchgrootte", - "Embedding Concurrent Requests": "", + "Embedding Concurrent Requests": "Gelijktijdige embeddingverzoeken", "Embedding Model": "Embedding Model", "Embedding Model Engine": "Embedding Model Engine", - "Emojis": "", - "Empty message": "", - "Enable All": "", - "Enable API Keys": "", + "Empty message": "Leeg bericht", + "Enable All": "Alles inschakelen", + "Enable API Keys": "API-sleutels inschakelen", + "Emojis": "Emojis", "Enable autocomplete generation for chat messages": "Automatische aanvullingsgeneratie voor chatberichten inschakelen", "Enable Code Execution": "Code-uitvoer inschakelen", "Enable Code Interpreter": "Code-interpretatie inschakelen", "Enable Community Sharing": "Delen via de community inschakelen", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Schakel Memory Locking (mlock) in om te voorkomen dat modelgegevens uit het RAM worden verwisseld. Deze optie vergrendelt de werkset pagina's van het model in het RAM, zodat ze niet naar de schijf worden uitgewisseld. Dit kan helpen om de prestaties op peil te houden door paginafouten te voorkomen en snelle gegevenstoegang te garanderen.", "Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Schakel Memory Mapping (mmap) in om modelgegevens te laden. Deze optie laat het systeem schijfopslag gebruiken als een uitbreiding van RAM door schijfbestanden te behandelen alsof ze in RAM zitten. Dit kan de prestaties van het model verbeteren door snellere gegevenstoegang mogelijk te maken. Het is echter mogelijk dat deze optie niet op alle systemen correct werkt en een aanzienlijke hoeveelheid schijfruimte in beslag kan nemen.", - "Enable Message Queue": "", + "Enable Message Queue": "Berichtenwachtrij inschakelen", "Enable Message Rating": "Schakel berichtbeoordeling in", "Enable Mirostat sampling for controlling perplexity.": "Mirostat-sampling in om perplexiteit te controleren inschakelen.", "Enable New Sign Ups": "Schakel nieuwe registraties in", - "Enable, disable, or customize the reasoning tags used by the model. \"Enabled\" uses default tags, \"Disabled\" turns off reasoning tags, and \"Custom\" lets you specify your own start and end tags.": "", + "Enable, disable, or customize the reasoning tags used by the model. \"Enabled\" uses default tags, \"Disabled\" turns off reasoning tags, and \"Custom\" lets you specify your own start and end tags.": "Schakel de redeneringstags die door het model worden gebruikt in, uit of pas ze aan. \"Ingeschakeld\" gebruikt standaardtags, \"Uitgeschakeld\" zet redeneringstags uit en \"Aangepast\" laat je je eigen begin- en eindtags instellen.", "Enabled": "Ingeschakeld", - "End Tag": "", - "Endpoint URL": "", + "End Tag": "Eindtag", + "Endpoint URL": "Endpoint-URL", "Enforce Temporary Chat": "Tijdelijke chat afdwingen", - "Enhance": "", - "Enrich Hybrid Search Text": "", - "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Zorg ervoor dat uw CSV-bestand de volgende vier kolommen in deze volgorde bevat: Naam, E-mail, Wachtwoord, Rol.", + "Enhance": "Verbeteren", + "Enrich Hybrid Search Text": "Hybride zoektekst verrijken", + "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Zorg ervoor dat je CSV-bestand de volgende vier kolommen in deze volgorde bevat: Naam, E-mail, Wachtwoord, Rol.", "Enter {{role}} message here": "Voeg {{role}} bericht hier toe", "Enter a detail about yourself for your LLMs to recall": "Voer een detail over jezelf in zodat LLM's het kunnen onthouden", - "Enter a title for the pending user info overlay. Leave empty for default.": "", - "Enter a watermark for the response. Leave empty for none.": "", - "Enter additional headers in JSON format": "", - "Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "", - "Enter additional parameters in JSON format": "", + "Enter a title for the pending user info overlay. Leave empty for default.": "Voer een titel in voor de overlay met wachtende gebruikersinfo. Laat leeg voor standaard.", + "Enter a watermark for the response. Leave empty for none.": "Voer een watermerk in voor het antwoord. Laat leeg voor geen.", + "Enter additional headers in JSON format": "Voer extra headers in JSON-indeling in", + "Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "Voer extra headers in JSON-indeling in (bijv. {\"X-Custom-Header\": \"value\"}", + "Enter additional parameters in JSON format": "Voer extra parameters in JSON-indeling in", "Enter api auth string (e.g. username:password)": "Voer api auth string in (bv. gebruikersnaam:wachtwoord)", "Enter Application DN": "Voer applicatie-DN in", "Enter Application DN Password": "Voer applicatie-DN wachtwoord in", @@ -717,69 +717,69 @@ "Enter Bocha Search API Key": "Voer Bocha Search API-sleutel in", "Enter Brave Search API Key": "Voer de Brave Search API-sleutel in", "Enter certificate path": "Voer pad naar certificaat in", - "Enter Chunk Min Size Target": "", + "Enter Chunk Min Size Target": "Voer doel voor minimale chunkgrootte in", "Enter Chunk Overlap": "Voeg Chunk Overlap toe", "Enter Chunk Size": "Voeg Chunk Size toe", "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Voer kommagescheiden \"token:bias_waarde\" paren in (bijv. 5432:100, 413:-100)", - "Enter content for the pending user info overlay. Leave empty for default.": "", - "Enter coordinates (e.g. 51.505, -0.09)": "", - "Enter Datalab Marker API Base URL": "", - "Enter Datalab Marker API Key": "", + "Enter content for the pending user info overlay. Leave empty for default.": "Voer inhoud in voor de overlay met wachtende gebruikersinfo. Laat leeg voor standaard.", + "Enter coordinates (e.g. 51.505, -0.09)": "Voer coordinaten in (bijv. 51.505, -0.09)", + "Enter Datalab Marker API Base URL": "Voer Datalab Marker API-basis-URL in", + "Enter Datalab Marker API Key": "Voer Datalab Marker API-sleutel in", "Enter description": "Voer beschrijving in", - "Enter Docling API Key": "", + "Enter Docling API Key": "Voer Docling API-sleutel in", "Enter Docling Server URL": "Voer Docling Server-URL in", "Enter Document Intelligence Endpoint": "Voer Document Intelligence endpoint in", "Enter Document Intelligence Key": "Voer Document Intelligence sleutel in", - "Enter Document Intelligence Model": "", - "Enter domains separated by commas (e.g., example.com,site.org,!excludedsite.com)": "", + "Enter Document Intelligence Model": "Voer Document Intelligence-model in", + "Enter domains separated by commas (e.g., example.com,site.org,!excludedsite.com)": "Voer domeinen in, gescheiden door komma's (bijv. example.com,site.org,!excludedsite.com)", "Enter Exa API Key": "Voer Exa API-sleutel in", - "Enter External Document Loader API Key": "", - "Enter External Document Loader URL": "", - "Enter External Web Loader API Key": "", - "Enter External Web Loader URL": "", - "Enter External Web Search API Key": "", - "Enter External Web Search URL": "", - "Enter Firecrawl API Base URL": "", - "Enter Firecrawl API Key": "", - "Enter Firecrawl Timeout": "", - "Enter folder name": "", - "Enter function name filter list (e.g. func1, !func2)": "", + "Enter External Document Loader API Key": "Voer externe documentloader-API-sleutel in", + "Enter External Document Loader URL": "Voer externe documentloader-URL in", + "Enter External Web Loader API Key": "Voer externe webloader-API-sleutel in", + "Enter External Web Loader URL": "Voer externe webloader-URL in", + "Enter External Web Search API Key": "Voer externe webzoek-API-sleutel in", + "Enter External Web Search URL": "Voer externe webzoek-URL in", + "Enter Firecrawl API Base URL": "Voer Firecrawl API-basis-URL in", + "Enter Firecrawl API Key": "Voer Firecrawl API-sleutel in", + "Enter Firecrawl Timeout": "Voer Firecrawl-time-out in", + "Enter folder name": "Voer mapnaam in", + "Enter function name filter list (e.g. func1, !func2)": "Voer functienaamfilterlijst in (bijv. func1, !func2)", "Enter Github Raw URL": "Voer de Github Raw-URL in", "Enter Google PSE API Key": "Voer de Google PSE API-sleutel in", "Enter Google PSE Engine Id": "Voer Google PSE Engine-ID in", - "Enter hex color (e.g. #FF0000)": "", + "Enter hex color (e.g. #FF0000)": "Voer hexkleur in (bijv. #FF0000)", "Enter Image Size (e.g. 512x512)": "Voeg afbeelding formaat toe (Bijv. 512x512)", - "Enter Jina API Base URL": "", + "Enter Jina API Base URL": "Voer Jina API-basis-URL in", "Enter Jina API Key": "Voer Jina API-sleutel in", - "Enter JSON config (e.g., {\"disable_links\": true})": "", + "Enter JSON config (e.g., {\"disable_links\": true})": "Voer JSON-config in (bijv. {\"disable_links\": true})", "Enter Jupyter Password": "Voer Jupyter-wachtwoord in", "Enter Jupyter Token": "Voer Jupyter-token in", "Enter Jupyter URL": "Voer Jupyter-URL in", "Enter Kagi Search API Key": "Voer Kagi Search API-sleutel in", "Enter Key Behavior": "Voer sleutelgedrag in", "Enter language codes": "Voeg taalcodes toe", - "Enter MinerU API Key": "", - "Enter Mistral API Base URL": "", - "Enter Mistral API Key": "", + "Enter MinerU API Key": "Voer MinerU API-sleutel in", + "Enter Mistral API Base URL": "Voer Mistral API-basis-URL in", + "Enter Mistral API Key": "Voer Mistral API-sleutel in", "Enter Model ID": "Voer model-ID in", "Enter model tag (e.g. {{modelTag}})": "Voeg model-tag toe (Bijv. {{modelTag}})", "Enter Mojeek Search API Key": "Voer Mojeek Search API-sleutel in", - "Enter name": "", - "Enter New Password": "", + "Enter name": "Voer naam in", + "Enter New Password": "Voer nieuw wachtwoord in", "Enter Number of Steps (e.g. 50)": "Voeg aantal stappen toe (Bijv. 50)", - "Enter Ollama Cloud API Key": "", + "Enter Ollama Cloud API Key": "Voer Ollama Cloud API-sleutel in", "Enter Perplexity API Key": "Voer Perplexity API-sleutel in", - "Enter Perplexity Search API URL": "", - "Enter Playwright Timeout": "", - "Enter Playwright WebSocket URL": "", - "Enter prompt here.": "", + "Enter Perplexity Search API URL": "Voer Perplexity Search API-URL in", + "Enter Playwright Timeout": "Voer Playwright-time-out in", + "Enter Playwright WebSocket URL": "Voer Playwright WebSocket-URL in", + "Enter prompt here.": "Voer hier je prompt in.", "Enter proxy URL (e.g. https://user:password@host:port)": "Voer proxy-URL in (bijv. https://gebruiker:wachtwoord@host:port)", "Enter reasoning effort": "Voer redeneerinspanning in", "Enter Score": "Voeg score toe", "Enter SearchApi API Key": "Voer SearchApi API-sleutel in", "Enter SearchApi Engine": "Voer SearchApi-Engine in", "Enter Searxng Query URL": "Voer de URL van de Searxng-query in", - "Enter Searxng search language": "", + "Enter Searxng search language": "Voer Searxng-zoektaal in", "Enter Seed": "Voer Seed in", "Enter SerpApi API Key": "Voer SerpApi API-sleutel in", "Enter SerpApi Engine": "Voer SerpApi-engine in", @@ -789,211 +789,225 @@ "Enter server host": "Voer serverhost in", "Enter server label": "Voer serverlabel in", "Enter server port": "Voer serverpoort in", - "Enter skill instructions in markdown...": "", - "Enter Sougou Search API sID": "", - "Enter Sougou Search API SK": "", + "Enter skill instructions in markdown...": "Voer vaardigheidsinstructies in markdown in...", + "Enter Sougou Search API sID": "Voer Sougou Search API sID in", + "Enter Sougou Search API SK": "Voer Sougou Search API SK in", "Enter stop sequence": "Voer stopsequentie in", "Enter system prompt": "Voer systeem prompt in", - "Enter system prompt here": "", + "Enter system prompt here": "Voer hier de systeemprompt in", "Enter Tavily API Key": "Voer Tavily API-sleutel in", - "Enter Tavily Extract Depth": "", - "Enter the prompt instructions for this automation...": "", + "Enter Tavily Extract Depth": "Voer Tavily extractiediepte in", + "Enter the prompt instructions for this automation...": "Voer de prompt-instructies in voor deze automatisering...", "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Voer de publieke URL van je WebUI in. Deze URL wordt gebruikt om links in de notificaties te maken.", - "Enter the URL of the function to import": "", - "Enter the URL to import": "", + "Enter the URL of the function to import": "Voer de URL in van de functie die je wilt importeren", + "Enter the URL to import": "Voer de URL in om te importeren", "Enter Tika Server URL": "Voer Tika Server URL in", "Enter timeout in seconds": "Voer time-out in seconden in", "Enter to Send": "Enter om te sturen", "Enter Top K": "Voeg Top K toe", - "Enter Top K Reranker": "Voer Tok K reranker in", + "Enter Top K Reranker": "Voer Top K-reranker in", "Enter URL (e.g. http://127.0.0.1:7860/)": "Voer URL in (Bijv. http://127.0.0.1:7860/)", "Enter URL (e.g. http://localhost:11434)": "Voer URL in (Bijv. http://localhost:11434)", - "Enter value": "", - "Enter value (true/false)": "", - "Enter Yacy Password": "", - "Enter Yacy URL (e.g. http://yacy.example.com:8090)": "", - "Enter Yacy Username": "", - "Enter Yandex Web Search API Key": "", - "Enter Yandex Web Search URL": "", - "Enter You.com API Key": "", + "Enter value": "Voer waarde in", + "Enter value (true/false)": "Voer waarde in (true/false)", + "Enter Yacy Password": "Voer Yacy-wachtwoord in", + "Enter Yacy URL (e.g. http://yacy.example.com:8090)": "Voer Yacy-URL in (bijv. http://yacy.example.com:8090)", + "Enter Yacy Username": "Voer Yacy-gebruikersnaam in", + "Enter Yandex Web Search API Key": "Voer Yandex Web Search API-sleutel in", + "Enter Yandex Web Search URL": "Voer Yandex Web Search-URL in", + "Enter You.com API Key": "Voer You.com API-sleutel in", "Enter your code here...": "Voer hier je code in...", "Enter your current password": "Voer je huidige wachtwoord in", "Enter Your Email": "Voer je Email in", "Enter Your Full Name": "Voer je Volledige Naam in", - "Enter your gender": "", + "Enter your gender": "Voer je geslacht in", "Enter your message": "Voer je bericht in", - "Enter your name": "", - "Enter Your Name": "", + "Enter your name": "Voer je naam in", + "Enter Your Name": "Voer je naam in", "Enter your new password": "Voer je nieuwe wachtwoord in", "Enter Your Password": "Voer je wachtwoord in", "Enter Your Role": "Voer je rol in", "Enter Your Username": "Voer je gebruikersnaam in", "Enter your webhook URL": "Voer je webhook-URL in", - "Entra ID": "", - "Environment Variables": "", - "Ephemeral": "", + "Entra ID": "Entra-ID", + "Environment Variables": "Omgevingsvariabelen", + "Ephemeral": "Tijdelijk", "Error": "Fout", "ERROR": "ERROR", - "Error accessing directory": "", + "Error accessing directory": "Fout bij toegang tot map", "Error accessing Google Drive: {{error}}": "Fout bij het benaderen van Google Drive: {{error}}", - "Error accessing media devices.": "", - "Error deleting model: {{error}}": "", - "Error starting recording.": "", - "Error unloading model: {{error}}": "", - "Error uploading file: {{error}}": "Error bij het uploaden van bestand: {{error}}", - "Error: A model with the ID '{{modelId}}' already exists. Please select a different ID to proceed.": "", - "Error: Model ID cannot be empty. Please enter a valid ID to proceed.": "", + "Error accessing media devices.": "Fout bij toegang tot media-apparaten.", + "Error starting recording.": "Fout bij het starten van de opname.", + "Error unloading model: {{error}}": "Fout bij het ontladen van model: {{error}}", + "Error deleting model: {{error}}": "Fout bij het verwijderen van model: {{error}}", + "Error uploading file: {{error}}": "Fout bij het uploaden van bestand: {{error}}", + "Error: A model with the ID '{{modelId}}' already exists. Please select a different ID to proceed.": "Fout: Een model met de ID '{{modelId}}' bestaat al. Selecteer een andere ID om door te gaan.", + "Error: Model ID cannot be empty. Please enter a valid ID to proceed.": "Fout: Model-ID mag niet leeg zijn. Voer een geldige ID in om door te gaan.", "Evaluations": "Beoordelingen", - "Event created": "", - "Event deleted": "", - "Event title": "", - "Event updated": "", + "Event created": "Gebeurtenis aangemaakt", + "Event deleted": "Gebeurtenis verwijderd", + "Event title": "Gebeurtenis titel", + "Event updated": "Gebeurtenis bijgewerkt", "Exa API Key": "Exa API-sleutel", "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Voorbeeld: (&(objectClass=inetOrgPerson)(uid=%s))", "Example: ALL": "Voorbeeld: ALL", "Example: mail": "Voorbeeld: mail", "Example: ou=users,dc=foo,dc=example": "Voorbeeld: ou=users,dc=foo,dc=example", "Example: sAMAccountName or uid or userPrincipalName": "Voorbeeld: sAMAccountName or uid or userPrincipalName", - "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "Het aantal seats in uw licentie is overschreden. Neem contact op met support om het aantal seats te verhogen.", + "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "Het aantal seats in je licentie is overschreden. Neem contact op met support om het aantal seats te verhogen.", "Exclude": "Sluit uit", - "Execute code": "", + "Execute code": "Code uitvoeren", "Execute code for analysis": "Voer code uit voor analyse", - "Executing **{{NAME}}**...": "", - "Execution Logs": "", + "Executing **{{NAME}}**...": "**{{NAME}}** uitvoeren...", + "Execution Logs": "Uitvoerlogs", "Expand": "Uitbreiden", "Experimental": "Experimenteel", "Explain": "Leg uit", "Explore the cosmos": "Ontdek de kosmos", - "Explored": "", - "Exploring": "", + "Explored": "Verkend", + "Exploring": "Verkennen", "Export": "Exporteren", "Export All Archived Chats": "Exporteer alle gearchiveerde chats", "Export All Chats (All Users)": "Exporteer alle chats (Alle gebruikers)", - "Export as CSV": "", - "Export as JSON": "", + "Export as CSV": "Exporteer als CSV", + "Export as JSON": "Exporteer als JSON", "Export chat (.json)": "Exporteer chat (.json)", "Export Chats": "Exporteer chats", - "Export Config": "", - "Export Models": "", - "Export Prompts": "", + "Export Config": "Configuratie exporteren", + "Export Models": "Modellen exporteren", + "Export Prompts": "Prompts exporteren", "Export to CSV": "Exporteer naar CSV", - "Export Tools": "", - "Export Users": "", + "Export Tools": "Tools exporteren", + "Export Users": "Gebruikers exporteren", "External": "Extern", - "External Document Loader URL required.": "", - "External Task Model": "", - "External Web Loader API Key": "", - "External Web Loader URL": "", - "External Web Search API Key": "", - "External Web Search URL": "", - "Fade Effect for Streaming Text": "", + "External Document Loader URL required.": "Externe documentloader-URL is vereist.", + "External Task Model": "Extern taakmodel", + "External Web Loader API Key": "Externe webloader-API-sleutel", + "External Web Loader URL": "Externe webloader-URL", + "External Web Search API Key": "Externe webzoek-API-sleutel", + "External Web Search URL": "Externe webzoek-URL", + "Fade Effect for Streaming Text": "Fade-effect voor streamende tekst", "Failed to add file.": "Het is niet gelukt om het bestand toe te voegen.", - "Failed to add members": "", - "Failed to archive chat.": "", - "Failed to attach file": "", - "Failed to clear status": "", + "Failed to add members": "Leden toevoegen mislukt", + "Failed to archive chat.": "Chat archiveren mislukt.", + "Failed to attach file": "Bestand toevoegen mislukt", + "Failed to clear status": "Status wissen mislukt", "Failed to connect to {{URL}} OpenAPI tool server": "Kan geen verbinding maken met {{URL}} OpenAPI gereedschapserver", - "Failed to connect to {{URL}} terminal server": "", - "Failed to copy link": "", + "Failed to connect to {{URL}} terminal server": "Kan geen verbinding maken met {{URL}} terminalserver", + "Failed to copy link": "Link kopiëren mislukt", "Failed to create API Key.": "Kan API Key niet aanmaken.", - "Failed to delete calendar": "", - "Failed to delete note": "", - "Failed to download image": "", - "Failed to extract content from the file: {{error}}": "", - "Failed to extract content from the file.": "", + "Failed to delete note": "Notitie verwijderen mislukt", + "Failed to download image": "Afbeelding downloaden mislukt", + "Failed to extract content from the file: {{error}}": "Inhoud uit bestand extraheren mislukt: {{error}}", + "Failed to extract content from the file.": "Inhoud uit bestand extraheren mislukt.", + "Failed to delete calendar": "Kalender verwijderen mislukt", "Failed to fetch models": "Kan modellen niet ophalen", - "Failed to generate title": "", - "Failed to import models": "", - "Failed to load chat preview": "", - "Failed to load DOCX file. Please try downloading it instead.": "", - "Failed to load Excel/CSV file. Please try downloading it instead.": "", - "Failed to load file content.": "", - "Failed to load Interface settings": "", - "Failed to load PPTX file. Please try downloading it instead.": "", - "Failed to move chat": "", - "Failed to process URL: {{url}}": "", + "Failed to generate title": "Titel genereren mislukt", + "Failed to import models": "Modellen importeren mislukt", + "Failed to load chat preview": "Voorvertoning van chat laden mislukt", + "Failed to load DOCX file. Please try downloading it instead.": "DOCX-bestand laden mislukt. Probeer het in plaats daarvan te downloaden.", + "Failed to load Excel/CSV file. Please try downloading it instead.": "Excel/CSV-bestand laden mislukt. Probeer het in plaats daarvan te downloaden.", + "Failed to load file content.": "Bestandsinhoud laden mislukt.", + "Failed to load Interface settings": "Interface-instellingen laden mislukt", + "Failed to load PPTX file. Please try downloading it instead.": "PPTX-bestand laden mislukt. Probeer het in plaats daarvan te downloaden.", + "Failed to move chat": "Chat verplaatsen mislukt", + "Failed to process URL: {{url}}": "URL verwerken mislukt: {{url}}", "Failed to read clipboard contents": "Kan klembord inhoud niet lezen", - "Failed to remove member": "", - "Failed to render diagram": "", - "Failed to render visualization": "", - "Failed to save connections": "", + "Failed to remove member": "Lid verwijderen mislukt", + "Failed to render diagram": "Diagram renderen mislukt", + "Failed to render visualization": "Visualisatie renderen mislukt", + "Failed to save connections": "Verbindingen opslaan mislukt", "Failed to save conversation": "Het is niet gelukt om het gesprek op te slaan", "Failed to save models configuration": "Het is niet gelukt om de modelconfiguratie op te slaan", - "Failed to save policy: {{error}}": "", - "Failed to save terminal servers": "", - "Failed to unshare chat.": "", + "Failed to save policy: {{error}}": "Beleid opslaan mislukt: {{error}}", + "Failed to save terminal servers": "Terminalservers opslaan mislukt", + "Failed to unshare chat.": "Delen van chat opheffen mislukt.", "Failed to update settings": "Instellingen konden niet worden bijgewerkt.", - "Failed to update status": "", + "Failed to update status": "Status bijwerken mislukt", "Failed to upload file.": "Bestand kon niet worden geüpload.", "Features": "Functies", "Features Permissions": "Functietoestemmingen", - "February": "Februari", - "Feedback": "", - "Feedback Activity": "", - "Feedback deleted successfully": "", - "Feedback Details": "", + "February": "februari", + "Feedback": "Feedback", + "Feedback Activity": "Feedbackactiviteit", + "Feedback deleted successfully": "Feedback succesvol verwijderd", + "Feedback Details": "Feedbackdetails", "Feedback History": "Feedback geschiedenis", "Feel free to add specific details": "Voeg specifieke details toe", - "Female": "", - "Fetch URL Content Length Limit": "", + "Female": "Vrouw", + "Fetch URL Content Length Limit": "Limiet voor URL-inhoudslengte ophalen", "File": "Bestand", "File added successfully.": "Bestand succesvol toegevoegd.", - "File attached to chat": "", - "File browser": "", - "File content": "", + "File attached to chat": "Bestand toegevoegd aan chat", + "File browser": "Bestandsverkenner", + "File content": "Bestandsinhoud", "File content updated successfully.": "Bestandsinhoud succesvol bijgewerkt.", - "File Context": "", - "File deleted successfully.": "", + "File Context": "Bestandscontext", + "File deleted successfully.": "Bestand succesvol verwijderd.", "File Mode": "Bestandsmodus", - "File name": "", + "File name": "Bestandsnaam", "File not found.": "Bestand niet gevonden.", "File removed successfully.": "Bestand succesvol verwijderd.", "File size should not exceed {{maxSize}} MB.": "Bestandsgrootte mag niet groter zijn dan {{maxSize}} MB.", - "File Upload": "", + "File Upload": "Bestandsupload", "File uploaded successfully": "Bestand succesvol geüpload", - "File uploaded!": "", - "Filename": "", + "File uploaded!": "Bestand geüpload!", + "Filename": "Bestandsnaam", "Files": "Bestanden", - "Filter": "", + "Filter": "Filter", "Filter is now globally disabled": "Filter is nu globaal uitgeschakeld", "Filter is now globally enabled": "Filter is nu globaal ingeschakeld", "Filters": "Filters", "Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Vingerafdruk spoofing gedetecteerd: kan initialen niet gebruiken als avatar. Standaardprofielafbeelding wordt gebruikt.", - "Firecrawl API Base URL": "", - "Firecrawl API Key": "", - "Firecrawl Timeout (s)": "", - "Floating Quick Actions": "", - "Focus Chat Input": "", - "Folder": "", - "Folder Background Image": "", - "Folder created successfully": "", + "Firecrawl API Base URL": "Firecrawl API-basis-URL", + "Firecrawl API Key": "Firecrawl API-sleutel", + "Firecrawl Timeout (s)": "Firecrawl-time-out (s)", + "Floating Quick Actions": "Zwevende snelle acties", + "Focus Chat Input": "Focus op chatinvoer", + "Folder": "Map", + "Folder Background Image": "Achtergrondafbeelding map", + "Folder created successfully": "Map succesvol aangemaakt", "Folder deleted successfully": "Map succesvol verwijderd", - "Folder Max File Count": "", - "Folder name": "", - "Folder Name": "", + "Folder Max File Count": "Maximaal aantal bestanden in map", + "Folder name": "Mapnaam", + "Folder Name": "Mapnaam", "Folder name cannot be empty.": "Mapnaam kan niet leeg zijn", "Folder name updated successfully": "Mapnaam succesvol aangepast", - "Folder options": "", - "Folder updated successfully": "", - "Folders": "", - "Follow up": "", - "Follow Up Generation": "", - "Follow Up Generation Prompt": "", - "Follow up: {{question}}": "", - "Follow-Up Auto-Generation": "", + "Folder options": "Mapopties", + "Folder updated successfully": "Map succesvol bijgewerkt", + "Folders": "Mappen", + "Follow up": "Vervolg", + "Follow Up Generation": "Vervolggeneratie", + "Follow Up Generation Prompt": "Prompt voor vervolggeneratie", + "Follow up: {{question}}": "Vervolg: {{question}}", + "Follow-Up Auto-Generation": "Automatische vervolggeneratie", + "for placeholders": "voor placeholders", + "Force OCR": "OCR forceren", + "Force OCR on all pages of the PDF. This can lead to worse results if you have good text in your PDFs. Defaults to False.": "Forceer OCR op alle pagina's van de PDF. Dit kan slechtere resultaten geven als je PDF's al goede tekst bevatten. Standaard is False.", + "Format Lines": "Regels opmaken", + "Format the lines in the output. Defaults to False. If set to True, the lines will be formatted to detect inline math and styles.": "Formatteer de regels in de uitvoer. Standaard is False. Als ingesteld op True worden regels opgemaakt om inline wiskunde en stijlen te detecteren.", + "Formatting may be inconsistent from source.": "Opmaak kan afwijken van de bron.", + "Forward": "Vooruit", + "Forwards system user OAuth access token to authenticate": "Stuurt OAuth-toegangstoken van systeemgebruiker door voor authenticatie", + "Forwards system user session credentials to authenticate": "Stuurt sessiegegevens van systeemgebruiker door voor authenticatie", + "Model accepts file inputs": "Model accepteert bestandsinvoer", + "Model can execute code and perform calculations": "Model kan code uitvoeren en berekeningen maken", + "Model can generate images based on text prompts": "Model kan afbeeldingen genereren op basis van tekstprompts", + "Model can search the web for information": "Model kan het web doorzoeken naar informatie", + "Model Capabilities": "Modelmogelijkheden", + "New File": "Nieuw bestand", + "New Function": "Nieuwe functie", + "New Group": "Nieuwe groep", + "New Knowledge": "Nieuwe kennis", + "New Model": "Nieuw model", + "New Note": "Nieuwe notitie", + "New Prompt": "Nieuwe prompt", + "Generated Image": "Gegenereerde afbeelding", + "Generated images will appear here": "Gegenereerde afbeeldingen verschijnen hier", "Followed instructions perfectly": "Volgde instructies perfect", - "for placeholders": "", - "Force OCR": "", - "Force OCR on all pages of the PDF. This can lead to worse results if you have good text in your PDFs. Defaults to False.": "", - "Forge new paths": "Smeed nieuwe paden", + "Forge new paths": "Baan nieuwe paden", "Form": "Formulier", - "Format Lines": "", - "Format the lines in the output. Defaults to False. If set to True, the lines will be formatted to detect inline math and styles.": "", - "Formatting may be inconsistent from source.": "", - "Forward": "", - "Forwards system user OAuth access token to authenticate": "", - "Forwards system user session credentials to authenticate": "", - "Fr_day_of_week": "", + "Fr_day_of_week": "vr", "Full Context Mode": "Volledige contextmodus", "Function": "Functie", "Function Calling": "Functieaanroep", @@ -1001,274 +1015,272 @@ "Function deleted successfully": "Functie succesvol verwijderd", "Function Description": "Functiebeschrijving", "Function ID": "Functie-ID", - "Function imported successfully": "", + "Function imported successfully": "Functie succesvol geimporteerd", "Function is now globally disabled": "Functie is nu globaal uitgeschakeld", "Function is now globally enabled": "Functie is nu globaal ingeschakeld", "Function Name": "Functienaam", - "Function Name Filter List": "", + "Function Name Filter List": "Filterlijst voor functienamen", "Function updated successfully": "Functienaam succesvol aangepast", "Functions": "Functies", "Functions allow arbitrary code execution.": "Functies staan willekeurige code-uitvoering toe", "Functions imported successfully": "Functies succesvol geïmporteerd", "Gemini": "Gemini", - "Gemini API Key": "", + "Gemini API Key": "Gemini API-sleutel", "Gemini API Key is required.": "Gemini API-sleutel is vereisd", - "Gemini Base URL": "", - "Gemini Endpoint Method": "", - "Gender": "", + "Gemini Base URL": "Gemini basis-URL", + "Gemini Endpoint Method": "Gemini endpointmethode", + "Gender": "Geslacht", "General": "Algemeen", - "Generate": "", + "Generate": "Genereren", "Generate an image": "Genereer een afbeelding", - "Generate and edit images": "", - "Generate Message Pair": "", - "Generated Image": "", - "Generated images will appear here": "", + "Generate and edit images": "Afbeeldingen genereren en bewerken", + "Generate Message Pair": "Berichtenpaar genereren", "Generating search query": "Zoekopdracht genereren", - "Generating...": "", - "Get current time and perform date/time calculations": "", - "Get information on {{name}} in the UI": "", + "Generating...": "Genereren...", + "Get current time and perform date/time calculations": "Haal de huidige tijd op en voer datum-/tijdberekeningen uit", + "Get information on {{name}} in the UI": "Haal informatie op over {{name}} in de UI", "Get started": "Begin", "Get started with {{WEBUI_NAME}}": "Begin met {{WEBUI_NAME}}", "Global": "Globaal", "Good Response": "Goed antwoord", - "Google": "", + "Google": "Google", "Google Drive": "Google Drive", "Google PSE API Key": "Google PSE API-sleutel", "Google PSE Engine Id": "Google PSE-engine-ID", - "Gravatar": "", - "Grid": "", - "Grokipedia": "", - "Group Channel": "", + "Gravatar": "Gravatar", + "Grid": "Raster", + "Grokipedia": "Grokipedia", + "Group Channel": "Groepskanaal", "Group created successfully": "Groep succesvol aangemaakt", "Group deleted successfully": "Groep succesvol verwijderd", "Group Description": "Groepsbeschrijving", "Group Name": "Groepsnaam", "Group updated successfully": "Groep succesvol bijgewerkt", - "groups": "", + "groups": "groepen", "Groups": "Groepen", - "H1": "", - "H2": "", - "H3": "", + "H1": "H1", + "H2": "H2", + "H3": "H3", "Haptic Feedback": "Haptische feedback", - "Headers": "", - "Headers must be a valid JSON object": "", - "Height": "", + "Headers": "headers", + "Headers must be a valid JSON object": "Headers moeten een geldig JSON-object zijn", + "Height": "Hoogte", "Hello, {{name}}": "Hallo, {{name}}", "Help": "Help", - "Help the community discover great models": "", + "Help the community discover great models": "Help de community geweldige modellen te ontdekken", "Hex Color": "Hex-kleur", "Hex Color - Leave empty for default color": "Hex-kleur - laat leeg voor standaardkleur", - "Hidden": "", + "Hidden": "Verborgen", "Hide": "Verberg", - "Hide All": "", - "Hide from Sidebar": "", + "Hide All": "Verberg alles", + "Hide from Sidebar": "Verberg in zijbalk", "Hide Model": "Verberg model", - "High": "", - "High Contrast Mode": "", - "History": "", + "High": "Hoog", + "High Contrast Mode": "Hoog contrastmodus", + "History": "Geschiedenis", "Home": "Thuis", "Host": "Host", - "Hourly": "", - "Hourly Messages": "", + "Hourly": "Per uur", + "Hourly Messages": "Berichten per uur", "How can I help you today?": "Hoe kan ik je vandaag helpen?", "How would you rate this response?": "Hoe zou je dit antwoord beoordelen?", - "HTML": "", - "http://localhost:8000": "", - "https://mineru.net/api/v4": "", + "HTML": "HTML", + "http://localhost:8000": "http://localhost:8000", + "https://mineru.net/api/v4": "https://mineru.net/api/v4", "Hybrid Search": "Hybride Zoeken", "I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Ik bevestig dat ik de implicaties van mijn actie heb gelezen en begrepen. Ik ben me bewust van de risico's die gepaard gaan met het uitvoeren van willekeurige code en ik heb de betrouwbaarheid van de bron gecontroleerd.", "ID": "ID", - "ID cannot contain \":\" or \"|\" characters": "", - "ID copied to clipboard": "", - "Idle Timeout": "", - "iframe Sandbox Allow Forms": "", - "iframe Sandbox Allow Same Origin": "", + "ID cannot contain \":\" or \"|\" characters": "ID mag geen tekens \":\" of \"|\" bevatten", + "ID copied to clipboard": "ID gekopieerd naar klembord", + "Idle Timeout": "Inactiviteitstime-out", + "iframe Sandbox Allow Forms": "iframe-sandbox formulieren toestaan", + "iframe Sandbox Allow Same Origin": "iframe-sandbox zelfde oorsprong toestaan", "Ignite curiosity": "Wakker nieuwsgierigheid aan", "Image": "Afbeelding", "Image Compression": "Afbeeldingscompressie", - "Image Compression Height": "", - "Image Compression Width": "", - "Image Edit": "", - "Image Edit Engine": "", + "Image Compression Height": "Hoogte afbeeldingscompressie", + "Image Compression Width": "Breedte afbeeldingscompressie", + "Image Edit": "Afbeelding bewerken", + "Image Edit Engine": "Engine voor afbeeldingsbewerking", "Image Generation": "Afbeeldingsgeneratie", "Image Generation Engine": "Afbeeldingsgeneratie Engine", "Image Max Compression Size": "Maximale afbeeldingscompressiegrootte", - "Image Max Compression Size height": "", - "Image Max Compression Size width": "", + "Image Max Compression Size height": "Maximale afbeeldingscompressiegrootte hoogte", + "Image Max Compression Size width": "Maximale afbeeldingscompressiegrootte breedte", "Image Prompt Generation": "Afbeeldingspromptgeneratie", "Image Prompt Generation Prompt": "Afbeeldingspromptgeneratie prompt", - "Image Size": "", - "Images": "", - "Import": "", + "Image Size": "Afbeeldingsgrootte", + "Images": "Afbeeldingen", + "Import": "Importeren", "Import Chats": "Importeer Chats", - "Import Config": "", - "Import From Link": "", - "Import Models": "", - "Import Prompts": "", - "Import successful": "", - "Import Tools": "", + "Import Config": "Configuratie importeren", + "Import From Link": "Importeren via link", + "Import Models": "Modellen importeren", + "Import Prompts": "Prompts importeren", + "Import successful": "Importeren geslaagd", + "Import Tools": "Tools importeren", "Important Update": "Belangrijke update", - "Inactive": "", + "Inactive": "Inactief", "Include": "Voeg toe", - "Include `--api-auth` flag when running stable-diffusion-webui": "Voeg '--api-auth` toe bij het uitvoeren van stable-diffusion-webui", + "Include `--api-auth` flag when running stable-diffusion-webui": "Voeg de `--api-auth`-vlag toe bij het uitvoeren van stable-diffusion-webui", "Include `--api` flag when running stable-diffusion-webui": "Voeg `--api` vlag toe bij het uitvoeren van stable-diffusion-webui", "Includes SharePoint": "Inclusief SharePoint", - "Increase UI Scale": "", + "Increase UI Scale": "UI-schaal vergroten", "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "Beïnvloedt hoe snel het algoritme reageert op feedback van de gegenereerde tekst. Een lagere leersnelheid resulteert in langzamere aanpassingen, terwijl een hogere leersnelheid het algoritme responsiever maakt.", "Info": "Info", - "Initials": "", - "Inject file content into conversation context": "", + "Initials": "Initialen", + "Inject file content into conversation context": "Bestandsinhoud in gesprekscontext injecteren", "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Injecteer de volledige inhoud als context voor uitgebreide verwerking, dit wordt aanbevolen voor complexe query's.", - "Input": "", - "Input Key (e.g. text, unet_name, steps)": "", - "Input Variables": "", - "Insert": "", - "Insert Follow-Up Prompt to Input": "", - "Insert Prompt as Rich Text": "", - "Insert Suggestion Prompt to Input": "", + "Input": "Invoer", + "Input Key (e.g. text, unet_name, steps)": "Invoersleutel (bijv. text, unet_name, steps)", + "Input Variables": "Invoervariabelen", + "Insert": "Invoegen", + "Insert Follow-Up Prompt to Input": "Vervolgprompt in invoer invoegen", + "Insert Prompt as Rich Text": "Prompt als rich text invoegen", + "Insert Suggestion Prompt to Input": "Suggestieprompt in invoer invoegen", "Install from Github URL": "Installeren vanaf Github-URL", "Instant Auto-Send After Voice Transcription": "Direct automatisch verzenden na spraaktranscriptie", - "Instructions": "", + "Instructions": "Instructies", "Integration": "Integratie", - "Integrations": "", + "Integrations": "Integraties", "Interface": "Interface", - "Interface Settings Access": "", - "Invalid file content": "", + "Interface Settings Access": "Toegang tot interface-instellingen", + "Invalid file content": "Ongeldige bestandsinhoud", "Invalid file format.": "Ongeldig bestandsformaat", - "Invalid JSON file": "", - "Invalid JSON format for ComfyUI Edit Workflow.": "", - "Invalid JSON format for ComfyUI Workflow.": "", - "Invalid JSON format for Parameters": "", - "Invalid JSON format in {{NAME}}": "", - "Invalid JSON format in Additional Config": "", - "Invalid JSON format in MinerU Parameters": "", + "Invalid JSON file": "Ongeldig JSON-bestand", + "Invalid JSON format for ComfyUI Edit Workflow.": "Ongeldig JSON-formaat voor ComfyUI Edit Workflow.", + "Invalid JSON format for ComfyUI Workflow.": "Ongeldig JSON-formaat voor ComfyUI Workflow.", + "Invalid JSON format for Parameters": "Ongeldig JSON-formaat voor parameters", + "Invalid JSON format in {{NAME}}": "Ongeldig JSON-formaat in {{NAME}}", + "Invalid JSON format in Additional Config": "Ongeldig JSON-formaat in aanvullende configuratie", + "Invalid JSON format in MinerU Parameters": "Ongeldig JSON-formaat in MinerU-parameters", "is typing...": "is aan het schrijven...", - "Italic": "", - "January": "Januari", - "Jina API Base URL": "", + "Italic": "Cursief", + "January": "januari", + "Jina API Base URL": "Jina API-basis-URL", "Jina API Key": "Jina API-sleutel", - "join our Discord for help.": "join onze Discord voor hulp.", + "join our Discord for help.": "word lid van onze Discord voor hulp.", "JSON": "JSON", "JSON Preview": "JSON-voorbeeld", - "JSON Spec": "", - "July": "Juli", - "June": "Juni", + "JSON Spec": "JSON-specificatie", + "July": "juli", + "June": "juni", "Jupyter Auth": "Jupyter Auth", "Jupyter URL": "Jupyter URL", "JWT Expiration": "JWT Expiration", "JWT Token": "JWT Token", "Kagi Search API Key": "Kagi Search API-sleutel", - "Keep Follow-Up Prompts in Chat": "", - "Keep in Sidebar": "", + "Keep Follow-Up Prompts in Chat": "Vervolgprompts in chat houden", + "Keep in Sidebar": "In zijbalk houden", "Key": "Sleutel", - "Key is required": "", - "Keyboard shortcuts": "Toetsenbord snelkoppelingen", - "Keyboard Shortcuts": "", + "Key is required": "Sleutel is vereist", + "Keyboard shortcuts": "Toetsenbordsnelkoppelingen", + "Keyboard Shortcuts": "Toetsenbordsnelkoppelingen", "Knowledge": "Kennis", "Knowledge Access": "Kennistoegang", - "Knowledge Base": "", + "Knowledge Base": "Kennisbank", "Knowledge created successfully.": "Kennis succesvol aangemaakt", "Knowledge deleted successfully.": "Kennis succesvol verwijderd", - "Knowledge Description": "", - "Knowledge exported successfully": "", - "Knowledge Name": "", + "Knowledge Description": "Kennisbeschrijving", + "Knowledge exported successfully": "Kennis succesvol geexporteerd", + "Knowledge Name": "Kennisnaam", "Knowledge Public Sharing": "Publieke kennisdeling", "Knowledge reset successfully.": "Kennis succesvol gereset", - "Knowledge Sharing": "", + "Knowledge Sharing": "Kennisdeling", "Knowledge updated successfully": "Kennis succesvol bijgewerkt", "Kokoro.js (Browser)": "Kokoro.js (Browser)", "Kokoro.js Dtype": "Kokoro.js Dtype", "Label": "Label", "Landing Page Mode": "Landingspaginamodus", "Language": "Taal", - "Language Locales": "", - "Last 24 hours": "", - "Last 30 days": "", - "Last 7 days": "", - "Last 90 days": "", + "Language Locales": "Taallocaties", + "Last 24 hours": "Laatste 24 uur", + "Last 30 days": "Laatste 30 dagen", + "Last 7 days": "Laatste 7 dagen", + "Last 90 days": "Laatste 90 dagen", "Last Active": "Laatst Actief", "Last Modified": "Laatst aangepast", - "Last ran": "", + "Last ran": "Laatst uitgevoerd", "Last reply": "Laatste antwoord", "LDAP": "LDAP", "LDAP server updated": "LDAP-server bijgewerkt", "Leaderboard": "Klassement", - "Learn more": "", - "Learn More": "", - "Learn more about Open Terminal": "", - "Learn more about OpenAPI tool servers.": "", - "Learn more about Voxtral transcription.": "", - "Leave a public review for {{modelName}}": "", - "Leave empty for no compression": "", + "Learn more": "Meer informatie", + "Learn More": "Meer informatie", + "Learn more about Open Terminal": "Meer informatie over Open Terminal", + "Learn more about OpenAPI tool servers.": "Meer informatie over OpenAPI-toolservers.", + "Learn more about Voxtral transcription.": "Meer informatie over Voxtral-transcriptie.", + "Leave a public review for {{modelName}}": "Laat een openbare beoordeling achter voor {{modelName}}", + "Leave empty for no compression": "Laat leeg voor geen compressie", "Leave empty for unlimited": "Laat leeg voor ongelimiteerd", - "Leave empty to include all models from \"{{url}}\" endpoint": "", + "Leave empty to include all models from \"{{url}}\" endpoint": "Laat leeg om alle modellen van het \"{{url}}\"-endpoint mee te nemen", "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "Laat leeg om alle modellen van het \"{{url}}/api/tags\"-endpoint mee te nemen", "Leave empty to include all models from \"{{url}}/models\" endpoint": "Laat leeg om alle modellen van \"{{url}}/models\"-endpoint mee te nemen", "Leave empty to include all models or select specific models": "Laat leeg om alle modellen mee te nemen, of selecteer specifieke modellen", - "Leave empty to use first admin user": "", - "Leave empty to use the default config, or enter a valid json (see https://yandex.cloud/en/docs/search-api/api-ref/WebSearch/search#yandex.cloud.searchapi.v2.WebSearchRequest)": "", - "Leave empty to use the default model (voxtral-mini-latest).": "", + "Leave empty to use first admin user": "Laat leeg om de eerste beheerder te gebruiken", + "Leave empty to use the default config, or enter a valid json (see https://yandex.cloud/en/docs/search-api/api-ref/WebSearch/search#yandex.cloud.searchapi.v2.WebSearchRequest)": "Laat leeg om de standaardconfiguratie te gebruiken, of voer geldige json in (zie https://yandex.cloud/en/docs/search-api/api-ref/WebSearch/search#yandex.cloud.searchapi.v2.WebSearchRequest)", + "Leave empty to use the default model (voxtral-mini-latest).": "Laat leeg om het standaardmodel te gebruiken (voxtral-mini-latest).", "Leave empty to use the default prompt, or enter a custom prompt": "Laat leeg om de standaard prompt te gebruiken, of selecteer een aangepaste prompt", "Leave model field empty to use the default model.": "Laat modelveld leeg om het standaardmodel te gebruiken.", - "Legacy": "", - "lexical": "", + "Legacy": "Legacy", + "lexical": "lexicaal", "License": "Licentie", - "Lift List": "", + "Lift List": "Lift-lijst", "Light": "Licht", - "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "", - "Limits the number of concurrent embedding requests. Set to 0 for unlimited.": "", - "List": "", - "List calendars, search, create, update, and delete calendar events": "", + "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "Beperk gelijktijdige zoekopdrachten. 0 = onbeperkt (standaard). Stel in op 1 voor sequentiele uitvoering (aanbevolen voor API's met strikte rate limits, zoals Brave free tier).", + "Limits the number of concurrent embedding requests. Set to 0 for unlimited.": "Beperkt het aantal gelijktijdige embeddingverzoeken. Stel in op 0 voor onbeperkt.", + "List": "Lijst", + "List calendars, search, create, update, and delete calendar events": "Agenda's weergeven, zoeken, maken, bijwerken en agenda-afspraken verwijderen", "Listening...": "Aan het luisteren...", - "Live": "", + "Live": "Live", "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "LLMs kunnen fouten maken. Verifieer belangrijke informatie.", "Loader": "Lader", "Loading Kokoro.js...": "Kokoro.js aan het laden", "Loading...": "...", - "local": "", + "local": "lokaal", "Local": "Lokaal", - "Local Task Model": "", - "Location": "", + "Local Task Model": "Lokaal taakmodel", + "Location": "Locatie", "Location access not allowed": "Locatietoegang niet toegestaan", "Lost": "Verloren", - "Low": "", + "Low": "Laag", "LTR": "LNR", "Made by Open WebUI Community": "Gemaakt door OpenWebUI Community", - "Make password visible in the user interface": "", + "Make password visible in the user interface": "Maak wachtwoord zichtbaar in de gebruikersinterface", "Make sure to export a workflow.json file as API format from ComfyUI.": "Zorg ervoor dat je een workflow.json-bestand als API-formaat exporteert vanuit ComfyUI.", - "Male": "", + "Male": "Man", "Manage": "Beheren", - "Manage Connections": "", + "Manage Connections": "Verbindingen beheren", "Manage Direct Connections": "Beheer directe verbindingen", - "Manage Files": "", + "Manage Files": "Bestanden beheren", "Manage Models": "Beheer modellen", "Manage Ollama": "Beheer Ollama", "Manage Ollama API Connections": "Beheer Ollama API-verbindingen", "Manage OpenAI API Connections": "Beheer OpenAI API-verbindingen", "Manage Pipelines": "Pijplijnen beheren", "Manage Tool Servers": "Beheer gereedschapservers", - "Manage your account information.": "", - "March": "Maart", - "Markdown": "", - "Markdown Header Text Splitter": "", - "Max Speakers": "", + "Manage your account information.": "Beheer je accountinformatie.", + "March": "maart", + "Markdown": "Markdown", + "Markdown Header Text Splitter": "Markdown-koptekstsplitser", + "Max Speakers": "Maximale sprekers", "Max Upload Count": "Maximale Uploadhoeveelheid", "Max Upload Size": "Maximale Uploadgrootte", - "Maximum characters to return from fetched URLs. Leave empty for no limit.": "", - "Maximum number of files allowed per folder.": "", - "Maximum number of files per folder is {{max}}.": "", + "Maximum characters to return from fetched URLs. Leave empty for no limit.": "Maximaal aantal tekens dat wordt teruggegeven uit opgehaalde URL's. Laat leeg voor geen limiet.", + "Maximum number of files allowed per folder.": "Maximaal aantal toegestane bestanden per map.", + "Maximum number of files per folder is {{max}}.": "Maximum aantal bestanden per map is {{max}}.", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maximaal 3 modellen kunnen tegelijkertijd worden gedownload. Probeer het later opnieuw.", + "MBR": "MBR", + "MCP": "MCP", + "MCP support is experimental and its specification changes often, which can lead to incompatibilities. OpenAPI specification support is directly maintained by the Open WebUI team, making it the more reliable option for compatibility.": "MCP-ondersteuning is experimenteel en de specificatie verandert vaak, wat tot incompatibiliteiten kan leiden. Ondersteuning voor de OpenAPI-specificatie wordt direct onderhouden door het Open WebUI-team, waardoor dit de betrouwbaardere optie voor compatibiliteit is.", + "Medium": "Gemiddeld", + "Member removed successfully": "Lid succesvol verwijderd", + "members": "leden", + "Members": "Leden", "May": "Mei", - "MBR": "", - "MCP": "", - "MCP support is experimental and its specification changes often, which can lead to incompatibilities. OpenAPI specification support is directly maintained by the Open WebUI team, making it the more reliable option for compatibility.": "", - "Medium": "", - "Member removed successfully": "", - "members": "", - "Members": "", - "Members added successfully": "", - "Memories": "", + "Members added successfully": "Leden succesvol toegevoegd", + "Memories": "Geheugen", "Memories accessible by LLMs will be shown here.": "Geheugen toegankelijk voor LLMs wordt hier getoond.", "Memory": "Geheugen", "Memory added successfully": "Geheugen succesvol toegevoegd", @@ -1277,410 +1289,398 @@ "Memory updated successfully": "Geheugen succesvol bijgewerkt", "Merge Responses": "Voeg antwoorden samen", "Merged Response": "Samengevoegd antwoord", - "Message": "", - "Message counts and response timestamps": "", - "Message counts are based on assistant responses.": "", + "Message": "Bericht", + "Message counts and response timestamps": "Berichtaantallen en tijdstempels van reacties", + "Message counts are based on assistant responses.": "Berichtaantallen zijn gebaseerd op reacties van de assistent.", "Message rating should be enabled to use this feature": "Berichtbeoordeling moet ingeschakeld zijn om deze functie te gebruiken", - "messages": "", - "Messages": "", + "messages": "berichten", + "Messages": "Berichten", "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Berichten die je verzendt nadat je jouw link hebt gemaakt, worden niet gedeeld. Gebruikers met de URL kunnen de gedeelde chat bekijken.", - "Microsoft OneDrive": "", - "Microsoft OneDrive (personal)": "", - "Microsoft OneDrive (work/school)": "", - "min": "", - "MinerU": "", - "MinerU API Key required for Cloud API mode.": "", - "Mistral OCR": "", - "Mistral OCR API Key required.": "", - "MistralAI": "", - "Mo_day_of_week": "", + "Microsoft OneDrive": "Microsoft OneDrive", + "Microsoft OneDrive (personal)": "Microsoft OneDrive (persoonlijk)", + "Microsoft OneDrive (work/school)": "Microsoft OneDrive (werk/opleiding)", + "min": "min", + "MinerU": "MinerU", + "MinerU API Key required for Cloud API mode.": "MinerU API-sleutel vereist voor Cloud API-modus.", + "Mistral OCR": "Mistral OCR", + "Mistral OCR API Key required.": "Mistral OCR API-sleutel vereist.", + "MistralAI": "MistralAI", + "Mo_day_of_week": "ma", "Model": "Model", "Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' is succesvol gedownload.", "Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' staat al in de wachtrij voor downloaden.", - "Model {{modelId}} not found": "", - "Model {{modelName}} deleted successfully": "", + "Model {{modelId}} not found": "Model {{modelId}} niet gevonden", + "Model {{modelName}} deleted successfully": "Model {{modelName}} is succesvol verwijderd", "Model {{modelName}} is not vision capable": "Model {{modelName}} is niet geschikt voor visie", "Model {{name}} is now {{status}}": "Model {{name}} is nu {{status}}", - "Model {{name}} is now hidden": "Model {{naam}} is nu verborgen", - "Model {{name}} is now visible": "Model {{naam}} is nu zichtbaar", - "Model accepts file inputs": "", + "Model {{name}} is now hidden": "Model {{name}} is nu verborgen", + "Model {{name}} is now visible": "Model {{name}} is nu zichtbaar", "Model accepts image inputs": "Model accepteerd afbeeldingsinvoer", - "Model can access Open Terminal for command execution and file management": "", - "Model can execute code and perform calculations": "", - "Model can generate images based on text prompts": "", - "Model can search the web for information": "", - "Model Capabilities": "", + "Model can access Open Terminal for command execution and file management": "Model heeft toegang tot Open Terminal voor uitvoeren van opdrachten en bestandsbeheer", "Model created successfully!": "Model succesvol gecreëerd", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Model filesystem path gedetecteerd. Model shortname is vereist voor update, kan niet doorgaan.", "Model Filtering": "Modelfiltratie", "Model ID": "Model-ID", - "Model ID is required.": "", + "Model ID is required.": "Model-ID is vereist", "Model IDs": "Model-IDs", "Model Name": "Modelnaam", - "Model name already exists, please choose a different one": "", - "Model Name is required.": "", - "Model names and usage frequency": "", - "Model not found": "", + "Model name already exists, please choose a different one": "Modelnaam bestaat al, kies een andere", + "Model Name is required.": "Modelnaam is vereist", + "Model names and usage frequency": "Modelnamen en gebruiksfrequentie", + "Model not found": "Model niet gevonden", "Model not selected": "Model niet geselecteerd", - "Model Parameters": "", + "Model Parameters": "Modelparameters", "Model Params": "Modelparams", "Model Permissions": "Modeltoestemmingen", - "Model responses or outputs": "", - "Model unloaded successfully": "", + "Model responses or outputs": "Modelantwoorden of uitvoer", + "Model unloaded successfully": "Model succesvol ontladen", "Model updated successfully": "Model succesvol bijgewerkt", - "Model Usage": "", - "Model(s) do not support file upload": "", + "Model Usage": "Modelgebruik", + "Model(s) do not support file upload": "Model(len) ondersteunen geen bestandsupload", "Modelfile Content": "Modelfile-inhoud", "Models": "Modellen", "Models Access": "Modellentoegang", "Models configuration saved successfully": "Modellenconfiguratie succesvol opgeslagen", - "Models imported successfully": "", + "Models imported successfully": "Modellen succesvol geimporteerd", "Models Public Sharing": "Modellen publiek delen", - "Models Sharing": "", - "Mojeek": "", + "Models Sharing": "Modellen delen", + "Mojeek": "Mojeek", "Mojeek Search API Key": "Mojeek Search API-sleutel", - "Month": "", - "Monthly": "", + "Month": "Maand", + "Monthly": "Maandelijks", "More": "Meer", - "More Concise": "", - "More options": "", - "More Options": "", - "Move": "", - "Moved {{name}}": "", - "My Terminal": "", + "More Concise": "Meer beknopt", + "More options": "Meer opties", + "More Options": "Meer opties", + "Move": "Verplaatsen", + "Moved {{name}}": "{{name}} verplaatst", + "My Terminal": "Mijn terminal", "Name": "Naam", - "Name and ID are required, please fill them out": "", + "Name and ID are required, please fill them out": "Naam en ID zijn vereist, vul deze in", "Name your knowledge base": "Geef je kennisbasis een naam", - "Name, prompt, and model are required": "", + "Name, prompt, and model are required": "Naam, prompt en model zijn verplicht", "Native": "Native", - "Never": "", - "New": "", - "New Automation": "", - "New Button": "", + "New": "Nieuw", + "New Button": "Nieuwe knop", "New Chat": "Nieuwe Chat", - "New Event": "", - "New File": "", + "Never": "Nooit", + "New Automation": "Nieuwe automatisering", + "New Event": "Nieuwe gebeurtenis", "New Folder": "Nieuwe map", - "New Function": "", - "New Group": "", - "New Knowledge": "", - "New Model": "", - "New Note": "", "New Password": "Nieuw Wachtwoord", - "New Prompt": "", - "New Skill": "", - "New Temporary Chat": "", - "New Terminal": "", - "New Tool": "", - "New Webhook": "", + "New Skill": "Nieuwe vaardigheid", + "New Temporary Chat": "Nieuwe tijdelijke chat", + "New Terminal": "Nieuwe terminal", + "New Tool": "Nieuwe tool", + "New Webhook": "Nieuwe webhook", "new-channel": "nieuw-kanaal", - "Next message": "", - "Next run": "", - "No access grants. Private to you.": "", - "No activity data": "", - "No authentication": "", - "No automations found": "", - "No chats found": "", - "No chats found for this user.": "", - "No chats found.": "", - "No content": "", + "Next message": "Volgend bericht", + "No access grants. Private to you.": "Geen toegangsrechten. Alleen privé voor jou.", + "No activity data": "Geen activiteitsgegevens", + "No authentication": "Geen authenticatie", + "No chats found": "Geen chats gevonden", + "No chats found for this user.": "Geen chats gevonden voor deze gebruiker.", + "No chats found.": "Geen chats gevonden.", + "No content": "Geen inhoud", + "Next run": "Volgende uitvoering", + "No automations found": "Geen automatiseringen gevonden", "No content found": "Geen content gevonden", "No content to speak": "Geen inhoud om over te spreken", - "No conversation to save": "", - "No data": "", - "No data found": "", + "No conversation to save": "Geen gesprek om op te slaan", + "No data": "Geen gegevens", + "No data found": "Geen gegevens gevonden", "No distance available": "Geen afstand beschikbaar", - "No execution logs available yet": "", - "No expiration can pose security risks.": "", - "No feedback found": "", + "No expiration can pose security risks.": "Geen vervaldatum kan veiligheidsrisico's opleveren.", + "No feedback found": "Geen feedback gevonden", + "No execution logs available yet": "Geen uitvoerlogs beschikbaar", "No file selected": "Geen bestand geselecteerd", - "No files found": "", - "No files in this knowledge base.": "", - "No files yet. Upload files or run Python code to create them.": "", - "No functions found": "", - "No groups found": "", - "No history available": "", + "No files found": "Geen bestanden gevonden", + "No files in this knowledge base.": "Geen bestanden in deze kennisbank.", + "No files yet. Upload files or run Python code to create them.": "Nog geen bestanden. Upload bestanden of voer Python-code uit om ze te maken.", + "No functions found": "Geen functies gevonden", + "No groups found": "Geen groepen gevonden", + "No history available": "Geen geschiedenis beschikbaar", "No HTML, CSS, or JavaScript content found.": "Geen HTML, CSS, of JavaScript inhoud gevonden", "No inference engine with management support found": "Geen inferentie-engine met beheerondersteuning gevonden", - "No kernel": "", - "No knowledge bases found.": "", + "No kernel": "Geen kernel", + "No knowledge bases found.": "Geen kennisbanken gevonden.", "No knowledge found": "Geen kennis gevonden", - "No limit": "", + "No limit": "Geen limiet", "No memories to clear": "Geen herinneringen om op te ruimen", "No model IDs": "Geen model-ID's", - "No models available": "", + "No models available": "Geen modellen beschikbaar", "No models found": "Geen modellen gevonden", "No models selected": "Geen modellen geselecteerd", - "No Notes": "", - "No notes found": "", - "No one": "", - "No pinned messages": "", - "No prompts found": "", + "No Notes": "Geen notities", + "No notes found": "Geen notities gevonden", + "No one": "Niemand", + "No pinned messages": "Geen vastgemaakte berichten", + "No prompts found": "Geen prompts gevonden", "No results": "Geen resultaten gevonden", "No results found": "Geen resultaten gevonden", "No search query generated": "Geen zoekopdracht gegenereerd", - "No servers detected": "", - "No skills found": "", + "No servers detected": "Geen servers gedetecteerd", + "No skills found": "Geen vaardigheden gevonden", "No source available": "Geen bron beschikbaar", - "No sources found": "", + "No sources found": "Geen bronnen gevonden", "No suggestion prompts": "Geen voorgestelde prompts", - "No Terminal connection configured.": "", - "No terminal connections configured.": "", - "No tool server connections configured.": "", - "No tools found": "", + "No Terminal connection configured.": "Geen terminalverbinding geconfigureerd.", + "No terminal connections configured.": "Geen terminalverbindingen geconfigureerd.", + "No tool server connections configured.": "Geen toolserververbindingen geconfigureerd.", + "No tools found": "Geen tools gevonden", "No users were found.": "Geen gebruikers gevonden", - "No valves": "", + "No valves": "Geen kleppen", "No valves to update": "Geen kleppen om bij te werken", - "No webhooks yet": "", - "Node Ids": "", + "No webhooks yet": "Nog geen webhooks", + "Node Ids": "Node-ID's", "None": "Geen", "Not factually correct": "Niet feitelijk juist", "Not helpful": "Niet nuttig", - "Not Registered": "", - "Not scheduled": "", - "Note": "", - "Note deleted successfully": "", + "Not Registered": "Niet geregistreerd", + "Note": "Notitie", + "Note deleted successfully": "Notitie succesvol verwijderd", + "Not scheduled": "Niet ingepland", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Opmerking: Als je een minimumscore instelt, levert de zoekopdracht alleen documenten op met een score groter dan of gelijk aan de minimumscore.", "Notes": "Aantekeningen", - "Notes Public Sharing": "", - "Notes Sharing": "", + "Notes Public Sharing": "Openbaar delen van notities", + "Notes Sharing": "Notities delen", "Notification Sound": "Notificatiegeluid", "Notification Webhook": "Notificatie-webhook", "Notifications": "Notificaties", - "November": "November", - "OAuth": "", - "OAuth 2.1": "", - "OAuth 2.1 (Static)": "", + "November": "november", + "OAuth": "OAuth", + "OAuth 2.1": "OAuth 2.1", + "OAuth 2.1 (Static)": "OAuth 2.1 (Statisch)", "OAuth ID": "OAuth ID", - "October": "Oktober", + "October": "oktober", "Off": "Uit", "Okay, Let's Go!": "Oké, laten we gaan!", "OLED Dark": "OLED Donker", "Ollama": "Ollama", "Ollama API": "Ollama API", "Ollama API settings updated": "Ollama API-instellingen bijgewerkt", - "Ollama Cloud API Key": "", + "Ollama Cloud API Key": "Ollama Cloud API-sleutel", "Ollama Version": "Ollama Versie", "On": "Aan", - "Once": "", + "Once": "Eenmalig", "OneDrive": "OneDrive", - "Only active when \"Paste Large Text as File\" setting is toggled on.": "", - "Only active when the chat input is in focus and an LLM is generating a response.": "", - "Only active when the chat input is in focus.": "", + "Only active when \"Paste Large Text as File\" setting is toggled on.": "Alleen actief wanneer de instelling \"Grote tekst als bestand plakken\" is ingeschakeld.", + "Only active when the chat input is in focus and an LLM is generating a response.": "Alleen actief wanneer de chatinvoer focus heeft en een LLM een antwoord genereert.", + "Only active when the chat input is in focus.": "Alleen actief wanneer de chatinvoer focus heeft.", "Only alphanumeric characters and hyphens are allowed": "Alleen alfanumerieke tekens en koppeltekens zijn toegestaan", "Only alphanumeric characters and hyphens are allowed in the command string.": "Alleen alfanumerieke karakters en streepjes zijn toegestaan in de commando string.", - "Only can be triggered when the chat input is in focus.": "", + "Only can be triggered when the chat input is in focus.": "Kan alleen worden geactiveerd wanneer de chatinvoer focus heeft.", "Only collections can be edited, create a new knowledge base to edit/add documents.": "Alleen verzamelinge kunnen gewijzigd worden, maak een nieuwe kennisbank aan om bestanden aan te passen/toe te voegen", - "Only invited users can access": "", - "Only markdown files are allowed": "", + "Only invited users can access": "Alleen uitgenodigde gebruikers hebben toegang", + "Only markdown files are allowed": "Alleen markdown-bestanden zijn toegestaan", "Only select users and groups with permission can access": "Alleen geselecteerde gebruikers en groepen met toestemming hebben toegang", - "Only sync new/updated chats": "", + "Only sync new/updated chats": "Alleen nieuwe/bijgewerkte chats synchroniseren", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Oeps! Het lijkt erop dat de URL ongeldig is. Controleer het nogmaals en probeer opnieuw.", "Oops! There are files still uploading. Please wait for the upload to complete.": "Oeps! Er zijn nog bestanden aan het uploaden. Wacht tot het uploaden voltooid is.", "Oops! There was an error in the previous response.": "Oeps! Er was een fout in de vorige reactie.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oeps! Je gebruikt een niet-ondersteunde methode (alleen frontend). Serveer de WebUI vanuit de backend.", "Open file": "Open bestand", "Open in full screen": "Open in volledig scherm", - "Open in new tab": "", - "Open link": "", - "Open modal to configure connection": "", - "Open Modal To Manage Floating Quick Actions": "", - "Open Modal To Manage Image Compression": "", - "Open Model Selector": "", - "Open Settings": "", - "Open Sidebar": "", - "Open Terminal": "", - "Open User Profile Menu": "", - "Open WebUI can use tools provided by any OpenAPI server.": "", + "Open in new tab": "Openen in nieuw tabblad", + "Open link": "Link openen", + "Open modal to configure connection": "Open modal om verbinding te configureren", + "Open Modal To Manage Floating Quick Actions": "Open modal om zwevende snelle acties te beheren", + "Open Modal To Manage Image Compression": "Open modal om afbeeldingscompressie te beheren", + "Open Model Selector": "Modelkiezer openen", + "Open Settings": "Instellingen openen", + "Open Sidebar": "Zijbalk openen", + "Open Terminal": "Terminal openen", + "Open User Profile Menu": "Gebruikersprofielmenu openen", + "Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI kan tools gebruiken die door elke OpenAPI-server worden geleverd.", "Open WebUI uses faster-whisper internally.": "Open WebUI gebruikt faster-whisper intern", "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI gebruikt SpeechT5 en CMU Arctic spreker-embeddings", - "Open WebUI version": "", + "Open WebUI version": "Open WebUI-versie", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI versie (v{{OPEN_WEBUI_VERSION}}) is kleiner dan de benodigde versie (v{{REQUIRED_VERSION}})", "OpenAI": "OpenAI", "OpenAI API": "OpenAI API", - "OpenAI API Base URL": "", - "OpenAI API Key": "", + "OpenAI API Base URL": "OpenAI API-basis-URL", + "OpenAI API Key": "OpenAI API-sleutel", "OpenAI API Key is required.": "OpenAI API-sleutel is verplicht", - "OpenAI API settings updated": "OpenAI API-sleutel bijgewerkt", - "OpenAI API Version": "", + "OpenAI API settings updated": "OpenAI API-instellingen bijgewerkt", + "OpenAI API Version": "OpenAI API-versie", "OpenAI URL/Key required.": "OpenAI URL/Sleutel vereist.", - "OpenAPI": "", - "OpenAPI Spec": "", - "openapi.json URL or Path": "", - "optional": "", - "Optional": "", + "OpenAPI": "OpenAPI", + "OpenAPI Spec": "OpenAPI-specificatie", + "openapi.json URL or Path": "openapi.json-URL of pad", + "optional": "optioneel", + "Optional": "Optioneel", "or": "of", - "Ordered List": "", + "Ordered List": "Genummerde lijst", "Other": "Andere", - "out of": "", - "Output": "", + "Output": "Uitvoer", + "out of": "van de", "OUTPUT": "UITVOER", "Output format": "Uitvoerformaat", - "Output Format": "", + "Output Format": "Uitvoerformaat", "Overview": "Overzicht", "page": "pagina", - "Page": "", - "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", - "Paginate": "", - "Parameters": "", - "Parent message not found": "", - "Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.": "", + "Page": "Pagina", + "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "Paginamodus maakt per pagina een document. De enkele modus combineert alle pagina's in één document voor betere chunking over paginagrens heen.", + "Paginate": "Pagineren", + "Parameters": "Parameters", + "Parent message not found": "Bovenliggend bericht niet gevonden", + "Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.": "Neem deel aan communityranglijsten en evaluaties! Het synchroniseren van geaggregeerde gebruiksstatistieken helpt onderzoek en verbeteringen aan Open WebUI te stimuleren. Je privacy staat voorop: er wordt nooit berichtinhoud gedeeld.", "Password": "Wachtwoord", - "Passwords do not match.": "", + "Passwords do not match.": "Wachtwoorden komen niet overeen.", "Paste Large Text as File": "Plak grote tekst als bestand", - "Path copied": "", - "Paused": "", + "Path copied": "Pad gekopieerd", + "Paused": "Gepauzeerd", "PDF document (.pdf)": "PDF document (.pdf)", "PDF Extract Images (OCR)": "PDF extraheer afbeeldingen (OCR)", - "PDF Loader Mode": "", + "PDF Loader Mode": "PDF-loadermodus", "pending": "wachtend", - "Pending": "", - "Pending User Overlay Content": "", - "Pending User Overlay Title": "", + "Pending": "In afwachting", + "Pending User Overlay Content": "Inhoud van overlay voor wachtende gebruiker", + "Pending User Overlay Title": "Titel van overlay voor wachtende gebruiker", "Permission denied when accessing media devices": "Toegang geweigerd bij het toegang krijgen tot media-apparaten", "Permission denied when accessing microphone": "Toegang geweigerd bij toegang tot de microfoon", "Permission denied when accessing microphone: {{error}}": "Toestemming geweigerd bij toegang tot microfoon: {{error}}", "Permissions": "Toestemmingen", "Perplexity API Key": "Perplexity API-sleutel", - "Perplexity Model": "", - "Perplexity Search API URL": "", - "Perplexity Search Context Usage": "", - "Persistent": "", + "Perplexity Model": "Perplexity-model", + "Perplexity Search API URL": "Perplexity Search API-URL", + "Perplexity Search Context Usage": "Gebruik van zoekcontext voor Perplexity", + "Persistent": "Persistent", "Personalization": "Personalisatie", "Pin": "Zet vast", - "Pin to Sidebar": "", + "Pin to Sidebar": "Vastzetten in zijbalk", "Pinned": "Vastgezet", - "Pinned Messages": "", - "Pinned Models": "", + "Pinned Messages": "Vastgemaakte berichten", + "Pinned Models": "Vastgemaakte modellen", "Pioneer insights": "Verken inzichten", - "Pipe": "", + "Pipe": "Pijp", "Pipeline deleted successfully": "Pijpleiding succesvol verwijderd", "Pipeline downloaded successfully": "Pijpleiding succesvol gedownload", - "Pipelines": "", - "Pipelines are a plugin system with arbitrary code execution —": "Pipelines is een plug‑insysteem met willekeurige code‑uitvoering —", + "Pipelines": "Pijplijnen", + "Pipelines are a plugin system with arbitrary code execution —": "Pipelines is een plug-insysteem met willekeurige code‑uitvoering —", "Pipelines Not Detected": "Pijpleiding niet gedetecteerd", "Pipelines Valves": "Pijpleidingen Kleppen", - "Plain text (.md)": "", + "Plain text (.md)": "Platte tekst (.md)", "Plain text (.txt)": "Platte tekst (.txt)", "Playground": "Speeltuin", - "Playwright Timeout (ms)": "", - "Playwright WebSocket URL": "", + "Playwright Timeout (ms)": "Playwright-time-out (ms)", + "Playwright WebSocket URL": "Playwright WebSocket-URL", "Please carefully review the following warnings:": "Beoordeel de volgende waarschuwingen nauwkeurig:", - "Please connect all required integrations before sending a message": "", + "Please connect all required integrations before sending a message": "Verbind eerst alle vereiste integraties voordat je een bericht verzendt", "Please do not close the settings page while loading the model.": "Sluit de instellingenpagina niet terwijl het model geladen wordt.", - "Please enter a message or attach a file.": "", + "Please enter a message or attach a file.": "Voer een bericht in of voeg een bestand toe.", "Please enter a prompt": "Voer een prompt in", - "Please enter a valid ID": "", - "Please enter a valid JSON spec": "", - "Please enter a valid path": "", - "Please enter a valid URL": "", - "Please enter a valid URL.": "", - "Please enter Client ID and Client Secret": "", + "Please enter a valid ID": "Voer een geldige ID in", + "Please enter a valid JSON spec": "Voer een geldige JSON-specificatie in", + "Please enter a valid path": "Voer een geldig pad in", + "Please enter a valid URL": "Voer een geldige URL in", + "Please enter a valid URL.": "Voer een geldige URL in.", + "Please enter Client ID and Client Secret": "Voer Client ID en Client Secret in", "Please fill in all fields.": "Voer alle velden in", - "Please register the OAuth client": "", - "Please save the connection to persist the OAuth client information and do not change the ID": "", + "Please register the OAuth client": "Registreer de OAuth-client", + "Please save the connection to persist the OAuth client information and do not change the ID": "Sla de verbinding op om de OAuth-clientinformatie te bewaren en wijzig de ID niet", "Please select a model first.": "Selecteer eerst een model", "Please select a model.": "Selecteer een model", "Please select a reason": "Voer een reden in", - "Please select a valid JSON file": "", - "Please select at least one user for Direct Message channel.": "", - "Please wait until all files are uploaded.": "", - "Policy ID": "", + "Please select a valid JSON file": "Selecteer een geldig JSON-bestand", + "Please select at least one user for Direct Message channel.": "Selecteer ten minste een gebruiker voor het Direct Message-kanaal.", + "Please wait until all files are uploaded.": "Wacht tot alle bestanden zijn geüpload.", + "Policy ID": "Beleid-ID", "Port": "Poort", - "Ports": "", + "Ports": "Poorten", "Positive attitude": "Positieve houding", - "Prefer not to say": "", + "Prefer not to say": "Liever niet zeggen", "Prefix ID": "Voorvoegsel-ID", "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "Voorvoegsel-ID wordt gebruikt om conflicten met andere verbindingen te vermijden door een voorvoegsel aan het model-ID toe te voegen - laat leeg om uit te schakelen", - "Prevent File Creation": "", - "Preview": "", + "Prevent File Creation": "Bestandsaanmaak voorkomen", + "Preview": "Voorvertoning", "Previous 30 days": "Afgelopen 30 dagen", "Previous 7 days": "Afgelopen 7 dagen", - "Previous message": "", + "Previous message": "Vorige bericht", "Private": "Privé", - "Private conversation between selected users": "", - "Production version updated": "", + "Private conversation between selected users": "Privégesprek tussen geselecteerde gebruikers", + "Production version updated": "Productieversie bijgewerkt", "Profile": "Profiel", "Prompt": "Prompt", "Prompt Autocompletion": "Automatische promptaanvulling", "Prompt Content": "Promptinhoud", "Prompt created successfully": "Prompt succesvol aangemaakt", - "Prompt Name": "", - "Prompt Suggestions": "", + "Prompt Name": "Promptnaam", + "Prompt Suggestions": "Promptsuggesties", "Prompt updated successfully": "Prompt succesvol bijgewerkt", "Prompts": "Prompts", "Prompts Access": "Prompttoegang", "Prompts Public Sharing": "Publiek prompts delen", - "Prompts Sharing": "", - "Provider Type": "", + "Prompts Sharing": "Prompts delen", + "Provider Type": "Providertype", "Public": "Publiek", "Pull \"{{searchValue}}\" from Ollama.com": "Haal \"{{searchValue}}\" uit Ollama.com", "Pull a model from Ollama.com": "Haal een model van Ollama.com", - "Pull Model": "", - "Pyodide file browser": "", + "Pull Model": "Model ophalen", + "Pyodide file browser": "Pyodide-bestandsverkenner", "Query Generation Prompt": "Vraaggeneratieprompt", - "Querying": "", - "Quick Actions": "", + "Querying": "Bezig met opvragen", + "Quick Actions": "Snelle acties", "RAG Template": "RAG-sjabloon", - "Ran {{COUNT}} analyses": "", - "Ran {{COUNT}} analysis": "", - "Rate {{rating}} out of 10": "", + "Ran {{COUNT}} analyses": "{{COUNT}} analyses uitgevoerd", + "Ran {{COUNT}} analysis": "{{COUNT}} analyse uitgevoerd", + "Rate {{rating}} out of 10": "Beoordeel {{rating}} van de 10", "Rating": "Beoordeling", "Re-rank models by topic similarity": "Herrangschik modellen op basis van onderwerpsovereenkomst", "Read": "Voorlezen", "Read Aloud": "Voorlezen", - "Read more →": "", - "Read Only": "", - "Read-Only Access": "", - "Reason": "", + "Read more →": "Lees meer →", + "Read Only": "Alleen lezen", + "Read-Only Access": "Alleen-lezen-toegang", + "Reason": "Reden", "Reasoning Effort": "Redeneerinspanning", - "Reasoning Tags": "", - "Recently Used": "", - "Reconnected": "", - "Record": "", + "Reasoning Tags": "Redeneertags", + "Record": "Opnemen", + "Recently Used": "Onlangs gebruikt", + "Reconnected": "Opnieuw verbonden", "Record voice": "Neem stem op", "Redirecting you to Open WebUI Community": "Je wordt doorgestuurd naar OpenWebUI Community", "Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "Vermindert de kans op het genereren van onzin. Een hogere waarde (bijv. 100) zal meer diverse antwoorden geven, terwijl een lagere waarde (bijv. 10) conservatiever zal zijn.", "Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Refereer naar jezelf als \"user\" (bv. \"User is Spaans aan het leren\")", - "Reference Chats": "", - "Refresh": "", - "Refused when it shouldn't have": "Geweigerd terwijl het niet had moeten", + "Reference Chats": "Referentiechats", + "Refresh": "Verversen", + "Refused when it shouldn't have": "Geweigerd terwijl dat niet had mogen gebeuren", "Regenerate": "Regenereren", - "Regenerate Menu": "", - "Regenerate Response": "", - "Register Again": "", - "Register Client": "", - "Registered": "", - "Registration failed": "", - "Registration successful": "", - "Reindex": "", - "Reindex Knowledge Base Vectors": "", + "Regenerate Menu": "Menu opnieuw genereren", + "Regenerate Response": "Antwoord opnieuw genereren", + "Register Again": "Opnieuw registreren", + "Register Client": "Client registreren", + "Registered": "Geregistreerd", + "Registration failed": "Registratie mislukt", + "Registration successful": "Registratie geslaagd", + "Reindex": "Opnieuw indexeren", + "Reindex Knowledge Base Vectors": "Vektoren van kennisbank opnieuw indexeren", "Release Notes": "Release-opmerkingen", - "Releases": "", + "Releases": "Uitgaven", "Relevance": "Relevantie", - "Relevance Threshold": "", - "Remember Dismissal": "", - "Reminder": "", + "Relevance Threshold": "Relevantiegrens", + "Remember Dismissal": "Afwijzing onthouden", + "Reminder": "Herinnering", "Remove": "Verwijderen", - "Remove {{MODELID}} from list.": "", - "Remove action": "", - "Remove file": "", - "Remove File": "", - "Remove from favorites": "", - "Remove image": "", + "Remove {{MODELID}} from list.": "Verwijder {{MODELID}} uit de lijst.", + "Remove action": "Actie verwijderen", + "Remove file": "Bestand verwijderen", + "Remove File": "Bestand verwijderen", + "Remove from favorites": "Verwijderen uit favorieten", + "Remove image": "Afbeelding verwijderen", "Remove Model": "Verwijder model", "Rename": "Hernoemen", - "Renamed to {{name}}": "", - "Render Markdown in Previews": "", + "Renamed to {{name}}": "Hernoemd naar {{name}}", + "Render Markdown in Previews": "Markdown renderen in voorvertoningen", "Reorder Models": "Herschik modellen", - "Repeats": "", - "Reply": "", + "Reply": "Antwoorden", "Reply in Thread": "Antwoord in draad", - "Reply to thread...": "", - "Replying to {{NAME}}": "", - "required": "", - "Reranking Batch Size": "", - "Reranking Engine": "", + "Reply to thread...": "Reageren op draad...", + "Replying to {{NAME}}": "Reageren op {{NAME}}", + "required": "vereist", + "Reranking Engine": "Herschikkingsengine", + "Repeats": "Herhalingen", + "Reranking Batch Size": "Batchgrootte voor herordenen", "Reranking Model": "Reranking Model", "Reset": "Herstellen", "Reset All Models": "Herstel alle modellen", @@ -1688,335 +1688,335 @@ "Reset Upload Directory": "Herstel Uploadmap", "Reset Vector Storage/Knowledge": "Herstel Vectoropslag/-kennis", "Reset view": "Herstel zicht", - "Response": "", - "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Antwoordmeldingen kunnen niet worden geactiveerd omdat de rechten voor de website zijn geweigerd. Ga naar de instellingen van uw browser om de benodigde toegang te verlenen.", + "Response": "Antwoord", + "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Antwoordmeldingen kunnen niet worden geactiveerd omdat de rechten voor de website zijn geweigerd. Ga naar de instellingen van je browser om de benodigde toegang te verlenen.", "Response splitting": "Antwoord splitsing", - "Response Watermark": "", - "Responses": "", - "Restart": "", + "Response Watermark": "Antwoordwatermerk", + "Responses": "Antwoorden", + "Restart": "Opnieuw starten", "Result": "Resultaat", "RESULT": "Resultaat", "Retrieval": "Ophalen", "Retrieval Query Generation": "Ophaalqueriegeneratie", - "Retrieved {{count}} sources": "", - "Retrieved {{count}} sources_one": "", - "Retrieved {{count}} sources_other": "", - "Retrieved 1 source": "", + "Retrieved {{count}} sources": "{{count}} bronnen opgehaald", + "Retrieved {{count}} sources_one": "{{count}} bron opgehaald", + "Retrieved {{count}} sources_other": "{{count}} bronnen opgehaald", + "Retrieved 1 source": "1 bron opgehaald", "Rich Text Input for Chat": "Rijke tekstinvoer voor chatten", "Role": "Rol", "RTL": "RNL", "Run": "Uitvoeren", - "Run All": "", - "Run now": "", - "Run Now": "", + "Run All": "Alles uitvoeren", "Running": "Aan het uitvoeren", "Running...": "Aan het uitvoeren...", - "Runs embedding tasks concurrently to speed up processing. Turn off if rate limits become an issue.": "", - "Sa_day_of_week": "", + "Runs embedding tasks concurrently to speed up processing. Turn off if rate limits become an issue.": "Voert embeddingtaken gelijktijdig uit om de verwerking te versnellen. Schakel uit als rate limits een probleem worden.", + "Run now": "Nu uitvoeren", + "Run Now": "Nu uitvoeren", + "Sa_day_of_week": "za", "Save": "Opslaan", "Save & Create": "Opslaan & Creëren", "Save & Update": "Opslaan & Bijwerken", "Save As Copy": "Bewaar als kopie", - "Save Chat": "", + "Save Chat": "Chat opslaan", "Saved": "Opgeslagen", "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Chat logs direct opslaan in de opslag van je browser wordt niet langer ondersteund. Neem even de tijd om je chat logs te downloaden en te verwijderen door op de knop hieronder te klikken. Maak je geen zorgen, je kunt je chat logs eenvoudig opnieuw importeren naar de backend via", - "Schedule": "", - "Scheduled time must be in the future": "", - "Scroll On Branch Change": "", + "Scroll On Branch Change": "Scrollen bij wijziging van branch", "Search": "Zoeken", "Search a model": "Zoek een model", - "Search all emojis": "", - "Search and manage user memories": "", - "Search and view user chat history": "", - "Search Automations": "", + "Search all emojis": "Alle emoji's zoeken", + "Search and manage user memories": "Gebruikersherinneringen zoeken en beheren", + "Search and view user chat history": "Gebruikerschatgeschiedenis zoeken en bekijken", + "Schedule": "Planning", + "Scheduled time must be in the future": "Ingeplande tijd moet in de toekomst liggen", + "Search Automations": "Zoek automatiseringen", "Search Base": "Zoeken naar basis", - "Search channels and channel messages": "", + "Search channels and channel messages": "Kanalen en kanaalberichten zoeken", "Search Chats": "Chats zoeken", "Search Collection": "Zoek naar verzamelingen", - "Search Files": "", + "Search Files": "Bestanden zoeken", "Search Filters": "Zoek naar filters", - "search for archived chats": "", - "search for folders": "", - "search for pinned chats": "", - "search for shared chats": "", + "search for archived chats": "zoek naar gearchiveerde chats", + "search for folders": "zoek naar mappen", + "search for pinned chats": "zoek naar vastgemaakte chats", + "search for shared chats": "zoek naar gedeelde chats", "search for tags": "Zoek naar tags", "Search Functions": "Zoek naar functie", - "Search Groups": "", - "Search In Models": "", + "Search Groups": "Groepen zoeken", + "Search In Models": "Zoeken in modellen", "Search Knowledge": "Zoek naar Kennis", - "Search Memories": "", + "Search Memories": "Herinneringen zoeken", "Search Models": "Modellen zoeken", - "Search Notes": "", + "Search Notes": "Notities zoeken", "Search options": "Opties zoeken", "Search Prompts": "Prompts zoeken", "Search Result Count": "Aantal zoekresultaten", - "Search Skills": "", + "Search Skills": "Vaardigheden zoeken", "Search the internet": "Zoek op het internet", - "Search the web and fetch URLs": "", + "Search the web and fetch URLs": "Doorzoek het web en haal URL's op", "Search Tools": "Zoek gereedschappen", - "Search, view, and manage user notes": "", + "Search, view, and manage user notes": "Gebruikersnotities zoeken, bekijken en beheren", "SearchApi API Key": "SearchApi API-sleutel", "SearchApi Engine": "SearchApi Engine", "Searched {{count}} sites": "Zocht op {{count}} sites", - "Searching": "", + "Searching": "Aan het zoeken", "Searching \"{{searchQuery}}\"": "\"{{searchQuery}}\" aan het zoeken.", "Searching Knowledge for \"{{searchQuery}}\"": "Zoek kennis bij \"{{searchQuery}}\"", - "Searching the web": "", + "Searching the web": "Bezig met zoeken op het web", "Searxng Query URL": "Searxng Query URL", - "Searxng search language (all, en, es, de, fr, etc.)": "", + "Searxng search language (all, en, es, de, fr, etc.)": "Searxng-zoektaal (all, en, es, de, fr, enz.)", "See readme.md for instructions": "Zie readme.md voor instructies", "See what's new": "Zie wat er nieuw is", "Seed": "Seed", - "Select": "", - "Select {{modelName}} model": "", + "Select": "Selecteren", + "Select {{modelName}} model": "Selecteer {{modelName}}-model", "Select a base model": "Selecteer een basismodel", - "Select a base model (e.g. llama3, gpt-4o)": "", - "Select a conversation to preview": "", + "Select a base model (e.g. llama3, gpt-4o)": "Selecteer een basismodel (bijv. llama3, gpt-4o)", + "Select a conversation to preview": "Selecteer een gesprek om te bekijken", "Select a engine": "Selecteer een engine", "Select a function": "Selecteer een functie", "Select a group": "Selecteer een groep", - "Select a language": "", - "Select a mode": "", + "Select a language": "Selecteer een taal", + "Select a mode": "Selecteer een modus", "Select a model": "Selecteer een model", - "Select a model (optional)": "", + "Select a model (optional)": "Selecteer een model (optioneel)", "Select a pipeline": "Selecteer een pijplijn", "Select a pipeline url": "Selecteer een pijplijn-URL", - "Select a reranking model engine": "", - "Select a role": "", - "Select a theme": "", + "Select a reranking model engine": "Selecteer een engine voor herordening van modellen", + "Select a role": "Selecteer een rol", + "Select a theme": "Selecteer een thema", "Select a tool": "Selecteer een tool", - "Select a voice": "", - "Select All": "", + "Select a voice": "Selecteer een stem", + "Select All": "Alles selecteren", "Select an auth method": "Selecteer een authenticatiemethode", - "Select an embedding model engine": "", - "Select an engine": "", + "Select an embedding model engine": "Selecteer een embeddingmodel-engine", + "Select an engine": "Selecteer een engine", "Select an Ollama instance": "Selecteer een Ollama-instantie", - "Select an option": "", - "Select an output format": "", - "Select dtype": "", + "Select an option": "Selecteer een optie", + "Select an output format": "Selecteer een uitvoerformaat", + "Select dtype": "Selecteer dtype", "Select Engine": "Selecteer Engine", - "Select how to split message text for TTS requests": "", + "Select how to split message text for TTS requests": "Selecteer hoe berichttekst wordt gesplitst voor TTS-verzoeken", "Select Knowledge": "Selecteer kennis", - "Select Method": "", - "Select model": "", + "Select Method": "Selecteer methode", + "Select model": "Selecteer model", "Select only one model to call": "Selecteer maar één model om aan te roepen", - "Select view": "", - "Selected model: {{modelName}}": "", + "Select view": "Selecteer weergave", + "Selected model: {{modelName}}": "Geselecteerd model: {{modelName}}", "Selected model(s) do not support image inputs": "Geselecteerde modellen ondersteunen geen beeldinvoer", - "Selected Models": "", - "semantic": "", + "Selected Models": "Geselecteerde modellen", + "semantic": "semantisch", "Send": "Verzenden", "Send a Message": "Stuur een bericht", "Send message": "Stuur bericht", - "Send now": "", + "Send now": "Nu verzenden", "Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "Stuurt `stream_options: { include_usage: true }` in het verzoek. \nOndersteunde providers zullen informatie over tokengebruik in het antwoord terugsturen als dit aan staat.", - "September": "September", + "September": "september", "SerpApi API Key": "SerpApi API-sleutel", "SerpApi Engine": "SerpApi-engine", "Serper API Key": "Serper API-sleutel", "Serply API Key": "Serply API-sleutel", "Serpstack API Key": "Serpstack API-sleutel", - "Server connection failed": "", + "Server connection failed": "Serververbinding mislukt", "Server connection verified": "Server verbinding geverifieerd", - "Session": "", + "Session": "Sessie", "Set as default": "Stel in als standaard", - "Set as Production": "", + "Set as Production": "Instellen als productie", "Set embedding model": "Stel embedding-model in", "Set embedding model (e.g. {{model}})": "Stel embedding-model in (bv. {{model}})", "Set reranking model (e.g. {{model}})": "Stel reranking-model in (bv. {{model}})", - "Set the default models that are automatically selected for all users when a new chat is created.": "", - "Set the models that are automatically pinned to the sidebar for all users.": "", + "Set the default models that are automatically selected for all users when a new chat is created.": "Stel de standaardmodellen in die automatisch voor alle gebruikers worden geselecteerd wanneer een nieuwe chat wordt gemaakt.", + "Set the models that are automatically pinned to the sidebar for all users.": "Stel de modellen in die automatisch voor alle gebruikers in de zijbalk worden vastgezet.", "Set the number of layers, which will be off-loaded to GPU. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "Stel het aantal lagen in dat wordt overgeheveld naar de GPU. Het verhogen van deze waarde kan de prestaties aanzienlijk verbeteren voor modellen die geoptimaliseerd zijn voor GPU-versnelling, maar kan ook meer stroom en GPU-bronnen verbruiken.", "Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Stel het aantal threads in dat wordt gebruikt voor berekeningen. Deze optie bepaalt hoeveel threads worden gebruikt om gelijktijdig binnenkomende verzoeken te verwerken. Het verhogen van deze waarde kan de prestaties verbeteren onder hoge concurrency werklasten, maar kan ook meer CPU-bronnen verbruiken.", "Set Voice": "Stel stem in", "Set whisper model": "Stel Whisper-model in", - "Set your status": "", + "Set your status": "Stel je status in", "Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "Stelt een vlakke bias in tegen tokens die minstens één keer zijn voorgekomen. Een hogere waarde (bijv. 1,5) straft herhalingen sterker af, terwijl een lagere waarde (bijv. 0,9) toegeeflijker is. Bij 0 is het uitgeschakeld.", "Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "Stelt een schaalvooroordeel in tegen tokens om herhalingen te bestraffen, gebaseerd op hoe vaak ze zijn voorgekomen. Een hogere waarde (bijv. 1,5) straft herhalingen sterker af, terwijl een lagere waarde (bijv. 0,9) toegeeflijker is. Bij 0 is het uitgeschakeld.", "Sets how far back for the model to look back to prevent repetition.": "Stelt in hoe ver het model terug moet kijken om herhaling te voorkomen.", "Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "Stelt de willekeurigheid in om te gebruiken voor het genereren. Als je dit op een specifiek getal instelt, genereert het model dezelfde tekst voor dezelfde prompt.", "Sets the size of the context window used to generate the next token.": "Stelt de grootte van het contextvenster in dat gebruikt wordt om het volgende token te genereren.", "Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Stelt de te gebruiken stopsequentie in. Als dit patroon wordt gevonden, stopt de LLM met het genereren van tekst en keert terug. Er kunnen meerdere stoppatronen worden ingesteld door meerdere afzonderlijke stopparameters op te geven in een modelbestand.", - "Setting": "", + "Setting": "Instelling", "Settings": "Instellingen", - "Settings Permissions": "", + "Settings Permissions": "Instellingenrechten", "Settings saved successfully!": "Instellingen succesvol opgeslagen!", "Share": "Delen", "Share Chat": "Deel chat", - "Share link copied to clipboard.": "", + "Share link copied to clipboard.": "Deellink gekopieerd naar klembord.", "Share to Open WebUI Community": "Deel naar OpenWebUI-community", - "Share your background and interests": "", - "Shared Chats": "", - "Shared with you": "", + "Share your background and interests": "Deel je achtergrond en interesses", + "Shared Chats": "Gedeelde chats", + "Shared with you": "Gedeeld met jou", "Sharing Permissions": "Deeltoestemmingen", "Show": "Toon", "Show \"What's New\" modal on login": "Toon \"Wat is nieuw\" bij inloggen", "Show Admin Details in Account Pending Overlay": "Admin-details weergeven in overlay in afwachting van account", - "Show All": "", - "Show all ({{COUNT}} characters)": "", - "Show Files": "", - "Show Formatting Toolbar": "", - "Show image preview": "", + "Show All": "Alles tonen", + "Show all ({{COUNT}} characters)": "Alles tonen ({{COUNT}} tekens)", + "Show Files": "Bestanden tonen", + "Show Formatting Toolbar": "Opmaakwerkbalk tonen", + "Show image preview": "Afbeeldingsvoorvertoning tonen", "Show Model": "Toon model", - "Show Shortcuts": "", + "Show Shortcuts": "Sneltoetsen tonen", "Show your support!": "Toon je steun", "Showcased creativity": "Toonde creativiteit", - "Showing all messages (user + assistant) per user.": "", + "Showing all messages (user + assistant) per user.": "Toont alle berichten (gebruiker + assistent) per gebruiker.", "Sign in": "Inloggen", "Sign in to {{WEBUI_NAME}}": "Log in bij {{WEBUI_NAME}}", "Sign in to {{WEBUI_NAME}} with LDAP": "Log in bij {{WEBUI_NAME}} met LDAP", "Sign Out": "Uitloggen", "Sign up": "Registreren", "Sign up to {{WEBUI_NAME}}": "Meld je aan bij {{WEBUI_NAME}}", - "Significantly improves accuracy by using an LLM to enhance tables, forms, inline math, and layout detection. Will increase latency. Defaults to False.": "", + "Significantly improves accuracy by using an LLM to enhance tables, forms, inline math, and layout detection. Will increase latency. Defaults to False.": "Verbetert de nauwkeurigheid aanzienlijk door een LLM te gebruiken voor het verbeteren van tabellen, formulieren, inline wiskunde en lay-outdetectie. Dit verhoogt de latentie. Standaard is False.", "Signing in to {{WEBUI_NAME}}": "Aan het inloggen bij {{WEBUI_NAME}}", - "Single": "", - "Sink List": "", + "Single": "Enkelvoudig", + "Sink List": "Sink-lijst", "sk-1234": "sk-1234", - "Skill created successfully": "", - "Skill deleted successfully": "", - "Skill Description": "", - "Skill ID": "", - "Skill imported successfully": "", - "Skill Instructions": "", - "Skill Name": "", - "Skill updated successfully": "", - "Skills": "", - "Skills Access": "", - "Skills Public Sharing": "", - "Skills Sharing": "", - "Skip Cache": "", - "Skip the cache and re-run the inference. Defaults to False.": "", - "Something went wrong :/": "", - "Sonar": "", - "Sonar Deep Research": "", - "Sonar Pro": "", - "Sonar Reasoning": "", - "Sonar Reasoning Pro": "", - "Sort": "", - "Sort by": "", - "Sougou Search API sID": "", - "Sougou Search API SK": "", + "Skill created successfully": "Vaardigheid succesvol aangemaakt", + "Skill deleted successfully": "Vaardigheid succesvol verwijderd", + "Skill Description": "Beschrijving van de vaardigheid", + "Skill ID": "Vaardigheid-ID", + "Skill imported successfully": "Vaardigheid succesvol geimporteerd", + "Skill Instructions": "Vaardigheidsinstructies", + "Skill Name": "Vaardigheidsnaam", + "Skill updated successfully": "Vaardigheid succesvol bijgewerkt", + "Skills": "Vaardigheden", + "Skills Access": "Toegang tot vaardigheden", + "Skills Public Sharing": "Openbaar delen van vaardigheden", + "Skills Sharing": "Vaardigheden delen", + "Skip Cache": "Cache overslaan", + "Skip the cache and re-run the inference. Defaults to False.": "Sla de cache over en voer de inferentie opnieuw uit. Standaard is False.", + "Something went wrong :/": "Er is iets misgegaan :/", + "Sonar": "Sonar", + "Sonar Deep Research": "Sonar Deep Research", + "Sonar Pro": "Sonar Pro", + "Sonar Reasoning": "Sonar Reasoning", + "Sonar Reasoning Pro": "Sonar Reasoning Pro", + "Sort": "Sorteren", + "Sort by": "Sorteren op", + "Sougou Search API sID": "Sougou Search API sID", + "Sougou Search API SK": "Sougou Search API SK", "Source": "Bron", "Speech Playback Speed": "Afspeelsnelheid spraak", "Speech recognition error: {{error}}": "Spraakherkenning fout: {{error}}", - "Speech-to-Text": "", + "Speech-to-Text": "Spraak-naar-tekst", "Speech-to-Text Engine": "Spraak-naar-tekst Engine", - "Speech-to-Text Language": "", - "Split documents by markdown headers before applying character/token splitting.": "", - "Start a new conversation": "", + "Speech-to-Text Language": "Spraak-naar-teksttaal", + "Split documents by markdown headers before applying character/token splitting.": "Splits documenten op basis van markdown-koppen voordat teken-/token-splitsing wordt toegepast.", + "Start a new conversation": "Start een nieuw gesprek", "Start of the channel": "Begin van het kanaal", - "Start Tag": "", - "Starting in {{count}} minutes_one": "", - "Starting in {{count}} minutes_other": "", - "Starting in 1 minute": "", - "Starting kernel...": "", - "Starting now": "", - "State": "", - "Status": "", - "Status cleared successfully": "", - "Status updated successfully": "", - "Status Updates": "", + "Start Tag": "Starttag", + "Starting kernel...": "Kernel wordt gestart...", + "Status": "Status", + "Status cleared successfully": "Status succesvol gewist", + "Status updated successfully": "Status succesvol bijgewerkt", + "Status Updates": "Statusupdates", + "State": "Status", + "Starting in {{count}} minutes_one": "Begint over {{count}} minuut", + "Starting in {{count}} minutes_other": "Begint over {{count}} minuten", + "Starting in 1 minute": "Begint over 1 minuut", + "Starting now": "Begint nu", "STDOUT/STDERR": "STDOUT/STDERR", - "Steps": "", + "Steps": "Stappen", "Stop": "Stop", - "Stop Download": "", - "Stop Generating": "", + "Stop Download": "Download stoppen", + "Stop Generating": "Genereren stoppen", "Stop Sequence": "Stopsequentie", - "Storage": "", + "Storage": "Opslag", "Stream Chat Response": "Stream chat-antwoord", - "Stream Delta Chunk Size": "", - "Streamable HTTP": "", - "Strikethrough": "", - "Strip Existing OCR": "", - "Strip existing OCR text from the PDF and re-run OCR. Ignored if Force OCR is enabled. Defaults to False.": "", + "Stream Delta Chunk Size": "Stream delta-chunkgrootte", + "Streamable HTTP": "Streambare HTTP", + "Strikethrough": "Doorhalen", + "Strip Existing OCR": "Bestaande OCR verwijderen", + "Strip existing OCR text from the PDF and re-run OCR. Ignored if Force OCR is enabled. Defaults to False.": "Verwijder bestaande OCR-tekst uit de PDF en voer OCR opnieuw uit. Wordt genegeerd als Force OCR is ingeschakeld. Standaard is False.", "STT Model": "STT Model", "STT Settings": "STT Instellingen", - "Stylized PDF Export": "", - "Su_day_of_week": "", - "Submit question": "", - "Submit suggestion": "", - "Subtitle": "", + "Stylized PDF Export": "Gestileerde PDF-export", + "Submit question": "Vraag indienen", + "Submit suggestion": "Suggestie indienen", + "Subtitle": "Ondertitel", + "Su_day_of_week": "zo", "Success": "Succes", - "Successfully imported {{userCount}} users.": "", + "Successfully imported {{userCount}} users.": "{{userCount}} gebruikers succesvol geimporteerd.", "Successfully updated.": "Succesvol bijgewerkt.", - "Suggest a change": "", + "Suggest a change": "Een wijziging voorstellen", "Suggested": "Suggestie", "Support": "Ondersteuning", "Support this plugin:": "ondersteun deze plugin", - "Supported MIME Types": "", - "Sync": "", - "Sync Complete!": "", + "Supported MIME Types": "Ondersteunde MIME-typen", + "Sync": "Synchroniseren", + "Sync Complete!": "Synchronisatie voltooid!", "Sync directory": "Synchroniseer map", - "Sync Failed": "", - "Sync Usage Stats": "", - "Syncing stats...": "", - "Syncing...": "", - "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "", + "Sync Failed": "Synchronisatie mislukt", + "Sync Usage Stats": "Gebruiksstatistieken synchroniseren", + "Syncing stats...": "Statistieken synchroniseren...", + "Syncing...": "Synchroniseren...", + "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "Synchroniseert alleen chats met wijzigingen na je laatste synchronisatietijdstip. Schakel dit uit om alle chats opnieuw te synchroniseren.", "System": "Systeem", "System Instructions": "Systeem instructies", "System Prompt": "Systeem prompt", - "Tag": "", + "Tag": "Tag", "Tags": "Tags", "Tags Generation": "Taggeneratie", "Tags Generation Prompt": "Prompt voor taggeneratie", "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Tail free sampling wordt gebruikt om de impact van minder waarschijnlijke tokens uit de uitvoer te verminderen. Een hogere waarde (bijvoorbeeld 2,0) zal de impact meer verminderen, terwijl een waarde van 1,0 deze instelling uitschakelt.", - "Talk to Model": "", + "Talk to Model": "Praat met model", "Tap to interrupt": "Tik om te onderbreken", - "Task List": "", - "Task Management": "", - "Task Model": "", + "Task List": "Takenlijst", + "Task Model": "Taakmodel", + "Task Management": "Taakbeheer", "Tasks": "Taken", - "tasks completed": "", + "tasks completed": "taken voltooid", "Tavily API Key": "Tavily API-sleutel", - "Tavily Extract Depth": "", + "Tavily Extract Depth": "Tavily-extractiediepte", "Tell us more:": "Vertel ons meer:", "Temperature": "Temperatuur", "Temporary Chat": "Tijdelijke chat", - "Temporary Chat by Default": "", - "Terminal": "", - "Terminal servers saved": "", + "Temporary Chat by Default": "Tijdelijke chat standaard", + "Terminal": "Terminal", + "Terminal servers saved": "Terminalservers opgeslagen", "Text Splitter": "Tekst splitser", - "Text-to-Speech": "", + "Text-to-Speech": "Tekst-naar-spraak", "Text-to-Speech Engine": "Tekst-naar-Spraak Engine", - "Th_day_of_week": "", + "Th_day_of_week": "do", "Thanks for your feedback!": "Bedankt voor je feedback!", "The Application Account DN you bind with for search": "Het applicatieaccount DN waarmee je zoekt", "The base to search for users": "De basis om gebruikers te zoeken", "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "De batchgrootte bepaalt hoeveel tekstverzoeken tegelijk worden verwerkt. Een hogere batchgrootte kan de prestaties en snelheid van het model verhogen, maar vereist ook meer geheugen.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "De ontwikkelaars achter deze plugin zijn gepassioneerde vrijwilligers uit de gemeenschap. Als je deze plugin nuttig vindt, overweeg dan om bij te dragen aan de ontwikkeling ervan.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Het beoordelingsklassement is gebaseerd op het Elo-classificatiesysteem en wordt in realtime bijgewerkt.", - "The format to return a response in. Format can be json or a JSON schema.": "", - "The height in pixels to compress images to. Leave empty for no compression.": "", - "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", + "The format to return a response in. Format can be json or a JSON schema.": "Het formaat waarin een antwoord moet worden teruggegeven. Het formaat kan json of een JSON-schema zijn.", + "The height in pixels to compress images to. Leave empty for no compression.": "De hoogte in pixels waarnaar afbeeldingen moeten worden gecomprimeerd. Laat leeg voor geen compressie.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "De taal van de invoeraudio. Het opgeven van de invoertaal in ISO-639-1-indeling (bijv. en) verbetert de nauwkeurigheid en latentie. Laat leeg om de taal automatisch te detecteren.", "The LDAP attribute that maps to the mail that users use to sign in.": "Het LDAP-attribuut dat verwijst naar de e-mail waarmee gebruikers zich aanmelden.", "The LDAP attribute that maps to the username that users use to sign in.": "Het LDAP-attribuut dat verwijst naar de gebruikersnaam die gebruikers gebruiken om in te loggen.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Het leaderboard is momenteel in bèta en we kunnen de ratingberekeningen aanpassen naarmate we het algoritme verfijnen.", "The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "De maximale bestandsgrootte in MB. Als het bestand groter is dan deze limiet, wordt het bestand niet geüpload.", "The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "Het maximum aantal bestanden dat in één keer kan worden gebruikt in de chat. Als het aantal bestanden deze limiet overschrijdt, worden de bestanden niet geüpload.", - "The output format for the text. Can be 'json', 'markdown', or 'html'. Defaults to 'markdown'.": "", - "The passwords you entered don't quite match. Please double-check and try again.": "", + "The output format for the text. Can be 'json', 'markdown', or 'html'. Defaults to 'markdown'.": "Het uitvoerformaat voor de tekst. Kan 'json', 'markdown' of 'html' zijn. Standaard is 'markdown'.", + "The passwords you entered don't quite match. Please double-check and try again.": "De ingevoerde wachtwoorden komen niet helemaal overeen. Controleer ze en probeer opnieuw.", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "De score moet een waarde zijn tussen 0.0 (0%) en 1.0 (100%).", - "The stream delta chunk size for the model. Increasing the chunk size will make the model respond with larger pieces of text at once.": "", + "The stream delta chunk size for the model. Increasing the chunk size will make the model respond with larger pieces of text at once.": "De stream-delta-chunkgrootte voor het model. Door de chunkgrootte te vergroten, reageert het model met grotere stukken tekst tegelijk.", "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "De temperatuur van het model. De temperatuur groter maken zal het model creatiever laten antwoorden.", - "The Weight of BM25 Hybrid Search. 0 more semantic, 1 more lexical. Default 0.5": "", - "The width in pixels to compress images to. Leave empty for no compression.": "", + "The Weight of BM25 Hybrid Search. 0 more semantic, 1 more lexical. Default 0.5": "Het gewicht van BM25-hybride zoeken. 0 meer semantisch, 1 meer lexicaal. Standaard 0,5", + "The width in pixels to compress images to. Leave empty for no compression.": "De breedte in pixels waarnaar afbeeldingen moeten worden gecomprimeerd. Laat leeg voor geen compressie.", "Theme": "Thema", - "There was an error syncing your stats. Please try again.": "", - "Thinking...": "Aan het denken...", - "This action cannot be undone. Do you wish to continue?": "Deze actie kan niet ongedaan worden gemaakt. Wilt u doorgaan?", + "There was an error syncing your stats. Please try again.": "Er is een fout opgetreden bij het synchroniseren van je statistieken. Probeer het opnieuw.", + "Thinking...": "Aan het nadenken...", + "This action cannot be undone. Do you wish to continue?": "Deze actie kan niet ongedaan worden gemaakt. Wil je doorgaan?", "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Dit kanaal is aangemaakt op {{createdAt}}. Dit is het begin van het kanaal {{channelName}}.", - "This chat won't appear in history and your messages will not be saved.": "", + "This chat won't appear in history and your messages will not be saved.": "Deze chat verschijnt niet in de geschiedenis en je berichten worden niet opgeslagen.", "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dit zorgt ervoor dat je waardevolle gesprekken veilig worden opgeslagen in je backend database. Dank je wel!", - "This feature is currently experimental and may not work as expected.": "", - "This feature is experimental and may be modified or discontinued without notice.": "", - "This folder is empty": "", - "This is a default user permission and will remain enabled.": "", + "This feature is currently experimental and may not work as expected.": "Deze functie is momenteel experimenteel en werkt mogelijk niet zoals verwacht.", + "This feature is experimental and may be modified or discontinued without notice.": "Deze functie is experimenteel en kan zonder kennisgeving worden gewijzigd of stopgezet.", + "This folder is empty": "Deze map is leeg", + "This is a default user permission and will remain enabled.": "Dit is een standaardgebruikersrecht en blijft ingeschakeld.", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "Dit is een experimentele functie, het werkt mogelijk niet zoals verwacht en kan op elk moment worden gewijzigd.", - "This model is not publicly available. Please select another model.": "", - "This option controls how long the model will stay loaded into memory following the request (default: 5m)": "", + "This model is not publicly available. Please select another model.": "Dit model is niet publiek beschikbaar. Selecteer een ander model.", + "This option controls how long the model will stay loaded into memory following the request (default: 5m)": "Deze optie bepaalt hoe lang het model na het verzoek in het geheugen geladen blijft (standaard: 5m)", "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "Deze optie bepaalt hoeveel tokens bewaard blijven bij het verversen van de context. Als deze bijvoorbeeld op 2 staat, worden de laatste 2 tekens van de context van het gesprek bewaard. Het behouden van de context kan helpen om de continuïteit van een gesprek te behouden, maar het kan de mogelijkheid om te reageren op nieuwe onderwerpen verminderen.", - "This option enables or disables the use of the reasoning feature in Ollama, which allows the model to think before generating a response. When enabled, the model can take a moment to process the conversation context and generate a more thoughtful response.": "", + "This option enables or disables the use of the reasoning feature in Ollama, which allows the model to think before generating a response. When enabled, the model can take a moment to process the conversation context and generate a more thoughtful response.": "Deze optie schakelt het gebruik van de redeneermogelijkheid in Ollama in of uit, waardoor het model eerst kan nadenken voordat het een antwoord genereert. Wanneer ingeschakeld, kan het model even de tijd nemen om de gesprekscontext te verwerken en een doordachter antwoord te genereren.", "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Deze optie stelt het maximum aantal tokens in dat het model kan genereren in zijn antwoord. Door deze limiet te verhogen, kan het model langere antwoorden geven, maar het kan ook de kans vergroten dat er onbehulpzame of irrelevante inhoud wordt gegenereerd.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Deze optie verwijdert alle bestaande bestanden in de collectie en vervangt ze door nieuw geüploade bestanden.", "This response was generated by \"{{model}}\"": "Dit antwoord is gegenereerd door \"{{model}}\"", @@ -2024,50 +2024,50 @@ "This will delete {{NAME}} and all its contents.": "Dit zal {{NAME}} verwijderen en al zijn inhoud.", "This will delete all models including custom models": "Dit zal alle modellen, ook aangepaste modellen, verwijderen", "This will delete all models including custom models and cannot be undone.": "Dit zal alle modellen, ook aangepaste modellen, verwijderen en kan niet ongedaan worden gemaakt", - "This will permanently delete the calendar \"{{name}}\" and all its events. This action cannot be undone.": "", - "This will reset the knowledge base and sync all files. Do you wish to continue?": "Dit zal de kennisdatabase resetten en alle bestanden synchroniseren. Wilt u doorgaan?", + "This will reset the knowledge base and sync all files. Do you wish to continue?": "Dit zal de kennisdatabase resetten en alle bestanden synchroniseren. Wil je doorgaan?", + "This will permanently delete the calendar \"{{name}}\" and all its events. This action cannot be undone.": "Dit zal de kalender \"{{name}}\" en alle gebeurtenissen permanent verwijderen. Deze actie kan niet ongedaan worden gemaakt.", "Thorough explanation": "Grondige uitleg", - "Thought": "", - "Thought for {{DURATION}}": "Dacht {{DURATION}}", - "Thought for {{DURATION}} seconds": "Dacht {{DURATION}} seconden", - "Thought for less than a second": "", + "Thought": "Gedachte", + "Thought for {{DURATION}}": "Dacht {{DURATION}} na", + "Thought for {{DURATION}} seconds": "Dacht {{DURATION}} seconden na", + "Thought for less than a second": "Dacht minder dan een seconde na", "Thread": "Draad", - "Thumbs up/down ratings from users on model responses": "", + "Thumbs up/down ratings from users on model responses": "Duim omhoog/omlaag-beoordelingen van gebruikers op modelantwoorden", "Tika": "Tika", "Tika Server URL required.": "Tika Server-URL vereist", "Tiktoken": "Tiktoken", - "Time": "", - "Time & Calculation": "", - "Timeout": "", + "Time & Calculation": "Tijd en berekening", + "Timeout": "Time-out", + "Time": "Tijd", "Title": "Titel", - "Title Auto-Generation": "Titel Auto-Generatie", + "Title Auto-Generation": "Automatische titelgeneratie", "Title cannot be an empty string.": "Titel kan niet leeg zijn.", "Title Generation": "Titelgeneratie", - "Title Generation Prompt": "Titel Generatie Prompt", - "Title is required": "", + "Title Generation Prompt": "Prompt voor titelgeneratie", + "Title is required": "Titel is vereist", "TLS": "TLS", "To access the available model names for downloading,": "Om de beschikbare modelnamen voor downloaden te openen,", "To access the GGUF models available for downloading,": "Om toegang te krijgen tot de GGUF-modellen die beschikbaar zijn voor downloaden,", "To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Om toegang te krijgen tot de WebUI, neem contact op met de administrator. Beheerders kunnen de gebruikersstatussen beheren vanuit het Beheerderspaneel.", "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Om hier een kennisbron bij te voegen, voeg ze eerst aan de \"Kennis\" werkplaats toe.", "To learn more about available endpoints, visit our documentation.": "Om meer over beschikbare endpoints te leren, bezoek onze documentatie.", - "To select skills here, add them to the \"Skills\" workspace first.": "", + "To select skills here, add them to the \"Skills\" workspace first.": "Om hier vaardigheden te selecteren, voeg ze eerst toe aan de \"Vaardigheden\"-werkruimte.", "To select toolkits here, add them to the \"Tools\" workspace first.": "Om hier gereedschapssets te selecteren, voeg ze eerst aan de \"Gereedschappen\" Werkplaats toe.", "Toast notifications for new updates": "Toon notificaties voor nieuwe updates", "Today": "Vandaag", - "Today at": "", - "Today at {{LOCALIZED_TIME}}": "", - "Toggle {{COUNT}} sources": "", - "Toggle 1 source": "", - "Toggle details": "", - "Toggle Dictation": "", - "Toggle Sidebar": "", - "Toggle status history": "", - "Toggle whether current connection is active.": "", + "Today at {{LOCALIZED_TIME}}": "Vandaag om {{LOCALIZED_TIME}}", + "Toggle {{COUNT}} sources": "Schakel {{COUNT}} bronnen om", + "Toggle 1 source": "Schakel 1 bron om", + "Toggle details": "Details omzetten", + "Toggle Dictation": "Dicteren omzetten", + "Toggle Sidebar": "Zijbalk omzetten", + "Toggle status history": "Statusgeschiedenis omzetten", + "Toggle whether current connection is active.": "Schakel in of de huidige verbinding actief is.", + "Today at": "Vandaag om", "Token": "Token", - "Token counts are estimates and may not reflect actual API usage": "", - "tokens": "", - "Tokens": "", + "Token counts are estimates and may not reflect actual API usage": "Tokenaantallen zijn schattingen en komen mogelijk niet overeen met het werkelijke API-gebruik", + "tokens": "tokens", + "Tokens": "Tokens", "Too verbose": "Te langdradig", "Tool created successfully": "Gereedschap succesvol aangemaakt", "Tool deleted successfully": "Gereedschap succesvol verwijderd", @@ -2075,7 +2075,7 @@ "Tool ID": "Gereedschaps-ID", "Tool imported successfully": "Gereedschap succesvol geïmporteerd", "Tool Name": "Gereedschapsnaam", - "Tool Servers": "", + "Tool Servers": "Toolservers", "Tool updated successfully": "Gereedschap succesvol bijgewerkt", "Tools": "Gereedschappen", "Tools Access": "Gereedschaptoegang", @@ -2083,204 +2083,204 @@ "Tools Function Calling Prompt": "Gereedschapsfunctie aanroepprompt", "Tools have a function calling system that allows arbitrary code execution.": "Gereedschappen hebben een systeem voor het aanroepen van functies waarmee willekeurige code kan worden uitgevoerd", "Tools Public Sharing": "Gereedschappen publiek delen", - "Tools Sharing": "", - "Top": "", + "Tools Sharing": "Tools delen", + "Top": "Top", "Top K": "Top K", "Top K Reranker": "Top K herranker", "Transformers": "Transformers", "Trouble accessing Ollama?": "Problemen met toegang tot Ollama?", "Trust Proxy Environment": "Vertrouwelijk proxyomgeving", - "Try adjusting your search or filter to find what you are looking for.": "", - "Try Again": "", + "Try adjusting your search or filter to find what you are looking for.": "Probeer je zoekopdracht of filter aan te passen om te vinden wat je zoekt.", + "Try Again": "Probeer opnieuw", "TTS Model": "TTS Model", "TTS Settings": "TTS instellingen", "TTS Voice": "TTS Stem", - "Tu_day_of_week": "", + "Tu_day_of_week": "di", "Type": "Type", - "Type here...": "", + "Type here...": "Typ hier...", "Type Hugging Face Resolve (Download) URL": "Type Hugging Face Resolve (Download) URL", "Uh-oh! There was an issue with the response.": "Oh-oh! Er was een probleem met het antwoord.", "UI": "UI", - "UI Scale": "", + "UI Scale": "UI-schaal", "Unarchive All": "Onarchiveer alles", "Unarchive All Archived Chats": "Onarchiveer alle gearchiveerde chats", "Unarchive Chat": "Onarchiveer chat", - "Underline": "", - "Unknown": "", - "Unknown User": "", - "Unloads {{FROM_NOW}}": "", + "Underline": "Onderstrepen", + "Unknown": "Onbekend", + "Unknown User": "Onbekende gebruiker", + "Unloads {{FROM_NOW}}": "Laadt over {{FROM_NOW}} uit", "Unlock mysteries": "Ontsleutel mysteries", "Unpin": "Losmaken", - "Unpin from Sidebar": "", + "Unpin from Sidebar": "Losmaken van zijbalk", "Unravel secrets": "Ontrafel geheimen", - "Unshare Chat": "", - "Unsupported file type.": "", + "Unshare Chat": "Chat delen opheffen", + "Unsupported file type.": "Niet-ondersteund bestandstype.", "Untagged": "Ongemarkeerd", - "Untitled": "", + "Untitled": "Zonder titel", "Update": "Bijwerken", "Update and Copy Link": "Bijwerken en kopieer link", "Update for the latest features and improvements.": "Bijwerken voor de nieuwste functies en verbeteringen", "Update password": "Wijzig wachtwoord", - "Update your status": "", + "Update your status": "Werk je status bij", "Updated": "Bijgewerkt", "Updated at": "Bijgewerkt om", "Updated At": "Bijgewerkt om", "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "Upgrade naar een licentie voor meer mogelijkheden, waaronder aangepaste thematisering en branding, en speciale ondersteuning.", "Upload": "Uploaden", "Upload a GGUF model": "Upload een GGUF-model", - "Upload Audio": "", + "Upload Audio": "Audio uploaden", "Upload directory": "Upload map", "Upload files": "Bestanden uploaden", "Upload Files": "Bestanden uploaden", - "Upload Model": "", + "Upload Model": "Model uploaden", "Upload Pipeline": "Upload Pijpleiding", - "Upload profile image": "", + "Upload profile image": "Profielafbeelding uploaden", "Upload Progress": "Upload Voortgang", - "Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "", - "Uploaded files or images": "", - "Uploading file...": "", - "Uploading...": "", + "Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Uploadvoortgang: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)", + "Uploaded files or images": "Geüploade bestanden of afbeeldingen", + "Uploading file...": "Bestand aan het uploaden...", + "Uploading...": "Aan het uploaden...", "URL": "URL", - "URL is required": "", + "URL is required": "URL is vereist", "URL Mode": "URL-modus", - "Usage": "", - "Use": "", + "Usage": "Gebruik", + "Use": "Gebruiken", "Use '#' in the prompt input to load and include your knowledge.": "Gebruik '#' in de promptinvoer om je kennis te laden en op te nemen.", - "Use /v1/chat/completions endpoint instead of /v1/audio/transcriptions for potentially better accuracy.": "", - "Use Chat Completions API": "", - "Use groups to organize your users and assign permissions.": "", - "Use LLM": "", - "Use no proxy to fetch page contents.": "", - "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", + "Use /v1/chat/completions endpoint instead of /v1/audio/transcriptions for potentially better accuracy.": "Gebruik het /v1/chat/completions-endpoint in plaats van /v1/audio/transcriptions voor mogelijk betere nauwkeurigheid.", + "Use Chat Completions API": "Gebruik Chat Completions API", + "Use groups to organize your users and assign permissions.": "Gebruik groepen om je gebruikers te organiseren en machtigingen toe te kennen.", + "Use LLM": "LLM gebruiken", + "Use no proxy to fetch page contents.": "Gebruik geen proxy om paginainhoud op te halen.", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "Gebruik de proxy die is opgegeven door de omgevingsvariabelen http_proxy en https_proxy om paginainhoud op te halen.", "user": "gebruiker", "User": "Gebruiker", - "User Activity": "", - "User Groups": "", + "User Activity": "Gebruikersactiviteit", + "User Groups": "Gebruikersgroepen", "User location successfully retrieved.": "Gebruikerslocatie succesvol opgehaald", - "User menu": "", - "User ratings (thumbs up/down)": "", - "User Status": "", + "User menu": "Gebruikersmenu", + "User ratings (thumbs up/down)": "Gebruikersbeoordelingen (duim omhoog/omlaag)", + "User Status": "Gebruikersstatus", "User Webhooks": "Gebruiker-webhooks", "Username": "Gebruikersnaam", - "users": "", + "users": "gebruikers", "Users": "Gebruikers", - "Uses DefaultAzureCredential to authenticate": "", - "Uses OAuth 2.1 Dynamic Client Registration": "", - "Using Entire Document": "", - "Using Focused Retrieval": "", + "Uses DefaultAzureCredential to authenticate": "Gebruikt DefaultAzureCredential voor authenticatie", + "Uses OAuth 2.1 Dynamic Client Registration": "Gebruikt dynamische clientregistratie van OAuth 2.1", + "Using Entire Document": "Volledig document gebruiken", + "Using Focused Retrieval": "Gerichte retrieval gebruiken", "Using the default arena model with all models. Click the plus button to add custom models.": "Het standaard arena-model gebruiken met alle modellen. Klik op de plusknop om aangepaste modellen toe te voegen.", "Valid time units:": "Geldige tijdseenheden:", - "Validate certificate": "", + "Validate certificate": "Certificaat valideren", "Valves": "Kleppen", "Valves updated": "Kleppen bijgewerkt", "Valves updated successfully": "Kleppen succesvol bijgewerkt", "variable": "variabele", "Verify Connection": "Controleer verbinding", - "Verify SSL Certificate": "", + "Verify SSL Certificate": "SSL-certificaat verifiëren", "Version": "Versie", "Version {{selectedVersion}} of {{totalVersions}}": "Versie {{selectedVersion}} van {{totalVersions}}", - "Version deleted": "", + "Version deleted": "Versie verwijderd", "View Replies": "Bekijke resultaten", - "View Result from **{{NAME}}**": "", - "View source: {{name}}": "", - "View source: {{title}}": "", + "View Result from **{{NAME}}**": "Bekijk resultaat van **{{NAME}}**", + "View source: {{name}}": "Bekijk bron: {{name}}", + "View source: {{title}}": "Bekijk bron: {{title}}", "Visibility": "Zichtbaarheid", - "Visible": "", - "Visible to all users": "", - "Vision": "", + "Visible": "Zichtbaar", + "Visible to all users": "Zichtbaar voor alle gebruikers", + "Vision": "Visie", "Voice": "Stem", "Voice Input": "Steminvoer", - "Voice mode": "", - "Voice Mode Custom Prompt": "", - "Voice Mode Prompt": "", - "Waiting for upload...": "", + "Voice mode": "Spraakmodus", + "Voice Mode Custom Prompt": "Aangepaste prompt voor spraakmodus", + "Voice Mode Prompt": "Prompt voor spraakmodus", + "Waiting for upload...": "Wachten op upload...", "Warning": "Waarschuwing", "Warning:": "Waarschuwing", - "Warning: Enabling this will allow users to run scheduled prompts automatically.": "", + "Warning: Enabling this will allow users to run scheduled prompts automatically.": "Waarschuwing: Als je dit inschakelt, kunnen gebruikers geplande prompts automatisch uitvoeren.", "Warning: Enabling this will allow users to upload arbitrary code on the server.": "Waarschuwing: Door dit in te schakelen kunnen gebruikers willekeurige code uploaden naar de server.", "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Waarschuwing: Jupyter kan willekeurige code uitvoeren, wat ernstige veiligheidsrisico's met zich meebrengt - ga uiterst voorzichtig te werk. ", - "We_day_of_week": "", + "We_day_of_week": "wo", "Web": "Web", "Web API": "Web-API", - "Web Loader Engine": "", + "Web Loader Engine": "Webloader-engine", "Web Search": "Zoeken op het web", "Web Search Engine": "Zoekmachine op het web", "Web Search in Chat": "Zoekopdracht in chat", "Web Search Query Generation": "Zoekopdracht generatie", - "Webhook Name": "", + "Webhook Name": "Webhooknaam", "Webhook URL": "Webhook URL", - "Webhooks": "", - "Webpage URLs": "", + "Webhooks": "Webhooks", + "Webpage URLs": "Webpagina-URL's", "WebUI Settings": "WebUI Instellingen", "WebUI URL": "WebUI-URL", - "WebUI will make requests to \"{{url}}\"": "", + "WebUI will make requests to \"{{url}}\"": "WebUI zal verzoeken doen aan \"{{url}}\"", "WebUI will make requests to \"{{url}}/api/chat\"": "WebUI zal verzoeken doen aan \"{{url}}/api/chat\"", "WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI zal verzoeken doen aan \"{{url}}/chat/completions\"", - "Week": "", - "Weekly": "", + "Week": "Week", + "Weekly": "Wekelijks", "What are you trying to achieve?": "Wat probeer je te bereiken?", "What are you working on?": "Waar werk je aan?", - "What is NOT shared:": "", - "What is shared:": "", + "What is NOT shared:": "Wat NIET wordt gedeeld:", + "What is shared:": "Wat wordt gedeeld:", "What's New in": "Wat is nieuw in", - "What's on your mind?": "", - "When": "", + "What's on your mind?": "Waar denk je aan?", + "When": "Wanneer", "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Als dit is ingeschakeld, reageert het model op elk chatbericht in real-time, waarbij een reactie wordt gegenereerd zodra de gebruiker een bericht stuurt. Deze modus is handig voor live chat-toepassingen, maar kan de prestaties op langzamere hardware beïnvloeden.", "wherever you are": "waar je ook bent", - "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "", + "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "Of de uitvoer moet worden gepagineerd. Elke pagina wordt gescheiden door een horizontale lijn en een paginanummer. Standaard is False.", "Whisper (Local)": "Whisper (Lokaal)", - "Who can share to this group": "", + "Who can share to this group": "Wie kan delen met deze groep", "Why?": "Waarom?", "Widescreen Mode": "Breedschermmodus", - "Width": "", - "Wikipedia": "", + "Width": "Breedte", + "Wikipedia": "Wikipedia", "Won": "Gewonnen", - "Working Directory": "", + "Working Directory": "Werkmap", "Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Werkt samen met top-k. Een hogere waarde (bijv. 0,95) leidt tot meer diverse tekst, terwijl een lagere waarde (bijv. 0,5) meer gerichte en conservatieve tekst genereert.", "Workspace": "Werkruimte", "Workspace Permissions": "Werkruimtemachtigingen", "Write": "Schrijf", - "Write a summary in 50 words that summarizes {{topic}}.": "Schrijf een samenvatting in 50 woorden die [onderwerp of trefwoord] samenvat.", + "Write a summary in 50 words that summarizes {{topic}}.": "Schrijf een samenvatting in 50 woorden die {{topic}} samenvat.", "Write something...": "Schrijf iets...", "Write your model system prompt content here\ne.g.) You are Mario from Super Mario Bros, acting as an assistant.": "Schrijf hier de inhoud van de systeemprompt van je model\nbijv.: Je bent Mario uit Super Mario Bros en treedt op als assistent.", - "Yacy Instance URL": "", - "Yacy Password": "", - "Yacy Username": "", - "Yahoo": "", - "Yandex": "", - "Yandex Web Search API Key": "", - "Yandex Web Search config": "", - "Yandex Web Search URL": "", + "Yacy Instance URL": "Yacy-instantie-URL", + "Yacy Password": "Yacy-wachtwoord", + "Yacy Username": "Yacy-gebruikersnaam", + "Yahoo": "Yahoo", + "Yandex": "Yandex", + "Yandex Web Search API Key": "Yandex Web Search API-sleutel", + "Yandex Web Search config": "Yandex Web Search-configuratie", + "Yandex Web Search URL": "Yandex Web Search-URL", "Yesterday": "Gisteren", - "Yesterday at {{LOCALIZED_TIME}}": "", + "Yesterday at {{LOCALIZED_TIME}}": "Gisteren om {{LOCALIZED_TIME}}", "You": "Jij", "You are currently using a trial license. Please contact support to upgrade your license.": "Je gebruikt momenteel een proeflicentie. Neem contact op met de ondersteuning om je licentie te upgraden.", "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Je kunt slechts met maximaal {{maxCount}} bestand(en) tegelijk chatten", "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Je kunt je interacties met LLM's personaliseren door herinneringen toe te voegen via de 'Beheer'-knop hieronder, waardoor ze nuttiger en voor jou op maat gemaakt worden.", "You cannot upload an empty file.": "Je kunt een leeg bestand niet uploaden.", - "You do not have permission to edit this model": "", - "You do not have permission to edit this prompt.": "", - "You do not have permission to edit this skill.": "", - "You do not have permission to edit this tool": "", - "You do not have permission to make this public": "", - "You do not have permission to send messages in this channel.": "", - "You do not have permission to send messages in this thread.": "", - "You do not have permission to upload files to this knowledge base.": "", + "You do not have permission to edit this model": "Je hebt geen toestemming om dit model te bewerken", + "You do not have permission to edit this prompt.": "Je hebt geen toestemming om deze prompt te bewerken.", + "You do not have permission to edit this skill.": "Je hebt geen toestemming om deze vaardigheid te bewerken.", + "You do not have permission to edit this tool": "Je hebt geen toestemming om deze tool te bewerken", + "You do not have permission to make this public": "Je hebt geen toestemming om dit openbaar te maken", + "You do not have permission to send messages in this channel.": "Je hebt geen toestemming om berichten in dit kanaal te verzenden.", + "You do not have permission to send messages in this thread.": "Je hebt geen toestemming om berichten in deze draad te verzenden.", + "You do not have permission to upload files to this knowledge base.": "Je hebt geen toestemming om bestanden naar deze kennisbank te uploaden.", "You do not have permission to upload files.": "Je hebt geen toestemming om bestanden up te loaden", - "You do not have permission to upload web content.": "", + "You do not have permission to upload web content.": "Je hebt geen toestemming om webinhoud te uploaden.", "You have no archived conversations.": "Je hebt geen gearchiveerde gesprekken.", - "You have no shared conversations.": "", + "You have no shared conversations.": "Je hebt geen gedeelde gesprekken.", "You have shared this chat": "Je hebt dit gesprek gedeeld", - "You.com API Key": "", + "You.com API Key": "You.com API-sleutel", "You're a helpful assistant.": "Je bent een behulpzame assistent.", "You're now logged in.": "Je bent nu ingelogd.", - "Your Account": "", + "Your Account": "Je account", "Your account status is currently pending activation.": "Je accountstatus wacht nu op activatie", - "Your browser does not support the audio tag.": "", - "Your browser does not support the video tag.": "", + "Your browser does not support the audio tag.": "Je browser ondersteunt de audio-tag niet.", + "Your browser does not support the video tag.": "Je browser ondersteunt de video-tag niet.", "Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Je volledige bijdrage gaat direct naar de ontwikkelaar van de plugin; Open WebUI neemt hier geen deel van. Het gekozen financieringsplatform kan echter wel zijn eigen kosten hebben.", - "Your message text or inputs": "", - "Your usage stats have been successfully synced.": "", + "Your message text or inputs": "Je berichttekst of invoer", + "Your usage stats have been successfully synced.": "Je gebruiksstatistieken zijn succesvol gesynchroniseerd.", "YouTube": "Youtube", "Youtube Language": "Youtube-taal", "Youtube Proxy URL": "Youtube-proxy-URL" From 7da6b82471f0867450f622eb12e01637655c8e7f Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 15:35:59 +0900 Subject: [PATCH 19/51] refac --- backend/open_webui/routers/ollama.py | 13 ++++++++++++- backend/open_webui/routers/openai.py | 19 +++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/backend/open_webui/routers/ollama.py b/backend/open_webui/routers/ollama.py index b957310b58..8311fee5d4 100644 --- a/backend/open_webui/routers/ollama.py +++ b/backend/open_webui/routers/ollama.py @@ -86,6 +86,17 @@ log = logging.getLogger(__name__) # ########################################## +# Headers that become stale after aiohttp auto-decompresses the upstream +# response body. Forwarding them verbatim causes desktop / programmatic +# clients to attempt decompression of an already-decoded payload, resulting +# in ZlibError. See https://github.com/aio-libs/aiohttp/issues/4462. +_STRIP_PROXY_HEADERS = frozenset({'Content-Encoding', 'Content-Length', 'Transfer-Encoding'}) + + +def _clean_proxy_headers(raw_headers) -> dict: + """Return a copy of *raw_headers* with stale encoding headers removed.""" + return {k: v for k, v in raw_headers.items() if k not in _STRIP_PROXY_HEADERS} + async def send_get_request(url, key=None, user: UserModel = None): timeout = aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST) @@ -163,7 +174,7 @@ async def send_request( r.raise_for_status() if stream: - response_headers = dict(r.headers) + response_headers = _clean_proxy_headers(r.headers) if content_type: response_headers['Content-Type'] = content_type diff --git a/backend/open_webui/routers/openai.py b/backend/open_webui/routers/openai.py index 8a7c3aca72..6f8c0f81bf 100644 --- a/backend/open_webui/routers/openai.py +++ b/backend/open_webui/routers/openai.py @@ -76,6 +76,17 @@ log = logging.getLogger(__name__) # ########################################## +# Headers that become stale after aiohttp auto-decompresses the upstream +# response body. Forwarding them verbatim causes desktop / programmatic +# clients to attempt decompression of an already-decoded payload, resulting +# in ZlibError. See https://github.com/aio-libs/aiohttp/issues/4462. +_STRIP_PROXY_HEADERS = frozenset({'Content-Encoding', 'Content-Length', 'Transfer-Encoding'}) + + +def _clean_proxy_headers(raw_headers) -> dict: + """Return a copy of *raw_headers* with stale encoding headers removed.""" + return {k: v for k, v in raw_headers.items() if k not in _STRIP_PROXY_HEADERS} + async def send_get_request( request: Request = None, @@ -1219,7 +1230,7 @@ async def generate_chat_completion( return StreamingResponse( stream_wrapper(r, content_handler=stream_chunks_handler), status_code=r.status, - headers=dict(r.headers), + headers=_clean_proxy_headers(r.headers), ) else: try: @@ -1304,7 +1315,7 @@ async def embeddings(request: Request, form_data: dict, user): return StreamingResponse( stream_wrapper(r), status_code=r.status, - headers=dict(r.headers), + headers=_clean_proxy_headers(r.headers), ) else: try: @@ -1425,7 +1436,7 @@ async def responses( return StreamingResponse( stream_wrapper(r), status_code=r.status, - headers=dict(r.headers), + headers=_clean_proxy_headers(r.headers), ) else: try: @@ -1542,7 +1553,7 @@ async def proxy(path: str, request: Request, user=Depends(get_verified_user)): return StreamingResponse( stream_wrapper(r), status_code=r.status, - headers=dict(r.headers), + headers=_clean_proxy_headers(r.headers), ) else: try: From a76652193385fe248425956d3075119f4e5bfbbf Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 15:39:12 +0900 Subject: [PATCH 20/51] refac --- backend/open_webui/tools/builtin.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/tools/builtin.py b/backend/open_webui/tools/builtin.py index afa3cb63a9..25d6a2cecb 100644 --- a/backend/open_webui/tools/builtin.py +++ b/backend/open_webui/tools/builtin.py @@ -2568,8 +2568,11 @@ async def create_automation( if not user: return json.dumps({'error': 'User not found'}) - # Always use the calling model for the automation - model_id = (__metadata__ or {}).get('model_id') + # Fall back to model dict ID since __metadata__ may predate model_id assignment + metadata = __metadata__ or {} + model_id = metadata.get('model_id') or ( + metadata.get('model', {}).get('id') if isinstance(metadata.get('model'), dict) else None + ) if not model_id: return json.dumps({'error': 'Could not detect current model'}) From a76a779c01e2e9106eacf141424b28fa870cb21e Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 15:40:02 +0900 Subject: [PATCH 21/51] refac --- backend/start_windows.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/start_windows.bat b/backend/start_windows.bat index c8587c3c6d..c5f96e0e6f 100644 --- a/backend/start_windows.bat +++ b/backend/start_windows.bat @@ -24,7 +24,7 @@ IF NOT "%WEBUI_SECRET_KEY_FILE%" == "" ( IF "%PORT%"=="" SET PORT=8080 IF "%HOST%"=="" SET HOST=0.0.0.0 -IF "%FORWARDED_ALLOW_IPS%"=="" SET "FORWARDED_ALLOW_IPS=*" +IF "%FORWARDED_ALLOW_IPS%"=="" SET "FORWARDED_ALLOW_IPS='*'" SET "WEBUI_SECRET_KEY=%WEBUI_SECRET_KEY%" SET "WEBUI_JWT_SECRET_KEY=%WEBUI_JWT_SECRET_KEY%" @@ -47,5 +47,5 @@ IF "%WEBUI_SECRET_KEY% %WEBUI_JWT_SECRET_KEY%" == " " ( :: Execute uvicorn SET "WEBUI_SECRET_KEY=%WEBUI_SECRET_KEY%" IF "%UVICORN_WORKERS%"=="" SET UVICORN_WORKERS=1 -uvicorn open_webui.main:app --host "%HOST%" --port "%PORT%" --forwarded-allow-ips "%FORWARDED_ALLOW_IPS%" --workers %UVICORN_WORKERS% --ws auto +uvicorn open_webui.main:app --host "%HOST%" --port "%PORT%" --forwarded-allow-ips %FORWARDED_ALLOW_IPS% --workers %UVICORN_WORKERS% --ws auto :: For ssl user uvicorn open_webui.main:app --host "%HOST%" --port "%PORT%" --forwarded-allow-ips '*' --ssl-keyfile "key.pem" --ssl-certfile "cert.pem" --ws auto From f2cb63140c1109b9ea73ece97073dcb3f37ab8f3 Mon Sep 17 00:00:00 2001 From: Jacob Leksan <63938553+jmleksan@users.noreply.github.com> Date: Fri, 24 Apr 2026 02:45:10 -0400 Subject: [PATCH 22/51] perf: redirect default model profile image to canonical static URL (#24015) - Return 302 to /static/favicon.png instead of streaming the same PNG per model id so browsers can cache one asset for default avatars. - Validate stored /static/ paths with decode, normpath, and /static prefix checks; invalid paths fall back to favicon. Made-with: Cursor --- backend/open_webui/routers/models.py | 53 +++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/routers/models.py b/backend/open_webui/routers/models.py index 3ef0838fcc..079245d550 100644 --- a/backend/open_webui/routers/models.py +++ b/backend/open_webui/routers/models.py @@ -4,6 +4,8 @@ import base64 import json import asyncio import logging +import posixpath +from urllib.parse import unquote from open_webui.models.groups import Groups from open_webui.models.models import ( @@ -29,12 +31,12 @@ from fastapi import ( status, Response, ) -from fastapi.responses import FileResponse, StreamingResponse +from fastapi.responses import RedirectResponse, StreamingResponse from open_webui.utils.auth import get_admin_user, get_verified_user from open_webui.utils.access_control import has_permission, filter_allowed_access_grants -from open_webui.config import BYPASS_ADMIN_ACCESS_CONTROL, STATIC_DIR +from open_webui.config import BYPASS_ADMIN_ACCESS_CONTROL from open_webui.internal.db import get_async_session from sqlalchemy.ext.asyncio import AsyncSession @@ -43,6 +45,34 @@ log = logging.getLogger(__name__) router = APIRouter() +def _safe_static_redirect_path(url: str) -> Optional[str]: + """ + If url is a same-origin static asset path, return a normalized path safe for + RedirectResponse Location. Otherwise None (caller should fall back to default). + Rejects traversal (..), encoded dots, query/fragment, and non-/static targets. + """ + if not url or not isinstance(url, str): + return None + path = url.split('?', 1)[0].split('#', 1)[0].strip() + for _ in range(2): + decoded = unquote(path) + if decoded == path: + break + path = decoded + if '\x00' in path or '\\' in path: + return None + if not path.startswith('/'): + return None + normalized = posixpath.normpath(path) + if normalized in ('.', '/'): + return None + if not (normalized == '/static' or normalized.startswith('/static/')): + return None + if normalized == '/static': + return '/static/' + return normalized + + def is_valid_model_id(model_id: str) -> bool: return model_id and len(model_id) <= 256 @@ -465,10 +495,25 @@ async def get_model_profile_image( ) except Exception as e: pass + else: + safe_static = _safe_static_redirect_path(model.meta.profile_image_url) + if safe_static: + return RedirectResponse( + url=safe_static, + status_code=status.HTTP_302_FOUND, + ) - return FileResponse(f'{STATIC_DIR}/favicon.png') + # Canonical URL so browsers cache one asset for all default model avatars + # (distinct /profile/image?id=... URLs would otherwise re-download the same bytes). + return RedirectResponse( + url='/static/favicon.png', + status_code=status.HTTP_302_FOUND, + ) else: - return FileResponse(f'{STATIC_DIR}/favicon.png') + return RedirectResponse( + url='/static/favicon.png', + status_code=status.HTTP_302_FOUND, + ) ############################ From 26711c1bcc82bb03769545ca8d44e81a100b452e Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 15:46:08 +0900 Subject: [PATCH 23/51] refac --- backend/open_webui/main.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index b56659e721..2299ef84c4 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -1836,7 +1836,7 @@ async def chat_completion( except HTTPException: raise except Exception as e: - log.debug(f'Error processing chat metadata: {e}') + log.warning(f'Error processing chat metadata: {e}') raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=str(e), @@ -1908,6 +1908,15 @@ async def chat_completion( except Exception: pass + else: + # No chat_id/message_id → legacy/direct API path with no + # WebSocket error channel. We must surface the error as + # a proper HTTP response; without this the function would + # return None which FastAPI serializes as null. #23924 + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=error_detail, + ) finally: # MCP cleanup — MUST run in the SAME asyncio task as # connect() because the MCP SDK's streamablehttp_client From 5cc55e227815dbb9c466243f16d8358cfd845d82 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 15:51:54 +0900 Subject: [PATCH 24/51] refac --- backend/open_webui/utils/middleware.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index fa6c65f36d..813ced0466 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -4658,6 +4658,7 @@ async def streaming_chat_response_handler(response, ctx): **form_data, 'model': model_id, 'stream': True, + 'metadata': metadata, } if ENABLE_RESPONSES_API_STATEFUL and last_response_id: @@ -4881,6 +4882,7 @@ async def streaming_chat_response_handler(response, ctx): **form_data, 'model': model_id, 'stream': True, + 'metadata': metadata, 'messages': [ *form_data['messages'], *convert_output_to_messages(output, raw=True), From 678c44c7cdade74c14092fd4de549b7a3d737921 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 16:17:46 +0900 Subject: [PATCH 25/51] refac --- backend/open_webui/internal/db.py | 196 ++++++++++++------ backend/open_webui/migrations/env.py | 6 +- backend/open_webui/models/oauth_sessions.py | 15 ++ backend/open_webui/routers/auths.py | 45 +++- backend/open_webui/routers/tools.py | 1 + backend/open_webui/routers/users.py | 4 + src/lib/apis/auths/index.ts | 30 +++ src/lib/apis/configs/index.ts | 1 + src/lib/apis/tools/index.ts | 1 + src/lib/apis/users/index.ts | 1 + .../chat/MessageInput/IntegrationsMenu.svelte | 38 ++++ static/pyodide/pyodide-lock.json | 6 +- 12 files changed, 268 insertions(+), 76 deletions(-) diff --git a/backend/open_webui/internal/db.py b/backend/open_webui/internal/db.py index 25aa94591b..3a4a22c55d 100644 --- a/backend/open_webui/internal/db.py +++ b/backend/open_webui/internal/db.py @@ -3,6 +3,7 @@ import json import logging import ssl as _stdlib_ssl from contextlib import asynccontextmanager, contextmanager +from dataclasses import dataclass from typing import Any, Optional from urllib.parse import parse_qs, urlencode, urlparse, urlunparse @@ -37,90 +38,154 @@ from typing_extensions import Self log = logging.getLogger(__name__) -def extract_ssl_mode_from_url(url: str) -> tuple[str, str | None]: - """Strip SSL query-string parameters from a PostgreSQL URL. +@dataclass +class SSLParams: + """SSL parameters extracted from a PostgreSQL ``DATABASE_URL``. - asyncpg and psycopg2 use different query-string keys for SSL - (``ssl`` vs ``sslmode``). This helper removes **both** from the - URL so that each driver can receive the correct parameter through - its own mechanism (query-string re-injection for psycopg2, - ``connect_args`` for asyncpg). - - Returns - ------- - (url_without_ssl, ssl_mode) - *url_without_ssl* is the original URL with ``ssl`` / ``sslmode`` - query parameters removed. *ssl_mode* is the extracted mode - string (e.g. ``'require'``), or ``None`` if neither parameter - was present. - - Non-PostgreSQL URLs are returned unchanged with ``ssl_mode=None``. + Holds the connection-mode flag and optional certificate file paths + so that each driver (asyncpg, psycopg2/libpq) can receive them in + the format it expects. """ - if not url or not any(url.startswith(prefix) for prefix in ('postgresql://', 'postgresql+', 'postgres://')): - return url, None + + mode: str | None = None + rootcert: str | None = None + cert: str | None = None + key: str | None = None + crl: str | None = None + + def __bool__(self) -> bool: + return self.mode is not None + + @property + def has_any(self) -> bool: + """True when *any* SSL-related field is set (mode or cert files).""" + return any((self.mode, self.rootcert, self.cert, self.key, self.crl)) + + +# ── URL extraction / reattachment ──────────────────────────────────── + + +def _pop_first(params: dict[str, list[str]], key: str) -> str | None: + """Pop a single-valued query param, returning ``None`` if absent.""" + values = params.pop(key, None) + return values[0] if values else None + + +def extract_ssl_params_from_url(url: str) -> tuple[str, SSLParams]: + """Strip all SSL query-string parameters from a PostgreSQL URL. + + asyncpg does not accept libpq-style certificate-file keys + (``sslrootcert``, ``sslcert``, ``sslkey``, ``sslcrl``), so every + SSL-related key is removed and returned as a structured + :class:`SSLParams` object. + + Returns ``(url_without_ssl, ssl_params)``. Non-PostgreSQL URLs are + returned unchanged with an empty ``SSLParams``. + """ + if not url or not any( + url.startswith(p) for p in ('postgresql://', 'postgresql+', 'postgres://') + ): + return url, SSLParams() parsed = urlparse(url) - query_params = parse_qs(parsed.query, keep_blank_values=True) + qp = parse_qs(parsed.query, keep_blank_values=True) - # Prefer sslmode (libpq canonical) over the asyncpg-only ssl key. - ssl_mode: str | None = None - for key in ('sslmode', 'ssl'): - values = query_params.pop(key, None) - if values and ssl_mode is None: - ssl_mode = values[0] + # Prefer sslmode (libpq canonical) over the asyncpg-only ``ssl`` key. + # Both must be popped unconditionally so neither leaks into the cleaned URL. + sslmode_val = _pop_first(qp, 'sslmode') + ssl_val = _pop_first(qp, 'ssl') + ssl_mode = sslmode_val or ssl_val - if ssl_mode is None: - # Nothing to strip — return the URL untouched. - return url, None + params = SSLParams( + mode=ssl_mode, + rootcert=_pop_first(qp, 'sslrootcert'), + cert=_pop_first(qp, 'sslcert'), + key=_pop_first(qp, 'sslkey'), + crl=_pop_first(qp, 'sslcrl'), + ) - # Rebuild the query string without the SSL keys. - remaining_query = urlencode(query_params, doseq=True) - url_without_ssl = urlunparse(parsed._replace(query=remaining_query)) - return url_without_ssl, ssl_mode + if not params.has_any: + return url, params + + cleaned_query = urlencode(qp, doseq=True) + return urlunparse(parsed._replace(query=cleaned_query)), params -def build_asyncpg_ssl_args(ssl_mode: str | None) -> dict: - """Convert a libpq-style SSL mode value to asyncpg ``connect_args``. +def reattach_ssl_params_to_url(url_without_ssl: str, ssl_params: SSLParams) -> str: + """Re-append SSL query-string parameters to a cleaned PostgreSQL URL. + + Used for psycopg2/libpq consumers that expect ``sslmode`` and the + certificate-file keys in the connection string. + """ + if not ssl_params: + return url_without_ssl + + mapping = ( + ('sslmode', ssl_params.mode), + ('sslrootcert', ssl_params.rootcert), + ('sslcert', ssl_params.cert), + ('sslkey', ssl_params.key), + ('sslcrl', ssl_params.crl), + ) + parts = [f'{k}={v}' for k, v in mapping if v] + if not parts: + return url_without_ssl + + sep = '&' if '?' in url_without_ssl else '?' + return f'{url_without_ssl}{sep}{"&".join(parts)}' + + +# ── asyncpg SSLContext builder ─────────────────────────────────────── + + +def _make_ssl_context(ssl_params: SSLParams, *, verify: bool) -> _stdlib_ssl.SSLContext: + """Create an :class:`ssl.SSLContext` from *ssl_params*. + + When *verify* is ``False``, hostname checking and certificate + verification are disabled (matching libpq ``require`` semantics). + """ + ctx = _stdlib_ssl.create_default_context(cafile=ssl_params.rootcert) + if not verify: + ctx.check_hostname = False + ctx.verify_mode = _stdlib_ssl.CERT_NONE + if ssl_params.cert and ssl_params.key: + ctx.load_cert_chain(certfile=ssl_params.cert, keyfile=ssl_params.key) + if verify and ssl_params.crl: + ctx.load_verify_locations(cafile=ssl_params.crl) + ctx.verify_flags |= _stdlib_ssl.VERIFY_CRL_CHECK_LEAF + return ctx + + +def build_asyncpg_ssl_args(ssl_params: SSLParams) -> dict: + """Convert :class:`SSLParams` to asyncpg-compatible ``connect_args``. Returns a dict suitable for unpacking into - ``create_async_engine(..., connect_args=...)``. + ``create_async_engine(...)``. """ - if ssl_mode is None: + if not ssl_params: return {} - mode = ssl_mode.lower() + mode = (ssl_params.mode or 'require').lower() + if mode == 'disable': return {'connect_args': {'ssl': False}} if mode in ('allow', 'prefer'): - # asyncpg has no direct equivalent — omit to let it try without. return {} if mode == 'require': - # SSL required but no certificate verification (matches libpq). - ctx = _stdlib_ssl.create_default_context() - ctx.check_hostname = False - ctx.verify_mode = _stdlib_ssl.CERT_NONE - return {'connect_args': {'ssl': ctx}} + return {'connect_args': {'ssl': _make_ssl_context(ssl_params, verify=False)}} if mode in ('verify-ca', 'verify-full'): - # Full verification — use the system trust store. - ctx = _stdlib_ssl.create_default_context() + ctx = _make_ssl_context(ssl_params, verify=True) if mode == 'verify-ca': ctx.check_hostname = False return {'connect_args': {'ssl': ctx}} # Unknown value — pass through as-is and let asyncpg decide. - return {'connect_args': {'ssl': ssl_mode}} + return {'connect_args': {'ssl': ssl_params.mode}} -def reattach_ssl_mode_to_url(url_without_ssl: str, ssl_mode: str | None) -> str: - """Re-append ``sslmode=`` to a cleaned PostgreSQL URL. - - Used for psycopg2 / libpq consumers that expect the canonical - ``sslmode`` query-string key. - """ - if ssl_mode is None: - return url_without_ssl - separator = '&' if '?' in url_without_ssl else '?' - return f'{url_without_ssl}{separator}sslmode={ssl_mode}' +# Backwards-compatible aliases for external callers. +extract_ssl_mode_from_url = extract_ssl_params_from_url +reattach_ssl_mode_to_url = reattach_ssl_params_to_url class JSONField(types.TypeDecorator): @@ -150,9 +215,10 @@ class JSONField(types.TypeDecorator): def handle_peewee_migration(DATABASE_URL): db = None try: - # Normalize SSL params so psycopg2 always sees `sslmode=` (never `ssl=`). - url_without_ssl, ssl_mode = extract_ssl_mode_from_url(DATABASE_URL) - normalized_url = reattach_ssl_mode_to_url(url_without_ssl, ssl_mode) + # Normalize SSL params so psycopg2 always sees `sslmode=` (never `ssl=`) + # and cert-file params are preserved in the connection string. + url_without_ssl, ssl_params = extract_ssl_params_from_url(DATABASE_URL) + normalized_url = reattach_ssl_params_to_url(url_without_ssl, ssl_params) # Replace the postgresql:// with postgres:// to handle the peewee migration db = register_connection(normalized_url.replace('postgresql://', 'postgres://')) @@ -181,11 +247,11 @@ if ENABLE_DB_MIGRATIONS: # Normalize SSL params from the URL once; each engine branch re-injects # the driver-appropriate form. -DATABASE_URL_WITHOUT_SSL, DATABASE_SSL_MODE = extract_ssl_mode_from_url(DATABASE_URL) +DATABASE_URL_WITHOUT_SSL, DATABASE_SSL_PARAMS = extract_ssl_params_from_url(DATABASE_URL) -# For psycopg2 (sync engine), re-append sslmode=. +# For psycopg2 (sync engine), re-append sslmode + cert-file params. SQLALCHEMY_DATABASE_URL = ( - reattach_ssl_mode_to_url(DATABASE_URL_WITHOUT_SSL, DATABASE_SSL_MODE) if DATABASE_SSL_MODE else DATABASE_URL + reattach_ssl_params_to_url(DATABASE_URL_WITHOUT_SSL, DATABASE_SSL_PARAMS) if DATABASE_SSL_PARAMS else DATABASE_URL ) @@ -331,7 +397,7 @@ get_db = contextmanager(get_session) # Use the SSL-stripped URL for asyncpg — SSL is injected via connect_args. ASYNC_SQLALCHEMY_DATABASE_URL = _make_async_url( - DATABASE_URL_WITHOUT_SSL if DATABASE_SSL_MODE else SQLALCHEMY_DATABASE_URL + DATABASE_URL_WITHOUT_SSL if DATABASE_SSL_PARAMS else SQLALCHEMY_DATABASE_URL ) if 'sqlite' in ASYNC_SQLALCHEMY_DATABASE_URL: @@ -352,7 +418,7 @@ if 'sqlite' in ASYNC_SQLALCHEMY_DATABASE_URL: else: # Inject asyncpg-compatible SSL connect_args when the user specified # sslmode/ssl in DATABASE_URL. - asyncpg_ssl_args = build_asyncpg_ssl_args(DATABASE_SSL_MODE) + asyncpg_ssl_args = build_asyncpg_ssl_args(DATABASE_SSL_PARAMS) if isinstance(DATABASE_POOL_SIZE, int): if DATABASE_POOL_SIZE > 0: diff --git a/backend/open_webui/migrations/env.py b/backend/open_webui/migrations/env.py index f5e57920ea..ea4839ebc1 100644 --- a/backend/open_webui/migrations/env.py +++ b/backend/open_webui/migrations/env.py @@ -5,7 +5,7 @@ from alembic import context from open_webui.models.auths import Auth from open_webui.models.calendar import Calendar, CalendarEvent, CalendarEventAttendee # noqa: F401 from open_webui.env import DATABASE_URL, DATABASE_PASSWORD, LOG_FORMAT -from open_webui.internal.db import extract_ssl_mode_from_url, reattach_ssl_mode_to_url +from open_webui.internal.db import extract_ssl_params_from_url, reattach_ssl_params_to_url from sqlalchemy import engine_from_config, pool, create_engine # this is the Alembic Config object, which provides @@ -38,8 +38,8 @@ target_metadata = Auth.metadata DB_URL = DATABASE_URL # Normalize SSL query params for psycopg2 (Alembic uses psycopg2, not asyncpg). -url_without_ssl, ssl_mode = extract_ssl_mode_from_url(DB_URL) -DB_URL = reattach_ssl_mode_to_url(url_without_ssl, ssl_mode) if ssl_mode else DB_URL +url_without_ssl, ssl_params = extract_ssl_params_from_url(DB_URL) +DB_URL = reattach_ssl_params_to_url(url_without_ssl, ssl_params) if ssl_params else DB_URL if DB_URL: config.set_main_option('sqlalchemy.url', DB_URL.replace('%', '%%')) diff --git a/backend/open_webui/models/oauth_sessions.py b/backend/open_webui/models/oauth_sessions.py index 050a50d486..fce18ae586 100644 --- a/backend/open_webui/models/oauth_sessions.py +++ b/backend/open_webui/models/oauth_sessions.py @@ -320,6 +320,21 @@ class OAuthSessionTable: log.error(f'Error deleting OAuth sessions by user ID: {e}') return False + async def delete_sessions_by_user_id_and_provider( + self, user_id: str, provider: str, db: Optional[AsyncSession] = None + ) -> bool: + """Delete all OAuth sessions for a specific user and provider""" + try: + async with get_async_db_context(db) as db: + result = await db.execute( + delete(OAuthSession).filter_by(user_id=user_id, provider=provider) + ) + await db.commit() + return result.rowcount > 0 + except Exception as e: + log.error(f'Error deleting OAuth sessions for user {user_id} and provider {provider}: {e}') + return False + async def delete_sessions_by_provider(self, provider: str, db: Optional[AsyncSession] = None) -> bool: """Delete all OAuth sessions for a provider""" try: diff --git a/backend/open_webui/routers/auths.py b/backend/open_webui/routers/auths.py index 2a6f0f6dcd..7cb6ca3681 100644 --- a/backend/open_webui/routers/auths.py +++ b/backend/open_webui/routers/auths.py @@ -172,10 +172,17 @@ async def get_session_user( user=Depends(get_current_user), db: AsyncSession = Depends(get_async_session), ): + token = None auth_header = request.headers.get('Authorization') - auth_token = get_http_authorization_cred(auth_header) - token = auth_token.credentials - data = decode_token(token) + if auth_header: + auth_token = get_http_authorization_cred(auth_header) + if auth_token is not None: + token = auth_token.credentials + if token is None: + token = request.cookies.get('token') + if token is None and getattr(request.state, 'token', None): + token = request.state.token.credentials + data = decode_token(token) if token else None expires_at = None @@ -773,8 +780,9 @@ async def signout(request: Request, response: Response, db: AsyncSession = Depen auth_header = request.headers.get('Authorization') if auth_header: auth_cred = get_http_authorization_cred(auth_header) - token = auth_cred.credentials - else: + if auth_cred is not None: + token = auth_cred.credentials + if token is None: token = request.cookies.get('token') if token: @@ -853,6 +861,33 @@ async def signout(request: Request, response: Response, db: AsyncSession = Depen return JSONResponse(status_code=200, content={'status': True}, headers=response.headers) +############################ +# OAuth Session Management +############################ + + +@router.delete('/oauth/sessions/{provider:path}', response_model=bool) +async def delete_oauth_session_by_provider( + provider: str, + user=Depends(get_verified_user), + db: AsyncSession = Depends(get_async_session), +): + """ + Disconnect the current user's OAuth session for a specific provider. + The provider string matches the 'provider' field in the oauth_session table + (e.g. 'mcp:server-id' for MCP connections). + """ + result = await OAuthSessions.delete_sessions_by_user_id_and_provider( + user.id, provider, db=db + ) + if not result: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail='No OAuth session found for this provider', + ) + return True + + ############################ # AddUser ############################ diff --git a/backend/open_webui/routers/tools.py b/backend/open_webui/routers/tools.py index 04d845c3de..af5e795511 100644 --- a/backend/open_webui/routers/tools.py +++ b/backend/open_webui/routers/tools.py @@ -917,3 +917,4 @@ async def update_tools_user_valves_by_id( status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND, ) + diff --git a/backend/open_webui/routers/users.py b/backend/open_webui/routers/users.py index 9dec855e45..04be89c92f 100644 --- a/backend/open_webui/routers/users.py +++ b/backend/open_webui/routers/users.py @@ -550,6 +550,8 @@ async def update_user_by_id( detail=ERROR_MESSAGES.ACTION_PROHIBITED, ) + except HTTPException: + raise except Exception as e: log.error(f'Error checking primary admin status: {e}') raise HTTPException( @@ -631,6 +633,8 @@ async def delete_user_by_id(user_id: str, user=Depends(get_admin_user), db: Asyn status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.ACTION_PROHIBITED, ) + except HTTPException: + raise except Exception as e: log.error(f'Error checking primary admin status: {e}') raise HTTPException( diff --git a/src/lib/apis/auths/index.ts b/src/lib/apis/auths/index.ts index c501a36ed7..b8494ceedf 100644 --- a/src/lib/apis/auths/index.ts +++ b/src/lib/apis/auths/index.ts @@ -712,3 +712,33 @@ export const deleteAPIKey = async (token: string) => { } return res; }; + +export const deleteOAuthSession = async (token: string, provider: string) => { + let error = null; + + const res = await fetch( + `${WEBUI_API_BASE_URL}/auths/oauth/sessions/${encodeURIComponent(provider)}`, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}` + } + } + ) + .then(async (res) => { + if (!res.ok) throw await res.json(); + return res.json(); + }) + .catch((err) => { + console.error(err); + error = err.detail; + return null; + }); + + if (error) { + throw error; + } + + return res; +}; diff --git a/src/lib/apis/configs/index.ts b/src/lib/apis/configs/index.ts index 6b7bf6f47b..b0dd6541ee 100644 --- a/src/lib/apis/configs/index.ts +++ b/src/lib/apis/configs/index.ts @@ -647,3 +647,4 @@ export const setBanners = async (token: string, banners: Banner[]) => { return res; }; + diff --git a/src/lib/apis/tools/index.ts b/src/lib/apis/tools/index.ts index 5d26e50fee..1d812b3f0f 100644 --- a/src/lib/apis/tools/index.ts +++ b/src/lib/apis/tools/index.ts @@ -483,3 +483,4 @@ export const updateUserValvesById = async (token: string, id: string, valves: ob return res; }; + diff --git a/src/lib/apis/users/index.ts b/src/lib/apis/users/index.ts index 91b63338de..13044c09d5 100644 --- a/src/lib/apis/users/index.ts +++ b/src/lib/apis/users/index.ts @@ -550,3 +550,4 @@ export const getUserGroupsById = async (token: string, userId: string) => { return res; }; + diff --git a/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte b/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte index 3659122152..5d703e3113 100644 --- a/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte +++ b/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte @@ -13,8 +13,11 @@ } from '$lib/stores'; import { getOAuthClientAuthorizationUrl } from '$lib/apis/configs'; + import { deleteOAuthSession } from '$lib/apis/auths'; import { getTools } from '$lib/apis/tools'; + import { toast } from 'svelte-sonner'; + import Knobs from '$lib/components/icons/Knobs.svelte'; import Dropdown from '$lib/components/common/Dropdown.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte'; @@ -27,6 +30,7 @@ import Terminal from '$lib/components/icons/Terminal.svelte'; import ChevronRight from '$lib/components/icons/ChevronRight.svelte'; import ChevronLeft from '$lib/components/icons/ChevronLeft.svelte'; + import LinkSlash from '$lib/components/icons/LinkSlash.svelte'; const i18n = getContext('i18n'); @@ -375,6 +379,40 @@
+ {#if (tools[toolId]?.authenticated ?? true) && toolId.startsWith('server:mcp:')} +
+ + + +
+ {/if} + {#if tools[toolId]?.has_user_valves && ($user?.role === 'admin' || ($user?.permissions?.chat?.valves ?? true))}
diff --git a/static/pyodide/pyodide-lock.json b/static/pyodide/pyodide-lock.json index 138f33a8ff..440679ecbf 100644 --- a/static/pyodide/pyodide-lock.json +++ b/static/pyodide/pyodide-lock.json @@ -4987,10 +4987,10 @@ }, "pathspec": { "name": "pathspec", - "version": "1.0.4", - "file_name": "pathspec-1.0.4-py3-none-any.whl", + "version": "1.1.0", + "file_name": "pathspec-1.1.0-py3-none-any.whl", "install_dir": "site", - "sha256": "fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", + "sha256": "574b128f7456bd899045ccd142dd446af7e6cfd0072d63ad73fbc55fbb4aaa42", "package_type": "package", "imports": [ "pathspec" From d740b545a4b58a52dd3f7154fa637929e037ed54 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 16:21:37 +0900 Subject: [PATCH 26/51] refac --- src/lib/components/chat/MessageInput/IntegrationsMenu.svelte | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte b/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte index 5d703e3113..a62b3a2438 100644 --- a/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte +++ b/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte @@ -399,9 +399,8 @@ // Refresh tools to update authenticated state _tools.set(await getTools(localStorage.token)); - - // Remove from selected if it was selected selectedToolIds = selectedToolIds.filter((id) => id !== toolId); + await init(); } catch (err) { toast.error(err ?? $i18n.t('Failed to disconnect')); } From db05fdaf8366d327dbe33550aa917dea1f4c0e16 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 16:23:28 +0900 Subject: [PATCH 27/51] refac --- backend/open_webui/env.py | 6 ++++++ backend/open_webui/utils/asgi_middleware.py | 12 ++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/env.py b/backend/open_webui/env.py index 26a8d376c5..e734a2f865 100644 --- a/backend/open_webui/env.py +++ b/backend/open_webui/env.py @@ -525,6 +525,12 @@ WEBUI_AUTH_TRUSTED_NAME_HEADER = os.environ.get('WEBUI_AUTH_TRUSTED_NAME_HEADER' WEBUI_AUTH_TRUSTED_GROUPS_HEADER = os.environ.get('WEBUI_AUTH_TRUSTED_GROUPS_HEADER', None) WEBUI_AUTH_TRUSTED_ROLE_HEADER = os.environ.get('WEBUI_AUTH_TRUSTED_ROLE_HEADER', None) +# Custom header name for API key authentication. Defaults to 'x-api-key'. +# Useful when Open WebUI sits behind a reverse proxy / API gateway that +# already uses the Authorization header for its own authentication — set +# this to a unique header (e.g. 'X-OpenWebUI-Key') so the middleware +# checks the custom header instead and avoids the 401 short-circuit. +CUSTOM_API_KEY_HEADER = os.environ.get('CUSTOM_API_KEY_HEADER', 'x-api-key') ENABLE_PASSWORD_VALIDATION = os.environ.get('ENABLE_PASSWORD_VALIDATION', 'False').lower() == 'true' PASSWORD_VALIDATION_REGEX_PATTERN = os.environ.get( diff --git a/backend/open_webui/utils/asgi_middleware.py b/backend/open_webui/utils/asgi_middleware.py index 05389d8f94..e3872dd231 100644 --- a/backend/open_webui/utils/asgi_middleware.py +++ b/backend/open_webui/utils/asgi_middleware.py @@ -41,6 +41,7 @@ from starlette.datastructures import MutableHeaders from starlette.requests import Request from starlette.types import ASGIApp, Message, Receive, Scope, Send +from open_webui.env import CUSTOM_API_KEY_HEADER from open_webui.internal.db import ScopedSession from open_webui.utils.auth import get_http_authorization_cred @@ -119,9 +120,16 @@ class CommitSessionMiddleware: class AuthTokenMiddleware: - """Extract the bearer/cookie/x-api-key credential and stash it on + """Extract the bearer/cookie/API-key credential and stash it on `request.state.token`. + The header used for API-key transport is controlled by the + ``CUSTOM_API_KEY_HEADER`` environment variable (default ``x-api-key``). + This is useful when Open WebUI sits behind a reverse proxy that + consumes the ``Authorization`` header for its own authentication — + set the env var to a unique header (e.g. ``X-OpenWebUI-Key``) so + the middleware checks that instead and avoids the 401 short-circuit. + Routes that depend on `get_verified_user` etc. read this state. Also exposes `request.state.enable_api_keys` (snapshotted at request entry from runtime config) and stamps an `X-Process-Time` response @@ -146,7 +154,7 @@ class AuthTokenMiddleware: if cookie_token: token = HTTPAuthorizationCredentials(scheme='Bearer', credentials=cookie_token) if token is None: - api_key = request.headers.get('x-api-key') + api_key = request.headers.get(CUSTOM_API_KEY_HEADER) if api_key: token = HTTPAuthorizationCredentials(scheme='Bearer', credentials=api_key) From 5774ab4984c0b32ebd30d2e64b764c9582ab17c2 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 16:26:34 +0900 Subject: [PATCH 28/51] refac --- backend/open_webui/utils/oauth.py | 74 +++++++++++++++++++------------ 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/backend/open_webui/utils/oauth.py b/backend/open_webui/utils/oauth.py index 47302e7535..4a7d79d87c 100644 --- a/backend/open_webui/utils/oauth.py +++ b/backend/open_webui/utils/oauth.py @@ -304,57 +304,67 @@ async def get_authorization_server_discovery_urls(server_url: str) -> list[str]: ssl=AIOHTTP_CLIENT_SESSION_SSL, ) as response: if response.status == 401: + resource_metadata_urls = [] match = re.search( r'resource_metadata=(?:"([^"]+)"|([^\s,]+))', response.headers.get('WWW-Authenticate', ''), ) if match: - resource_metadata_url = match.group(1) or match.group(2) - log.debug(f'Found resource_metadata URL: {resource_metadata_url}') + resource_metadata_urls = [match.group(1) or match.group(2)] + log.debug(f'Found resource_metadata URL: {resource_metadata_urls[0]}') + else: + # Fall back to well-known resource metadata URIs (RFC 9728 §4.2) + parsed, base_url = get_parsed_and_base_url(server_url) + if parsed.path and parsed.path != '/': + path = parsed.path.rstrip('/') + resource_metadata_urls.append( + urllib.parse.urljoin(base_url, f'/.well-known/oauth-protected-resource{path}') + ) + resource_metadata_urls.append( + urllib.parse.urljoin(base_url, '/.well-known/oauth-protected-resource') + ) + log.debug(f'No resource_metadata in header, trying well-known URIs: {resource_metadata_urls}') - # Step 2: Fetch Protected Resource metadata - async with session.get( - resource_metadata_url, ssl=AIOHTTP_CLIENT_SESSION_SSL - ) as resource_response: - if resource_response.status == 200: - resource_metadata = await resource_response.json() + # Fetch Protected Resource metadata from candidate URLs + for resource_metadata_url in resource_metadata_urls: + try: + async with session.get( + resource_metadata_url, ssl=AIOHTTP_CLIENT_SESSION_SSL + ) as resource_response: + if resource_response.status == 200: + resource_metadata = await resource_response.json() - # Step 3: Extract authorization_servers - servers = resource_metadata.get('authorization_servers', []) - if servers: - authorization_servers = servers - log.debug(f'Discovered authorization servers: {servers}') + servers = resource_metadata.get('authorization_servers', []) + if servers: + authorization_servers = servers + log.debug(f'Discovered authorization servers: {servers}') + break + except Exception as e: + log.debug(f'Failed to fetch resource metadata from {resource_metadata_url}: {e}') + continue except Exception as e: log.debug(f'MCP Protected Resource discovery failed: {e}') discovery_urls = [] for auth_server in authorization_servers: auth_server = auth_server.rstrip('/') - discovery_urls.extend( - [ - f'{auth_server}/.well-known/oauth-authorization-server', - f'{auth_server}/.well-known/openid-configuration', - ] - ) + discovery_urls.extend(_build_well_known_urls(auth_server)) return discovery_urls -async def get_discovery_urls(server_url) -> list[str]: - urls = await get_authorization_server_discovery_urls(server_url) +def _build_well_known_urls(server_url: str) -> list[str]: + """Build RFC 8414 / OIDC Discovery well-known URLs for a server URL.""" parsed, base_url = get_parsed_and_base_url(server_url) + urls = [] if parsed.path and parsed.path != '/': - # Generate discovery URLs based on https://modelcontextprotocol.io/specification/draft/basic/authorization#authorization-server-metadata-discovery - tenant = parsed.path.rstrip('/') + path = parsed.path.rstrip('/') urls.extend( [ - urllib.parse.urljoin( - base_url, - f'/.well-known/oauth-authorization-server{tenant}', - ), - urllib.parse.urljoin(base_url, f'/.well-known/openid-configuration{tenant}'), - urllib.parse.urljoin(base_url, f'{tenant}/.well-known/openid-configuration'), + urllib.parse.urljoin(base_url, f'/.well-known/oauth-authorization-server{path}'), + urllib.parse.urljoin(base_url, f'/.well-known/openid-configuration{path}'), + urllib.parse.urljoin(base_url, f'{path}/.well-known/openid-configuration'), ] ) @@ -368,6 +378,12 @@ async def get_discovery_urls(server_url) -> list[str]: return urls +async def get_discovery_urls(server_url) -> list[str]: + urls = await get_authorization_server_discovery_urls(server_url) + urls.extend(_build_well_known_urls(server_url)) + return urls + + # TODO: Some OAuth providers require Initial Access Tokens (IATs) for dynamic client registration. # This is not currently supported. async def get_oauth_client_info_with_dynamic_client_registration( From d6b73ea2f2951a48e8a422e27fc6d3e53371cc17 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 16:31:02 +0900 Subject: [PATCH 29/51] refac --- backend/open_webui/utils/response.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/backend/open_webui/utils/response.py b/backend/open_webui/utils/response.py index 641c79fca9..676a07525e 100644 --- a/backend/open_webui/utils/response.py +++ b/backend/open_webui/utils/response.py @@ -135,6 +135,9 @@ def convert_response_ollama_to_openai(ollama_response: dict) -> dict: async def convert_streaming_response_ollama_to_openai(ollama_streaming_response): has_tool_calls = False + # All chunks in a single completion must share the same id (OpenAI spec). + completion_id = f'chatcmpl-{str(uuid4())}' + first = True async for data in ollama_streaming_response.body_iterator: data = json.loads(data) @@ -155,6 +158,12 @@ async def convert_streaming_response_ollama_to_openai(ollama_streaming_response) usage = convert_ollama_usage_to_openai(data) data = openai_chat_chunk_message_template(model, message_content, reasoning_content, openai_tool_calls, usage) + data['id'] = completion_id + + # First chunk must carry delta.role (OpenAI spec). + if first: + data['choices'][0]['delta']['role'] = 'assistant' + first = False if done and has_tool_calls: data['choices'][0]['finish_reason'] = 'tool_calls' From 465d6fe5143fbebaef025e5595e71ac4e13c40b4 Mon Sep 17 00:00:00 2001 From: Jacob Leksan <63938553+jmleksan@users.noreply.github.com> Date: Fri, 24 Apr 2026 03:33:46 -0400 Subject: [PATCH 30/51] feat: enhance RichTextInput configuration to prevent duplicate extensions when rich text is enabled (#24009) --- src/lib/components/common/RichTextInput.svelte | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/lib/components/common/RichTextInput.svelte b/src/lib/components/common/RichTextInput.svelte index 8c4006d280..99fa025055 100644 --- a/src/lib/components/common/RichTextInput.svelte +++ b/src/lib/components/common/RichTextInput.svelte @@ -737,6 +737,17 @@ StarterKit.configure({ link: link, code: false, // Disabled in favor of FixedCode (see workaround above) + // When rich text is on, ListKit + CodeBlockLowlight provide these. + // Disable StarterKit's equivalents to avoid duplicate extension names. + ...(richText + ? { + codeBlock: false, + bulletList: false, + orderedList: false, + listItem: false, + listKeymap: false + } + : {}), // When rich text is off, disable Strike from StarterKit so we can // re-add it below without its Mod-Shift-s shortcut (which conflicts // with the Toggle Sidebar shortcut). When rich text is on, the user From 62693938a3ae993716cad3fd409ec985e329bc86 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 16:36:07 +0900 Subject: [PATCH 31/51] refac --- backend/open_webui/utils/mcp/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/utils/mcp/client.py b/backend/open_webui/utils/mcp/client.py index 759bcc0a31..205b5a0b5a 100644 --- a/backend/open_webui/utils/mcp/client.py +++ b/backend/open_webui/utils/mcp/client.py @@ -44,7 +44,7 @@ def create_httpx_client(headers=None, timeout=None, auth=None): return _build_httpx_client(headers=headers, timeout=timeout, auth=auth, verify=True) -async def create_insecure_httpx_client(headers=None, timeout=None, auth=None): +def create_insecure_httpx_client(headers=None, timeout=None, auth=None): return _build_httpx_client(headers=headers, timeout=timeout, auth=auth, verify=False) From d8b55afb00ee308bdfd482e39728e1401d2f2911 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 16:37:02 +0900 Subject: [PATCH 32/51] refac --- backend/open_webui/utils/middleware.py | 44 +++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 813ced0466..3fd4d011df 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -2180,6 +2180,43 @@ def process_messages_with_output(messages: list[dict]) -> list[dict]: return processed +SKILL_MENTION_RE = re.compile(r'<\$([^|>]+)\|?[^>]*>') + + +def _get_text_parts(message: dict) -> list[str]: + """Return all text segments from a message's content.""" + content = message.get('content') + if isinstance(content, str): + return [content] + if isinstance(content, list): + return [p.get('text', '') for p in content if isinstance(p, dict) and p.get('type') == 'text'] + return [] + + +def extract_skill_ids_from_messages(messages: list[dict]) -> set[str]: + """Extract skill IDs from <$skillId|label> mention tags in messages.""" + ids: set[str] = set() + for message in messages: + for text in _get_text_parts(message): + ids.update(m.group(1) for m in SKILL_MENTION_RE.finditer(text)) + return ids + + +def strip_skill_mentions(messages: list[dict]) -> None: + """Strip <$skillId|label> mention tags from message content in-place.""" + strip_re = re.compile(r'<\$[^>]+>') + for message in messages: + content = message.get('content') + if isinstance(content, str) and strip_re.search(content): + message['content'] = strip_re.sub('', content).strip() + elif isinstance(content, list): + for part in content: + if isinstance(part, dict) and part.get('type') == 'text': + text = part.get('text', '') + if strip_re.search(text): + part['text'] = strip_re.sub('', text).strip() + + async def process_chat_payload(request, form_data, user, metadata, model): # Pipeline Inlet -> Filter Inlet -> Chat Memory -> Chat Web Search -> Chat Image Generation # -> Chat Code Interpreter (Form Data Update) -> (Default) Chat Tools Function Calling @@ -2465,8 +2502,10 @@ async def process_chat_payload(request, form_data, user, metadata, model): # tool resolution (tool_ids, MCP servers, builtin tools). payload_tools = form_data.get('tools', None) - # Skills + # Skills — extract IDs from message content (<$skillId|label> tags) so + # persisted chats work without relying on the frontend to send skill_ids. user_skill_ids = set(form_data.pop('skill_ids', None) or []) + user_skill_ids |= extract_skill_ids_from_messages(form_data.get('messages', [])) model_skill_ids = set(model.get('info', {}).get('meta', {}).get('skillIds', [])) all_skill_ids = user_skill_ids | model_skill_ids @@ -2502,6 +2541,9 @@ async def process_chat_payload(request, form_data, user, metadata, model): append=True, ) + # Strip <$skillId|label> mention tags so the model doesn't see raw markup. + strip_skill_mentions(form_data.get('messages', [])) + prompt = get_last_user_message(form_data['messages']) # TODO: re-enable URL extraction from prompt # urls = [] From 3e14524154c7eb1a53d015d67eab4cb199cbe511 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 16:39:44 +0900 Subject: [PATCH 33/51] refac --- src/routes/+layout.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 0dc8170eef..01d9c10b65 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -489,7 +489,7 @@ const displayTitle = title || $i18n.t('New Chat'); if (done) { - if ($settings?.notificationSoundAlways ?? false) { + if (($settings?.notificationSound ?? true) && ($settings?.notificationSoundAlways ?? false)) { playingNotificationSound.set(true); const audio = new Audio(`/audio/notification.mp3`); From 752238247c251cd0bd974b25beee69112939b101 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 16:47:30 +0900 Subject: [PATCH 34/51] refac --- backend/requirements.txt | 1 + pyproject.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/backend/requirements.txt b/backend/requirements.txt index 3437ab7652..539835dd22 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -19,6 +19,7 @@ aiocache==0.12.3 aiofiles==25.1.0 starlette-compress==1.7.0 Brotli==1.2.0 +brotlicffi==1.2.0.1 httpx[socks,http2,zstd,cli,brotli]==0.28.1 starsessions[redis]==2.2.1 python-mimeparse==2.0.0 diff --git a/pyproject.toml b/pyproject.toml index 3d458de753..2a802637a1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,6 +27,7 @@ dependencies = [ "aiofiles==25.1.0", "starlette-compress==1.7.0", "Brotli==1.2.0", + "brotlicffi==1.2.0.1", "httpx[socks,http2,zstd,cli,brotli]==0.28.1", "starsessions[redis]==2.2.1", "python-mimeparse==2.0.0", From 9771898c5886850be0696d4d09a1f85afa55de5c Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 17:04:47 +0900 Subject: [PATCH 35/51] refac --- backend/open_webui/main.py | 23 ++++++++++++++++++----- backend/open_webui/utils/mcp/client.py | 16 ++++++++-------- backend/requirements-min.txt | 1 + 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 2299ef84c4..9bc6b5177d 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -1923,8 +1923,6 @@ async def chat_completion( # uses anyio task groups whose cancel scopes enforce # same-task exit. Do NOT wrap in asyncio.shield() or # asyncio.wait_for() — both create a new task. - # MCPClient.disconnect() self-shields via - # anyio.CancelScope(shield=True). try: if mcp_clients := metadata.get('mcp_clients'): for client in reversed(list(mcp_clients.values())): @@ -1932,14 +1930,29 @@ async def chat_completion( await client.disconnect() except Exception as e: log.debug(f'Error disconnecting MCP client: {e}') + except asyncio.CancelledError: + # Let the client close asynchronously by GC + pass except Exception as e: log.debug(f'Error cleaning up MCP clients: {e}') + except asyncio.CancelledError: + pass try: if metadata.get('chat_id'): - event_emitter = await get_event_emitter(metadata, update_db=False) - if event_emitter: - await event_emitter({'type': 'chat:active', 'data': {'active': False}}) + async def emit_inactive_event(): + try: + event_emitter = await get_event_emitter(metadata, update_db=False) + if event_emitter: + await event_emitter({'type': 'chat:active', 'data': {'active': False}}) + except Exception: + pass + + try: + # Shield the event emission so it finishes even if the main task is cancelled + await asyncio.shield(emit_inactive_event()) + except asyncio.CancelledError: + pass except Exception: pass diff --git a/backend/open_webui/utils/mcp/client.py b/backend/open_webui/utils/mcp/client.py index 205b5a0b5a..7a5aa61b80 100644 --- a/backend/open_webui/utils/mcp/client.py +++ b/backend/open_webui/utils/mcp/client.py @@ -156,14 +156,14 @@ class MCPClient: try: # IMPORTANT: Do NOT use asyncio.shield() or asyncio.wait_for() - # here — both create a new asyncio task. The MCP SDK's - # streamablehttp_client uses anyio task groups / cancel scopes - # that MUST be exited in the same task they were entered in. - # Using anyio.CancelScope(shield=True) protects from - # CancelledError while staying in the current task. - with anyio.CancelScope(shield=True): - with anyio.fail_after(5.0): - await exit_stack.aclose() + # because they create a new asyncio task, which violates the MCP SDK's + # requirement that its TaskGroup be exited in the exact same task. + # ALSO do NOT use anyio.CancelScope(shield=True) or anyio.fail_after(), + # because they push a new cancel scope onto the task, violating LIFO + # order when aclose() attempts to exit the inner TaskGroup. + # We simply call aclose() directly. If the task is cancelled, the + # sockets will eventually be cleaned up by garbage collection. + await exit_stack.aclose() except TimeoutError: log.warning('MCPClient.disconnect() timed out after 5 s') except RuntimeError as exc: diff --git a/backend/requirements-min.txt b/backend/requirements-min.txt index b7dfd69ffd..950a458c8f 100644 --- a/backend/requirements-min.txt +++ b/backend/requirements-min.txt @@ -22,6 +22,7 @@ aiocache aiofiles starlette-compress==1.7.0 Brotli==1.2.0 +brotlicffi==1.2.0.1 httpx[socks,http2,zstd,cli,brotli]==0.28.1 starsessions[redis]==2.2.1 From 34a55d45247628ca954a3506fc24e5160d3e2c7b Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 17:06:36 +0900 Subject: [PATCH 36/51] refac --- src/lib/components/chat/ContentRenderer/FloatingButtons.svelte | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte b/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte index 8f0a8f7ec6..d8057acc96 100644 --- a/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte +++ b/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte @@ -120,8 +120,6 @@ [res, controller] = await chatCompletion(localStorage.token, { model: model, model_item: $models.find((m) => m.id === model), - session_id: $socket?.id, - chat_id: $chatId, messages: [ ...messages, { From 60f67c7c17e65d0989a4bc3f1eb283feeddb76ad Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 17:07:23 +0900 Subject: [PATCH 37/51] refac --- backend/open_webui/retrieval/loaders/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/retrieval/loaders/main.py b/backend/open_webui/retrieval/loaders/main.py index 27c81f7f81..7a115ca6d7 100644 --- a/backend/open_webui/retrieval/loaders/main.py +++ b/backend/open_webui/retrieval/loaders/main.py @@ -25,7 +25,7 @@ from open_webui.retrieval.loaders.datalab_marker import DatalabMarkerLoader from open_webui.retrieval.loaders.mineru import MinerULoader from open_webui.retrieval.loaders.paddleocr_vl import PaddleOCRVLLoader -from open_webui.env import GLOBAL_LOG_LEVEL, REQUESTS_VERIFY +from open_webui.env import GLOBAL_LOG_LEVEL, REQUESTS_VERIFY, AIOHTTP_CLIENT_SESSION_SSL logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL) log = logging.getLogger(__name__) @@ -205,6 +205,7 @@ class DoclingLoader: **self.params, }, headers=headers, + verify=AIOHTTP_CLIENT_SESSION_SSL, ) if r.ok: result = r.json() From 2419899ac663f2fb2e2a44c16ad94581a2a087b8 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 17:34:12 +0900 Subject: [PATCH 38/51] refac --- Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Dockerfile b/Dockerfile index d5c40f15e9..88ffd09752 100644 --- a/Dockerfile +++ b/Dockerfile @@ -135,6 +135,9 @@ RUN apt-get update && \ # install python dependencies COPY --chown=$UID:$GID ./backend/requirements.txt ./requirements.txt +# Set UV_LINK_MODE to copy to prevent 0-byte file corruption in QEMU arm64 cross-builds +ENV UV_LINK_MODE=copy + RUN set -e; \ pip3 install --no-cache-dir uv; \ if [ "$USE_CUDA" = "true" ]; then \ From a7a92d2d9b33234e7e5a92429151dbf195dd72d1 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 17:49:22 +0900 Subject: [PATCH 39/51] refac --- backend/open_webui/models/models.py | 2 ++ src/lib/apis/models/index.ts | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/models/models.py b/backend/open_webui/models/models.py index 9bd3f888c1..71296b295e 100755 --- a/backend/open_webui/models/models.py +++ b/backend/open_webui/models/models.py @@ -143,6 +143,8 @@ class ModelAccessListResponse(BaseModel): class ModelForm(BaseModel): + model_config = ConfigDict(extra='ignore') + id: str base_model_id: Optional[str] = None name: str diff --git a/src/lib/apis/models/index.ts b/src/lib/apis/models/index.ts index 05f273c306..e7abaa309e 100644 --- a/src/lib/apis/models/index.ts +++ b/src/lib/apis/models/index.ts @@ -152,6 +152,9 @@ export const getBaseModels = async (token: string = '') => { export const createNewModel = async (token: string, model: object) => { let error = null; + const { id, base_model_id, name, meta, params, access_grants, is_active } = model as any; + const payload = { id, base_model_id, name, meta, params, access_grants, is_active }; + const res = await fetch(`${WEBUI_API_BASE_URL}/models/create`, { method: 'POST', headers: { @@ -159,7 +162,7 @@ export const createNewModel = async (token: string, model: object) => { 'Content-Type': 'application/json', authorization: `Bearer ${token}` }, - body: JSON.stringify(model) + body: JSON.stringify(payload) }) .then(async (res) => { if (!res.ok) throw await res.json(); @@ -251,6 +254,9 @@ export const toggleModelById = async (token: string, id: string) => { export const updateModelById = async (token: string, id: string, model: object) => { let error = null; + const { base_model_id, name, meta, params, access_grants, is_active } = model as any; + const payload = { id, base_model_id, name, meta, params, access_grants, is_active }; + const res = await fetch(`${WEBUI_API_BASE_URL}/models/model/update`, { method: 'POST', headers: { @@ -258,7 +264,7 @@ export const updateModelById = async (token: string, id: string, model: object) 'Content-Type': 'application/json', authorization: `Bearer ${token}` }, - body: JSON.stringify({ ...model, id }) + body: JSON.stringify(payload) }) .then(async (res) => { if (!res.ok) throw await res.json(); From 1cea8ec7d462d1542e04e15dac48ecbc3cb66d2a Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 17:59:45 +0900 Subject: [PATCH 40/51] refac --- backend/open_webui/retrieval/utils.py | 7 +++++++ backend/open_webui/tools/builtin.py | 10 +++++++--- backend/open_webui/utils/middleware.py | 6 +++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index b1aec78656..14a64fed60 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -566,6 +566,13 @@ async def query_collection( log.exception(f'Error when querying the collection: {e}') return None, e + # Sanitize: filter out None/empty queries to prevent embedding crashes + # (e.g. when get_last_user_message returns None) + queries = [q for q in queries if q] + if not queries: + log.warning('query_collection: all queries were None or empty, returning empty results') + return {'distances': [[]], 'documents': [[]], 'metadatas': [[]]} + # Generate all query embeddings (in one call) query_embeddings = await embedding_function(queries, prefix=RAG_EMBEDDING_QUERY_PREFIX) log.debug(f'query_collection: processing {len(queries)} queries across {len(collection_names)} collections') diff --git a/backend/open_webui/tools/builtin.py b/backend/open_webui/tools/builtin.py index 25d6a2cecb..33d6bfa91e 100644 --- a/backend/open_webui/tools/builtin.py +++ b/backend/open_webui/tools/builtin.py @@ -238,9 +238,13 @@ async def fetch_url( content, _ = await asyncio.to_thread(get_content_from_url, __request__, url) # Truncate if configured (WEB_FETCH_MAX_CONTENT_LENGTH) - max_length = getattr(__request__.app.state.config, 'WEB_FETCH_MAX_CONTENT_LENGTH', None) - if max_length and max_length > 0 and len(content) > max_length: - content = content[:max_length] + '\n\n[Content truncated...]' + # Guard: content may be None if the web loader silently failed + if content is not None: + max_length = getattr(__request__.app.state.config, 'WEB_FETCH_MAX_CONTENT_LENGTH', None) + if max_length and max_length > 0 and len(content) > max_length: + content = content[:max_length] + '\n\n[Content truncated...]' + else: + content = '' return content except Exception as e: diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 3fd4d011df..ab2ca104f4 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -1546,11 +1546,11 @@ async def chat_web_search_handler(request: Request, form_data: dict, extra_param except Exception as e: log.exception(e) - queries = [user_message] + queries = [user_message or ''] # Check if generated queries are empty if len(queries) == 1 and queries[0].strip() == '': - queries = [user_message] + queries = [user_message or ''] # Check if queries are not found if len(queries) == 0: @@ -1991,7 +1991,7 @@ async def chat_completion_files_handler( ) if len(queries) == 0: - queries = [get_last_user_message(body['messages'])] + queries = [get_last_user_message(body['messages']) or ''] try: # Directly await async get_sources_from_items (no thread needed - fully async now) From 7102a63c82c7d916acaaaaff2eee653de3c1bd69 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 18:06:19 +0900 Subject: [PATCH 41/51] refac --- backend/open_webui/tools/builtin.py | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/backend/open_webui/tools/builtin.py b/backend/open_webui/tools/builtin.py index 33d6bfa91e..18b888bbd7 100644 --- a/backend/open_webui/tools/builtin.py +++ b/backend/open_webui/tools/builtin.py @@ -2895,6 +2895,9 @@ def _ns_to_dt(ns: int, tz) -> str: def _event_to_dict(event, tz) -> dict: """Convert a calendar event model to a human-friendly dict with local timestamps.""" + alert_minutes = None + if event.meta and 'alert_minutes' in event.meta: + alert_minutes = event.meta['alert_minutes'] return { 'id': event.id, 'calendar_id': event.calendar_id, @@ -2904,6 +2907,7 @@ def _event_to_dict(event, tz) -> dict: 'end': _ns_to_dt(event.end_at, tz) if event.end_at else None, 'all_day': event.all_day, 'location': event.location or '', + 'reminder_minutes': alert_minutes if alert_minutes is not None else 10, 'color': event.color, 'is_cancelled': event.is_cancelled, } @@ -3010,6 +3014,7 @@ async def create_calendar_event( calendar_id: Optional[str] = None, all_day: bool = False, location: Optional[str] = None, + reminder_minutes: Optional[int] = None, __request__: Request = None, __user__: dict = None, ) -> str: @@ -3024,6 +3029,7 @@ async def create_calendar_event( :param calendar_id: Target calendar ID (optional, uses default calendar if omitted) :param all_day: Whether this is an all-day event (default: false) :param location: Event location (optional) + :param reminder_minutes: Minutes before the event to send a reminder notification (optional, default: 10). Use 0 for "at time of event", -1 for no reminder. Accepts any positive integer for custom timing (e.g. 120 for 2 hours before). :return: JSON with the created event details including id """ if __request__ is None: @@ -3086,6 +3092,18 @@ async def create_calendar_event( # Default to 1 hour duration end_ns = start_ns + 3_600_000_000_000 + # Build meta with reminder setting + meta = {} + if reminder_minutes is not None: + if isinstance(reminder_minutes, str): + try: + reminder_minutes = int(reminder_minutes) + except ValueError: + reminder_minutes = 10 + meta['alert_minutes'] = reminder_minutes + else: + meta['alert_minutes'] = 10 + form = CalendarEventForm( calendar_id=calendar_id, title=title, @@ -3094,6 +3112,7 @@ async def create_calendar_event( end_at=end_ns, all_day=all_day, location=location, + meta=meta, ) event = await CalendarEvents.insert_new_event(user_id, form) @@ -3121,6 +3140,7 @@ async def update_calendar_event( all_day: Optional[bool] = None, location: Optional[str] = None, is_cancelled: Optional[bool] = None, + reminder_minutes: Optional[int] = None, __request__: Request = None, __user__: dict = None, ) -> str: @@ -3136,6 +3156,7 @@ async def update_calendar_event( :param all_day: Whether this is an all-day event (optional) :param location: New event location (optional) :param is_cancelled: Set to true to cancel the event (optional) + :param reminder_minutes: Minutes before the event to send a reminder notification (optional). Use 0 for "at time of event", -1 for no reminder. Accepts any positive integer for custom timing (e.g. 120 for 2 hours before). :return: JSON with the updated event details """ if __request__ is None: @@ -3190,6 +3211,17 @@ async def update_calendar_event( except (ValueError, TypeError) as e: return json.dumps({'error': f'Invalid end datetime: {e}'}) + # Build meta update with reminder setting if provided + meta = None + if reminder_minutes is not None: + if isinstance(reminder_minutes, str): + try: + reminder_minutes = int(reminder_minutes) + except ValueError: + reminder_minutes = None + if reminder_minutes is not None: + meta = {'alert_minutes': reminder_minutes} + form = CalendarEventUpdateForm( title=title, description=description, @@ -3198,6 +3230,7 @@ async def update_calendar_event( all_day=all_day, location=location, is_cancelled=is_cancelled, + meta=meta, ) updated = await CalendarEvents.update_event_by_id(event_id, form) From 3d1e355df722c34158e7a59190d1b054d391b262 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 18:20:10 +0900 Subject: [PATCH 42/51] refac --- backend/open_webui/internal/db.py | 191 +++------- backend/open_webui/migrations/env.py | 2 +- backend/open_webui/models/models.py | 50 +++ backend/open_webui/routers/models.py | 82 ++--- backend/open_webui/utils/filter.py | 2 +- backend/open_webui/utils/models.py | 4 +- backend/open_webui/utils/plugin.py | 7 +- backend/requirements-min.txt | 2 +- backend/requirements.txt | 2 +- pyproject.toml | 2 +- .../ContentRenderer/FloatingButtons.svelte | 341 ++++-------------- .../chat/Messages/ContentRenderer.svelte | 42 ++- .../chat/Messages/ResponseMessage.svelte | 7 +- src/lib/components/workspace/Models.svelte | 2 + 14 files changed, 258 insertions(+), 478 deletions(-) diff --git a/backend/open_webui/internal/db.py b/backend/open_webui/internal/db.py index 3a4a22c55d..4592aa6cb8 100644 --- a/backend/open_webui/internal/db.py +++ b/backend/open_webui/internal/db.py @@ -1,9 +1,7 @@ import os import json import logging -import ssl as _stdlib_ssl from contextlib import asynccontextmanager, contextmanager -from dataclasses import dataclass from typing import Any, Optional from urllib.parse import parse_qs, urlencode, urlparse, urlunparse @@ -38,31 +36,17 @@ from typing_extensions import Self log = logging.getLogger(__name__) -@dataclass -class SSLParams: - """SSL parameters extracted from a PostgreSQL ``DATABASE_URL``. - - Holds the connection-mode flag and optional certificate file paths - so that each driver (asyncpg, psycopg2/libpq) can receive them in - the format it expects. - """ - - mode: str | None = None - rootcert: str | None = None - cert: str | None = None - key: str | None = None - crl: str | None = None - - def __bool__(self) -> bool: - return self.mode is not None - - @property - def has_any(self) -> bool: - """True when *any* SSL-related field is set (mode or cert files).""" - return any((self.mode, self.rootcert, self.cert, self.key, self.crl)) - - -# ── URL extraction / reattachment ──────────────────────────────────── +# ── SSL URL normalization (used by sync engine & Alembic migrations) ─ +# +# psycopg2 (sync) needs ``sslmode=`` in the connection string (it does +# not recognise the bare ``ssl=`` key that some ORMs emit). The helpers +# below strip all SSL-related query params, normalise them, and +# reattach them in the canonical libpq form. +# +# The **async** engine now uses psycopg (v3), which speaks libpq +# natively, so it needs no translation at all — the DATABASE_URL is +# passed through as-is. +# ───────────────────────────────────────────────────────────────────── def _pop_first(params: dict[str, list[str]], key: str) -> str | None: @@ -71,63 +55,57 @@ def _pop_first(params: dict[str, list[str]], key: str) -> str | None: return values[0] if values else None -def extract_ssl_params_from_url(url: str) -> tuple[str, SSLParams]: - """Strip all SSL query-string parameters from a PostgreSQL URL. - - asyncpg does not accept libpq-style certificate-file keys - (``sslrootcert``, ``sslcert``, ``sslkey``, ``sslcrl``), so every - SSL-related key is removed and returned as a structured - :class:`SSLParams` object. - - Returns ``(url_without_ssl, ssl_params)``. Non-PostgreSQL URLs are - returned unchanged with an empty ``SSLParams``. - """ - if not url or not any( +def _is_postgres_url(url: str) -> bool: + """Return True if *url* looks like a PostgreSQL connection string.""" + return bool(url) and any( url.startswith(p) for p in ('postgresql://', 'postgresql+', 'postgres://') - ): - return url, SSLParams() + ) + + +def extract_ssl_params_from_url(url: str) -> tuple[str, dict[str, str]]: + """Strip SSL query-string parameters from a PostgreSQL URL. + + Returns ``(url_without_ssl, ssl_dict)`` where *ssl_dict* maps + canonical libpq key names (``sslmode``, ``sslrootcert``, …) to + their values. Non-PostgreSQL URLs are returned unchanged with an + empty dict. + """ + if not _is_postgres_url(url): + return url, {} parsed = urlparse(url) qp = parse_qs(parsed.query, keep_blank_values=True) - # Prefer sslmode (libpq canonical) over the asyncpg-only ``ssl`` key. - # Both must be popped unconditionally so neither leaks into the cleaned URL. + # Prefer sslmode (libpq canonical) over the bare ``ssl`` key. sslmode_val = _pop_first(qp, 'sslmode') ssl_val = _pop_first(qp, 'ssl') ssl_mode = sslmode_val or ssl_val - params = SSLParams( - mode=ssl_mode, - rootcert=_pop_first(qp, 'sslrootcert'), - cert=_pop_first(qp, 'sslcert'), - key=_pop_first(qp, 'sslkey'), - crl=_pop_first(qp, 'sslcrl'), - ) + ssl_dict: dict[str, str] = {} + if ssl_mode: + ssl_dict['sslmode'] = ssl_mode + for key in ('sslrootcert', 'sslcert', 'sslkey', 'sslcrl'): + val = _pop_first(qp, key) + if val: + ssl_dict[key] = val - if not params.has_any: - return url, params + if not ssl_dict: + return url, ssl_dict cleaned_query = urlencode(qp, doseq=True) - return urlunparse(parsed._replace(query=cleaned_query)), params + return urlunparse(parsed._replace(query=cleaned_query)), ssl_dict -def reattach_ssl_params_to_url(url_without_ssl: str, ssl_params: SSLParams) -> str: +def reattach_ssl_params_to_url(url_without_ssl: str, ssl_dict: dict[str, str]) -> str: """Re-append SSL query-string parameters to a cleaned PostgreSQL URL. Used for psycopg2/libpq consumers that expect ``sslmode`` and the certificate-file keys in the connection string. """ - if not ssl_params: + if not ssl_dict: return url_without_ssl - mapping = ( - ('sslmode', ssl_params.mode), - ('sslrootcert', ssl_params.rootcert), - ('sslcert', ssl_params.cert), - ('sslkey', ssl_params.key), - ('sslcrl', ssl_params.crl), - ) - parts = [f'{k}={v}' for k, v in mapping if v] + parts = [f'{k}={v}' for k, v in ssl_dict.items() if v] if not parts: return url_without_ssl @@ -135,54 +113,6 @@ def reattach_ssl_params_to_url(url_without_ssl: str, ssl_params: SSLParams) -> s return f'{url_without_ssl}{sep}{"&".join(parts)}' -# ── asyncpg SSLContext builder ─────────────────────────────────────── - - -def _make_ssl_context(ssl_params: SSLParams, *, verify: bool) -> _stdlib_ssl.SSLContext: - """Create an :class:`ssl.SSLContext` from *ssl_params*. - - When *verify* is ``False``, hostname checking and certificate - verification are disabled (matching libpq ``require`` semantics). - """ - ctx = _stdlib_ssl.create_default_context(cafile=ssl_params.rootcert) - if not verify: - ctx.check_hostname = False - ctx.verify_mode = _stdlib_ssl.CERT_NONE - if ssl_params.cert and ssl_params.key: - ctx.load_cert_chain(certfile=ssl_params.cert, keyfile=ssl_params.key) - if verify and ssl_params.crl: - ctx.load_verify_locations(cafile=ssl_params.crl) - ctx.verify_flags |= _stdlib_ssl.VERIFY_CRL_CHECK_LEAF - return ctx - - -def build_asyncpg_ssl_args(ssl_params: SSLParams) -> dict: - """Convert :class:`SSLParams` to asyncpg-compatible ``connect_args``. - - Returns a dict suitable for unpacking into - ``create_async_engine(...)``. - """ - if not ssl_params: - return {} - - mode = (ssl_params.mode or 'require').lower() - - if mode == 'disable': - return {'connect_args': {'ssl': False}} - if mode in ('allow', 'prefer'): - return {} - if mode == 'require': - return {'connect_args': {'ssl': _make_ssl_context(ssl_params, verify=False)}} - if mode in ('verify-ca', 'verify-full'): - ctx = _make_ssl_context(ssl_params, verify=True) - if mode == 'verify-ca': - ctx.check_hostname = False - return {'connect_args': {'ssl': ctx}} - - # Unknown value — pass through as-is and let asyncpg decide. - return {'connect_args': {'ssl': ssl_params.mode}} - - # Backwards-compatible aliases for external callers. extract_ssl_mode_from_url = extract_ssl_params_from_url reattach_ssl_mode_to_url = reattach_ssl_params_to_url @@ -245,32 +175,38 @@ if ENABLE_DB_MIGRATIONS: handle_peewee_migration(DATABASE_URL) -# Normalize SSL params from the URL once; each engine branch re-injects -# the driver-appropriate form. -DATABASE_URL_WITHOUT_SSL, DATABASE_SSL_PARAMS = extract_ssl_params_from_url(DATABASE_URL) +# Normalize SSL params from the URL once; the sync engine needs them +# reattached in canonical libpq form for psycopg2. +_url_without_ssl, _ssl_dict = extract_ssl_params_from_url(DATABASE_URL) # For psycopg2 (sync engine), re-append sslmode + cert-file params. SQLALCHEMY_DATABASE_URL = ( - reattach_ssl_params_to_url(DATABASE_URL_WITHOUT_SSL, DATABASE_SSL_PARAMS) if DATABASE_SSL_PARAMS else DATABASE_URL + reattach_ssl_params_to_url(_url_without_ssl, _ssl_dict) if _ssl_dict else DATABASE_URL ) def _make_async_url(url: str) -> str: - """Convert a sync database URL to its async driver equivalent.""" + """Convert a sync database URL to its async driver equivalent. + + The async engine uses psycopg (v3) which speaks libpq natively, + so all standard connection-string parameters (``sslmode``, + ``options``, ``target_session_attrs``, etc.) are passed through + without any translation. + """ if url.startswith('sqlite+sqlcipher://'): - # SQLCipher has no async driver — not supported for async raise ValueError( 'sqlite+sqlcipher:// URLs are not supported with async engine. ' 'Use standard sqlite:// or postgresql:// instead.' ) if url.startswith('sqlite:///') or url.startswith('sqlite://'): return url.replace('sqlite://', 'sqlite+aiosqlite://', 1) + # psycopg v3 — auto-selects async mode with create_async_engine if url.startswith('postgresql+psycopg2://'): - return url.replace('postgresql+psycopg2://', 'postgresql+asyncpg://', 1) + return url.replace('postgresql+psycopg2://', 'postgresql+psycopg://', 1) if url.startswith('postgresql://'): - return url.replace('postgresql://', 'postgresql+asyncpg://', 1) + return url.replace('postgresql://', 'postgresql+psycopg://', 1) if url.startswith('postgres://'): - return url.replace('postgres://', 'postgresql+asyncpg://', 1) + return url.replace('postgres://', 'postgresql+psycopg://', 1) # For other dialects, return as-is and let SQLAlchemy handle it return url @@ -395,10 +331,10 @@ get_db = contextmanager(get_session) # ASYNC ENGINE (used for ALL runtime database operations) # ============================================================ -# Use the SSL-stripped URL for asyncpg — SSL is injected via connect_args. -ASYNC_SQLALCHEMY_DATABASE_URL = _make_async_url( - DATABASE_URL_WITHOUT_SSL if DATABASE_SSL_PARAMS else SQLALCHEMY_DATABASE_URL -) +# psycopg (v3) speaks libpq natively — the full DATABASE_URL is passed +# through as-is. SSL params, ``options``, ``target_session_attrs``, etc. +# all work without any stripping or translation. +ASYNC_SQLALCHEMY_DATABASE_URL = _make_async_url(SQLALCHEMY_DATABASE_URL) if 'sqlite' in ASYNC_SQLALCHEMY_DATABASE_URL: # Generous default — async coroutines + no session sharing = high connection demand. @@ -416,10 +352,6 @@ if 'sqlite' in ASYNC_SQLALCHEMY_DATABASE_URL: def _set_sqlite_pragmas(dbapi_connection, connection_record): _apply_sqlite_pragmas(dbapi_connection) else: - # Inject asyncpg-compatible SSL connect_args when the user specified - # sslmode/ssl in DATABASE_URL. - asyncpg_ssl_args = build_asyncpg_ssl_args(DATABASE_SSL_PARAMS) - if isinstance(DATABASE_POOL_SIZE, int): if DATABASE_POOL_SIZE > 0: async_engine = create_async_engine( @@ -429,20 +361,17 @@ else: pool_timeout=DATABASE_POOL_TIMEOUT, pool_recycle=DATABASE_POOL_RECYCLE, pool_pre_ping=True, - **asyncpg_ssl_args, ) else: async_engine = create_async_engine( ASYNC_SQLALCHEMY_DATABASE_URL, pool_pre_ping=True, poolclass=NullPool, - **asyncpg_ssl_args, ) else: async_engine = create_async_engine( ASYNC_SQLALCHEMY_DATABASE_URL, pool_pre_ping=True, - **asyncpg_ssl_args, ) diff --git a/backend/open_webui/migrations/env.py b/backend/open_webui/migrations/env.py index ea4839ebc1..961a92becf 100644 --- a/backend/open_webui/migrations/env.py +++ b/backend/open_webui/migrations/env.py @@ -37,7 +37,7 @@ target_metadata = Auth.metadata DB_URL = DATABASE_URL -# Normalize SSL query params for psycopg2 (Alembic uses psycopg2, not asyncpg). +# Normalize SSL query params for psycopg2 (Alembic uses psycopg2 for sync migrations). url_without_ssl, ssl_params = extract_ssl_params_from_url(DB_URL) DB_URL = reattach_ssl_params_to_url(url_without_ssl, ssl_params) if ssl_params else DB_URL diff --git a/backend/open_webui/models/models.py b/backend/open_webui/models/models.py index 71296b295e..db9459e028 100755 --- a/backend/open_webui/models/models.py +++ b/backend/open_webui/models/models.py @@ -391,6 +391,56 @@ class ModelsTable: return ModelListResponse(items=models, total=total) + async def get_model_meta_by_id( + self, id: str, db: Optional[AsyncSession] = None + ) -> Optional[tuple[dict, int]]: + """Return (meta, updated_at) for a model, skipping access grant resolution.""" + try: + async with get_async_db_context(db) as db: + result = await db.execute( + select(Model.meta, Model.updated_at).filter_by(id=id) + ) + return result.first() + except Exception: + return None + + async def get_all_tags( + self, + user_id: str, + is_admin: bool = False, + db: Optional[AsyncSession] = None, + ) -> set[str]: + """Extract unique tag names from model meta, querying only the meta column.""" + async with get_async_db_context(db) as db: + stmt = select(Model.meta).filter(Model.base_model_id != None) + + if not is_admin: + user_groups = await Groups.get_groups_by_member_id(user_id, db=db) + user_group_ids = [group.id for group in user_groups] + + filter_dict = {'user_id': user_id} + if user_group_ids: + filter_dict['group_ids'] = user_group_ids + + stmt = self._has_permission(db, stmt, filter_dict, permission='read') + + result = await db.execute(stmt) + rows = result.scalars().all() + + tags_set: set[str] = set() + for meta in rows: + if not meta: + continue + for tag in meta.get('tags', []): + try: + name = tag.get('name') if isinstance(tag, dict) else str(tag) + if name: + tags_set.add(name) + except Exception: + continue + + return tags_set + async def get_model_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[ModelModel]: try: async with get_async_db_context(db) as db: diff --git a/backend/open_webui/routers/models.py b/backend/open_webui/routers/models.py index 079245d550..510a0d3d29 100644 --- a/backend/open_webui/routers/models.py +++ b/backend/open_webui/routers/models.py @@ -138,18 +138,25 @@ async def get_models( db=db, ) - return ModelAccessListResponse( - items=[ + # Strip profile_image_url from meta — images are served via /model/profile/image. + items = [] + for model in result.items: + data = model.model_dump() + if data.get('meta'): + data['meta'].pop('profile_image_url', None) + items.append( ModelAccessResponse( - **model.model_dump(), + **data, write_access=( (user.role == 'admin' and BYPASS_ADMIN_ACCESS_CONTROL) or user.id == model.user_id or model.id in writable_model_ids ), ) - for model in result.items - ], + ) + + return ModelAccessListResponse( + items=items, total=result.total, ) @@ -171,25 +178,12 @@ async def get_base_models(user=Depends(get_admin_user), db: AsyncSession = Depen @router.get('/tags', response_model=list[str]) async def get_model_tags(user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session)): - if user.role == 'admin' and BYPASS_ADMIN_ACCESS_CONTROL: - models = await Models.get_models(db=db) - else: - models = await Models.get_models_by_user_id(user.id, db=db) - - tags_set = set() - for model in models: - if model.meta: - meta = model.meta.model_dump() - for tag in meta.get('tags', []): - try: - name = tag.get('name') if isinstance(tag, dict) else str(tag) - if name: - tags_set.add(name) - except Exception: - continue - - tags = sorted(tags_set) - return tags + tags = await Models.get_all_tags( + user_id=user.id, + is_admin=(user.role == 'admin' and BYPASS_ADMIN_ACCESS_CONTROL), + db=db, + ) + return sorted(tags) ############################ @@ -466,54 +460,48 @@ async def get_model_profile_image( user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): - model = await Models.get_model_by_id(id, db=db) + model_meta = await Models.get_model_meta_by_id(id, db=db) - if model: - etag = f'"{model.updated_at}"' if model.updated_at else None + if model_meta: + meta, updated_at = model_meta + profile_image_url = (meta or {}).get('profile_image_url') - if model.meta.profile_image_url: - if model.meta.profile_image_url.startswith('http'): + if profile_image_url: + if profile_image_url.startswith('http'): return Response( status_code=status.HTTP_302_FOUND, - headers={'Location': model.meta.profile_image_url}, + headers={'Location': profile_image_url}, ) - elif model.meta.profile_image_url.startswith('data:image'): + elif profile_image_url.startswith('data:image'): try: - header, base64_data = model.meta.profile_image_url.split(',', 1) + header, base64_data = profile_image_url.split(',', 1) image_data = base64.b64decode(base64_data) image_buffer = io.BytesIO(image_data) media_type = header.split(';')[0].lstrip('data:') headers = {'Content-Disposition': 'inline'} - if etag: - headers['ETag'] = etag + if updated_at: + headers['ETag'] = f'"{updated_at}"' return StreamingResponse( image_buffer, media_type=media_type, headers=headers, ) - except Exception as e: + except Exception: pass else: - safe_static = _safe_static_redirect_path(model.meta.profile_image_url) + safe_static = _safe_static_redirect_path(profile_image_url) if safe_static: return RedirectResponse( url=safe_static, status_code=status.HTTP_302_FOUND, ) - # Canonical URL so browsers cache one asset for all default model avatars - # (distinct /profile/image?id=... URLs would otherwise re-download the same bytes). - return RedirectResponse( - url='/static/favicon.png', - status_code=status.HTTP_302_FOUND, - ) - else: - return RedirectResponse( - url='/static/favicon.png', - status_code=status.HTTP_302_FOUND, - ) + return RedirectResponse( + url='/static/favicon.png', + status_code=status.HTTP_302_FOUND, + ) ############################ diff --git a/backend/open_webui/utils/filter.py b/backend/open_webui/utils/filter.py index 50b1583088..07edf9afa7 100644 --- a/backend/open_webui/utils/filter.py +++ b/backend/open_webui/utils/filter.py @@ -14,7 +14,7 @@ async def get_function_module(request, function_id, load_from_db=True): """ Get the function module by its ID. """ - function_module, _, _ = await get_function_module_from_cache(request, function_id, load_from_db) + function_module, _, _ = await get_function_module_from_cache(request, function_id, load_from_db=load_from_db) return function_module diff --git a/backend/open_webui/utils/models.py b/backend/open_webui/utils/models.py index 6b12515ba1..cc8c5fad3a 100644 --- a/backend/open_webui/utils/models.py +++ b/backend/open_webui/utils/models.py @@ -287,9 +287,9 @@ async def get_all_models(request, refresh: bool = False, user: UserModel = None) # imported/custom model configs may reference tools or filters the user # hasn't installed, and trying to load those would cause persistent # "Failed to load function module" log spam on every model refresh. - for function_id in functions_by_id: + for function_id, function in functions_by_id.items(): try: - await get_function_module_from_cache(request, function_id) + await get_function_module_from_cache(request, function_id, function=function) except Exception as e: log.debug(f'Failed to load function module for {function_id}: {e}') diff --git a/backend/open_webui/utils/plugin.py b/backend/open_webui/utils/plugin.py index 84671bbd3b..5b945749ec 100644 --- a/backend/open_webui/utils/plugin.py +++ b/backend/open_webui/utils/plugin.py @@ -14,7 +14,7 @@ from open_webui.env import ( OFFLINE_MODE, ENABLE_PIP_INSTALL_FRONTMATTER_REQUIREMENTS, ) -from open_webui.models.functions import Functions +from open_webui.models.functions import FunctionModel, Functions from open_webui.models.tools import Tools log = logging.getLogger(__name__) @@ -335,13 +335,14 @@ async def get_tool_module_from_cache(request, tool_id, load_from_db=True): return tool_module, frontmatter -async def get_function_module_from_cache(request, function_id, load_from_db=True): +async def get_function_module_from_cache(request, function_id, function: FunctionModel | None = None, load_from_db=True): if load_from_db: # Always load from the database by default # This is useful for hooks like "inlet" or "outlet" where the content might change # and we want to ensure the latest content is used. - function = await Functions.get_function_by_id(function_id) + if function is None: + function = await Functions.get_function_by_id(function_id) if not function: raise Exception(f'Function not found: {function_id}') content = function.content diff --git a/backend/requirements-min.txt b/backend/requirements-min.txt index 950a458c8f..05c28deba6 100644 --- a/backend/requirements-min.txt +++ b/backend/requirements-min.txt @@ -28,7 +28,7 @@ starsessions[redis]==2.2.1 sqlalchemy==2.0.48 aiosqlite==0.21.0 -asyncpg==0.30.0 +psycopg[binary]==3.2.9 alembic==1.18.4 peewee==3.19.0 peewee-migrate==1.14.3 diff --git a/backend/requirements.txt b/backend/requirements.txt index 539835dd22..77b87324cf 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -26,7 +26,7 @@ python-mimeparse==2.0.0 sqlalchemy[asyncio]==2.0.48 aiosqlite==0.21.0 -asyncpg==0.30.0 +psycopg[binary]==3.2.9 alembic==1.18.4 peewee==3.19.0 peewee-migrate==1.14.3 diff --git a/pyproject.toml b/pyproject.toml index 2a802637a1..af6084dd08 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,7 @@ dependencies = [ "sqlalchemy[asyncio]==2.0.48", "aiosqlite==0.21.0", - "asyncpg==0.30.0", + "psycopg[binary]==3.2.9", "alembic==1.18.4", "peewee==3.19.0", "peewee-migrate==1.14.3", diff --git a/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte b/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte index d8057acc96..09543fc3e7 100644 --- a/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte +++ b/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte @@ -1,27 +1,14 @@ {:else}
-
-
- -
-
+ { + if (e.key === 'Enter') { + actionHandler(selectedAction?.id); + } + }} + /> -
-
+ -
- {/if} -
+ + + +
{/if} diff --git a/src/lib/components/chat/Messages/ContentRenderer.svelte b/src/lib/components/chat/Messages/ContentRenderer.svelte index 37246c6de2..ec1454a32d 100644 --- a/src/lib/components/chat/Messages/ContentRenderer.svelte +++ b/src/lib/components/chat/Messages/ContentRenderer.svelte @@ -37,7 +37,7 @@ export let onSave = (e) => {}; export let onSourceClick = (e) => {}; export let onTaskClick = (e) => {}; - export let onAddMessages = (e) => {}; + export let onSetInputText = (text) => {}; let contentContainerElement; let floatingButtonsElement; @@ -140,20 +140,36 @@ } }; - onMount(() => { - if (floatingButtons) { - contentContainerElement?.addEventListener('mouseup', updateButtonPosition); + // Reactive listener attachment: re-attaches when floatingButtons + // transitions from false → true (e.g. when message.done flips). + let listenersAttached = false; + + function attachListeners() { + if (!listenersAttached && contentContainerElement) { + contentContainerElement.addEventListener('mouseup', updateButtonPosition); document.addEventListener('mouseup', updateButtonPosition); document.addEventListener('keydown', keydownHandler); + listenersAttached = true; } - }); + } - onDestroy(() => { - if (floatingButtons) { + function detachListeners() { + if (listenersAttached) { contentContainerElement?.removeEventListener('mouseup', updateButtonPosition); document.removeEventListener('mouseup', updateButtonPosition); document.removeEventListener('keydown', keydownHandler); + listenersAttached = false; } + } + + $: if (floatingButtons && contentContainerElement) { + attachListeners(); + } else { + detachListeners(); + } + + onDestroy(() => { + detachListeners(); }); @@ -201,17 +217,9 @@ 0 - ? selectedModels.at(0) - : (model?.id ?? null)} - messages={createMessagesList(history, messageId)} - onAdd={({ modelId, parentId, messages }) => { - console.log(modelId, parentId, messages); - onAddMessages({ modelId, parentId, messages }); + onSetInputText={(text) => { + onSetInputText(text); closeFloatingButtons(); }} /> diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index 2d339c6f36..e333215af9 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -788,9 +788,6 @@ { - addMessages({ modelId, parentId, messages }); + onSetInputText={(text) => { + setInputText(text); }} onSave={({ raw, oldContent, newContent }) => { history.messages[message.id].content = history.messages[ diff --git a/src/lib/components/workspace/Models.svelte b/src/lib/components/workspace/Models.svelte index b74711ddb2..8c177f48b4 100644 --- a/src/lib/components/workspace/Models.svelte +++ b/src/lib/components/workspace/Models.svelte @@ -601,6 +601,8 @@ src={`${WEBUI_API_BASE_URL}/models/model/profile/image?id=${model.id}&lang=${$i18n.language}`} alt="modelfile profile" class=" rounded-2xl size-12 object-cover" + loading="lazy" + decoding="async" on:error={(e) => { e.target.src = '/favicon.png'; }} From 70b28b629e66ca98b07ba61b7514fa8c6e5b5529 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 18:29:39 +0900 Subject: [PATCH 43/51] refac --- src/lib/components/admin/Settings/Documents.svelte | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index a2349e78e5..6416b2d05a 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -1369,7 +1369,14 @@ )} /> + + + {#if RAGConfig.RAG_TEMPLATE && ((RAGConfig.RAG_TEMPLATE.match(/\[context\]/g) || []).length + (RAGConfig.RAG_TEMPLATE.match(/\{\{CONTEXT\}\}/g) || []).length) > 1} +
+ {$i18n.t('This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.')} +
+ {/if} {/if} From b1bd3084f0ea0e7a6a53eaf1b6bb2389ba961ae7 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Fri, 24 Apr 2026 11:30:51 +0200 Subject: [PATCH 44/51] changelog (#24072) --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8049dcca1b..b37ca58ad5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,27 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.9.2] - 2026-04-24 + +### Added + +- 🧠 **PaddleOCR-vl document extraction.** Administrators can now use PaddleOCR-vl as a content extraction engine for document processing, with configurable API URL and token settings in document retrieval configuration. [Commit](https://github.com/open-webui/open-webui/commit/04c7e9535d330906891eefa5eda516f661c1cf79..331b7520db719d2f1c76c4b06603a9a59a9b7c25) +- 🧵 **Streaming markdown performance stability.** Streaming responses now stay more memory-efficient by preventing repeated cleanup callback registration during markdown updates. [#24048](https://github.com/open-webui/open-webui/pull/24048) +- 📚 **Source overflow indicator.** The Sources button now shows a +N badge when more than three sources are available, so hidden sources are clearly indicated in chat responses. [#23918](https://github.com/open-webui/open-webui/pull/23918) +- ⚡ **Model avatar cache reuse.** Default model profile images now reuse a shared static path to reduce repeated downloads and improve loading efficiency when multiple models use the fallback icon. [#24015](https://github.com/open-webui/open-webui/pull/24015) +- 🚀 **Faster splash image loading.** Splash screen images are now prioritized earlier during page load, improving first-load LCP behavior and reducing delayed image discovery. [#24011](https://github.com/open-webui/open-webui/pull/24011) +- 🔄 **General improvements.** Various improvements were implemented across the application to enhance performance, stability, and security. +- 🌐 **Translation updates.** Translations for Finnish, Korean, Portuguese (Brazil), and Dutch were enhanced and expanded. + +### Fixed + +- 🛠️ **Throttle request handling.** Request handling no longer fails when user activity status updates are throttled with a non-zero interval. [#23979](https://github.com/open-webui/open-webui/pull/23979) +- ✍️ **Rich text extension conflicts.** Rich text editing no longer triggers duplicate extension conflicts for lists and code blocks, improving editor stability. [#24009](https://github.com/open-webui/open-webui/pull/24009) + +### Changed + +- + ## [0.9.1] - 2026-04-21 ### Fixed From e0d6074cd2402ef983d18ad16ded88401ca44705 Mon Sep 17 00:00:00 2001 From: RomualdYT Date: Fri, 24 Apr 2026 11:32:08 +0200 Subject: [PATCH 45/51] refactor(firecrawl): use v2 API directly (#23934) Co-authored-by: Tim Baek --- backend/open_webui/retrieval/web/firecrawl.py | 227 ++++++++++++++++-- backend/open_webui/retrieval/web/utils.py | 42 +--- backend/requirements.txt | 3 - pyproject.toml | 1 - uv.lock | 20 +- 5 files changed, 215 insertions(+), 78 deletions(-) diff --git a/backend/open_webui/retrieval/web/firecrawl.py b/backend/open_webui/retrieval/web/firecrawl.py index 8cd18e1ef2..4bbd4f212b 100644 --- a/backend/open_webui/retrieval/web/firecrawl.py +++ b/backend/open_webui/retrieval/web/firecrawl.py @@ -1,52 +1,229 @@ +from __future__ import annotations + import logging -from typing import Optional, List +import time +from typing import TYPE_CHECKING, Any import requests -from open_webui.retrieval.web.main import SearchResult, get_filtered_results +from langchain_core.documents import Document + +if TYPE_CHECKING: + from open_webui.retrieval.web.main import SearchResult log = logging.getLogger(__name__) +DEFAULT_FIRECRAWL_API_BASE_URL = 'https://api.firecrawl.dev' +FIRECRAWL_RETRY_STATUS_CODES = {429, 500, 502, 503, 504} +FIRECRAWL_MAX_RETRIES = 2 + + +def build_firecrawl_url(base_url: str | None, path: str) -> str: + base_url = (base_url or DEFAULT_FIRECRAWL_API_BASE_URL).rstrip('/') + path = path.lstrip('/') + + if base_url.endswith('/v2'): + return f'{base_url}/{path}' + + return f'{base_url}/v2/{path}' + + +def build_firecrawl_headers(api_key: str | None) -> dict[str, str]: + return { + 'Content-Type': 'application/json', + 'Authorization': f'Bearer {api_key or ""}', + } + + +def get_firecrawl_timeout_seconds(timeout: Any) -> float | None: + if timeout in (None, ''): + return None + + try: + timeout = float(timeout) + except (TypeError, ValueError): + return None + + return timeout if timeout > 0 else None + + +def get_firecrawl_scrape_timeout_ms(timeout: Any) -> int | None: + timeout_seconds = get_firecrawl_timeout_seconds(timeout) + if timeout_seconds is None: + return None + + # Firecrawl v2 expects scrape timeouts in milliseconds. + return min(300000, max(1000, int(timeout_seconds * 1000))) + + +def get_firecrawl_client_timeout_seconds(timeout: Any, fallback: float = 60) -> float: + # Keep the local HTTP timeout slightly above Firecrawl's scrape timeout. + return (get_firecrawl_timeout_seconds(timeout) or fallback) + 10 + + +def get_firecrawl_retry_delay(headers: Any, attempt: int) -> float: + retry_after = headers.get('Retry-After') if headers else None + if retry_after: + try: + return min(10.0, max(0.0, float(retry_after))) + except (TypeError, ValueError): + pass + + return min(8.0, float(2**attempt)) + + +def request_firecrawl_json( + method: str, + url: str, + *, + headers: dict[str, str], + json: dict[str, Any] | None = None, + timeout: float | None = None, + verify: bool = True, +) -> dict[str, Any]: + last_error = None + + for attempt in range(FIRECRAWL_MAX_RETRIES + 1): + try: + response = requests.request( + method, + url, + headers=headers, + json=json, + timeout=timeout, + verify=verify, + ) + + if response.status_code in FIRECRAWL_RETRY_STATUS_CODES and attempt < FIRECRAWL_MAX_RETRIES: + delay = get_firecrawl_retry_delay(response.headers, attempt) + log.warning( + 'Firecrawl %s %s returned HTTP %s; retrying in %.1fs', + method, + url, + response.status_code, + delay, + ) + time.sleep(delay) + continue + + response.raise_for_status() + return response.json() + except (requests.ConnectionError, requests.Timeout) as e: + last_error = e + if attempt >= FIRECRAWL_MAX_RETRIES: + break + + delay = get_firecrawl_retry_delay(None, attempt) + log.warning('Firecrawl %s %s failed; retrying in %.1fs: %s', method, url, delay, e) + time.sleep(delay) + + if last_error: + raise last_error + + raise RuntimeError(f'Firecrawl {method} {url} failed without a response') + + +def get_firecrawl_result_url(result: dict[str, Any]) -> str: + metadata = result.get('metadata') or {} + return ( + result.get('url') + or result.get('link') + or metadata.get('url') + or metadata.get('sourceURL') + or metadata.get('source_url') + or '' + ) + + +def scrape_firecrawl_url( + firecrawl_url: str, + firecrawl_api_key: str, + url: str, + *, + verify_ssl: bool = True, + timeout: Any = None, + params: dict[str, Any] | None = None, +) -> Document | None: + payload = { + 'url': url, + 'formats': ['markdown'], + 'skipTlsVerification': not verify_ssl, + 'removeBase64Images': True, + **(params or {}), + } + scrape_timeout_ms = get_firecrawl_scrape_timeout_ms(timeout) + if scrape_timeout_ms is not None: + payload['timeout'] = scrape_timeout_ms + + response = request_firecrawl_json( + 'POST', + build_firecrawl_url(firecrawl_url, 'scrape'), + headers=build_firecrawl_headers(firecrawl_api_key), + json=payload, + timeout=get_firecrawl_client_timeout_seconds(timeout), + verify=verify_ssl, + ) + data = response.get('data') or {} + content = data.get('markdown') or '' + if not isinstance(content, str) or not content.strip(): + return None + + metadata = data.get('metadata') or {} + document_metadata = {'source': get_firecrawl_result_url(data) or url} + if metadata.get('title'): + document_metadata['title'] = metadata['title'] + if metadata.get('description'): + document_metadata['description'] = metadata['description'] + + return Document(page_content=content, metadata=document_metadata) + def search_firecrawl( firecrawl_url: str, firecrawl_api_key: str, query: str, count: int, - filter_list: Optional[List[str]] = None, -) -> List[SearchResult]: + filter_list: list[str] | None = None, +) -> list[SearchResult]: try: - url = firecrawl_url.rstrip('/') - response = requests.post( - f'{url}/v1/search', - headers={ - 'Content-Type': 'application/json', - 'Authorization': f'Bearer {firecrawl_api_key}', - }, + response = request_firecrawl_json( + 'POST', + build_firecrawl_url(firecrawl_url, 'search'), + headers=build_firecrawl_headers(firecrawl_api_key), json={ 'query': query, 'limit': count, 'timeout': count * 3000, + 'ignoreInvalidURLs': True, }, timeout=count * 3 + 10, ) - response.raise_for_status() - data = response.json().get('data', []) - - results = [ - SearchResult( - link=r.get('url', ''), - title=r.get('title', ''), - snippet=r.get('description', ''), - ) - for r in (data if isinstance(data, list) else []) - ] + data = response.get('data') or {} + results = data.get('web') or [] if filter_list: + from open_webui.retrieval.web.main import get_filtered_results + results = get_filtered_results(results, filter_list) - results = results[:count] - log.info(f'FireCrawl search results: {results}') - return results + from open_webui.retrieval.web.main import SearchResult + + search_results = [] + for result in results[:count]: + url = get_firecrawl_result_url(result) + if not url: + continue + + metadata = result.get('metadata') or {} + search_results.append( + SearchResult( + link=url, + title=result.get('title') or metadata.get('title'), + snippet=result.get('description') or result.get('snippet') or metadata.get('description'), + ) + ) + + log.info(f'FireCrawl search results: {search_results}') + return search_results except Exception as e: log.error(f'Error in FireCrawl search: {e}') return [] diff --git a/backend/open_webui/retrieval/web/utils.py b/backend/open_webui/retrieval/web/utils.py index 9cb0c1abd7..6ee0e3781a 100644 --- a/backend/open_webui/retrieval/web/utils.py +++ b/backend/open_webui/retrieval/web/utils.py @@ -30,6 +30,7 @@ from langchain_core.documents import Document from open_webui.retrieval.loaders.tavily import TavilyLoader from open_webui.retrieval.loaders.external_web import ExternalWebLoader +from open_webui.retrieval.web.firecrawl import scrape_firecrawl_url from open_webui.constants import ERROR_MESSAGES from open_webui.config import ( ENABLE_RAG_LOCAL_WEB_FETCH, @@ -218,39 +219,20 @@ class SafeFireCrawlLoader(BaseLoader, RateLimitMixin, URLProcessingMixin): def lazy_load(self) -> Iterator[Document]: try: - headers = { - 'Content-Type': 'application/json', - 'Authorization': f'Bearer {self.api_key}', - } - for url in self.web_paths: - payload = { - 'url': url, - 'formats': ['markdown'], - **self.params, - } - if self.timeout: - payload['timeout'] = self.timeout * 1000 - - response = requests.post( - f'{self.api_url}/v1/scrape', - headers=headers, - json=payload, - timeout=self.timeout or 60, - verify=self.verify_ssl, - ) - response.raise_for_status() - data = response.json().get('data', {}) - metadata = data.get('metadata', {}) - source = metadata.get('url') or metadata.get('sourceURL') or url - - yield Document( - page_content=data.get('markdown', ''), - metadata={'source': source}, + doc = scrape_firecrawl_url( + self.api_url, + self.api_key, + url, + verify_ssl=self.verify_ssl, + timeout=self.timeout, + params=self.params, ) + if doc is not None: + yield doc except Exception as e: if self.continue_on_failure: - log.exception(f'Error extracting content from URLs: {e}') + log.warning(f'Error extracting content from URLs with Firecrawl: {e}') else: raise e @@ -261,7 +243,7 @@ class SafeFireCrawlLoader(BaseLoader, RateLimitMixin, URLProcessingMixin): yield doc except Exception as e: if self.continue_on_failure: - log.exception(f'Error extracting content from URLs: {e}') + log.warning(f'Error extracting content from URLs with Firecrawl: {e}') else: raise e diff --git a/backend/requirements.txt b/backend/requirements.txt index 77b87324cf..a7d2b1cb53 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -145,9 +145,6 @@ pytest-docker~=3.2.5 ## LDAP ldap3==2.9.1 -## Firecrawl -firecrawl-py==4.18.0 - ## Trace opentelemetry-api==1.40.0 opentelemetry-sdk==1.40.0 diff --git a/pyproject.toml b/pyproject.toml index af6084dd08..8d8fc8a755 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -167,7 +167,6 @@ all = [ "oracledb==3.4.2", "colbert-ai==0.2.22", - "firecrawl-py==4.18.0", "azure-search-documents==11.6.0", "unstructured==0.18.31", ] diff --git a/uv.lock b/uv.lock index 7bde0eeb01..8f610937f5 100644 --- a/uv.lock +++ b/uv.lock @@ -1133,22 +1133,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/18/79/1b8fa1bb3568781e84c9200f951c735f3f157429f44be0495da55894d620/filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25", size = 19970, upload-time = "2022-11-02T17:34:01.425Z" }, ] -[[package]] -name = "firecrawl-py" -version = "1.12.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nest-asyncio" }, - { name = "pydantic" }, - { name = "python-dotenv" }, - { name = "requests" }, - { name = "websockets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/18/db/e4f8ef9f0475b91b7c16a15e02fe19069d443cc5516cdefa2f9a0924a9a3/firecrawl_py-1.12.0.tar.gz", hash = "sha256:bbf883f6c774f05a5426121b85978a5f7b5ab11e614aff609f0673b097c3e553", size = 19655, upload-time = "2025-02-13T15:40:15.745Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/d8/301d829099082c606ed16ed2a9acd263c47a365d471b9636435bf5d858b3/firecrawl_py-1.12.0-py3-none-any.whl", hash = "sha256:2b9c549315027da32421aca2a7ca597cb05cdbb968cfe0a89f389c7bb20afa4a", size = 31854, upload-time = "2025-02-13T15:40:14.492Z" }, -] - [[package]] name = "flask" version = "3.1.0" @@ -2692,7 +2676,6 @@ dependencies = [ { name = "fake-useragent" }, { name = "fastapi" }, { name = "faster-whisper" }, - { name = "firecrawl-py" }, { name = "fpdf2" }, { name = "ftfy" }, { name = "gcp-storage-emulator" }, @@ -2803,7 +2786,6 @@ requires-dist = [ { name = "fake-useragent", specifier = "==2.1.0" }, { name = "fastapi", specifier = "==0.115.7" }, { name = "faster-whisper", specifier = "==1.1.1" }, - { name = "firecrawl-py", specifier = "==1.12.0" }, { name = "fpdf2", specifier = "==2.8.2" }, { name = "ftfy", specifier = "==6.2.3" }, { name = "gcp-storage-emulator", specifier = ">=2024.8.3" }, @@ -5321,4 +5303,4 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f2/61/ac78a1263bc83a5cf29e7458b77a568eda5a8f81980691bbc6eb6a0d45cc/zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35", size = 5191313, upload-time = "2024-07-15T00:16:09.758Z" }, { url = "https://files.pythonhosted.org/packages/e7/54/967c478314e16af5baf849b6ee9d6ea724ae5b100eb506011f045d3d4e16/zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d", size = 430877, upload-time = "2024-07-15T00:16:11.758Z" }, { url = "https://files.pythonhosted.org/packages/75/37/872d74bd7739639c4553bf94c84af7d54d8211b626b352bc57f0fd8d1e3f/zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b", size = 495595, upload-time = "2024-07-15T00:16:13.731Z" }, -] \ No newline at end of file +] From 3aeb691d985bc614cdfb927ddbd01f0c72c31777 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 18:33:27 +0900 Subject: [PATCH 46/51] chore: bump --- package-lock.json | 30 +++++++++++++++--------------- package.json | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index e3175ba8a0..35554ac1d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "open-webui", - "version": "0.9.1", + "version": "0.9.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "open-webui", - "version": "0.9.1", + "version": "0.9.2", "dependencies": { "@azure/msal-browser": "^4.5.0", "@codemirror/lang-javascript": "^6.2.2", @@ -2284,9 +2284,9 @@ "license": "Apache-2.0" }, "node_modules/@mermaid-js/parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.0.1.tgz", - "integrity": "sha512-opmV19kN1JsK0T6HhhokHpcVkqKpF+x2pPDKKM2ThHtZAB5F4PROopk0amuVYK5qMrIA4erzpNm8gmPNJgMDxQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.1.0.tgz", + "integrity": "sha512-gxK9ZX2+Fex5zu8LhRQoMeMPEHbc73UKZ0FQ54YrQtUxE1VVhMwzeNtKRPAu5aXks4FasbMe4xB4bWrmq6Jlxw==", "license": "MIT", "dependencies": { "langium": "^4.0.0" @@ -3582,9 +3582,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "2.57.1", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.57.1.tgz", - "integrity": "sha512-VRdSbB96cI1EnRh09CqmnQqP/YJvET5buj8S6k7CxaJqBJD4bw4fRKDjcarAj/eX9k2eHifQfDH8NtOh+ZxxPw==", + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.58.0.tgz", + "integrity": "sha512-kT9GCN8yJTkCK1W+Gi/bvGooWAM7y7WXP+yd+rf6QOIjyoK1ERPrMwSufXJUNu2pMWIqruhFvmz+LbOqsEmKmA==", "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", @@ -5388,9 +5388,9 @@ "license": "MIT" }, "node_modules/@xmldom/xmldom": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.12.tgz", - "integrity": "sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==", + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -10948,14 +10948,14 @@ } }, "node_modules/mermaid": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.13.0.tgz", - "integrity": "sha512-fEnci+Immw6lKMFI8sqzjlATTyjLkRa6axrEgLV2yHTfv8r+h1wjFbV6xeRtd4rUV1cS4EpR9rwp3Rci7TRWDw==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.14.0.tgz", + "integrity": "sha512-GSGloRsBs+JINmmhl0JDwjpuezCsHB4WGI4NASHxL3fHo3o/BRXTxhDLKnln8/Q0lRFRyDdEjmk1/d5Sn1Xz8g==", "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^7.1.1", "@iconify/utils": "^3.0.2", - "@mermaid-js/parser": "^1.0.1", + "@mermaid-js/parser": "^1.1.0", "@types/d3": "^7.4.3", "@upsetjs/venn.js": "^2.0.0", "cytoscape": "^3.33.1", diff --git a/package.json b/package.json index ab246848c0..edd77762e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-webui", - "version": "0.9.1", + "version": "0.9.2", "private": true, "scripts": { "dev": "npm run pyodide:fetch && vite dev --host", From 3560d2f6305a9ddcdf9e3db54ad283deec94dd22 Mon Sep 17 00:00:00 2001 From: Constantine Date: Fri, 24 Apr 2026 12:34:57 +0300 Subject: [PATCH 47/51] perf(chats): drop redundant db.refresh after commit in update_chat_by_id (#24024) The chat table has no computed columns (no DEFAULT, SERIAL/IDENTITY, or TRIGGER that populate server-side values on UPDATE), and every column modified by update_chat_by_id is set explicitly from Python values earlier in the function. db.refresh therefore issues a SELECT that replaces those just-written Python values with the round-tripped database representation of the same values, which is a no-op for functional purposes but pulls the entire chat.chat JSON blob back over the network and through the driver's JSON decoder. On large, active chats where chat.chat can reach tens of megabytes, skipping the refresh measurably reduces latency and eliminates one ~JSON-sized transient allocation per write. --- backend/open_webui/models/chats.py | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/open_webui/models/chats.py b/backend/open_webui/models/chats.py index ba6611a811..bcf6951e49 100644 --- a/backend/open_webui/models/chats.py +++ b/backend/open_webui/models/chats.py @@ -393,7 +393,6 @@ class ChatTable: chat_item.updated_at = int(time.time()) await db.commit() - await db.refresh(chat_item) return ChatModel.model_validate(chat_item) except Exception: From f48b8ffbf0a232b8487cd2b7d0181039b14f0586 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 18:38:57 +0900 Subject: [PATCH 48/51] refac --- CHANGELOG.md | 35 ++++++++++++++++++++++---- backend/open_webui/utils/middleware.py | 9 +++++++ backend/open_webui/utils/misc.py | 32 ++++++++++++++++++++--- 3 files changed, 67 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b37ca58ad5..b78fd6b99b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,22 +9,47 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- 🧠 **PaddleOCR-vl document extraction.** Administrators can now use PaddleOCR-vl as a content extraction engine for document processing, with configurable API URL and token settings in document retrieval configuration. [Commit](https://github.com/open-webui/open-webui/commit/04c7e9535d330906891eefa5eda516f661c1cf79..331b7520db719d2f1c76c4b06603a9a59a9b7c25) -- 🧵 **Streaming markdown performance stability.** Streaming responses now stay more memory-efficient by preventing repeated cleanup callback registration during markdown updates. [#24048](https://github.com/open-webui/open-webui/pull/24048) +- 🧠 **PaddleOCR-vl document extraction.** Administrators can now use PaddleOCR-vl as a content extraction engine for document processing, with configurable API URL and token settings in document retrieval configuration. [#23945](https://github.com/open-webui/open-webui/pull/23945) +- 🔥 **Firecrawl v2 API.** Firecrawl web loading now uses the v2 API directly with proper retry logic, exponential backoff on rate limits, and configurable timeout handling, improving reliability for both cloud and self-hosted Firecrawl setups. [#23934](https://github.com/open-webui/open-webui/pull/23934) +- ⏰ **Calendar event reminder customization.** Calendar events now support a configurable `reminder_minutes` parameter, allowing models to set custom reminder durations instead of the default 10-minute notification. +- 🔑 **Custom API key header.** Administrators can now configure a custom header name for API key authentication via the `CUSTOM_API_KEY_HEADER` environment variable, enabling compatibility with reverse proxies that use the `Authorization` header for their own authentication. +- 🔌 **OAuth session disconnection.** Users can now disconnect OAuth sessions for specific providers (e.g., MCP connections) through a new API endpoint, enabling cleaner re-authentication workflows. - 📚 **Source overflow indicator.** The Sources button now shows a +N badge when more than three sources are available, so hidden sources are clearly indicated in chat responses. [#23918](https://github.com/open-webui/open-webui/pull/23918) -- ⚡ **Model avatar cache reuse.** Default model profile images now reuse a shared static path to reduce repeated downloads and improve loading efficiency when multiple models use the fallback icon. [#24015](https://github.com/open-webui/open-webui/pull/24015) -- 🚀 **Faster splash image loading.** Splash screen images are now prioritized earlier during page load, improving first-load LCP behavior and reducing delayed image discovery. [#24011](https://github.com/open-webui/open-webui/pull/24011) +- ⚡ **Model list performance.** Model list API responses now strip base64 profile image data from paginated results, and model tags are fetched via a dedicated efficient query instead of loading all models. This significantly reduces payload sizes and improves workspace Models page responsiveness. +- ⚡ **Model avatar cache reuse.** Default model profile images now redirect to a shared static path instead of reading files from disk per-request, reducing repeated I/O and improving loading efficiency when multiple models use the fallback icon. [#24015](https://github.com/open-webui/open-webui/pull/24015) +- 🚀 **Faster splash image loading.** Splash screen images are now prioritized earlier during page load with preload links, improving first-load LCP behavior and reducing delayed image discovery. [#24011](https://github.com/open-webui/open-webui/pull/24011) +- 🧵 **Streaming markdown performance stability.** Streaming responses now stay more memory-efficient by preventing repeated cleanup callback registration during markdown updates. [#24048](https://github.com/open-webui/open-webui/pull/24048) +- 📊 **Telemetry gauge reliability.** OpenTelemetry user gauge callbacks now use synchronous database queries directly, eliminating cross-thread async bridging issues that could cause silent failures in metric collection. - 🔄 **General improvements.** Various improvements were implemented across the application to enhance performance, stability, and security. - 🌐 **Translation updates.** Translations for Finnish, Korean, Portuguese (Brazil), and Dutch were enhanced and expanded. ### Fixed +- 🔧 **MCP task cancellation stability.** Interrupted MCP tool calls no longer cause CPU spikes or runaway cleanup behavior. MCP client disconnection now runs in the same asyncio task as connection, respecting cancel scope constraints, and chat-active events are properly shielded during cancellation. +- 🧠 **Persistent chat skill injection.** Skills mentioned in persisted chats now inject into the system prompt reliably. Skill ID extraction from `<$skillId|label>` message tags is now handled server-side, and tags are stripped before messages reach the model. +- 🗄️ **Async database driver migration.** The async database backend now uses psycopg (v3) instead of asyncpg, eliminating brittle SSL parameter translation and supporting native libpq connection strings including `sslmode`, `options`, and `target_session_attrs` without any stripping or conversion. +- 🐳 **Docker ARM64 reliability.** Docker images built for arm64 via QEMU cross-compilation no longer produce 0-byte corrupted Python dependencies. `UV_LINK_MODE=copy` is now set in the Dockerfile to force reliable file installation. - 🛠️ **Throttle request handling.** Request handling no longer fails when user activity status updates are throttled with a non-zero interval. [#23979](https://github.com/open-webui/open-webui/pull/23979) - ✍️ **Rich text extension conflicts.** Rich text editing no longer triggers duplicate extension conflicts for lists and code blocks, improving editor stability. [#24009](https://github.com/open-webui/open-webui/pull/24009) +- 🔇 **Fetch URL null content guard.** The `fetch_url` built-in tool now safely handles `None` content returned by web loaders instead of crashing with a `TypeError`. +- 🌐 **OAuth discovery fallback.** OAuth protected resource discovery now falls back to well-known RFC 9728 URIs when the `WWW-Authenticate` header doesn't contain a `resource_metadata` link, improving compatibility with more MCP server implementations. +- 🔐 **Session token resolution.** Session user endpoints now gracefully handle missing `Authorization` headers by falling back to cookie and request state tokens, preventing errors when used behind forward-auth proxies. +- 🚫 **Direct API error responses.** Chat completion requests without a WebSocket channel (direct API calls) now return proper HTTP error responses instead of silently returning null on failure. +- 📡 **Cancelled response stream cleanup.** Cancelled chat generation now explicitly closes the upstream response body iterator, preventing orphaned async generators from spinning in anyio internals. +- 🔒 **Model profile image path safety.** Model profile image endpoints now validate and sanitize static asset redirect paths, preventing path traversal through encoded dots or malicious URL patterns. +- 📊 **RAG template validation UI.** The Documents settings page now displays a warning when RAG templates contain multiple `[context]` or `{{CONTEXT}}` placeholders, helping administrators avoid accidental redundant context injection. +- 🧩 **Automation model detection.** The `create_automation` tool now correctly detects the current model ID even when `model_id` is not yet set in metadata, falling back to the model dict. +- 🔄 **MCP resource content handling.** MCP tool results with the `resource` content type are now correctly detected and their `resource.text` payload is extracted, instead of being silently ignored. +- 🔄 **Ollama and OpenAI metadata forwarding.** Ollama and OpenAI proxy routes now forward request metadata to downstream handlers, ensuring consistent context propagation. +- 🧹 **Browser-native message virtualization.** The custom JavaScript-based message culling system (spacers, height caching, scroll listeners) was replaced with CSS `content-visibility: auto`, letting the browser natively skip rendering of off-screen messages without destroying component trees. This eliminates scroll jump artifacts and mount/destroy thrashing while preserving memory efficiency in long conversations. +- 📻 **Redis notification compatibility.** Redis pub/sub now handles missing or incompatible `client_name` support more gracefully, preventing connection errors with certain Redis configurations. ### Changed -- +- ⚙️ **psycopg v3 async driver.** The async database driver has been migrated from `asyncpg` to `psycopg` (v3). This is a transparent change for most deployments, but custom connection strings with `asyncpg`-specific parameters may need adjustment. +- 🔑 **Brotli dependency update.** Brotli has been updated to address CVE-2025-6176. +- 🖥️ **Windows startup script.** The Windows startup batch script has been updated for improved compatibility. + ## [0.9.1] - 2026-04-21 diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index ab2ca104f4..5b1da36d37 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -1164,6 +1164,15 @@ async def process_tool_result( 'url': file_url, } ) + elif item.get('type') == 'resource': + resource = item.get('resource', {}) + text = resource.get('text', '') + if isinstance(text, str) and text: + try: + text = json.loads(text) + except json.JSONDecodeError: + pass + tool_response.append(text) tool_result = tool_response[0] if len(tool_response) == 1 else tool_response else: # OpenAPI for item in tool_result: diff --git a/backend/open_webui/utils/misc.py b/backend/open_webui/utils/misc.py index 5af84dd5cd..dec5dce94c 100644 --- a/backend/open_webui/utils/misc.py +++ b/backend/open_webui/utils/misc.py @@ -597,6 +597,9 @@ def sanitize_text_for_db(text: str) -> str: """Remove null bytes and invalid UTF-8 surrogates from text for PostgreSQL storage.""" if not isinstance(text, str): return text + # Fast path: skip work when there are no null bytes (the common case) + if '\x00' not in text: + return text # Remove null bytes text = text.replace('\x00', '').replace('\u0000', '') # Remove invalid UTF-8 surrogate characters that can cause encoding errors @@ -608,17 +611,38 @@ def sanitize_text_for_db(text: str) -> str: return text -def sanitize_data_for_db(obj): - """Recursively sanitize all strings in a data structure for database storage.""" +def _strip_null_bytes_deep(obj): + """Inner recursive walk — only called when null bytes are known to be present.""" if isinstance(obj, str): return sanitize_text_for_db(obj) elif isinstance(obj, dict): - return {k: sanitize_data_for_db(v) for k, v in obj.items()} + return {k: _strip_null_bytes_deep(v) for k, v in obj.items()} elif isinstance(obj, list): - return [sanitize_data_for_db(v) for v in obj] + return [_strip_null_bytes_deep(v) for v in obj] return obj +def sanitize_data_for_db(obj): + """Recursively sanitize all strings in a data structure for database storage. + + Performs a fast pre-check: serializes the structure once and scans for + null bytes. If none are found (the overwhelmingly common case), the + original object is returned immediately, skipping the expensive + recursive walk. + """ + if isinstance(obj, str): + return sanitize_text_for_db(obj) + # Fast path: check for null bytes in the serialized form. + # json.dumps is implemented in C and much faster than a Python-level + # recursive walk over every leaf string. + try: + if '\x00' not in json.dumps(obj, ensure_ascii=False): + return obj + except (TypeError, ValueError): + pass + return _strip_null_bytes_deep(obj) + + def sanitize_metadata(metadata: dict) -> dict: """ Return a JSON-safe copy of a metadata dict for database storage. From 8ff7ff459b360e62ff9cbe0d6d2f6fc79cca6089 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 18:48:21 +0900 Subject: [PATCH 49/51] chore: format --- CHANGELOG.md | 1 - backend/open_webui/internal/db.py | 8 +- backend/open_webui/main.py | 4 +- backend/open_webui/models/models.py | 8 +- backend/open_webui/models/oauth_sessions.py | 4 +- backend/open_webui/retrieval/loaders/main.py | 5 +- .../retrieval/loaders/paddleocr_vl.py | 94 +++++++++---------- backend/open_webui/routers/auths.py | 4 +- backend/open_webui/routers/tools.py | 1 - backend/open_webui/utils/plugin.py | 4 +- src/lib/apis/configs/index.ts | 1 - src/lib/apis/tools/index.ts | 1 - src/lib/apis/users/index.ts | 1 - .../admin/Settings/Documents.svelte | 7 +- .../chat/MessageInput/IntegrationsMenu.svelte | 2 +- .../components/chat/Messages/Message.svelte | 1 - src/lib/i18n/locales/ko-KR/translation.json | 10 +- src/routes/+layout.svelte | 5 +- 18 files changed, 73 insertions(+), 88 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b78fd6b99b..0b7755d7f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,7 +50,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - 🔑 **Brotli dependency update.** Brotli has been updated to address CVE-2025-6176. - 🖥️ **Windows startup script.** The Windows startup batch script has been updated for improved compatibility. - ## [0.9.1] - 2026-04-21 ### Fixed diff --git a/backend/open_webui/internal/db.py b/backend/open_webui/internal/db.py index 4592aa6cb8..c9e4f318e1 100644 --- a/backend/open_webui/internal/db.py +++ b/backend/open_webui/internal/db.py @@ -57,9 +57,7 @@ def _pop_first(params: dict[str, list[str]], key: str) -> str | None: def _is_postgres_url(url: str) -> bool: """Return True if *url* looks like a PostgreSQL connection string.""" - return bool(url) and any( - url.startswith(p) for p in ('postgresql://', 'postgresql+', 'postgres://') - ) + return bool(url) and any(url.startswith(p) for p in ('postgresql://', 'postgresql+', 'postgres://')) def extract_ssl_params_from_url(url: str) -> tuple[str, dict[str, str]]: @@ -180,9 +178,7 @@ if ENABLE_DB_MIGRATIONS: _url_without_ssl, _ssl_dict = extract_ssl_params_from_url(DATABASE_URL) # For psycopg2 (sync engine), re-append sslmode + cert-file params. -SQLALCHEMY_DATABASE_URL = ( - reattach_ssl_params_to_url(_url_without_ssl, _ssl_dict) if _ssl_dict else DATABASE_URL -) +SQLALCHEMY_DATABASE_URL = reattach_ssl_params_to_url(_url_without_ssl, _ssl_dict) if _ssl_dict else DATABASE_URL def _make_async_url(url: str) -> str: diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 9bc6b5177d..af570af0af 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -1869,6 +1869,7 @@ async def chat_completion( except asyncio.CancelledError: log.info('Chat processing was cancelled') try: + async def emit_cancel_event(): event_emitter = await get_event_emitter(metadata) if event_emitter: @@ -1940,6 +1941,7 @@ async def chat_completion( try: if metadata.get('chat_id'): + async def emit_inactive_event(): try: event_emitter = await get_event_emitter(metadata, update_db=False) @@ -1947,7 +1949,7 @@ async def chat_completion( await event_emitter({'type': 'chat:active', 'data': {'active': False}}) except Exception: pass - + try: # Shield the event emission so it finishes even if the main task is cancelled await asyncio.shield(emit_inactive_event()) diff --git a/backend/open_webui/models/models.py b/backend/open_webui/models/models.py index db9459e028..79c13153ac 100755 --- a/backend/open_webui/models/models.py +++ b/backend/open_webui/models/models.py @@ -391,15 +391,11 @@ class ModelsTable: return ModelListResponse(items=models, total=total) - async def get_model_meta_by_id( - self, id: str, db: Optional[AsyncSession] = None - ) -> Optional[tuple[dict, int]]: + async def get_model_meta_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[tuple[dict, int]]: """Return (meta, updated_at) for a model, skipping access grant resolution.""" try: async with get_async_db_context(db) as db: - result = await db.execute( - select(Model.meta, Model.updated_at).filter_by(id=id) - ) + result = await db.execute(select(Model.meta, Model.updated_at).filter_by(id=id)) return result.first() except Exception: return None diff --git a/backend/open_webui/models/oauth_sessions.py b/backend/open_webui/models/oauth_sessions.py index fce18ae586..c43567f670 100644 --- a/backend/open_webui/models/oauth_sessions.py +++ b/backend/open_webui/models/oauth_sessions.py @@ -326,9 +326,7 @@ class OAuthSessionTable: """Delete all OAuth sessions for a specific user and provider""" try: async with get_async_db_context(db) as db: - result = await db.execute( - delete(OAuthSession).filter_by(user_id=user_id, provider=provider) - ) + result = await db.execute(delete(OAuthSession).filter_by(user_id=user_id, provider=provider)) await db.commit() return result.rowcount > 0 except Exception as e: diff --git a/backend/open_webui/retrieval/loaders/main.py b/backend/open_webui/retrieval/loaders/main.py index 7a115ca6d7..2daa641bf2 100644 --- a/backend/open_webui/retrieval/loaders/main.py +++ b/backend/open_webui/retrieval/loaders/main.py @@ -400,10 +400,7 @@ class Loader: api_key=self.kwargs.get('MISTRAL_OCR_API_KEY'), file_path=file_path, ) - elif ( - self.engine == 'paddleocr_vl' - and self.kwargs.get('PADDLEOCR_VL_TOKEN') != '' - ): + elif self.engine == 'paddleocr_vl' and self.kwargs.get('PADDLEOCR_VL_TOKEN') != '': loader = PaddleOCRVLLoader( api_url=self.kwargs.get('PADDLEOCR_VL_BASE_URL'), token=self.kwargs.get('PADDLEOCR_VL_TOKEN'), diff --git a/backend/open_webui/retrieval/loaders/paddleocr_vl.py b/backend/open_webui/retrieval/loaders/paddleocr_vl.py index ab7632b3f8..b89369b2a4 100644 --- a/backend/open_webui/retrieval/loaders/paddleocr_vl.py +++ b/backend/open_webui/retrieval/loaders/paddleocr_vl.py @@ -11,6 +11,7 @@ from open_webui.env import GLOBAL_LOG_LEVEL logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL) log = logging.getLogger(__name__) + class PaddleOCRVLLoader: """Loader that uses PaddleOCR-vl API to extract text from PDF/images.""" @@ -21,9 +22,9 @@ class PaddleOCRVLLoader: file_path: str, ): if not api_url or not token: - raise ValueError("PaddleOCR-vl API URL and Token are required.") + raise ValueError('PaddleOCR-vl API URL and Token are required.') if not os.path.exists(file_path): - raise FileNotFoundError(f"File not found at {file_path}") + raise FileNotFoundError(f'File not found at {file_path}') self.api_url = api_url.rstrip('/') self.token = token @@ -31,20 +32,17 @@ class PaddleOCRVLLoader: self.file_name = os.path.basename(file_path) def load(self) -> List[Document]: - log.info(f"Processing with PaddleOCR-vl: {self.file_path}") + log.info(f'Processing with PaddleOCR-vl: {self.file_path}') try: - with open(self.file_path, "rb") as file: + with open(self.file_path, 'rb') as file: file_bytes = file.read() - file_data = base64.b64encode(file_bytes).decode("ascii") + file_data = base64.b64encode(file_bytes).decode('ascii') except Exception as e: - log.error(f"Failed to read file {self.file_path}: {e}") + log.error(f'Failed to read file {self.file_path}: {e}') raise - headers = { - "Authorization": f"token {self.token}", - "Content-Type": "application/json" - } + headers = {'Authorization': f'token {self.token}', 'Content-Type': 'application/json'} # Detect fileType based on file extension ext = self.file_path.lower().split('.')[-1] @@ -52,76 +50,76 @@ class PaddleOCRVLLoader: file_type = 1 if ext in image_extensions else 0 payload = { - "file": file_data, - "fileType": file_type, - "useDocOrientationClassify": False, - "useDocUnwarping": False, - "useChartRecognition": False, + 'file': file_data, + 'fileType': file_type, + 'useDocOrientationClassify': False, + 'useDocUnwarping': False, + 'useChartRecognition': False, } try: - response = requests.post(f"{self.api_url}/layout-parsing", json=payload, headers=headers) + response = requests.post(f'{self.api_url}/layout-parsing', json=payload, headers=headers) response.raise_for_status() - - result = response.json().get("result", {}) - layout_results = result.get("layoutParsingResults", []) - + + result = response.json().get('result', {}) + layout_results = result.get('layoutParsingResults', []) + documents = [] total_pages = len(layout_results) skipped_pages = 0 - + for i, res in enumerate(layout_results): - markdown_text = res.get("markdown", {}).get("text", "") - + markdown_text = res.get('markdown', {}).get('text', '') + if isinstance(markdown_text, str): cleaned_content = markdown_text.strip() else: cleaned_content = str(markdown_text).strip() - + if not cleaned_content: skipped_pages += 1 continue - + documents.append( Document( page_content=cleaned_content, metadata={ - "page": i, - "page_label": i + 1, - "total_pages": total_pages, - "file_name": self.file_name, - "processing_engine": "paddleocr-vl" - } + 'page': i, + 'page_label': i + 1, + 'total_pages': total_pages, + 'file_name': self.file_name, + 'processing_engine': 'paddleocr-vl', + }, ) ) - + if skipped_pages > 0: - log.info(f"PaddleOCR-vl: Processed {len(documents)} pages, skipped {skipped_pages} empty pages.") - + log.info(f'PaddleOCR-vl: Processed {len(documents)} pages, skipped {skipped_pages} empty pages.') + if not documents: - log.warning("No valid text content found by PaddleOCR-vl.") + log.warning('No valid text content found by PaddleOCR-vl.') return [ Document( - page_content="No valid text content found in document", + page_content='No valid text content found in document', metadata={ - "error": "no_valid_pages", - "file_name": self.file_name, - "processing_engine": "paddleocr-vl" - } + 'error': 'no_valid_pages', + 'file_name': self.file_name, + 'processing_engine': 'paddleocr-vl', + }, ) ] - + return documents - + except Exception as e: - log.error(f"Error calling PaddleOCR-vl: {e}") + log.error(f'Error calling PaddleOCR-vl: {e}') return [ Document( - page_content=f"Error during OCR processing: {e}", + page_content=f'Error during OCR processing: {e}', metadata={ - "error": "processing_failed", - "file_name": self.file_name, - "processing_engine": "paddleocr-vl" - } + 'error': 'processing_failed', + 'file_name': self.file_name, + 'processing_engine': 'paddleocr-vl', + }, ) ] diff --git a/backend/open_webui/routers/auths.py b/backend/open_webui/routers/auths.py index 7cb6ca3681..6d2349f89f 100644 --- a/backend/open_webui/routers/auths.py +++ b/backend/open_webui/routers/auths.py @@ -877,9 +877,7 @@ async def delete_oauth_session_by_provider( The provider string matches the 'provider' field in the oauth_session table (e.g. 'mcp:server-id' for MCP connections). """ - result = await OAuthSessions.delete_sessions_by_user_id_and_provider( - user.id, provider, db=db - ) + result = await OAuthSessions.delete_sessions_by_user_id_and_provider(user.id, provider, db=db) if not result: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, diff --git a/backend/open_webui/routers/tools.py b/backend/open_webui/routers/tools.py index af5e795511..04d845c3de 100644 --- a/backend/open_webui/routers/tools.py +++ b/backend/open_webui/routers/tools.py @@ -917,4 +917,3 @@ async def update_tools_user_valves_by_id( status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND, ) - diff --git a/backend/open_webui/utils/plugin.py b/backend/open_webui/utils/plugin.py index 5b945749ec..43ff4fe2e7 100644 --- a/backend/open_webui/utils/plugin.py +++ b/backend/open_webui/utils/plugin.py @@ -335,7 +335,9 @@ async def get_tool_module_from_cache(request, tool_id, load_from_db=True): return tool_module, frontmatter -async def get_function_module_from_cache(request, function_id, function: FunctionModel | None = None, load_from_db=True): +async def get_function_module_from_cache( + request, function_id, function: FunctionModel | None = None, load_from_db=True +): if load_from_db: # Always load from the database by default # This is useful for hooks like "inlet" or "outlet" where the content might change diff --git a/src/lib/apis/configs/index.ts b/src/lib/apis/configs/index.ts index b0dd6541ee..6b7bf6f47b 100644 --- a/src/lib/apis/configs/index.ts +++ b/src/lib/apis/configs/index.ts @@ -647,4 +647,3 @@ export const setBanners = async (token: string, banners: Banner[]) => { return res; }; - diff --git a/src/lib/apis/tools/index.ts b/src/lib/apis/tools/index.ts index 1d812b3f0f..5d26e50fee 100644 --- a/src/lib/apis/tools/index.ts +++ b/src/lib/apis/tools/index.ts @@ -483,4 +483,3 @@ export const updateUserValvesById = async (token: string, id: string, valves: ob return res; }; - diff --git a/src/lib/apis/users/index.ts b/src/lib/apis/users/index.ts index 13044c09d5..91b63338de 100644 --- a/src/lib/apis/users/index.ts +++ b/src/lib/apis/users/index.ts @@ -550,4 +550,3 @@ export const getUserGroupsById = async (token: string, userId: string) => { return res; }; - diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index 6416b2d05a..e173c74969 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -1369,12 +1369,13 @@ )} /> - - {#if RAGConfig.RAG_TEMPLATE && ((RAGConfig.RAG_TEMPLATE.match(/\[context\]/g) || []).length + (RAGConfig.RAG_TEMPLATE.match(/\{\{CONTEXT\}\}/g) || []).length) > 1} + {#if RAGConfig.RAG_TEMPLATE && (RAGConfig.RAG_TEMPLATE.match(/\[context\]/g) || []).length + (RAGConfig.RAG_TEMPLATE.match(/\{\{CONTEXT\}\}/g) || []).length > 1}
- {$i18n.t('This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.')} + {$i18n.t( + 'This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.' + )}
{/if} diff --git a/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte b/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte index a62b3a2438..2fc2c4bc5f 100644 --- a/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte +++ b/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte @@ -406,7 +406,7 @@ } }} > - + diff --git a/src/lib/components/chat/Messages/Message.svelte b/src/lib/components/chat/Messages/Message.svelte index b161aa8556..242e84f459 100644 --- a/src/lib/components/chat/Messages/Message.svelte +++ b/src/lib/components/chat/Messages/Message.svelte @@ -138,4 +138,3 @@ contain-intrinsic-size: auto 150px; } - diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index 2acbd0b8a1..748d8de646 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -517,7 +517,7 @@ "Delete a model": "모델 삭제", "Delete All": "모두 삭제", "Delete All Chats": "모든 채팅 삭제", - "Delete all contents inside this folder":"이 폴더 내 모든 콘텐츠 삭제", + "Delete all contents inside this folder": "이 폴더 내 모든 콘텐츠 삭제", "Delete automation?": "자동 삭제하시겠습니까?", "Delete Chat": "채팅 삭제", "Delete chat?": "채팅을 삭제하시겠습니까?", @@ -1350,7 +1350,7 @@ "new-channel": "새 채널", "Next message": "다음 메시지", "Next run": "다음 실행", - "No access grants. Private to you.": "접근 권한이 없습니다. 개인용입니다.", + "No access grants. Private to you.": "접근 권한이 없습니다. 개인용입니다.", "No activity data": "활동 데이터가 없습니다", "No authentication": "권한 인증이 없습니다", "No automations found": "자동화된 항목을 찾을 수 없습니다.", @@ -1697,8 +1697,8 @@ "Search": "검색", "Search a model": "모델 검색", "Search all emojis": "모든 이모지 검색", - "Search and manage user memories":"사용자 기억 검색 및 관리", - "Search and view user chat history":"사용자 채팅 기록 검색 및 보기", + "Search and manage user memories": "사용자 기억 검색 및 관리", + "Search and view user chat history": "사용자 채팅 기록 검색 및 보기", "Search Automations": "자동 검색", "Search Base": "검색 기반", "Search channels and channel messages": "채널 및 채널 메시지 검색", @@ -2003,7 +2003,7 @@ "Tika Server URL required.": "Tika 서버 URL이 필요합니다.", "Tiktoken": "틱토큰 (Tiktoken)", "Time": "시간", - "Time & Calculation":"시간 및 계산", + "Time & Calculation": "시간 및 계산", "Timeout": "시간 초과", "Title": "제목", "Title Auto-Generation": "제목 자동 생성", diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 01d9c10b65..4ba065d44c 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -489,7 +489,10 @@ const displayTitle = title || $i18n.t('New Chat'); if (done) { - if (($settings?.notificationSound ?? true) && ($settings?.notificationSoundAlways ?? false)) { + if ( + ($settings?.notificationSound ?? true) && + ($settings?.notificationSoundAlways ?? false) + ) { playingNotificationSound.set(true); const audio = new Audio(`/audio/notification.mp3`); From f93d20ac425b06d35cf283b2f770f070b600b950 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 18:48:45 +0900 Subject: [PATCH 50/51] chore: i18n --- src/lib/i18n/locales/ar-BH/translation.json | 10 +- src/lib/i18n/locales/ar/translation.json | 10 +- src/lib/i18n/locales/az-AZ/translation.json | 10 +- src/lib/i18n/locales/bg-BG/translation.json | 10 +- src/lib/i18n/locales/bn-BD/translation.json | 10 +- src/lib/i18n/locales/bo-TB/translation.json | 10 +- src/lib/i18n/locales/bs-BA/translation.json | 10 +- src/lib/i18n/locales/ca-ES/translation.json | 10 +- src/lib/i18n/locales/ceb-PH/translation.json | 10 +- src/lib/i18n/locales/cs-CZ/translation.json | 10 +- src/lib/i18n/locales/da-DK/translation.json | 10 +- src/lib/i18n/locales/de-DE/translation.json | 10 +- src/lib/i18n/locales/dg-DG/translation.json | 10 +- src/lib/i18n/locales/el-GR/translation.json | 10 +- src/lib/i18n/locales/en-GB/translation.json | 10 +- src/lib/i18n/locales/en-US/translation.json | 11 +- src/lib/i18n/locales/es-ES/translation.json | 10 +- src/lib/i18n/locales/et-EE/translation.json | 10 +- src/lib/i18n/locales/eu-ES/translation.json | 10 +- src/lib/i18n/locales/fa-IR/translation.json | 10 +- src/lib/i18n/locales/fi-FI/translation.json | 10 +- src/lib/i18n/locales/fr-CA/translation.json | 10 +- src/lib/i18n/locales/fr-FR/translation.json | 10 +- src/lib/i18n/locales/gl-ES/translation.json | 10 +- src/lib/i18n/locales/he-IL/translation.json | 10 +- src/lib/i18n/locales/hi-IN/translation.json | 10 +- src/lib/i18n/locales/hr-HR/translation.json | 10 +- src/lib/i18n/locales/hu-HU/translation.json | 10 +- src/lib/i18n/locales/id-ID/translation.json | 10 +- src/lib/i18n/locales/ie-GA/translation.json | 10 +- src/lib/i18n/locales/it-IT/translation.json | 10 +- src/lib/i18n/locales/ja-JP/translation.json | 10 +- src/lib/i18n/locales/ka-GE/translation.json | 10 +- src/lib/i18n/locales/kab-DZ/translation.json | 10 +- src/lib/i18n/locales/ko-KR/translation.json | 45 +++++- src/lib/i18n/locales/lt-LT/translation.json | 10 +- src/lib/i18n/locales/lv-LV/translation.json | 10 +- src/lib/i18n/locales/ms-MY/translation.json | 10 +- src/lib/i18n/locales/nb-NO/translation.json | 10 +- src/lib/i18n/locales/nl-NL/translation.json | 134 +++++++++--------- src/lib/i18n/locales/pa-IN/translation.json | 10 +- src/lib/i18n/locales/pl-PL/translation.json | 10 +- src/lib/i18n/locales/pt-BR/translation.json | 10 +- src/lib/i18n/locales/pt-PT/translation.json | 10 +- src/lib/i18n/locales/ro-RO/translation.json | 10 +- src/lib/i18n/locales/ru-RU/translation.json | 10 +- src/lib/i18n/locales/sk-SK/translation.json | 10 +- src/lib/i18n/locales/sr-RS/translation.json | 10 +- src/lib/i18n/locales/sv-SE/translation.json | 10 +- src/lib/i18n/locales/ta-IN/translation.json | 10 +- src/lib/i18n/locales/th-TH/translation.json | 10 +- src/lib/i18n/locales/tk-TM/translation.json | 10 +- src/lib/i18n/locales/tr-TR/translation.json | 10 +- src/lib/i18n/locales/ug-CN/translation.json | 10 +- src/lib/i18n/locales/uk-UA/translation.json | 10 +- src/lib/i18n/locales/ur-PK/translation.json | 10 +- .../i18n/locales/uz-Cyrl-UZ/translation.json | 10 +- .../i18n/locales/uz-Latn-Uz/translation.json | 10 +- src/lib/i18n/locales/vi-VN/translation.json | 10 +- src/lib/i18n/locales/zh-CN/translation.json | 11 +- src/lib/i18n/locales/zh-TW/translation.json | 10 +- 61 files changed, 583 insertions(+), 188 deletions(-) diff --git a/src/lib/i18n/locales/ar-BH/translation.json b/src/lib/i18n/locales/ar-BH/translation.json index 13e9aed4e9..0e88fb3370 100644 --- a/src/lib/i18n/locales/ar-BH/translation.json +++ b/src/lib/i18n/locales/ar-BH/translation.json @@ -62,7 +62,6 @@ "Account Activation Pending": "", "Accurate information": "معلومات دقيقة", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "إجراء مطلوب لتخزين سجل الدردشة", "Actions": "", "Activate": "", @@ -163,7 +162,6 @@ "Always Play Notification Sound": "", "Amazing": "", "an assistant": "مساعد", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -583,6 +581,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "معطل", + "Disconnect OAuth": "", "Discover a function": "", "Discover a model": "اكتشف نموذجا", "Discover a prompt": "اكتشاف موجه", @@ -772,6 +771,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "(e.g. 50) أدخل عدد الخطوات", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -902,6 +903,7 @@ "Failed to create API Key.": "فشل في إنشاء مفتاح API.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1456,6 +1458,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "", + "OAuth session disconnected": "", "October": "اكتوبر", "Off": "أغلاق", "Okay, Let's Go!": "حسنا دعنا نذهب!", @@ -1522,6 +1525,8 @@ "Output format": "", "Output Format": "", "Overview": "", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2032,6 +2037,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "", "This will delete {{NAME}} and all its contents.": "", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/ar/translation.json b/src/lib/i18n/locales/ar/translation.json index 3eb53e68bd..ab9b78e1ca 100644 --- a/src/lib/i18n/locales/ar/translation.json +++ b/src/lib/i18n/locales/ar/translation.json @@ -62,7 +62,6 @@ "Account Activation Pending": "انتظار تفعيل الحساب", "Accurate information": "معلومات دقيقة", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "إجراء مطلوب لتخزين سجل الدردشة", "Actions": "الإجراءات", "Activate": "تفعيل", @@ -163,7 +162,6 @@ "Always Play Notification Sound": "", "Amazing": "رائع", "an assistant": "مساعد", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "تم التحليل", "Analyzing...": "جارٍ التحليل...", @@ -583,6 +581,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "معطّل", + "Disconnect OAuth": "", "Discover a function": "اكتشف وظيفة", "Discover a model": "اكتشف نموذجا", "Discover a prompt": "اكتشاف موجه", @@ -772,6 +771,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "(e.g. 50) أدخل عدد الخطوات", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "أدخل مفتاح API لـ Perplexity", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -902,6 +903,7 @@ "Failed to create API Key.": "فشل في إنشاء مفتاح API.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1456,6 +1458,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "معرّف OAuth", + "OAuth session disconnected": "", "October": "اكتوبر", "Off": "أغلاق", "Okay, Let's Go!": "حسنا دعنا نذهب!", @@ -1522,6 +1525,8 @@ "Output format": "تنسيق الإخراج", "Output Format": "", "Overview": "نظرة عامة", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "صفحة", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2032,6 +2037,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "يحدد هذا الخيار الحد الأقصى لعدد الرموز التي يمكن للنموذج توليدها في الرد. زيادته تتيح للنموذج تقديم إجابات أطول، لكنها قد تزيد من احتمالية توليد محتوى غير مفيد أو غير ذي صلة.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "سيؤدي هذا الخيار إلى حذف جميع الملفات الحالية في المجموعة واستبدالها بالملفات التي تم تحميلها حديثًا.", "This response was generated by \"{{model}}\"": "تم توليد هذا الرد بواسطة \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "هذا سيقوم بالحذف", "This will delete {{NAME}} and all its contents.": "هذا سيحذف {{NAME}} وكل محتوياته.", "This will delete all models including custom models": "هذا سيحذف جميع النماذج بما في ذلك النماذج المخصصة", diff --git a/src/lib/i18n/locales/az-AZ/translation.json b/src/lib/i18n/locales/az-AZ/translation.json index 8eec5e5732..1567a0c8a1 100644 --- a/src/lib/i18n/locales/az-AZ/translation.json +++ b/src/lib/i18n/locales/az-AZ/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Hesabın aktivləşdirilməsi gözlənilir", "Accurate information": "Dəqiq məlumat", "Action": "Fəaliyyət", - "Action not found": "Fəaliyyət tapılmadı", "Action Required for Chat Log Storage": "Söhbət tarixçəsinin saxlanılması üçün hərəkət tələb olunur", "Actions": "Fəaliyyətlər", "Activate": "Aktivləşdir", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "Bildiriş səsini həmişə çal", "Amazing": "Möhtəşəm", "an assistant": "bir köməkçi", - "An error occurred while fetching the explanation": "İzahı gətirərkən xəta baş verdi", "Analytics": "Analitika", "Analyzed": "Analiz edildi", "Analyzing...": "Analiz edilir...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "Şəkil çıxarılmasını söndür", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "PDF-dən şəkil çıxarılmasını söndürün. 'LLM istifadə et' aktivdirsə, şəkillərə avtomatik altyazı veriləcək. Standart olaraq 'Xeyr' (False) təyin edilib.", "Disabled": "Söndürülüb", + "Disconnect OAuth": "", "Discover a function": "Funksiya kəşf edin", "Discover a model": "Model kəşf edin", "Discover a prompt": "Göstəriş kəşf edin", @@ -768,6 +767,8 @@ "Enter New Password": "Yeni şifrəni daxil edin", "Enter Number of Steps (e.g. 50)": "Addım sayını daxil edin (məs. 50)", "Enter Ollama Cloud API Key": "Ollama Cloud API açarını daxil edin", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Perplexity API açarını daxil edin", "Enter Perplexity Search API URL": "Perplexity axtarış API URL-ini daxil edin", "Enter Playwright Timeout": "Playwright vaxt aşımını daxil edin", @@ -898,6 +899,7 @@ "Failed to create API Key.": "API açarı yaradılmadı.", "Failed to delete calendar": "", "Failed to delete note": "Qeyd silinmədi", + "Failed to disconnect": "", "Failed to download image": "Şəkil yüklənmədi", "Failed to extract content from the file: {{error}}": "Fayldan məzmun çıxarıla bilmədi: {{error}}", "Failed to extract content from the file.": "Fayldan məzmun çıxarıla bilmədi.", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "Oktyabr", "Off": "Bağlı", "Okay, Let's Go!": "Yaxşı, başlayaq!", @@ -1518,6 +1521,8 @@ "Output format": "Çıxış formatı", "Output Format": "Çıxış Formatı", "Overview": "İcmal", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "səhifə", "Page": "Səhifə", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "Səhifə rejimi hər səhifə üçün bir sənəd yaradır. Tək rejim isə səhifə sərhədləri arasında daha yaxşı hissələrə ayırma (chunking) üçün bütün səhifələri bir sənəddə birləşdirir.", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Bu seçim modelin cavabında yarada biləcəyi maksimum token sayını təyin edir. Bu limiti artırmaq modelə daha uzun cavablar verməyə imkan verir, lakin faydasız və ya mövzuya aid olmayan məzmunun yaranma ehtimalını da artıra bilər.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Bu seçim kolleksiyadakı bütün mövcud faylları siləcək və onları yeni yüklənmiş fayllarla əvəz edəcək.", "This response was generated by \"{{model}}\"": "Bu cavab \"{{model}}\" tərəfindən yaradılmışdır", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Bu, siləcək:", "This will delete {{NAME}} and all its contents.": "Bu, {{NAME}} adlı elementi və onun bütün məzmununu siləcək.", "This will delete all models including custom models": "Bu, fərdi modellər də daxil olmaqla bütün modelləri siləcək", diff --git a/src/lib/i18n/locales/bg-BG/translation.json b/src/lib/i18n/locales/bg-BG/translation.json index 685debf883..a08459e7ca 100644 --- a/src/lib/i18n/locales/bg-BG/translation.json +++ b/src/lib/i18n/locales/bg-BG/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Активирането на акаунта е в процес на изчакване", "Accurate information": "Точна информация", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Изисква се действие за съхраняване на дневника на чата", "Actions": "Действия", "Activate": "Активиране", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "", "Amazing": "Невероятно", "an assistant": "асистент", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "Анализирано", "Analyzing...": "Анализиране...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Деактивирано", + "Disconnect OAuth": "", "Discover a function": "Открийте функция", "Discover a model": "Открийте модел", "Discover a prompt": "Откриване на промпт", @@ -768,6 +767,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "Въведете брой стъпки (напр. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "Неуспешно създаване на API ключ.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "ID на OAuth", + "OAuth session disconnected": "", "October": "Октомври", "Off": "Изкл.", "Okay, Let's Go!": "ОК, Нека започваме!", @@ -1518,6 +1521,8 @@ "Output format": "Изходен формат", "Output Format": "", "Overview": "Преглед", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "страница", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Тази опция ще изтрие всички съществуващи файлове в колекцията и ще ги замени с новокачени файлове.", "This response was generated by \"{{model}}\"": "Този отговор беше генериран от \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Това ще изтрие", "This will delete {{NAME}} and all its contents.": "Това ще изтрие {{NAME}} и цялото му съдържание.", "This will delete all models including custom models": "Това ще изтрие всички модели, включително персонализираните модели", diff --git a/src/lib/i18n/locales/bn-BD/translation.json b/src/lib/i18n/locales/bn-BD/translation.json index 9437c8a347..d5fd18ed59 100644 --- a/src/lib/i18n/locales/bn-BD/translation.json +++ b/src/lib/i18n/locales/bn-BD/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "", "Accurate information": "সঠিক তথ্য", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "চ্যাট লগ সংরক্ষণের জন্য পদক্ষেপ প্রয়োজন", "Actions": "", "Activate": "", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "", "Amazing": "", "an assistant": "একটা এসিস্ট্যান্ট", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "নিষ্ক্রিয়", + "Disconnect OAuth": "", "Discover a function": "", "Discover a model": "একটি মডেল আবিষ্কার করুন", "Discover a prompt": "একটি প্রম্পট খুঁজে বের করুন", @@ -768,6 +767,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "ধাপের সংখ্যা দিন (যেমন: 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "API Key তৈরি করা যায়নি।", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "", + "OAuth session disconnected": "", "October": "অক্টোবর", "Off": "বন্ধ", "Okay, Let's Go!": "ঠিক আছে, চলুন যাই!", @@ -1518,6 +1521,8 @@ "Output format": "", "Output Format": "", "Overview": "", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "", "This will delete {{NAME}} and all its contents.": "", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/bo-TB/translation.json b/src/lib/i18n/locales/bo-TB/translation.json index a65771c7b5..0f343ac5fd 100644 --- a/src/lib/i18n/locales/bo-TB/translation.json +++ b/src/lib/i18n/locales/bo-TB/translation.json @@ -57,7 +57,6 @@ "Account Activation Pending": "རྩིས་ཁྲ་སྒུལ་བསྐྱོད་སྒུག་བཞིན་པ།", "Accurate information": "གནས་ཚུལ་ཡང་དག", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "ཁ་བསྡམས་ཟིན་ཐོ་ཉར་ཚགས་ལ་བྱ་བ་དགོས།", "Actions": "བྱ་སྤྱོད།", "Activate": "སྒུལ་བསྐྱོད།", @@ -158,7 +157,6 @@ "Always Play Notification Sound": "", "Amazing": "ངོ་མཚར་ཆེན།", "an assistant": "ལག་རོགས་པ།", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "དབྱེ་ཞིབ་བྱས་པ།", "Analyzing...": "དབྱེ་ཞིབ་བྱེད་བཞིན་པ།...", @@ -578,6 +576,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "ནུས་མེད།", + "Disconnect OAuth": "", "Discover a function": "ལས་འགན་ཞིག་རྙེད་པ།", "Discover a model": "དཔེ་དབྱིབས་ཤིག་རྙེད་པ།", "Discover a prompt": "འགུལ་སློང་ཞིག་རྙེད་པ།", @@ -767,6 +766,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "གོམ་གྲངས་འཇུག་པ། (དཔེར་ན། ༥༠)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Perplexity API ལྡེ་མིག་འཇུག་པ།", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -897,6 +898,7 @@ "Failed to create API Key.": "API ལྡེ་མིག་བཟོ་མ་ཐུབ།", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1451,6 +1453,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "ཟླ་བ་བཅུ་པ།", "Off": "ཁ་རྒྱག་པ།", "Okay, Let's Go!": "འགྲིག་སོང་། འགྲོ།", @@ -1517,6 +1520,8 @@ "Output format": "ཐོན་འབྲས་ཀྱི་བཀོད་པ།", "Output Format": "", "Overview": "སྤྱི་མཐོང་།", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "ཤོག་ངོས།", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2017,6 +2022,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "འདེམས་ཀ་འདིས་དཔེ་དབྱིབས་ཀྱིས་དེའི་ལན་ནང་བཟོ་ཐུབ་པའི་ཊོཀ་ཀེན་གྱི་གྲངས་མང་ཤོས་འཇོག་པ། ཚད་བཀག་འདི་མང་དུ་བཏང་ན་དཔེ་དབྱིབས་ཀྱིས་ལན་རིང་བ་སྤྲོད་པར་གནང་བ་སྤྲོད། འོན་ཀྱང་དེས་ཕན་ཐོགས་མེད་པའམ་འབྲེལ་མེད་ཀྱི་ནང་དོན་བཟོ་བའི་ཆགས་ཚུལ་མང་དུ་གཏོང་སྲིད།", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "འདེམས་ཀ་འདིས་བསྡུ་གསོག་ནང་གི་ཡོད་པའི་ཡིག་ཆ་ཡོངས་རྫོགས་བསུབ་ནས་དེ་དག་གསར་དུ་སྤར་བའི་ཡིག་ཆས་ཚབ་བྱེད་ངེས།", "This response was generated by \"{{model}}\"": "ལན་འདི་ \"{{model}}\" ཡིས་བཟོས་པ།", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "འདིས་བསུབ་ངེས།", "This will delete {{NAME}} and all its contents.": "འདིས་ {{NAME}} དང་ དེའི་ནང་དོན་ཡོངས་རྫོགས་ བསུབ་ངེས།", "This will delete all models including custom models": "འདིས་སྲོལ་བཟོས་དཔེ་དབྱིབས་ཚུད་པའི་དཔེ་དབྱིབས་ཡོངས་རྫོགས་བསུབ་ངེས།", diff --git a/src/lib/i18n/locales/bs-BA/translation.json b/src/lib/i18n/locales/bs-BA/translation.json index d28abefd59..fe02a9b08d 100644 --- a/src/lib/i18n/locales/bs-BA/translation.json +++ b/src/lib/i18n/locales/bs-BA/translation.json @@ -59,7 +59,6 @@ "Account Activation Pending": "", "Accurate information": "Tačne informacije", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Potrebna je radnja za pohranu zapisnika razgovora", "Actions": "", "Activate": "", @@ -160,7 +159,6 @@ "Always Play Notification Sound": "", "Amazing": "", "an assistant": "asistent", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "Analiziranje ... ", @@ -580,6 +578,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Onemogućeno", + "Disconnect OAuth": "", "Discover a function": "", "Discover a model": "Otkrijte model", "Discover a prompt": "Otkrijte prompt", @@ -769,6 +768,8 @@ "Enter New Password": "Unesite Novu Sifru", "Enter Number of Steps (e.g. 50)": "Unesite broj koraka (npr. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -899,6 +900,7 @@ "Failed to create API Key.": "Neuspješno stvaranje API ključa.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1453,6 +1455,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "", + "OAuth session disconnected": "", "October": "Oktobar", "Off": "Isključeno", "Okay, Let's Go!": "U redu, idemo!", @@ -1519,6 +1522,8 @@ "Output format": "", "Output Format": "", "Overview": "", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2023,6 +2028,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "", "This will delete {{NAME}} and all its contents.": "", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index a3793e5e42..4db97a3ca2 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -59,7 +59,6 @@ "Account Activation Pending": "Activació del compte pendent", "Accurate information": "Informació precisa", "Action": "Acció", - "Action not found": "Acció no trobada", "Action Required for Chat Log Storage": "Cal una acció per desar el registre del xat", "Actions": "Accions", "Activate": "Activar", @@ -160,7 +159,6 @@ "Always Play Notification Sound": "Reproduir sempre un so de notificació", "Amazing": "Al·lucinant", "an assistant": "un assistent", - "An error occurred while fetching the explanation": "S'ha produït un error mentre s'obtenia l'explicació", "Analytics": "Analítica", "Analyzed": "Analitzat", "Analyzing...": "Analitzant...", @@ -580,6 +578,7 @@ "Disable Image Extraction": "Deshabilitar l'extracció d'imatges", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Desactiva l'extracció d'imatges del PDF. Si Utilitza LLM està habilitat, les imatges es descriuran automàticament. Per defecte és Fals.", "Disabled": "Deshabilitat", + "Disconnect OAuth": "", "Discover a function": "Descobrir una funció", "Discover a model": "Descobrir un model", "Discover a prompt": "Descobrir una indicació", @@ -769,6 +768,8 @@ "Enter New Password": "Introdueix un nova contrasenya", "Enter Number of Steps (e.g. 50)": "Introdueix el nombre de passos (p. ex. 50)", "Enter Ollama Cloud API Key": "Introdueix la clau API de Ollama Cloud", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Introdueix la clau API de Perplexity", "Enter Perplexity Search API URL": "Introduïu l'URL de l'API de cerca de Perplexity", "Enter Playwright Timeout": "Introdueix el temps d'espera de Playwright", @@ -899,6 +900,7 @@ "Failed to create API Key.": "No s'ha pogut crear la clau API.", "Failed to delete calendar": "", "Failed to delete note": "No s'ha pogut eliminar la nota", + "Failed to disconnect": "", "Failed to download image": "No s'ha pogut descarregar la imatge", "Failed to extract content from the file: {{error}}": "No s'ha pogut extreure el contingut del fitxer: {{error}}", "Failed to extract content from the file.": "No s'ha pogut extreure el contingut del fitxer", @@ -1453,6 +1455,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "OAuth 2.1 (Estàtic)", "OAuth ID": "ID OAuth", + "OAuth session disconnected": "", "October": "Octubre", "Off": "Desactivat", "Okay, Let's Go!": "D'acord, som-hi!", @@ -1519,6 +1522,8 @@ "Output format": "Format de sortida", "Output Format": "Format de sortida", "Overview": "Vista general", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "pàgina", "Page": "Pàgina", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "El mode de pàgina crea un document per pàgina. El mode únic combina totes les pàgines en un sol document per a una millor segmentació entre els límits de les pàgines.", @@ -2023,6 +2028,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Aquesta opció estableix el nombre màxim de tokens que el model pot generar en la seva resposta. Augmentar aquest límit permet que el model proporcioni respostes més llargues, però també pot augmentar la probabilitat que es generi contingut poc útil o irrellevant.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Aquesta opció eliminarà tots els fitxers existents de la col·lecció i els substituirà per fitxers recentment penjats.", "This response was generated by \"{{model}}\"": "Aquesta resposta l'ha generat el model \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Això eliminarà", "This will delete {{NAME}} and all its contents.": "Això eliminarà {{NAME}} i tots els continguts.", "This will delete all models including custom models": "Això eliminarà tots els models incloent els personalitzats", diff --git a/src/lib/i18n/locales/ceb-PH/translation.json b/src/lib/i18n/locales/ceb-PH/translation.json index d1278ac30b..9028e5339a 100644 --- a/src/lib/i18n/locales/ceb-PH/translation.json +++ b/src/lib/i18n/locales/ceb-PH/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "", "Accurate information": "", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Gikinahanglan ang aksyon aron matipigan ang chat log", "Actions": "", "Activate": "", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "", "Amazing": "", "an assistant": "usa ka katabang", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Gipalong", + "Disconnect OAuth": "", "Discover a function": "", "Discover a model": "", "Discover a prompt": "Pagkaplag usa ka prompt", @@ -768,6 +767,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "Pagsulod sa gidaghanon sa mga lakang (e.g. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "", + "OAuth session disconnected": "", "October": "", "Off": "Napuo", "Okay, Let's Go!": "Okay, lakaw na!", @@ -1518,6 +1521,8 @@ "Output format": "", "Output Format": "", "Overview": "", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "", "This will delete {{NAME}} and all its contents.": "", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/cs-CZ/translation.json b/src/lib/i18n/locales/cs-CZ/translation.json index a787579837..3cbab3a4b0 100644 --- a/src/lib/i18n/locales/cs-CZ/translation.json +++ b/src/lib/i18n/locales/cs-CZ/translation.json @@ -60,7 +60,6 @@ "Account Activation Pending": "Čeká se na aktivaci účtu", "Accurate information": "Přesné informace", "Action": "Akce", - "Action not found": "Akce nenalezena", "Action Required for Chat Log Storage": "Je vyžadována akce pro uložení záznamu chatu", "Actions": "Akce", "Activate": "Aktivovat", @@ -161,7 +160,6 @@ "Always Play Notification Sound": "Vždy přehrát zvuk oznámení", "Amazing": "Úžasné", "an assistant": "asistent", - "An error occurred while fetching the explanation": "Při načítání vysvětlení došlo k chybě", "Analytics": "Analytika", "Analyzed": "Analyzováno", "Analyzing...": "Analyzuji...", @@ -581,6 +579,7 @@ "Disable Image Extraction": "Zakázat extrakci obrázků", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Zakázat extrakci obrázků z PDF. Pokud je povoleno Použít LLM, obrázky budou automaticky opatřeny popisky. Výchozí hodnota je False.", "Disabled": "Zakázáno", + "Disconnect OAuth": "", "Discover a function": "Objevit funkci", "Discover a model": "Objevit model", "Discover a prompt": "Objevit instrukci", @@ -770,6 +769,8 @@ "Enter New Password": "Zadejte nové heslo", "Enter Number of Steps (e.g. 50)": "Zadejte počet kroků (např. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Zadejte API klíč pro Perplexity", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "Zadejte časový limit pro Playwright", @@ -900,6 +901,7 @@ "Failed to create API Key.": "Nepodařilo se vytvořit API klíč.", "Failed to delete calendar": "", "Failed to delete note": "Nepodařilo se smazat poznámku", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "Nepodařilo se extrahovat obsah ze souboru: {{error}}", "Failed to extract content from the file.": "Nepodařilo se extrahovat obsah ze souboru.", @@ -1454,6 +1456,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "Říjen", "Off": "Vypnuto", "Okay, Let's Go!": "Dobře, jdeme na to!", @@ -1520,6 +1523,8 @@ "Output format": "Formát výstupu", "Output Format": "Formát výstupu", "Overview": "Přehled", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "stránka", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2026,6 +2031,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Tato možnost nastavuje maximální počet tokenů, které může model vygenerovat ve své odpovědi. Zvýšení tohoto limitu umožňuje modelu poskytovat delší odpovědi, ale může také zvýšit pravděpodobnost generování neužitečného nebo irelevantního obsahu.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Tato volba smaže všechny existující soubory v kolekci a nahradí je nově nahranými soubory.", "This response was generated by \"{{model}}\"": "Tato odpověď byla vygenerována modelem \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Tím se smaže", "This will delete {{NAME}} and all its contents.": "Tím se smaže {{NAME}} a veškerý jeho obsah.", "This will delete all models including custom models": "Tím se smažou všechny modely včetně vlastních modelů", diff --git a/src/lib/i18n/locales/da-DK/translation.json b/src/lib/i18n/locales/da-DK/translation.json index cde38de62f..ee31431f81 100644 --- a/src/lib/i18n/locales/da-DK/translation.json +++ b/src/lib/i18n/locales/da-DK/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Aktivering af profil afventer", "Accurate information": "Profilinformation", "Action": "Handling", - "Action not found": "Handling ikke fundet", "Action Required for Chat Log Storage": "Handling påkrævet for lagring af chatlog", "Actions": "Handlinger", "Activate": "Aktiver", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "Afspil altid notifikationslyde", "Amazing": "Fantastisk", "an assistant": "en assistent", - "An error occurred while fetching the explanation": "En fejl opstod under hentning af forklaringen", "Analytics": "Analytics", "Analyzed": "Analyseret", "Analyzing...": "Analyserer...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "Deaktiver billedudtrækning", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Deaktiver billedudtrækning fra PDF'en. Hvis Use LLM er aktiveret, vil billeder automatisk få undertekster. Standard er False.", "Disabled": "Deaktiveret", + "Disconnect OAuth": "", "Discover a function": "Find en funktion", "Discover a model": "Find en model", "Discover a prompt": "Find en prompt", @@ -768,6 +767,8 @@ "Enter New Password": "Indtast ny adgangskode", "Enter Number of Steps (e.g. 50)": "Indtast antal trin (f.eks. 50)", "Enter Ollama Cloud API Key": "Indtast Ollama Cloud API nøgle", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Indtast Perplexity API nøgle", "Enter Perplexity Search API URL": "Indtast Perplexity Search API URL", "Enter Playwright Timeout": "Indtast Playwright timeout", @@ -898,6 +899,7 @@ "Failed to create API Key.": "Kunne ikke oprette API-nøgle.", "Failed to delete calendar": "", "Failed to delete note": "Kunne ikke slette note", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "Kunne ikke udtrække indhold fra filen: {{error}}", "Failed to extract content from the file.": "Kunne ikke udtrække indhold fra filen.", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth-ID", + "OAuth session disconnected": "", "October": "Oktober", "Off": "Fra", "Okay, Let's Go!": "Okay, lad os komme i gang!", @@ -1518,6 +1521,8 @@ "Output format": "Outputformat", "Output Format": "Output format", "Overview": "Oversigt", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "side", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Denne indstilling sætter det maksimale antal tokens modellen kan generere i sit svar. At øge denne grænse tillader modellen at give længere svar, men det kan også øge sandsynligheden for at unyttigt eller irrelevant indhold genereres.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Denne indstilling sletter alle eksisterende filer i samlingen og erstatter dem med nyligt uploadede filer.", "This response was generated by \"{{model}}\"": "Dette svar blev genereret af \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Dette vil slette", "This will delete {{NAME}} and all its contents.": "Dette vil slette {{NAME}} og alt dens indhold.", "This will delete all models including custom models": "Dette vil slette alle modeller, inklusive brugerdefinerede modeller", diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index aec1910274..20abba53a8 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Kontoaktivierung ausstehend", "Accurate information": "Präzise Informationen", "Action": "Aktion", - "Action not found": "Aktion nicht gefunden", "Action Required for Chat Log Storage": "Handlung erforderlich: Speicherung des Chat-Protokolls", "Actions": "Aktionen", "Activate": "Aktivieren", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "Benachrichtigungston immer abspielen", "Amazing": "Fantastisch", "an assistant": "ein Assistent", - "An error occurred while fetching the explanation": "Beim Abrufen der Erklärung ist ein Fehler aufgetreten", "Analytics": "Analyse", "Analyzed": "Analysiert", "Analyzing...": "Analysiere...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "Bildextraktion deaktivieren", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Deaktiviert Bildextraktion aus PDFs. Wenn 'LLM verwenden' aktiv ist, werden Bilder automatisch beschriftet. Standard: False.", "Disabled": "Deaktiviert", + "Disconnect OAuth": "", "Discover a function": "Funktion entdecken", "Discover a model": "Modell entdecken", "Discover a prompt": "Prompt entdecken", @@ -768,6 +767,8 @@ "Enter New Password": "Neues Passwort eingeben", "Enter Number of Steps (e.g. 50)": "Anzahl der Schritte eingeben (z. B. 50)", "Enter Ollama Cloud API Key": "Ollama Cloud API-Schlüssel eingeben", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Perplexity API-Schlüssel eingeben", "Enter Perplexity Search API URL": "Perplexity Search API-URL eingeben", "Enter Playwright Timeout": "Playwright-Timeout eingeben", @@ -898,6 +899,7 @@ "Failed to create API Key.": "API-Schlüssel konnte nicht erstellt werden.", "Failed to delete calendar": "", "Failed to delete note": "Notiz konnte nicht gelöscht werden", + "Failed to disconnect": "", "Failed to download image": "Bild konnte nicht heruntergeladen werden", "Failed to extract content from the file: {{error}}": "Inhaltsextraktion fehlgeschlagen: {{error}}", "Failed to extract content from the file.": "Inhaltsextraktion fehlgeschlagen.", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "OAuth 2.1 (Statisch)", "OAuth ID": "OAuth-ID", + "OAuth session disconnected": "", "October": "Oktober", "Off": "Aus", "Okay, Let's Go!": "Okay, los geht's!", @@ -1518,6 +1521,8 @@ "Output format": "Ausgabeformat", "Output Format": "Ausgabeformat", "Overview": "Übersicht", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "Seite", "Page": "Seite", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "Der Seitenmodus erstellt ein Dokument pro Seite. Der Einzelmodus fasst alle Seiten zu einem Dokument zusammen, um besser über Seitenumbrüche hinweg zu chunking/segmentieren.", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Diese Option legt die maximale Anzahl von Token fest, die das Modell generieren darf. Ein höheres Limit ermöglicht längere Antworten, kann aber auch die Wahrscheinlichkeit für irrelevante Inhalte erhöhen.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Diese Option löscht alle vorhandenen Dateien in der Sammlung und ersetzt sie durch die neu hochgeladenen Dateien.", "This response was generated by \"{{model}}\"": "Diese Antwort wurde von \"{{model}}\" generiert", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Dies löscht", "This will delete {{NAME}} and all its contents.": "Dies löscht {{NAME}} und alle Inhalte.", "This will delete all models including custom models": "Dies löscht alle Modelle, einschließlich benutzerdefinierter Modelle", diff --git a/src/lib/i18n/locales/dg-DG/translation.json b/src/lib/i18n/locales/dg-DG/translation.json index b4a402abac..ff98cd2b3b 100644 --- a/src/lib/i18n/locales/dg-DG/translation.json +++ b/src/lib/i18n/locales/dg-DG/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "", "Accurate information": "", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Much action require for chat log storage", "Actions": "", "Activate": "", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "", "Amazing": "", "an assistant": "such assistant", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Disabled sad", + "Disconnect OAuth": "", "Discover a function": "", "Discover a model": "", "Discover a prompt": "Discover a prompt", @@ -768,6 +767,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "Enter Number of Steps (e.g. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "", + "OAuth session disconnected": "", "October": "", "Off": "Off", "Okay, Let's Go!": "Okay, Let's Go!", @@ -1518,6 +1521,8 @@ "Output format": "", "Output Format": "", "Overview": "", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "", "This will delete {{NAME}} and all its contents.": "", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/el-GR/translation.json b/src/lib/i18n/locales/el-GR/translation.json index 22391542aa..e5e0701f19 100644 --- a/src/lib/i18n/locales/el-GR/translation.json +++ b/src/lib/i18n/locales/el-GR/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Ενεργοποίηση Λογαριασμού Εκκρεμεί", "Accurate information": "Ακριβείς πληροφορίες", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Απαιτείται ενέργεια για την αποθήκευση του αρχείου συνομιλίας", "Actions": "Ενέργειες", "Activate": "", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "Πάντα να αναπαράγετε ο ήχος ειδοποίησης", "Amazing": "Καταπληκτικό", "an assistant": "ένας βοηθός", - "An error occurred while fetching the explanation": "", "Analytics": "Αναλυτικά", "Analyzed": "Αναλυμένα", "Analyzing...": "Ανάλυση...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Απενεργοποιημένο", + "Disconnect OAuth": "", "Discover a function": "Ανακάλυψη λειτουργίας", "Discover a model": "Ανακάλυψη μοντέλου", "Discover a prompt": "Ανακάλυψη προτροπής", @@ -768,6 +767,8 @@ "Enter New Password": "Εισάγετε νέο κωδικό", "Enter Number of Steps (e.g. 50)": "Εισάγετε τον Αριθμό Βημάτων (π.χ. 50)", "Enter Ollama Cloud API Key": "Εισάγετε το Κλειδί API Ollama Cloud", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Εισάγετε το Κλειδί API Perplexity", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "Εισάγετε το χρονικό όριο του Playwright", @@ -898,6 +899,7 @@ "Failed to create API Key.": "Αποτυχία δημιουργίας Κλειδιού API.", "Failed to delete calendar": "", "Failed to delete note": "Αποτυχία διαγραφής σημειώσεως", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "Οκτώβριος", "Off": "Ανενεργό", "Okay, Let's Go!": "Εντάξει, Πάμε!", @@ -1518,6 +1521,8 @@ "Output format": "Μορφή εξόδου", "Output Format": "Μορφή Εξόδου", "Overview": "Επισκόπηση", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "σελίδα", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Αυτή η επιλογή θα διαγράψει όλα τα υπάρχοντα αρχεία στη συλλογή και θα τα αντικαταστήσει με νέα ανεβασμένα αρχεία.", "This response was generated by \"{{model}}\"": "Αυτή η απάντηση δημιουργήθηκε από \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Αυτό θα διαγράψει", "This will delete {{NAME}} and all its contents.": "Αυτό θα διαγράψει το {{NAME}} και όλο το περιεχόμενό του.", "This will delete all models including custom models": "Αυτό θα διαγράψει όλα τα μοντέλα, συμπεριλαμβανομένων των προσαρμοσμένων μοντέλων", diff --git a/src/lib/i18n/locales/en-GB/translation.json b/src/lib/i18n/locales/en-GB/translation.json index 88cfb9a311..390ff5ccce 100644 --- a/src/lib/i18n/locales/en-GB/translation.json +++ b/src/lib/i18n/locales/en-GB/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "", "Accurate information": "", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "", "Actions": "", "Activate": "", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "", "Amazing": "", "an assistant": "", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "Analysed", "Analyzing...": "Analysing", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "", + "Disconnect OAuth": "", "Discover a function": "", "Discover a model": "", "Discover a prompt": "", @@ -768,6 +767,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "", + "OAuth session disconnected": "", "October": "", "Off": "", "Okay, Let's Go!": "", @@ -1518,6 +1521,8 @@ "Output format": "", "Output Format": "", "Overview": "", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "", "This will delete {{NAME}} and all its contents.": "", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index 36ad93ad61..fa95605898 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "", "Accurate information": "", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "", "Actions": "", "Activate": "", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "", "Amazing": "", "an assistant": "", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "", + "Disconnect OAuth": "", "Discover a function": "", "Discover a model": "", "Discover a prompt": "", @@ -768,6 +767,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -775,8 +776,6 @@ "Enter prompt here.": "", "Enter proxy URL (e.g. https://user:password@host:port)": "", "Enter reasoning effort": "", - "Enter PaddleOCR-vl API Token": "", - "Enter PaddleOCR-vl API Base URL": "", "Enter Score": "", "Enter SearchApi API Key": "", "Enter SearchApi Engine": "", @@ -900,6 +899,7 @@ "Failed to create API Key.": "", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1454,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "", + "OAuth session disconnected": "", "October": "", "Off": "", "Okay, Let's Go!": "", @@ -1521,6 +1522,7 @@ "Output Format": "", "Overview": "", "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2023,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "", "This will delete {{NAME}} and all its contents.": "", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index 2f44afcee4..3b601af36b 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -59,7 +59,6 @@ "Account Activation Pending": "Activación de cuenta Pendiente", "Accurate information": "Información precisa", "Action": "Acción", - "Action not found": "Acción no encontrada", "Action Required for Chat Log Storage": "Se requiere acción para almacenar el registro del chat", "Actions": "Acciones", "Activate": "Activar", @@ -160,7 +159,6 @@ "Always Play Notification Sound": "Reproducir Siempre Sonido de Notificación", "Amazing": "Emocionante", "an assistant": "un asistente", - "An error occurred while fetching the explanation": "Se ha producido un error al obtener la explicación", "Analytics": "Analíticas", "Analyzed": "Analizado", "Analyzing...": "Analizando..", @@ -580,6 +578,7 @@ "Disable Image Extraction": "Deshabilitar Extracción de Imágenes", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Desabilita la extracción de imágenes del pdf. Si está habilitado Usar LLM las imágenes se capturan automáticamente. Por defecto el valor es Falso (las imágenes se extraen).", "Disabled": "Deshabilitado", + "Disconnect OAuth": "", "Discover a function": "Descubrir Funciónes", "Discover a model": "Descubrir Modelos", "Discover a prompt": "Descubrir Indicadores", @@ -769,6 +768,8 @@ "Enter New Password": "Ingresar Contraseña Nueva", "Enter Number of Steps (e.g. 50)": "Ingresar Número de Pasos (p.ej., 50)", "Enter Ollama Cloud API Key": "Ingresar Clave API de Ollama Cloud", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Ingresar Clave API de Perplexity", "Enter Perplexity Search API URL": "Ingresar URL API para la Búsqueda de Perplexity", "Enter Playwright Timeout": "Ingresar límite de tiempo de espera de Playwright", @@ -899,6 +900,7 @@ "Failed to create API Key.": "Fallo al crear la Clave API.", "Failed to delete calendar": "", "Failed to delete note": "Fallo al eliminar nota", + "Failed to disconnect": "", "Failed to download image": "Fallo al descargar imagen", "Failed to extract content from the file: {{error}}": "Fallo al extraer el contenido del archivo: {{error}}", "Failed to extract content from the file.": "Fallo al extraer el contenido del archivo.", @@ -1453,6 +1455,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "OAuth 2.1 (Estático)", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "Octubre", "Off": "Desactivado", "Okay, Let's Go!": "Vale, ¡Vamos!", @@ -1519,6 +1522,8 @@ "Output format": "Formato de salida", "Output Format": "Formato de Salida", "Overview": "Vista General", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "página", "Page": "Página", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "El modo Página crea un documento por página. El modo Individual combina todas las páginas en un solo documento para una mejor segmentación entre páginas.", @@ -2023,6 +2028,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Esta opción establece el número máximo de tokens que el modelo puede generar en sus respuestas. Aumentar este límite permite al modelo proporcionar respuestas más largas, pero también puede aumentar la probabilidad de que se genere contenido inútil o irrelevante.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Esta opción eliminará todos los archivos existentes en la colección y los reemplazará con los nuevos archivos subidos.", "This response was generated by \"{{model}}\"": "Esta respuesta fue generada por \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Esto eliminará", "This will delete {{NAME}} and all its contents.": "Esto eliminará {{NAME}} y todo su contenido.", "This will delete all models including custom models": "Esto eliminará todos los modelos, incluidos los modelos personalizados", diff --git a/src/lib/i18n/locales/et-EE/translation.json b/src/lib/i18n/locales/et-EE/translation.json index a0ce487ea6..1513f577e5 100644 --- a/src/lib/i18n/locales/et-EE/translation.json +++ b/src/lib/i18n/locales/et-EE/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Konto aktiveerimine ootel", "Accurate information": "Täpne informatsioon", "Action": "Toiming", - "Action not found": "Toimingut ei leitud", "Action Required for Chat Log Storage": "Vestluse logi salvestamiseks on vaja toimingut", "Actions": "Toimingud", "Activate": "Aktiveeri", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "Esita teavitusheli alati", "Amazing": "Suurepärane", "an assistant": "assistent", - "An error occurred while fetching the explanation": "Selgituse toomisel tekkis viga", "Analytics": "Analüütika", "Analyzed": "Analüüsitud", "Analyzing...": "Analüüsimine...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "Keela piltide väljavõte", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Keela piltide eraldamine PDF-ist. Kui 'Kasuta LLM-i' on lubatud, lisatakse piltidele automaatselt pealdised. Vaikimisi välja lülitatud.", "Disabled": "Keelatud", + "Disconnect OAuth": "", "Discover a function": "Avasta funktsioon", "Discover a model": "Avasta mudel", "Discover a prompt": "Avasta sisend", @@ -768,6 +767,8 @@ "Enter New Password": "Sisestage uus parool", "Enter Number of Steps (e.g. 50)": "Sisestage sammude arv (nt 50)", "Enter Ollama Cloud API Key": "Sisestage Ollama Cloud API võti", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Sisestage Perplexity API võti", "Enter Perplexity Search API URL": "Sisestage Perplexity Search API URL", "Enter Playwright Timeout": "Sisestage Playwright aegumine", @@ -898,6 +899,7 @@ "Failed to create API Key.": "API võtme loomine ebaõnnestus.", "Failed to delete calendar": "", "Failed to delete note": "Märkme kustutamine ebaõnnestus", + "Failed to disconnect": "", "Failed to download image": "Pildi allalaadimine ebaõnnestus", "Failed to extract content from the file: {{error}}": "Failist sisu eraldamine ebaõnnestus: {{error}}", "Failed to extract content from the file.": "Failist sisu eraldamine ebaõnnestus.", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "Oktoober", "Off": "Väljas", "Okay, Let's Go!": "Hea küll, lähme!", @@ -1518,6 +1521,8 @@ "Output format": "Väljundformaat", "Output Format": "Väljundformaat", "Overview": "Ülevaade", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "leht", "Page": "Leht", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "Lehe režiim loob ühe dokumendi lehe kohta. Üksikrežiim ühendab kõik lehed üheks dokumendiks parema tükeldamise jaoks üle lehepiiride.", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "See valik määrab maksimaalse tokenite arvu, mida mudel saab oma vastuses genereerida. Selle piirmäära suurendamine võimaldab mudelil anda pikemaid vastuseid, kuid võib suurendada ka ebavajaliku või ebaolulise sisu genereerimise tõenäosust.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "See valik kustutab kõik olemasolevad failid kogust ja asendab need äsja üleslaaditud failidega.", "This response was generated by \"{{model}}\"": "Selle vastuse genereeris \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "See kustutab", "This will delete {{NAME}} and all its contents.": "See kustutab {{NAME}} ja kogu selle sisu.", "This will delete all models including custom models": "See kustutab kõik mudelid, sealhulgas kohandatud mudelid", diff --git a/src/lib/i18n/locales/eu-ES/translation.json b/src/lib/i18n/locales/eu-ES/translation.json index bbb86b2023..bd36a6aded 100644 --- a/src/lib/i18n/locales/eu-ES/translation.json +++ b/src/lib/i18n/locales/eu-ES/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Kontuaren Aktibazioa Zain", "Accurate information": "Informazio zehatza", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Txataren erregistroa gordetzeko ekintza behar da", "Actions": "Ekintzak", "Activate": "", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "", "Amazing": "Harrigarria", "an assistant": "laguntzaile bat", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Desgaituta", + "Disconnect OAuth": "", "Discover a function": "Aurkitu funtzio bat", "Discover a model": "Aurkitu eredu bat", "Discover a prompt": "Aurkitu prompt bat", @@ -768,6 +767,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "Sartu Urrats Kopurua (adib. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "Huts egin du API Gakoa sortzean.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "Urria", "Off": "Itzalita", "Okay, Let's Go!": "Ados, Goazen!", @@ -1518,6 +1521,8 @@ "Output format": "Irteera formatua", "Output Format": "", "Overview": "Ikuspegi orokorra", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "orria", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Aukera honek bilduman dauden fitxategi guztiak ezabatuko ditu eta berriki kargatutako fitxategiekin ordezkatuko ditu.", "This response was generated by \"{{model}}\"": "Erantzun hau \"{{model}}\" modeloak sortu du", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Honek ezabatuko du", "This will delete {{NAME}} and all its contents.": "Honek {{NAME}} eta bere eduki guztiak ezabatuko ditu.", "This will delete all models including custom models": "Honek modelo guztiak ezabatuko ditu, modelo pertsonalizatuak barne", diff --git a/src/lib/i18n/locales/fa-IR/translation.json b/src/lib/i18n/locales/fa-IR/translation.json index 39de7bb016..4b4c53f9cf 100644 --- a/src/lib/i18n/locales/fa-IR/translation.json +++ b/src/lib/i18n/locales/fa-IR/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "فعال\u200cسازی حساب در حال انتظار", "Accurate information": "اطلاعات دقیق", "Action": "عملیات", - "Action not found": "عملیات یافت نشد", "Action Required for Chat Log Storage": "برای ذخیره گزارش گفت\u200cوگو اقدام لازم است", "Actions": "کنش\u200cها", "Activate": "فعال کردن", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "همیشه صدای اعلان پخش شود", "Amazing": "شگفت\u200cانگیز", "an assistant": "یک دستیار", - "An error occurred while fetching the explanation": "هنگام واکشی توضیح خطایی رخ داد", "Analytics": "تحلیل و بررسی", "Analyzed": "تحلیل شده", "Analyzing...": "در حال تحلیل...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "غیرفعال کردن استخراج تصویر", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "غیرفعال کردن استخراج تصویر از PDF. اگر «استفاده از LLM» فعال باشد، تصاویر به\u200cطور خودکار زیرنویس خواهند شد. پیش\u200cفرض: False.", "Disabled": "غیرفعال", + "Disconnect OAuth": "", "Discover a function": "کشف یک تابع", "Discover a model": "کشف یک مدل", "Discover a prompt": "یک اعلان را کشف کنید", @@ -768,6 +767,8 @@ "Enter New Password": "رمز عبور جدید را وارد کنید", "Enter Number of Steps (e.g. 50)": "تعداد گام\u200cها را وارد کنید (مثال: 50)", "Enter Ollama Cloud API Key": "کلید API ابری اُلاما را وارد کنید", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "کلید API پرپلکسیتی را وارد کنید", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "مهلت پلی\u200cرایت را وارد کنید", @@ -898,6 +899,7 @@ "Failed to create API Key.": "ایجاد کلید API با خطا مواجه شد.", "Failed to delete calendar": "", "Failed to delete note": "حذف یادداشت ناموفق بود", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "استخراج محتوا از فایل ناموفق بود: {{error}}", "Failed to extract content from the file.": "استخراج محتوا از فایل ناموفق بود.", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "", "OAuth ID": "شناسه OAuth", + "OAuth session disconnected": "", "October": "اکتبر", "Off": "خاموش", "Okay, Let's Go!": "باشه، بزن بریم!", @@ -1518,6 +1521,8 @@ "Output format": "قالب خروجی", "Output Format": "قالب خروجی", "Overview": "نمای کلی", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "صفحه", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "این گزینه حداکثر تعداد توکن\u200cهایی را که مدل می\u200cتواند در پاسخ خود تولید کند تنظیم می\u200cکند. افزایش این محدودیت به مدل اجازه می\u200cدهد پاسخ\u200cهای طولانی\u200cتری ارائه دهد، اما ممکن است احتمال تولید محتوای بی\u200cفایده یا نامربوط را نیز افزایش دهد.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "این گزینه تمام فایل\u200cهای موجود در مجموعه را حذف کرده و با فایل\u200cهای جدید آپلود شده جایگزین می\u200cکند.", "This response was generated by \"{{model}}\"": "این پاسخ توسط \"{{model}}\" تولید شده است", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "این حذف خواهد شد", "This will delete {{NAME}} and all its contents.": "این {{NAME}} و تمام محتویات آن را حذف خواهد کرد.", "This will delete all models including custom models": "این همه مدل\u200cها از جمله مدل\u200cهای سفارشی را حذف خواهد کرد", diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index c21491242b..fcd2c7cefe 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Tilin aktivointi odottaa", "Accurate information": "Tarkkaa tietoa", "Action": "Toiminto", - "Action not found": "Toimintoa ei löytynyt", "Action Required for Chat Log Storage": "Toiminto vaaditaan keskustelulokin tallentamiseksi", "Actions": "Toiminnot", "Activate": "Aktivoi", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "Toista aina ilmoitusääni", "Amazing": "Hämmästyttävä", "an assistant": "avustaja", - "An error occurred while fetching the explanation": "Tapahtui virhe hakiessa selitystä", "Analytics": "Analytiikka", "Analyzed": "Analysoitu", "Analyzing...": "Analysoidaan..", @@ -579,6 +577,7 @@ "Disable Image Extraction": "Poista kuvien poiminta käytöstä", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Poista kuvien poiminta käytöstä PDF tiedostoista. Jos LLM on käytössä, kuvat tekstitetään automaattisesti. Oletuksena ei käytössä.", "Disabled": "Ei käytössä", + "Disconnect OAuth": "", "Discover a function": "Löydä toiminto", "Discover a model": "Tutustu malliin", "Discover a prompt": "Löydä kehote", @@ -768,6 +767,8 @@ "Enter New Password": "Kirjoita uusi salasana", "Enter Number of Steps (e.g. 50)": "Kirjoita askelten määrä (esim. 50)", "Enter Ollama Cloud API Key": "Kirjoita Ollama Cloud API avain", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Aseta Perplexity API-avain", "Enter Perplexity Search API URL": "Aseta Perplexity Search API verkko-osoite", "Enter Playwright Timeout": "Aseta Playwright aikakatkaisu", @@ -898,6 +899,7 @@ "Failed to create API Key.": "API-avaimen luonti epäonnistui.", "Failed to delete calendar": "Kalenterin poistaminen epäonnistui", "Failed to delete note": "Muistiinpanon poistaminen epäonnistui", + "Failed to disconnect": "", "Failed to download image": "Kuvan lataaminen epäonnistui", "Failed to extract content from the file: {{error}}": "Tiedoston sisällön pomiminen epäonnistui: {{error}}", "Failed to extract content from the file.": "Tiedoston sisällön pomiminen epäonnistui.", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "OAuth 2.1 (Staattinen)", "OAuth ID": "OAuth-tunnus", + "OAuth session disconnected": "", "October": "lokakuu", "Off": "Pois päältä", "Okay, Let's Go!": "Okei, mennään!", @@ -1518,6 +1521,8 @@ "Output format": "Tulosteen muoto", "Output Format": "Tulosteen muoto", "Overview": "Yleiskatsaus", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "sivu", "Page": "Sivu", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "Sivutila luo yhden dokumentin sivua kohden. Yksittäistila yhdistää kaikki sivut yhdeksi dokumentiksi, mikä parantaa paloittelua sivurajojen yli.", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Tämä vaihtoehto asettaa mallin vastauksessaan luomien tokenien enimmäismäärän. Tämän rajan nostaminen antaa mallille mahdollisuuden tarjota pidempiä vastauksia, mutta se voi myös lisätä hyödyttömän tai epäolennaisen sisällön luomisen todennäköisyyttä.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Tämä vaihtoehto poistaa kaikki kokoelman nykyiset tiedostot ja korvaa ne uusilla ladatuilla tiedostoilla.", "This response was generated by \"{{model}}\"": "Tämän vastauksen tuotti \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Tämä poistaa", "This will delete {{NAME}} and all its contents.": "Tämä poistaa {{NAME}} ja kaikki sen sisällöt.", "This will delete all models including custom models": "Tämä poistaa kaikki mallit mukaan lukien mukautetut mallit", diff --git a/src/lib/i18n/locales/fr-CA/translation.json b/src/lib/i18n/locales/fr-CA/translation.json index d59ea0abf3..20bb251a40 100644 --- a/src/lib/i18n/locales/fr-CA/translation.json +++ b/src/lib/i18n/locales/fr-CA/translation.json @@ -59,7 +59,6 @@ "Account Activation Pending": "Activation du compte en attente", "Accurate information": "Information exacte", "Action": "Action", - "Action not found": "", "Action Required for Chat Log Storage": "Action requise pour l’enregistrement du journal de discussion", "Actions": "Actions", "Activate": "Activer", @@ -160,7 +159,6 @@ "Always Play Notification Sound": "Toujours jouer la notification sonore", "Amazing": "Incroyable", "an assistant": "un assistant", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "Analysé", "Analyzing...": "Analyse en cours", @@ -580,6 +578,7 @@ "Disable Image Extraction": "Empecher l'extraction d'image", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Désactive l'extraction d'images du PDF. Si l'option Utiliser le LLM est activée, les images seront automatiquement légendées. La valeur par défaut est False.", "Disabled": "Désactivé", + "Disconnect OAuth": "", "Discover a function": "Trouvez une fonction", "Discover a model": "Trouvez un modèle", "Discover a prompt": "Trouvez un prompt", @@ -769,6 +768,8 @@ "Enter New Password": "Entrez votre nouveau mots de passe", "Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (par ex. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Entrez la clé pour l'API de Perplixity", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "Entrez le délai d'expiration Playwright", @@ -899,6 +900,7 @@ "Failed to create API Key.": "Échec de la création de la clé API.", "Failed to delete calendar": "", "Failed to delete note": "Échec de la délétion de la note", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1453,6 +1455,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "ID OAuth", + "OAuth session disconnected": "", "October": "Octobre", "Off": "Désactivé", "Okay, Let's Go!": "D'accord, allons-y !", @@ -1519,6 +1522,8 @@ "Output format": "Format de sortie", "Output Format": "Format de sortie", "Overview": "Aperçu", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "page", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2023,6 +2028,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Cette option définit le nombre maximal de Token que le modèle peut générer dans sa réponse. Une valeur plus élevée permet des réponses plus longues, mais peut aussi générer du contenu moins pertinent.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Cette option supprimera tous les fichiers existants dans la collection et les remplacera par les fichiers nouvellement téléchargés.", "This response was generated by \"{{model}}\"": "Cette réponse a été générée par \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Cela supprimera", "This will delete {{NAME}} and all its contents.": "Cela supprimera {{NAME}} et tout son contenu.", "This will delete all models including custom models": "Cela supprimera tous les modèles, y compris les modèles personnalisés", diff --git a/src/lib/i18n/locales/fr-FR/translation.json b/src/lib/i18n/locales/fr-FR/translation.json index 4572e362c8..2f3671c827 100644 --- a/src/lib/i18n/locales/fr-FR/translation.json +++ b/src/lib/i18n/locales/fr-FR/translation.json @@ -59,7 +59,6 @@ "Account Activation Pending": "Activation du compte en attente", "Accurate information": "Information exacte", "Action": "Action", - "Action not found": "Action non trouvée", "Action Required for Chat Log Storage": "Action requise pour l’enregistrement du journal de discussion", "Actions": "Actions", "Activate": "Activer", @@ -160,7 +159,6 @@ "Always Play Notification Sound": "Toujours jouer la notification sonore", "Amazing": "Incroyable", "an assistant": "un assistant", - "An error occurred while fetching the explanation": "Une erreur s'est produite lors de la récupération de l'explication", "Analytics": "Analytique", "Analyzed": "Analysé", "Analyzing...": "Analyse en cours", @@ -580,6 +578,7 @@ "Disable Image Extraction": "Empecher l'extraction d'image", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Désactive l'extraction d'images du PDF. Si l'option Utiliser le LLM est activée, les images seront automatiquement légendées. La valeur par défaut est False.", "Disabled": "Désactivé", + "Disconnect OAuth": "", "Discover a function": "Trouvez une fonction", "Discover a model": "Trouvez un modèle", "Discover a prompt": "Trouvez un prompt", @@ -769,6 +768,8 @@ "Enter New Password": "Entrez votre nouveau mots de passe", "Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (par ex. 50)", "Enter Ollama Cloud API Key": "Entrez la clé API Ollama Cloud", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Entrez la clé API Perplexity", "Enter Perplexity Search API URL": "Entrez l'URL de l'API Perplexity", "Enter Playwright Timeout": "Entrez le délai d'expiration Playwright", @@ -899,6 +900,7 @@ "Failed to create API Key.": "Échec de la création de la clé API.", "Failed to delete calendar": "", "Failed to delete note": "Échec de la délétion de la note", + "Failed to disconnect": "", "Failed to download image": "Échec du téléchargement de l'image", "Failed to extract content from the file: {{error}}": "Échec de l'extraction du contenu du fichier : {{error}}", "Failed to extract content from the file.": "Échec de l'extraction du contenu du fichier", @@ -1453,6 +1455,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "", "OAuth ID": "ID OAuth", + "OAuth session disconnected": "", "October": "Octobre", "Off": "Désactivé", "Okay, Let's Go!": "D'accord, allons-y !", @@ -1519,6 +1522,8 @@ "Output format": "Format de sortie", "Output Format": "Format de sortie", "Overview": "Aperçu", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "page", "Page": "Page", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "Le mode Page crée un document par page. Le mode Unique combine toutes les pages en un seul document pour une meilleure segmentation à travers les limites de page.", @@ -2023,6 +2028,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Cette option définit le nombre maximal de tokens que le modèle peut générer dans sa réponse. Une valeur plus élevée permet des réponses plus longues, mais peut aussi générer du contenu moins pertinent.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Cette option supprimera tous les fichiers existants dans la collection et les remplacera par les fichiers nouvellement téléchargés.", "This response was generated by \"{{model}}\"": "Cette réponse a été générée par \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Cela supprimera", "This will delete {{NAME}} and all its contents.": "Cela supprimera {{NAME}} et tout son contenu.", "This will delete all models including custom models": "Cela supprimera tous les modèles, y compris les modèles personnalisés", diff --git a/src/lib/i18n/locales/gl-ES/translation.json b/src/lib/i18n/locales/gl-ES/translation.json index df434bfa1a..f7624ffe65 100644 --- a/src/lib/i18n/locales/gl-ES/translation.json +++ b/src/lib/i18n/locales/gl-ES/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Activación da conta pendente", "Accurate information": "Información precisa", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Requírese unha acción para gardar o rexistro do chat", "Actions": "Accións", "Activate": "", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "", "Amazing": "Sorprendente", "an assistant": "un asistente", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "Analizado", "Analyzing...": "Analizando..", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Desactivado", + "Disconnect OAuth": "", "Discover a function": "Descubre unha función", "Discover a model": "Descubrir un modelo", "Discover a prompt": "Descubre un Prompt", @@ -768,6 +767,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "Ingrese o número de pasos (p.ej., 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Ingrese a chave API de Perplexity", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "Non pudo xerarse a chave API.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "Octubre", "Off": "Desactivado", "Okay, Let's Go!": "Bien, ¡Vamos!", @@ -1518,6 +1521,8 @@ "Output format": "Formato de saida", "Output Format": "", "Overview": "Vista xeral", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "Páxina", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Esta opción eliminará todos os arquivos existentes na colección y os reemplazará con novos arquivos subidos.", "This response was generated by \"{{model}}\"": "Esta resposta fue generada por \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Esto eliminará", "This will delete {{NAME}} and all its contents.": "Esto eliminará {{NAME}} y todo su contido.", "This will delete all models including custom models": "Esto eliminará todos os modelos, incluidos os modelos personalizados", diff --git a/src/lib/i18n/locales/he-IL/translation.json b/src/lib/i18n/locales/he-IL/translation.json index f36e6d332e..ef8c4e647b 100644 --- a/src/lib/i18n/locales/he-IL/translation.json +++ b/src/lib/i18n/locales/he-IL/translation.json @@ -59,7 +59,6 @@ "Account Activation Pending": "", "Accurate information": "מידע מדויק", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "נדרשת פעולה לשמירת יומן הצ'אט", "Actions": "פעולה", "Activate": "", @@ -160,7 +159,6 @@ "Always Play Notification Sound": "", "Amazing": "מדהים", "an assistant": "עוזר", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -580,6 +578,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "מושבת", + "Disconnect OAuth": "", "Discover a function": "", "Discover a model": "גלה מודל", "Discover a prompt": "גלה פקודה", @@ -769,6 +768,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "הזן מספר שלבים (למשל 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -899,6 +900,7 @@ "Failed to create API Key.": "יצירת מפתח API נכשלה.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1453,6 +1455,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "", + "OAuth session disconnected": "", "October": "אוקטובר", "Off": "כבוי", "Okay, Let's Go!": "בסדר, בואו נתחיל!", @@ -1519,6 +1522,8 @@ "Output format": "", "Output Format": "", "Overview": "", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "עמוד", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2023,6 +2028,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "", "This will delete {{NAME}} and all its contents.": "", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/hi-IN/translation.json b/src/lib/i18n/locales/hi-IN/translation.json index eeeff64210..6e3b0fbe1c 100644 --- a/src/lib/i18n/locales/hi-IN/translation.json +++ b/src/lib/i18n/locales/hi-IN/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "", "Accurate information": "सटीक जानकारी", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "चैट लॉग सहेजने के लिए कार्रवाई आवश्यक है", "Actions": "", "Activate": "", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "", "Amazing": "", "an assistant": "एक सहायक", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "अक्षम", + "Disconnect OAuth": "", "Discover a function": "", "Discover a model": "एक मॉडल की खोज करें", "Discover a prompt": "प्रॉम्प्ट खोजें", @@ -768,6 +767,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "चरणों की संख्या दर्ज करें (उदा. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "एपीआई कुंजी बनाने में विफल.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "", + "OAuth session disconnected": "", "October": "अक्टूबर", "Off": "बंद", "Okay, Let's Go!": "ठीक है, चलिए चलते हैं!", @@ -1518,6 +1521,8 @@ "Output format": "", "Output Format": "", "Overview": "", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "", "This will delete {{NAME}} and all its contents.": "", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/hr-HR/translation.json b/src/lib/i18n/locales/hr-HR/translation.json index c0525013e9..e27f8eecfd 100644 --- a/src/lib/i18n/locales/hr-HR/translation.json +++ b/src/lib/i18n/locales/hr-HR/translation.json @@ -59,7 +59,6 @@ "Account Activation Pending": "", "Accurate information": "Točne informacije", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Potrebna je radnja za pohranu zapisnika chata", "Actions": "", "Activate": "", @@ -160,7 +159,6 @@ "Always Play Notification Sound": "", "Amazing": "", "an assistant": "asistent", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -580,6 +578,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Onemogućeno", + "Disconnect OAuth": "", "Discover a function": "", "Discover a model": "Otkrijte model", "Discover a prompt": "Otkrijte prompt", @@ -769,6 +768,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "Unesite broj koraka (npr. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -899,6 +900,7 @@ "Failed to create API Key.": "Neuspješno stvaranje API ključa.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1453,6 +1455,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "", + "OAuth session disconnected": "", "October": "Listopad", "Off": "Isključeno", "Okay, Let's Go!": "U redu, idemo!", @@ -1519,6 +1522,8 @@ "Output format": "", "Output Format": "", "Overview": "", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2023,6 +2028,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "", "This will delete {{NAME}} and all its contents.": "", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/hu-HU/translation.json b/src/lib/i18n/locales/hu-HU/translation.json index 22f4ea62cf..f3d91fcf9a 100644 --- a/src/lib/i18n/locales/hu-HU/translation.json +++ b/src/lib/i18n/locales/hu-HU/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Fiók aktiválása folyamatban", "Accurate information": "Pontos információ", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Művelet szükséges a csevegési napló mentéséhez", "Actions": "Műveletek", "Activate": "Aktiválás", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "", "Amazing": "Csodálatos", "an assistant": "egy asszisztens", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "Elemezve", "Analyzing...": "Elemzés...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Letiltva", + "Disconnect OAuth": "", "Discover a function": "Funkció felfedezése", "Discover a model": "Modell felfedezése", "Discover a prompt": "Prompt felfedezése", @@ -768,6 +767,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "Add meg a lépések számát (pl. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Add meg a Perplexity API kulcsot", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "Nem sikerült létrehozni az API kulcsot.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth azonosító", + "OAuth session disconnected": "", "October": "Október", "Off": "Ki", "Okay, Let's Go!": "Rendben, kezdjük!", @@ -1518,6 +1521,8 @@ "Output format": "Kimeneti formátum", "Output Format": "", "Overview": "Áttekintés", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "oldal", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Ez az opció beállítja a modell által generálható tokenek maximális számát a válaszban. Ezen limit növelése hosszabb válaszokat tesz lehetővé, de növelheti a nem hasznos vagy irreleváns tartalom generálásának valószínűségét.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Ez az opció törli az összes meglévő fájlt a gyűjteményben és lecseréli őket az újonnan feltöltött fájlokkal.", "This response was generated by \"{{model}}\"": "Ezt a választ a \"{{model}}\" generálta", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Ez törölni fogja", "This will delete {{NAME}} and all its contents.": "Ez törölni fogja a {{NAME}}-t és minden tartalmát.", "This will delete all models including custom models": "Ez törölni fogja az összes modellt, beleértve az egyéni modelleket is", diff --git a/src/lib/i18n/locales/id-ID/translation.json b/src/lib/i18n/locales/id-ID/translation.json index c537fb24bb..2f02c5f8ac 100644 --- a/src/lib/i18n/locales/id-ID/translation.json +++ b/src/lib/i18n/locales/id-ID/translation.json @@ -57,7 +57,6 @@ "Account Activation Pending": "Aktivasi Akun Tertunda", "Accurate information": "Informasi yang akurat", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Diperlukan tindakan untuk menyimpan log obrolan", "Actions": "", "Activate": "", @@ -158,7 +157,6 @@ "Always Play Notification Sound": "", "Amazing": "", "an assistant": "asisten", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -578,6 +576,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Dinonaktifkan", + "Disconnect OAuth": "", "Discover a function": "Menemukan sebuah fungsi", "Discover a model": "Menemukan sebuah model", "Discover a prompt": "Temukan petunjuk", @@ -767,6 +766,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "Masukkan Jumlah Langkah (mis. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -897,6 +898,7 @@ "Failed to create API Key.": "Gagal membuat API Key.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1451,6 +1453,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "ID OAuth", + "OAuth session disconnected": "", "October": "Oktober", "Off": "Mati", "Okay, Let's Go!": "Oke, Ayo Kita Pergi!", @@ -1517,6 +1520,8 @@ "Output format": "", "Output Format": "", "Overview": "", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2017,6 +2022,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Ini akan menghapus", "This will delete {{NAME}} and all its contents.": "", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/ie-GA/translation.json b/src/lib/i18n/locales/ie-GA/translation.json index e5550ac069..e4d57d5b70 100644 --- a/src/lib/i18n/locales/ie-GA/translation.json +++ b/src/lib/i18n/locales/ie-GA/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Gníomhachtaithe Cuntas", "Accurate information": "Faisnéis chruinn", "Action": "Gníomh", - "Action not found": "Níor aimsíodh gníomh", "Action Required for Chat Log Storage": "Gníomh riachtanach chun logáil comhrá a shábháil", "Actions": "Gníomhartha", "Activate": "Gníomhachtaigh", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "Seinn Fuaim Fógra i gCónaí", "Amazing": "Iontach", "an assistant": "cúntóir", - "An error occurred while fetching the explanation": "Tharla earráid agus an míniú á fháil", "Analytics": "Anailísíocht", "Analyzed": "Anailísithe", "Analyzing...": "Ag déanamh anailíse...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "Díchumasaigh Eastóscadh Íomhá", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Díchumasaigh eastóscadh íomhánna ón PDF. Má tá Úsáid LLM cumasaithe, cuirfear fotheidil leis na híomhánna go huathoibríoch. Is é Bréag an réamhshocrú.", "Disabled": "Díchumasaithe", + "Disconnect OAuth": "", "Discover a function": "Faigh amach feidhm", "Discover a model": "Faigh amach samhail", "Discover a prompt": "Faigh amach treoir", @@ -768,6 +767,8 @@ "Enter New Password": "Cuir isteach Pasfhocal Nua", "Enter Number of Steps (e.g. 50)": "Iontráil Líon na gCéimeanna (m.sh. 50)", "Enter Ollama Cloud API Key": "Cuir isteach Eochair API Ollama Cloud", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Cuir isteach Eochair API Perplexity", "Enter Perplexity Search API URL": "Cuir isteach URL API Cuardaigh na Measctha", "Enter Playwright Timeout": "Iontráil Teorainn Ama na nDrámadóir", @@ -898,6 +899,7 @@ "Failed to create API Key.": "Theip ar an eochair API a chruthú.", "Failed to delete calendar": "", "Failed to delete note": "Theip ar an nóta a scriosadh", + "Failed to disconnect": "", "Failed to download image": "Theip ar an íomhá a íoslódáil", "Failed to extract content from the file: {{error}}": "Theip ar an ábhar a bhaint as an gcomhad: {{error}}", "Failed to extract content from the file.": "Theip ar an ábhar a bhaint as an gcomhad.", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "OAuth 2.1 (Statach)", "OAuth ID": "Aitheantas OAuth", + "OAuth session disconnected": "", "October": "Deireadh Fómhair", "Off": "As", "Okay, Let's Go!": "Ceart go leor, Déanaimis Téigh!", @@ -1518,6 +1521,8 @@ "Output format": "Formáid aschuir", "Output Format": "Formáid Aschuir", "Overview": "Forbhreathnú", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "leathanach", "Page": "Leathanach", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "Cruthaíonn mód leathanaigh doiciméad amháin in aghaidh an leathanaigh. Comhcheanglaíonn mód aonair na leathanaigh go léir in aon doiciméad amháin le haghaidh roinnt níos fearr trasna teorainneacha leathanaigh.", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Socraíonn an rogha seo an t-uaslíon comharthaí is féidir leis an tsamhail a ghiniúint ina fhreagra. Tríd an teorainn seo a mhéadú is féidir leis an tsamhail freagraí níos faide a sholáthar, ach d'fhéadfadh go méadódh sé an dóchúlacht go nginfear ábhar neamhchabhrach nó nach mbaineann le hábhar.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Scriosfaidh an rogha seo gach comhad atá sa bhailiúchán agus cuirfear comhaid nua-uaslódála ina n-ionad.", "This response was generated by \"{{model}}\"": "Gin an freagra seo ag \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Scriosfaidh sé seo", "This will delete {{NAME}} and all its contents.": "Scriosfaidh sé seo {{NAME}} agus a bhfuil ann go léir.", "This will delete all models including custom models": "Scriosfaidh sé seo gach samhail lena n-áirítear samhlacha saincheaptha", diff --git a/src/lib/i18n/locales/it-IT/translation.json b/src/lib/i18n/locales/it-IT/translation.json index c94b0f7f5a..b8a2c5f5e9 100644 --- a/src/lib/i18n/locales/it-IT/translation.json +++ b/src/lib/i18n/locales/it-IT/translation.json @@ -59,7 +59,6 @@ "Account Activation Pending": "Account in attesa di attivazione", "Accurate information": "Informazioni accurate", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Azione richiesta per salvare il registro chat", "Actions": "Azioni", "Activate": "Attiva", @@ -160,7 +159,6 @@ "Always Play Notification Sound": "Riproduci sempre il suono di notifica", "Amazing": "Fantastico", "an assistant": "un assistente", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "Analizzato", "Analyzing...": "Analisi in corso...", @@ -580,6 +578,7 @@ "Disable Image Extraction": "Disattiva l'estrazione immagini", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Disattiva l'estrazione immagini dai PDF. Se LLM è attivo le immagini saranno didascalizzate. Predefinito a Falso.", "Disabled": "Disabilitato", + "Disconnect OAuth": "", "Discover a function": "Scopri una funzione", "Discover a model": "Scopri un modello", "Discover a prompt": "Scopri un prompt", @@ -769,6 +768,8 @@ "Enter New Password": "Inserisci la Nuova Password", "Enter Number of Steps (e.g. 50)": "Inserisci Numero di Passaggi (ad esempio 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Inserisci Chiave API di Perplexity", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "Inserisci Timeout di Playwright", @@ -899,6 +900,7 @@ "Failed to create API Key.": "Impossibile creare Chiave API.", "Failed to delete calendar": "", "Failed to delete note": "Impossibile eliminare la nota", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1453,6 +1455,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "", + "OAuth session disconnected": "", "October": "Ottobre", "Off": "Disattivato", "Okay, Let's Go!": "Ok, andiamo!", @@ -1519,6 +1522,8 @@ "Output format": "Formato di output", "Output Format": "Formato output", "Overview": "Panoramica", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "pagina", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2023,6 +2028,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Questa opzione imposta il numero massimo di token che il modello può generare nella sua risposta. Aumentare questo limite consente al modello di fornire risposte più lunghe, ma potrebbe anche aumentare la probabilità che vengano generati contenuti non utili o irrilevanti.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Questa opzione eliminerà tutti i file esistenti nella collezione e li sostituirà con i file appena caricati.", "This response was generated by \"{{model}}\"": "Questa risposta è stata generata da \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Questa opzione eliminerà", "This will delete {{NAME}} and all its contents.": "Questa opzione eliminerà {{NAME}} e tutti i suoi contenuti.", "This will delete all models including custom models": "Questa opzione eliminerà tutti i modelli, compresi i modelli personalizzati", diff --git a/src/lib/i18n/locales/ja-JP/translation.json b/src/lib/i18n/locales/ja-JP/translation.json index af0c4211b5..c69a21f3a1 100644 --- a/src/lib/i18n/locales/ja-JP/translation.json +++ b/src/lib/i18n/locales/ja-JP/translation.json @@ -57,7 +57,6 @@ "Account Activation Pending": "アカウント承認待ち", "Accurate information": "情報が正確", "Action": "アクション", - "Action not found": "アクションが見つかりません", "Action Required for Chat Log Storage": "チャットログの保存には操作が必要です", "Actions": "アクション", "Activate": "アクティブ化", @@ -158,7 +157,6 @@ "Always Play Notification Sound": "常に通知音を再生", "Amazing": "素晴らしい", "an assistant": "アシスタント", - "An error occurred while fetching the explanation": "説明の取得中にエラーが発生しました", "Analytics": "分析", "Analyzed": "分析済み", "Analyzing...": "分析中...", @@ -578,6 +576,7 @@ "Disable Image Extraction": "画像の抽出を無効化", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "PDFからの画像の抽出を無効化します。LLMを使用 が有効の場合、画像は自動で説明文に変換されます。デフォルトで無効", "Disabled": "無効", + "Disconnect OAuth": "", "Discover a function": "Functionを探す", "Discover a model": "モデルを探す", "Discover a prompt": "プロンプトを探す", @@ -767,6 +766,8 @@ "Enter New Password": "新しいパスワードを入力", "Enter Number of Steps (e.g. 50)": "ステップ数を入力 (例: 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Perplexity APIキーを入力", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "Playwrightタイムアウトを入力", @@ -897,6 +898,7 @@ "Failed to create API Key.": "APIキーの作成に失敗しました。", "Failed to delete calendar": "", "Failed to delete note": "ノートの削除に失敗しました。", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "ファイルから中身の取得に失敗しました: {{error}}", "Failed to extract content from the file.": "ファイルから中身の取得に失敗しました。", @@ -1451,6 +1453,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "10月", "Off": "オフ", "Okay, Let's Go!": "OK、始めましょう!", @@ -1517,6 +1520,8 @@ "Output format": "出力形式", "Output Format": "出力形式", "Overview": "概要", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "ページ", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2017,6 +2022,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "このオプションは、モデルが生成できるトークンの最大数を設定します。この制限を増加すると、モデルはより長い回答を生成できるようになりますが、不適切な内容や関連性の低い内容が生成される可能性も高まります。", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "このオプションを有効にすると、コレクション内の既存ファイルがすべて削除され、新たにアップロードしたファイルに置き換わります。", "This response was generated by \"{{model}}\"": "このレスポンスは\"{{model}}\"によって生成されました。", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "削除します", "This will delete {{NAME}} and all its contents.": "これは{{NAME}}とそのすべての内容を削除します。", "This will delete all models including custom models": "これはカスタムモデルを含むすべてのモデルを削除します", diff --git a/src/lib/i18n/locales/ka-GE/translation.json b/src/lib/i18n/locales/ka-GE/translation.json index acdc14db3c..edfd074bc4 100644 --- a/src/lib/i18n/locales/ka-GE/translation.json +++ b/src/lib/i18n/locales/ka-GE/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "დარჩენილი ანგარიშის აქტივაცია", "Accurate information": "სწორი ინფორმაცია", "Action": "ქმედება", - "Action not found": "ქმედება აღმოჩენილი არაა", "Action Required for Chat Log Storage": "საჭიროა მოქმედება ჩატის ჟურნალის შესანახად", "Actions": "ქმედებები", "Activate": "აქტივაცია", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "გაფრთხილების ხმის ყოველთვის დაკვრა", "Amazing": "გადასარევია", "an assistant": "დამხმარე", - "An error occurred while fetching the explanation": "", "Analytics": "ანალიტიკა", "Analyzed": "გაანაზლიებულია", "Analyzing...": "ანალიზი...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "გამორთული", + "Disconnect OAuth": "", "Discover a function": "აღმოაჩინეთ ფუნქცია", "Discover a model": "აღმოაჩინეთ მოდელი", "Discover a prompt": "აღმოაჩინეთ მოთხოვნა", @@ -768,6 +767,8 @@ "Enter New Password": "შეიყვანეთ ახალი პაროლი", "Enter Number of Steps (e.g. 50)": "შეიყვანეთ ნაბიჯების რაოდენობა (მაგ. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "API-ის გასაღების შექმნა ჩავარდა.", "Failed to delete calendar": "", "Failed to delete note": "შენიშვნის წაშლა ჩავარდა", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "ოქტომბერი", "Off": "გამორთ", "Okay, Let's Go!": "აბა, წავედით!", @@ -1518,6 +1521,8 @@ "Output format": "გამოტანის ფორმატი", "Output Format": "გამოტანის ფორმატი", "Overview": "მიმოხილვა", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "პანელი", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "ეს წაშლის", "This will delete {{NAME}} and all its contents.": "", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/kab-DZ/translation.json b/src/lib/i18n/locales/kab-DZ/translation.json index 0fc3787813..ecd7eae337 100644 --- a/src/lib/i18n/locales/kab-DZ/translation.json +++ b/src/lib/i18n/locales/kab-DZ/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Armad n umiḍan deg uṛaǧu", "Accurate information": "Talɣut tusdidt", "Action": "Tigawt", - "Action not found": "Tigawt ulac-itt", "Action Required for Chat Log Storage": "Isefk tigawt i usekles n uɣmis n udiwenni", "Actions": "Tigawin", "Activate": "Sermed", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "Rmed yal tikkelt alɣu s ṣṣut", "Amazing": "Igerrez", "an assistant": "d amallal", - "An error occurred while fetching the explanation": "Teḍra-d tuccḍa lawan n tririt n usegzi", "Analytics": "Tasleḍt", "Analyzed": "Yettwasekyed", "Analyzing...": "La yettwasekyad…", @@ -579,6 +577,7 @@ "Disable Image Extraction": "Sens afsay n tugniwin", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Kkes-d asufeɣ n tugna seg PDF. Ma yella aseqdec n LLM yermed, tugniwin ad ttwakelsent s wudem awurman. Imezwura ɣer False.", "Disabled": "Yensa", + "Disconnect OAuth": "", "Discover a function": "Af-d tasɣent", "Discover a model": "Snirem tamudemt", "Discover a prompt": "Snirem aneftaɣ", @@ -768,6 +767,8 @@ "Enter New Password": "Sekcem-d awal n uɛeddi amaynut", "Enter Number of Steps (e.g. 50)": "Sekcem uṭṭun n yisurifen (amedya 50)", "Enter Ollama Cloud API Key": "Sekcem-d tasarut API n Ollama Cloud", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Sekcem-d tasarut API n Perplexity", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "Ur yessaweḍ ara ad d-yesnulfu tasarut API.", "Failed to delete calendar": "", "Failed to delete note": "Ur yessaweḍ ara ad yekkes tazmilt", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "Ur yessaweḍ ara ad d-yekkes agbur seg ufaylu: {{error}}", "Failed to extract content from the file.": "Ur yessaweḍ ara ad d-yekkes agbur seg ufaylu-nni.", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "", "OAuth ID": "Asulay OAuth", + "OAuth session disconnected": "", "October": "Tubeṛ", "Off": "Yensa", "Okay, Let's Go!": "Yerbaḥ, aha yya!", @@ -1518,6 +1521,8 @@ "Output format": "Amasal n tuffɣa", "Output Format": "Amasal n tuffɣa", "Overview": "Tamuɣli s umata", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "asebter", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "Tiririt-a teslal-itt-id \"{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Aya ad yekkes", "This will delete {{NAME}} and all its contents.": "Aya ad yekkes {NAME}} akked akk ayen yellan deg-s.", "This will delete all models including custom models": "Aya ad yekkes akk timudmin yellan gar-asent timudmin n tannumi", diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index 748d8de646..83ff4863f7 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -32,8 +32,13 @@ "{{user}}'s Chats": "{{user}}의 채팅", "{{webUIName}} Backend Required": "{{webUIName}} 백엔드가 필요합니다.", "*Prompt node ID(s) are required for image generation": "이미지 생성에는 프롬프트 노드 ID가 필요합니다.", + "1 hour before": "", "1 Source": "소스 1", + "10 minutes before": "", + "15 minutes before": "", "1m_time_ago": "1분 전", + "30 minutes before": "", + "5 minutes before": "", "A collaboration channel where people join as members": "사람들이 멤버로 참여하는 협업 채널", "A discussion channel where access is controlled by groups and permissions": "그룹과 권한으로 접근이 제어되는 토론 채널", "A new version (v{{LATEST_VERSION}}) is now available.": "새로운 버전 (v{{LATEST_VERSION}})을 사용할 수 있습니다.", @@ -52,7 +57,6 @@ "Account Activation Pending": "계정 활성화 대기", "Accurate information": "정확한 정보", "Action": "작업", - "Action not found": "작업을 찾을 수 없습니다.", "Action Required for Chat Log Storage": "채팅 로그 저장을 위해 조치가 필요합니다", "Actions": "작업", "Activate": "활성화", @@ -72,9 +76,11 @@ "Add content here": "여기에 내용을 추가하세요", "Add Custom Parameter": "사용자 정의 매개변수 추가", "Add Custom Prompt": "사용자 정의 프롬프트 추가", + "Add description": "", "Add Details": "디테일 추가", "Add Files": "파일 추가", "Add Image": "이미지 추가", + "Add location": "", "Add Member": "멤버 추가", "Add Members": "멤버 추가", "Add Memory": "메모리 추가", @@ -110,6 +116,7 @@ "AI": "AI", "All": "전체", "All chats have been unarchived.": "모든 채팅이 보관 해제되었습니다.", + "All day": "", "All models are now hidden": "모든 모델이 이제 숨김 처리되었습니다", "All models are now visible": "모든 모델이 이제 표시됩니다", "All models deleted successfully": "성공적으로 모든 모델이 삭제되었습니다", @@ -150,7 +157,6 @@ "Always Play Notification Sound": "항상 알림 소리 재생", "Amazing": "놀라움", "an assistant": "어시스턴트", - "An error occurred while fetching the explanation": "설명을 가져오는 동안 오류가 발생했습니다.", "Analytics": "분석", "Analyzed": "분석됨", "Analyzing...": "분석 중...", @@ -182,6 +188,7 @@ "Are you sure you want to archive all chats? This action cannot be undone.": "정말 모든 채팅을 보관하시겠습니까? 이 작업은 되돌릴 수 없습니다.", "Are you sure you want to clear all memories? This action cannot be undone.": "정말 모든 메모리를 지우시겠습니까? 이 작업은 되돌릴 수 없습니다.", "Are you sure you want to delete \"{{NAME}}\"?": "정말 \"{{NAME}}\"을 삭제하시겠습니까?", + "Are you sure you want to delete **{{modelName}}**?": "", "Are you sure you want to delete all chats? This action cannot be undone.": "정말 모든 채팅을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", "Are you sure you want to delete this channel?": "정말 이 채널을 삭제하시겠습니까?", "Are you sure you want to delete this connection? This action cannot be undone.": "정말 이 연결을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", @@ -197,6 +204,7 @@ "Ask a question": "질문하기", "Assistant": "어시스턴트", "Async Embedding Processing": "비동기 임베딩 처리", + "At time of event": "", "Attach File From Knowledge": "지식 기반에서 파일 첨부", "Attach Files": "첨부 파일", "Attach Knowledge": "지식 기반 첨부", @@ -271,6 +279,8 @@ "Bypass Web Loader": "웹 콘텐츠 불러오기 생략", "Cache Base Model List": "기본 모델 목록 캐시", "Calendar": "캘린더", + "Calendar deleted": "", + "Calendars": "", "Call": "음성 기능", "Call feature is not supported when using Web STT engine": "웹 STT 엔진 사용 시, 음성 기능은 지원되지 않습니다.", "Camera": "카메라", @@ -407,6 +417,7 @@ "Connect to your own OpenAPI compatible external tool servers.": "OpenAPI 호환 외부 도구 서버에 연결합니다.", "Connected ({{type}})": "{{type}}에 연결됨", "Connection failed": "연결 실패", + "Connection lost. Reconnecting...": "", "Connection successful": "연결 성공", "Connection Type": "연결 방식", "Connections": "연결", @@ -519,8 +530,11 @@ "Delete All Chats": "모든 채팅 삭제", "Delete all contents inside this folder": "이 폴더 내 모든 콘텐츠 삭제", "Delete automation?": "자동 삭제하시겠습니까?", + "Delete calendar": "", + "Delete Calendar": "", "Delete Chat": "채팅 삭제", "Delete chat?": "채팅을 삭제하시겠습니까?", + "Delete Event": "", "Delete File": "파일 삭제", "Delete folder?": "폴더를 삭제하시겠습니까?", "Delete function?": "함수를 삭제하시겠습니까?", @@ -562,6 +576,7 @@ "Disable Image Extraction": "이미지 추출 비활성화", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "PDF에서 이미지 추출을 비활성화합니다. Use LLM이 활성화된 경우 이미지는 자동으로 캡션이 달립니다. 기본값은 False입니다.", "Disabled": "제한됨", + "Disconnect OAuth": "", "Discover a function": "함수 검색", "Discover a model": "모델 검색", "Discover a prompt": "프롬프트 검색", @@ -751,6 +766,8 @@ "Enter New Password": "새로운 비밀번호 입력", "Enter Number of Steps (e.g. 50)": "단계 수 입력(예: 50)", "Enter Ollama Cloud API Key": "Ollama 클라우드 API 키 입력", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Perplexity API 키 입력", "Enter Perplexity Search API URL": "Perplexity 검색 API URL 입력", "Enter Playwright Timeout": "Playwright 시간 초과 입력", @@ -827,6 +844,10 @@ "Error: A model with the ID '{{modelId}}' already exists. Please select a different ID to proceed.": "오류: ID가 '{{modelId}}'인 모델이 이미 존재합니다. 계속하려면 다른 ID를 선택하세요.", "Error: Model ID cannot be empty. Please enter a valid ID to proceed.": "오류: 모델 ID는 비워둘 수 없습니다. 계속하려면 유효한 ID를 입력하세요.", "Evaluations": "평가", + "Event created": "", + "Event deleted": "", + "Event title": "", + "Event updated": "", "Exa API Key": "Exa API 키", "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "예: (&(objectClass=inetOrgPerson)(uid=%s))", "Example: ALL": "예: 전체", @@ -875,7 +896,9 @@ "Failed to connect to {{URL}} terminal server": "{{URL}} 터미널 서버 연결에 실패했습니다", "Failed to copy link": "링크 복사 실패", "Failed to create API Key.": "API 키 생성에 실패했습니다.", + "Failed to delete calendar": "", "Failed to delete note": "노트 삭제 실패", + "Failed to disconnect": "", "Failed to download image": "이미지 다운로드에 실패했습니다", "Failed to extract content from the file: {{error}}": "파일 내용 추출 실패: {{error}}", "Failed to extract content from the file.": "파일 내용 추출 실패.", @@ -1196,6 +1219,7 @@ "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "동시 검색 쿼리 수를 제한합니다. 0은 무제한(기본값)입니다. 순차 실행하려면 1로 설정하세요(Brave 무료 요금제처럼 엄격한 속도 제한이 있는 API에 권장됩니다).", "Limits the number of concurrent embedding requests. Set to 0 for unlimited.": "동시 임베딩 요청 수를 제한합니다. 무제한은 0으로 설정하세요.", "List": "목록", + "List calendars, search, create, update, and delete calendar events": "", "Listening...": "듣는 중...", "Live": "실시간", "Llama.cpp": "Llama.cpp", @@ -1206,6 +1230,7 @@ "local": "로컬", "Local": "로컬", "Local Task Model": "로컬 작업 모델", + "Location": "", "Location access not allowed": "위치 접근이 허용되지 않습니다", "Lost": "패배", "Low": "낮음", @@ -1315,6 +1340,7 @@ "Models Sharing": "모델 공유", "Mojeek": "Mojeek", "Mojeek Search API Key": "Mojeek Search API 키", + "Month": "", "Monthly": "월간", "More": "더보기", "More Concise": "더 간결하게", @@ -1333,6 +1359,7 @@ "New Automation": "새로운 자동", "New Button": "새 버튼", "New Chat": "새 채팅", + "New Event": "", "New File": "새 파일", "New Folder": "새 폴더", "New Function": "새 함수", @@ -1426,6 +1453,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "OAuth 2.1 (Static)", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "10월", "Off": "끄기", "Okay, Let's Go!": "좋아요, 시작합시다!", @@ -1492,6 +1520,8 @@ "Output format": "출력 형식", "Output Format": "출력 형식", "Overview": "개요", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "페이지", "Page": "페이지", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "페이지 모드는 페이지마다 하나의 문서를 생성합니다. 단일 모드는 모든 페이지를 하나의 문서로 결합하여 페이지 경계를 넘어 더 나은 청킹을 제공합니다.", @@ -1610,6 +1640,7 @@ "Reasoning Effort": "추론 난이도", "Reasoning Tags": "추론 태그", "Recently Used": "최근 사용", + "Reconnected": "", "Record": "녹음", "Record voice": "음성 녹음", "Redirecting you to Open WebUI Community": "OpenWebUI 커뮤니티로 리디렉션 중", @@ -1633,6 +1664,7 @@ "Relevance": "관련도", "Relevance Threshold": "관련성 임계값", "Remember Dismissal": "다시 보지 않기", + "Reminder": "", "Remove": "삭제", "Remove {{MODELID}} from list.": "{{MODELID}}를 목록에서 제거.", "Remove action": "작업 제거", @@ -1878,7 +1910,10 @@ "Start a new conversation": "새 대화 시작", "Start of the channel": "채널 시작", "Start Tag": "시작 태그", + "Starting in {{count}} minutes_other": "", + "Starting in 1 minute": "", "Starting kernel...": "커널 시작 중...", + "Starting now": "", "State": "상태", "Status": "상태", "Status cleared successfully": "상태 초기화에 성공했습니다", @@ -1987,10 +2022,12 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "이 옵션은 모델이 응답에서 생성할 수 있는 최대 토큰 수를 설정합니다. 이 한도를 늘리면 모델이 더 긴 답변을 제공할 수 있지만, 도움이 되지 않거나 관련 없는 콘텐츠가 생성될 가능성도 높아질 수 있습니다.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "이 옵션을 선택하면 기존 컬렉션의 모든 파일이 삭제되고, 새로 업로드된 파일로 대체됩니다.", "This response was generated by \"{{model}}\"": "\"{{model}}\"이 생성한 응답입니다", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "삭제합니다.", "This will delete {{NAME}} and all its contents.": "{{NAME}}모든 내용을 삭제합니다.", "This will delete all models including custom models": "이렇게 하면 사용자 지정 모델을 포함한 모든 모델이 삭제됩니다", "This will delete all models including custom models and cannot be undone.": "이렇게 하면 사용자 지정 모델을 포함한 모든 모델이 삭제되며 실행 취소할 수 없습니다.", + "This will permanently delete the calendar \"{{name}}\" and all its events. This action cannot be undone.": "", "This will reset the knowledge base and sync all files. Do you wish to continue?": "지식 기반과 모든 파일 연동을 초기화합니다. 계속 하시겠습니까?", "Thorough explanation": "완전한 설명", "Thought": "생각", @@ -2010,6 +2047,7 @@ "Title cannot be an empty string.": "제목은 빈 문자열일 수 없습니다.", "Title Generation": "제목 생성", "Title Generation Prompt": "제목 생성 프롬프트", + "Title is required": "", "TLS": "TLS", "To access the available model names for downloading,": "다운로드 가능한 모델명을 확인하려면,", "To access the GGUF models available for downloading,": "다운로드 가능한 GGUF 모델을 확인하려면,", @@ -2076,6 +2114,7 @@ "Unloads {{FROM_NOW}}": "{{FROM_NOW}} 언로드", "Unlock mysteries": "미스터리 풀기", "Unpin": "고정 해제", + "Unpin from Sidebar": "", "Unravel secrets": "비밀 풀기", "Unshare Chat": "채팅 공유 해제", "Unsupported file type.": "지원하지 않는 파일 형식", @@ -2180,6 +2219,7 @@ "WebUI will make requests to \"{{url}}\"": "WebUI가 \"{{url}}\"로 요청을 보냅니다", "WebUI will make requests to \"{{url}}/api/chat\"": "WebUI가 \"{{url}}/api/chat\"로 요청을 보냅니다", "WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI가 \"{{url}}/chat/completions\"로 요청을 보냅니다", + "Week": "", "Weekly": "주간", "What are you trying to achieve?": "무엇을 성취하고 싶으신가요?", "What are you working on?": "어떤 작업을 하고 계신가요?", @@ -2187,6 +2227,7 @@ "What is shared:": "공유되는 것:", "What's New in": "새로운 기능:", "What's on your mind?": "무슨 생각을 하고 계신가요?", + "When": "", "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "활성화하면 모델이 각 채팅 메시지에 실시간으로 응답하여 사용자가 메시지를 보내는 즉시 응답을 생성합니다. 이 모드는 실시간 채팅 애플리케이션에 유용하지만, 느린 하드웨어에서는 성능에 영향을 미칠 수 있습니다.", "wherever you are": "당신이 어디에 있든", "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "출력을 페이지로 나눌지 여부입니다. 각 페이지는 구분선과 페이지 번호로 구분됩니다. 기본값은 False입니다.", diff --git a/src/lib/i18n/locales/lt-LT/translation.json b/src/lib/i18n/locales/lt-LT/translation.json index 784832cde7..ccc65e16a5 100644 --- a/src/lib/i18n/locales/lt-LT/translation.json +++ b/src/lib/i18n/locales/lt-LT/translation.json @@ -60,7 +60,6 @@ "Account Activation Pending": "Laukiama paskyros patvirtinimo", "Accurate information": "Tiksli informacija", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Reikia veiksmo, kad būtų išsaugotas pokalbių žurnalas", "Actions": "Veiksmai", "Activate": "", @@ -161,7 +160,6 @@ "Always Play Notification Sound": "", "Amazing": "", "an assistant": "assistentas", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -581,6 +579,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Išjungta", + "Disconnect OAuth": "", "Discover a function": "Atrasti funkciją", "Discover a model": "Atrasti modelį", "Discover a prompt": "Atrasti užklausas", @@ -770,6 +769,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "Įveskite žingsnių kiekį (pvz. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -900,6 +901,7 @@ "Failed to create API Key.": "Nepavyko sukurti API rakto", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1454,6 +1456,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "spalis", "Off": "Išjungta", "Okay, Let's Go!": "Gerai, važiuojam!", @@ -1520,6 +1523,8 @@ "Output format": "", "Output Format": "", "Overview": "", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2026,6 +2031,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Tai ištrins", "This will delete {{NAME}} and all its contents.": "", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/lv-LV/translation.json b/src/lib/i18n/locales/lv-LV/translation.json index 09ae34c6a3..af6f5c21be 100644 --- a/src/lib/i18n/locales/lv-LV/translation.json +++ b/src/lib/i18n/locales/lv-LV/translation.json @@ -59,7 +59,6 @@ "Account Activation Pending": "Gaida konta aktivizēšanu", "Accurate information": "Precīza informācija", "Action": "Darbība", - "Action not found": "Darbība nav atrasta", "Action Required for Chat Log Storage": "Nepieciešama darbība tērzēšanas žurnāla glabāšanai", "Actions": "Darbības", "Activate": "Aktivizēt", @@ -160,7 +159,6 @@ "Always Play Notification Sound": "Vienmēr atskaņot paziņojuma skaņu", "Amazing": "Lieliski", "an assistant": "asistents", - "An error occurred while fetching the explanation": "Iegūstot skaidrojumu, radās kļūda", "Analytics": "Analītika", "Analyzed": "Analizēts", "Analyzing...": "Analizē...", @@ -580,6 +578,7 @@ "Disable Image Extraction": "Atspējot attēlu ekstrakciju", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Atspējot attēlu ekstrakciju no PDF. Ja ir iespējots Lietot LLM, attēliem automātiski tiks pievienoti paraksti. Noklusējums ir False.", "Disabled": "Atspējots", + "Disconnect OAuth": "", "Discover a function": "Atklāt funkciju", "Discover a model": "Atklāt modeli", "Discover a prompt": "Atklāt uzvedni", @@ -769,6 +768,8 @@ "Enter New Password": "Ievadiet jaunu paroli", "Enter Number of Steps (e.g. 50)": "Ievadiet soļu skaitu (piem., 50)", "Enter Ollama Cloud API Key": "Ievadiet Ollama Cloud API atslēgu", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Ievadiet Perplexity API atslēgu", "Enter Perplexity Search API URL": "Ievadiet Perplexity Search API URL", "Enter Playwright Timeout": "Ievadiet Playwright taimautu", @@ -899,6 +900,7 @@ "Failed to create API Key.": "Neizdevās izveidot API atslēgu.", "Failed to delete calendar": "", "Failed to delete note": "Neizdevās dzēst piezīmi", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "Neizdevās ekstrahēt saturu no faila: {{error}}", "Failed to extract content from the file.": "Neizdevās ekstrahēt saturu no faila.", @@ -1453,6 +1455,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "Oktobris", "Off": "Izslēgts", "Okay, Let's Go!": "Labi, ejam!", @@ -1519,6 +1522,8 @@ "Output format": "Izvades formāts", "Output Format": "Izvades formāts", "Overview": "Pārskats", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "lapa", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2023,6 +2028,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Šī opcija iestata maksimālo tokenu skaitu, ko modelis var ģenerēt savā atbildē. Šī ierobežojuma palielināšana ļauj modelim sniegt garākas atbildes, bet var arī palielināt nevēlama vai neatbilstoša satura ģenerēšanas iespējamību.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Šī opcija dzēsīs visus esošos failus kolekcijā un aizstās tos ar jaunaugšupielādētiem failiem.", "This response was generated by \"{{model}}\"": "Šo atbildi ģenerēja \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Tas dzēsīs", "This will delete {{NAME}} and all its contents.": "Tas dzēsīs {{NAME}} un visu tā saturu.", "This will delete all models including custom models": "Tas dzēsīs visus modeļus, ieskaitot pielāgotos modeļus", diff --git a/src/lib/i18n/locales/ms-MY/translation.json b/src/lib/i18n/locales/ms-MY/translation.json index 8dd75ac052..309ace4761 100644 --- a/src/lib/i18n/locales/ms-MY/translation.json +++ b/src/lib/i18n/locales/ms-MY/translation.json @@ -57,7 +57,6 @@ "Account Activation Pending": "Pengaktifan Akaun belum selesai", "Accurate information": "Informasi tepat", "Action": "Tindakan", - "Action not found": "Tindakan tidak ditemui", "Action Required for Chat Log Storage": "Tindakan diperlukan untuk menyimpan log sembang", "Actions": "Tindakan", "Activate": "Aktifkan", @@ -158,7 +157,6 @@ "Always Play Notification Sound": "Sentiasa Mainkan Bunyi Pemberitahuan", "Amazing": "Hebat", "an assistant": "seorang pembantu", - "An error occurred while fetching the explanation": "Ralat berlaku semasa mengambil penjelasan", "Analytics": "Analitik", "Analyzed": "Sudah dianalisis", "Analyzing...": "Menganalisis...", @@ -578,6 +576,7 @@ "Disable Image Extraction": "Nyahlumpuhkan Pengekstrakan Imej", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Melumpuhkan pengekstrakan imej daripada PDF. Jika Gunakan LLM didayakan, imej akan diselia secara automatik. Lalai kepada Palsu.", "Disabled": "Dilumpuhkan", + "Disconnect OAuth": "", "Discover a function": "Temui fungsi", "Discover a model": "Temui model", "Discover a prompt": "Temui arahan", @@ -767,6 +766,8 @@ "Enter New Password": "Masukkan Kata Laluan Baharu", "Enter Number of Steps (e.g. 50)": "Masukkan Bilangan Langkah (cth 50)", "Enter Ollama Cloud API Key": "Masukkan Kunci API Ollama Cloud", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Masukkan Kunci API Perplexity", "Enter Perplexity Search API URL": "Masukkan URL API Pencarian Perplexity", "Enter Playwright Timeout": "Masukkan Masa Tamat Playwright", @@ -897,6 +898,7 @@ "Failed to create API Key.": "Gagal mencipta kekunci API", "Failed to delete calendar": "", "Failed to delete note": "Gagal memadamkan nota", + "Failed to disconnect": "", "Failed to download image": "Gagal memuat turun imej", "Failed to extract content from the file: {{error}}": "Gagal mengekstrak kandungan daripada fail: {{error}}", "Failed to extract content from the file.": "Gagal mengekstrak kandungan daripada fail.", @@ -1451,6 +1453,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "", "OAuth ID": "ID OAuth", + "OAuth session disconnected": "", "October": "Oktober", "Off": "Mati", "Okay, Let's Go!": "Baiklah, Jom!", @@ -1517,6 +1520,8 @@ "Output format": "Format output", "Output Format": "Format Output", "Overview": "Gambaran Keseluruhan", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "halaman", "Page": "Halaman", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "Mode Halaman membuat satu dokumen per halaman. Mode Tunggal menggabungkan semua halaman ke dalam satu dokumen untuk chunking yang lebih baik merentas sempadan halaman.", @@ -2017,6 +2022,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Pilihan ini menetapkan bilangan maksimum token yang boleh dijana oleh model dalam responsnya. Meningkatkan had ini membenarkan model memberikan jawapan yang lebih panjang, tetapi ia juga mungkin meningkatkan kemungkinan kandungan yang tidak berguna atau tidak relevan dijana.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Pilihan ini akan memadamkan semua fail sedia ada dalam koleksi dan menggantinya dengan fail yang baru dimuat naik.", "This response was generated by \"{{model}}\"": "Respons ini dijana oleh \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Ini akan memadam", "This will delete {{NAME}} and all its contents.": "Ini akan memadam {{NAME}} dan semua kandungannya.", "This will delete all models including custom models": "Ini akan memadam semua model termasuk model tersuai", diff --git a/src/lib/i18n/locales/nb-NO/translation.json b/src/lib/i18n/locales/nb-NO/translation.json index 7f45c82157..a27ca6fa7e 100644 --- a/src/lib/i18n/locales/nb-NO/translation.json +++ b/src/lib/i18n/locales/nb-NO/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Venter på kontoaktivering", "Accurate information": "Nøyaktig informasjon", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Handling kreves for å lagre chatlogg", "Actions": "Handlinger", "Activate": "Aktiver", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "", "Amazing": "Flott", "an assistant": "en assistent", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "Analysert", "Analyzing...": "Analyserer...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Deaktivert", + "Disconnect OAuth": "", "Discover a function": "Oppdag en funksjon", "Discover a model": "Oppdag en modell", "Discover a prompt": "Oppdag en ledetekst", @@ -768,6 +767,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "Angi antall steg (f.eks. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "Kan ikke opprette en API-nøkkel.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth-ID", + "OAuth session disconnected": "", "October": "oktober", "Off": "Av", "Okay, Let's Go!": "OK, kjør på!", @@ -1518,6 +1521,8 @@ "Output format": "Format på utdata", "Output Format": "", "Overview": "Oversikt", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "side", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Dette alternativet sletter alle eksisterende filer i samlingen og erstatter dem med nyopplastede filer.", "This response was generated by \"{{model}}\"": "Dette svaret er generert av \"{{modell}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Dette sletter", "This will delete {{NAME}} and all its contents.": "Dette sletter {{NAME}} og alt innholdet.", "This will delete all models including custom models": "Dette sletter alle modeller, inkludert tilpassede modeller", diff --git a/src/lib/i18n/locales/nl-NL/translation.json b/src/lib/i18n/locales/nl-NL/translation.json index dbaf9bcb13..8bf77d68eb 100644 --- a/src/lib/i18n/locales/nl-NL/translation.json +++ b/src/lib/i18n/locales/nl-NL/translation.json @@ -33,15 +33,15 @@ "{{user}}'s Chats": "Chats van {{user}}", "{{webUIName}} Backend Required": "{{webUIName}} Backend verplicht", "*Prompt node ID(s) are required for image generation": "*Prompt node ID(s) zijn vereist voor het genereren van afbeeldingen", - "1 Source": "1 bron", - "1m_time_ago": "1m geleden", - "A collaboration channel where people join as members": "Een samenwerkingskanaal waar mensen als leden kunnen deelnemen", - "A discussion channel where access is controlled by groups and permissions": "Een discussiekanaal waar toegang wordt beheerd via groepen en machtigingen", "1 hour before": "1 uur voor", + "1 Source": "1 bron", "10 minutes before": "10 minuten voor", "15 minutes before": "15 minuten voor", + "1m_time_ago": "1m geleden", "30 minutes before": "30 minuten voor", "5 minutes before": "5 minuten voor", + "A collaboration channel where people join as members": "Een samenwerkingskanaal waar mensen als leden kunnen deelnemen", + "A discussion channel where access is controlled by groups and permissions": "Een discussiekanaal waar toegang wordt beheerd via groepen en machtigingen", "A new version (v{{LATEST_VERSION}}) is now available.": "Een nieuwe versie (v{{LATEST_VERSION}}) is nu beschikbaar", "A private conversation between you and selected users": "Een privégesprek tussen jou en geselecteerde gebruikers", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Een taakmodel wordt gebruikt bij het uitvoeren van taken zoals het genereren van titels voor chats en zoekopdrachten op het internet", @@ -58,7 +58,6 @@ "Account Activation Pending": "Accountactivatie in afwachting", "Accurate information": "Nauwkeurige informatie", "Action": "Actie", - "Action not found": "Actie niet gevonden", "Action Required for Chat Log Storage": "Actie vereist voor het opslaan van het chatlog", "Actions": "Acties", "Activate": "Activeren", @@ -78,13 +77,13 @@ "Add content here": "Voeg hier content toe", "Add Custom Parameter": "Aangepaste parameter toevoegen", "Add Custom Prompt": "Aangepaste prompt toevoegen", + "Add description": "Voeg beschrijving toe", "Add Details": "Details toevoegen", "Add Files": "Voeg bestanden toe", "Add Image": "Afbeelding toevoegen", + "Add location": "Voeg locatie toe", "Add Member": "Lid toevoegen", "Add Members": "Leden toevoegen", - "Add description": "Voeg beschrijving toe", - "Add location": "Voeg locatie toe", "Add Memory": "Voeg geheugen toe", "Add Model": "Voeg model toe", "Add Reaction": "Voeg reactie toe", @@ -118,9 +117,9 @@ "AI": "AI", "All": "Alle", "All chats have been unarchived.": "Alle chats zijn gedearchiveerd.", + "All day": "De hele dag", "All models are now hidden": "Alle modellen zijn nu verborgen", "All models are now visible": "Alle modellen zijn nu zichtbaar", - "All day": "De hele dag", "All models deleted successfully": "Alle modellen zijn succesvol verwijderd", "All time": "Altijd", "All Users": "Alle gebruikers", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "Meldingsgeluid altijd afspelen", "Amazing": "Geweldig", "an assistant": "een assistent", - "An error occurred while fetching the explanation": "Er is een fout opgetreden bij het ophalen van de uitleg", "Analytics": "Analyse", "Analyzed": "Geanalyseerd", "Analyzing...": "Aan het analyseren...", @@ -191,8 +189,8 @@ "Are you sure you want to archive all chats? This action cannot be undone.": "Weet je zeker dat je alle chats wilt archiveren? Deze actie kan niet ongedaan worden gemaakt.", "Are you sure you want to clear all memories? This action cannot be undone.": "Weet je zeker dat je alle herinneringen wil verwijderen? Deze actie kan niet ongedaan worden gemaakt.", "Are you sure you want to delete \"{{NAME}}\"?": "Weet je zeker dat je \"{{NAME}}\" wilt verwijderen?", - "Are you sure you want to delete all chats? This action cannot be undone.": "Weet je zeker dat je alle chats wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", "Are you sure you want to delete **{{modelName}}**?": "Weet je zeker dat je **{{modelName}}** wilt verwijderen?", + "Are you sure you want to delete all chats? This action cannot be undone.": "Weet je zeker dat je alle chats wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", "Are you sure you want to delete this channel?": "Weet je zeker dat je dit kanaal wil verwijderen?", "Are you sure you want to delete this connection? This action cannot be undone.": "Weet je zeker dat je deze verbinding wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", "Are you sure you want to delete this memory? This action cannot be undone.": "Weet je zeker dat je dit geheugen wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", @@ -207,13 +205,13 @@ "Ask a question": "Stel een vraag", "Assistant": "Assistent", "Async Embedding Processing": "Asynchrone embeddingverwerking", + "At time of event": "Op het moment van de gebeurtenis", "Attach File From Knowledge": "Bestand uit kennis toevoegen", + "Attach Files": "Bestanden toevoegen", "Attach Knowledge": "Kennis toevoegen", "Attach Notes": "Notities toevoegen", "Attach Webpage": "Webpagina toevoegen", "Attention to detail": "Aandacht voor detail", - "Attach Files": "Bestanden toevoegen", - "At time of event": "Op het moment van de gebeurtenis", "Attribute for Mail": "Attribuut voor mail", "Attribute for Username": "Attribuut voor gebruikersnaam", "Audio": "Audio", @@ -269,6 +267,7 @@ "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Versterken of bestraffen van specifieke tokens voor beperkte reacties. Biaswaarden worden geklemd tussen -100 en 100 (inclusief). (Standaard: none)", "Brave": "Brave", "Brave Search API Key": "Brave Search API-sleutel", + "Break down complex requests into trackable steps": "Splits complexe verzoeken op in traceerbare stappen", "Browse and query knowledge bases": "Kennisbanken doorzoeken en bevragen", "Builtin Tools": "Ingebouwde tools", "Bullet List": "Lijst met opsommingstekens", @@ -280,7 +279,6 @@ "Bypass Embedding and Retrieval": "Embedding en ophalen omzeilen", "Bypass Web Loader": "Webloader omzeilen", "Cache Base Model List": "Basismodellijst cachen", - "Break down complex requests into trackable steps": "Splits complexe verzoeken op in traceerbare stappen", "Calendar": "Agenda", "Calendar deleted": "Agenda verwijderd", "Calendars": "Agenda's", @@ -452,9 +450,9 @@ "Copy Last Response": "Laatste antwoord kopiëren", "Copy link": "Kopieer link", "Copy Link": "Kopieer link", + "Copy Path": "Pad kopiëren", "Copy Prompt": "Prompt kopiëren", "Copy Share Link": "Deellink kopiëren", - "Copy Path": "Pad kopiëren", "Copy to clipboard": "Kopieer naar klembord", "Copy Token": "Token kopiëren", "Copy URL": "URL kopiëren", @@ -478,8 +476,8 @@ "Create new secret key": "Maak nieuwe geheime sleutel", "Create note": "Notitie maken", "Create Note": "Maak notitie", - "Create your first note by clicking on the plus button below.": "Maak je eerste notitie door op de plusknop hieronder te klikken.", "Create scheduled prompts that run automatically on a recurring basis.": "Maak geplande prompts die automatisch op terugkerende basis worden uitgevoerd.", + "Create your first note by clicking on the plus button below.": "Maak je eerste notitie door op de plusknop hieronder te klikken.", "Created at": "Gemaakt op", "Created At": "Gemaakt op", "Created by": "Gemaakt door", @@ -494,19 +492,19 @@ "Custom Gender": "Aangepast geslacht", "Custom Parameter Name": "Naam van aangepaste parameter", "Custom Parameter Value": "Waarde van aangepaste parameter", - "Daily Messages": "Dagelijkse berichten", "Daily": "Dagelijks", + "Daily Messages": "Dagelijkse berichten", "Danger Zone": "Gevarenzone", "Dark": "Donker", "Data Controls": "Gegevensbeheer", "Database": "Database", "Datalab Marker API": "Datalab Marker-API", + "Day": "Dag", "DD/MM/YYYY": "DD/MM/JJJJ", "DDGS Backend": "DDGS-backend", "December": "december", "Decrease UI Scale": "UI-schaal verkleinen", "Deepgram": "Deepgram", - "Day": "Dag", "Default": "Standaard", "Default (Open AI)": "Standaard (Open AI)", "Default (SentenceTransformers)": "Standaard (SentenceTransformers)", @@ -532,13 +530,13 @@ "Delete All": "Alles verwijderen", "Delete All Chats": "Verwijder alle chats", "Delete all contents inside this folder": "Alle inhoud in deze map verwijderen", + "Delete automation?": "Verwijder automatisering?", "Delete calendar": "Verwijder kalender", "Delete Calendar": "Verwijder kalender", "Delete Chat": "Verwijder chat", "Delete chat?": "Verwijder chat?", - "Delete File": "Bestand verwijderen", - "Delete automation?": "Verwijder automatisering?", "Delete Event": "Verwijder gebeurtenis?", + "Delete File": "Bestand verwijderen", "Delete folder?": "Verwijder map?", "Delete function?": "Verwijder functie?", "Delete Memory?": "Geheugen verwijderen?", @@ -579,6 +577,7 @@ "Disable Image Extraction": "Afbeeldingsextractie uitschakelen", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Schakel afbeeldingsextractie uit de PDF uit. Als Use LLM is ingeschakeld, krijgen afbeeldingen automatisch beschrijvingen. Standaard is False.", "Disabled": "Uitgeschakeld", + "Disconnect OAuth": "", "Discover a function": "Ontdek een functie", "Discover a model": "Ontdek een model", "Discover a prompt": "Ontdek een prompt", @@ -680,10 +679,10 @@ "Embedding Concurrent Requests": "Gelijktijdige embeddingverzoeken", "Embedding Model": "Embedding Model", "Embedding Model Engine": "Embedding Model Engine", + "Emojis": "Emojis", "Empty message": "Leeg bericht", "Enable All": "Alles inschakelen", "Enable API Keys": "API-sleutels inschakelen", - "Emojis": "Emojis", "Enable autocomplete generation for chat messages": "Automatische aanvullingsgeneratie voor chatberichten inschakelen", "Enable Code Execution": "Code-uitvoer inschakelen", "Enable Code Interpreter": "Code-interpretatie inschakelen", @@ -768,6 +767,8 @@ "Enter New Password": "Voer nieuw wachtwoord in", "Enter Number of Steps (e.g. 50)": "Voeg aantal stappen toe (Bijv. 50)", "Enter Ollama Cloud API Key": "Voer Ollama Cloud API-sleutel in", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Voer Perplexity API-sleutel in", "Enter Perplexity Search API URL": "Voer Perplexity Search API-URL in", "Enter Playwright Timeout": "Voer Playwright-time-out in", @@ -837,9 +838,9 @@ "Error accessing directory": "Fout bij toegang tot map", "Error accessing Google Drive: {{error}}": "Fout bij het benaderen van Google Drive: {{error}}", "Error accessing media devices.": "Fout bij toegang tot media-apparaten.", + "Error deleting model: {{error}}": "Fout bij het verwijderen van model: {{error}}", "Error starting recording.": "Fout bij het starten van de opname.", "Error unloading model: {{error}}": "Fout bij het ontladen van model: {{error}}", - "Error deleting model: {{error}}": "Fout bij het verwijderen van model: {{error}}", "Error uploading file: {{error}}": "Fout bij het uploaden van bestand: {{error}}", "Error: A model with the ID '{{modelId}}' already exists. Please select a different ID to proceed.": "Fout: Een model met de ID '{{modelId}}' bestaat al. Selecteer een andere ID om door te gaan.", "Error: Model ID cannot be empty. Please enter a valid ID to proceed.": "Fout: Model-ID mag niet leeg zijn. Voer een geldige ID in om door te gaan.", @@ -896,11 +897,12 @@ "Failed to connect to {{URL}} terminal server": "Kan geen verbinding maken met {{URL}} terminalserver", "Failed to copy link": "Link kopiëren mislukt", "Failed to create API Key.": "Kan API Key niet aanmaken.", + "Failed to delete calendar": "Kalender verwijderen mislukt", "Failed to delete note": "Notitie verwijderen mislukt", + "Failed to disconnect": "", "Failed to download image": "Afbeelding downloaden mislukt", "Failed to extract content from the file: {{error}}": "Inhoud uit bestand extraheren mislukt: {{error}}", "Failed to extract content from the file.": "Inhoud uit bestand extraheren mislukt.", - "Failed to delete calendar": "Kalender verwijderen mislukt", "Failed to fetch models": "Kan modellen niet ophalen", "Failed to generate title": "Titel genereren mislukt", "Failed to import models": "Modellen importeren mislukt", @@ -981,32 +983,18 @@ "Follow Up Generation Prompt": "Prompt voor vervolggeneratie", "Follow up: {{question}}": "Vervolg: {{question}}", "Follow-Up Auto-Generation": "Automatische vervolggeneratie", + "Followed instructions perfectly": "Volgde instructies perfect", "for placeholders": "voor placeholders", "Force OCR": "OCR forceren", "Force OCR on all pages of the PDF. This can lead to worse results if you have good text in your PDFs. Defaults to False.": "Forceer OCR op alle pagina's van de PDF. Dit kan slechtere resultaten geven als je PDF's al goede tekst bevatten. Standaard is False.", + "Forge new paths": "Baan nieuwe paden", + "Form": "Formulier", "Format Lines": "Regels opmaken", "Format the lines in the output. Defaults to False. If set to True, the lines will be formatted to detect inline math and styles.": "Formatteer de regels in de uitvoer. Standaard is False. Als ingesteld op True worden regels opgemaakt om inline wiskunde en stijlen te detecteren.", "Formatting may be inconsistent from source.": "Opmaak kan afwijken van de bron.", "Forward": "Vooruit", "Forwards system user OAuth access token to authenticate": "Stuurt OAuth-toegangstoken van systeemgebruiker door voor authenticatie", "Forwards system user session credentials to authenticate": "Stuurt sessiegegevens van systeemgebruiker door voor authenticatie", - "Model accepts file inputs": "Model accepteert bestandsinvoer", - "Model can execute code and perform calculations": "Model kan code uitvoeren en berekeningen maken", - "Model can generate images based on text prompts": "Model kan afbeeldingen genereren op basis van tekstprompts", - "Model can search the web for information": "Model kan het web doorzoeken naar informatie", - "Model Capabilities": "Modelmogelijkheden", - "New File": "Nieuw bestand", - "New Function": "Nieuwe functie", - "New Group": "Nieuwe groep", - "New Knowledge": "Nieuwe kennis", - "New Model": "Nieuw model", - "New Note": "Nieuwe notitie", - "New Prompt": "Nieuwe prompt", - "Generated Image": "Gegenereerde afbeelding", - "Generated images will appear here": "Gegenereerde afbeeldingen verschijnen hier", - "Followed instructions perfectly": "Volgde instructies perfect", - "Forge new paths": "Baan nieuwe paden", - "Form": "Formulier", "Fr_day_of_week": "vr", "Full Context Mode": "Volledige contextmodus", "Function": "Functie", @@ -1035,6 +1023,8 @@ "Generate an image": "Genereer een afbeelding", "Generate and edit images": "Afbeeldingen genereren en bewerken", "Generate Message Pair": "Berichtenpaar genereren", + "Generated Image": "Gegenereerde afbeelding", + "Generated images will appear here": "Gegenereerde afbeeldingen verschijnen hier", "Generating search query": "Zoekopdracht genereren", "Generating...": "Genereren...", "Get current time and perform date/time calculations": "Haal de huidige tijd op en voer datum-/tijdberekeningen uit", @@ -1271,6 +1261,7 @@ "Maximum number of files allowed per folder.": "Maximaal aantal toegestane bestanden per map.", "Maximum number of files per folder is {{max}}.": "Maximum aantal bestanden per map is {{max}}.", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maximaal 3 modellen kunnen tegelijkertijd worden gedownload. Probeer het later opnieuw.", + "May": "Mei", "MBR": "MBR", "MCP": "MCP", "MCP support is experimental and its specification changes often, which can lead to incompatibilities. OpenAPI specification support is directly maintained by the Open WebUI team, making it the more reliable option for compatibility.": "MCP-ondersteuning is experimenteel en de specificatie verandert vaak, wat tot incompatibiliteiten kan leiden. Ondersteuning voor de OpenAPI-specificatie wordt direct onderhouden door het Open WebUI-team, waardoor dit de betrouwbaardere optie voor compatibiliteit is.", @@ -1278,7 +1269,6 @@ "Member removed successfully": "Lid succesvol verwijderd", "members": "leden", "Members": "Leden", - "May": "Mei", "Members added successfully": "Leden succesvol toegevoegd", "Memories": "Geheugen", "Memories accessible by LLMs will be shown here.": "Geheugen toegankelijk voor LLMs wordt hier getoond.", @@ -1315,8 +1305,13 @@ "Model {{name}} is now {{status}}": "Model {{name}} is nu {{status}}", "Model {{name}} is now hidden": "Model {{name}} is nu verborgen", "Model {{name}} is now visible": "Model {{name}} is nu zichtbaar", + "Model accepts file inputs": "Model accepteert bestandsinvoer", "Model accepts image inputs": "Model accepteerd afbeeldingsinvoer", "Model can access Open Terminal for command execution and file management": "Model heeft toegang tot Open Terminal voor uitvoeren van opdrachten en bestandsbeheer", + "Model can execute code and perform calculations": "Model kan code uitvoeren en berekeningen maken", + "Model can generate images based on text prompts": "Model kan afbeeldingen genereren op basis van tekstprompts", + "Model can search the web for information": "Model kan het web doorzoeken naar informatie", + "Model Capabilities": "Modelmogelijkheden", "Model created successfully!": "Model succesvol gecreëerd", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Model filesystem path gedetecteerd. Model shortname is vereist voor update, kan niet doorgaan.", "Model Filtering": "Modelfiltratie", @@ -1360,14 +1355,21 @@ "Name your knowledge base": "Geef je kennisbasis een naam", "Name, prompt, and model are required": "Naam, prompt en model zijn verplicht", "Native": "Native", + "Never": "Nooit", "New": "Nieuw", + "New Automation": "Nieuwe automatisering", "New Button": "Nieuwe knop", "New Chat": "Nieuwe Chat", - "Never": "Nooit", - "New Automation": "Nieuwe automatisering", "New Event": "Nieuwe gebeurtenis", + "New File": "Nieuw bestand", "New Folder": "Nieuwe map", + "New Function": "Nieuwe functie", + "New Group": "Nieuwe groep", + "New Knowledge": "Nieuwe kennis", + "New Model": "Nieuw model", + "New Note": "Nieuwe notitie", "New Password": "Nieuw Wachtwoord", + "New Prompt": "Nieuwe prompt", "New Skill": "Nieuwe vaardigheid", "New Temporary Chat": "Nieuwe tijdelijke chat", "New Terminal": "Nieuwe terminal", @@ -1375,24 +1377,24 @@ "New Webhook": "Nieuwe webhook", "new-channel": "nieuw-kanaal", "Next message": "Volgend bericht", + "Next run": "Volgende uitvoering", "No access grants. Private to you.": "Geen toegangsrechten. Alleen privé voor jou.", "No activity data": "Geen activiteitsgegevens", "No authentication": "Geen authenticatie", + "No automations found": "Geen automatiseringen gevonden", "No chats found": "Geen chats gevonden", "No chats found for this user.": "Geen chats gevonden voor deze gebruiker.", "No chats found.": "Geen chats gevonden.", "No content": "Geen inhoud", - "Next run": "Volgende uitvoering", - "No automations found": "Geen automatiseringen gevonden", "No content found": "Geen content gevonden", "No content to speak": "Geen inhoud om over te spreken", "No conversation to save": "Geen gesprek om op te slaan", "No data": "Geen gegevens", "No data found": "Geen gegevens gevonden", "No distance available": "Geen afstand beschikbaar", + "No execution logs available yet": "Geen uitvoerlogs beschikbaar", "No expiration can pose security risks.": "Geen vervaldatum kan veiligheidsrisico's opleveren.", "No feedback found": "Geen feedback gevonden", - "No execution logs available yet": "Geen uitvoerlogs beschikbaar", "No file selected": "Geen bestand geselecteerd", "No files found": "Geen bestanden gevonden", "No files in this knowledge base.": "Geen bestanden in deze kennisbank.", @@ -1437,9 +1439,9 @@ "Not factually correct": "Niet feitelijk juist", "Not helpful": "Niet nuttig", "Not Registered": "Niet geregistreerd", + "Not scheduled": "Niet ingepland", "Note": "Notitie", "Note deleted successfully": "Notitie succesvol verwijderd", - "Not scheduled": "Niet ingepland", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Opmerking: Als je een minimumscore instelt, levert de zoekopdracht alleen documenten op met een score groter dan of gelijk aan de minimumscore.", "Notes": "Aantekeningen", "Notes Public Sharing": "Openbaar delen van notities", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "OAuth 2.1 (Statisch)", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "oktober", "Off": "Uit", "Okay, Let's Go!": "Oké, laten we gaan!", @@ -1512,12 +1515,14 @@ "or": "of", "Ordered List": "Genummerde lijst", "Other": "Andere", - "Output": "Uitvoer", "out of": "van de", + "Output": "Uitvoer", "OUTPUT": "UITVOER", "Output format": "Uitvoerformaat", "Output Format": "Uitvoerformaat", "Overview": "Overzicht", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "pagina", "Page": "Pagina", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "Paginamodus maakt per pagina een document. De enkele modus combineert alle pagina's in één document voor betere chunking over paginagrens heen.", @@ -1635,9 +1640,9 @@ "Reason": "Reden", "Reasoning Effort": "Redeneerinspanning", "Reasoning Tags": "Redeneertags", - "Record": "Opnemen", "Recently Used": "Onlangs gebruikt", "Reconnected": "Opnieuw verbonden", + "Record": "Opnemen", "Record voice": "Neem stem op", "Redirecting you to Open WebUI Community": "Je wordt doorgestuurd naar OpenWebUI Community", "Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "Vermindert de kans op het genereren van onzin. Een hogere waarde (bijv. 100) zal meer diverse antwoorden geven, terwijl een lagere waarde (bijv. 10) conservatiever zal zijn.", @@ -1673,14 +1678,14 @@ "Renamed to {{name}}": "Hernoemd naar {{name}}", "Render Markdown in Previews": "Markdown renderen in voorvertoningen", "Reorder Models": "Herschik modellen", + "Repeats": "Herhalingen", "Reply": "Antwoorden", "Reply in Thread": "Antwoord in draad", "Reply to thread...": "Reageren op draad...", "Replying to {{NAME}}": "Reageren op {{NAME}}", "required": "vereist", - "Reranking Engine": "Herschikkingsengine", - "Repeats": "Herhalingen", "Reranking Batch Size": "Batchgrootte voor herordenen", + "Reranking Engine": "Herschikkingsengine", "Reranking Model": "Reranking Model", "Reset": "Herstellen", "Reset All Models": "Herstel alle modellen", @@ -1707,11 +1712,11 @@ "RTL": "RNL", "Run": "Uitvoeren", "Run All": "Alles uitvoeren", + "Run now": "Nu uitvoeren", + "Run Now": "Nu uitvoeren", "Running": "Aan het uitvoeren", "Running...": "Aan het uitvoeren...", "Runs embedding tasks concurrently to speed up processing. Turn off if rate limits become an issue.": "Voert embeddingtaken gelijktijdig uit om de verwerking te versnellen. Schakel uit als rate limits een probleem worden.", - "Run now": "Nu uitvoeren", - "Run Now": "Nu uitvoeren", "Sa_day_of_week": "za", "Save": "Opslaan", "Save & Create": "Opslaan & Creëren", @@ -1720,14 +1725,14 @@ "Save Chat": "Chat opslaan", "Saved": "Opgeslagen", "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Chat logs direct opslaan in de opslag van je browser wordt niet langer ondersteund. Neem even de tijd om je chat logs te downloaden en te verwijderen door op de knop hieronder te klikken. Maak je geen zorgen, je kunt je chat logs eenvoudig opnieuw importeren naar de backend via", + "Schedule": "Planning", + "Scheduled time must be in the future": "Ingeplande tijd moet in de toekomst liggen", "Scroll On Branch Change": "Scrollen bij wijziging van branch", "Search": "Zoeken", "Search a model": "Zoek een model", "Search all emojis": "Alle emoji's zoeken", "Search and manage user memories": "Gebruikersherinneringen zoeken en beheren", "Search and view user chat history": "Gebruikerschatgeschiedenis zoeken en bekijken", - "Schedule": "Planning", - "Scheduled time must be in the future": "Ingeplande tijd moet in de toekomst liggen", "Search Automations": "Zoek automatiseringen", "Search Base": "Zoeken naar basis", "Search channels and channel messages": "Kanalen en kanaalberichten zoeken", @@ -1907,16 +1912,16 @@ "Start a new conversation": "Start een nieuw gesprek", "Start of the channel": "Begin van het kanaal", "Start Tag": "Starttag", + "Starting in {{count}} minutes_one": "Begint over {{count}} minuut", + "Starting in {{count}} minutes_other": "Begint over {{count}} minuten", + "Starting in 1 minute": "Begint over 1 minuut", "Starting kernel...": "Kernel wordt gestart...", + "Starting now": "Begint nu", + "State": "Status", "Status": "Status", "Status cleared successfully": "Status succesvol gewist", "Status updated successfully": "Status succesvol bijgewerkt", "Status Updates": "Statusupdates", - "State": "Status", - "Starting in {{count}} minutes_one": "Begint over {{count}} minuut", - "Starting in {{count}} minutes_other": "Begint over {{count}} minuten", - "Starting in 1 minute": "Begint over 1 minuut", - "Starting now": "Begint nu", "STDOUT/STDERR": "STDOUT/STDERR", "Steps": "Stappen", "Stop": "Stop", @@ -1933,10 +1938,10 @@ "STT Model": "STT Model", "STT Settings": "STT Instellingen", "Stylized PDF Export": "Gestileerde PDF-export", + "Su_day_of_week": "zo", "Submit question": "Vraag indienen", "Submit suggestion": "Suggestie indienen", "Subtitle": "Ondertitel", - "Su_day_of_week": "zo", "Success": "Succes", "Successfully imported {{userCount}} users.": "{{userCount}} gebruikers succesvol geimporteerd.", "Successfully updated.": "Succesvol bijgewerkt.", @@ -1964,8 +1969,8 @@ "Talk to Model": "Praat met model", "Tap to interrupt": "Tik om te onderbreken", "Task List": "Takenlijst", - "Task Model": "Taakmodel", "Task Management": "Taakbeheer", + "Task Model": "Taakmodel", "Tasks": "Taken", "tasks completed": "taken voltooid", "Tavily API Key": "Tavily API-sleutel", @@ -2020,12 +2025,13 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Deze optie stelt het maximum aantal tokens in dat het model kan genereren in zijn antwoord. Door deze limiet te verhogen, kan het model langere antwoorden geven, maar het kan ook de kans vergroten dat er onbehulpzame of irrelevante inhoud wordt gegenereerd.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Deze optie verwijdert alle bestaande bestanden in de collectie en vervangt ze door nieuw geüploade bestanden.", "This response was generated by \"{{model}}\"": "Dit antwoord is gegenereerd door \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Dit zal verwijderen", "This will delete {{NAME}} and all its contents.": "Dit zal {{NAME}} verwijderen en al zijn inhoud.", "This will delete all models including custom models": "Dit zal alle modellen, ook aangepaste modellen, verwijderen", "This will delete all models including custom models and cannot be undone.": "Dit zal alle modellen, ook aangepaste modellen, verwijderen en kan niet ongedaan worden gemaakt", - "This will reset the knowledge base and sync all files. Do you wish to continue?": "Dit zal de kennisdatabase resetten en alle bestanden synchroniseren. Wil je doorgaan?", "This will permanently delete the calendar \"{{name}}\" and all its events. This action cannot be undone.": "Dit zal de kalender \"{{name}}\" en alle gebeurtenissen permanent verwijderen. Deze actie kan niet ongedaan worden gemaakt.", + "This will reset the knowledge base and sync all files. Do you wish to continue?": "Dit zal de kennisdatabase resetten en alle bestanden synchroniseren. Wil je doorgaan?", "Thorough explanation": "Grondige uitleg", "Thought": "Gedachte", "Thought for {{DURATION}}": "Dacht {{DURATION}} na", @@ -2036,9 +2042,9 @@ "Tika": "Tika", "Tika Server URL required.": "Tika Server-URL vereist", "Tiktoken": "Tiktoken", + "Time": "Tijd", "Time & Calculation": "Tijd en berekening", "Timeout": "Time-out", - "Time": "Tijd", "Title": "Titel", "Title Auto-Generation": "Automatische titelgeneratie", "Title cannot be an empty string.": "Titel kan niet leeg zijn.", @@ -2055,6 +2061,7 @@ "To select toolkits here, add them to the \"Tools\" workspace first.": "Om hier gereedschapssets te selecteren, voeg ze eerst aan de \"Gereedschappen\" Werkplaats toe.", "Toast notifications for new updates": "Toon notificaties voor nieuwe updates", "Today": "Vandaag", + "Today at": "Vandaag om", "Today at {{LOCALIZED_TIME}}": "Vandaag om {{LOCALIZED_TIME}}", "Toggle {{COUNT}} sources": "Schakel {{COUNT}} bronnen om", "Toggle 1 source": "Schakel 1 bron om", @@ -2063,7 +2070,6 @@ "Toggle Sidebar": "Zijbalk omzetten", "Toggle status history": "Statusgeschiedenis omzetten", "Toggle whether current connection is active.": "Schakel in of de huidige verbinding actief is.", - "Today at": "Vandaag om", "Token": "Token", "Token counts are estimates and may not reflect actual API usage": "Tokenaantallen zijn schattingen en komen mogelijk niet overeen met het werkelijke API-gebruik", "tokens": "tokens", diff --git a/src/lib/i18n/locales/pa-IN/translation.json b/src/lib/i18n/locales/pa-IN/translation.json index d29adc4b55..84c346acaf 100644 --- a/src/lib/i18n/locales/pa-IN/translation.json +++ b/src/lib/i18n/locales/pa-IN/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "", "Accurate information": "ਸਹੀ ਜਾਣਕਾਰੀ", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "ਚੈਟ ਲਾਗ ਸੰਭਾਲਣ ਲਈ ਕਾਰਵਾਈ ਲੋੜੀਂਦੀ ਹੈ", "Actions": "", "Activate": "", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "", "Amazing": "", "an assistant": "ਇੱਕ ਸਹਾਇਕ", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "ਬੰਦ", + "Disconnect OAuth": "", "Discover a function": "", "Discover a model": "ਇੱਕ ਮਾਡਲ ਲੱਭੋ", "Discover a prompt": "ਇੱਕ ਪ੍ਰੰਪਟ ਖੋਜੋ", @@ -768,6 +767,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "ਕਦਮਾਂ ਦੀ ਗਿਣਤੀ ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "API ਕੁੰਜੀ ਬਣਾਉਣ ਵਿੱਚ ਅਸਫਲ।", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "", + "OAuth session disconnected": "", "October": "ਅਕਤੂਬਰ", "Off": "ਬੰਦ", "Okay, Let's Go!": "ਠੀਕ ਹੈ, ਚੱਲੋ ਚੱਲੀਏ!", @@ -1518,6 +1521,8 @@ "Output format": "", "Output Format": "", "Overview": "", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "", "This will delete {{NAME}} and all its contents.": "", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/pl-PL/translation.json b/src/lib/i18n/locales/pl-PL/translation.json index 7143c47bc7..15a573aa23 100644 --- a/src/lib/i18n/locales/pl-PL/translation.json +++ b/src/lib/i18n/locales/pl-PL/translation.json @@ -60,7 +60,6 @@ "Account Activation Pending": "Aktywacja konta w toku", "Accurate information": "Precyzyjne informacje", "Action": "Akcja", - "Action not found": "Nie znaleziono akcji", "Action Required for Chat Log Storage": "Wymagane działanie, aby zapisać historię czatu", "Actions": "Akcje", "Activate": "Aktywuj", @@ -161,7 +160,6 @@ "Always Play Notification Sound": "Zawsze odtwarzaj dźwięk powiadomienia", "Amazing": "Niesamowite", "an assistant": "asystent", - "An error occurred while fetching the explanation": "Wystąpił błąd podczas pobierania wyjaśnienia", "Analytics": "Analityka", "Analyzed": "Przeanalizowano", "Analyzing...": "Analizowanie...", @@ -581,6 +579,7 @@ "Disable Image Extraction": "Wyłącz ekstrakcję obrazów", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Wyłącz wyciąganie obrazów z PDF. Jeśli używasz LLM, obrazy będą automatycznie opisywane. Domyślnie Wyłączone.", "Disabled": "Wyłączone", + "Disconnect OAuth": "", "Discover a function": "Odkryj funkcję", "Discover a model": "Odkryj model", "Discover a prompt": "Odkryj prompt", @@ -770,6 +769,8 @@ "Enter New Password": "Wprowadź nowe hasło", "Enter Number of Steps (e.g. 50)": "Wprowadź liczbę kroków (np. 50)", "Enter Ollama Cloud API Key": "Wprowadź klucz API Ollama Cloud", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Wprowadź klucz API Perplexity", "Enter Perplexity Search API URL": "Wprowadź URL API Perplexity Search", "Enter Playwright Timeout": "Wprowadź timeout Playwright", @@ -900,6 +901,7 @@ "Failed to create API Key.": "Nie udało się utworzyć klucza API.", "Failed to delete calendar": "", "Failed to delete note": "Nie udało się usunąć notatki", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "Nie udało się wyodrębnić treści z pliku: {{error}}", "Failed to extract content from the file.": "Nie udało się wyodrębnić treści z pliku.", @@ -1454,6 +1456,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "", "OAuth ID": "ID OAuth", + "OAuth session disconnected": "", "October": "Październik", "Off": "Wył.", "Okay, Let's Go!": "OK, Jedziemy!", @@ -1520,6 +1523,8 @@ "Output format": "Format wyjściowy", "Output Format": "Format wyjściowy", "Overview": "Przegląd", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "strona", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2026,6 +2031,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Ustawia maksymalną liczbę tokenów w odpowiedzi. Zwiększenie pozwala na dłuższe odpowiedzi.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Ta opcja usunie wszystkie pliki z kolekcji i zastąpi nowymi.", "This response was generated by \"{{model}}\"": "Odpowiedź wygenerowana przez \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "To usunie", "This will delete {{NAME}} and all its contents.": "To usunie {{NAME}} i całą zawartość.", "This will delete all models including custom models": "To usunie wszystkie modele (w tym własne).", diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index ca721304fe..730fd439e7 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -59,7 +59,6 @@ "Account Activation Pending": "Ativação da Conta Pendente", "Accurate information": "Informações precisas", "Action": "Ação", - "Action not found": "Ação não encontrada", "Action Required for Chat Log Storage": "Ação necessária para salvar o registro do chat", "Actions": "Ações", "Activate": "Ativar", @@ -160,7 +159,6 @@ "Always Play Notification Sound": "Sempre reproduzir som de notificação", "Amazing": "Incrível", "an assistant": "um assistente", - "An error occurred while fetching the explanation": "Ocorreu um erro ao buscar a explicação", "Analytics": "Análises", "Analyzed": "Analisado", "Analyzing...": "Analisando...", @@ -580,6 +578,7 @@ "Disable Image Extraction": "Desativar extração de imagem", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Desabilite a extração de imagens do PDF. Se a opção Usar LLM estiver habilitada, as imagens serão legendadas automaticamente. O padrão é Falso.", "Disabled": "Desativado", + "Disconnect OAuth": "", "Discover a function": "Descubra uma função", "Discover a model": "Descubra um modelo", "Discover a prompt": "Descubra um prompt", @@ -769,6 +768,8 @@ "Enter New Password": "Digite uma nova senha", "Enter Number of Steps (e.g. 50)": "Digite o Número de Passos (por exemplo, 50)", "Enter Ollama Cloud API Key": "Insira a chave da API do Ollama Cloud", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Insira a chave da API Perplexity", "Enter Perplexity Search API URL": "Insira a URL da API de pesquisa Perplexity", "Enter Playwright Timeout": "Insira o tempo limite do Playwright", @@ -899,6 +900,7 @@ "Failed to create API Key.": "Falha ao criar a Chave API.", "Failed to delete calendar": "Falha ao excluir calendário", "Failed to delete note": "Falha ao excluir a nota", + "Failed to disconnect": "", "Failed to download image": "Falha ao baixar a imagem", "Failed to extract content from the file: {{error}}": "Falha ao extrair conteúdo do arquivo: {{error}}", "Failed to extract content from the file.": "Falha ao extrair conteúdo do arquivo.", @@ -1453,6 +1455,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "OAuth 2.1 (Estático)", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "Outubro", "Off": "Desligado", "Okay, Let's Go!": "Ok, Vamos Lá!", @@ -1519,6 +1522,8 @@ "Output format": "Formato de saída", "Output Format": "Formato de Saída", "Overview": "Visão Geral", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "página", "Page": "Página", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "O modo de página cria um documento por página. O modo único combina todas as páginas em um único documento para melhor divisão entre páginas.", @@ -2023,6 +2028,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Esta opção define o número máximo de tokens que o modelo pode gerar em sua resposta. Aumentar esse limite permite que o modelo forneça respostas mais longas, mas também pode aumentar a probabilidade de geração de conteúdo inútil ou irrelevante.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Essa opção deletará todos os arquivos existentes na coleção e todos eles serão substituídos.", "This response was generated by \"{{model}}\"": "Esta resposta foi gerada por \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Isso vai excluir", "This will delete {{NAME}} and all its contents.": "Esta ação excluirá {{NAME}} e todos seus conteúdos.", "This will delete all models including custom models": "Isto vai excluir todos os modelos, incluindo personalizados", diff --git a/src/lib/i18n/locales/pt-PT/translation.json b/src/lib/i18n/locales/pt-PT/translation.json index 1b9c2e7e48..ac1c442590 100644 --- a/src/lib/i18n/locales/pt-PT/translation.json +++ b/src/lib/i18n/locales/pt-PT/translation.json @@ -59,7 +59,6 @@ "Account Activation Pending": "Ativação da Conta Pendente", "Accurate information": "Informações precisas", "Action": "Ação", - "Action not found": "Ação não encontrada", "Action Required for Chat Log Storage": "É necessária uma ação para guardar o registo da conversa", "Actions": "Ações", "Activate": "Ativar", @@ -160,7 +159,6 @@ "Always Play Notification Sound": "Sempre Reproduzir Som de Notificação", "Amazing": "Incrível", "an assistant": "um assistente", - "An error occurred while fetching the explanation": "Ocorreu um erro ao obter a explicação", "Analytics": "Análise", "Analyzed": "Analisado", "Analyzing...": "A analisar...", @@ -580,6 +578,7 @@ "Disable Image Extraction": "Desativar Extração de Imagens", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Desabilitar a extração de imgem do PDF. Se a utilização de LLM estiver ativa, as imagens irão ser automaticamente legendadas. Predefenido para Falso.", "Disabled": "Desativado", + "Disconnect OAuth": "", "Discover a function": "Descobrir uma função", "Discover a model": "Descubra um modelo", "Discover a prompt": "Descobrir um prompt", @@ -769,6 +768,8 @@ "Enter New Password": "Introduzir Palavra-passe", "Enter Number of Steps (e.g. 50)": "Introduzir o Número de Etapas (por exemplo, 50)", "Enter Ollama Cloud API Key": "Introduzir Chave da API do Ollama Cloud", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Introduzir Chave da API do Perplexity Search", "Enter Perplexity Search API URL": "Introduzir URL da Chave API do Perplexity Search", "Enter Playwright Timeout": "Introduzir Tempo Limite do Playwright", @@ -899,6 +900,7 @@ "Failed to create API Key.": "Falha ao criar a Chave da API.", "Failed to delete calendar": "", "Failed to delete note": "Falha ao apagar a nota", + "Failed to disconnect": "", "Failed to download image": "Falha ao transferir a imagem", "Failed to extract content from the file: {{error}}": "Falha ao extrair conteúdo do ficheiro: {{error}}", "Failed to extract content from the file.": "Falha ao extrair conteúdo do ficheiro.", @@ -1453,6 +1455,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "", "OAuth ID": "ID do OAuth", + "OAuth session disconnected": "", "October": "Outubro", "Off": "Desligado", "Okay, Let's Go!": "Ok, Vamos Lá!", @@ -1519,6 +1522,8 @@ "Output format": "Formato de Saída", "Output Format": "Formato de Saída", "Overview": "Visão Geral", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "página", "Page": "Página", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "O modo de página cria um documento por página. O modo único combina todas as páginas em um único documento para melhor segmentação entre os limites das páginas.", @@ -2023,6 +2028,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Esta opção define o número máximo de tokens que o modelo pode gerar em sua resposta. Aumentar esse limite permite que o modelo forneça respostas mais longas, mas também pode aumentar a probabilidade de conteúdo inútil ou irrelevante ser gerado.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Esta opção irá excluir todos os arquivos existentes na coleção e substituí-los por arquivos recém-carregados.", "This response was generated by \"{{model}}\"": "Esta resposta foi gerada por \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Isto irá excluir", "This will delete {{NAME}} and all its contents.": "Isto irá excluir {{NAME}} e todo o seu conteúdo.", "This will delete all models including custom models": "Isto irá excluir todos os modelos, incluindo os modelos personalizados", diff --git a/src/lib/i18n/locales/ro-RO/translation.json b/src/lib/i18n/locales/ro-RO/translation.json index 3028840716..2532909db5 100644 --- a/src/lib/i18n/locales/ro-RO/translation.json +++ b/src/lib/i18n/locales/ro-RO/translation.json @@ -59,7 +59,6 @@ "Account Activation Pending": "Activarea contului în așteptare", "Accurate information": "Informații precise", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Este necesară o acțiune pentru salvarea jurnalului de chat", "Actions": "Acțiuni", "Activate": "Activează", @@ -160,7 +159,6 @@ "Always Play Notification Sound": "", "Amazing": "Uimitor", "an assistant": "un asistent", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "Analizat", "Analyzing...": "Se analizează...", @@ -580,6 +578,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Dezactivat", + "Disconnect OAuth": "", "Discover a function": "Descoperă o funcție", "Discover a model": "Descoperă un model", "Discover a prompt": "Descoperă un prompt", @@ -769,6 +768,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "Introduceți Numărul de Pași (de ex. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -899,6 +900,7 @@ "Failed to create API Key.": "Crearea cheii API a eșuat.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1453,6 +1455,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "ID OAuth", + "OAuth session disconnected": "", "October": "Octombrie", "Off": "Dezactivat", "Okay, Let's Go!": "Ok, Să Începem!", @@ -1519,6 +1522,8 @@ "Output format": "Formatul de ieșire", "Output Format": "", "Overview": "Privire de ansamblu", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "pagina", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2023,6 +2028,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Această opțiune va șterge toate fișierelor existente din colecție și le va înlocui cu fișierele nou încărcate.", "This response was generated by \"{{model}}\"": "Acest răspuns a fost generat de \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Aceasta va șterge", "This will delete {{NAME}} and all its contents.": "Acest lucru va șterge {{NAME}} și toate conținuturile sale.", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 954d8f7f4e..cb7a5ce94a 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -60,7 +60,6 @@ "Account Activation Pending": "Ожидание активации учетной записи", "Accurate information": "Точная информация", "Action": "Действие", - "Action not found": "Действие не найдено", "Action Required for Chat Log Storage": "Требуется действие для сохранения журнала чата", "Actions": "Действия", "Activate": "Активировать", @@ -161,7 +160,6 @@ "Always Play Notification Sound": "Всегда проигрывать звук уведомления", "Amazing": "Удивительно", "an assistant": "ассистент", - "An error occurred while fetching the explanation": "Произошла ошибка при получении объяснения", "Analytics": "Аналитика", "Analyzed": "Проанализировано", "Analyzing...": "Анализирую...", @@ -581,6 +579,7 @@ "Disable Image Extraction": "Отключить извлечение изображений", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Отключить извлечение изображений из PDF. Если включена параметр Использовать LLM, изображения будут подписаны автоматически. По умолчанию установлено значение Выкл.", "Disabled": "Отключено", + "Disconnect OAuth": "", "Discover a function": "Найти функцию", "Discover a model": "Найти модель", "Discover a prompt": "Найти промпт", @@ -770,6 +769,8 @@ "Enter New Password": "Введите новый пароль", "Enter Number of Steps (e.g. 50)": "Введите количество шагов (например, 50)", "Enter Ollama Cloud API Key": "Введите API-ключ Ollama Cloud", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Введите ключ API Perplexity", "Enter Perplexity Search API URL": "Введите URL Perplexity Search API", "Enter Playwright Timeout": "Введите таймаут для Playwright", @@ -900,6 +901,7 @@ "Failed to create API Key.": "Не удалось создать ключ API.", "Failed to delete calendar": "", "Failed to delete note": "Не удалось удалить заметку", + "Failed to disconnect": "", "Failed to download image": "Не удалось загрузить изображение", "Failed to extract content from the file: {{error}}": "Не удалось извлечь содержимое из файла: {{error}}", "Failed to extract content from the file.": "Не удалось извлечь содержимое из файла.", @@ -1454,6 +1456,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "OAuth 2.1 (Static)", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "Октябрь", "Off": "Выключено", "Okay, Let's Go!": "Давайте начнём!", @@ -1520,6 +1523,8 @@ "Output format": "Формат вывода", "Output Format": "Формат Вывода", "Overview": "Обзор", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "страница", "Page": "Страница", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "Постраничный режим создаёт отдельный документ для каждой страницы. Общий режим объединяет все страницы в один документ для более качественного разбиения на фрагменты без привязки к границам страниц.", @@ -2026,6 +2031,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Этот параметр устанавливает максимальное количество токенов, которые модель может генерировать в своем ответе. Увеличение этого ограничения позволяет модели предоставлять более длинные ответы, но также может увеличить вероятность создания бесполезного или нерелевантного контента.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Эта опция удалит все существующие файлы в коллекции и заменит их вновь загруженными файлами.", "This response was generated by \"{{model}}\"": "Этот ответ был сгенерирован для \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Это приведет к удалению", "This will delete {{NAME}} and all its contents.": "При этом будет удален {{NAME}} и все его содержимое.", "This will delete all models including custom models": "Это приведет к удалению всех моделей, включая пользовательские модели.", diff --git a/src/lib/i18n/locales/sk-SK/translation.json b/src/lib/i18n/locales/sk-SK/translation.json index 0ecf193014..5d3ea9dc74 100644 --- a/src/lib/i18n/locales/sk-SK/translation.json +++ b/src/lib/i18n/locales/sk-SK/translation.json @@ -60,7 +60,6 @@ "Account Activation Pending": "Čaká sa na aktiváciu účtu", "Accurate information": "Presné informácie", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Na uloženie záznamu chatu je potrebná akcia", "Actions": "Akcie", "Activate": "", @@ -161,7 +160,6 @@ "Always Play Notification Sound": "", "Amazing": "", "an assistant": "asistent", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -581,6 +579,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Zakázané", + "Disconnect OAuth": "", "Discover a function": "Objaviť funkciu", "Discover a model": "Objaviť model", "Discover a prompt": "Objaviť prompt", @@ -770,6 +769,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "Zadajte počet krokov (napr. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -900,6 +901,7 @@ "Failed to create API Key.": "Nepodarilo sa vytvoriť API kľúč.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1454,6 +1456,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "Október", "Off": "Vypnuté", "Okay, Let's Go!": "Dobre, poďme na to!", @@ -1520,6 +1523,8 @@ "Output format": "Formát výstupu", "Output Format": "", "Overview": "Prehľad", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "stránka", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2026,6 +2031,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Táto voľba odstráni všetky existujúce súbory v kolekcii a nahradí ich novo nahranými súbormi.", "This response was generated by \"{{model}}\"": "Táto odpoveď bola vygenerovaná pomocou \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Toto odstráni", "This will delete {{NAME}} and all its contents.": "Týmto dôjde k odstráneniu {{NAME}} a všetkých jeho obsahov.", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/sr-RS/translation.json b/src/lib/i18n/locales/sr-RS/translation.json index 647eb187b5..db5e660eee 100644 --- a/src/lib/i18n/locales/sr-RS/translation.json +++ b/src/lib/i18n/locales/sr-RS/translation.json @@ -59,7 +59,6 @@ "Account Activation Pending": "Налози за активирање", "Accurate information": "Прецизне информације", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Потребна је радња за чување дневника ћаскања", "Actions": "Радње", "Activate": "", @@ -160,7 +159,6 @@ "Always Play Notification Sound": "", "Amazing": "Невероватно", "an assistant": "помоћник", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -580,6 +578,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Онемогућено", + "Disconnect OAuth": "", "Discover a function": "Откријте функцију", "Discover a model": "Откријте модел", "Discover a prompt": "Откриј упит", @@ -769,6 +768,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "Унесите број корака (нпр. 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -899,6 +900,7 @@ "Failed to create API Key.": "Неуспешно стварање API кључа.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1453,6 +1455,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "", + "OAuth session disconnected": "", "October": "Октобар", "Off": "Искључено", "Okay, Let's Go!": "У реду, хајде да кренемо!", @@ -1519,6 +1522,8 @@ "Output format": "Формат излаза", "Output Format": "", "Overview": "Преглед", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "страница", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2023,6 +2028,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Ово ће обрисати", "This will delete {{NAME}} and all its contents.": "Ово ће обрисати {{NAME}} и сав садржај унутар.", "This will delete all models including custom models": "Ово ће обрисати све моделе укључујући прилагођене моделе", diff --git a/src/lib/i18n/locales/sv-SE/translation.json b/src/lib/i18n/locales/sv-SE/translation.json index 9915d73f25..aa2784d64b 100644 --- a/src/lib/i18n/locales/sv-SE/translation.json +++ b/src/lib/i18n/locales/sv-SE/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Kontoaktivering väntar", "Accurate information": "Exakt information", "Action": "Åtgärd", - "Action not found": "Åtgärd hittades inte", "Action Required for Chat Log Storage": "Åtgärd krävs för att spara chattloggen", "Actions": "Åtgärder", "Activate": "Aktivera", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "Spela alltid aviseringsljud", "Amazing": "Fantastiskt", "an assistant": "en assistent", - "An error occurred while fetching the explanation": "", "Analytics": "Analys", "Analyzed": "Analyserad", "Analyzing...": "Analyserar...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "Inaktivera bildextrahering", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Inaktivera bildextrahering från PDF-filen. Om Använd LLM är aktiverat kommer bilder att automatiskt bildtextas. Standardvärdet är False.", "Disabled": "Inaktiverad", + "Disconnect OAuth": "", "Discover a function": "Upptäck en funktion", "Discover a model": "Upptäck en modell", "Discover a prompt": "Upptäck en instruktion", @@ -768,6 +767,8 @@ "Enter New Password": "Ange nytt lösenord", "Enter Number of Steps (e.g. 50)": "Ange antal steg (t.ex. 50)", "Enter Ollama Cloud API Key": "Ange Ollama Cloud API-nyckel", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Ange Perplexity API-nyckel", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "Ange Playwright-timeout", @@ -898,6 +899,7 @@ "Failed to create API Key.": "Misslyckades med att skapa API-nyckel.", "Failed to delete calendar": "", "Failed to delete note": "Misslyckades med att ta bort anteckning", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "oktober", "Off": "Av", "Okay, Let's Go!": "Okej, nu kör vi!", @@ -1518,6 +1521,8 @@ "Output format": "Utdataformat", "Output Format": "Utdataformat", "Overview": "Översikt", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "sida", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Det här alternativet anger det maximala antalet tokens som modellen kan generera i sitt svar. Om du ökar den här gränsen kan modellen ge längre svar, men det kan också öka sannolikheten för att det genereras innehåll som inte är till hjälp eller irrelevant.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Detta alternativ tar bort alla befintliga filer i samlingen och ersätter dem med nyligen uppladdade filer.", "This response was generated by \"{{model}}\"": "Det här svaret genererades av \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Detta kommer att radera", "This will delete {{NAME}} and all its contents.": "Detta kommer att radera {{NAME}} och allt dess innehåll.", "This will delete all models including custom models": "Detta kommer att radera alla modeller inklusive anpassade modeller", diff --git a/src/lib/i18n/locales/ta-IN/translation.json b/src/lib/i18n/locales/ta-IN/translation.json index 646aec1471..d5ceb6080a 100644 --- a/src/lib/i18n/locales/ta-IN/translation.json +++ b/src/lib/i18n/locales/ta-IN/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "கணக்கு செயல்படுத்தல் நிலுவையில் உள்ளது", "Accurate information": "துல்லியமான தகவல்", "Action": "செயல்", - "Action not found": "நடவடிக்கை கிடைக்கவில்லை", "Action Required for Chat Log Storage": "அரட்டை பதிவு சேமிப்பகத்திற்கு நடவடிக்கை தேவை", "Actions": "செயல்கள்", "Activate": "செயல்படுத்து", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "அறிவிப்பு ஒலியை எப்போதும் இயக்கவும்", "Amazing": "அற்புதம்", "an assistant": "ஒரு உதவியாளர்", - "An error occurred while fetching the explanation": "விளக்கத்தைப் பெறும்போது பிழை ஏற்பட்டது", "Analytics": "பகுப்பாய்வு", "Analyzed": "பகுப்பாய்வு செய்யப்பட்டது", "Analyzing...": "பகுப்பாய்வு செய்கிறது...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "படத்தை பிரித்தெடுப்பதை முடக்கு", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "PDF இலிருந்து படத்தை பிரித்தெடுப்பதை முடக்கு. LLMஐப் பயன்படுத்துதல் இயக்கப்பட்டிருந்தால், படங்கள் தானாகவே தலைப்பிடப்படும். இயல்புநிலையிலிருந்து தவறு.", "Disabled": "முடக்கப்பட்டது", + "Disconnect OAuth": "", "Discover a function": "ஒரு செயல்பாட்டைக் கண்டறியவும்", "Discover a model": "ஒரு மாதிரியைக் கண்டறியவும்", "Discover a prompt": "ஒரு தூண்டுதலைக் கண்டறியவும்", @@ -768,6 +767,8 @@ "Enter New Password": "புதிய கடவுச்சொல்லை உள்ளிடவும்", "Enter Number of Steps (e.g. 50)": "படிகளின் எண்ணிக்கையை உள்ளிடவும் (எ.கா. 50)", "Enter Ollama Cloud API Key": "Ollama கிளவுட் API விசையை உள்ளிடவும்", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "குழப்பம் API விசையை உள்ளிடவும்", "Enter Perplexity Search API URL": "குழப்பமான தேடலை உள்ளிடவும் API URL", "Enter Playwright Timeout": "பிளேரைட் டைம்அவுட்டை உள்ளிடவும்", @@ -898,6 +899,7 @@ "Failed to create API Key.": "API விசையை உருவாக்குவதில் தோல்வி.", "Failed to delete calendar": "", "Failed to delete note": "குறிப்பை நீக்க முடியவில்லை", + "Failed to disconnect": "", "Failed to download image": "படத்தைப் பதிவிறக்க முடியவில்லை", "Failed to extract content from the file: {{error}}": "கோப்பிலிருந்து உள்ளடக்கத்தைப் பிரித்தெடுக்க முடியவில்லை: {{error}}", "Failed to extract content from the file.": "கோப்பிலிருந்து உள்ளடக்கத்தைப் பிரித்தெடுக்க முடியவில்லை.", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "OAuth 2.1 (நிலையான)", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "அக்டோபர்", "Off": "ஆஃப்", "Okay, Let's Go!": "சரி, போகலாம்!", @@ -1518,6 +1521,8 @@ "Output format": "வெளியீட்டு வடிவம்", "Output Format": "வெளியீட்டு வடிவம்", "Overview": "கண்ணோட்டம்", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "பக்கம்", "Page": "பக்கம்", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "பக்க பயன்முறை ஒரு பக்கத்திற்கு ஒரு ஆவணத்தை உருவாக்குகிறது. ஒற்றைப் பயன்முறையானது அனைத்துப் பக்கங்களையும் ஒரு ஆவணமாக இணைத்து, பக்க எல்லைகளில் சிறப்பாகப் பிரிக்கிறது.", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "இந்த விருப்பம் மாதிரி அதன் பதிலில் உருவாக்கக்கூடிய அதிகபட்ச டோக்கன்களை அமைக்கிறது. இந்த வரம்பை அதிகரிப்பது மாதிரி நீண்ட பதில்களை வழங்க அனுமதிக்கிறது, ஆனால் இது உதவாத அல்லது பொருத்தமற்ற உள்ளடக்கம் உருவாக்கப்படுவதற்கான வாய்ப்பையும் அதிகரிக்கலாம்.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "இந்த விருப்பம் சேகரிப்பில் இருக்கும் எல்லா கோப்புகளையும் நீக்கி, புதிதாக பதிவேற்றப்பட்ட கோப்புகளுடன் மாற்றும்.", "This response was generated by \"{{model}}\"": "இந்த பதில் \"{{model}}\" ஆல் உருவாக்கப்பட்டது", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "இது நீக்கும்", "This will delete {{NAME}} and all its contents.": "இது {{NAME}} மற்றும் அதன் அனைத்து உள்ளடக்கங்களையும் நீக்கும்.", "This will delete all models including custom models": "இது தனிப்பயன் மாதிரிகள் உட்பட அனைத்து மாடல்களையும் நீக்கும்", diff --git a/src/lib/i18n/locales/th-TH/translation.json b/src/lib/i18n/locales/th-TH/translation.json index 17dd64ef45..6ad730ed4f 100644 --- a/src/lib/i18n/locales/th-TH/translation.json +++ b/src/lib/i18n/locales/th-TH/translation.json @@ -57,7 +57,6 @@ "Account Activation Pending": "การเปิดใช้งานบัญชีกำลังดำเนินการ", "Accurate information": "ข้อมูลที่ถูกต้อง", "Action": "การดำเนินการ", - "Action not found": "ไม่พบการดำเนินการ", "Action Required for Chat Log Storage": "ต้องดำเนินการเพื่อจัดเก็บบันทึกการแชท", "Actions": "การดำเนินการ", "Activate": "เปิดใช้งาน", @@ -158,7 +157,6 @@ "Always Play Notification Sound": "เล่นเสียงแจ้งเตือนเสมอ", "Amazing": "ยอดเยี่ยม", "an assistant": "ผู้ช่วย", - "An error occurred while fetching the explanation": "เกิดข้อผิดพลาดขณะดึงคำอธิบาย", "Analytics": "การวิเคราะห์", "Analyzed": "วิเคราะห์แล้ว", "Analyzing...": "กำลังวิเคราะห์...", @@ -578,6 +576,7 @@ "Disable Image Extraction": "ปิดใช้งานการแยกรูปภาพ", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "ปิดใช้งานการดึงรูปภาพจากไฟล์ PDF หากเปิดใช้ Use LLM รูปภาพจะถูกสร้างคำบรรยายให้โดยอัตโนมัติ ค่าเริ่มต้นคือ False", "Disabled": "ปิดใช้งาน", + "Disconnect OAuth": "", "Discover a function": "ค้นพบฟังก์ชัน", "Discover a model": "ค้นพบโมเดล", "Discover a prompt": "ค้นพบพรอมต์", @@ -767,6 +766,8 @@ "Enter New Password": "ป้อนรหัสผ่านใหม่", "Enter Number of Steps (e.g. 50)": "ใส่จำนวนขั้นตอน (เช่น 50)", "Enter Ollama Cloud API Key": "ใส่ Ollama Cloud API Key", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "ใส่ Perplexity API Key", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "ป้อนเวลา Timeout ของ Playwright", @@ -897,6 +898,7 @@ "Failed to create API Key.": "สร้าง API Key ล้มเหลว", "Failed to delete calendar": "", "Failed to delete note": "ลบบันทึกไม่สำเร็จ", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "ไม่สามารถดึงเนื้อหาจากไฟล์ได้: {{error}}", "Failed to extract content from the file.": "ไม่สามารถดึงเนื้อหาจากไฟล์ได้", @@ -1451,6 +1453,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "ตุลาคม", "Off": "ปิด", "Okay, Let's Go!": "ตกลง ไปกันเลย!", @@ -1517,6 +1520,8 @@ "Output format": "รูปแบบผลลัพธ์", "Output Format": "รูปแบบผลลัพธ์", "Overview": "ภาพรวม", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "หน้า", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2017,6 +2022,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "ตัวเลือกนี้ใช้กำหนดจำนวนโทเค็นสูงสุดที่โมเดลสามารถสร้างได้ในคำตอบของตน การเพิ่มขีดจำกัดนี้จะช่วยให้โมเดลตอบได้ยาวขึ้น แต่ก็อาจเพิ่มโอกาสในการสร้างเนื้อหาที่ไม่เป็นประโยชน์หรือไม่เกี่ยวข้องด้วย", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "ตัวเลือกนี้จะลบไฟล์ทั้งหมดที่มีอยู่ในคอลเลกชันและแทนที่ด้วยไฟล์ที่อัปโหลดใหม่", "This response was generated by \"{{model}}\"": "การตอบกลับนี้สร้างโดย \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "การดำเนินการนี้จะลบ", "This will delete {{NAME}} and all its contents.": "การดำเนินการนี้จะลบ {{NAME}} และเนื้อหาทั้งหมด", "This will delete all models including custom models": "การดำเนินการนี้จะลบโมเดลทั้งหมด รวมถึงโมเดลแบบกำหนดเอง", diff --git a/src/lib/i18n/locales/tk-TM/translation.json b/src/lib/i18n/locales/tk-TM/translation.json index 6783a0222a..cc5cb3f895 100644 --- a/src/lib/i18n/locales/tk-TM/translation.json +++ b/src/lib/i18n/locales/tk-TM/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "", "Accurate information": "Takyk maglumat", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Söhbet gündeligini saklamak üçin çäre zerur", "Actions": "", "Activate": "", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "", "Amazing": "", "an assistant": "kömekçi", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Ýatyrylan", + "Disconnect OAuth": "", "Discover a function": "", "Discover a model": "", "Discover a prompt": "", @@ -768,6 +767,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "", + "OAuth session disconnected": "", "October": "Oktýabr", "Off": "", "Okay, Let's Go!": "", @@ -1518,6 +1521,8 @@ "Output format": "", "Output Format": "", "Overview": "", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", "This response was generated by \"{{model}}\"": "", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "", "This will delete {{NAME}} and all its contents.": "", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/tr-TR/translation.json b/src/lib/i18n/locales/tr-TR/translation.json index 5b31954239..caf5954360 100644 --- a/src/lib/i18n/locales/tr-TR/translation.json +++ b/src/lib/i18n/locales/tr-TR/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Hesap Aktivasyonu Bekleniyor", "Accurate information": "Doğru bilgi", "Action": "Aksiyon", - "Action not found": "Aksiyon bulunamadı", "Action Required for Chat Log Storage": "Sohbet günlüğünü kaydetmek için işlem gerekli", "Actions": "Aksiyonlar", "Activate": "Aktif Et", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "Her Zaman Bildirim Sesini Oynat", "Amazing": "Harika", "an assistant": "bir asistan", - "An error occurred while fetching the explanation": "Açıklama alınırken bir hata oluştu", "Analytics": "Analiz", "Analyzed": "Analiz edildi", "Analyzing...": "Analiz ediliyor...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "Görsel Çıkarmayı Devre Dışı Bırak", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "PDF'den görsel çıkarmayı devre dışı bırakır. LLM Kullan etkinse görseller otomatik olarak altyazılanır. Varsayılan olarak False.", "Disabled": "Devre Dışı", + "Disconnect OAuth": "", "Discover a function": "Bir fonksiyon keşfedin", "Discover a model": "Bir model keşfedin", "Discover a prompt": "Bir prompt keşfedin", @@ -768,6 +767,8 @@ "Enter New Password": "Yeni Parola Girin", "Enter Number of Steps (e.g. 50)": "Adım Sayısını Girin (örn. 50)", "Enter Ollama Cloud API Key": "Ollama Cloud API Anahtarını Girin", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Perplexity API Anahtarını Girin", "Enter Perplexity Search API URL": "Perplexity Search API URL'sini Girin", "Enter Playwright Timeout": "Playwright Zaman Aşımını Girin", @@ -898,6 +899,7 @@ "Failed to create API Key.": "API Anahtarı oluşturulamadı.", "Failed to delete calendar": "", "Failed to delete note": "Not silinemedi", + "Failed to disconnect": "", "Failed to download image": "Görsel indirilemedi", "Failed to extract content from the file: {{error}}": "Dosyadan içerik çıkarılamadı: {{error}}", "Failed to extract content from the file.": "Dosyadan içerik çıkarılamadı.", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "Ekim", "Off": "Kapalı", "Okay, Let's Go!": "Tamam, Hadi Başlayalım!", @@ -1518,6 +1521,8 @@ "Output format": "Çıktı formatı", "Output Format": "", "Overview": "Genel Bakış", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "sayfa", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Bu seçenek, koleksiyondaki tüm mevcut dosyaları silecek ve bunları yeni yüklenen dosyalarla değiştirecek.", "This response was generated by \"{{model}}\"": "Bu yanıt \"{{model}}\" tarafından oluşturuldu", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Bu silinecek", "This will delete {{NAME}} and all its contents.": "{{NAME}} ve tüm içeriği silinecek.", "This will delete all models including custom models": "Bu, özel modeller dahil olmak üzere tüm modelleri silecek", diff --git a/src/lib/i18n/locales/ug-CN/translation.json b/src/lib/i18n/locales/ug-CN/translation.json index ba0727be45..c7e97e4eb3 100644 --- a/src/lib/i18n/locales/ug-CN/translation.json +++ b/src/lib/i18n/locales/ug-CN/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "ھېسابات ئاكتىپلىنىشى كۈتۈلمەكتە", "Accurate information": "توغرا ئۇچۇر", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "سۆھبەت خاتىرىسىنى ساقلاش ئۈچۈن ھەرىكەت زۆرۈر", "Actions": "ھەرىكەتلەر", "Activate": "ئاكتىپلاش", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "ئۇقتۇرۇش ئاۋازىنى ھەمىشە قوي", "Amazing": "ئاجايىپ", "an assistant": "ياردەمچى", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "تەھلىل قىلىندى", "Analyzing...": "تەھلىل قىلىنىۋاتىدۇ...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "رەسىم چىقىرىشنى چەكلە", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "PDF دىن رەسىم چىقىرىش چەكلىنىدۇ. LLM ئىشلىتىلسە، رەسىملەر ئاپتوماتىك تېمىغا ئىگە بولىدۇ. كۆڭۈلدىكىچە چەكلەنمەيدۇ.", "Disabled": "چەكلەنگەن", + "Disconnect OAuth": "", "Discover a function": "فۇنكسىيە تاپ", "Discover a model": "مودېل تاپ", "Discover a prompt": "تۈرتكە تاپ", @@ -768,6 +767,8 @@ "Enter New Password": "يېڭى پارول كىرگۈزۈڭ", "Enter Number of Steps (e.g. 50)": "قەدەملەر سانى كىرگۈزۈڭ (مەسىلەن: 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Perplexity API ئاچقۇچى كىرگۈزۈڭ", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "Playwright ۋاقىت چەكلىمىسى كىرگۈزۈڭ", @@ -898,6 +899,7 @@ "Failed to create API Key.": "API ئاچقۇچى قۇرۇش مەغلۇپ بولدى.", "Failed to delete calendar": "", "Failed to delete note": "خاتىرە ئۆچۈرۈش مەغلۇپ بولدى", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "ئۆكتەبىر", "Off": "تاقالغان", "Okay, Let's Go!": "ماقۇل، باشلايلى!", @@ -1518,6 +1521,8 @@ "Output format": "چىقىرىش قېلىپى", "Output Format": "چىقىرىش فورماتى", "Overview": "قىسقىچە تونۇشتۇرۇش", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "بەت", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "بۇ تاللاش مودېل ئىنكاستا ھاسىل قىلىدىغان ئەڭ كۆپ ئىم سانىنى بەلگىلەيدۇ. چەك چوڭ بولسا، ئۇزۇن ئىنكاس چىقىرىدۇ، بىراق مۇناسىۋەتسىز مەزمۇن چىقىشى ئېھتىمالى يۇقىرى.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "بۇ تاللاش بارلىق توپلامدىكى ھۆججەتلەرنى ئۆچۈرۈپ يېڭى چىقىرىلغان ھۆججەتلەر بىلەن ئالماشتۇرىدۇ.", "This response was generated by \"{{model}}\"": "بۇ ئىنكاس \"{{model}}\" ئارقىلىق ھاسىل قىلىندى", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "بۇ ئۆچۈرۈلىدۇ:", "This will delete {{NAME}} and all its contents.": "{{NAME}} ۋە بارلىق مەزمۇنى ئۆچۈرۈلىدۇ.", "This will delete all models including custom models": "بۇ بارلىق مودېللارنى ئۆچۈرۈدۇ (ئۆزلۈك مودېللارنىمۇ ئۆز ئىچىگە ئالىدۇ)", diff --git a/src/lib/i18n/locales/uk-UA/translation.json b/src/lib/i18n/locales/uk-UA/translation.json index 46de023a39..74758adace 100644 --- a/src/lib/i18n/locales/uk-UA/translation.json +++ b/src/lib/i18n/locales/uk-UA/translation.json @@ -60,7 +60,6 @@ "Account Activation Pending": "Очікування активації облікового запису", "Accurate information": "Точна інформація", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Потрібна дія для збереження журналу чату", "Actions": "Дії", "Activate": "Активувати", @@ -161,7 +160,6 @@ "Always Play Notification Sound": "", "Amazing": "Чудово", "an assistant": "асистента", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "Проаналізовано", "Analyzing...": "Аналізую...", @@ -581,6 +579,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Вимкнено", + "Disconnect OAuth": "", "Discover a function": "Знайдіть функцію", "Discover a model": "Знайдіть модель", "Discover a prompt": "Знайдіть промт", @@ -770,6 +769,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "Введіть кількість кроків (напр., 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Введіть ключ API для Perplexity", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -900,6 +901,7 @@ "Failed to create API Key.": "Не вдалося створити API ключ.", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1454,6 +1456,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "Жовтень", "Off": "Вимк", "Okay, Let's Go!": "Гаразд, давайте почнемо!", @@ -1520,6 +1523,8 @@ "Output format": "Формат відповіді", "Output Format": "", "Overview": "Огляд", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "сторінка", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2026,6 +2031,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Ця опція встановлює максимальну кількість токенів, які модель може згенерувати у своїй відповіді. Збільшення цього ліміту дозволяє моделі надавати довші відповіді, але також може підвищити ймовірність генерації непотрібного або нерелевантного контенту.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Цей варіант видалить усі існуючі файли в колекції та замінить їх новими завантаженими файлами.", "This response was generated by \"{{model}}\"": "Цю відповідь згенеровано за допомогою \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Це призведе до видалення", "This will delete {{NAME}} and all its contents.": "Це видалить {{NAME}} та усі його вмісти.", "This will delete all models including custom models": "Це видалить усі моделі, включаючи користувацькі моделі", diff --git a/src/lib/i18n/locales/ur-PK/translation.json b/src/lib/i18n/locales/ur-PK/translation.json index 967dd471db..40f964725e 100644 --- a/src/lib/i18n/locales/ur-PK/translation.json +++ b/src/lib/i18n/locales/ur-PK/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "اکاؤنٹ فعال ہونے کا انتظار ہے", "Accurate information": "درست معلومات", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "چیٹ لاگ محفوظ کرنے کے لیے کارروائی درکار ہے", "Actions": "اعمال", "Activate": "", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "", "Amazing": "", "an assistant": "معاون", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "", "Analyzing...": "", @@ -579,6 +577,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "غیر فعال", + "Disconnect OAuth": "", "Discover a function": "ایک فنکشن دریافت کریں", "Discover a model": "ایک ماڈل دریافت کریں", "Discover a prompt": "ایک اشارہ دریافت کریں", @@ -768,6 +767,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "درج کریں مراحل کی تعداد (جیسے 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "API کلید بنانے میں ناکام", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth آئی ڈی", + "OAuth session disconnected": "", "October": "اکتوبر", "Off": "بند", "Okay, Let's Go!": "ٹھیک ہے، چلیں!", @@ -1518,6 +1521,8 @@ "Output format": "آؤٹ پٹ فارمیٹ", "Output Format": "", "Overview": "جائزہ", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "صفحہ", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "اس اختیار سے مجموعہ میں موجود تمام فائلز حذف ہو جائیں گی اور ان کی جگہ نئی اپ لوڈ کردہ فائلز لی جائیں گی", "This response was generated by \"{{model}}\"": "یہ جواب \"{{model}}\" کے ذریعہ تیار کیا گیا", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "یہ حذف کر دے گا", "This will delete {{NAME}} and all its contents.": "یہ {{NAME}} اور اس کے تمام مواد کو حذف کر دے گا", "This will delete all models including custom models": "", diff --git a/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json b/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json index fe4f5b1da1..ef428a85a9 100644 --- a/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json +++ b/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Ҳисобни фаоллаштириш кутилмоқда", "Accurate information": "Аниқ маълумот", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Чат журнали сақланиши учун амал талаб қилинади", "Actions": "Ҳаракатлар", "Activate": "Фаоллаштириш", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "Ҳар доим билдиришнома овозини ижро этиш", "Amazing": "Ажойиб", "an assistant": "ёрдамчи", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "Таҳлил қилинган", "Analyzing...": "Таҳлил қилинмоқда...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "Расм чиқаришни ўчириб қўйинг", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "PDFдан тасвирни ажратиб олишни ўчириб қўйинг. Агар LLM дан фойдаланиш ёқилган бўлса, тасвирларга автоматик сарлавҳа қўйилади. Бирламчи параметрлар False.", "Disabled": "Ўчирилган", + "Disconnect OAuth": "", "Discover a function": "Функцияни кашф қилиш", "Discover a model": "Моделни кашф қилинг", "Discover a prompt": "Кўрсатмани кашф қилинг", @@ -768,6 +767,8 @@ "Enter New Password": "Янги паролни киритинг", "Enter Number of Steps (e.g. 50)": "Қадамлар сонини киритинг (масалан, 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Perplexity АПИ калитини киритинг", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -898,6 +899,7 @@ "Failed to create API Key.": "АПИ калитини яратиб бўлмади.", "Failed to delete calendar": "", "Failed to delete note": "Қайдни ўчириб бўлмади", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "ОАутҳ ИД", + "OAuth session disconnected": "", "October": "октябр", "Off": "Ўчирилган", "Okay, Let's Go!": "Майли, кетайлик!", @@ -1518,6 +1521,8 @@ "Output format": "Чиқиш формати", "Output Format": "Чиқиш формати", "Overview": "Умумий кўриниш", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "саҳифа", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Ушбу параметр модел жавобида яратиши мумкин бўлган токенларнинг максимал сонини белгилайди. Ушбу чегарани ошириш моделга узоқроқ жавобларни тақдим этиш имконини беради, бироқ у фойдасиз ёки аҳамиятсиз контент яратилиш эҳтимолини ҳам ошириши мумкин.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Ушбу параметр тўпламдаги барча мавжуд файлларни ўчиради ва уларни янги юкланган файллар билан алмаштиради.", "This response was generated by \"{{model}}\"": "Бу жавоб \"{{модел}}\" томонидан яратилган", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Бу ўчирилади", "This will delete {{NAME}} and all its contents.": "Бу <стронг>{{NAME}} ва <стронг>барча мазмунини ўчириб ташлайди.", "This will delete all models including custom models": "Бу барча моделларни, шу жумладан махсус моделларни ўчириб ташлайди", diff --git a/src/lib/i18n/locales/uz-Latn-Uz/translation.json b/src/lib/i18n/locales/uz-Latn-Uz/translation.json index 2ffada0eab..8975a1920d 100644 --- a/src/lib/i18n/locales/uz-Latn-Uz/translation.json +++ b/src/lib/i18n/locales/uz-Latn-Uz/translation.json @@ -58,7 +58,6 @@ "Account Activation Pending": "Hisobni faollashtirish kutilmoqda", "Accurate information": "Aniq ma'lumot", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Chat jurnalini saqlash uchun amal talab qilinadi", "Actions": "Harakatlar", "Activate": "Faollashtirish", @@ -159,7 +158,6 @@ "Always Play Notification Sound": "Har doim bildirishnoma ovozini ijro etish", "Amazing": "Ajoyib", "an assistant": "yordamchi", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "Tahlil qilingan", "Analyzing...": "Tahlil qilinmoqda...", @@ -579,6 +577,7 @@ "Disable Image Extraction": "Rasm chiqarishni o'chirib qo'ying", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "PDF-dan tasvirni ajratib olishni o'chirib qo'ying. Agar LLM dan foydalanish yoqilgan boʻlsa, tasvirlarga avtomatik sarlavha qoʻyiladi. Birlamchi parametrlar False.", "Disabled": "O'chirilgan", + "Disconnect OAuth": "", "Discover a function": "Funktsiyani kashf qilish", "Discover a model": "Modelni kashf qiling", "Discover a prompt": "Ko'rsatmani kashf qiling", @@ -768,6 +767,8 @@ "Enter New Password": "Yangi parolni kiriting", "Enter Number of Steps (e.g. 50)": "Qadamlar sonini kiriting (masalan, 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Perplexity API kalitini kiriting", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "Dramaturg vaqtini kiriting", @@ -898,6 +899,7 @@ "Failed to create API Key.": "API kalitini yaratib bo‘lmadi.", "Failed to delete calendar": "", "Failed to delete note": "Qaydni o‘chirib bo‘lmadi", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1452,6 +1454,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "oktyabr", "Off": "Oʻchirilgan", "Okay, Let's Go!": "Mayli, ketaylik!", @@ -1518,6 +1521,8 @@ "Output format": "Chiqish formati", "Output Format": "Chiqish formati", "Overview": "Umumiy koʻrinish", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "sahifa", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2020,6 +2025,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Ushbu parametr model javobida yaratishi mumkin bo'lgan tokenlarning maksimal sonini belgilaydi. Ushbu chegarani oshirish modelga uzoqroq javoblarni taqdim etish imkonini beradi, biroq u foydasiz yoki ahamiyatsiz kontent yaratilish ehtimolini ham oshirishi mumkin.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Ushbu parametr to'plamdagi barcha mavjud fayllarni o'chiradi va ularni yangi yuklangan fayllar bilan almashtiradi.", "This response was generated by \"{{model}}\"": "Bu javob \"{{model}}\" tomonidan yaratilgan", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Bu o'chiriladi", "This will delete {{NAME}} and all its contents.": "Bu {{NAME}} va barcha mazmunini o‘chirib tashlaydi.", "This will delete all models including custom models": "Bu barcha modellarni, shu jumladan maxsus modellarni o'chirib tashlaydi", diff --git a/src/lib/i18n/locales/vi-VN/translation.json b/src/lib/i18n/locales/vi-VN/translation.json index 6810eb909a..ac716ec661 100644 --- a/src/lib/i18n/locales/vi-VN/translation.json +++ b/src/lib/i18n/locales/vi-VN/translation.json @@ -57,7 +57,6 @@ "Account Activation Pending": "Tài khoản đang chờ kích hoạt", "Accurate information": "Thông tin chính xác", "Action": "", - "Action not found": "", "Action Required for Chat Log Storage": "Cần thao tác để lưu nhật ký trò chuyện", "Actions": "Tác vụ", "Activate": "Kích hoạt", @@ -158,7 +157,6 @@ "Always Play Notification Sound": "", "Amazing": "Tuyệt vời", "an assistant": "trợ lý", - "An error occurred while fetching the explanation": "", "Analytics": "", "Analyzed": "Đã phân tích", "Analyzing...": "Đang phân tích...", @@ -578,6 +576,7 @@ "Disable Image Extraction": "", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", "Disabled": "Đã tắt", + "Disconnect OAuth": "", "Discover a function": "Khám phá function", "Discover a model": "Khám phá model", "Discover a prompt": "Khám phá thêm prompt mới", @@ -767,6 +766,8 @@ "Enter New Password": "", "Enter Number of Steps (e.g. 50)": "Nhập số Steps (vd: 50)", "Enter Ollama Cloud API Key": "", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "Nhập Khóa API Perplexity", "Enter Perplexity Search API URL": "", "Enter Playwright Timeout": "", @@ -897,6 +898,7 @@ "Failed to create API Key.": "Lỗi khởi tạo API Key", "Failed to delete calendar": "", "Failed to delete note": "", + "Failed to disconnect": "", "Failed to download image": "", "Failed to extract content from the file: {{error}}": "", "Failed to extract content from the file.": "", @@ -1451,6 +1453,7 @@ "OAuth 2.1": "", "OAuth 2.1 (Static)": "", "OAuth ID": "ID OAuth", + "OAuth session disconnected": "", "October": "Tháng 10", "Off": "Tắt", "Okay, Let's Go!": "Được rồi, Bắt đầu thôi!", @@ -1517,6 +1520,8 @@ "Output format": "Định dạng đầu ra", "Output Format": "", "Overview": "Tổng quan", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "trang", "Page": "", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", @@ -2017,6 +2022,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Tùy chọn này đặt số lượng token tối đa mà mô hình có thể tạo ra trong phản hồi của nó. Tăng giới hạn này cho phép mô hình cung cấp câu trả lời dài hơn, nhưng nó cũng có thể làm tăng khả năng tạo ra nội dung không hữu ích hoặc không liên quan.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Tùy chọn này sẽ xóa tất cả các tệp hiện có trong bộ sưu tập và thay thế chúng bằng các tệp mới được tải lên.", "This response was generated by \"{{model}}\"": "Phản hồi này được tạo bởi \"{{model}}\"", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "Chat này sẽ bị xóa", "This will delete {{NAME}} and all its contents.": "Hành động này sẽ xóa {{NAME}}tất cả nội dung của nó.", "This will delete all models including custom models": "Hành động này sẽ xóa tất cả các mô hình bao gồm cả các mô hình tùy chỉnh", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 9678d24eeb..e3aed8309f 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -57,7 +57,6 @@ "Account Activation Pending": "账号待激活", "Accurate information": "信息准确", "Action": "操作", - "Action not found": "找不到对应的操作项", "Action Required for Chat Log Storage": "需要操作以保存对话记录", "Actions": "操作", "Activate": "激活", @@ -158,7 +157,6 @@ "Always Play Notification Sound": "始终播放通知声音", "Amazing": "很棒", "an assistant": "一个助手", - "An error occurred while fetching the explanation": "获取解释时发生错误", "Analytics": "分析", "Analyzed": "已分析", "Analyzing...": "正在分析...", @@ -578,6 +576,7 @@ "Disable Image Extraction": "禁用图像提取", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "禁用从 PDF 中提取图像。若启用“使用大语言模型(LLM)”,图像将自动添加描述。默认为关闭", "Disabled": "已禁用", + "Disconnect OAuth": "", "Discover a function": "发现更多函数", "Discover a model": "发现更多模型", "Discover a prompt": "发现更多提示词", @@ -767,6 +766,8 @@ "Enter New Password": "输入新密码", "Enter Number of Steps (e.g. 50)": "输入步骤数 (Steps)(例如:50)", "Enter Ollama Cloud API Key": "输入 Ollama Cloud 接口密钥", + "Enter PaddleOCR-vl API Base URL": "输入 PaddleOCR-vl API 基础地址", + "Enter PaddleOCR-vl API Token": "输入 PaddleOCR-vl 接口密钥", "Enter Perplexity API Key": "输入 Perplexity 接口密钥", "Enter Perplexity Search API URL": "输入 Perplexity Search 接口地址", "Enter Playwright Timeout": "输入 Playwright 超时时间", @@ -774,8 +775,6 @@ "Enter prompt here.": "在此输入提示词。", "Enter proxy URL (e.g. https://user:password@host:port)": "输入代理地址(例如:https://用户名:密码@主机名:端口)", "Enter reasoning effort": "输入推理努力", - "Enter PaddleOCR-vl API Token": "输入 PaddleOCR-vl 接口密钥", - "Enter PaddleOCR-vl API Base URL": "输入 PaddleOCR-vl API 基础地址", "Enter Score": "输入评分", "Enter SearchApi API Key": "输入 SearchApi 接口密钥", "Enter SearchApi Engine": "输入 SearchApi 引擎", @@ -899,6 +898,7 @@ "Failed to create API Key.": "创建接口密钥失败", "Failed to delete calendar": "", "Failed to delete note": "删除笔记失败", + "Failed to disconnect": "", "Failed to download image": "图片下载失败", "Failed to extract content from the file: {{error}}": "文件内容提取失败:{{error}}", "Failed to extract content from the file.": "文件内容提取失败", @@ -1453,6 +1453,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "OAuth 2.1(静态)", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "十月", "Off": "关闭", "Okay, Let's Go!": "确认,开始使用!", @@ -1520,6 +1521,7 @@ "Output Format": "输出格式", "Overview": "概述", "PaddleOCR-vl": "PaddleOCR-vl", + "PaddleOCR-vl API URL required.": "", "page": "页", "Page": "页模式", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "页模式将为每个页面创建一个文档;单文档模式则将所有页面合并为一个文档,以便更好地进行跨页分块。", @@ -2020,6 +2022,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "此项用于设置模型在其响应中可以生成的最大 Token 数。增加此限制可让模型输出更多内容,但也可能增加生成无用或不相关内容的可能性。", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "此选项将会删除文件集中所有文件,并用新上传的文件替换。", "This response was generated by \"{{model}}\"": "此回答由 “{{model}}” 生成", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "这将删除", "This will delete {{NAME}} and all its contents.": "这将删除{{NAME}}及其所有内容。", "This will delete all models including custom models": "这将删除所有模型,包括自定义模型", diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 50d352a96f..50624307f7 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -57,7 +57,6 @@ "Account Activation Pending": "帳號待啟用", "Accurate information": "準確資訊", "Action": "操作", - "Action not found": "找不到對應的操作項目", "Action Required for Chat Log Storage": "需要操作以儲存對話紀錄", "Actions": "動作", "Activate": "啟用", @@ -158,7 +157,6 @@ "Always Play Notification Sound": "總是播放通知音效", "Amazing": "很棒", "an assistant": "助理", - "An error occurred while fetching the explanation": "取得說明時發生錯誤", "Analytics": "分析", "Analyzed": "分析完畢", "Analyzing...": "正在分析...", @@ -578,6 +576,7 @@ "Disable Image Extraction": "停用圖片擷取", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "停用從 PDF 擷取圖片。若啟用「使用 LLM」,圖片將自動新增說明。預設為 False。", "Disabled": "已停用", + "Disconnect OAuth": "", "Discover a function": "發掘函式", "Discover a model": "發掘模型", "Discover a prompt": "發掘提示詞", @@ -767,6 +766,8 @@ "Enter New Password": "輸入新密碼", "Enter Number of Steps (e.g. 50)": "輸入步驟數(例如:50)", "Enter Ollama Cloud API Key": "輸入 Ollama Cloud API 金鑰", + "Enter PaddleOCR-vl API Base URL": "", + "Enter PaddleOCR-vl API Token": "", "Enter Perplexity API Key": "輸入 Perplexity API 金鑰", "Enter Perplexity Search API URL": "輸入 Perplexity 搜尋 API URL", "Enter Playwright Timeout": "輸入 Playwright 逾時時間(毫秒)", @@ -897,6 +898,7 @@ "Failed to create API Key.": "建立 API 金鑰失敗。", "Failed to delete calendar": "", "Failed to delete note": "刪除筆記失敗", + "Failed to disconnect": "", "Failed to download image": "圖片下載失敗", "Failed to extract content from the file: {{error}}": "檔案內容擷取失敗:{{error}}", "Failed to extract content from the file.": "檔案內容擷取失敗", @@ -1451,6 +1453,7 @@ "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "OAuth 2.1(靜態)", "OAuth ID": "OAuth ID", + "OAuth session disconnected": "", "October": "10 月", "Off": "關閉", "Okay, Let's Go!": "好的,我們開始吧!", @@ -1517,6 +1520,8 @@ "Output format": "輸出格式", "Output Format": "輸出格式", "Overview": "概覽", + "PaddleOCR-vl": "", + "PaddleOCR-vl API URL required.": "", "page": "頁面", "Page": "頁面模式", "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "頁面模式將為每個頁面創建一個文檔;單文檔模式則將所有頁面合併為一個文檔,以便更好地進行跨頁分塊。", @@ -2017,6 +2022,7 @@ "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "此選項設定模型在其回應中可以生成的最大 Token 數量。增加此限制允許模型提供更長的答案,但也可能增加產生無用或不相關內容的可能性。", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "此選項將刪除集合中的所有現有檔案,並用新上傳的檔案取代它們。", "This response was generated by \"{{model}}\"": "此回應由「{{model}}」產生", + "This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.": "", "This will delete": "這將會刪除", "This will delete {{NAME}} and all its contents.": "這將會刪除 {{NAME}}其所有內容。", "This will delete all models including custom models": "這將刪除所有模型,包括自訂模型", From 4e2240aadaff191ad360d37a7145e552359162c3 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 24 Apr 2026 18:55:39 +0900 Subject: [PATCH 51/51] refac --- scripts/prepare-pyodide.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare-pyodide.js b/scripts/prepare-pyodide.js index d83598343e..73ac1d8642 100644 --- a/scripts/prepare-pyodide.js +++ b/scripts/prepare-pyodide.js @@ -22,7 +22,7 @@ const packages = [ // static/pyodide/ so that the browser can install them offline via micropip. // Packages already provided by the Pyodide distribution (click, platformdirs, // typing_extensions, etc.) do NOT need to be listed here. -const pypiPackages = ['black', 'pathspec', 'mypy_extensions']; +const pypiPackages = ['black', 'pathspec', 'mypy_extensions', 'pytokens']; import { loadPyodide } from 'pyodide'; import { setGlobalDispatcher, ProxyAgent } from 'undici';