From d1df748de362f4f493faa4987b228b55dff0a12b Mon Sep 17 00:00:00 2001 From: Kylapaallikko Date: Thu, 26 Mar 2026 18:06:43 +0200 Subject: [PATCH 01/22] Update fi-FI translation.json Added missing translations and fixed typos. --- src/lib/i18n/locales/fi-FI/translation.json | 70 ++++++++++----------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index 922765521..1a02e138a 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -129,7 +129,7 @@ "Allow File Upload": "Salli tiedostojen lataus", "Allow Multiple Models in Chat": "Salli useampi malli keskustelussa", "Allow non-local voices": "Salli ei-paikalliset äänet", - "Allow public write access": "", + "Allow public write access": "Salli julkinen kirjoitusoikeus", "Allow Rate Response": "Salli viestien arviointi", "Allow Regenerate Response": "Salli uudelleen regenerointi", "Allow Sharing With Users": "Salli jakaminen käyttäjien kesken", @@ -182,12 +182,12 @@ "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 all chats? This action cannot be undone.": "Haluatko varamsti poistaa kaikki keskustelut? Tätä toimintoa ei voi peruuttaa.", + "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.": "", - "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.": "Haluatko varmasti poistaa yhteyden? Tätä toimintoa ei voi peruuttaa.", + "Are you sure you want to delete this memory? This action cannot be undone.": "Haluatko varmasti poistaa muiston? Tätä toimintoa ei voi peruuttaa.", "Are you sure you want to delete this message?": "Haluatko varmasti poistaa tämän viestin?", - "Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "Haluatko varamsti poistaa tämän version? Alaversiot linkitetään uudelleen tämän version ylätason versioon.", + "Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "Haluatko varmasti poistaa tämän version? Alaversiot linkitetään uudelleen tämän version ylätason versioon.", "Are you sure you want to delete this?": "Haluatko varmasti poistää tämän?", "Are you sure you want to unarchive all archived chats?": "Haluatko varmasti purkaa kaikkien arkistoitujen keskustelujen arkistoinnin?", "Arena Models": "Arena-mallit", @@ -331,7 +331,7 @@ "Click here to upload a workflow.json file.": "Klikkaa tästä ladataksesi workflow.json-tiedosto.", "click here.": "klikkaa tästä.", "Click on the user role button to change a user's role.": "Klikkaa käyttäjän roolipainiketta vaihtaaksesi käyttäjän roolia.", - "Click to connect": "", + "Click to connect": "Klikkaa yhdistääksesi", "Click to copy ID": "Klikkaa kopioidaksesi ID", "Client ID": "", "Client Secret": "", @@ -386,7 +386,7 @@ "Configure": "Määritä", "Confirm": "Vahvista", "Confirm Password": "Vahvista salasana", - "Confirm Prompt from Embed": "", + "Confirm Prompt from Embed": "Vahvista kehote upotuksesta", "Confirm your action": "Vahvista toimintasi", "Confirm your new password": "Vahvista uusi salasanasi", "Confirm Your Password": "Vahvista salasanasi", @@ -395,7 +395,7 @@ "Connect to Open Terminal instances. All users will have access to file browsing and terminal tools through these servers.": "Yhdistä Open Terminal -instansseihin. Kaikilla käyttäjillä on pääsy tiedostojen selaamiseen ja päätetyökaluihin näiden palvelimien kautta.", "Connect to your own OpenAI compatible API endpoints.": "Yhdistä omat OpenAI yhteensopivat API päätepisteet.", "Connect to your own OpenAPI compatible external tool servers.": "Yhdistä omat ulkopuoliset OpenAPI yhteensopivat työkalu palvelimet.", - "Connected ({{type}})": "", + "Connected ({{type}})": "Yhdistetty ({{type}})", "Connection failed": "Yhteys epäonnistui", "Connection successful": "Yhteys onnistui", "Connection Type": "Yhteystyyppi", @@ -508,7 +508,7 @@ "Delete File": "Poista tiedosto", "Delete folder?": "Haluatko varmasti poistaa tämän kansion?", "Delete function?": "Haluatko varmasti poistaa tämän toiminnon?", - "Delete Memory?": "", + "Delete Memory?": "Poista muisto?", "Delete Message": "Poista viesti", "Delete message?": "Poista viesti?", "Delete Model": "Poista malli", @@ -522,7 +522,7 @@ "Deleted": "Poistettu", "Deleted {{deleteModelTag}}": "Poistettu {{deleteModelTag}}", "Deleted {{name}}": "Poistettu {{nimi}}", - "Deleted {{ok}} of {{total}} items": "", + "Deleted {{ok}} of {{total}} items": "Poistettu {{ok}}/{{total}} kohdetta", "Deleted User": "Käyttäjä poistettu", "Deployment names are required for Azure OpenAI": "Azure OpenAI:lle vaaditaan käyttöönottojen nimet", "Desc": "Laskeva", @@ -531,7 +531,7 @@ "Describe what changed...": "Kuvaile mikä muuttui...", "Describe your knowledge base and objectives": "Kuvaa tietokantasi ja tavoitteesi", "Description": "Kuvaus", - "Deselect": "", + "Deselect": "Poista valinta", "Detect Artifacts Automatically": "Tunnista artefaktit automaattisesti", "Dictate": "Sanele", "Didn't fully follow instructions": "Ei noudattanut ohjeita täysin", @@ -794,7 +794,7 @@ "Enter Your Username": "Kirjoita käyttäjätunnuksesi", "Enter your webhook URL": "Kirjoita webhook osoitteesi", "Entra ID": "Entra ID", - "Environment Variables": "", + "Environment Variables": "Ympäristömuuttujat", "Ephemeral": "", "Error": "Virhe", "ERROR": "VIRHE", @@ -822,8 +822,8 @@ "Experimental": "Kokeellinen", "Explain": "Selitä", "Explore the cosmos": "Tutki avaruutta", - "Explored": "", - "Exploring": "", + "Explored": "Tutkittu", + "Exploring": "Tutkii", "Export": "Vie", "Export All Archived Chats": "Vie kaikki arkistoidut keskustelut", "Export All Chats (All Users)": "Vie kaikki keskustelut (kaikki käyttäjät)", @@ -874,7 +874,7 @@ "Failed to save connections": "Yhteyksien tallentaminen epäonnistui", "Failed to save conversation": "Keskustelun tallentaminen epäonnistui", "Failed to save models configuration": "Mallien määrityksen tallentaminen epäonnistui", - "Failed to save policy: {{error}}": "", + "Failed to save policy: {{error}}": "Käytännön tallentaminen epäonnistui: {{error}}", "Failed to save terminal servers": "Päätepalvelimien tallennus epäonnistui", "Failed to unshare chat.": "Jaon lopettaminen epäonnistui.", "Failed to update settings": "Asetusten päivittäminen epäonnistui", @@ -890,7 +890,7 @@ "Feedback History": "Palautehistoria", "Feel free to add specific details": "Voit lisätä tarkempia tietoja", "Female": "Nainen", - "Fetch URL Content Length Limit": "", + "Fetch URL Content Length Limit": "Noudetun URL-osoitteen sisällön pituusraja", "File": "Tiedosto", "File added successfully.": "Tiedosto lisätty onnistuneesti.", "File attached to chat": "Tiedosto liitety keskusteluun", @@ -945,7 +945,7 @@ "Format Lines": "Muotoile rivit", "Format the lines in the output. Defaults to False. If set to True, the lines will be formatted to detect inline math and styles.": "Muotoile rivit. Oletusarvo on False. Jos arvo on True, rivit muotoillaan siten, että ne havaitsevat riviin liitetyn matematiikan ja tyylit.", "Formatting may be inconsistent from source.": "Muotoilu voi poiketa alkuperäisestä.", - "Forward": "", + "Forward": "Eteenpäin", "Forwards system user OAuth access token to authenticate": "Välittää järjestelmä käyttäjän OAuth tunniste todennuksessa", "Forwards system user session credentials to authenticate": "Välittää järjestelmän käyttäjän istunnon tunnistetiedot todennusta varten", "Full Context Mode": "Koko kontekstitila", @@ -1033,7 +1033,7 @@ "ID": "Tunnus", "ID cannot contain \":\" or \"|\" characters": "ID ei voi sisältää \":\" tai \"|\" kirjaimia", "ID copied to clipboard": "ID kopioitu leikepöydälle", - "Idle Timeout": "", + "Idle Timeout": "Aikakatkaisu", "iframe Sandbox Allow Forms": "Salli lomakkeet iframe hiekkalaatikossa", "iframe Sandbox Allow Same Origin": "Salli iframe hiekkalaatikko samasta alkuperästä", "Ignite curiosity": "Sytytä uteliaisuus", @@ -1204,7 +1204,7 @@ "Max Speakers": "Puhujien enimmäismäärä", "Max Upload Count": "Latausten enimmäismäärä", "Max Upload Size": "Latausten enimmäiskoko", - "Maximum characters to return from fetched URLs. Leave empty for no limit.": "", + "Maximum characters to return from fetched URLs. Leave empty for no limit.": "Maksimimerkkimäärä haetuista URL-osoitteista. Jätä tyhjäksi, jos et halua rajoitusta.", "Maximum number of files allowed per folder.": "Kansiota kohden sallittujen tiedostojen enimmäismäärä.", "Maximum number of files per folder is {{max}}.": "Tiedostojen enimmäismäärä kansiossa on {{max}}.", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Enintään 3 mallia voidaan ladata samanaikaisesti. Yritä myöhemmin uudelleen.", @@ -1342,7 +1342,7 @@ "No kernel": "Ei kerneliä", "No knowledge bases found.": "Tietokantoja ei löytynyt.", "No knowledge found": "Tietoa ei löytynyt", - "No limit": "", + "No limit": "Ei rajoituksia", "No memories to clear": "Ei muistia tyhjennettäväksi", "No model IDs": "Ei mallitunnuksia", "No models available": "Malleja ei saatavilla", @@ -1386,7 +1386,7 @@ "November": "marraskuu", "OAuth": "OAuth", "OAuth 2.1": "OAuth 2.1", - "OAuth 2.1 (Static)": "", + "OAuth 2.1 (Static)": "OAuth 2.1 (Staattinen)", "OAuth ID": "OAuth-tunnus", "October": "lokakuu", "Off": "Pois päältä", @@ -1416,7 +1416,7 @@ "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Hups! Käytät ei-tuettua menetelmää (vain frontend). Palvele WebUI:ta backendistä.", "Open file": "Avaa tiedosto", "Open in full screen": "Avaa koko näytön tilaan", - "Open in new tab": "", + "Open in new tab": "Avaa uusi välilehti", "Open link": "Avaa linkki", "Open modal to configure connection": "Avaa modaali yhteyden määrittämiseksi", "Open Modal To Manage Floating Quick Actions": "Avaa modaali kelluvien pikatoimintojen hallitsemiseksi", @@ -1424,7 +1424,7 @@ "Open Model Selector": "Avaa mallinvalitsin", "Open Settings": "Avaa asetukset", "Open Sidebar": "Avaa sivupalkki", - "Open Terminal": "Avaa pääte", + "Open Terminal": "Open Terminal", "Open User Profile Menu": "Avaa käyttäjäprofiili ikkuna", "Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI voi käyttää minkä tahansa OpenAPI-palvelimen tarjoamia työkaluja.", "Open WebUI uses faster-whisper internally.": "Open WebUI käyttää faster-whisperia sisäisesti.", @@ -1477,7 +1477,7 @@ "Perplexity Model": "Perplexity malli", "Perplexity Search API URL": "Perplexity Search API verkko-osoite", "Perplexity Search Context Usage": "Perplexity Search kontekstin käyttö", - "Persistent": "", + "Persistent": "Pysyvä", "Personalization": "Personointi", "Pin": "Kiinnitä", "Pinned": "Kiinnitetty", @@ -1497,7 +1497,7 @@ "Playwright Timeout (ms)": "Playwright aikakatkaisu (ms)", "Playwright WebSocket URL": "Playwright WebSocket verkko-osoite", "Please carefully review the following warnings:": "Tarkista huolellisesti seuraavat varoitukset:", - "Please connect all required integrations before sending a message": "", + "Please connect all required integrations before sending a message": "Yhdistä kaikki vaaditut integraatiot ennen viestin lähettämistä.", "Please do not close the settings page while loading the model.": "Älä sulje asetussivua mallin latautuessa.", "Please enter a message or attach a file.": "Kirjoita viesti tai liittä tiedosto.", "Please enter a prompt": "Kirjoita kehote", @@ -1506,7 +1506,7 @@ "Please enter a valid path": "Kirjoita kelvollinen polku", "Please enter a valid URL": "Kirjoita kelvollinen verkko-osoite", "Please enter a valid URL.": "Kirjoita kelvollinen verkko-osoite", - "Please enter Client ID and Client Secret": "", + "Please enter Client ID and Client Secret": "Kirjoita Client ID ja Client Secret", "Please fill in all fields.": "Täytä kaikki kentät.", "Please register the OAuth client": "Rekisteröi OAuth asiakasohjelma", "Please save the connection to persist the OAuth client information and do not change the ID": "Tallenna yhteys, jotta OAuth-asiakastiedot säilyvät, äläkä muuta tunnusta.", @@ -1516,7 +1516,7 @@ "Please select a valid JSON file": "Valitse kelvollinen JSON-tiedosto", "Please select at least one user for Direct Message channel.": "Valitse vähintään yksi käyttäjä suoraviestikanavalle.", "Please wait until all files are uploaded.": "Odota kunnes kaikki tiedostot ovat ladattu.", - "Policy ID": "", + "Policy ID": "Käytännön ID", "Port": "Portti", "Ports": "Portit", "Positive attitude": "Positiivinen asenne", @@ -1553,8 +1553,8 @@ "Querying": "Kysely", "Quick Actions": "Pikatoiminnot", "RAG Template": "RAG-kehote", - "Ran {{COUNT}} analyses": "", - "Ran {{COUNT}} analysis": "", + "Ran {{COUNT}} analyses": "Suoritettiin {{COUNT}} analyysiä", + "Ran {{COUNT}} analysis": "Suoritettiin {{COUNT}} analyysiä", "Rate {{rating}} out of 10": "Arvostele {{rating}}/10", "Rating": "Arviointi", "Re-rank models by topic similarity": "Uudelleenjärjestä mallit aiheyhteyden mukaan", @@ -1598,7 +1598,7 @@ "Remove image": "Poista kuva", "Remove Model": "Poista malli", "Rename": "Nimeä uudelleen", - "Renamed to {{name}}": "", + "Renamed to {{name}}": "Nimetty uudelleen {{name}}", "Render Markdown in Previews": "Renderöi Markdown esikatseluissa", "Reorder Models": "Uudelleenjärjestä malleja", "Reply": "Vastaa", @@ -1664,7 +1664,7 @@ "Search Groups": "Etsi ryhmiä", "Search In Models": "Hae mallleista", "Search Knowledge": "Hae tietämystä", - "Search Memories": "", + "Search Memories": "Hae muistoista", "Search Models": "Hae malleja", "Search Notes": "Hae muistiinpanoista", "Search options": "Hakuvaihtoehdot", @@ -1706,7 +1706,7 @@ "Select a theme": "Valitse teema", "Select a tool": "Valitse työkalu", "Select a voice": "Valitse ääni", - "Select All": "", + "Select All": "Valitse kaikki", "Select an auth method": "Valitse kirjautumistapa", "Select an embedding model engine": "Valitse upotusmallin moottori", "Select an engine": "Valitse moottori", @@ -1735,7 +1735,7 @@ "Serper API Key": "Serper API -avain", "Serply API Key": "Serply API -avain", "Serpstack API Key": "Serpstack API -avain", - "Server connection failed": "", + "Server connection failed": "Palvelinyhteys epäonnistui", "Server connection verified": "Palvelinyhteys vahvistettu", "Session": "Istunto", "Set as default": "Aseta oletukseksi", @@ -1936,7 +1936,7 @@ "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 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": "", + "Thought": "Ajatus", "Thought for {{DURATION}}": "Ajatteli {{DURATION}}", "Thought for {{DURATION}} seconds": "Ajatteli {{DURATION}} sekuntia", "Thought for less than a second": "Ajatteli alle sekunnin", @@ -1965,7 +1965,7 @@ "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", - "Toggle details": "", + "Toggle details": "Näytä/piilota yksityiskohdat", "Toggle Dictation": "Sanelu päälle/pois", "Toggle Sidebar": "Näytä/piilota sivupalkki", "Toggle status history": "Näytä/piilota tilahistoria", From 1994d65306bbcc7406584e1bfef82f5d353fc91c Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 26 Mar 2026 17:26:06 -0500 Subject: [PATCH 02/22] fix: bs4 pip install --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 7883a459e..7a546e935 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,6 +80,7 @@ dependencies = [ "msoffcrypto-tool==6.0.0", "nltk==3.9.3", "Markdown==3.10.2", + "beautifulsoup4==4.14.3", "pypandoc==1.16.2", "pandas==3.0.1", "openpyxl==3.1.5", From 0bdcb5a3374593a9f02a389a0a6eb2768a960f53 Mon Sep 17 00:00:00 2001 From: joaoback <156559121+joaoback@users.noreply.github.com> Date: Thu, 26 Mar 2026 19:31:12 -0300 Subject: [PATCH 03/22] Merge pull request #23110 from joaoback/patch-33 i18n: add pt-BR translations for newly added UI items and consistency pass --- src/lib/i18n/locales/pt-BR/translation.json | 24 ++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index 7fb6be333..69ca74395 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -332,10 +332,10 @@ "Click here to upload a workflow.json file.": "Clique aqui para enviar um arquivo workflow.json.", "click here.": "clique aqui.", "Click on the user role button to change a user's role.": "Clique no botão de perfil do usuário para alterar o perfil de um usuário.", - "Click to connect": "", + "Click to connect": "Clique para conectar", "Click to copy ID": "Clique para copiar o ID", - "Client ID": "", - "Client Secret": "", + "Client ID": "ID do Cliente", + "Client Secret": "Chave Secreta do Cliente", "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permissão de escrita na área de transferência negada. Verifique as configurações do seu navegador para conceder o acesso necessário.", "Clone": "Clonar", "Clone Chat": "Clonar Chat", @@ -823,8 +823,8 @@ "Experimental": "Experimental", "Explain": "Explicar", "Explore the cosmos": "Explorar o cosmos", - "Explored": "", - "Exploring": "", + "Explored": "Explorado", + "Exploring": "Explorando", "Export": "Exportar", "Export All Archived Chats": "Exportar todos os chats arquivados", "Export All Chats (All Users)": "Exportar Todos os Chats (Todos os Usuários)", @@ -1387,7 +1387,7 @@ "November": "Novembro", "OAuth": "OAuth", "OAuth 2.1": "OAuth 2.1", - "OAuth 2.1 (Static)": "", + "OAuth 2.1 (Static)": "OAuth 2.1 (Estático)", "OAuth ID": "OAuth ID", "October": "Outubro", "Off": "Desligado", @@ -1498,7 +1498,7 @@ "Playwright Timeout (ms)": "Tempo limite do Playwright (ms)", "Playwright WebSocket URL": "URL do WebSocket do Playwright", "Please carefully review the following warnings:": "Por favor, revise cuidadosamente os seguintes avisos:", - "Please connect all required integrations before sending a message": "", + "Please connect all required integrations before sending a message": "Conecte todas as integrações necessárias antes de enviar uma mensagem", "Please do not close the settings page while loading the model.": "Não feche a página de configurações enquanto estiver carregando o modelo.", "Please enter a message or attach a file.": "Por favor, insira uma mensagem ou anexe um arquivo.", "Please enter a prompt": "Por favor, digite um prompt", @@ -1507,7 +1507,7 @@ "Please enter a valid path": "Por favor, insira um caminho válido", "Please enter a valid URL": "Por favor, insira uma URL válida", "Please enter a valid URL.": "Por favor, insira uma URL válida", - "Please enter Client ID and Client Secret": "", + "Please enter Client ID and Client Secret": "Insira o ID do Cliente e a Chave Secreta do Cliente", "Please fill in all fields.": "Por favor, preencha todos os campos.", "Please register the OAuth client": "Por favor, registre o cliente OAuth", "Please save the connection to persist the OAuth client information and do not change the ID": "Salve a conexão para persistir as informações do cliente OAuth e não altere o ID", @@ -1554,8 +1554,8 @@ "Querying": "Consultando", "Quick Actions": "Ações rápidas", "RAG Template": "Modelo RAG", - "Ran {{COUNT}} analyses": "", - "Ran {{COUNT}} analysis": "", + "Ran {{COUNT}} analyses": "Executou {{COUNT}} análises", + "Ran {{COUNT}} analysis": "Executou {{COUNT}} análise", "Rate {{rating}} out of 10": "Avaliar {{rating}} de 10", "Rating": "Avaliação", "Re-rank models by topic similarity": "Reclassificação de modelos por similaridade de tópico", @@ -1938,7 +1938,7 @@ "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 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": "", + "Thought": "Pensamento", "Thought for {{DURATION}}": "Pensado por {{DURATION}}", "Thought for {{DURATION}} seconds": "Pensado por {{DURATION}} segundos", "Thought for less than a second": "Pensou por menos de um segundo", @@ -1967,7 +1967,7 @@ "Today at {{LOCALIZED_TIME}}": "Hoje às {{LOCALIZED_TIME}}", "Toggle {{COUNT}} sources": "Alternar {{COUNT}} origens", "Toggle 1 source": "Alternar 1 origem", - "Toggle details": "", + "Toggle details": "Alternar detalhes", "Toggle Dictation": "Alternar Ditado", "Toggle Sidebar": "Alternar barra lateral", "Toggle status history": "Alternar histórico de status", From 0472017cab71dabf602532821556e23c2aa57e8f Mon Sep 17 00:00:00 2001 From: Shirasawa <764798966@qq.com> Date: Fri, 27 Mar 2026 06:31:19 +0800 Subject: [PATCH 04/22] i18n: improve zh-CN translation (#23102) * i18n: improve zh-CN translation * i18n: improve zh-TW translation * i18n: improve zh-CN translation --- src/lib/i18n/locales/zh-CN/translation.json | 134 ++++++++++---------- src/lib/i18n/locales/zh-TW/translation.json | 78 ++++++------ 2 files changed, 106 insertions(+), 106 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 51c888851..b75e68dea 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -11,13 +11,13 @@ "{{ models }}": "{{ models }}", "{{COUNT}} Available Tools": "{{COUNT}} 个可用工具", "{{COUNT}} characters": "{{COUNT}} 个字符", - "{{COUNT}} extracted lines": "已提取 {{COUNT}} 行", + "{{COUNT}} extracted lines": "已提取 {{COUNT}} 行文本", "{{COUNT}} files": "{{COUNT}} 个文件", - "{{COUNT}} hidden lines": "{{COUNT}} 行被隐藏", + "{{COUNT}} hidden lines": "已隐藏 {{COUNT}} 行代码", "{{COUNT}} members": "{{COUNT}} 位成员", "{{COUNT}} Replies": "{{COUNT}} 条回复", "{{COUNT}} Rows": "{{COUNT}} 行", - "{{count}} selected_other": "", + "{{count}} selected_other": "已选择 {{count}} 项", "{{COUNT}} Sources": "{{COUNT}} 个引用来源", "{{COUNT}} words": "{{COUNT}} 个字", "{{COUNT}}d_time_ago": "{{COUNT}}天前", @@ -35,7 +35,7 @@ "1 Source": "1 个引用来源", "1m_time_ago": "刚刚", "A collaboration channel where people join as members": "成员可加入的协作频道", - "A discussion channel where access is controlled by groups and permissions": "由权限组控制的讨论频道", + "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 task model is used when performing tasks such as generating titles for chats and web search queries": "任务模型用于执行生成对话标题和联网搜索查询等任务", @@ -65,7 +65,7 @@ "Add a tag": "添加标签", "Add a tag...": "添加标签...", "Add Access": "添加访问", - "Add Arena Model": "添加竞技场模型", + "Add Arena Model": "添加盲测模型", "Add Connection": "添加连接", "Add Content": "添加内容", "Add content here": "在此添加内容", @@ -86,7 +86,7 @@ "Add text content": "添加文本内容", "Add to favorites": "添加到收藏", "Add User": "添加用户", - "Add User Group": "添加权限组", + "Add User Group": "添加用户组", "Add webpage": "添加网页", "Add your Open Terminal URL and API key in Settings → Integrations.": "请到“设置 → 集成”中配置 Open Terminal 的地址和密钥。", "Additional Config": "额外配置项", @@ -128,7 +128,7 @@ "Allow File Upload": "允许上传文件", "Allow Multiple Models in Chat": "允许在对话中使用多个模型", "Allow non-local voices": "允许调用非本土音色", - "Allow public write access": "", + "Allow public write access": "允许公开写入", "Allow Rate Response": "允许对回答进行评价", "Allow Regenerate Response": "允许重新生成回答", "Allow Sharing With Users": "允许分享给其他用户", @@ -183,13 +183,13 @@ "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 unarchive all archived chats?": "您确认要取消所有已归档的对话吗?", - "Arena Models": "启用竞技场匿名评价模型", + "Arena Models": "模型盲测", "Artifacts": "产物", "Asc": "升序", "Ask": "提问", @@ -330,10 +330,10 @@ "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": "点击复制 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": "克隆对话", @@ -385,7 +385,7 @@ "Configure": "配置", "Confirm": "确认", "Confirm Password": "确认密码", - "Confirm Prompt from Embed": "", + "Confirm Prompt from Embed": "确认嵌入提示词", "Confirm your action": "确认要继续吗?", "Confirm your new password": "确认新密码", "Confirm Your Password": "确认您的密码", @@ -394,7 +394,7 @@ "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 接口格式的接口", "Connect to your own OpenAPI compatible external tool servers.": "连接到符合 OpenAPI 规范的外部工具服务器", - "Connected ({{type}})": "", + "Connected ({{type}})": "已连接({{type}})", "Connection failed": "连接失败", "Connection successful": "连接成功", "Connection Type": "连接类型", @@ -435,7 +435,7 @@ "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": "", + "CPU": "CPU", "Create": "创建", "Create a knowledge base": "创建知识库", "Create a model": "创建模型", @@ -484,7 +484,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": "默认模型已更新", @@ -507,7 +507,7 @@ "Delete File": "删除文件", "Delete folder?": "要删除此分组吗?", "Delete function?": "要删除此函数吗?", - "Delete Memory?": "", + "Delete Memory?": "要删除这条记忆吗?", "Delete Message": "删除消息", "Delete message?": "要删除此消息吗?", "Delete Model": "删除模型", @@ -521,7 +521,7 @@ "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": "降序", @@ -530,7 +530,7 @@ "Describe what changed...": "描述变更内容…", "Describe your knowledge base and objectives": "描述您的知识库和目标", "Description": "描述", - "Deselect": "", + "Deselect": "取消选中", "Detect Artifacts Automatically": "自动检测对话产物", "Dictate": "语音输入", "Didn't fully follow instructions": "没有完全遵循指令", @@ -555,7 +555,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": "在通话中显示 Emoji", @@ -591,7 +591,7 @@ "Download canceled": "下载已取消", "Download Database": "下载数据库", "Downloading stats...": "正在下载统计数据...", - "Draw": "平局", + "Draw": "持平", "Drop any files here to upload": "拖拽文件至此上传", "Drop files here": "请将文件拖到此处", "Drop files here to upload": "将文件拖到此处即可上传", @@ -620,7 +620,7 @@ "e.g., en-US,ja-JP (leave blank for auto-detect)": "例如:en-US,ja-JP(留空则自动检测)", "e.g., westus (leave blank for eastus)": "例如:westus(留空则默认为 eastus)", "Edit": "编辑", - "Edit Arena Model": "编辑竞技场模型", + "Edit Arena Model": "编辑盲测模型", "Edit Channel": "编辑频道", "Edit Connection": "编辑连接", "Edit Default Permissions": "编辑默认权限", @@ -789,12 +789,12 @@ "Enter Your Name": "输入您的名称", "Enter your new password": "输入您的新密码", "Enter Your Password": "输入您的密码", - "Enter Your Role": "输入您的权限组", + "Enter Your Role": "输入您的用户组", "Enter Your Username": "输入您的用户名", "Enter your webhook URL": "输入您的 Webhook 链接", "Entra ID": "Entra ID", - "Environment Variables": "", - "Ephemeral": "", + "Environment Variables": "环境变量", + "Ephemeral": "临时", "Error": "错误", "ERROR": "错误", "Error accessing directory": "访问目录时出错", @@ -805,7 +805,7 @@ "Error uploading file: {{error}}": "上传文件时出错:{{error}}", "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": "竞技场评估", + "Evaluations": "模型评价", "Exa API Key": "Exa 接口密钥", "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "例如:(&(objectClass=inetOrgPerson)(uid=%s))", "Example: ALL": "例如:ALL", @@ -821,8 +821,8 @@ "Experimental": "实验性", "Explain": "解释", "Explore the cosmos": "探索星辰", - "Explored": "", - "Exploring": "", + "Explored": "已分析", + "Exploring": "分析中", "Export": "导出", "Export All Archived Chats": "导出所有已存档对话", "Export All Chats (All Users)": "导出所有用户对话", @@ -873,7 +873,7 @@ "Failed to save connections": "保存连接失败", "Failed to save conversation": "保存对话失败", "Failed to save models configuration": "保存模型配置失败", - "Failed to save policy: {{error}}": "", + "Failed to save policy: {{error}}": "保存策略失败:{{error}}", "Failed to save terminal servers": "终端服务器保存失败", "Failed to unshare chat.": "取消对话分享失败。", "Failed to update settings": "更新设置失败", @@ -889,7 +889,7 @@ "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": "文件已被添加到对话中", @@ -944,7 +944,7 @@ "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 访问令牌(Access Token)以进行身份验证", "Forwards system user session credentials to authenticate": "转发用户的会话凭证(Session Credentials)以进行身份验证", "Full Context Mode": "完整上下文模式", @@ -992,13 +992,13 @@ "Grid": "网格", "Grokipedia": "Grokipedia", "Group Channel": "群组频道", - "Group created successfully": "权限组创建成功", - "Group deleted successfully": "权限组删除成功", - "Group Description": "权限组描述", - "Group Name": "权限组名称", - "Group updated successfully": "权限组更新成功", - "groups": "权限组", - "Groups": "权限组", + "Group created successfully": "用户组创建成功", + "Group deleted successfully": "用户组删除成功", + "Group Description": "用户组描述", + "Group Name": "用户组名称", + "Group updated successfully": "用户组更新成功", + "groups": "用户组", + "Groups": "用户组", "H1": "一级标题", "H2": "二级标题", "H3": "三级标题", @@ -1032,7 +1032,7 @@ "ID": "ID", "ID cannot contain \":\" or \"|\" characters": "ID 中不允许包含 “:” 或 “|” 字符", "ID copied to clipboard": "已复制 ID 到剪贴板", - "Idle Timeout": "", + "Idle Timeout": "无操作超时时间", "iframe Sandbox Allow Forms": "iframe 沙盒允许表单提交", "iframe Sandbox Allow Same Origin": "iframe 沙盒允许同源访问", "Ignite curiosity": "点燃求知", @@ -1179,7 +1179,7 @@ "Local": "本地", "Local Task Model": "本地任务模型", "Location access not allowed": "不允许访问位置信息", - "Lost": "落败", + "Lost": "较差", "Low": "低", "LTR": "从左至右", "Made by Open WebUI Community": "由 Open WebUI 社区开发", @@ -1203,7 +1203,7 @@ "Max Speakers": "最大扬声器数量", "Max Upload Count": "最大上传数量", "Max Upload Size": "最大上传大小", - "Maximum characters to return from fetched URLs. Leave empty for no limit.": "", + "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 个模型,请稍后重试。", @@ -1235,7 +1235,7 @@ "Microsoft OneDrive": "Microsoft OneDrive", "Microsoft OneDrive (personal)": "Microsoft OneDrive(个人账户)", "Microsoft OneDrive (work/school)": "Microsoft OneDrive(工作或学校账户)", - "min": "", + "min": "分钟", "MinerU": "MinerU", "MinerU API Key required for Cloud API mode.": "使用 MinerU 云服务模式需要接口密钥。", "Mistral OCR": "Mistral OCR", @@ -1301,7 +1301,7 @@ "New File": "新建文件", "New Folder": "创建分组", "New Function": "新函数", - "New Group": "新建权限组", + "New Group": "新建用户组", "New Knowledge": "创建知识库", "New Model": "创建模型", "New Note": "创建笔记", @@ -1334,14 +1334,14 @@ "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 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 knowledge found": "未找到知识", - "No limit": "", + "No limit": "无限制", "No memories to clear": "记忆为空,无须清理", "No model IDs": "没有模型 ID", "No models available": "暂无可用模型", @@ -1385,7 +1385,7 @@ "November": "十一月", "OAuth": "OAuth", "OAuth 2.1": "OAuth 2.1", - "OAuth 2.1 (Static)": "", + "OAuth 2.1 (Static)": "OAuth 2.1(静态)", "OAuth ID": "OAuth ID", "October": "十月", "Off": "关闭", @@ -1415,7 +1415,7 @@ "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": "管理快捷操作浮窗", @@ -1476,7 +1476,7 @@ "Perplexity Model": "Perplexity 模型", "Perplexity Search API URL": "Perplexity 搜索接口地址", "Perplexity Search Context Usage": "Perplexity 搜索上下文用量", - "Persistent": "", + "Persistent": "持久化", "Personalization": "个性化", "Pin": "置顶", "Pinned": "已置顶", @@ -1496,7 +1496,7 @@ "Playwright Timeout (ms)": "Playwright 超时时间 (ms)", "Playwright WebSocket URL": "Playwright WebSocket 地址", "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": "请输入提示词", @@ -1505,7 +1505,7 @@ "Please enter a valid path": "请输入有效路径", "Please enter a valid URL": "请输入有效的地址", "Please enter a valid URL.": "请输入有效的地址。", - "Please enter Client ID and Client Secret": "", + "Please enter Client ID and Client Secret": "请输入客户端 ID 和客户端密钥", "Please fill in all fields.": "请填写所有字段。", "Please register the OAuth client": "请注册 OAuth 客户端", "Please save the connection to persist the OAuth client information and do not change the ID": "请保存连接以保留 OAuth 客户端信息,并确保不要更改 ID", @@ -1515,7 +1515,7 @@ "Please select a valid JSON file": "请选择合法的 JSON 文件", "Please select at least one user for Direct Message channel.": "请至少选择一个用户以创建私聊频道。", "Please wait until all files are uploaded.": "请等待所有文件上传完毕。", - "Policy ID": "", + "Policy ID": "策略 ID", "Port": "端口", "Ports": "端口", "Positive attitude": "态度积极", @@ -1552,8 +1552,8 @@ "Querying": "查询中", "Quick Actions": "快捷操作", "RAG Template": "RAG 提示词模板", - "Ran {{COUNT}} analyses": "", - "Ran {{COUNT}} analysis": "", + "Ran {{COUNT}} analyses": "已完成 {{COUNT}} 次分析", + "Ran {{COUNT}} analysis": "已完成 {{COUNT}} 次分析", "Rate {{rating}} out of 10": "评分:{{rating}}/10", "Rating": "评价", "Re-rank models by topic similarity": "根据主题相似性对模型重新排名", @@ -1597,7 +1597,7 @@ "Remove image": "移除图像", "Remove Model": "移除模型", "Rename": "重命名", - "Renamed to {{name}}": "", + "Renamed to {{name}}": "已重命名为 {{name}}", "Render Markdown in Previews": "在文件和引用预览中渲染 Markdown", "Reorder Models": "重新排序模型", "Reply": "回复", @@ -1659,10 +1659,10 @@ "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": "搜索选项", @@ -1692,7 +1692,7 @@ "Select a conversation to preview": "选择对话进行预览", "Select a engine": "选择搜索引擎", "Select a function": "选择函数", - "Select a group": "选择权限组", + "Select a group": "选择用户组", "Select a language": "选择语言", "Select a mode": "选择模式", "Select a model": "选择模型", @@ -1704,7 +1704,7 @@ "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": "选择引擎", @@ -1733,7 +1733,7 @@ "Serper API Key": "Serper 接口密钥", "Serply API Key": "Serply 接口密钥", "Serpstack API Key": "Serpstack 接口密钥", - "Server connection failed": "", + "Server connection failed": "服务器连接失败", "Server connection verified": "已验证服务器连接", "Session": "用户会话(Session)", "Set as default": "设为默认", @@ -1835,7 +1835,7 @@ "Stop Download": "停止下载", "Stop Generating": "停止生成", "Stop Sequence": "停止序列 (Stop Sequence)", - "Storage": "", + "Storage": "存储", "Stream Chat Response": "流式对话响应 (Stream Chat Response)", "Stream Delta Chunk Size": "流式增量输出的分块大小(Stream Delta Chunk Size)", "Streamable HTTP": "流式 HTTP", @@ -1934,7 +1934,7 @@ "This will delete all models including custom models and 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 秒", @@ -1963,7 +1963,7 @@ "Today at {{LOCALIZED_TIME}}": "今天 {{LOCALIZED_TIME}}", "Toggle {{COUNT}} sources": "展开/收起 {{COUNT}} 个来源", "Toggle 1 source": "展开/收起 1 个来源", - "Toggle details": "", + "Toggle details": "展开/收起详情", "Toggle Dictation": "切换为听写模式", "Toggle Sidebar": "展开或收起侧边栏", "Toggle status history": "展开/收起历史状态", @@ -2050,7 +2050,7 @@ "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/chat/completions 接口替换 /v1/audio/transcriptions 以提高准确性。", "Use Chat Completions API": "使用 Chat Completions 接口", - "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 环境变量指定的代理获取页面内容", @@ -2070,7 +2070,7 @@ "Uses OAuth 2.1 Dynamic Client Registration": "使用 OAuth 2.1 的动态客户端注册机制", "Using Entire Document": "使用完整文档", "Using Focused Retrieval": "使用聚焦检索", - "Using the default arena model with all models. Click the plus button to add custom models.": "竞技场模型默认使用所有模型。点击上方的“+”按钮以添加自定义模型", + "Using the default arena model with all models. Click the plus button to add custom models.": "默认会使用全部模型进行盲测。点击上方“+”可添加自定义盲测模型。", "Valid time units:": "有效时间单位:", "Validate certificate": "验证证书合法性", "Valves": "配置项", @@ -2131,7 +2131,7 @@ "Widescreen Mode": "宽屏模式", "Width": "宽度", "Wikipedia": "维基百科", - "Won": "获胜", + "Won": "更好", "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": "工作空间权限", diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 0d2006c79..363309c72 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -17,7 +17,7 @@ "{{COUNT}} members": "{{COUNT}} 位成員", "{{COUNT}} Replies": "{{COUNT}} 回覆", "{{COUNT}} Rows": "{{COUNT}} 行", - "{{count}} selected_other": "", + "{{count}} selected_other": "已選取 {{count}} 項", "{{COUNT}} Sources": "{{COUNT}} 個來源", "{{COUNT}} words": "{{COUNT}} 個詞", "{{COUNT}}d_time_ago": "{{COUNT}} 天前", @@ -128,7 +128,7 @@ "Allow File Upload": "允許上傳檔案", "Allow Multiple Models in Chat": "允許在對話中使用多個模型", "Allow non-local voices": "允許非本機語音", - "Allow public write access": "", + "Allow public write access": "允許公開寫入", "Allow Rate Response": "允許為回應評分", "Allow Regenerate Response": "允許重新產生回應", "Allow Sharing With Users": "允許與其他使用者分享", @@ -183,8 +183,8 @@ "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?": "確定要刪除嗎?", @@ -330,10 +330,10 @@ "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 connect": "點選以連線", "Click to copy ID": "點擊複製 ID", - "Client ID": "", - "Client Secret": "", + "Client ID": "用戶端 ID", + "Client Secret": "用戶端金鑰", "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "剪貼簿寫入權限遭拒。請檢查您的瀏覽器設定,授予必要的存取權限。", "Clone": "複製", "Clone Chat": "複製對話", @@ -385,7 +385,7 @@ "Configure": "設定", "Confirm": "確認", "Confirm Password": "確認密碼", - "Confirm Prompt from Embed": "", + "Confirm Prompt from Embed": "確認嵌入提示詞", "Confirm your action": "確認您的操作", "Confirm your new password": "確認您的新密碼", "Confirm Your Password": "確認您的密碼", @@ -394,7 +394,7 @@ "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 successful": "連線成功", "Connection Type": "連線類型", @@ -435,7 +435,7 @@ "Copying to clipboard was successful!": "成功複製到剪貼簿!", "CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS 必須由供應商正確設定,以允許來自 Open WebUI 的請求。", "Could not read file.": "無法讀取檔案。", - "CPU": "", + "CPU": "CPU", "Create": "建立", "Create a knowledge base": "建立知識", "Create a model": "建立模型", @@ -507,7 +507,7 @@ "Delete File": "刪除檔案", "Delete folder?": "刪除資料夾?", "Delete function?": "刪除函式?", - "Delete Memory?": "", + "Delete Memory?": "要刪除這筆記憶嗎?", "Delete Message": "刪除訊息", "Delete message?": "刪除訊息?", "Delete Model": "刪除模型", @@ -521,7 +521,7 @@ "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": "降序", @@ -530,7 +530,7 @@ "Describe what changed...": "描述變更內容…", "Describe your knowledge base and objectives": "描述您的知識庫和目標", "Description": "描述", - "Deselect": "", + "Deselect": "取消選取", "Detect Artifacts Automatically": "自動偵測對話產物", "Dictate": "語音輸入", "Didn't fully follow instructions": "未完全遵循指示", @@ -793,8 +793,8 @@ "Enter Your Username": "輸入您的使用者名稱", "Enter your webhook URL": "輸入您的 webhook URL", "Entra ID": "Entra ID", - "Environment Variables": "", - "Ephemeral": "", + "Environment Variables": "環境變數", + "Ephemeral": "暫時性", "Error": "錯誤", "ERROR": "錯誤", "Error accessing directory": "存取目錄時發生錯誤", @@ -821,8 +821,8 @@ "Experimental": "實驗性功能", "Explain": "解釋", "Explore the cosmos": "探索宇宙", - "Explored": "", - "Exploring": "", + "Explored": "已分析", + "Exploring": "分析中", "Export": "匯出", "Export All Archived Chats": "匯出所有已封存的對話", "Export All Chats (All Users)": "匯出所有對話紀錄(所有使用者)", @@ -873,7 +873,7 @@ "Failed to save connections": "儲存連線失敗", "Failed to save conversation": "儲存對話失敗", "Failed to save models configuration": "儲存模型設定失敗", - "Failed to save policy: {{error}}": "", + "Failed to save policy: {{error}}": "儲存策略失敗:{{error}}", "Failed to save terminal servers": "終端伺服器儲存失敗", "Failed to unshare chat.": "取消分享對話失敗。", "Failed to update settings": "更新設定失敗", @@ -889,7 +889,7 @@ "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": "檔案已加入對話中", @@ -944,7 +944,7 @@ "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 存取權杖(Access Token)以進行驗證", "Forwards system user session credentials to authenticate": "轉發使用者工作階段憑證(Session Credentials)以進行驗證", "Full Context Mode": "完整上下文模式", @@ -1032,7 +1032,7 @@ "ID": "ID", "ID cannot contain \":\" or \"|\" characters": "ID 不能包含 \":\" 或 \"|\" 字元", "ID copied to clipboard": "ID 已複製到剪貼簿", - "Idle Timeout": "", + "Idle Timeout": "閒置逾時時間", "iframe Sandbox Allow Forms": "iframe 沙盒允許表單", "iframe Sandbox Allow Same Origin": "iframe 沙盒允許同源", "Ignite curiosity": "點燃好奇心", @@ -1203,7 +1203,7 @@ "Max Speakers": "最大發言者數量", "Max Upload Count": "最大上傳數量", "Max Upload Size": "最大上傳大小", - "Maximum characters to return from fetched URLs. Leave empty for no limit.": "", + "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 個模型。請稍後再試。", @@ -1235,7 +1235,7 @@ "Microsoft OneDrive": "Microsoft OneDrive", "Microsoft OneDrive (personal)": "Microsoft OneDrive(個人版)", "Microsoft OneDrive (work/school)": "Microsoft OneDrive(公司版/學校版)", - "min": "", + "min": "分鐘", "MinerU": "MinerU", "MinerU API Key required for Cloud API mode.": "使用 MinerU 雲端服務模式需要 API 金鑰。", "Mistral OCR": "Mistral OCR", @@ -1341,7 +1341,7 @@ "No kernel": "無核心", "No knowledge bases found.": "未找到知識庫", "No knowledge found": "未找到知識", - "No limit": "", + "No limit": "無限制", "No memories to clear": "沒有記憶可清除", "No model IDs": "沒有模型 ID", "No models available": "暫無可用模型", @@ -1385,7 +1385,7 @@ "November": "11 月", "OAuth": "OAuth", "OAuth 2.1": "OAuth 2.1", - "OAuth 2.1 (Static)": "", + "OAuth 2.1 (Static)": "OAuth 2.1(靜態)", "OAuth ID": "OAuth ID", "October": "10 月", "Off": "關閉", @@ -1415,7 +1415,7 @@ "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": "開啟管理浮動快速操作的彈出視窗", @@ -1476,7 +1476,7 @@ "Perplexity Model": "Perplexity 模型", "Perplexity Search API URL": "Perplexity 搜尋 API URL", "Perplexity Search Context Usage": "Perplexity 搜尋上下文使用量", - "Persistent": "", + "Persistent": "持久性", "Personalization": "個人化", "Pin": "釘選", "Pinned": "已釘選", @@ -1496,7 +1496,7 @@ "Playwright Timeout (ms)": "Playwright 逾時時間(毫秒)", "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": "請輸入提示詞", @@ -1505,7 +1505,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": "請輸入用戶端 ID 與用戶端密鑰", "Please fill in all fields.": "請填寫所有欄位。", "Please register the OAuth client": "請註冊 OAuth 用戶端", "Please save the connection to persist the OAuth client information and do not change the ID": "請儲存連線以保存 OAuth 用戶端資訊,且勿更改 ID", @@ -1515,7 +1515,7 @@ "Please select a valid JSON file": "請選擇有效的 JSON 檔案", "Please select at least one user for Direct Message channel.": "請至少選擇一位使用者以建立直接訊息頻道。", "Please wait until all files are uploaded.": "請等待所有檔案上傳完畢。", - "Policy ID": "", + "Policy ID": "策略 ID", "Port": "連接埠", "Ports": "連接埠", "Positive attitude": "積極的態度", @@ -1552,8 +1552,8 @@ "Querying": "查詢中", "Quick Actions": "快速操作", "RAG Template": "RAG 範本", - "Ran {{COUNT}} analyses": "", - "Ran {{COUNT}} analysis": "", + "Ran {{COUNT}} analyses": "已完成 {{COUNT}} 次分析", + "Ran {{COUNT}} analysis": "已完成 {{COUNT}} 次分析", "Rate {{rating}} out of 10": "評分:{{rating}}/10", "Rating": "評分", "Re-rank models by topic similarity": "根據主題相似度重新排序模型", @@ -1597,7 +1597,7 @@ "Remove image": "移除圖片", "Remove Model": "移除模型", "Rename": "重新命名", - "Renamed to {{name}}": "", + "Renamed to {{name}}": "已重新命名為 {{name}}", "Render Markdown in Previews": "在檔案與引用預覽中轉譯 Markdown", "Reorder Models": "重新排序模型", "Reply": "回覆", @@ -1662,7 +1662,7 @@ "Search Groups": "搜尋權限群組", "Search In Models": "在模型中搜尋", "Search Knowledge": "搜尋知識庫", - "Search Memories": "", + "Search Memories": "搜尋記憶", "Search Models": "搜尋模型", "Search Notes": "搜尋筆記", "Search options": "搜尋選項", @@ -1704,7 +1704,7 @@ "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": "選擇引擎", @@ -1733,7 +1733,7 @@ "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": "Session", "Set as default": "設為預設", @@ -1835,7 +1835,7 @@ "Stop Download": "停止下載", "Stop Generating": "停止產生", "Stop Sequence": "停止序列", - "Storage": "", + "Storage": "儲存空間", "Stream Chat Response": "串流式對話回應", "Stream Delta Chunk Size": "串流增量輸出的分塊大小(Stream Delta Chunk Size)", "Streamable HTTP": "串流 HTTP", @@ -1934,7 +1934,7 @@ "This will delete all models including custom models and 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 秒", @@ -1963,7 +1963,7 @@ "Today at {{LOCALIZED_TIME}}": "今天 {{LOCALIZED_TIME}}", "Toggle {{COUNT}} sources": "展開/收合 {{COUNT}} 個來源", "Toggle 1 source": "展開/收合 1 個來源", - "Toggle details": "", + "Toggle details": "展開/收合詳細資訊", "Toggle Dictation": "切換聽寫模式", "Toggle Sidebar": "切換側邊欄", "Toggle status history": "展開/收合歷史狀態", From 0842acad53ad590363381d923b17d576fb386787 Mon Sep 17 00:00:00 2001 From: Aleix Dorca Date: Thu, 26 Mar 2026 23:31:42 +0100 Subject: [PATCH 05/22] i18n: Update catalan translation.json (#23069) --- src/lib/i18n/locales/ca-ES/translation.json | 84 ++++++++++----------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index 81c2028e0..30159febb 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -17,9 +17,9 @@ "{{COUNT}} members": "{{COUNT}} membres", "{{COUNT}} Replies": "{{COUNT}} respostes", "{{COUNT}} Rows": "{{COUNT}} files", - "{{count}} selected_one": "", - "{{count}} selected_many": "", - "{{count}} selected_other": "", + "{{count}} selected_one": "{{count}} seleccionat", + "{{count}} selected_many": "{{count}} seleccionats", + "{{count}} selected_other": "{{count}} seleccionats", "{{COUNT}} Sources": "{{COUNT}} fonts", "{{COUNT}} words": "{{COUNT}} paraules", "{{COUNT}}d_time_ago": "{{COUNT}}d", @@ -130,7 +130,7 @@ "Allow File Upload": "Permetre la pujada d'arxius", "Allow Multiple Models in Chat": "Permetre múltiple models al xat", "Allow non-local voices": "Permetre veus no locals", - "Allow public write access": "", + "Allow public write access": "Permetre accés públic d'escriptura", "Allow Rate Response": "Permetre valorar les respostes", "Allow Regenerate Response": "Permetre regenerar respostes", "Allow Sharing With Users": "Permetre compartir amb usuaris", @@ -185,8 +185,8 @@ "Are you sure you want to delete \"{{NAME}}\"?": "Estàs segur que vols eliminar \"{{NAME}}\"?", "Are you sure you want to delete all chats? This action cannot be undone.": "Estàs segur que vols suprimir tots els xats? Aquesta acció no es pot desfer.", "Are you sure you want to delete this channel?": "Estàs segur que vols eliminar aquest canal?", - "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.": "Estàs segur que vols suprimir aquesta connexió? Aquesta acció no es pot desfer.", + "Are you sure you want to delete this memory? This action cannot be undone.": "Estàs segur que vols suprimir aquest record? Aquesta acció no es pot desfer.", "Are you sure you want to delete this message?": "Estàs segur que vols eliminar aquest missatge?", "Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "Estàs segur que vols suprimir aquesta versió? Les versions filles es tornaran a enllaçar amb la versió principal d'aquesta versió.", "Are you sure you want to delete this?": "Estàs segur que vols eliminar això", @@ -332,10 +332,10 @@ "Click here to upload a workflow.json file.": "Clica aquí per pujar un arxiu workflow.json", "click here.": "clica aquí.", "Click on the user role button to change a user's role.": "Clica sobre el botó de rol d'usuari per canviar el rol d'un usuari.", - "Click to connect": "", + "Click to connect": "Fes clic per connectar", "Click to copy ID": "Fes clic per copiar l'ID", - "Client ID": "", - "Client Secret": "", + "Client ID": "ID del client", + "Client Secret": "Secret del client", "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permís d'escriptura al porta-retalls denegat. Comprova els ajustos de navegador per donar l'accés necessari.", "Clone": "Clonar", "Clone Chat": "Clonar el xat", @@ -387,7 +387,7 @@ "Configure": "Configurar", "Confirm": "Confirmar", "Confirm Password": "Confirmar la contrasenya", - "Confirm Prompt from Embed": "", + "Confirm Prompt from Embed": "Confirmar el prompt des de la incrustació", "Confirm your action": "Confirma la teva acció", "Confirm your new password": "Confirma la teva nova contrasenya", "Confirm Your Password": "Confirma la teva contrasenya", @@ -396,7 +396,7 @@ "Connect to Open Terminal instances. All users will have access to file browsing and terminal tools through these servers.": "Connecta't a instàncies d'Open Terminal. Tots els usuaris tindran accés a la navegació de fitxers i a les eines del terminal a través d'aquests servidors.", "Connect to your own OpenAI compatible API endpoints.": "Connecta als teus propis punts de connexió de l'API compatible amb OpenAI", "Connect to your own OpenAPI compatible external tool servers.": "Connecta als teus propis servidors d'eines externs compatibles amb OpenAPI", - "Connected ({{type}})": "", + "Connected ({{type}})": "Connectat ({{type}})", "Connection failed": "La connexió ha fallat", "Connection successful": "Connexió correcta", "Connection Type": "Tipus de connexió", @@ -437,7 +437,7 @@ "Copying to clipboard was successful!": "La còpia al porta-retalls s'ha realitzat correctament", "CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS ha de ser configurat correctament pel proveïdor per permetre les sol·licituds d'Open WebUI", "Could not read file.": "No s'ha pogut llegir l'arxiu", - "CPU": "", + "CPU": "CPU", "Create": "Crear", "Create a knowledge base": "Crear una base de coneixement", "Create a model": "Crear un model", @@ -509,10 +509,10 @@ "Delete File": "Eliminar el fitxer", "Delete folder?": "Eliminar la carpeta?", "Delete function?": "Eliminar funció?", - "Delete Memory?": "", + "Delete Memory?": "Eliminar memòria?", "Delete Message": "Eliminar el missatge", "Delete message?": "Eliminar el missatge?", - "Delete Model": "Eliminar model", + "Delete Model": "Eliminar model?", "Delete note?": "Eliminar la nota?", "Delete prompt?": "Eliminar indicació?", "Delete skill?": "Eliminar l'habilitat?", @@ -523,7 +523,7 @@ "Deleted": "Eliminat", "Deleted {{deleteModelTag}}": "S'ha eliminat {{deleteModelTag}}", "Deleted {{name}}": "S'ha eliminat {{name}}", - "Deleted {{ok}} of {{total}} items": "", + "Deleted {{ok}} of {{total}} items": "S'han eliminat {{ok}} de {{total}} ítems", "Deleted User": "Usuari eliminat", "Deployment names are required for Azure OpenAI": "Els noms de desplegament són requerits per Azure OpenAI", "Desc": "Descendent", @@ -532,7 +532,7 @@ "Describe what changed...": "Descriu què ha canviat...", "Describe your knowledge base and objectives": "Descriu la teva base de coneixement i objectius", "Description": "Descripció", - "Deselect": "", + "Deselect": "Deseleccionar", "Detect Artifacts Automatically": "Detectar automàticament els artefactes", "Dictate": "Dictar", "Didn't fully follow instructions": "No s'han seguit les instruccions completament", @@ -795,8 +795,8 @@ "Enter Your Username": "Introdueix el teu nom d'usuari", "Enter your webhook URL": "Introdueix la URL del webhook", "Entra ID": "Introdueix l'ID", - "Environment Variables": "", - "Ephemeral": "", + "Environment Variables": "Variables d'entorn", + "Ephemeral": "Efímer", "Error": "Error", "ERROR": "ERROR", "Error accessing directory": "Error en accedir al directori", @@ -823,8 +823,8 @@ "Experimental": "Experimental", "Explain": "Explicar", "Explore the cosmos": "Explorar el cosmos", - "Explored": "", - "Exploring": "", + "Explored": "Explorat", + "Exploring": "Explorant", "Export": "Exportar", "Export All Archived Chats": "Exportar tots els xats arxivats", "Export All Chats (All Users)": "Exportar tots els xats (Tots els usuaris)", @@ -875,7 +875,7 @@ "Failed to save connections": "No s'han pogut desar les connexions", "Failed to save conversation": "No s'ha pogut desar la conversa", "Failed to save models configuration": "No s'ha pogut desar la configuració dels models", - "Failed to save policy: {{error}}": "", + "Failed to save policy: {{error}}": "No s'ha pogut desar la política: {{error}}", "Failed to save terminal servers": "No s'han pogut desar els servidors de terminal", "Failed to unshare chat.": "No s'ha pogut deixar de compartir el xat.", "Failed to update settings": "No s'han pogut actualitzar les preferències", @@ -891,7 +891,7 @@ "Feedback History": "Històric de comentaris", "Feel free to add specific details": "Sent-te lliure d'afegir detalls específics", "Female": "Dona", - "Fetch URL Content Length Limit": "", + "Fetch URL Content Length Limit": "Límit de longitud del contingut de l'URL", "File": "Arxiu", "File added successfully.": "L'arxiu s'ha afegit correctament.", "File attached to chat": "L'arxiu s'ha adjuntat al xat", @@ -946,7 +946,7 @@ "Format Lines": "Formatar les línies", "Format the lines in the output. Defaults to False. If set to True, the lines will be formatted to detect inline math and styles.": "Formata les línies a la sortida. Per defecte, és Fals. Si es defineix com a Cert, les línies es formataran per detectar matemàtiques i estils en línia.", "Formatting may be inconsistent from source.": "La formatació pot ser inconsistent amb l'origen", - "Forward": "", + "Forward": "Endavant", "Forwards system user OAuth access token to authenticate": "Reenvia el testimoni d'accés OAuth de l'usuari del sistema per autenticar-se.", "Forwards system user session credentials to authenticate": "Envia les credencials de l'usuari del sistema per autenticar", "Full Context Mode": "Mode de context complert", @@ -1034,7 +1034,7 @@ "ID": "ID", "ID cannot contain \":\" or \"|\" characters": "L'ID no pot contenir caràcters \":\" ni \"|\"", "ID copied to clipboard": "L'ID s'ha copiat al portaretalls", - "Idle Timeout": "", + "Idle Timeout": "Temps d'espera d'inactivitat", "iframe Sandbox Allow Forms": "Permetre formularis sandbox iframe", "iframe Sandbox Allow Same Origin": "Permetre same-origin sandbox iframe", "Ignite curiosity": "Despertar la curiositat", @@ -1205,7 +1205,7 @@ "Max Speakers": "Nombre màxim d'altaveus", "Max Upload Count": "Nombre màxim de càrregues", "Max Upload Size": "Mida màxima de càrrega", - "Maximum characters to return from fetched URLs. Leave empty for no limit.": "", + "Maximum characters to return from fetched URLs. Leave empty for no limit.": "Caràcters màxims que es retornen de les URL recuperades. Deixa-ho en blanc si no hi ha límit.", "Maximum number of files allowed per folder.": "Nombre màxim de fitxers permès per carpeta.", "Maximum number of files per folder is {{max}}.": "El nombre màxim de fitxers per carpeta és {{max}}.", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es poden descarregar un màxim de 3 models simultàniament. Si us plau, prova-ho més tard.", @@ -1237,7 +1237,7 @@ "Microsoft OneDrive": "Microsoft OneDrive", "Microsoft OneDrive (personal)": "Microsoft OneDrive (personal)", "Microsoft OneDrive (work/school)": "Microsoft OneDrive (feina/escola)", - "min": "", + "min": "mínim", "MinerU": "MinerU", "MinerU API Key required for Cloud API mode.": "És necessària la clau API de MinerU pel mode Cloud API", "Mistral OCR": "Mistral OCR", @@ -1343,7 +1343,7 @@ "No kernel": "No hi ha cap kernel", "No knowledge bases found.": "No s'han trobat bases de coneixement.", "No knowledge found": "No s'ha trobat Coneixement", - "No limit": "", + "No limit": "Sense límit", "No memories to clear": "No hi ha memòries per netejar", "No model IDs": "No hi ha IDs de model", "No models available": "No hi ha models disponibles", @@ -1387,7 +1387,7 @@ "November": "Novembre", "OAuth": "OAuth", "OAuth 2.1": "OAuth 2.1", - "OAuth 2.1 (Static)": "", + "OAuth 2.1 (Static)": "OAuth 2.1 (Estàtic)", "OAuth ID": "ID OAuth", "October": "Octubre", "Off": "Desactivat", @@ -1417,7 +1417,7 @@ "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ui! Estàs utilitzant un mètode no suportat (només frontend). Si us plau, serveix la WebUI des del backend.", "Open file": "Obrir arxiu", "Open in full screen": "Obrir en pantalla complerta", - "Open in new tab": "", + "Open in new tab": "Obrir en una nova pestanya", "Open link": "Obrir l'enllaç", "Open modal to configure connection": "Obre el modal per configurar la connexió", "Open Modal To Manage Floating Quick Actions": "Obre el model per configurar les Accions ràpides flotants", @@ -1478,7 +1478,7 @@ "Perplexity Model": "Model de Perplexity", "Perplexity Search API URL": "URL API per a Perplexity Search", "Perplexity Search Context Usage": "Utilització del context de cerca de Perplexity", - "Persistent": "", + "Persistent": "Persistent", "Personalization": "Personalització", "Pin": "Fixar", "Pinned": "Fixat", @@ -1498,7 +1498,7 @@ "Playwright Timeout (ms)": "Temps d'espera (ms) de Playwright", "Playwright WebSocket URL": "URL del WebSocket de Playwright", "Please carefully review the following warnings:": "Si us plau, revisa els següents avisos amb cura:", - "Please connect all required integrations before sending a message": "", + "Please connect all required integrations before sending a message": "Si us plau, connecta totes les integracions necessàries abans d'enviar un missatge.", "Please do not close the settings page while loading the model.": "No tanquis la pàgina de configuració mentre carregues el model.", "Please enter a message or attach a file.": "Introdueix un missatge o adjunta un arxiu", "Please enter a prompt": "Si us plau, entra una indicació", @@ -1507,7 +1507,7 @@ "Please enter a valid path": "Si us plau, entra un camí vàlid", "Please enter a valid URL": "Si us plau, entra una URL vàlida", "Please enter a valid URL.": "Si us plau, entra una URL vàlida.", - "Please enter Client ID and Client Secret": "", + "Please enter Client ID and Client Secret": "Si us plau, introdueix l'ID de client i el secret del client.", "Please fill in all fields.": "Emplena tots els camps, si us plau.", "Please register the OAuth client": "Si us plau, registra el client OAuth", "Please save the connection to persist the OAuth client information and do not change the ID": "Si us plau, desa la connexió per conservar la informació del client OAuth i no canviïs l'ID.", @@ -1517,7 +1517,7 @@ "Please select a valid JSON file": "Si us plau, selecciona un arxiu JSON vàlid", "Please select at least one user for Direct Message channel.": "Selecciona com a mínim un usuari per al canal de missatge directe.", "Please wait until all files are uploaded.": "Si us plau, espera fins que s'hagin carregat tots els fitxers.", - "Policy ID": "", + "Policy ID": "ID de política", "Port": "Port", "Ports": "Ports", "Positive attitude": "Actitud positiva", @@ -1554,8 +1554,8 @@ "Querying": "Consultes", "Quick Actions": "Accions ràpides", "RAG Template": "Plantilla RAG", - "Ran {{COUNT}} analyses": "", - "Ran {{COUNT}} analysis": "", + "Ran {{COUNT}} analyses": "S'han executat {{COUNT}} anàlisis", + "Ran {{COUNT}} analysis": "S'han executat {{COUNT}} anàlisis", "Rate {{rating}} out of 10": "Nota {{rating} sobre 10", "Rating": "Valoració", "Re-rank models by topic similarity": "Reclassificar els models per similitud de temes", @@ -1599,7 +1599,7 @@ "Remove image": "Eliminar imatge", "Remove Model": "Eliminar el model", "Rename": "Canviar el nom", - "Renamed to {{name}}": "", + "Renamed to {{name}}": "S'ha renombrat a {{name}}", "Render Markdown in Previews": "Compila el Markdown a les previsualitzacions", "Reorder Models": "Reordenar els models", "Reply": "Respondre", @@ -1666,7 +1666,7 @@ "Search Groups": "Cercar grups", "Search In Models": "Cercar als models", "Search Knowledge": "Cercar coneixement", - "Search Memories": "", + "Search Memories": "Cercar memòries", "Search Models": "Cercar models", "Search Notes": "Cercar notes", "Search options": "Opcions de cerca", @@ -1708,7 +1708,7 @@ "Select a theme": "Seleccionar un tema", "Select a tool": "Seleccionar una eina", "Select a voice": "Seleccionar una veu", - "Select All": "", + "Select All": "Seleccionar tot", "Select an auth method": "Seleccionar un mètode d'autenticació", "Select an embedding model engine": "Seleccionar un motor d'incrustació", "Select an engine": "Seleccionar un motor", @@ -1737,7 +1737,7 @@ "Serper API Key": "Clau API de Serper", "Serply API Key": "Clau API de Serply", "Serpstack API Key": "Clau API de Serpstack", - "Server connection failed": "", + "Server connection failed": "La connexió al servidor ha fallat", "Server connection verified": "Connexió al servidor verificada", "Session": "Sessió", "Set as default": "Establir com a predeterminat", @@ -1839,7 +1839,7 @@ "Stop Download": "Aturar la descàrrega", "Stop Generating": "Aturar la generació", "Stop Sequence": "Atura la seqüència", - "Storage": "", + "Storage": "Emmagatzematge", "Stream Chat Response": "Fer streaming de la resposta del xat", "Stream Delta Chunk Size": "Mida del fragment Delta del flux", "Streamable HTTP": "HTTP en estríming", @@ -1938,7 +1938,7 @@ "This will delete all models including custom models and cannot be undone.": "Això eliminarà tots els models incloent els personalitzats i no es pot desfer", "This will reset the knowledge base and sync all files. Do you wish to continue?": "Això restablirà la base de coneixement i sincronitzarà tots els fitxers. Vols continuar?", "Thorough explanation": "Explicació en detall", - "Thought": "", + "Thought": "Pensament", "Thought for {{DURATION}}": "He pensat durant {{DURATION}}", "Thought for {{DURATION}} seconds": "He pensat durant {{DURATION}} segons", "Thought for less than a second": "He pensat menys d'un segon", @@ -1967,7 +1967,7 @@ "Today at {{LOCALIZED_TIME}}": "Avui a les {{LOCALIZED_TIME}}", "Toggle {{COUNT}} sources": "Activa/Desactiva {{COUNT}} fonts", "Toggle 1 source": "Activa/Desactiva 1 font", - "Toggle details": "", + "Toggle details": "Activar/Desactivar els detalls", "Toggle Dictation": "Activa/Desactiva el dictat", "Toggle Sidebar": "Activa/Desactiva la barra lateral", "Toggle status history": "Activa/Desactiva l'estat de l'històric", From 16335f866ea4cedf00c4971963622fcc1fe02d82 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 26 Mar 2026 17:38:23 -0500 Subject: [PATCH 06/22] refac --- backend/open_webui/utils/auth.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/utils/auth.py b/backend/open_webui/utils/auth.py index 280666ff0..c55a8e2c1 100644 --- a/backend/open_webui/utils/auth.py +++ b/backend/open_webui/utils/auth.py @@ -143,8 +143,14 @@ def nt(b): pn, pt = nt(pb) data = json.loads(aesgcm.decrypt(pn, pt, None).decode()) - if not data.get('exp') or data.get('exp') < datetime.now().date(): - return False + + exp = data.get('exp') + if exp: + if isinstance(exp, str): + from datetime import date + exp = date.fromisoformat(exp) + if exp < datetime.now().date(): + return False data_handler(data) return True From c6ed0b07884e54c612ad470747682c1390e19ec6 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 26 Mar 2026 17:40:50 -0500 Subject: [PATCH 07/22] fix --- src/lib/i18n/locales/lt-LT/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/i18n/locales/lt-LT/translation.json b/src/lib/i18n/locales/lt-LT/translation.json index e90a6aa43..a9e3574b2 100644 --- a/src/lib/i18n/locales/lt-LT/translation.json +++ b/src/lib/i18n/locales/lt-LT/translation.json @@ -410,7 +410,7 @@ "Content Extraction Engine": "", "Content lengths (character counts only)": "", "Continue Response": "Tęsti atsakymą", - "Continue with {{provider}}": "Tęsti su {{tiekėju}}", + "Continue with {{provider}}": "Tęsti su {{provider}}", "Continue with Email": "", "Continue with LDAP": "", "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.": "", From 11f52921dc21c2dc61c03f12bcdf6f19140a350c Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 26 Mar 2026 17:40:56 -0500 Subject: [PATCH 08/22] refac --- backend/open_webui/models/files.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/models/files.py b/backend/open_webui/models/files.py index 9a5b8fa40..7a9f77a3b 100644 --- a/backend/open_webui/models/files.py +++ b/backend/open_webui/models/files.py @@ -87,7 +87,7 @@ class FileModelResponse(BaseModel): filename: str data: Optional[dict] = None - meta: FileMeta + meta: Optional[FileMeta] = None created_at: int # timestamp in epoch updated_at: Optional[int] = None # timestamp in epoch, optional for legacy files @@ -246,7 +246,7 @@ def get_file_list( total = query.count() items = [ - FileModel.model_validate(file) + FileModelResponse.model_validate(file, from_attributes=True) for file in query.order_by(File.updated_at.desc(), File.id.desc()).offset(skip).limit(limit).all() ] From a6413257079a52fa4487eda36543f3955d0fbd53 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 26 Mar 2026 18:13:18 -0500 Subject: [PATCH 09/22] refac --- backend/open_webui/routers/configs.py | 45 +++++++++++++++++++ src/lib/apis/configs/index.ts | 34 ++++++++++++++ .../components/AddTerminalServerModal.svelte | 30 +++++++------ .../admin/Settings/Integrations.svelte | 1 - .../Settings/Integrations/Terminals.svelte | 2 +- .../Integrations/Terminals/Connection.svelte | 1 + 6 files changed, 98 insertions(+), 15 deletions(-) diff --git a/backend/open_webui/routers/configs.py b/backend/open_webui/routers/configs.py index e206ea32d..e738090a1 100644 --- a/backend/open_webui/routers/configs.py +++ b/backend/open_webui/routers/configs.py @@ -269,6 +269,51 @@ async def set_terminal_servers_config( } +@router.post('/terminal_servers/verify') +async def verify_terminal_server_connection( + request: Request, form_data: TerminalServerConnection, user=Depends(get_admin_user) +): + """ + Verify the connection to a terminal server by detecting its type. + + Tries GET {url}/api/v1/policies (orchestrator) then GET {url}/api/config + (plain terminal). Returns ``{status: true, type: "orchestrator"|"terminal"}``. + """ + base_url = (form_data.url or '').rstrip('/') + if not base_url: + raise HTTPException(status_code=400, detail='Terminal server URL is required') + + headers = {} + if form_data.auth_type == 'bearer' and form_data.key: + headers['Authorization'] = f'Bearer {form_data.key}' + + try: + async with aiohttp.ClientSession( + trust_env=True, + timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT), + ) as session: + # Orchestrators expose a policies API; plain terminals don't. + try: + async with session.get(f'{base_url}/api/v1/policies', headers=headers) as resp: + if resp.ok: + return {'status': True, 'type': 'orchestrator'} + except Exception: + pass + + # Fall back to open-terminal config endpoint. + try: + async with session.get(f'{base_url}/api/config', headers=headers) as resp: + if resp.ok: + return {'status': True, 'type': 'terminal'} + except Exception: + pass + + except Exception as e: + log.debug(f'Failed to connect to the terminal server: {e}') + + raise HTTPException(status_code=400, detail='Failed to connect to the terminal server') + + @router.post('/tool_servers/verify') async def verify_tool_servers_config(request: Request, form_data: ToolServerConnection, user=Depends(get_admin_user)): """ diff --git a/src/lib/apis/configs/index.ts b/src/lib/apis/configs/index.ts index d2abfe186..2f26d711e 100644 --- a/src/lib/apis/configs/index.ts +++ b/src/lib/apis/configs/index.ts @@ -308,6 +308,40 @@ export const putOrchestratorPolicy = async ( return res; }; +/** + * Verify a terminal server connection via the backend proxy. + * Used for system/admin connections to avoid CORS issues and API key exposure. + */ +export const verifyTerminalServerConnection = async (token: string, connection: object) => { + let error = null; + + const res = await fetch(`${WEBUI_API_BASE_URL}/configs/terminal_servers/verify`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}` + }, + body: JSON.stringify({ + ...connection + }) + }) + .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; +}; + export const verifyToolServerConnection = async (token: string, connection: object) => { let error = null; diff --git a/src/lib/components/AddTerminalServerModal.svelte b/src/lib/components/AddTerminalServerModal.svelte index b70a8b823..466884b3e 100644 --- a/src/lib/components/AddTerminalServerModal.svelte +++ b/src/lib/components/AddTerminalServerModal.svelte @@ -12,12 +12,12 @@ import LockClosed from '$lib/components/icons/LockClosed.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte'; import ConfirmDialog from '$lib/components/common/ConfirmDialog.svelte'; - import { detectTerminalServerType, putOrchestratorPolicy } from '$lib/apis/configs'; + import { detectTerminalServerType, verifyTerminalServerConnection, putOrchestratorPolicy } from '$lib/apis/configs'; import { getTerminalConfig } from '$lib/apis/terminal'; export let show = false; export let edit = false; - export let admin = false; + export let direct = false; export let connection = null; export let onSubmit: Function = () => {}; @@ -110,9 +110,13 @@ verifying = true; try { - if (admin) { - // Admin: detect orchestrator vs terminal - const type = await detectTerminalServerType(_url, key); + if (!direct) { + // System connection: proxy through backend to avoid CORS / key exposure + const result = await verifyTerminalServerConnection( + localStorage.token, + { url: _url, key, auth_type } + ); + const type = result?.type ?? null; if (type) { serverType = type; @@ -137,7 +141,7 @@ toast.error($i18n.t('Server connection failed')); } } else { - // Non-admin: simple terminal verification + // Direct connection: verify from browser const res = await getTerminalConfig(_url, key); if (res) { toast.success($i18n.t('Server connection verified')); @@ -192,7 +196,7 @@ url = url.replace(/\/$/, ''); // Save policy to orchestrator if applicable - if (serverType === 'orchestrator' && admin && policyId) { + if (serverType === 'orchestrator' && !direct && policyId) { try { await putOrchestratorPolicy(url, key, policyId, buildPolicyData()); } catch (err) { @@ -202,7 +206,7 @@ } const result = { - ...(admin && id.trim() ? { id: id.trim() } : {}), + ...(!direct && id.trim() ? { id: id.trim() } : {}), url, key, name, @@ -210,7 +214,7 @@ auth_type, enabled: enabled, config: { - ...(admin ? { access_grants: accessGrants } : {}) + ...(!direct ? { access_grants: accessGrants } : {}) }, // Policy fields ...(serverType ? { server_type: serverType } : {}), @@ -270,7 +274,7 @@ /> - {#if admin} + {#if !direct}