From 673938fd49cad073627985673864cb512dc17880 Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Tue, 25 Aug 2026 21:43:51 -0400 Subject: [PATCH 01/99] Merge pull request #29037 from silentoplayz/fix/admin-models-disabled-hidden fix: restore visibility of disabled models visible in the admin Models list --- src/lib/components/admin/Settings/Models.svelte | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lib/components/admin/Settings/Models.svelte b/src/lib/components/admin/Settings/Models.svelte index 2099a79d1f..33fb351d9d 100644 --- a/src/lib/components/admin/Settings/Models.svelte +++ b/src/lib/components/admin/Settings/Models.svelte @@ -269,6 +269,14 @@ baseModels = await getBaseModels(localStorage.token, selectedTag); allModels = await getModels(localStorage.token); + + const providerModels = await getModels(localStorage.token, null, true); + const allModelIds = new Set(allModels.map((model: ModelListItem) => model.id)); + allModels = [ + ...allModels, + ...providerModels.filter((model: ModelListItem) => !allModelIds.has(model.id)) + ]; + const baseModelIds = new Set(baseModels.map((model: ModelListItem) => model.id)); models = allModels From 2bc122e05ed7dca062d80b2a8742eb77178d5a72 Mon Sep 17 00:00:00 2001 From: joaoback <156559121+joaoback@users.noreply.github.com> Date: Tue, 25 Aug 2026 22:44:12 -0300 Subject: [PATCH 02/99] i18n: add pt-BR translations for newly added UI items and consistency pass (#29029) 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 | 222 ++++++++++---------- 1 file changed, 111 insertions(+), 111 deletions(-) diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index 2a5c4cfbc3..12cdcd1094 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -147,7 +147,7 @@ "Advanced MinerU parsing parameters in JSON format.": "Parâmetros avançados de análise do MinerU em formato JSON.", "Advanced Parameters": "Parâmetros Avançados", "Advanced Params": "Parâmetros Avançados", - "After changing the embedding model, reindex knowledge, knowledge search, and memory vectors for changes to take effect.": "", + "After changing the embedding model, reindex knowledge, knowledge search, and memory vectors for changes to take effect.": "Após alterar o modelo de embedding, reindexe o conhecimento, a pesquisa de conhecimento e os vetores de memória para que as alterações entrem em vigor.", "All": "Tudo", "All Chats": "Todos os chats", "All chats have been unarchived.": "Todos os chats foram desarquivados.", @@ -161,8 +161,8 @@ "All time": "Todo o período", "All Users": "Todos os usuários", "All users and system events": "Todos os usuários e eventos do sistema", - "Allow": "", - "Allow {{NAME}}?": "", + "Allow": "Permitir", + "Allow {{NAME}}?": "Permitir {{NAME}}?", "Allow artifacts to access same-origin browser APIs inside the sandbox.": "Permita que artefatos acessem APIs do navegador da mesma origem dentro do sandbox.", "Allow automatic names for new chats.": "Permita nomes automáticos para novos chats.", "Allow browser notifications for completed responses.": "Permita notificações do navegador para respostas concluídas.", @@ -179,7 +179,7 @@ "Allow Continue Response": "Permitir Resposta Contínua", "Allow delegated sub-agents to keep running while the parent chat continues.": "Permita que subagentes delegados continuem em execução enquanto o chat principal prossegue.", "Allow Delete Messages": "Permitir Exclusão de Mensagens", - "Allow downloads inside sandboxed iframes.": "", + "Allow downloads inside sandboxed iframes.": "Permitir downloads dentro de iframes em sandbox.", "Allow File Upload": "Permitir Envio de arquivos", "Allow forms inside sandboxed artifact iframes.": "Permita formulários dentro de iframes de artefatos em sandbox.", "Allow Google Drive as a document source.": "Permita o Google Drive como fonte de documentos.", @@ -192,15 +192,15 @@ "Allow public write access": "Permitir acesso público de escrita", "Allow Rate Response": "Permitir Avaliar Resposta", "Allow Regenerate Response": "Permitir Regenerar Resposta", - "Allow scripts inside sandboxed iframes.": "", + "Allow scripts inside sandboxed iframes.": "Permitir scripts dentro de iframes em sandbox.", "Allow Sharing With Groups": "Permitir compartilhamento com grupos", "Allow Sharing With Users": "Permitir Compartilhamento com Usuários", "Allow Speech to Text": "Permitir Fala para Texto", "Allow Temporary Chat": "Permitir Conversa Temporária", - "Allow terminal previews to access same-origin browser APIs.": "", + "Allow terminal previews to access same-origin browser APIs.": "Permitir que as pré-visualizações do terminal acessem APIs do navegador da mesma origem.", "Allow Text to Speech": "Permitir Texto para Fala", "Allow the AI to delegate tasks to sub-agents. Each sub-agent creates a real chat with full tool access. Uses additional LLM calls.": "Permita que a IA delegue tarefas a subagentes. Cada subagente cria um chat real com acesso completo às ferramentas. Usa chamadas adicionais ao LLM.", - "Allow Tool Call": "", + "Allow Tool Call": "Permitir Chamada de Ferramenta", "Allow User Location": "Permitir Localização do Usuário", "Allow users to access calendar features.": "Permita que os usuários acessem os recursos de calendário.", "Allow users to authenticate with an LDAP directory.": "Permita que os usuários se autentiquem com um diretório LDAP.", @@ -244,7 +244,7 @@ "API Key": "Chave API", "API Key / Token": "Chave API / Token", "API Key created.": "Chave API criada.", - "API Key deleted.": "", + "API Key deleted.": "Chave API excluída.", "API Key Endpoint Restrictions": "Restrições de endpoint de chave de API", "API key for embedding requests.": "Chave de API para solicitações de embedding.", "API key sent to Docling.": "Chave de API enviada ao Docling.", @@ -298,7 +298,7 @@ "Ask a question": "Faça uma pergunta", "Ask a test question": "Fazer uma pergunta de teste", "Ask this knowledge source a test question": "Fazer uma pergunta de teste a esta fonte de conhecimento", - "Ask User": "", + "Ask User": "Perguntar ao Usuário", "Assistant": "Assistente", "Assistant messages": "Mensagens do assistente", "Async Embedding Processing": "Processamento de Embedding assíncrono", @@ -320,7 +320,7 @@ "Auth required": "Autenticação necessária", "Authenticate": "Autenticar", "Authentication": "Autenticação", - "Authorize OAuth": "", + "Authorize OAuth": "Autorizar OAuth", "Auto": "Auto", "Auto (Random)": "Automático (Aleatório)", "Auto Redirect": "Redirecionamento Automático", @@ -424,7 +424,7 @@ "Change User Role": "Alterar Função do Usuário", "Channel": "Canal", "Channel deleted successfully": "Canal apagado com sucesso", - "Channel is required": "", + "Channel is required": "O canal é obrigatório", "Channel Name": "Nome do canal", "Channel name cannot be empty.": "O nome do canal não pode estar vazio.", "Channel name must be less than 128 characters": "O nome do canal deve ter menos de 128 caracteres.", @@ -445,14 +445,14 @@ "Chat forked": "Chat bifurcado", "Chat history": "Histórico do chat", "Chat History": "Histórico de chat", - "Chat Hover Previews": "", + "Chat Hover Previews": "Pré-visualizações do Chat ao Passar o Mouse", "Chat ID": "ID do Chat", "Chat is too short to compact": "O chat é muito curto para compactar", "Chat moved successfully": "Chat movido com sucesso", "Chat Permissions": "Permissões de Chat", "Chat Tags Auto-Generation": "Tags de Chat Geradas Automaticamente", "Chat unshared successfully.": "Compartilhamento do chat removido com sucesso.", - "Chat Uploads": "", + "Chat Uploads": "Uploads do Chat", "Chat Variables": "Variáveis de Chat", "Chat Variables have conflicting model definitions": "As Variáveis de Chat têm definições de modelo conflitantes", "chats": "chats", @@ -461,12 +461,12 @@ "Chats Public Sharing": "Compartilhamento Público de Chats", "Check Again": "Verificar Novamente", "Check for updates": "Verificar atualizações", - "Check OAuth Discovery": "", + "Check OAuth Discovery": "Verificar Descoberta OAuth", "Checking for updates...": "Verificando atualizações...", "Choose a dedicated model for context compaction summaries. Current Model follows the active chat model.": "Escolha um modelo dedicado para resumos de compactação de contexto. O Modelo Atual segue o modelo ativo do chat.", "Choose a model before saving...": "Escolha um modelo antes de salvar...", "Choose automatic, left-to-right, or right-to-left text flow.": "Escolha o fluxo de texto automático, da esquerda para a direita ou da direita para a esquerda.", - "Choose channel": "", + "Choose channel": "Escolher canal", "Choose fallback models for background tasks. Current Model follows the active chat model.": "Escolha modelos alternativos para tarefas em segundo plano. Modelo Atual acompanha o modelo ativo no chat.", "Choose folder": "Escolher pasta", "Choose how extracted text is split before indexing.": "Escolha como o texto extraído é dividido antes da indexação.", @@ -489,7 +489,7 @@ "Choose the speech provider used for assistant audio output.": "Escolha o provedor de fala usado na saída de áudio do assistente.", "Choose the transcription provider used for audio input.": "Escolha o provedor de transcrição usado na entrada de áudio.", "Choose where model responses to root-level channel mentions are posted.": "Escolha onde as respostas do modelo às menções de canal de nível raiz são postadas.", - "Choose where terminal display_file results appear by default.": "", + "Choose where terminal display_file results appear by default.": "Escolha onde os resultados de display_file do terminal aparecem por padrão.", "Choose whether Enter sends immediately or uses Ctrl+Enter.": "Escolha se Enter envia imediatamente ou se Ctrl+Enter deve ser usado.", "Choose whether the app opens to the default home or chat view.": "Escolha se o aplicativo abre na página inicial padrão ou na visualização do chat.", "Chunk Min Size Target": "Tamanho mínimo alvo do bloco", @@ -627,7 +627,7 @@ "Content Extraction Engine": "Mecanismo de Extração de Conteúdo", "Content Field": "Campo de Conteúdo", "Content lengths (character counts only)": "Extensão do conteúdo (apenas em caracteres)", - "Content matches": "", + "Content matches": "Correspondências de conteúdo", "Context": "Contexto", "Context compacted": "Contexto compactado", "Context Compaction": "Compactação de Contexto", @@ -708,7 +708,7 @@ "Credential used for Document Intelligence.": "Credencial usada no Document Intelligence.", "Credentials used to authenticate with the Jupyter server.": "Credenciais usadas para autenticação com o servidor Jupyter.", "CSV Import": "Importação CSV", - "CSV: Name,Email": "", + "CSV: Name,Email": "CSV: Nome,Email", "Ctrl+Enter to Send": "Ctrl+Enter para enviar", "Current": "Atual", "Current Model": "Modelo Atual", @@ -733,7 +733,7 @@ "Database": "Banco de Dados", "Datalab Marker API": "API do Marcador do Datalab", "Datalab Marker service endpoint used for document parsing.": "Endpoint do serviço Datalab Marker usado para análise de documentos.", - "Date is required": "", + "Date is required": "A data é obrigatória", "Date Modified": "Data de Modificação", "Day": "Dia", "DD/MM/YYYY": "DD/MM/AAAA", @@ -749,7 +749,7 @@ "Default Features": "Recursos padrão", "Default Filters": "Filtros padrão", "Default Group": "Grupo padrão", - "Default Interface Settings": "", + "Default Interface Settings": "Configurações Padrão da Interface", "Default Model": "Modelo Padrão", "Default model updated": "Modelo padrão atualizado", "Default permissions": "Permissões padrão", @@ -771,7 +771,7 @@ "Delete All Chats": "Excluir Todos os Chats", "Delete all contents inside this directory": "Excluir todo o conteúdo deste diretório", "Delete all contents inside this folder": "Apague todo o conteúdo desta pasta.", - "Delete API Key?": "", + "Delete API Key?": "Excluir Chave API?", "Delete automation?": "Excluir automação?", "Delete calendar": "Excluir calendário", "Delete Calendar": "Excluir Calendário", @@ -799,9 +799,9 @@ "Deleted {{name}}": "Excluído {{name}}", "Deleted {{ok}} of {{total}} items": "{{ok}} de {{total}} itens excluídos", "Deleted User": "Usuário Excluído", - "Denied {{NAME}}": "", - "Deny": "", - "Deny Tool Call": "", + "Denied {{NAME}}": "{{NAME}} negado", + "Deny": "Negar", + "Deny Tool Call": "Negar Chamada de Ferramenta", "Deployment names are required for Azure OpenAI": "Nomes de implantação são necessários para o Azure OpenAI", "Desc": "Decrescente", "Describe the edit...": "Descreva a edição...", @@ -810,7 +810,7 @@ "Describe your knowledge base and objectives": "Descreva sua base de conhecimento e objetivos", "Description": "Descrição", "Deselect": "Desmarcar", - "Destination": "", + "Destination": "Destino", "Detect Artifacts Automatically": "Detectar artefatos automaticamente", "Detect generated artifacts and show them in the artifact workspace.": "Detecte os artefatos gerados e exiba-os no workspace de artefatos.", "Detected Variables": "Variáveis Detectadas", @@ -877,27 +877,27 @@ "Don't like the style": "Não gostei do estilo", "Done": "Concluído", "Download": "Baixar", - "Download \"{{searchValue}}\"": "", - "Download \"{{searchValue}}\" from {{provider}}": "", + "Download \"{{searchValue}}\"": "Baixar \"{{searchValue}}\"", + "Download \"{{searchValue}}\" from {{provider}}": "Baixar \"{{searchValue}}\" de {{provider}}", "Download & Delete": "Baixar e excluir", "Download all users as CSV.": "Baixe todos os usuários como CSV.", "Download as JSON": "Baixar como JSON", "Download as SVG": "Baixar como SVG", "Download canceled": "Download cancelado", - "Download CSV Template": "", + "Download CSV Template": "Baixar Modelo CSV", "Download every user's chat history as JSON.": "Baixe o histórico de chat de todos os usuários como JSON.", "Download failed": "Download falhou", - "Download Model": "", + "Download Model": "Baixar Modelo", "Download the application database when supported.": "Baixe o banco de dados do aplicativo quando houver suporte.", "Download the current admin configuration as JSON.": "Baixe a configuração atual do administrador como JSON.", "Download your chat history as a JSON export.": "Baixe seu histórico de chat como uma exportação JSON.", - "Downloading \"{{searchValue}}\"": "", + "Downloading \"{{searchValue}}\"": "Baixando \"{{searchValue}}\"", "Downloading stats...": "Baixando estatísticas...", "Drag to reorder": "Arraste para reordenar", "Draw": "Empate", "Drop any files here to upload": "Solte qualquer arquivo aqui para fazer upload", "Drop files here": "Solte os arquivos aqui", - "Drop to upload": "", + "Drop to upload": "Solte para fazer upload", "DuckDuckGo": "DuckDuckGo", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "por exemplo, '30s', '10m'. Unidades de tempo válidas são 's', 'm', 'h'.", "e.g. 'low', 'medium', 'high'": "por exemplo, 'low', 'medium', 'high'", @@ -956,7 +956,7 @@ "Emojis": "Emojis", "Empty": "Vazio", "Empty message": "Mensagem vazia", - "Enable accessibility-focused visual enhancements.": "", + "Enable accessibility-focused visual enhancements.": "Habilite melhorias visuais focadas em acessibilidade.", "Enable All": "Ativar tudo", "Enable background sub-agents": "Habilitar subagentes em segundo plano", "Enable Code Execution": "Habilitar execução de código", @@ -1049,7 +1049,7 @@ "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 OpenSERP Base URL": "", + "Enter OpenSERP Base URL": "Insira a URL base do OpenSERP", "Enter PaddleOCR-vl API Base URL": "Insira a URL base da API PaddleOCR-vl", "Enter PaddleOCR-vl API Token": "Insira o token da API PaddleOCR-vl", "Enter Perplexity API Key": "Insira a chave da API Perplexity", @@ -1218,7 +1218,7 @@ "Failed to load DOCX file. Please try downloading it instead.": "Não foi possível carregar o arquivo DOCX. Tente baixá-lo em vez disso.", "Failed to load Excel/CSV file. Please try downloading it instead.": "Não foi possível carregar o arquivo Excel/CSV. Tente baixá-lo em vez disso.", "Failed to load file content.": "Falha ao carregar o conteúdo do arquivo.", - "Failed to load folder": "", + "Failed to load folder": "Falha ao carregar pasta", "Failed to load Interface settings": "Falha ao carregar configurações da Interface", "Failed to load policy: {{error}}": "Falha ao carregar a política: {{error}}", "Failed to load PPTX file. Please try downloading it instead.": "Não foi possível carregar o arquivo PPTX. Tente baixá-lo em vez disso.", @@ -1237,7 +1237,7 @@ "Failed to save policy: {{error}}": "Falha ao salvar a política: {{error}}", "Failed to save terminal servers": "Falha ao salvar servidores de terminal", "Failed to save webhook": "Falha ao salvar webhook", - "Failed to search files": "", + "Failed to search files": "Falha ao pesquisar arquivos", "Failed to unshare chat.": "Falha ao cancelar o compartilhamento da conversa.", "Failed to update settings": "Falha ao atualizar as configurações", "Failed to update status": "Falha ao atualizar o status", @@ -1272,9 +1272,9 @@ "File Upload": "Upload de arquivo", "File uploaded successfully": "Arquivo carregado com sucesso", "Filename": "Nome do arquivo", - "Filename matches": "", + "Filename matches": "Correspondências de nome de arquivo", "Files": "Arquivos", - "Filesystem": "", + "Filesystem": "Sistema de arquivos", "Fill the required fields first.": "Preencha os campos obrigatórios primeiro.", "Fill the source fields and test query first.": "Preencha os campos da fonte e a consulta de teste primeiro.", "Filter": "Filtro", @@ -1408,7 +1408,7 @@ "Hide": "Ocultar", "Hide All": "Ocultar Tudo", "Hide from Sidebar": "Ocultar da barra lateral", - "Hide Hidden Files": "", + "Hide Hidden Files": "Ocultar Arquivos Ocultos", "Hide Model": "Ocultar modelo", "High": "Alto", "High Contrast Mode": "Modo de alto contraste", @@ -1430,10 +1430,10 @@ "Identity audit": "Auditoria de identidade", "Idle only": "Apenas inativo", "Idle Timeout": "Tempo Limite de Inatividade", - "iframe Sandbox Allow Downloads": "", + "iframe Sandbox Allow Downloads": "Permitir downloads no sandbox do iframe", "iframe Sandbox Allow Forms": "Permitir formulários no sandbox do iframe", "iframe Sandbox Allow Same Origin": "Permitir mesma origem no sandbox do iframe", - "iframe Sandbox Allow Scripts": "", + "iframe Sandbox Allow Scripts": "Permitir scripts no sandbox do iframe", "Image": "Imagem", "Image Compression": "Compressão de imagem", "Image Compression Height": "Altura de compressão da imagem", @@ -1448,7 +1448,7 @@ "Image Prompt Generation": "Geração de prompt de imagem", "Image Prompt Generation Prompt": "Prompt de geração de prompt de imagem", "Image Size": "Tamanho da imagem", - "Image unavailable": "", + "Image unavailable": "Imagem indisponível", "image/*, video/*": "imagem/*, vídeo/*", "Images": "Imagens", "Import": "Importar", @@ -1456,7 +1456,7 @@ "Import chat history from a JSON export file.": "Importe o histórico de chat de um arquivo de exportação JSON.", "Import Chats": "Importar Chats", "Import Config": "Importar Configuração", - "Import CSV": "", + "Import CSV": "Importar CSV", "Import From Link": "Importar do link", "Import JSON": "Importar JSON", "Import Models": "Importar Modelos", @@ -1468,7 +1468,7 @@ "Important Update": "Atualização importante", "Imported automations successfully": "Automações importadas com sucesso", "Imported notes successfully": "Notas importadas com sucesso", - "Importing...": "", + "Importing...": "Importando...", "Inactive": "Inativo", "Include": "Incluir", "Include saved memories in the system context.": "Inclua as memórias salvas no contexto do sistema.", @@ -1482,10 +1482,10 @@ "Inject stored memories into conversation context": "Injetar memórias armazenadas no contexto da conversa", "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Injete todo o conteúdo como contexto para processamento abrangente; isso é recomendado para consultas complexas.", "Inject the entire content as context for comprehensive processing.": "Injete todo o conteúdo como contexto para um processamento abrangente.", - "Inline": "", + "Inline": "Em linha", "Input": "Entrada", "Input Key (e.g. text, unet_name, steps)": "Chave de entrada (por exemplo, texto, unet_name, etapas)", - "Input needed": "", + "Input needed": "Entrada necessária", "Input Variables": "Variáveis de entrada", "Insert": "Inserir", "Insert Follow-Up Prompt to Input": "Inserir prompt de acompanhamento para entrada", @@ -1502,7 +1502,7 @@ "Interface": "Interface", "Interface Settings Access": "Acesso às configurações da interface", "Invalid file format.": "Formato de arquivo inválido.", - "Invalid format.": "", + "Invalid format.": "Formato inválido.", "Invalid JSON file": "Arquivo JSON inválido", "Invalid JSON format": "Formato JSON inválido", "Invalid JSON format for ComfyUI Edit Workflow.": "Formato JSON inválido para o fluxo de trabalho de edição do ComfyUI.", @@ -1543,7 +1543,7 @@ "Knowledge Access": "Acesso ao Conhecimento", "Knowledge Base": "Base de Conhecimento", "Knowledge base has been reset": "A base de conhecimento foi redefinida", - "Knowledge base not found.": "", + "Knowledge base not found.": "Base de conhecimento não encontrada.", "Knowledge created successfully.": "Conhecimento criado com sucesso.", "Knowledge deleted successfully.": "Conhecimento excluído com sucesso.", "Knowledge Description": "Descrição da Base de Conhecimento", @@ -1617,8 +1617,8 @@ "Live": "Ao vivo", "llama.cpp": "llama.cpp", "LLMs can make mistakes. Verify important information.": "LLMs podem cometer erros. Verifique informações importantes.", - "LM Studio": "", - "Load Model": "", + "LM Studio": "LM Studio", + "Load Model": "Carregar Modelo", "Loaded": "Carregado", "Loader": "Carregador", "Loading Kokoro.js...": "Carregando Kokoro.js...", @@ -1747,18 +1747,18 @@ "Model Capabilities": "Capacidades do Modelo", "Model created successfully!": "Modelo criado com sucesso!", "Model Defaults": "Padrões do modelo", - "Model deleted successfully": "", - "Model download started": "", + "Model deleted successfully": "Modelo excluído com sucesso", + "Model download started": "Download do modelo iniciado", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Caminho do sistema de arquivos do modelo detectado. Nome curto do modelo é necessário para atualização, não é possível continuar.", "Model Filtering": "Filtragem de Modelos", "Model ID": "ID do Modelo", - "Model ID is already added": "", + "Model ID is already added": "O ID do modelo já foi adicionado", "Model ID is required.": "É necessário o ID do modelo.", "Model IDs": "IDs do modelo", "Model is now private": "O modelo agora é privado", "Model is now public": "O modelo agora é público", - "Model list refreshed": "", - "Model loaded successfully": "", + "Model list refreshed": "Lista de modelos atualizada", + "Model loaded successfully": "Modelo carregado com sucesso", "Model Name": "Nome do Modelo", "Model name already exists, please choose a different one": "O nome do modelo já existe, escolha um diferente", "Model Name is required.": "O nome do modelo é obrigatório.", @@ -1771,7 +1771,7 @@ "Model Parameters": "Parâmetros do Modelo", "Model Params": "Parâmetros do Modelo", "Model Permissions": "Permissões do Modelo", - "Model providers": "", + "Model providers": "Provedores de modelos", "Model removed from pinned models": "Modelo removido dos modelos fixados", "Model removed from selected models": "Modelo removido dos modelos selecionados", "Model Response Mode": "Modo de Resposta do Modelo", @@ -1837,7 +1837,7 @@ "New Tool": "Nova Ferramenta", "New Webhook": "Novo Webhook", "new-channel": "novo-canal", - "Next": "", + "Next": "Próximo", "Next message": "Próxima mensagem", "Next month": "Próximo mês", "Next page": "Próxima página", @@ -1849,12 +1849,12 @@ "No additional headers are sent unless configured.": "Nenhum cabeçalho adicional é enviado a menos que configurado.", "No authentication": "Sem autenticação", "No automations found": "Nenhuma automação encontrada", - "No channels": "", + "No channels": "Sem canais", "No chat alerts": "Nenhum alerta de chat", "No chat history": "Nenhum histórico de chat", "No chat to compact": "Nenhum chat para compactar", "No chat to fork": "Nenhum chat para bifurcar", - "No chats": "", + "No chats": "Sem chats", "No chats found": "Nenhum chat encontrado", "No chats found for this user.": "Nenhum chat encontrado para este usuário.", "No chats found.": "Nenhum chat encontrado.", @@ -1946,7 +1946,7 @@ "OAuth 2.1 (Static)": "OAuth 2.1 (Estático)", "OAuth client identifier from the provider.": "Identificador do cliente OAuth fornecido pelo provedor.", "OAuth client secret from the provider.": "Segredo do cliente OAuth fornecido pelo provedor.", - "OAuth discovery successful": "", + "OAuth discovery successful": "Descoberta OAuth bem-sucedida", "OAuth ID": "OAuth ID", "OAuth Resource Parameter": "Parâmetro de Recurso OAuth", "OAuth Scopes": "Escopos OAuth", @@ -1971,7 +1971,7 @@ "OneDrive": "OneDrive", "Only active during Voice Mode.": "Ativo somente durante o Modo de Voz.", "Only active when \"Paste Large Text as File\" setting is toggled on.": "Ativo somente quando a configuração \"Colar texto grande como arquivo\" estiver ativada.", - "Only active when a tool call is waiting for approval.": "", + "Only active when a tool call is waiting for approval.": "Ativo somente quando uma chamada de ferramenta está aguardando aprovação.", "Only active when the chat input is in focus and an LLM is generating a response.": "Ativo somente quando o campo de entrada do chat está em foco e um LLM está gerando uma resposta.", "Only active when the chat input is in focus.": "Ativo somente quando o campo de entrada do chat estiver em foco.", "Only alphanumeric characters and hyphens are allowed": "Somente caracteres alfanuméricos e hífens são permitidos", @@ -1993,7 +1993,7 @@ "Open create menu": "Abrir menu Criar", "Open detail blocks by default.": "Abra os blocos de detalhes por padrão.", "Open file": "Abrir arquivo", - "Open Folder": "", + "Open Folder": "Abrir Pasta", "Open in full screen": "Abrir em tela cheia", "Open in new tab": "Abrir em nova aba", "Open link": "Abrir link", @@ -2024,12 +2024,12 @@ "OpenAPI Spec": "Especificação OpenAPI", "openapi.json URL or Path": "URL ou caminho do openapi.json", "OpenID discovery URL for this provider.": "URL de descoberta OpenID deste provedor.", - "OpenSERP URL": "", + "OpenSERP URL": "URL do OpenSERP", "optional": "opcional", "Optional": "Opcional", "Optional API key for Ollama requests.": "Chave de API opcional para solicitações ao Ollama.", "or": "ou", - "Orchestrator": "", + "Orchestrator": "Orquestrador", "Ordered List": "Lista ordenada", "Other": "Outro", "out of": "de", @@ -2053,13 +2053,13 @@ "Passthrough params": "Parâmetros de repasse", "Password": "Senha", "Password for the bind DN.": "Senha do DN de vinculação.", - "Password updated. Please sign in again.": "", + "Password updated. Please sign in again.": "Senha atualizada. Por favor, faça login novamente.", "Passwords do not match.": "As senhas não coincidem.", "Paste inserted prompts as rich text when possible.": "Cole os prompts inseridos como texto rico quando possível.", "Paste Large Text as File": "Cole Textos Longos como Arquivo", "Path": "Caminho", "Path copied": "Caminho copiado", - "Pause a response to ask the user a clarifying question": "", + "Pause a response to ask the user a clarifying question": "Pausar uma resposta para fazer uma pergunta esclarecedora ao usuário", "Paused": "Em pausa", "PDF document (.pdf)": "Documento PDF (.pdf)", "PDF Extract Images (OCR)": "Extrair Imagens do PDF (OCR)", @@ -2071,8 +2071,8 @@ "Pending Accounts": "Contas Pendentes", "Pending User Overlay Content": "Conteúdo de sobreposição de usuário pendente", "Pending User Overlay Title": "Título de sobreposição de usuário pendente", - "Per automation": "", - "Per chat": "", + "Per automation": "Por automação", + "Per chat": "Por chat", "Percentage of recent messages to keep after older messages are summarized.": "Porcentagem de mensagens recentes a manter após as mensagens mais antigas serem resumidas.", "Permanently delete every chat after confirmation.": "Exclua permanentemente todos os chats após a confirmação.", "Permission denied when accessing media devices": "Permissão negada ao acessar dispositivos de mídia", @@ -2120,7 +2120,7 @@ "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 before authorizing OAuth": "", + "Please save the connection before authorizing OAuth": "Salve a conexão antes de autorizar o 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", "Please select a model.": "Selecione um modelo.", "Please select a reason": "Por favor, selecione um motivo", @@ -2138,14 +2138,14 @@ "Preferred transcript language codes, separated by commas.": "Códigos dos idiomas preferidos para transcrição, separados por vírgulas.", "Prefix ID": "Prefixo ID", "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "O ID de prefixo é utilizado para evitar conflitos com outras conexões, adicionando um prefixo aos IDs dos modelos - deixe em branco para desativar.", - "Preparing {{NAME}}...": "", + "Preparing {{NAME}}...": "Preparando {{NAME}}...", "Preparing download...": "Preparando download...", "Press keys...": "Pressione as teclas...", "Prevent File Creation": "Impedir a criação de arquivos", "Preview": "Visualização", "Preview Access": "Acesso de Visualização", - "Preview failed": "", - "Previous": "", + "Preview failed": "Falha na pré-visualização", + "Previous": "Anterior", "Previous 30 days": "Últimos 30 dias", "Previous 7 days": "Últimos 7 dias", "Previous message": "Mensagem anterior", @@ -2205,13 +2205,13 @@ "Reasoning Effort": "Esforço de raciocínio", "Reasoning Tags": "Tags de raciocínio", "Reasoning text...": "Texto de raciocínio...", - "Rebuild knowledge file, knowledge search, and memory vectors using the current embedding model.": "", - "Rebuild vectors for existing knowledge files, knowledge search, and memories.": "", + "Rebuild knowledge file, knowledge search, and memory vectors using the current embedding model.": "Reconstrua o arquivo de conhecimento, a pesquisa de conhecimento e os vetores de memória usando o modelo de embedding atual.", + "Rebuild vectors for existing knowledge files, knowledge search, and memories.": "Reconstrua os vetores dos arquivos de conhecimento existentes, da pesquisa de conhecimento e das memórias.", "Receives matching events across the instance, including system/config events and events associated with any user.": "Recebe eventos correspondentes em toda a instância, incluindo eventos de sistema/configuração e eventos associados a qualquer usuário.", "Receives matching events that are not associated with a user.": "Recebe eventos correspondentes que não estão associados a um usuário.", "Receives matching user-associated events only when the actor, user subject, or user data matches these users or current group members. System/config events are not sent.": "Recebe eventos de usuário correspondentes apenas quando o ator, assunto do usuário ou dados do usuário corresponderem a esses usuários ou membros atuais do grupo. Eventos de sistema/configuração não são enviados.", "Recently Used": "Usado recentemente", - "Recommended": "", + "Recommended": "Recomendado", "Reconnected": "Reconectado", "Record": "Gravar", "Record voice": "Gravar voz", @@ -2238,8 +2238,8 @@ "Registration failed": "O registro falhou", "Registration successful": "Registro realizado com sucesso", "Reindex": "Reindexar", - "Reindex Embedding Data": "", - "Reindex Knowledge and Memory Vectors": "", + "Reindex Embedding Data": "Reindexar Dados de Embedding", + "Reindex Knowledge and Memory Vectors": "Reindexar Vetores de Conhecimento e Memória", "Release Notes": "Notas de Lançamento", "Releases": "Lançamentos", "Relevance": "Relevância", @@ -2289,7 +2289,7 @@ "Reset Upload Directory": "Redefinir Diretório de Upload", "Reset Vector Storage/Knowledge": "Redefinir Armazenamento de Vetores/Conhecimento", "Reset view": "Redefinir visualização", - "Reset zoom": "", + "Reset zoom": "Redefinir zoom", "Response": "Resposta", "Response Auto-Scroll": "Rolagem Automática de Resposta", "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Notificações de resposta não podem ser ativadas pois as permissões do site foram negadas. Por favor, visite as configurações do seu navegador para conceder o acesso necessário.", @@ -2357,12 +2357,12 @@ "Search and view user chat history": "Pesquise e visualize o histórico de chat do usuário", "Search Automations": "Pesquisar Automações", "Search Base": "Pesquisar Base", - "Search channels": "", + "Search channels": "Pesquisar canais", "Search channels and channel messages": "Pesquisar canais e mensagens de canais", "Search Chats": "Pesquisar Chats", "Search Collection": "Pesquisar Coleção", "Search Files": "Pesquisar arquivos", - "Search files and contents": "", + "Search files and contents": "Pesquisar arquivos e conteúdos", "Search filters": "Filtros de pesquisa", "Search Filters": "Pesquisar Filtros", "Search folders": "Pesquisar pastas", @@ -2429,7 +2429,7 @@ "Select an embedding model engine": "Selecione um mecanismo de modelo de embedding", "Select an engine": "Selecione um motor", "Select an installed pipeline to configure or remove.": "Selecione uma pipeline instalada para configurar ou remover.", - "Select an instance": "", + "Select an instance": "Selecione uma instância", "Select an Ollama instance": "Selecione uma instância do Ollama", "Select an option": "Selecione uma opção", "Select an output format": "Selecione um formato de saída", @@ -2448,7 +2448,7 @@ "Select the Gemini endpoint method to call.": "Selecione o método do endpoint Gemini a ser chamado.", "Select the local model precision used by Kokoro.js.": "Selecione a precisão do modelo local usada pelo Kokoro.js.", "Select the Pipelines server to manage.": "Selecione o servidor de Pipelines a ser gerenciado.", - "Select the Tika server API version.": "", + "Select the Tika server API version.": "Selecione a versão da API do servidor Tika.", "Select Tool": "Selecionar ferramenta", "Select view": "Selecionar visualização", "Selected": "Selecionado", @@ -2494,7 +2494,7 @@ "Set embedding model": "Definir modelo de embedding", "Set embedding model (e.g. {{model}})": "Definir modelo de embedding (por exemplo, {{model}})", "Set reranking model (e.g. {{model}})": "Definir modelo de reclassificação (por exemplo, {{model}})", - "Set system-wide interface defaults for every account. Personal settings override these defaults.": "", + "Set system-wide interface defaults for every account. Personal settings override these defaults.": "Defina os padrões de interface do sistema para todas as contas. As configurações pessoais substituem esses padrões.", "Set the birth date saved with your profile.": "Defina a data de nascimento salva em seu perfil.", "Set the default system prompt for new chats.": "Defina o prompt do sistema padrão para novos chats.", "Set the display name shown across your account.": "Defina o nome de exibição mostrado em toda a sua conta.", @@ -2512,7 +2512,7 @@ "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.": "Define as sequências de parada a serem usadas. Quando esse padrão for encontrado, o modelo de linguagem (LLM) parará de gerar texto e retornará. Vários padrões de parada podem ser definidos especificando parâmetros de parada separados em um arquivo de modelo.", "Setting": "Configuração", "Settings": "Configurações", - "settings configured": "", + "settings configured": "configurações definidas", "Settings Permissions": "Configurações de Permissões", "Settings saved successfully!": "Configurações salvas com sucesso!", "Shapes the short label generated for each chat.": "Define o rótulo curto gerado para cada chat.", @@ -2529,7 +2529,7 @@ "Sharing Permissions": "Permissões de compartilhamento", "Show": "Mostrar", "Show \"What's New\" Modal on Login": "Mostrar \"O que há de Novo\" no login", - "Show a floating preview of recent messages when hovering a chat in the sidebar.": "", + "Show a floating preview of recent messages when hovering a chat in the sidebar.": "Mostre uma pré-visualização flutuante das mensagens recentes ao passar o mouse sobre um chat na barra lateral.", "Show admin contact details while an account waits for approval.": "Mostre os dados de contato do administrador enquanto uma conta aguarda aprovação.", "Show All": "Mostrar Tudo", "Show all ({{COUNT}} characters)": "Mostrar todos os ({{COUNT}} caracteres)", @@ -2538,8 +2538,8 @@ "Show Files on Terminal Select": "Mostrar Arquivos ao Selecionar Terminal", "Show formatting controls in the rich text composer.": "Mostre os controles de formatação no editor de texto rico.", "Show Formatting Toolbar": "Mostrar barra de ferramentas de formatação", - "Show Full access and Ask for approval in the chat input menu.": "", - "Show Hidden Files": "", + "Show Full access and Ask for approval in the chat input menu.": "Mostre Acesso total e Solicitar aprovação no menu de entrada do chat.", + "Show Hidden Files": "Mostrar Arquivos Ocultos", "Show image preview": "Mostrar pré-visualização da imagem", "Show Model": "Mostrar modelo", "Show more": "Exibir mais", @@ -2554,7 +2554,7 @@ "Show your support!": "Mostre seu apoio!", "Show your username label instead of You in chat bubbles.": "Mostre seu nome de usuário em vez de Você nos balões do chat.", "Showcased creativity": "Criatividade exibida", - "Sidebar": "", + "Sidebar": "Barra lateral", "Sign in": "Entrar", "Sign in to {{WEBUI_NAME}}": "Faça login em {{WEBUI_NAME}}", "Sign in to {{WEBUI_NAME}} with LDAP": "Faça login em {{WEBUI_NAME}} com LDAP", @@ -2565,7 +2565,7 @@ "simultaneous sub-agents": "subagentes simultâneos", "Single": "Único", "Sink List": "Lista de destino", - "Size": "", + "Size": "Tamanho", "sk-1234": "sk-1234", "Skill created successfully": "Skill criada com sucesso", "Skill deleted successfully": "Skill excluída com sucesso", @@ -2605,7 +2605,7 @@ "Start new chats as temporary unless changed.": "Inicie novos chats como temporários, a menos que isso seja alterado.", "Start of the channel": "Início do canal", "Start Tag": "Tag inicial", - "Start the chat to use this terminal.": "", + "Start the chat to use this terminal.": "Inicie o chat para usar este terminal.", "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", @@ -2635,7 +2635,7 @@ "Su_day_of_week": "Dom", "Sub Claim": "Reivindicação Sub", "Sub-agents": "Subagentes", - "Submit answers": "", + "Submit answers": "Enviar respostas", "Submit question": "Enviar pergunta", "Submit suggestion": "Enviar sugestão", "Subtitle": "Subtítulo", @@ -2683,7 +2683,7 @@ "Task List": "Lista de tarefas", "Task Management": "Gerenciamento de Tarefas", "Task Model": "Modelo de Tarefa", - "Task Model Parameters": "", + "Task Model Parameters": "Parâmetros do Modelo de Tarefa", "Tasks": "Tarefas", "tasks completed": "tarefas concluídas", "Tavily API Key": "Chave da API Tavily", @@ -2693,9 +2693,9 @@ "Temporary Chat": "Chat temporário", "Temporary Chat by Default": "Chat temporário por padrão", "Terminal": "Terminal", - "Terminal Contexts": "", - "Terminal File Display": "", - "Terminal Preview Allow Same Origin": "", + "Terminal Contexts": "Contextos de Terminal", + "Terminal File Display": "Exibição de Arquivos do Terminal", + "Terminal Preview Allow Same Origin": "Permitir mesma origem na pré-visualização do terminal", "Terminal servers saved": "Servidores de terminal salvos", "Test": "Testar", "Test must pass before a source is created.": "O teste deve ser aprovado antes que uma fonte seja criada.", @@ -2727,7 +2727,7 @@ "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "A temperatura do modelo. Aumentar a temperatura fará com que o modelo responda de forma mais criativa.", "Theme": "Tema", "There was an error syncing your stats. Please try again.": "Ocorreu um erro ao sincronizar suas estatísticas. Tente novamente.", - "These settings are read from environment variables and cannot be edited here while {{ENV_VAR}} is disabled.": "", + "These settings are read from environment variables and cannot be edited here while {{ENV_VAR}} is disabled.": "Estas configurações são lidas de variáveis de ambiente e não podem ser editadas aqui enquanto {{ENV_VAR}} estiver desativado.", "thinking, output_config": "pensando, output_config", "Thinking...": "Pensando...", "This action cannot be undone. Do you wish to continue?": "Esta ação não pode ser desfeita. Você deseja continuar?", @@ -2748,10 +2748,10 @@ "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 and cannot be undone.": "Isto vai excluir todos os modelos, incluindo personalizados e não pode ser desfeito.", - "This will delete the cached model and cannot be undone.": "", + "This will delete the cached model and cannot be undone.": "Isso excluirá o modelo em cache e não pode ser desfeito.", "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 remove all files and directories from this knowledge base. This action cannot be undone.": "Isso removerá todos os arquivos e diretórios desta base de conhecimento. Esta ação não pode ser desfeita.", - "This will revoke the current API key.": "", + "This will revoke the current API key.": "Isso revogará a chave de API atual.", "Thorough explanation": "Explicação detalhada", "Thought": "Pensamento", "Thought for {{DURATION}}": "Pensado por {{DURATION}}", @@ -2761,12 +2761,12 @@ "Through": "Até", "Thumbs up/down ratings from users on model responses": "Avaliações positivas/negativas dos usuários sobre as respostas do modelo", "Tika": "Tika", - "Tika 3.x": "", - "Tika 4.x": "", + "Tika 3.x": "Tika 3.x", + "Tika 4.x": "Tika 4.x", "Tika server endpoint used for content extraction.": "Endpoint do servidor Tika usado para extração de conteúdo.", "Tika Server URL": "URL do servidor Tika", "Tika Server URL required.": "URL do servidor Tika necessária.", - "Tika Server Version": "", + "Tika Server Version": "Versão do Servidor Tika", "Tiktoken": "Tiktoken", "Time": "Tempo", "Time & Calculation": "Tempo e Cálculo", @@ -2814,7 +2814,7 @@ "tokens": "tokens", "Tokens": "Tokens", "Too verbose": "Muito detalhado", - "tool": "", + "tool": "ferramenta", "Tool created successfully": "Ferramenta criada com sucesso", "Tool deleted successfully": "Ferramenta excluída com sucesso", "Tool Description": "Descrição da ferramenta", @@ -2823,7 +2823,7 @@ "tool loops per sub-agent": "ciclos de ferramentas por subagente", "Tool Menu": "Menu de ferramentas", "Tool Name": "Nome da ferramenta", - "Tool Permissions": "", + "Tool Permissions": "Permissões de Ferramentas", "Tool Servers": "Servidores de ferramentas", "Tool updated successfully": "Ferramenta atualizada com sucesso", "Tools": "Ferramentas", @@ -2848,10 +2848,10 @@ "TTS Voice": "Voz TTS", "Tu_day_of_week": "Ter", "Type": "Tipo", - "Type a model ref": "", + "Type a model ref": "Digite uma referência de modelo", "Type here...": "Digite aqui...", "Type Hugging Face Resolve (Download) URL": "Digite o URL de download do Hugging Face", - "Type your answer": "", + "Type your answer": "Digite sua resposta", "Uh-oh! There was an issue with the response.": "Opa! Houve um problema com a resposta.", "UI": "Interface", "UI Scale": "Escala da interface do usuário", @@ -2862,7 +2862,7 @@ "unknown": "desconhecido", "Unknown": "Desconhecido", "Unknown User": "Usuário desconhecido", - "Unload Model": "", + "Unload Model": "Descarregar Modelo", "Unloads {{FROM_NOW}}": "Descarrega {{FROM_NOW}}", "Unmute": "Reativar som", "Unpin": "Desfixar", @@ -2896,7 +2896,7 @@ "Upload a workflow.json file exported as API format from ComfyUI.": "Envie um arquivo workflow.json exportado do ComfyUI no formato de API.", "Upload Audio": "Carregar Áudio", "Upload directory": "Carregar diretório", - "Upload failed": "", + "Upload failed": "Falha no upload", "Upload files": "Carregar arquivos", "Upload Files": "Carregar Arquivos", "Upload Model": "Carregar Modelo", @@ -2946,7 +2946,7 @@ "User location successfully retrieved.": "Localização do usuário recuperada com sucesso.", "User menu": "Menu do usuário", "User messages": "Mensagens do usuário", - "User not found.": "", + "User not found.": "Usuário não encontrado.", "User Preview": "Visualização do Usuário", "User ratings (thumbs up/down)": "Avaliações dos usuários (polegar para cima/polegar para baixo)", "User Status": "Status do usuário", @@ -2981,7 +2981,7 @@ "Version": "Versão", "Version {{selectedVersion}} of {{totalVersions}}": "Versão {{selectedVersion}} de {{totalVersions}}", "Version deleted": "Versão excluída", - "View channel": "", + "View channel": "Ver canal", "View chat": "Ver chat", "View Replies": "Ver respostas", "View Result from {{NAME}}": "Ver resultado de {{NAME}}", @@ -3001,7 +3001,7 @@ "Voice Mode Prompt": "Prompt do Modo de Voz", "Wait for the current response to finish before compacting.": "Aguarde a conclusão da resposta atual antes de compactar.", "Wait for the current response to finish before forking.": "Aguarde a conclusão da resposta atual antes de bifurcar.", - "Waiting for upload": "", + "Waiting for upload": "Aguardando upload", "Waiting for upload...": "Aguardando upload...", "Warning": "Aviso", "Warning:": "Aviso:", @@ -3102,6 +3102,6 @@ "YouTube": "YouTube", "Youtube Language": "Idioma do YouTube", "Youtube Proxy URL": "URL de proxy do YouTube", - "Zoom in": "", - "Zoom out": "" + "Zoom in": "Aumentar zoom", + "Zoom out": "Diminuir zoom" } From 56d296ef1b59d6325ae7327f44d704fbf94cc64d Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 25 Aug 2026 21:45:34 -0400 Subject: [PATCH 03/99] refac --- .github/pull_request_template.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 27f795ace7..58eb4a7cb2 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -48,7 +48,7 @@ The most impactful way to contribute to Open WebUI is through well-written bug r - [ ] **Changelog:** A changelog entry following [Keep a Changelog](https://keepachangelog.com/) format is included at the bottom. - [ ] **Documentation:** Relevant documentation has been added or updated in the [Open WebUI Docs Repository](https://github.com/open-webui/docs). - [ ] **Dependencies:** Any new or updated dependencies are explained, tested, and documented. -- [ ] **Testing:** **Manual** end-to-end tests have been performed to verify the fix/feature works correctly and does not introduce regressions. Screenshots or recordings are included where applicable. +- [ ] **Testing:** I performed **manual** end-to-end tests that verify the fix/feature works as intended and does not break related functionality. Automated tests, AI-generated tests, or agent-written test summaries are **not** a substitute for manual verification. I included reproducible steps showing the issue before the fix, tested relevant edge cases (for example URL encoding, HTML entities, and data types), and attached screenshots or recordings for the PR description where applicable. - [ ] **User-facing changes:** I have confirmed whether this PR changes the UI. If it does, screenshots are required, and a video recording is recommended. - [ ] **No Unchecked AI Code:** This PR is either human-written or has undergone thorough human review AND manual testing. Unreviewed AI-generated PRs may be closed immediately. - [ ] **Self-Review:** A self-review of the code has been performed, ensuring adherence to project coding standards. @@ -108,7 +108,7 @@ The most impactful way to contribute to Open WebUI is through well-written bug r ### Screenshots or Videos -- [Attach screenshots or videos for user-facing changes. For UI changes, screenshots are required, and a video recording is recommended.] +- [Attach screenshots or videos that demonstrate the fix/feature where applicable. For UI changes, screenshots are required, and a video recording is recommended.] ### Contributor License Agreement From 240c795efe3309a10144bc7e027bab54a4e67dde Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 27 Aug 2026 13:12:55 -0400 Subject: [PATCH 04/99] refac --- .github/ISSUE_TEMPLATE/bug_report.yaml | 137 +++++++------------ .github/ISSUE_TEMPLATE/feature_request.yaml | 83 ++++++------ .github/pull_request_template.md | 138 ++++++++------------ 3 files changed, 137 insertions(+), 221 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 1c43cb2058..64c0194688 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -1,5 +1,5 @@ name: Bug Report -description: Create a detailed bug report to help us improve Open WebUI. +description: Tell us what broke in Open WebUI. title: 'issue: ' labels: ['bug', 'triage'] body: @@ -8,35 +8,26 @@ body: value: | # Bug Report - ## Important Notes + Use this for real, reproducible bugs. Include the affected workflow, the expected result, the actual result, and the details needed for someone else to reproduce it. - - **Before submitting a bug report**: Please check the [Issues](https://github.com/open-webui/open-webui/issues) and [Discussions](https://github.com/open-webui/open-webui/discussions) sections to see if a similar issue has already been reported. If unsure, start a discussion first, as this helps us efficiently focus on improving the project. Duplicates may be closed without notice. **Please search for existing issues AND discussions. No matter open or closed.** + Before submitting, search open and closed [Issues](https://github.com/open-webui/open-webui/issues) and [Discussions](https://github.com/open-webui/open-webui/discussions). The issue may already be reported or fixed on `dev`. - - Check for opened, **but also for (recently) CLOSED issues** as the issue you are trying to report **might already have been fixed on the dev branch!** + Please do not open a code pull request for this report unless a maintainer asks for one. Actionable reproduction details are the most useful next step. - - **Respectful collaboration**: Open WebUI is a volunteer-driven project with a single maintainer and contributors who also have full-time jobs. Please be constructive and respectful in your communication. - - - **Contributing**: If you encounter an issue, consider submitting a pull request or forking the project. We prioritize preventing contributor burnout to maintain Open WebUI's quality. - - - **Bug Reproducibility**: If a bug cannot be reproduced using a `:main` or `:dev` Docker setup or with `pip install` on Python 3.11, community assistance may be required. In such cases, we will move it to the "[Issues](https://github.com/open-webui/open-webui/discussions/categories/issues)" Discussions section. Your help is appreciated! - - - **Scope**: If you want to report a SECURITY VULNERABILITY, then do so through our [GitHub security page](https://github.com/open-webui/open-webui/security). + Security vulnerabilities must not be reported publicly. Use the [GitHub security page](https://github.com/open-webui/open-webui/security) instead. - type: checkboxes id: issue-check attributes: - label: Check Existing Issues - description: Confirm that you’ve checked for existing reports before submitting a new one. + label: Before Submitting options: - - label: I have searched for any existing and/or related issues. + - label: I searched open and closed issues and discussions for an existing report. required: true - - label: I have searched for any existing and/or related discussions. + - label: I checked whether this is already fixed on the `dev` branch or latest source. required: true - - label: I have also searched in the CLOSED issues AND CLOSED discussions and found no related items (your issue might already be addressed on the development branch!). + - label: I am using the latest available version of Open WebUI for my install method. required: true - - label: I have checked whether this issue is already fixed on the `dev` branch or in the latest source. - required: true - - label: I am using the latest version of Open WebUI. + - label: This is not a security vulnerability. required: true - type: dropdown @@ -45,9 +36,9 @@ body: label: Installation Method description: How did you install Open WebUI? options: - - Git Clone - - Pip Install - Docker + - Pip Install + - Git Clone - Other validations: required: true @@ -56,67 +47,51 @@ body: id: open-webui-version attributes: label: Open WebUI Version - description: Specify the version (e.g., v0.11.0) + description: Specify the version, commit, or image tag. + placeholder: v0.11.0, dev commit SHA, or Docker tag validations: required: true - - type: input - id: ollama-version - attributes: - label: Ollama Version (if applicable) - description: Specify the version (e.g., v0.32.5, or v0.32.6-rc0) - validations: - required: false - - type: input id: operating-system attributes: label: Operating System - description: Specify the OS (e.g., Windows 11, macOS Tahoe, Ubuntu 26.04, Debian 13) + description: Specify the OS and version. + placeholder: Windows 11, macOS Tahoe, Ubuntu 26.04, Debian 13 validations: required: true - type: input id: browser attributes: - label: Browser (if applicable) - description: Specify the browser/version (e.g., Chrome 151.0, Firefox 153.0.3) + label: Browser + description: If the bug appears in the browser, include browser and version. + placeholder: Chrome 151.0, Firefox 153.0.3 validations: required: false - - type: checkboxes - id: confirmation + - type: input + id: ollama-version attributes: - label: Confirmation - description: Ensure the following prerequisites have been met. - options: - - label: I have read and followed all instructions in `README.md`. - required: true - - label: I am using the latest version of **both** Open WebUI and Ollama. - required: true - - label: I have included the browser console logs. - required: true - - label: I have included the Docker container logs. - required: true - - label: I have **provided every relevant configuration, setting, and environment variable used in my setup.** - required: true - - label: I have clearly **listed every relevant configuration, custom setting, environment variable, and command-line option that influences my setup** (such as Docker Compose overrides, .env values, browser settings, authentication configurations, etc). - required: true - - label: | - I have documented **step-by-step reproduction instructions that are precise, sequential, and leave nothing to interpretation**. My steps: - - Start with the initial platform/version/OS and dependencies used, - - Specify exact install/launch/configure commands, - - List URLs visited, user input (incl. example values/emails/passwords if needed), - - Describe all options and toggles enabled or changed, - - Include any files or environmental changes, - - Identify the expected and actual result at each stage, - - Ensure any reasonably skilled user can follow and hit the same issue. - required: true + label: Ollama Version + description: Include this if Ollama is involved. + placeholder: v0.32.5 + validations: + required: false + + - type: textarea + id: summary + attributes: + label: Summary + description: What is wrong, in a few sentences? + validations: + required: true + - type: textarea id: expected-behavior attributes: label: Expected Behavior - description: Describe what should have happened. + description: What should have happened? validations: required: true @@ -124,7 +99,7 @@ body: id: actual-behavior attributes: label: Actual Behavior - description: Describe what actually happened. + description: What actually happened? validations: required: true @@ -132,32 +107,21 @@ body: id: reproduction-steps attributes: label: Steps to Reproduce - description: | - Please provide a **very detailed, step-by-step guide** to reproduce the issue. Your instructions should be so clear and precise that anyone can follow them without guesswork. Include every relevant detail—settings, configuration options, exact commands used, values entered, and any prerequisites or environment variables. - **If full reproduction steps and all relevant settings are not provided, your issue may not be addressed.** - **If your steps to reproduction are incomplete, lacking detail or not reproducible, your issue can not be addressed.** - + description: Include the exact commands, settings, URLs, model/provider setup, and user actions needed to hit the bug. placeholder: | - Example (include every detail): - 1. Start with a clean Ubuntu 26.04 install. - 2. Install Docker v29.7.1 and start the service. - 3. Clone the Open WebUI repo (git clone ...). - 4. Use the Docker Compose file without modifications. - 5. Open browser Chrome 151.0 in incognito mode. - 6. Go to http://localhost:8080 and log in with user "test@example.com". - 7. Set the language to "English" and theme to "Dark". - 8. Attempt to connect to Ollama at "http://localhost:11434". - 9. Observe that the error message "Connection refused" appears at the top right. - - Please list each step carefully and include all relevant configuration, settings, and options. + 1. Start Open WebUI with ... + 2. Configure ... + 3. Open ... + 4. Click ... + 5. See ... validations: required: true + - type: textarea id: logs-screenshots attributes: - label: Logs & Screenshots - description: Include relevant logs, errors, or screenshots to help diagnose the issue. - placeholder: 'Attach logs from the browser console, Docker logs, or error messages.' + label: Logs, Screenshots, and Config + description: Include relevant browser console logs, server/container logs, screenshots, and configuration. If something does not apply, say so. validations: required: true @@ -165,13 +129,6 @@ body: id: additional-info attributes: label: Additional Information - description: Provide any extra details that may assist in understanding the issue. + description: Anything else that might help us understand the report. validations: required: false - - - type: markdown - attributes: - value: | - ## Note - **If the bug report is incomplete, does not follow instructions or is lacking details it may not be addressed.** Ensure that you've followed all the **README.md** and **troubleshooting.md** guidelines, and provide all necessary information for us to reproduce the issue. - Thank you for contributing to Open WebUI! diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 0972f9cb9a..52c10fc31d 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -1,78 +1,71 @@ name: Feature Request -description: Suggest a new feature or improvement +description: Describe what you would like Open WebUI to support. title: 'feat: ' labels: ['triage'] body: - type: markdown attributes: value: | - ## Before Submitting + # Feature Request - Please check **open AND closed** [Issues](https://github.com/open-webui/open-webui/issues) and [Discussions](https://github.com/open-webui/open-webui/discussions) for similar requests. If you find one, add your input there instead. + Describe the requested behavior, the problem it solves, and any examples, mockups, screenshots, or workflows that clarify the request. - ### Scope Guidelines + Search open and closed [Issues](https://github.com/open-webui/open-webui/issues) and [Discussions](https://github.com/open-webui/open-webui/discussions) before submitting. If the request needs broad product, UX, architecture, compatibility, or maintenance discussion, please start in [Discussions](https://github.com/open-webui/open-webui/discussions) so the community can weigh in. - Feature requests that require significant implementation effort should be posted in the **Ideas** section of [Discussions](https://github.com/open-webui/open-webui/discussions) instead. We will move oversized feature requests to Discussions to keep the Issues tab focused on actionable items. + Please do not open a code pull request for this request unless a maintainer asks for one. Clear product context is the most useful next step. - If your request might impact the broader community, please open a Discussion first so others can weigh in on the design. - - ### Be Respectful - - Open WebUI is a volunteer-driven project maintained by a small team. We value constructive, positive communication. Please be mindful of maintainers' time and energy. - - ### Contributing - - If you encounter an issue, we encourage you to submit a pull request or fork the project. We actively work to prevent contributor burnout and maintain project quality. - - ### Reproducibility - - If a bug cannot be reproduced with a `:main` or `:dev` Docker setup, or a `pip install` with Python 3.11, it may be moved to the "Issues" section in Discussions for community assistance. + Security vulnerabilities must not be reported publicly. Use the [GitHub security page](https://github.com/open-webui/open-webui/security) instead. - type: checkboxes - id: existing-issue + id: existing-request attributes: - label: Check Existing Issues - description: Confirm you have searched for similar requests. + label: Before Submitting options: - - label: I have searched all existing **open AND closed** issues and discussions and found none comparable to my request. + - label: I searched open and closed issues and discussions for an existing request. required: true - - label: I have checked whether this request is already implemented on the `dev` branch or in the latest source. + - label: I checked whether this already exists on the `dev` branch or latest source. required: true - - - type: checkboxes - id: feature-scope - attributes: - label: Verify Feature Scope - description: Confirm this request belongs in Issues rather than Discussions. - options: - - label: I believe this feature request is appropriately scoped for the Issues section as described above. + - label: This request is not a security vulnerability. required: true - type: textarea id: problem-description attributes: - label: Problem Description - description: Is this related to a problem? Describe the pain point clearly. - placeholder: "e.g., I'm frustrated when..." + label: Problem + description: What is missing, frustrating, confusing, or unnecessarily hard today? + placeholder: "I'm trying to..., but..." validations: required: true - type: textarea - id: solution-description + id: desired-behavior attributes: - label: Proposed Solution - description: Describe what you would like to happen. + label: Desired Behavior + description: What would you like to happen instead? + placeholder: "I would like Open WebUI to..." validations: required: true + - type: textarea + id: why-it-matters + attributes: + label: Why This Matters + description: Who benefits, and what workflow does this unlock or improve? + validations: + required: true + + - type: textarea + id: examples + attributes: + label: Examples or References + description: Add mockups, screenshots, links, prompts, workflows, or examples from other tools. + validations: + required: false + - type: textarea id: alternatives-considered attributes: - label: Alternatives Considered - description: Describe any alternative solutions or workarounds you have considered. - - - type: textarea - id: additional-context - attributes: - label: Additional Context - description: Add any other context, mockups, or screenshots about the feature request. + label: Alternatives or Workarounds + description: What have you tried instead, if anything? + validations: + required: false diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 58eb4a7cb2..5aa1fd3b35 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,126 +1,92 @@ -# Pull Request Checklist +# Pull Request -### Do not open a pull request as the first step. +Thanks for helping improve Open WebUI. Please make sure the linked Issue or Discussion explains the user-facing problem, the expected outcome, and any relevant examples or constraints. -For real, reproducible bugs, start with a well-described [Issue](https://github.com/open-webui/open-webui/issues) that explains the problem, why it matters, and what outcome you are looking for. +Code contributions are not the default path. Open a code pull request only when a maintainer asks for one, or for narrow i18n/localization updates. For real, reproducible bugs, start with a well-described [Issue](https://github.com/open-webui/open-webui/issues). For feature requests, UI/UX changes, behavior changes, architecture changes, suspected fixes, or unconfirmed approaches, start with an active [Discussion](https://github.com/open-webui/open-webui/discussions). -For feature requests, enhancements, behavior changes, UI/UX changes, architecture changes, suspected fixes, or unconfirmed approaches, start with an active [Discussion](https://github.com/open-webui/open-webui/discussions). Merely opening a discussion is not enough; it needs to be actively discussed. +If you have implementation notes, include them as reference in the Issue or Discussion. A local diff, patch, or branch can be useful context, but it does not mean a pull request is expected or will be reviewed. -If you want to propose an implementation, include it only as a reference in the Issue or Discussion, such as a local diff, patch, or branch. +Unsolicited PRs may be closed without review, especially when they introduce product, architecture, compatibility, dependency, or maintenance decisions that have not been discussed. -Opening an Issue or Discussion does not mean a PR is the right next step. Maintainers will confirm when a PR would be useful. +## Checklist -We ask for this because PRs, especially from first-time contributors, often need broader maintainer context on product direction, scope, architecture, UX, edge cases, compatibility, documentation, and long-term maintenance before implementation. +- [ ] This PR targets the `dev` branch. +- [ ] This PR links to a confirmed Issue or active Discussion: `Closes #___` / `Relates to #___`. +- [ ] A maintainer explicitly asked me to open this PR, or this PR only updates i18n/localization. +- [ ] The change is one logical unit with no unrelated commits. +- [ ] I matched nearby code patterns and avoided unnecessary new settings, abstractions, or dependencies. +- [ ] I manually tested the changed workflow and any nearby behavior that could be affected. +- [ ] I updated relevant docs, including the [Open WebUI Docs Repository](https://github.com/open-webui/docs), if needed. +- [ ] I added screenshots for UI changes, and a recording when motion or interaction matters. +- [ ] I reviewed any AI-generated code before submitting it. +- [ ] The PR title uses one of the prefixes listed below. -Unsolicited PRs may be closed without review. Contributors with a history of successful merged PRs may be given more latitude. +## Title Prefix - +Describe the change, the problem it solves, and the impact on users. -**Before submitting, make sure you've checked and filled out the following:** +## Testing -- [ ] **Linked Issue/Discussion:** This PR references an existing, well-described [Issue](https://github.com/open-webui/open-webui/issues) for a real bug or an active, substantive [Discussion](https://github.com/open-webui/open-webui/discussions) for a feature request or enhancement — `Closes #___` / `Relates to #___`. -- [ ] **First-time contributor policy:** This is not my first contribution to Open WebUI, this PR contains only i18n/localization updates, or a maintainer explicitly asked me to open this PR after reviewing the linked Issue or Discussion. -- [ ] **Target branch:** The pull request targets the `dev` branch. **PRs targeting `main` will be immediately closed.** -- [ ] **Description:** A concise description of the changes is provided below. -- [ ] **Changelog:** A changelog entry following [Keep a Changelog](https://keepachangelog.com/) format is included at the bottom. -- [ ] **Documentation:** Relevant documentation has been added or updated in the [Open WebUI Docs Repository](https://github.com/open-webui/docs). -- [ ] **Dependencies:** Any new or updated dependencies are explained, tested, and documented. -- [ ] **Testing:** I performed **manual** end-to-end tests that verify the fix/feature works as intended and does not break related functionality. Automated tests, AI-generated tests, or agent-written test summaries are **not** a substitute for manual verification. I included reproducible steps showing the issue before the fix, tested relevant edge cases (for example URL encoding, HTML entities, and data types), and attached screenshots or recordings for the PR description where applicable. -- [ ] **User-facing changes:** I have confirmed whether this PR changes the UI. If it does, screenshots are required, and a video recording is recommended. -- [ ] **No Unchecked AI Code:** This PR is either human-written or has undergone thorough human review AND manual testing. Unreviewed AI-generated PRs may be closed immediately. -- [ ] **Self-Review:** A self-review of the code has been performed, ensuring adherence to project coding standards. -- [ ] **Architecture:** Smart defaults are preferred over new settings. Local state is used for ephemeral UI logic. Major architectural or UX changes have been discussed first. -- [ ] **Git Hygiene:** The PR is atomic (one logical change), rebased on `dev`, and contains no unrelated commits. -- [ ] **Title Prefix:** The PR title uses one of the following prefixes: - - **BREAKING CHANGE**: Changes affecting backward compatibility - - **build**: Build system or dependency changes - - **ci**: CI/CD workflow changes - - **chore**: Refactoring, cleanup, or non-functional changes - - **docs**: Documentation additions or updates - - **feat**: New features or enhancements - - **fix**: Bug fixes or corrections - - **i18n**: Internationalization or localization changes - - **perf**: Performance improvements - - **refactor**: Code restructuring +List the exact manual checks you ran. Include commands, setup details, screenshots, or recordings where helpful. -# Changelog Entry - -### Description - -- [Describe the changes, including motivation and impact] +## Changelog Entry ### Added -- [New features, functionalities, or additions] +- ### Changed -- [Changes, updates, refactorings, or optimizations] - -### Deprecated - -- [Deprecated functionality or features] - -### Removed - -- [Removed features, files, or functionalities] +- ### Fixed -- [Bug fixes or corrections] +- + +### Removed + +- ### Security -- [Security-related changes or vulnerability fixes] +- ### Breaking Changes -- **BREAKING CHANGE**: [Changes affecting compatibility or functionality] +- ---- +## Additional Context -### Additional Information +Add anything maintainers should know before review. -- [Any additional context, notes, or references to related issues/commits] - -### Screenshots or Videos - -- [Attach screenshots or videos that demonstrate the fix/feature where applicable. For UI changes, screenshots are required, and a video recording is recommended.] - -### Contributor License Agreement +## Contributor License Agreement - [ ] By submitting this pull request, I confirm that I have read and fully agree to the [Contributor License Agreement (CLA)](https://github.com/open-webui/open-webui/blob/main/CONTRIBUTOR_LICENSE_AGREEMENT), and I am providing my contributions under its terms. - -> [!NOTE] -> Deleting the CLA section will lead to immediate closure of your PR and it will not be merged in. From 061fb434328ea8365cc4961519e8adbe5ac7b0c1 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 27 Aug 2026 15:34:20 -0400 Subject: [PATCH 05/99] refac --- src/lib/apis/terminal/index.ts | 23 +++++ src/lib/components/chat/FileNav.svelte | 79 ++++++++++++----- .../chat/FileNav/FilePreview.svelte | 22 ++++- .../chat/Messages/TerminalOutputFile.svelte | 53 ++++++++++-- .../components/common/PptxPdfPreview.svelte | 84 +++++++++++++++++++ 5 files changed, 231 insertions(+), 30 deletions(-) create mode 100644 src/lib/components/common/PptxPdfPreview.svelte diff --git a/src/lib/apis/terminal/index.ts b/src/lib/apis/terminal/index.ts index a8f310a962..ed7fe31561 100644 --- a/src/lib/apis/terminal/index.ts +++ b/src/lib/apis/terminal/index.ts @@ -292,6 +292,29 @@ export const downloadFileBlob = async ( return { blob, filename }; }; +export const downloadFilePreview = async ( + baseUrl: string, + apiKey: string, + path: string, + sessionId?: string +): Promise<{ blob: Blob; filename: string } | null> => { + const url = `${baseUrl.replace(/\/$/, '')}/files/view?path=${encodeURIComponent(path)}&preview=true`; + const headers: Record = bearerHeaders(apiKey); + if (sessionId) headers['X-Session-Id'] = sessionId; + const res = await fetch(url, { headers }).catch(() => null); + + if (!res) return null; + if (!res.ok) return null; + + const contentType = res.headers.get('content-type') ?? ''; + const filename = path.split('/').pop() ?? 'file'; + if (!contentType.includes('application/pdf')) return null; + + const blob = await res.blob().catch(() => null); + if (!blob) return null; + return { blob, filename }; +}; + export const archiveFromTerminal = async ( baseUrl: string, apiKey: string, diff --git a/src/lib/components/chat/FileNav.svelte b/src/lib/components/chat/FileNav.svelte index 4f64ef7ea1..23f9392592 100644 --- a/src/lib/components/chat/FileNav.svelte +++ b/src/lib/components/chat/FileNav.svelte @@ -23,6 +23,7 @@ listFiles, readFile, downloadFileBlob, + downloadFilePreview, archiveFromTerminal, uploadToTerminal, createDirectory, @@ -865,19 +866,38 @@ ); if (result) fileSqliteData = await result.blob.arrayBuffer(); } else if (isOffice(filePath)) { - const result = await downloadFileBlob( - terminal.url, - terminal.key, - filePath, - chatId ?? undefined - ); - if (result) { - const ext = getFileExt(filePath); - const arrayBuffer = await result.blob.arrayBuffer(); - try { - if (ext === 'docx') { + const ext = getFileExt(filePath); + try { + if (ext === 'docx') { + const preview = await downloadFilePreview( + terminal.url, + terminal.key, + filePath, + chatId ?? undefined + ); + if (preview) { + filePdfData = await preview.blob.arrayBuffer(); + } else { + const result = await downloadFileBlob( + terminal.url, + terminal.key, + filePath, + chatId ?? undefined + ); + if (!result) throw new Error('Preview failed'); + const arrayBuffer = await result.blob.arrayBuffer(); fileDocxData = arrayBuffer; - } else if (ext === 'xlsx') { + toast.info($i18n.t('Preview may differ from download.')); + } + } else if (ext === 'xlsx') { + const result = await downloadFileBlob( + terminal.url, + terminal.key, + filePath, + chatId ?? undefined + ); + if (result) { + const arrayBuffer = await result.blob.arrayBuffer(); const XLSX = await import('xlsx'); const wb = XLSX.read(new Uint8Array(arrayBuffer), { type: 'array' }); excelWorkbook = wb; @@ -889,16 +909,35 @@ const DOMPurify = (await import('dompurify')).default; fileOfficeHtml = DOMPurify.sanitize(result.html); } - } else if (ext === 'pptx') { - const { pptxToImages } = await import('$lib/utils/pptxToHtml'); - const result = await pptxToImages(arrayBuffer); - fileOfficeSlides = result.images; - currentSlide = 0; } - } catch (e) { - console.error('Failed to render Office file:', e); - fileContent = `Error previewing file: ${e instanceof Error ? e.message : 'Unknown error'}`; + } else if (ext === 'pptx') { + const preview = await downloadFilePreview( + terminal.url, + terminal.key, + filePath, + chatId ?? undefined + ); + if (preview) { + filePdfData = await preview.blob.arrayBuffer(); + } else { + const result = await downloadFileBlob( + terminal.url, + terminal.key, + filePath, + chatId ?? undefined + ); + if (!result) throw new Error('Preview failed'); + const arrayBuffer = await result.blob.arrayBuffer(); + const { pptxToImages } = await import('$lib/utils/pptxToHtml'); + const fallback = await pptxToImages(arrayBuffer); + fileOfficeSlides = fallback.images; + currentSlide = 0; + toast.info($i18n.t('Preview may differ from download.')); + } } + } catch (e) { + console.error('Failed to render Office file:', e); + fileContent = `Error previewing file: ${e instanceof Error ? e.message : 'Unknown error'}`; } } else { fileContent = await readFile(terminal.url, terminal.key, filePath, chatId ?? undefined); diff --git a/src/lib/components/chat/FileNav/FilePreview.svelte b/src/lib/components/chat/FileNav/FilePreview.svelte index b5ea5507bb..73ce9d1a29 100644 --- a/src/lib/components/chat/FileNav/FilePreview.svelte +++ b/src/lib/components/chat/FileNav/FilePreview.svelte @@ -8,6 +8,7 @@ import { initMermaid, renderMermaidDiagram } from '$lib/utils'; import Spinner from '../../common/Spinner.svelte'; import PDFViewer from '../../common/PDFViewer.svelte'; + import PptxPdfPreview from '../../common/PptxPdfPreview.svelte'; import PanzoomContainer from '../../common/PanzoomContainer.svelte'; import DocxPreview from '../../common/DocxPreview.svelte'; import PptxPreview from '../../common/PptxPreview.svelte'; @@ -17,6 +18,7 @@ import FileCodeEditor from './FileCodeEditor.svelte'; let pdfViewerRef: PDFViewer; + let pptxPdfPreviewRef: PptxPdfPreview; let fileCodeEditorRef: FileCodeEditor; const i18n = getContext('i18n'); @@ -116,6 +118,7 @@ $: isNotebook = getExt(selectedFile) === 'ipynb'; $: isCode = isCodeFile(selectedFile); $: csvDelimiter = getExt(selectedFile) === 'tsv' ? '\t' : ','; + $: isPptx = getExt(selectedFile) === 'pptx'; // For HTML files on system terminals (proxy URL), use path-based serving // so the iframe can resolve relative CSS/JS/image references via cookie auth. @@ -279,6 +282,7 @@ }; export const resetPdfView = () => { + pptxPdfPreviewRef?.resetView(); pdfViewerRef?.resetView(); }; @@ -286,6 +290,7 @@
{:else if filePdfData !== null} - + {#if isPptx} + + {:else} + + {/if} {:else if fileSqliteData !== null} {:else if fileDocxData !== null} diff --git a/src/lib/components/chat/Messages/TerminalOutputFile.svelte b/src/lib/components/chat/Messages/TerminalOutputFile.svelte index 655320af9f..f8c7a13619 100644 --- a/src/lib/components/chat/Messages/TerminalOutputFile.svelte +++ b/src/lib/components/chat/Messages/TerminalOutputFile.svelte @@ -10,7 +10,7 @@ showFileNavPath, terminalServers } from '$lib/stores'; - import { downloadFileBlob, readFile } from '$lib/apis/terminal'; + import { downloadFileBlob, downloadFilePreview, readFile } from '$lib/apis/terminal'; import FilePreview from '$lib/components/chat/FileNav/FilePreview.svelte'; import Icon from '$lib/components/chat/FileNav/Icon.svelte'; import { fileIconName } from '$lib/components/chat/FileNav/fileIcon'; @@ -143,26 +143,61 @@ else if (isVideo(path)) fileVideoUrl = url; else fileAudioUrl = url; } else if (isPdf(path) || isSqlite(path) || isOffice(path)) { - const result = await blobForPreview(); - if (!result) throw new Error(t('Preview failed')); - const arrayBuffer = await result.blob.arrayBuffer(); const ext = getExt(path); if (isPdf(path)) { + const result = await blobForPreview(); + if (!result) throw new Error(t('Preview failed')); + const arrayBuffer = await result.blob.arrayBuffer(); filePdfData = arrayBuffer; } else if (isSqlite(path)) { + const result = await blobForPreview(); + if (!result) throw new Error(t('Preview failed')); + const arrayBuffer = await result.blob.arrayBuffer(); fileSqliteData = arrayBuffer; } else if (ext === 'docx') { - fileDocxData = arrayBuffer; + const preview = await downloadFilePreview( + terminal.url, + terminal.key, + path, + chatId || undefined + ); + if (preview) { + filePdfData = await preview.blob.arrayBuffer(); + } else { + const result = await blobForPreview(); + if (!result) throw new Error(t('Preview failed')); + fileDocxData = await result.blob.arrayBuffer(); + toast.info(t('Preview may differ from download.')); + } } else if (ext === 'xlsx' || ext === 'xls') { + const result = await blobForPreview(); + if (!result) throw new Error(t('Preview failed')); + const arrayBuffer = await result.blob.arrayBuffer(); const XLSX = await import('xlsx'); excelWorkbook = XLSX.read(new Uint8Array(arrayBuffer), { type: 'array' }); excelSheetNames = excelWorkbook.SheetNames; - if (excelSheetNames.length > 0) await loadExcelSheet(excelSheetNames[0]); + if (excelSheetNames.length > 0) { + await loadExcelSheet(excelSheetNames[0]); + } } else if (ext === 'pptx') { - const { pptxToImages } = await import('$lib/utils/pptxToHtml'); - const result = await pptxToImages(arrayBuffer); - fileOfficeSlides = result.images; + const preview = await downloadFilePreview( + terminal.url, + terminal.key, + path, + chatId || undefined + ); + if (preview) { + filePdfData = await preview.blob.arrayBuffer(); + } else { + const result = await blobForPreview(); + if (!result) throw new Error(t('Preview failed')); + const arrayBuffer = await result.blob.arrayBuffer(); + const { pptxToImages } = await import('$lib/utils/pptxToHtml'); + const resultImages = await pptxToImages(arrayBuffer); + fileOfficeSlides = resultImages.images; + toast.info(t('Preview may differ from download.')); + } } } else if (terminal) { fileContent = await readFile(terminal.url, terminal.key, path, chatId || undefined); diff --git a/src/lib/components/common/PptxPdfPreview.svelte b/src/lib/components/common/PptxPdfPreview.svelte new file mode 100644 index 0000000000..edf6d17e97 --- /dev/null +++ b/src/lib/components/common/PptxPdfPreview.svelte @@ -0,0 +1,84 @@ + + +{#if loading} +
+ +
+{:else if error} +
+ {error} +
+{:else} + +{/if} From 9d95a0148b3180ba48186bc6928713f969a69047 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 27 Aug 2026 16:06:25 -0400 Subject: [PATCH 06/99] refac --- src/lib/components/chat/FileNav.svelte | 6 ++- .../chat/FileNav/FilePreview.svelte | 34 +++++--------- ...fPreview.svelte => PdfPagesPreview.svelte} | 14 ++++-- src/lib/components/common/PptxPreview.svelte | 46 ++++++++++--------- 4 files changed, 50 insertions(+), 50 deletions(-) rename src/lib/components/common/{PptxPdfPreview.svelte => PdfPagesPreview.svelte} (90%) diff --git a/src/lib/components/chat/FileNav.svelte b/src/lib/components/chat/FileNav.svelte index 23f9392592..57c3e5a0ff 100644 --- a/src/lib/components/chat/FileNav.svelte +++ b/src/lib/components/chat/FileNav.svelte @@ -2,8 +2,10 @@ // Persists across mount/unmount cycles (module-level, not per-instance) let savedPath = '/'; let savedFileRoot = null; - const treeExpandedCache = new Map(); - const treeContentsCache = new Map(); + /** @type {Map} */ + const treeExpandedCache = new Map(); + /** @type {Map} */ + const treeContentsCache = new Map();
{:else if filePdfData !== null} - {#if isPptx} - - {:else} - - {/if} + {:else if fileSqliteData !== null} {:else if fileDocxData !== null} diff --git a/src/lib/components/common/PptxPdfPreview.svelte b/src/lib/components/common/PdfPagesPreview.svelte similarity index 90% rename from src/lib/components/common/PptxPdfPreview.svelte rename to src/lib/components/common/PdfPagesPreview.svelte index edf6d17e97..5e6df0744d 100644 --- a/src/lib/components/common/PptxPdfPreview.svelte +++ b/src/lib/components/common/PdfPagesPreview.svelte @@ -14,7 +14,7 @@ let loading = false; let error = ''; let slides: string[] = []; - let pptxPreviewRef: PptxPreview; + let pagesPreviewRef: PptxPreview; let pdfDoc: PdfDocument | null = null; let loadToken = 0; @@ -62,7 +62,7 @@ } export const resetView = () => { - pptxPreviewRef?.resetView(); + pagesPreviewRef?.resetView(); }; onDestroy(() => { @@ -80,5 +80,13 @@ {error} {:else} - + {/if} diff --git a/src/lib/components/common/PptxPreview.svelte b/src/lib/components/common/PptxPreview.svelte index 0da42c7a61..07aa82088d 100644 --- a/src/lib/components/common/PptxPreview.svelte +++ b/src/lib/components/common/PptxPreview.svelte @@ -7,6 +7,8 @@ export let currentSlide = 0; export let className = ''; export let targetPage: number | null = null; + export let itemLabel = 'Slide'; + export let listLabel = 'Slides'; let rootEl: HTMLDivElement; let stageEl: HTMLElement; @@ -236,8 +238,8 @@ + +
+ {#if viewerData} + + {:else} +
+ +
+ {/if} +
+ + + From aad107287463769a48084e64ddb392e3004f10ea Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Thu, 27 Aug 2026 16:43:23 -0400 Subject: [PATCH 08/99] refac: reset the shared chats modal search when the modal closes (#29082) --- src/lib/components/layout/ChatsModal.svelte | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lib/components/layout/ChatsModal.svelte b/src/lib/components/layout/ChatsModal.svelte index 26fa8c380f..4cda5f8301 100644 --- a/src/lib/components/layout/ChatsModal.svelte +++ b/src/lib/components/layout/ChatsModal.svelte @@ -44,6 +44,10 @@ export let orderBy = 'updated_at'; export let direction = 'desc'; // 'asc' or 'desc' + $: if (!show) { + query = ''; + } + export let chatList = null; export let allChatsLoaded = false; export let chatListLoading = false; From 98c0ac9355574ec4283bfff239f16743dda6db14 Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Thu, 27 Aug 2026 16:43:36 -0400 Subject: [PATCH 09/99] fix: stop the workspace model id and timestamp overlaying the model name on narrow screens (#29084) --- src/lib/components/workspace/Models.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/components/workspace/Models.svelte b/src/lib/components/workspace/Models.svelte index 07c34e016f..3b0513bfe7 100644 --- a/src/lib/components/workspace/Models.svelte +++ b/src/lib/components/workspace/Models.svelte @@ -735,14 +735,14 @@ {model.name}
{model.id}
From f7db201ff5462ee6643b748686f0d2701212c2df Mon Sep 17 00:00:00 2001 From: Aleix Dorca Date: Thu, 27 Aug 2026 22:43:58 +0200 Subject: [PATCH 10/99] i18n: Update catalan translation.json (new strings and typos) (#29043) --- src/lib/i18n/locales/ca-ES/translation.json | 246 ++++++++++---------- 1 file changed, 123 insertions(+), 123 deletions(-) diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index 9fd7306a35..1a65f38e8d 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -147,7 +147,7 @@ "Advanced MinerU parsing parameters in JSON format.": "Paràmetres avançats d'anàlisi de MinerU en format JSON.", "Advanced Parameters": "Paràmetres avançats", "Advanced Params": "Paràmetres avançats", - "After changing the embedding model, reindex knowledge, knowledge search, and memory vectors for changes to take effect.": "", + "After changing the embedding model, reindex knowledge, knowledge search, and memory vectors for changes to take effect.": "Després de canviar el model d'incrustació, torna a indexar el coneixement, la cerca de coneixement i els vectors de memòria perquè els canvis tinguin efecte.", "All": "Tots", "All Chats": "Tots els xats", "All chats have been unarchived.": "Tots els xats han estat desarxivats.", @@ -161,8 +161,8 @@ "All time": "Sempre", "All Users": "Tots els usuaris", "All users and system events": "Tots els usuaris i esdeveniments del sistema", - "Allow": "", - "Allow {{NAME}}?": "", + "Allow": "Permetre", + "Allow {{NAME}}?": "Vols permetre {{NAME}}?", "Allow artifacts to access same-origin browser APIs inside the sandbox.": "Permetre que els artefactes accedeixin a les API del navegador del mateix origen dins del sandbox.", "Allow automatic names for new chats.": "Permetre noms automàtics per a xats nous.", "Allow browser notifications for completed responses.": "Permetre les notificacions del navegador per a les respostes completades.", @@ -179,7 +179,7 @@ "Allow Continue Response": "Permetre continuar la resposta", "Allow delegated sub-agents to keep running while the parent chat continues.": "Permetre que els subagents delegats continuïn funcionant mentre continua el xat principal.", "Allow Delete Messages": "Permetre eliminar missatges", - "Allow downloads inside sandboxed iframes.": "", + "Allow downloads inside sandboxed iframes.": "Permet descàrregues dins d'iframes sandbox.", "Allow File Upload": "Permetre la pujada d'arxius", "Allow forms inside sandboxed artifact iframes.": "Permetre formularis dins d'iframes d'artefactes en sandbox.", "Allow Google Drive as a document source.": "Permetre Google Drive com a font de documents.", @@ -192,15 +192,15 @@ "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 scripts inside sandboxed iframes.": "", + "Allow scripts inside sandboxed iframes.": "Permetre scripts dins d'iframes en sandbox.", "Allow Sharing With Groups": "Permetre compartir amb grups", "Allow Sharing With Users": "Permetre compartir amb usuaris", "Allow Speech to Text": "Permetre Parla a Text", "Allow Temporary Chat": "Permetre el xat temporal", - "Allow terminal previews to access same-origin browser APIs.": "", + "Allow terminal previews to access same-origin browser APIs.": "Permet que les previsualitzacions del terminal accedeixin a les API del navegador del mateix origen.", "Allow Text to Speech": "Permetre Text a Parla", "Allow the AI to delegate tasks to sub-agents. Each sub-agent creates a real chat with full tool access. Uses additional LLM calls.": "Permetre que l'IA delegui tasques als subagents. Cada subagent crea un xat real amb accés complet a l'eina. Utilitza trucades addicionals de LLM.", - "Allow Tool Call": "", + "Allow Tool Call": "Permetre la crida a l'eina", "Allow User Location": "Permetre la ubicació de l'usuari", "Allow users to access calendar features.": "Permetre als usuaris accedir a les funcions del calendari.", "Allow users to authenticate with an LDAP directory.": "Permetre als usuaris autenticar-se amb un directori LDAP.", @@ -244,7 +244,7 @@ "API Key": "clau API", "API Key / Token": "Clau de l'API/Token", "API Key created.": "clau API creada.", - "API Key deleted.": "", + "API Key deleted.": "S'ha suprimit la clau de l'API.", "API Key Endpoint Restrictions": "Restriccions del punt d'accés de la Clau API", "API key for embedding requests.": "Clau API per incrustar sol·licituds.", "API key sent to Docling.": "Clau de l'API enviada a Docling.", @@ -298,7 +298,7 @@ "Ask a question": "Fer una pregunta", "Ask a test question": "Fes una pregunta de prova", "Ask this knowledge source a test question": "Fes una pregunta de prova a aquesta font de coneixement", - "Ask User": "", + "Ask User": "Pregunta a l'usuari", "Assistant": "Assistent", "Assistant messages": "Missatges de l'assistent", "Async Embedding Processing": "Procés d'incrustat asíncron", @@ -320,7 +320,7 @@ "Auth required": "Es requereix l'autenticació", "Authenticate": "Autenticar", "Authentication": "Autenticació", - "Authorize OAuth": "", + "Authorize OAuth": "Autoritzar OAuth", "Auto": "Automàtic", "Auto (Random)": "Automàtic (aleatori)", "Auto Redirect": "Redirecció automàtica", @@ -424,7 +424,7 @@ "Change User Role": "Canviar el rol d'usuari", "Channel": "Canal", "Channel deleted successfully": "Canal suprimit correctament", - "Channel is required": "", + "Channel is required": "El canal és obligatori", "Channel Name": "Nom del canal", "Channel name cannot be empty.": "El nom del canal no pot estar buit.", "Channel name must be less than 128 characters": "El nom del canal ha de tenir menys de 128 caràcters", @@ -434,7 +434,7 @@ "Character": "Personatge", "Chat": "Xat", "Chat actions": "Accions de xat", - "Chat archived.": "Xar arxivat", + "Chat archived.": "Xat arxivat", "Chat Background Image": "Imatge de fons del xat", "Chat Bubble UI": "Chat Bubble UI", "Chat Completions": "Completacions de xat", @@ -445,14 +445,14 @@ "Chat forked": "Xat bifurcat", "Chat history": "Historial de xats", "Chat History": "Historial de xats", - "Chat Hover Previews": "", + "Chat Hover Previews": "Previsualitzacions del xat", "Chat ID": "ID del xat", "Chat is too short to compact": "El xat és massa curt per compactar", "Chat moved successfully": "El xat s'ha mogut correctament", "Chat Permissions": "Permisos del xat", "Chat Tags Auto-Generation": "Generació automàtica d'etiquetes del xat", "Chat unshared successfully.": "El xat s'ha deixat de compartir correctament", - "Chat Uploads": "", + "Chat Uploads": "Càrregues de xat", "Chat Variables": "Variables de xat", "Chat Variables have conflicting model definitions": "Les variables de xat tenen definicions de model contradictòries", "chats": "xats", @@ -461,12 +461,12 @@ "Chats Public Sharing": "Compartició pública dels xats", "Check Again": "Comprovar-ho de nou", "Check for updates": "Comprovar si hi ha actualitzacions", - "Check OAuth Discovery": "", + "Check OAuth Discovery": "Comprovar OAuth Discovery", "Checking for updates...": "Comprovant actualitzacions...", "Choose a dedicated model for context compaction summaries. Current Model follows the active chat model.": "Escull un model dedicat per als resums de compactació de context. El model actual segueix el model de xat actiu.", "Choose a model before saving...": "Triar un model abans de desar...", "Choose automatic, left-to-right, or right-to-left text flow.": "Escull el flux de text automàtic, d'esquerra a dreta o de dreta a esquerra.", - "Choose channel": "", + "Choose channel": "Tria el canal", "Choose fallback models for background tasks. Current Model follows the active chat model.": "Escull models alternatius per a tasques en segon pla. El model actual segueix el model de xat actiu.", "Choose folder": "Escull la carpeta", "Choose how extracted text is split before indexing.": "Escull com es divideix el text extret abans de la indexació.", @@ -489,7 +489,7 @@ "Choose the speech provider used for assistant audio output.": "Escull el proveïdor de veu utilitzat per a la sortida d'àudio de l'assistent.", "Choose the transcription provider used for audio input.": "Escull el proveïdor de transcripció utilitzat per a l'entrada d'àudio.", "Choose where model responses to root-level channel mentions are posted.": "Escull on es publiquen les respostes del model a les mencions del canal arrel.", - "Choose where terminal display_file results appear by default.": "", + "Choose where terminal display_file results appear by default.": "Tria on apareixen els resultats del fitxer_visualització del terminal per defecte.", "Choose whether Enter sends immediately or uses Ctrl+Enter.": "Escull si Enter envia immediatament o utilitza Ctrl+Enter.", "Choose whether the app opens to the default home or chat view.": "Escull si l'aplicació s'obre a la vista d'inici o de xat predeterminada.", "Chunk Min Size Target": "Objectiu de mida mínima del fragment", @@ -510,7 +510,7 @@ "Clear Memory": "Esborrar la memòria", "Clear search": "Esborrar la cerca", "Clear status": "Esborrar l'estat", - "Clear vector storage and knowledge indexing data.": "Esboarrar l'emmagatzematge de vectors i dades d'indexació de coneixement.", + "Clear vector storage and knowledge indexing data.": "Esborrar l'emmagatzematge de vectors i dades d'indexació de coneixement.", "click here": "prem aquí", "Click here for filter guides.": "Clica aquí per l'ajuda dels filtres.", "Click here for help.": "Clica aquí per obtenir ajuda.", @@ -535,14 +535,14 @@ "Close": "Tancar", "Close Banner": "Tancar el bàner", "Close chat controls": "Tancar els controls de xat", - "Close citation modal": "Tancar el model de citatció", + "Close citation modal": "Tancar la finestra modal de citació", "Close Configure Connection Modal": "Tancar la finestra de configuració de la connexió", "Close feedback": "Tancar el retorn", "Close modal": "Tancar el modal", "Close Modal": "Tancar el modal", "Close Sidebar": "Tancar la barra lateral", "cloud": "núvol", - "CMU ARCTIC speaker embedding name": "Nom de l'altaveu d'incrustació CMU ARCTIC", + "CMU ARCTIC speaker embedding name": "Nom del parlant d'incrustació CMU ARCTIC", "Code Block": "Bloc de codi", "Code Editor": "Editor de codi", "Code execution": "Execució de codi", @@ -558,7 +558,7 @@ "Collapse code blocks by default.": "Col·lapsar els blocs de codi per defecte.", "Collection": "Col·lecció", "Collection Field": "Camp de col·lecció", - "Collections": "Col·lecccions", + "Collections": "Col·leccions", "Color": "Color", "Combine semantic and keyword retrieval.": "Combinar la recuperació semàntica i de paraules clau.", "ComfyUI": "ComfyUI", @@ -627,7 +627,7 @@ "Content Extraction Engine": "Motor d'extracció de contingut", "Content Field": "Camp de contingut", "Content lengths (character counts only)": "Mida del contingut (només els caràcters)", - "Content matches": "", + "Content matches": "Coincidència de contingut", "Context": "Context", "Context compacted": "Context compactat", "Context Compaction": "Compactació del context", @@ -652,7 +652,7 @@ "Conversation saved successfully": "Conversa desada correctament", "Convert long pasted text into a file attachment.": "Converteix el text enganxat llargament en un fitxer adjunt.", "Copied": "Copiat", - "Copied link to clipboard": "Enllaç copiat al portaretalls", + "Copied link to clipboard": "Enllaç copiat al porta-retalls", "Copied shared chat URL to clipboard!": "S'ha copiat la URL compartida al porta-retalls!", "Copied to clipboard": "Copiat al porta-retalls", "Copy": "Copiar", @@ -708,7 +708,7 @@ "Credential used for Document Intelligence.": "Credencial utilitzada per a Document Intelligence.", "Credentials used to authenticate with the Jupyter server.": "Credencials utilitzades per autenticar-se amb el servidor Jupyter.", "CSV Import": "Importar CSV", - "CSV: Name,Email": "", + "CSV: Name,Email": "CSV: Name,Email", "Ctrl+Enter to Send": "Ctrl+Enter per enviar", "Current": "Actual", "Current Model": "Model actual", @@ -733,7 +733,7 @@ "Database": "Base de dades", "Datalab Marker API": "API de Datalab Marker", "Datalab Marker service endpoint used for document parsing.": "Punt final del servei Datalab Marker utilitzat per a l'anàlisi de documents.", - "Date is required": "", + "Date is required": "La data és necessària", "Date Modified": "Data de modificació", "Day": "Dia", "DD/MM/YYYY": "DD/MM/YYYY", @@ -747,9 +747,9 @@ "Default action buttons will be used.": "S'utilitzaran els botons d'acció per defecte", "Default description enabled": "Descripcions per defecte habilitades", "Default Features": "Característiques per defecte", - "Default Filters": "Filres per defecte", + "Default Filters": "Filtres per defecte", "Default Group": "Grup per defecte", - "Default Interface Settings": "", + "Default Interface Settings": "Configuració de la interfície per defecte", "Default Model": "Model per defecte", "Default model updated": "Model per defecte actualitzat", "Default permissions": "Permisos per defecte", @@ -771,7 +771,7 @@ "Delete All Chats": "Eliminar tots els xats", "Delete all contents inside this directory": "Eliminar tot el contingut d'aquesta carpeta", "Delete all contents inside this folder": "Eliminar tot el contingut d'aquesta carpeta", - "Delete API Key?": "", + "Delete API Key?": "Vols suprimir la clau de l'API?", "Delete automation?": "Eliminar l'automatització", "Delete calendar": "Eliminar el calendari", "Delete Calendar": "Eliminar el calendari", @@ -799,9 +799,9 @@ "Deleted {{name}}": "S'ha eliminat {{name}}", "Deleted {{ok}} of {{total}} items": "S'han eliminat {{ok}} de {{total}} ítems", "Deleted User": "Usuari eliminat", - "Denied {{NAME}}": "", - "Deny": "", - "Deny Tool Call": "", + "Denied {{NAME}}": "S'ha denegat {{NAME}}", + "Deny": "Denegar", + "Deny Tool Call": "Denegar la crida a l'eina", "Deployment names are required for Azure OpenAI": "Els noms de desplegament són requerits per Azure OpenAI", "Desc": "Descendent", "Describe the edit...": "Descriu l'edició...", @@ -810,7 +810,7 @@ "Describe your knowledge base and objectives": "Descriu la teva base de coneixement i objectius", "Description": "Descripció", "Deselect": "Deseleccionar", - "Destination": "", + "Destination": "Destinació", "Detect Artifacts Automatically": "Detectar automàticament els artefactes", "Detect generated artifacts and show them in the artifact workspace.": "Detectar els artefactes generats i mostrar-los a l'espai de treball d'artefactes.", "Detected Variables": "Variables detectades", @@ -877,27 +877,27 @@ "Don't like the style": "No t'agrada l'estil?", "Done": "Fet", "Download": "Descarregar", - "Download \"{{searchValue}}\"": "", - "Download \"{{searchValue}}\" from {{provider}}": "", + "Download \"{{searchValue}}\"": "Descarrega \"{{searchValue}}\"", + "Download \"{{searchValue}}\" from {{provider}}": "Descarrega \"{{searchValue}}\" de {{provider}}", "Download & Delete": "Descarregar i suprimir", "Download all users as CSV.": "Descarregar tots els usuaris com a CSV.", "Download as JSON": "Descarregar com a JSON", "Download as SVG": "Descarrega com a SVG", "Download canceled": "Descàrrega cancel·lada", - "Download CSV Template": "", + "Download CSV Template": "Descarregar la plantilla CSV", "Download every user's chat history as JSON.": "Descarregar l'historial de xat de cada usuari com a JSON.", "Download failed": "La descarrega ha fallat", - "Download Model": "", + "Download Model": "Descarregar model", "Download the application database when supported.": "Descarregar la base de dades de l'aplicació quan sigui compatible.", "Download the current admin configuration as JSON.": "Descarregar la configuració actual de l'administració com a JSON.", "Download your chat history as a JSON export.": "Descarregar el teu historial de xat com a exportació JSON.", - "Downloading \"{{searchValue}}\"": "", + "Downloading \"{{searchValue}}\"": "Descarregant \"{{searchValue}}\"", "Downloading stats...": "Descarregant estadístiques...", "Drag to reorder": "Arrossegar per reordenar", "Draw": "Dibuixar", "Drop any files here to upload": "Arrossega aquí qualsevol fitxer per pujar-lo", "Drop files here": "Arrossega els arxius aquí", - "Drop to upload": "", + "Drop to upload": "Arrossega per carregar", "DuckDuckGo": "DuckDuckGo", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p. ex. '30s','10m'. Les unitats de temps vàlides són 's', 'm', 'h'.", "e.g. 'low', 'medium', 'high'": "p. ex. 'baix', 'mitjà', 'alt'", @@ -915,7 +915,7 @@ "e.g. my_tools": "p. ex. les_meves_eines", "e.g. pdf, docx, txt": "p. ex. pdf, docx, txt", "e.g. Step-by-step instructions for code reviews": "p. ex. instruccions pas a pas per a revisions de codi", - "e.g. Tell me a fun fact": "p. ex. digues-me quelcome divertit", + "e.g. Tell me a fun fact": "p. ex. digues-me quelcom divertit", "e.g. Tell me a fun fact about the Roman Empire": "p. ex. digues-me quelcom divertit sobre l'imperi Romà", "e.g. Tools for performing various operations": "p. ex. Eines per dur a terme operacions", "e.g., 3, 4, 5 (leave blank for default)": "p. ex. 3, 4, 5 (deixa-ho en blanc per utilitzar el per defecte)", @@ -956,7 +956,7 @@ "Emojis": "Emojis", "Empty": "Buit", "Empty message": "Missatge buit", - "Enable accessibility-focused visual enhancements.": "", + "Enable accessibility-focused visual enhancements.": "Activa les millores visuals centrades en l'accessibilitat.", "Enable All": "Habilitar tot", "Enable background sub-agents": "Activar els subagents en segon pla", "Enable Code Execution": "Permetre l'execució de codi", @@ -1049,7 +1049,7 @@ "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 OpenSERP Base URL": "", + "Enter OpenSERP Base URL": "Introduïu l'URL base d'OpenSERP", "Enter PaddleOCR-vl API Base URL": "Introdueix la URL Base de PaddleOCR-vl API", "Enter PaddleOCR-vl API Token": "Introdueix el Token de PaddleOCR-vl API", "Enter Perplexity API Key": "Introdueix la clau API de Perplexity", @@ -1218,7 +1218,7 @@ "Failed to load DOCX file. Please try downloading it instead.": "No s'ha pogut carregar el fitxer DOCX. Si us plau, prova de descarregar-lo.", "Failed to load Excel/CSV file. Please try downloading it instead.": "No s'ha pogut carregar el fitxer Excel/CSV. Si us plau, prova de descarregar-lo.", "Failed to load file content.": "No s'ha pogut carregar el contingut del fitxer", - "Failed to load folder": "", + "Failed to load folder": "No s'ha pogut carregar la carpeta", "Failed to load Interface settings": "No s'ha pogut carregar la configuració de la interfície", "Failed to load policy: {{error}}": "No s'ha pogut carregar la política: {{error}}", "Failed to load PPTX file. Please try downloading it instead.": "No s'ha pogut carregar el fitxer PPTX. Si us plau, prova de descarregar-lo.", @@ -1237,7 +1237,7 @@ "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 save webhook": "No s'ha pogut desar el webhook", - "Failed to search files": "", + "Failed to search files": "No s'han pogut cercar els fitxers", "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", "Failed to update status": "No s'ha pogut actualitzar l'estat", @@ -1272,9 +1272,9 @@ "File Upload": "Pujar arxiu", "File uploaded successfully": "Arxiu pujat satisfactòriament", "Filename": "Nom de l'arxiu", - "Filename matches": "", + "Filename matches": "El nom del fitxer coincideix", "Files": "Arxius", - "Filesystem": "", + "Filesystem": "Sistema de fitxers", "Fill the required fields first.": "Omple primer els camps obligatoris.", "Fill the source fields and test query first.": "Omple primer els camps de la font i la consulta de prova.", "Filter": "Filtre", @@ -1408,7 +1408,7 @@ "Hide": "Amaga", "Hide All": "Amagar tots", "Hide from Sidebar": "Amagar de la barra lateral", - "Hide Hidden Files": "", + "Hide Hidden Files": "Amaga els fitxers ocults", "Hide Model": "Amagar el model", "High": "Alt", "High Contrast Mode": "Mode d'alt contrast", @@ -1426,14 +1426,14 @@ "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.": "Afirmo que he llegit i entenc les implicacions de la meva acció. Soc conscient dels riscos associats a l'execució de codi arbitrari i he verificat la fiabilitat de la font.", "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", + "ID copied to clipboard": "L'ID s'ha copiat al porta-retalls", "Identity audit": "Auditoria d'identitat", "Idle only": "Només inactiu", "Idle Timeout": "Temps d'espera d'inactivitat", - "iframe Sandbox Allow Downloads": "", + "iframe Sandbox Allow Downloads": "Permetre descàrregues iframe Sandbox", "iframe Sandbox Allow Forms": "Permetre formularis sandbox iframe", "iframe Sandbox Allow Same Origin": "Permetre same-origin sandbox iframe", - "iframe Sandbox Allow Scripts": "", + "iframe Sandbox Allow Scripts": "Permetre scripts sandbox iframe", "Image": "Imatge", "Image Compression": "Compressió d'imatges", "Image Compression Height": "Alçada de la compressió d'imatges", @@ -1448,7 +1448,7 @@ "Image Prompt Generation": "Generació d'indicacions d'imatge", "Image Prompt Generation Prompt": "Indicació per a la generació d'indicacions d'imatge", "Image Size": "Mida de la imatge", - "Image unavailable": "", + "Image unavailable": "Imatge no disponible", "image/*, video/*": "imatge/*, vídeo/*", "Images": "Imatges", "Import": "Importar", @@ -1456,7 +1456,7 @@ "Import chat history from a JSON export file.": "Importar l'historial de xats a partir d'un fitxer JSON", "Import Chats": "Importar xats", "Import Config": "Importar la configuració", - "Import CSV": "", + "Import CSV": "Importar CSV", "Import From Link": "Importar des d'un enllaç", "Import JSON": "Importar JSON", "Import Models": "Importar models", @@ -1468,7 +1468,7 @@ "Important Update": "Actualització important", "Imported automations successfully": "Automatitzacions importades correctament", "Imported notes successfully": "Notes importades correctament", - "Importing...": "", + "Importing...": "S'està important...", "Inactive": "No actiu", "Include": "Incloure", "Include saved memories in the system context.": "Incloure les memòries desades al context del sistema.", @@ -1482,10 +1482,10 @@ "Inject stored memories into conversation context": "Injectar la memòria emmagatzemats al context de la conversa", "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Injectar tot el contingut com a context per a un processament complet, això es recomana per a consultes complexes.", "Inject the entire content as context for comprehensive processing.": "Injectar tot el contingut com a context per a un processament complet.", - "Inline": "", + "Inline": "En línia", "Input": "Entrada", "Input Key (e.g. text, unet_name, steps)": "Entra la clau (p. ex. text, unet_name, steps)", - "Input needed": "", + "Input needed": "Es necessita entrada", "Input Variables": "Variables d'entrada", "Insert": "Inserir", "Insert Follow-Up Prompt to Input": "Inserir un missatge de continuació per a l'entrada", @@ -1502,7 +1502,7 @@ "Interface": "Interfície", "Interface Settings Access": "Accés a la configuració de la interfície", "Invalid file format.": "Format d'arxiu no vàlid.", - "Invalid format.": "", + "Invalid format.": "Format no vàlid.", "Invalid JSON file": "Arxiu JSON no vàlid", "Invalid JSON format": "Format JSON no vàlid", "Invalid JSON format for ComfyUI Edit Workflow.": "Format JSON no vàlid per al Workflow de ComfyUI d'edició", @@ -1543,7 +1543,7 @@ "Knowledge Access": "Accés al coneixement", "Knowledge Base": "Base de coneixement", "Knowledge base has been reset": "La base de coneixement s'ha reiniciat", - "Knowledge base not found.": "", + "Knowledge base not found.": "No s'ha trobat la base de coneixement.", "Knowledge created successfully.": "Coneixement creat correctament.", "Knowledge deleted successfully.": "Coneixement eliminat correctament.", "Knowledge Description": "Descripció del coneixement", @@ -1617,8 +1617,8 @@ "Live": "Live", "llama.cpp": "llama.cpp", "LLMs can make mistakes. Verify important information.": "Els models de llenguatge poden cometre errors. Verifica la informació important.", - "LM Studio": "", - "Load Model": "", + "LM Studio": "LM Studio", + "Load Model": "Carregar model", "Loaded": "Carregat", "Loader": "Carregador", "Loading Kokoro.js...": "Carregant Kokoro.js", @@ -1664,7 +1664,7 @@ "Max concurrent": "Màxim concurrents", "Max iterations": "Màxim d'iteracions", "Max output": "Sortida màxima", - "Max Speakers": "Nombre màxim d'altaveus", + "Max Speakers": "Nombre màxim de parlants", "Max tokens to retrieve (1024-32768, default 8192)": "Nombre màxim de tokens a obtenir (1024-32768, per defecte 8192)", "Max Upload Count": "Nombre màxim de càrregues", "Max Upload Size": "Mida màxima de càrrega", @@ -1747,18 +1747,18 @@ "Model Capabilities": "Capacitats del model", "Model created successfully!": "Model creat correctament", "Model Defaults": "Models per defecte", - "Model deleted successfully": "", - "Model download started": "", + "Model deleted successfully": "El model s'ha suprimit correctament", + "Model download started": "S'ha iniciat la descàrrega del model", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "S'ha detectat el camí del sistema de fitxers del model. És necessari un nom curt del model per actualitzar, no es pot continuar.", "Model Filtering": "Filtrat de models", "Model ID": "Identificador del model", - "Model ID is already added": "", + "Model ID is already added": "L'identificador del model ja s'ha afegit", "Model ID is required.": "L'ID del model és necessari", "Model IDs": "Identificadors del model", "Model is now private": "El model ara és privat", "Model is now public": "El model ara és públic", - "Model list refreshed": "", - "Model loaded successfully": "", + "Model list refreshed": "S'ha actualitzat la llista de models", + "Model loaded successfully": "El model s'ha carregat correctament", "Model Name": "Nom del model", "Model name already exists, please choose a different one": "Aquest nom de model ja existeix, si us plau, tria'n un altre", "Model Name is required.": "El nom del model és necessari", @@ -1771,7 +1771,7 @@ "Model Parameters": "Paràmetres del model", "Model Params": "Paràmetres del model", "Model Permissions": "Permisos dels models", - "Model providers": "", + "Model providers": "Proveïdors de models", "Model removed from pinned models": "Model eliminat dels models fixats", "Model removed from selected models": "S'ha eliminat el model dels models seleccionats", "Model Response Mode": "Mode de resposta del model", @@ -1837,7 +1837,7 @@ "New Tool": "Nova eina", "New Webhook": "Nou webhook", "new-channel": "nou-canal", - "Next": "", + "Next": "Següent", "Next message": "Missatge següent", "Next month": "El mes vinent", "Next page": "Pàgina següent", @@ -1849,12 +1849,12 @@ "No additional headers are sent unless configured.": "No s'envia cap capçalera addicional tret que estigui configurada.", "No authentication": "Sense autenticació", "No automations found": "No s'ha trobat cap automatització", - "No channels": "", + "No channels": "Sense canals", "No chat alerts": "No hi ha alertes de xat", "No chat history": "No hi ha historial de xat", "No chat to compact": "No hi ha xat per compactar", "No chat to fork": "No hi ha cap xat a bifurcar", - "No chats": "", + "No chats": "No hi ha xats", "No chats found": "No s'han trobat xats", "No chats found for this user.": "No s'han trobat xats per a aquest usuari.", "No chats found.": "No s'ha trobat xats.", @@ -1946,7 +1946,7 @@ "OAuth 2.1 (Static)": "OAuth 2.1 (Estàtic)", "OAuth client identifier from the provider.": "Identificador de client OAuth del proveïdor.", "OAuth client secret from the provider.": "Secret del client OAuth del proveïdor.", - "OAuth discovery successful": "", + "OAuth discovery successful": "La descoberta d'OAuth ha estat correcta", "OAuth ID": "ID OAuth", "OAuth Resource Parameter": "Paràmetre de recurs OAuth", "OAuth Scopes": "Àmbits d'OAuth", @@ -1971,7 +1971,7 @@ "OneDrive": "OneDrive", "Only active during Voice Mode.": "Només actiu en el mode de Veu.", "Only active when \"Paste Large Text as File\" setting is toggled on.": "Només està actiu quan l'opció \"Enganxa text gran com a fitxer\" està activada.", - "Only active when a tool call is waiting for approval.": "", + "Only active when a tool call is waiting for approval.": "Només està actiu quan una crida d'eina està esperant aprovació.", "Only active when the chat input is in focus and an LLM is generating a response.": "Només s'activa quan l'entrada del xat està en focus i un LLM està generant una resposta.", "Only active when the chat input is in focus.": "Només actiu quan l'entrada del xat està en focus.", "Only alphanumeric characters and hyphens are allowed": "Només es permeten caràcters alfanumèrics i guions", @@ -1993,7 +1993,7 @@ "Open create menu": "Obrir el menú de creació", "Open detail blocks by default.": "Obrir blocs de detalls per defecte.", "Open file": "Obrir arxiu", - "Open Folder": "", + "Open Folder": "Obre la carpeta", "Open in full screen": "Obrir en pantalla complerta", "Open in new tab": "Obrir en una nova pestanya", "Open link": "Obrir l'enllaç", @@ -2024,12 +2024,12 @@ "OpenAPI Spec": "Especificació OpenAPI", "openapi.json URL or Path": "Camí o URL a openapi.json", "OpenID discovery URL for this provider.": "URL de descobriment d'OpenID per a aquest proveïdor.", - "OpenSERP URL": "", + "OpenSERP URL": "URL d'OpenSERP", "optional": "opcional", "Optional": "Opcional", "Optional API key for Ollama requests.": "Clau API opcional per a peticions a Ollama.", "or": "o", - "Orchestrator": "", + "Orchestrator": "Orquestrador", "Ordered List": "Llista ordenada", "Other": "Altres", "out of": "de", @@ -2053,13 +2053,13 @@ "Passthrough params": "Paràmetres de pas", "Password": "Contrasenya", "Password for the bind DN.": "Contrasenya per al DN d'enllaç.", - "Password updated. Please sign in again.": "", + "Password updated. Please sign in again.": "Contrasenya actualitzada. Si us plau, torna a iniciar la sessió.", "Passwords do not match.": "Les contrasenyes no coincideixen", "Paste inserted prompts as rich text when possible.": "Enganxar les sol·licituds inserides com a text enriquit quan sigui possible.", "Paste Large Text as File": "Enganxa un text llarg com a fitxer", "Path": "Camí", "Path copied": "Camí copiat", - "Pause a response to ask the user a clarifying question": "", + "Pause a response to ask the user a clarifying question": "Posa en pausa una resposta per fer una pregunta d'aclariment a l'usuari", "Paused": "Pausat", "PDF document (.pdf)": "Document PDF (.pdf)", "PDF Extract Images (OCR)": "Extreu imatges del PDF (OCR)", @@ -2071,8 +2071,8 @@ "Pending Accounts": "Comptes pendents", "Pending User Overlay Content": "Contingut de la finestra d'usuari pendent", "Pending User Overlay Title": "Títol de la finestra d'usuari pendent", - "Per automation": "", - "Per chat": "", + "Per automation": "Per automatització", + "Per chat": "Per xat", "Percentage of recent messages to keep after older messages are summarized.": "Percentatge de missatges recents que cal conservar després de resumir els missatges més antics.", "Permanently delete every chat after confirmation.": "Suprimeix permanentment cada xat després de la confirmació.", "Permission denied when accessing media devices": "Permís denegat en accedir a dispositius multimèdia", @@ -2120,7 +2120,7 @@ "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 before authorizing OAuth": "", + "Please save the connection before authorizing OAuth": "Si us plau, desa la connexió abans d'autoritzar 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.", "Please select a model.": "Si us plau, selecciona un model.", "Please select a reason": "Si us plau, selecciona una raó", @@ -2138,14 +2138,14 @@ "Preferred transcript language codes, separated by commas.": "Codis de llengua de transcripció preferits, separats per comes.", "Prefix ID": "Identificador del prefix", "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "L'identificador de prefix s'utilitza per evitar conflictes amb altres connexions afegint un prefix als ID de model; deixa'l en blanc per desactivar-lo.", - "Preparing {{NAME}}...": "", + "Preparing {{NAME}}...": "S'està preparant {{NAME}}...", "Preparing download...": "Preparant la descàrrega...", "Press keys...": "Prem una tecla...", "Prevent File Creation": "Prevenir la creació d'arxius", "Preview": "Previsualització", "Preview Access": "Previsualitza l'accés", - "Preview failed": "", - "Previous": "", + "Preview failed": "La previsualització ha fallat", + "Previous": "Anterior", "Previous 30 days": "30 dies anteriors", "Previous 7 days": "7 dies anteriors", "Previous message": "Missatge anterior", @@ -2205,13 +2205,13 @@ "Reasoning Effort": "Esforç de raonament", "Reasoning Tags": "Etiqueta de raonament", "Reasoning text...": "Text de raonament...", - "Rebuild knowledge file, knowledge search, and memory vectors using the current embedding model.": "", - "Rebuild vectors for existing knowledge files, knowledge search, and memories.": "", + "Rebuild knowledge file, knowledge search, and memory vectors using the current embedding model.": "Reconstruir el fitxer de coneixement, la cerca de coneixement i els vectors de memòria utilitzant el model d'inserció actual.", + "Rebuild vectors for existing knowledge files, knowledge search, and memories.": "Reconstruir vectors per a fitxers de coneixement existents, cerca de coneixement i memòries.", "Receives matching events across the instance, including system/config events and events associated with any user.": "Rep esdeveniments coincidents a tota la instància, inclosos els esdeveniments del sistema/configuració i els esdeveniments associats a qualsevol usuari.", "Receives matching events that are not associated with a user.": "Rep esdeveniments coincidents que no estan associats a un usuari.", "Receives matching user-associated events only when the actor, user subject, or user data matches these users or current group members. System/config events are not sent.": "Rep esdeveniments coincidents associats a l'usuari només quan l'actor, el subjecte de l'usuari o les dades de l'usuari coincideixen amb aquests usuaris o membres del grup actual. No s'envien esdeveniments de sistema/configuració.", "Recently Used": "Recentment utilitzat", - "Recommended": "", + "Recommended": "Recomanat", "Reconnected": "Reconnectat", "Record": "Enregistrar", "Record voice": "Enregistrar la veu", @@ -2238,8 +2238,8 @@ "Registration failed": "El registre ha fallat", "Registration successful": "Registre correcte", "Reindex": "Reindexar", - "Reindex Embedding Data": "", - "Reindex Knowledge and Memory Vectors": "", + "Reindex Embedding Data": "Reindexar les dades d'incrustació", + "Reindex Knowledge and Memory Vectors": "Reindexar els vectors de coneixement i memòria", "Release Notes": "Notes de la versió", "Releases": "Versions", "Relevance": "Rellevància", @@ -2289,7 +2289,7 @@ "Reset Upload Directory": "Restableix el directori de pujades", "Reset Vector Storage/Knowledge": "Restableix el Repositori de vectors/Coneixement", "Reset view": "Netejar la vista", - "Reset zoom": "", + "Reset zoom": "Restableix el zoom", "Response": "Resposta", "Response Auto-Scroll": "Desplaçament automàtic de resposta", "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Les notificacions de resposta no es poden activar perquè els permisos del lloc web han estat rebutjats. Comprova les preferències del navegador per donar l'accés necessari.", @@ -2357,12 +2357,12 @@ "Search and view user chat history": "Cerca i mostra l'historial de xats", "Search Automations": "Cercar automatitzacions", "Search Base": "Base de cerca", - "Search channels": "", + "Search channels": "Cerca canals", "Search channels and channel messages": "Cerca els canals i els missatges als canals", "Search Chats": "Cercar xats", "Search Collection": "Cercar col·leccions", "Search Files": "Cerca arxius", - "Search files and contents": "", + "Search files and contents": "Cerca fitxers i continguts", "Search filters": "Filtres de cerca", "Search Filters": "Filtres de cerca", "Search folders": "Cercar carpetes", @@ -2429,7 +2429,7 @@ "Select an embedding model engine": "Seleccionar un motor d'incrustació", "Select an engine": "Seleccionar un motor", "Select an installed pipeline to configure or remove.": "Seleccionar una pipeline instal·lada per configurar o eliminar", - "Select an instance": "", + "Select an instance": "Selecciona una instància", "Select an Ollama instance": "Seleccionar una instància d'Ollama", "Select an option": "Seleccionar una opció", "Select an output format": "Seleccionar un format de sortida", @@ -2448,7 +2448,7 @@ "Select the Gemini endpoint method to call.": "Seleccionar el punt de connexió de Gemini a cridar.", "Select the local model precision used by Kokoro.js.": "Seleccionar la precisió del model local utilitzat per Kohoro.js.", "Select the Pipelines server to manage.": "Seleccionar el servidor de Pipelines a gestionar.", - "Select the Tika server API version.": "", + "Select the Tika server API version.": "Selecciona la versió de l'API del servidor Tika.", "Select Tool": "Selecionar eina", "Select view": "Seleccionar una vista", "Selected": "Seleccionat", @@ -2494,7 +2494,7 @@ "Set embedding model": "Establir el model d'incrustació", "Set embedding model (e.g. {{model}})": "Establir el model d'incrustació (p. ex. {{model}})", "Set reranking model (e.g. {{model}})": "Establir el model de reavaluació (p. ex. {{model}})", - "Set system-wide interface defaults for every account. Personal settings override these defaults.": "", + "Set system-wide interface defaults for every account. Personal settings override these defaults.": "Establir els valors predeterminats de la interfície a tot el sistema per a cada compte. La configuració personal anul·la aquests valors predeterminats.", "Set the birth date saved with your profile.": "Establir la data de naixement desada amb el teu perfil.", "Set the default system prompt for new chats.": "Establir la sol·licitud predeterminada del sistema per a nous xats.", "Set the display name shown across your account.": "Establir el nom de visualització que es mostra al teu compte.", @@ -2512,13 +2512,13 @@ "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.": "Establir les seqüències d'aturada a utilitzar. Quan es trobi aquest patró, el LLM deixarà de generar text. Es poden establir diversos patrons de parada especificant diversos paràmetres de parada separats en un fitxer model.", "Setting": "Preferència", "Settings": "Preferències", - "settings configured": "", + "settings configured": "configuració establerta", "Settings Permissions": "Preferències de permisos", "Settings saved successfully!": "Les preferències s'han desat correctament", "Shapes the short label generated for each chat.": "Donar forma a l'etiqueta curta generada per a cada xat.", "Share": "Compartir", "Share Chat": "Compartir el xat", - "Share link copied to clipboard.": "Compartir l'enllaç copiat al portaretalls", + "Share link copied to clipboard.": "Compartir l'enllaç copiat al porta-retalls", "Share to Open WebUI Community": "Compartir amb la comunitat OpenWebUI", "Share your background and interests": "Compartir la teva informació i interessos", "Share your current location with features that can use it.": "Compartir la teva ubicació actual amb funcions que la puguin utilitzar.", @@ -2529,7 +2529,7 @@ "Sharing Permissions": "Compartir els permisos", "Show": "Mostrar", "Show \"What's New\" Modal on Login": "Veure 'Què hi ha de nou' a l'entrada", - "Show a floating preview of recent messages when hovering a chat in the sidebar.": "", + "Show a floating preview of recent messages when hovering a chat in the sidebar.": "Mostra una vista prèvia flotant dels missatges recents quan passes el cursor per un xat a la barra lateral.", "Show admin contact details while an account waits for approval.": "Mostrar les dades de contacte de l'administrador mentre un compte espera l'aprovació.", "Show All": "Mostrar tot", "Show all ({{COUNT}} characters)": "Mostra tot ({{COUNT}} caràcters)", @@ -2538,8 +2538,8 @@ "Show Files on Terminal Select": "Mostra fitxers en seleccionar terminal", "Show formatting controls in the rich text composer.": "Mostrar els controls de format a l'editor de text enriquit.", "Show Formatting Toolbar": "Mostrar la barra de format", - "Show Full access and Ask for approval in the chat input menu.": "", - "Show Hidden Files": "", + "Show Full access and Ask for approval in the chat input menu.": "Mostra «Accés complet» i «Demana aprovació» al menú d'entrada del xat.", + "Show Hidden Files": "Mostra els fitxers ocults", "Show image preview": "Mostrar la previsualització de la imatge", "Show Model": "Mostrar el model", "Show more": "Mostrar-ne més", @@ -2554,7 +2554,7 @@ "Show your support!": "Mostra el teu suport!", "Show your username label instead of You in chat bubbles.": "Mostrar l'etiqueta del teu nom d'usuari en lloc de Tu a les bombolles de xat.", "Showcased creativity": "Creativitat mostrada", - "Sidebar": "", + "Sidebar": "Barra lateral", "Sign in": "Iniciar sessió", "Sign in to {{WEBUI_NAME}}": "Iniciar sessió a {{WEBUI_NAME}}", "Sign in to {{WEBUI_NAME}} with LDAP": "Iniciar sessió a {{WEBUI_NAME}} amb LDAP", @@ -2565,7 +2565,7 @@ "simultaneous sub-agents": "subagents simultanis", "Single": "Únic", "Sink List": "Enfonsar la llista", - "Size": "", + "Size": "Mida", "sk-1234": "sk-1234", "Skill created successfully": "Habilitat creada correctament", "Skill deleted successfully": "Habilitat suprimida correctament", @@ -2605,7 +2605,7 @@ "Start new chats as temporary unless changed.": "Iniciar xats nous com a temporals tret que es modifiqui.", "Start of the channel": "Inici del canal", "Start Tag": "Etiqueta d'inici", - "Start the chat to use this terminal.": "", + "Start the chat to use this terminal.": "Inicia el xat per utilitzar aquest terminal.", "Starting in {{count}} minutes_one": "Començant en {{count}} minut", "Starting in {{count}} minutes_many": "Començant en {{count}} minuts", "Starting in {{count}} minutes_other": "Començant en {{count}} minuts", @@ -2635,7 +2635,7 @@ "Su_day_of_week": "Diumenge", "Sub Claim": "Reclamació sub", "Sub-agents": "Subagents", - "Submit answers": "", + "Submit answers": "Envia les respostes", "Submit question": "Enviar la pregunta", "Submit suggestion": "Enviar un suggeriment", "Subtitle": "Subtítol", @@ -2683,7 +2683,7 @@ "Task List": "Llista de tasques", "Task Management": "Gestió de tasques", "Task Model": "Model de tasques", - "Task Model Parameters": "", + "Task Model Parameters": "Paràmetres del model de tasca", "Tasks": "Tasques", "tasks completed": "tasques completades", "Tavily API Key": "Clau API de Tavily", @@ -2693,9 +2693,9 @@ "Temporary Chat": "Xat temporal", "Temporary Chat by Default": "Xat temporal per defecte", "Terminal": "Terminal", - "Terminal Contexts": "", - "Terminal File Display": "", - "Terminal Preview Allow Same Origin": "", + "Terminal Contexts": "Contextos del terminal", + "Terminal File Display": "Visualització de fitxers de terminal", + "Terminal Preview Allow Same Origin": "Vista prèvia del terminal permet el mateix origen", "Terminal servers saved": "Servidors de terminal desats", "Test": "Prova", "Test must pass before a source is created.": "El test s'ha de passar abans de crear una font.", @@ -2727,7 +2727,7 @@ "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "La temperatura del model. Augmentar la temperatura farà que el model respongui de manera més creativa.", "Theme": "Tema", "There was an error syncing your stats. Please try again.": "S'ha produït un error en sincronitzar les estadístiques. Torna-ho a provar.", - "These settings are read from environment variables and cannot be edited here while {{ENV_VAR}} is disabled.": "", + "These settings are read from environment variables and cannot be edited here while {{ENV_VAR}} is disabled.": "Aquests paràmetres es llegeixen des de variables d'entorn i no es poden editar aquí mentre {{ENV_VAR}} estigui desactivat.", "thinking, output_config": "pensant, output_config", "Thinking...": "Pensant...", "This action cannot be undone. Do you wish to continue?": "Aquesta acció no es pot desfer. Vols continuar?", @@ -2748,10 +2748,10 @@ "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 and cannot be undone.": "Això eliminarà tots els models incloent els personalitzats i no es pot desfer", - "This will delete the cached model and cannot be undone.": "", + "This will delete the cached model and cannot be undone.": "Això suprimirà el model a la memòria cau i no es pot desfer.", "This will permanently delete the calendar \"{{name}}\" and all its events. This action cannot be undone.": "Això eliminarà permanentment el calendari \"{{name}}\" i tots els seus esdeveniments. Aquesta acció no es pot desfer.", "This will remove all files and directories from this knowledge base. This action cannot be undone.": "Això eliminarà tots els fitxers i carpetes d'aquesta base de coneixement. Aquesta acció no es pot desfer.", - "This will revoke the current API key.": "", + "This will revoke the current API key.": "Això revocarà la clau de l'API actual.", "Thorough explanation": "Explicació en detall", "Thought": "Pensament", "Thought for {{DURATION}}": "He pensat durant {{DURATION}}", @@ -2761,12 +2761,12 @@ "Through": "A través de", "Thumbs up/down ratings from users on model responses": "Valoracions de 'm'agrada'/'no' dels usuaris sobre les respostes del model", "Tika": "Tika", - "Tika 3.x": "", - "Tika 4.x": "", + "Tika 3.x": "Tika 3.x", + "Tika 4.x": "Tika 4.x", "Tika server endpoint used for content extraction.": "Punt final del servidor Tika utilitzat per a l'extracció de contingut.", "Tika Server URL": "URL del servidor Tika", "Tika Server URL required.": "La URL del servidor Tika és obligatòria.", - "Tika Server Version": "", + "Tika Server Version": "Versió del servidor Tika", "Tiktoken": "Tiktoken", "Time": "Temps", "Time & Calculation": "Temps i càlculs", @@ -2786,7 +2786,7 @@ "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Per adjuntar la base de coneixement aquí, afegeix-la primer a l'espai de treball \"Coneixement\".", "To learn more about available endpoints, visit our documentation.": "Per obtenir més informació sobre els punts d'accés disponibles, visita la nostra documentació.", "To learn more about SpeechT5,": "Per obtenir més informació sobre SpeechT5,", - "To see the available CMU Arctic speaker embeddings,": "Per veure les incrustacions d'altaveus CMU Arctic disponibles,", + "To see the available CMU Arctic speaker embeddings,": "Per veure les incrustacions dels parlants CMU Arctic disponibles,", "To select actions here, add them to the \"Functions\" workspace first.": "Per seleccionar accions aquí, afegeix-les primer a l'espai de treball \"Funcions\".", "To select default filters here, enable toggleable filters for this model first.": "Per seleccionar els filtres predeterminats aquí, primer activa els filtres que es poden canviar per a aquest model.", "To select filters here, add them to the \"Functions\" workspace first.": "Per seleccionar filtres aquí, afegeix-los primer a l'espai de treball \"Funcions\".", @@ -2814,7 +2814,7 @@ "tokens": "tokens", "Tokens": "Tokens", "Too verbose": "Massa explícit", - "tool": "", + "tool": "eina", "Tool created successfully": "Eina creada correctament", "Tool deleted successfully": "Eina eliminada correctament", "Tool Description": "Descripció de l'eina", @@ -2823,7 +2823,7 @@ "tool loops per sub-agent": "bucles d'eina per subagent", "Tool Menu": "Menú d'eines", "Tool Name": "Nom de l'eina", - "Tool Permissions": "", + "Tool Permissions": "Permisos d'eina", "Tool Servers": "Servidors d'eines", "Tool updated successfully": "Eina actualitzada correctament", "Tools": "Eines", @@ -2848,10 +2848,10 @@ "TTS Voice": "Veu TTS", "Tu_day_of_week": "Dimarts", "Type": "Tipus", - "Type a model ref": "", + "Type a model ref": "Escriu un model de referència", "Type here...": "Escriu aquí...", "Type Hugging Face Resolve (Download) URL": "Escriu la URL de Resolució (Descàrrega) de Hugging Face", - "Type your answer": "", + "Type your answer": "Escriu la teva resposta", "Uh-oh! There was an issue with the response.": "Vaja! Hi ha hagut una incidència amb la resposta.", "UI": "UI", "UI Scale": "Mida de la interfície gràfica", @@ -2862,7 +2862,7 @@ "unknown": "desconegut", "Unknown": "Desconegut", "Unknown User": "Usuari desconegut", - "Unload Model": "", + "Unload Model": "Descarregar model", "Unloads {{FROM_NOW}}": "Es descarrega {{FROM_NOW}}", "Unmute": "No silenciar", "Unpin": "Alliberar", @@ -2896,7 +2896,7 @@ "Upload a workflow.json file exported as API format from ComfyUI.": "Carregar un fitxer workflow.json exportat com a format API des de ComfyUI.", "Upload Audio": "Pujar àudio", "Upload directory": "Pujar directori", - "Upload failed": "", + "Upload failed": "La càrrega ha fallat", "Upload files": "Pujar fitxers", "Upload Files": "Pujar fitxers", "Upload Model": "Pujar model", @@ -2946,7 +2946,7 @@ "User location successfully retrieved.": "Ubicació de l'usuari obtinguda correctament", "User menu": "Menú d'usuari", "User messages": "Missatges d'usuari", - "User not found.": "", + "User not found.": "No s'ha trobat l'usuari.", "User Preview": "Previsualitzar l'usuari", "User ratings (thumbs up/down)": "Valoracions dels usuaris (polze amunt/avall)", "User Status": "Estats d'usuari", @@ -2981,7 +2981,7 @@ "Version": "Versió", "Version {{selectedVersion}} of {{totalVersions}}": "Versió {{selectedVersion}} de {{totalVersions}}", "Version deleted": "Versió eliminada", - "View channel": "", + "View channel": "Veure canal", "View chat": "Veure xat", "View Replies": "Veure les respostes", "View Result from {{NAME}}": "Mostra el resultat de {{NAME}}", @@ -3001,7 +3001,7 @@ "Voice Mode Prompt": "Indicació per al mode de veu", "Wait for the current response to finish before compacting.": "Esperar que finalitzi la resposta actual abans de compactar.", "Wait for the current response to finish before forking.": "Esperar que finalitzi la resposta actual abans de bifurcar.", - "Waiting for upload": "", + "Waiting for upload": "Esperant la pujada", "Waiting for upload...": "Esperant per pujar...", "Warning": "Avís", "Warning:": "Avís:", @@ -3102,6 +3102,6 @@ "YouTube": "YouTube", "Youtube Language": "Idioma de YouTube", "Youtube Proxy URL": "URL de Proxy de Youtube", - "Zoom in": "", - "Zoom out": "" + "Zoom in": "Apropa", + "Zoom out": "Allunya" } From 0afe69e1a744226fcdb2265c7b79741d77d71691 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Thu, 27 Aug 2026 22:44:33 +0200 Subject: [PATCH 11/99] fix: stop deleting user text that looks like a skill mention (#29051) Any `<$...>` run in a chat message was treated as an inline skill mention and removed before the request reached the model, so text like `<$(=MonthStart($(vMaxMonthEndINC)))"}, [Registration day] >` silently vanished mid-message and the model only saw the part before it. The mention regexes accepted any character except `|` and `>` as the skill id, so they matched far more than real mentions. Skill ids are already validated as `[a-z0-9_-]+` when a skill is created, so both regexes now require that charset. Ordinary text passes through untouched while `<$id>`, `<$id|Label>` and `` still resolve and strip as before. Verified against the reported message (now preserved verbatim) and the three mention forms. Co-authored-by: Claude --- backend/open_webui/utils/middleware.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index cc5f57e0c3..d80066e1dd 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -2265,7 +2265,8 @@ def sanitize_tool_pairs(messages: list[dict]) -> list[dict]: return sanitized -SKILL_MENTION_RE = re.compile(r'<(?:\$([^|>]+)(?:\|[^>]*)?|/([^|>]+)\|[^>]*)>') +# Ids are validated as [a-z0-9_-]+ on create; matching that keeps ordinary "<$..." text intact. +SKILL_MENTION_RE = re.compile(r'<(?:\$([a-z0-9_-]+)(?:\|[^>]*)?|/([a-z0-9_-]+)\|[^>]*)>') def _get_text_parts(message: dict) -> list[str]: @@ -2287,7 +2288,7 @@ def extract_skill_ids_from_messages(messages: list[dict]) -> set[str]: return ids -SKILL_MENTION_STRIP_RE = re.compile(r'<(?:\$[^|>]+(?:\|([^>]*))?|/[^|>]+\|([^>]*))>') +SKILL_MENTION_STRIP_RE = re.compile(r'<(?:\$[a-z0-9_-]+(?:\|([^>]*))?|/[a-z0-9_-]+\|([^>]*))>') def strip_skill_mentions(messages: list[dict]) -> None: From 1c5128c4aaf770504515ba951db443aef4a37f45 Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Thu, 27 Aug 2026 16:44:58 -0400 Subject: [PATCH 12/99] fix: keep a calendar event visible after its date is moved (#29085) --- backend/open_webui/models/calendar.py | 3 ++- src/lib/components/calendar/CalendarEventModal.svelte | 7 ++++++- src/lib/components/calendar/CalendarView.svelte | 7 +++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/models/calendar.py b/backend/open_webui/models/calendar.py index 52470f1178..b61bf036fa 100644 --- a/backend/open_webui/models/calendar.py +++ b/backend/open_webui/models/calendar.py @@ -533,7 +533,8 @@ class CalendarEventTable: & (CalendarEvent.start_at < end) & or_( CalendarEvent.end_at.is_(None) & (CalendarEvent.start_at >= start), - CalendarEvent.end_at.isnot(None) & (CalendarEvent.end_at > start), + CalendarEvent.end_at.isnot(None) + & ((CalendarEvent.end_at > start) | (CalendarEvent.start_at >= start)), ) ), # Recurring: fetch all (expansion in Python) diff --git a/src/lib/components/calendar/CalendarEventModal.svelte b/src/lib/components/calendar/CalendarEventModal.svelte index 8c0b724683..55df47a9ef 100644 --- a/src/lib/components/calendar/CalendarEventModal.svelte +++ b/src/lib/components/calendar/CalendarEventModal.svelte @@ -129,7 +129,12 @@ loading = true; try { const startNs = dateTimeToNs(startDate, allDay ? '00:00' : startTime); - const endNs = endDate ? dateTimeToNs(endDate, allDay ? '23:59' : endTime) : undefined; + let endNs = endDate ? dateTimeToNs(endDate, allDay ? '23:59' : endTime) : undefined; + if (endNs !== undefined && endNs < startNs) { + const duration = + event?.end_at && event.end_at > event.start_at ? event.end_at - event.start_at : 0; + endNs = startNs + duration; + } if (event && !event.meta?.automation_id) { const result = await updateCalendarEvent(localStorage.token, event.id, { diff --git a/src/lib/components/calendar/CalendarView.svelte b/src/lib/components/calendar/CalendarView.svelte index 51d4632f23..ec734956f3 100644 --- a/src/lib/components/calendar/CalendarView.svelte +++ b/src/lib/components/calendar/CalendarView.svelte @@ -31,7 +31,10 @@ const startDate = new Date(startMs); const endDate = new Date(endMs); const d = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate()); - const last = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate()).getTime(); + const last = Math.max( + d.getTime(), + new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate()).getTime() + ); while (d.getTime() <= last) { const key = d.getTime().toString(); (map[key] ??= []).push(e); @@ -90,7 +93,7 @@ const dayEndMs = dayStartMs + 86_400_000; return filteredEvents.filter((e) => { const startMs = e.start_at / NS; - const endMs = (e.end_at || e.start_at) / NS; + const endMs = Math.max(startMs, (e.end_at || e.start_at) / NS); return startMs < dayEndMs && endMs >= dayStartMs; }); } From fa7de50c605664754d7d128e2cf1ce2ad02e1653 Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Thu, 27 Aug 2026 16:45:34 -0400 Subject: [PATCH 13/99] refac: align the admin Users tab counts with the workspace tab count behavior (#29080) --- src/lib/components/admin/Users.svelte | 5 ++++- src/lib/components/admin/Users/Groups.svelte | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/lib/components/admin/Users.svelte b/src/lib/components/admin/Users.svelte index feebab8411..a695beb52f 100644 --- a/src/lib/components/admin/Users.svelte +++ b/src/lib/components/admin/Users.svelte @@ -25,6 +25,10 @@ scrollToTab(selectedTab); } + $: if (loaded && selectedTab) { + loadCounts(); + } + const scrollToTab = (tabId) => { const tabElement = document.getElementById(tabId); if (tabElement) { @@ -58,7 +62,6 @@ await goto('/'); } - await loadCounts(); loaded = true; const containerElement = document.getElementById('users-tabs-container'); diff --git a/src/lib/components/admin/Users/Groups.svelte b/src/lib/components/admin/Users/Groups.svelte index 66ea53fb1a..641925fb08 100644 --- a/src/lib/components/admin/Users/Groups.svelte +++ b/src/lib/components/admin/Users/Groups.svelte @@ -48,6 +48,10 @@ return (b.member_count ?? 0) - (a.member_count ?? 0) || a.name.localeCompare(b.name); }); + $: if (loaded) { + adminGroupCount.set(filteredGroups.length); + } + /** @type {any} */ let defaultPermissions = {}; @@ -56,7 +60,6 @@ const setGroups = async () => { groups = await getGroups(localStorage.token); - adminGroupCount.set(groups.length); }; /** @param {any} updatedGroup */ From 87bed3f0b325f537e3e93ad6076cf2088479d5b1 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Thu, 27 Aug 2026 22:56:00 +0200 Subject: [PATCH 14/99] fix: stream post-tool-call thinking into the Thoughts section (#29052) After a tool call, the model's thinking was streamed into the chat as if it were the main response, and only jumped into the collapsed Thoughts section once the turn finished. Every further tool call repeated it. Each tool round appended an empty placeholder message item to the output and sent it to the browser, then dropped it again from the copy used to offset the next round's item indices. The browser therefore held one item more than the backend counted, so the first thinking chunk of the next round was written into that leftover message item and rendered as normal text until the finished output replaced it. The placeholder is removed. It was never needed: a message item is already created when actual content arrives, and dropping it also stops an empty assistant message being sent back to the model on the follow-up request. Co-authored-by: Claude --- backend/open_webui/utils/middleware.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index d80066e1dd..e11830d4f9 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -5790,17 +5790,6 @@ async def streaming_chat_response_handler(response, ctx): item['arguments'] = tc.get('function', {}).get('arguments', '{}') break - # Append a new empty message item for the next response - output.append( - { - 'type': 'message', - 'id': output_id('msg'), - 'status': 'in_progress', - 'role': 'assistant', - 'content': [{'type': 'output_text', 'text': ''}], - } - ) - # Emit citation sources to the frontend for display if citations_enabled: for source in tool_call_sources: From 3749e7dc7463fc78e6638f2587e9f2c320817002 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Fri, 28 Aug 2026 00:25:49 +0200 Subject: [PATCH 15/99] fix: stop streaming responses breaking on a duplicate output key (#29053) * fix: stop streaming responses breaking on a duplicate output key With reasoning-capable models the chat froze mid-stream: the first chunk of the answer appeared, nothing followed, and the whole message only showed up once generation finished. The browser console showed a Svelte each_key_duplicate error. When a stream event addresses an output slot past the end of the array, the missing slots were filled with the event's own item, id included, so a gap of two left two entries claiming the same id. The next chunk for that item was matched by id, landed in the first of the two, and the rendered list ended up with two items sharing a key, which Svelte refuses to update. Only the addressed slot now takes the event's item, and the slots before it are anonymous placeholders. Replayed the reported event sequence against the real code: keys are unique again and the chunks stay in order instead of being split across the copies. * fix: stream reasoning deltas when the provider also sends reasoning_details Providers such as OpenRouter emit reasoning_details alongside the reasoning text on the same delta. Merging those details cleared the pending event unconditionally, discarding the response.reasoning_text.delta that had just been built, so the client received no reasoning until the response completed and the thinking block only appeared after generation finished. The event is now only dropped when the details were all there was to report. Details persistence is unchanged. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_014uuEg4AXPs9zE3vVUfN1Fj --------- Co-authored-by: Claude --- backend/open_webui/utils/middleware.py | 7 ++++++- src/lib/components/chat/Messages/structuredOutput.ts | 9 ++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index e11830d4f9..6c18eb26ba 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -5223,7 +5223,12 @@ async def streaming_chat_response_handler(response, ctx): reasoning_detail_items, ) await save_current_response_stream() - data = None + # Providers such as OpenRouter send reasoning_details + # alongside the reasoning text: only drop the event when + # the details were all there was to report, otherwise the + # reasoning delta never reaches the client. + if not reasoning_content: + data = None if value: if ( diff --git a/src/lib/components/chat/Messages/structuredOutput.ts b/src/lib/components/chat/Messages/structuredOutput.ts index 96d5bd869f..d4ebe0493e 100644 --- a/src/lib/components/chat/Messages/structuredOutput.ts +++ b/src/lib/components/chat/Messages/structuredOutput.ts @@ -462,9 +462,12 @@ function ensureOutputItem( fallback?: OutputItem ): OutputItem { while (output.length <= outputIndex) { - output.push( - fallback ?? { type: 'message', status: 'in_progress', role: 'assistant', content: [] } - ); + // Only the addressed slot gets the event's item; filler slots must not reuse its id. + const item = + output.length === outputIndex && fallback + ? { ...fallback } + : { type: 'message', status: 'in_progress', role: 'assistant', content: [] }; + output.push(item); } output[outputIndex] = { ...output[outputIndex] }; return output[outputIndex]; From 9277879bcf239e665e770c76a70dfa33936cd721 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Fri, 28 Aug 2026 00:26:04 +0200 Subject: [PATCH 16/99] i18n: complete the German (de-DE) translation (#29108) 173 keys in the de-DE catalog still had empty values, so German users saw those strings rendered in English: the whole terminal file browser, the tool-call approval prompts, chat variables, the model manager, calendar navigation, the accessibility labels for zoom, camera and call controls, and several admin settings panels. Each string was translated against its actual call site rather than in isolation, so the grammatical form fits the widget it renders in (imperatives on buttons, nouns on labels and select options, participles on toasts). Terminology and the formal "Sie" register follow what the catalog already uses elsewhere, and technical literals were left alone on purpose: the CSV header hint mirrors the file that "Download CSV Template" actually produces, and the MIME pattern, the snake_case variable placeholder and the product names stay verbatim. Only value strings changed; key order and formatting are untouched. --- src/lib/i18n/locales/de-DE/translation.json | 346 ++++++++++---------- 1 file changed, 173 insertions(+), 173 deletions(-) diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index fb7f8558b0..1cfbbd601f 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -117,7 +117,7 @@ "Add to favorites": "Zu Favoriten hinzufügen", "Add User": "Benutzer hinzufügen", "Add User Group": "Benutzergruppe hinzufügen", - "Add User Variable": "", + "Add User Variable": "Benutzervariable hinzufügen", "Add webhook": "Webhook hinzufügen", "Add webpage": "Webseite hinzufügen", "Add your Open Terminal URL and API key in Settings → Integrations.": "Füge deine Open Terminal URL und API Key in den Einstellungen → Integrationen hinzu.", @@ -140,7 +140,7 @@ "Advanced MinerU parsing parameters in JSON format.": "Erweiterte MinerU-Parameter im JSON-Format.", "Advanced Parameters": "Erweiterte Parameter", "Advanced Params": "Erweiterte Parameter", - "After changing the embedding model, reindex knowledge, knowledge search, and memory vectors for changes to take effect.": "", + "After changing the embedding model, reindex knowledge, knowledge search, and memory vectors for changes to take effect.": "Nach dem Wechsel des Embedding-Modells müssen Wissen, Wissenssuche und Erinnerungsvektoren neu indiziert werden, damit die Änderungen wirksam werden.", "All": "Alle", "All Chats": "Alle Chats", "All chats have been unarchived.": "Alle Chats wurden aus dem Archiv wiederhergestellt.", @@ -154,8 +154,8 @@ "All time": "Gesamte Zeit", "All Users": "Alle Nutzer", "All users and system events": "Alle Benutzer- und Systemereignisse", - "Allow": "", - "Allow {{NAME}}?": "", + "Allow": "Erlauben", + "Allow {{NAME}}?": "{{NAME}} erlauben?", "Allow artifacts to access same-origin browser APIs inside the sandbox.": "Erlaubt Artefakten den Zugriff auf Browser-APIs derselben Herkunft innerhalb der Sandbox.", "Allow automatic names for new chats.": "Erlaubt automatisch vergebene Namen für neue Chats.", "Allow browser notifications for completed responses.": "Erlaubt Browser-Benachrichtigungen für fertiggestellte Antworten.", @@ -172,7 +172,7 @@ "Allow Continue Response": "Fortsetzung der Antwort erlauben", "Allow delegated sub-agents to keep running while the parent chat continues.": "Erlaubt delegierten Sub-Agents, weiterzulaufen, während der übergeordnete Chat fortgesetzt wird.", "Allow Delete Messages": "Löschen von Nachrichten erlauben", - "Allow downloads inside sandboxed iframes.": "", + "Allow downloads inside sandboxed iframes.": "Erlaubt Downloads in Sandbox-iFrames.", "Allow File Upload": "Dateiupload erlauben", "Allow forms inside sandboxed artifact iframes.": "Erlaubt Formulare in den Sandbox-iFrames von Artefakten.", "Allow Google Drive as a document source.": "Erlaubt Google Drive als Dokumentenquelle.", @@ -185,19 +185,19 @@ "Allow public write access": "Erlaubte öffentlichen schreibenden Zugang", "Allow Rate Response": "Antwortbewertung erlauben", "Allow Regenerate Response": "Antwort-Neugenerierung erlauben", - "Allow scripts inside sandboxed iframes.": "", + "Allow scripts inside sandboxed iframes.": "Erlaubt Skripte in Sandbox-iFrames.", "Allow Sharing With Groups": "Teilen mit Gruppen erlauben", "Allow Sharing With Users": "Erlaube Teilen mit Nutzern", "Allow Speech to Text": "Sprache-zu-Text erlauben", "Allow Temporary Chat": "Temporäre Chats erlauben", - "Allow terminal previews to access same-origin browser APIs.": "", + "Allow terminal previews to access same-origin browser APIs.": "Erlaubt Terminal-Vorschauen den Zugriff auf Browser-APIs derselben Herkunft.", "Allow Text to Speech": "Text-zu-Sprache erlauben", "Allow the AI to delegate tasks to sub-agents. Each sub-agent creates a real chat with full tool access. Uses additional LLM calls.": "Erlaubt der KI, Aufgaben an Sub-Agents zu delegieren. Jeder Sub-Agent erstellt einen echten Chat mit vollem Werkzeugzugriff. Verursacht zusätzliche LLM-Aufrufe.", - "Allow Tool Call": "", + "Allow Tool Call": "Werkzeugaufruf erlauben", "Allow User Location": "Standortzugriff erlauben", "Allow users to access calendar features.": "Erlaubt Benutzern die Nutzung der Kalenderfunktionen.", "Allow users to authenticate with an LDAP directory.": "Erlaubt Benutzern die Anmeldung über ein LDAP-Verzeichnis.", - "Allow users to authenticate with an OAuth / OIDC provider.": "", + "Allow users to authenticate with an OAuth / OIDC provider.": "Erlaubt Benutzern die Anmeldung über einen OAuth-/OIDC-Anbieter.", "Allow users to configure webhooks from their account.": "Erlaubt Benutzern, Webhooks in ihrem Konto einzurichten.", "Allow users to create accounts through OAuth.": "Erlaubt Benutzern, Konten über OAuth zu erstellen.", "Allow users to create and manage notes.": "Erlaubt Benutzern, Notizen zu erstellen und zu verwalten.", @@ -231,13 +231,13 @@ "and create a new shared link.": "und erstellen Sie einen neuen Freigabe-Link.", "Android": "Android", "Anyone": "Jeder", - "Anyone with the link can view": "", + "Anyone with the link can view": "Für alle mit dem Link einsehbar", "API Auth String": "API-Authentifizierungsstring", "API Base URL": "API-Basis-URL", "API Key": "API-Schlüssel", "API Key / Token": "API-Schlüssel / Token", "API Key created.": "API-Schlüssel erstellt.", - "API Key deleted.": "", + "API Key deleted.": "API-Schlüssel gelöscht.", "API Key Endpoint Restrictions": "API-Schlüssel Endpunkteinschränkungen", "API key for embedding requests.": "API-Schlüssel für Embedding-Anfragen.", "API key sent to Docling.": "API-Schlüssel, der an Docling gesendet wird.", @@ -291,7 +291,7 @@ "Ask a question": "Stellen Sie eine Frage", "Ask a test question": "Eine Testfrage stellen", "Ask this knowledge source a test question": "Dieser Wissensquelle eine Testfrage stellen", - "Ask User": "", + "Ask User": "Benutzer fragen", "Assistant": "Assistent", "Assistant messages": "Assistentennachrichten", "Async Embedding Processing": "Asynchrone Embedding-Verarbeitung", @@ -299,7 +299,7 @@ "At time of event": "Zum Zeitpunkt des Ereignisses", "Attach File From Knowledge": "Datei aus Wissensspeicher anhängen", "Attach Files": "Dateien anhängen", - "Attach files with full content or focused retrieval by default.": "", + "Attach files with full content or focused retrieval by default.": "Hängt Dateien standardmäßig mit vollem Inhalt oder mit gezieltem Abruf an.", "Attach Knowledge": "Wissen anhängen", "Attach Notes": "Notizen anhängen", "Attach Webpage": "Webseite anhängen", @@ -313,7 +313,7 @@ "Auth required": "Authentifizierung notwendig", "Authenticate": "Authentifizieren", "Authentication": "Authentifizierung", - "Authorize OAuth": "", + "Authorize OAuth": "OAuth autorisieren", "Auto": "Automatisch", "Auto (Random)": "Auto (zufällig)", "Auto Redirect": "Automatische Weiterleitung", @@ -417,7 +417,7 @@ "Change User Role": "Nutzerrolle ändern", "Channel": "Kanal", "Channel deleted successfully": "Kanal erfolgreich gelöscht", - "Channel is required": "", + "Channel is required": "Kanal ist erforderlich", "Channel Name": "Kanalname", "Channel name cannot be empty.": "Kanalname darf nicht leer sein.", "Channel name must be less than 128 characters": "Kanalname muss kürzer als 128 Zeichen sein", @@ -438,30 +438,30 @@ "Chat forked": "Chat verzweigt", "Chat history": "Chatverlauf", "Chat History": "Chatverlauf", - "Chat Hover Previews": "", + "Chat Hover Previews": "Chat-Vorschau beim Daraufzeigen", "Chat ID": "Chat-ID", "Chat is too short to compact": "Der Chat ist zu kurz zum Verdichten", "Chat moved successfully": "Chat erfolgreich verschoben", "Chat Permissions": "Chat-Berechtigungen", "Chat Tags Auto-Generation": "Automatische Chat-Tag-Generierung", "Chat unshared successfully.": "Chat-Freigabe erfolgreich aufgehoben", - "Chat Uploads": "", - "Chat Variables": "", - "Chat Variables have conflicting model definitions": "", + "Chat Uploads": "Chat-Uploads", + "Chat Variables": "Chat-Variablen", + "Chat Variables have conflicting model definitions": "Chat-Variablen haben widersprüchliche Modelldefinitionen", "chats": "Chats", "Chats": "Chats", - "Chats Open Sharing": "", + "Chats Open Sharing": "Offene Chat-Freigabe", "Chats Public Sharing": "Öffentliche Chat-Freigabe", "Check Again": "Erneut prüfen", "Check for updates": "Nach Updates suchen", - "Check OAuth Discovery": "", + "Check OAuth Discovery": "OAuth-Discovery prüfen", "Checking for updates...": "Suche nach Updates...", - "Choose a dedicated model for context compaction summaries. Current Model follows the active chat model.": "", + "Choose a dedicated model for context compaction summaries. Current Model follows the active chat model.": "Wählen Sie ein eigenes Modell für die Zusammenfassungen der Kontextverdichtung. \"Aktuelles Modell\" übernimmt das im Chat aktive Modell.", "Choose a model before saving...": "Wählen Sie vor dem Speichern ein Modell...", "Choose automatic, left-to-right, or right-to-left text flow.": "Wählt automatischen Textfluss oder feste Ausrichtung von links nach rechts bzw. von rechts nach links.", - "Choose channel": "", + "Choose channel": "Kanal auswählen", "Choose fallback models for background tasks. Current Model follows the active chat model.": "Wählen Sie Ersatzmodelle für Hintergrundaufgaben. \"Aktuelles Modell\" übernimmt das im Chat aktive Modell.", - "Choose folder": "", + "Choose folder": "Ordner auswählen", "Choose how extracted text is split before indexing.": "Legt fest, wie extrahierter Text vor der Indexierung aufgeteilt wird.", "Choose how uploaded documents are parsed before indexing.": "Legt fest, wie hochgeladene Dokumente vor der Indexierung verarbeitet werden.", "Choose how web result pages are fetched and read.": "Legt fest, wie Ergebnisseiten aus dem Web abgerufen und ausgelesen werden.", @@ -481,8 +481,8 @@ "Choose the runtime used for generated code blocks.": "Wählt die Laufzeitumgebung für generierte Code-Blöcke.", "Choose the speech provider used for assistant audio output.": "Wählt den Sprachanbieter für die Audioausgabe des Assistenten.", "Choose the transcription provider used for audio input.": "Wählt den Transkriptionsanbieter für Audioeingaben.", - "Choose where model responses to root-level channel mentions are posted.": "", - "Choose where terminal display_file results appear by default.": "", + "Choose where model responses to root-level channel mentions are posted.": "Legt fest, wo Modellantworten auf Erwähnungen auf oberster Kanalebene gepostet werden.", + "Choose where terminal display_file results appear by default.": "Legt fest, wo display_file-Ergebnisse des Terminals standardmäßig erscheinen.", "Choose whether Enter sends immediately or uses Ctrl+Enter.": "Legt fest, ob die Eingabetaste sofort sendet oder Strg+Eingabe erforderlich ist.", "Choose whether the app opens to the default home or chat view.": "Legt fest, ob die App mit der Startseite oder direkt mit dem Chat öffnet.", "Chunk Min Size Target": "Zielwert für minimale Chunk-Größe", @@ -497,7 +497,7 @@ "Claim used as the profile picture URL.": "Claim, der als URL des Profilbilds verwendet wird.", "Claim used as the stable user identifier.": "Claim, der als dauerhafte Benutzerkennung verwendet wird.", "Claim used as the user email address.": "Claim, der als E-Mail-Adresse des Benutzers verwendet wird.", - "Clear": "", + "Clear": "Leeren", "Clear filters to reorder": "Filter zurücksetzen, um die Reihenfolge zu ändern", "Clear memory": "Alle Erinnerungen löschen", "Clear Memory": "Alle Erinnerungen löschen", @@ -589,7 +589,7 @@ "Confirm": "Bestätigen", "Confirm Password": "Passwort bestätigen", "Confirm Prompt from Embed": "Bestätige den Prompt, den das Embed senden will", - "Confirm recording": "", + "Confirm recording": "Aufnahme bestätigen", "Confirm your action": "Bitte bestätigen", "Confirm your new password": "Neues Passwort bestätigen", "Confirm Your Password": "Passwort bestätigen", @@ -598,7 +598,7 @@ "Connect to a stable-diffusion-webui server running with the `--api` flag.": "Verbindet mit einem stable-diffusion-webui-Server, der mit dem Flag `--api` läuft.", "Connect to an AI provider to start chatting": "Zum Chatten mit einem AI provider verbinden", "Connect to Open Terminal instances to browse files and use them as always-on tools. Only one can be active at a time.": "Verbinde zu Open Terminal Instanzen um Dateien zu lesen und sie als immer verfügbare Werkzeuge zu nutzen. Nur eines kann gleichzeitig aktiv sein.", - "Connect to Open Terminal instances. Admins and users granted access can use file browsing and terminal tools through these servers.": "", + "Connect to Open Terminal instances. Admins and users granted access can use file browsing and terminal tools through these servers.": "Stellt eine Verbindung zu Open-Terminal-Instanzen her. Administratoren und Benutzer mit Zugriff können über diese Server die Dateiansicht und Terminal-Werkzeuge nutzen.", "Connect to the ComfyUI server used for generation.": "Verbindet mit dem ComfyUI-Server für die Bildgenerierung.", "Connect to the ComfyUI server used for image edits.": "Verbindet mit dem ComfyUI-Server für die Bildbearbeitung.", "Connect to your own OpenAI compatible API endpoints.": "Verbinden Sie Ihre eigenen OpenAI-kompatiblen API-Endpunkte.", @@ -619,13 +619,13 @@ "Content Extraction Engine": "Engine zur Inhaltsextraktion", "Content Field": "Inhaltsfeld", "Content lengths (character counts only)": "Content-Längen (nur Zeichen)", - "Content matches": "", + "Content matches": "Treffer im Inhalt", "Context": "Kontext", "Context compacted": "Kontext verdichtet", "Context Compaction": "Kontextverdichtung", "Context compaction failed": "Kontextverdichtung fehlgeschlagen", "Context compaction is disabled": "Kontextverdichtung ist deaktiviert", - "Context Compaction Model": "", + "Context Compaction Model": "Modell für Kontextverdichtung", "Context Compaction Prompt": "Prompt für Kontextverdichtung", "Context Compaction Threshold": "Schwellenwert für Kontextverdichtung", "Context Tokens": "Kontext-Token", @@ -700,7 +700,7 @@ "Credential used for Document Intelligence.": "Zugangsdaten für Document Intelligence.", "Credentials used to authenticate with the Jupyter server.": "Zugangsdaten für die Anmeldung am Jupyter-Server.", "CSV Import": "CSV-Import", - "CSV: Name,Email": "", + "CSV: Name,Email": "CSV: Name,Email", "Ctrl+Enter to Send": "Strg+Enter zum Senden", "Current": "Aktuell", "Current Model": "Aktuelles Modell", @@ -725,7 +725,7 @@ "Database": "Datenbank", "Datalab Marker API": "Datalab Marker API", "Datalab Marker service endpoint used for document parsing.": "Endpunkt des Datalab-Marker-Dienstes für die Dokumentenverarbeitung.", - "Date is required": "", + "Date is required": "Datum ist erforderlich", "Date Modified": "Datum geändert", "Day": "Tag", "DD/MM/YYYY": "DD.MM.YYYY", @@ -741,7 +741,7 @@ "Default Features": "Standardfunktionen", "Default Filters": "Standardfilter", "Default Group": "Standardgruppe", - "Default Interface Settings": "", + "Default Interface Settings": "Standardeinstellungen der Benutzeroberfläche", "Default Model": "Standardmodell", "Default model updated": "Standardmodell aktualisiert", "Default permissions": "Standardberechtigungen", @@ -751,7 +751,7 @@ "Default to ALL": "Standardmäßig ALLE", "Default to memberOf": "Standardmäßig memberOf", "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "Standardmäßig segmentierter Abruf für fokussierte Inhaltsextraktion (empfohlen).", - "Default Upload Mode": "", + "Default Upload Mode": "Standard-Upload-Modus", "Default User Role": "Standard-Benutzerrolle", "Default webhook": "Standard-Webhook", "Defines the behavior used for spoken conversations.": "Legt das Verhalten für gesprochene Unterhaltungen fest.", @@ -763,7 +763,7 @@ "Delete All Chats": "Alle Chats löschen", "Delete all contents inside this directory": "Alle Inhalte in diesem Verzeichnis löschen", "Delete all contents inside this folder": "Alle Inhalte in diesem Ordner löschen", - "Delete API Key?": "", + "Delete API Key?": "API-Schlüssel löschen?", "Delete automation?": "Automatisierung löschen?", "Delete calendar": "Kalender löschen", "Delete Calendar": "Kalender löschen", @@ -791,9 +791,9 @@ "Deleted {{name}}": "{{name}} gelöscht", "Deleted {{ok}} of {{total}} items": "{{ok}} von {{total}} Einträgen gelöscht", "Deleted User": "Gelöschter Benutzer", - "Denied {{NAME}}": "", - "Deny": "", - "Deny Tool Call": "", + "Denied {{NAME}}": "{{NAME}} abgelehnt", + "Deny": "Ablehnen", + "Deny Tool Call": "Werkzeugaufruf ablehnen", "Deployment names are required for Azure OpenAI": "Deployment-Namen sind für Azure OpenAI erforderlich", "Desc": "Absteigend", "Describe the edit...": "Beschreibe die Änderung...", @@ -802,10 +802,10 @@ "Describe your knowledge base and objectives": "Beschreiben Sie Ihren Wissensspeicher und Ziele", "Description": "Beschreibung", "Deselect": "Abwählen", - "Destination": "", + "Destination": "Ziel", "Detect Artifacts Automatically": "Artefakte automatisch erkennen", "Detect generated artifacts and show them in the artifact workspace.": "Erkennt generierte Artefakte und zeigt sie im Artefakte-Bereich an.", - "Detected Variables": "", + "Detected Variables": "Erkannte Variablen", "Dictate": "Diktieren", "Didn't fully follow instructions": "Anweisungen nicht vollständig befolgt", "Direct": "Direkt", @@ -869,27 +869,27 @@ "Don't like the style": "Stil gefällt nicht", "Done": "Fertig", "Download": "Herunterladen", - "Download \"{{searchValue}}\"": "", - "Download \"{{searchValue}}\" from {{provider}}": "", + "Download \"{{searchValue}}\"": "\"{{searchValue}}\" herunterladen", + "Download \"{{searchValue}}\" from {{provider}}": "\"{{searchValue}}\" von {{provider}} herunterladen", "Download & Delete": "Herunterladen & Löschen", "Download all users as CSV.": "Lädt alle Benutzer als CSV-Datei herunter.", "Download as JSON": "Als JSON herunterladen", "Download as SVG": "Als SVG herunterladen", "Download canceled": "Download abgebrochen", - "Download CSV Template": "", + "Download CSV Template": "CSV-Vorlage herunterladen", "Download every user's chat history as JSON.": "Lädt den Chatverlauf aller Benutzer als JSON herunter.", - "Download failed": "", - "Download Model": "", + "Download failed": "Download fehlgeschlagen", + "Download Model": "Modell herunterladen", "Download the application database when supported.": "Lädt die Datenbank der Anwendung herunter, sofern unterstützt.", "Download the current admin configuration as JSON.": "Lädt die aktuelle Administrationskonfiguration als JSON herunter.", "Download your chat history as a JSON export.": "Lädt Ihren Chatverlauf als JSON-Export herunter.", - "Downloading \"{{searchValue}}\"": "", + "Downloading \"{{searchValue}}\"": "\"{{searchValue}}\" wird heruntergeladen", "Downloading stats...": "Statistik wird heruntergeladen...", "Drag to reorder": "Zum Umsortieren ziehen", "Draw": "Zeichnen", "Drop any files here to upload": "Dateien zum Hochladen hier ablegen", "Drop files here": "Dateien hier ablegen", - "Drop to upload": "", + "Drop to upload": "Zum Hochladen hier ablegen", "DuckDuckGo": "DuckDuckGo", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "z. B. '30s', '10m'. Gültig: 's', 'm', 'h'.", "e.g. 'low', 'medium', 'high'": "z. B. 'low', 'medium', 'high'", @@ -928,7 +928,7 @@ "Edit Terminal Connection": "Terminal Verbindung bearbeiten", "Edit User": "Benutzer bearbeiten", "Edit User Group": "Benutzergruppe bearbeiten", - "Edit User Variable": "", + "Edit User Variable": "Benutzervariable bearbeiten", "Edit webhook": "Webhook bearbeiten", "Edit workflow.json content": "workflow.json Inhalt bearbeiten", "edited": "bearbeitet", @@ -948,7 +948,7 @@ "Emojis": "Emoji", "Empty": "Leer", "Empty message": "Leere Nachricht", - "Enable accessibility-focused visual enhancements.": "", + "Enable accessibility-focused visual enhancements.": "Aktiviert visuelle Verbesserungen für die Barrierefreiheit.", "Enable All": "Alle aktivieren", "Enable background sub-agents": "Sub-Agents im Hintergrund aktivieren", "Enable Code Execution": "Codeausführung aktivieren", @@ -961,7 +961,7 @@ "Enable sub-agents": "Sub-Agents aktivieren", "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.": "Aktivieren, deaktivieren oder passen Sie Reasoning-Tags an. \"Aktiviert\" nutzt Standard-Tags, \"Deaktiviert\" schaltet sie aus, \"Benutzerdefiniert\" erlaubt eigene Start/End-Tags.", "Enabled": "Aktiviert", - "End call": "", + "End call": "Anruf beenden", "End Tag": "End-Tag", "Endpoint": "Endpunkt", "Endpoint URL": "Endpunkt-URL", @@ -1041,7 +1041,7 @@ "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 OpenSERP Base URL": "", + "Enter OpenSERP Base URL": "OpenSERP-Basis-URL eingeben", "Enter PaddleOCR-vl API Base URL": "PaddleOCR-vl API Basis-URL eingeben", "Enter PaddleOCR-vl API Token": "PaddleOCR-vl API-Token eingeben", "Enter Perplexity API Key": "Perplexity API-Schlüssel eingeben", @@ -1208,7 +1208,7 @@ "Failed to load DOCX file. Please try downloading it instead.": "DOCX Datei konnte nicht geladen werden. Versuche die Datei stattdessen herunterzuladen.", "Failed to load Excel/CSV file. Please try downloading it instead.": "Excel/CSV-Datei konnte nicht geladen werden. Bitte versuchen Sie stattdessen, sie herunterzuladen.", "Failed to load file content.": "Dateiinhalt konnte nicht geladen werden.", - "Failed to load folder": "", + "Failed to load folder": "Ordner konnte nicht geladen werden", "Failed to load Interface settings": "Interface Einstellungen konnten nicht geladen werden", "Failed to load policy: {{error}}": "Richtlinie konnte nicht geladen werden: {{error}}", "Failed to load PPTX file. Please try downloading it instead.": "PPTX Datei konnte nicht geladen werden. Versuche die Datei stattdessen herunterzuladen.", @@ -1220,14 +1220,14 @@ "Failed to remove member": "Mitglied konnte nicht entfernt werden", "Failed to render diagram": "Diagramm konnte nicht gerendert werden", "Failed to render visualization": "Visualisierung konnte nicht gerendert werden", - "Failed to save chat variables": "", + "Failed to save chat variables": "Chat-Variablen konnten nicht gespeichert werden", "Failed to save connections": "Verbindungen konnten nicht gespeichert werden", "Failed to save conversation": "Unterhaltung konnte nicht gespeichert werden", "Failed to save models configuration": "Modellkonfiguration konnte nicht gespeichert werden", "Failed to save policy: {{error}}": "Fehler beim Speichern der Policy: {{error}}", "Failed to save terminal servers": "Terminal Server konnten nicht gespeichert werden", "Failed to save webhook": "Webhook konnte nicht gespeichert werden", - "Failed to search files": "", + "Failed to search files": "Dateien konnten nicht durchsucht werden", "Failed to unshare chat.": "Chat-Freigabe konnte nicht entfernt werden", "Failed to update settings": "Einstellungen konnten nicht aktualisiert werden", "Failed to update status": "Status konnte nicht aktualisiert werden", @@ -1262,9 +1262,9 @@ "File Upload": "Dateiupload", "File uploaded successfully": "Datei erfolgreich hochgeladen", "Filename": "Dateiname", - "Filename matches": "", + "Filename matches": "Treffer im Dateinamen", "Files": "Dateien", - "Filesystem": "", + "Filesystem": "Dateisystem", "Fill the required fields first.": "Füllen Sie zuerst die erforderlichen Felder aus.", "Fill the source fields and test query first.": "Füllen Sie zuerst die Quellfelder und die Testabfrage aus.", "Filter": "Filter", @@ -1339,7 +1339,7 @@ "Generate an image prompt before sending the request.": "Erzeugt vor dem Senden der Anfrage einen Bild-Prompt.", "Generate and edit images": "Generiere und bearbeite Bilder", "Generate chat titles automatically from conversation content.": "Erzeugt Chat-Titel automatisch aus dem Inhalt der Unterhaltung.", - "Generate message pair": "", + "Generate message pair": "Nachrichtenpaar generieren", "Generate Message Pair": "Nachrichtenpaar generieren", "Generate suggested follow-up prompts after responses.": "Erzeugt nach Antworten Vorschläge für Folgefragen.", "Generate tags for chats automatically.": "Erzeugt automatisch Tags für Chats.", @@ -1398,7 +1398,7 @@ "Hide": "Verbergen", "Hide All": "Alle verstecken", "Hide from Sidebar": "Aus Seitenleiste ausblenden", - "Hide Hidden Files": "", + "Hide Hidden Files": "Versteckte Dateien ausblenden", "Hide Model": "Modell verbergen", "High": "Hoch", "High Contrast Mode": "Hoher Kontrast", @@ -1420,10 +1420,10 @@ "Identity audit": "Identitätsprüfung", "Idle only": "Nur im Leerlauf", "Idle Timeout": "Inaktivitäts-Timeout", - "iframe Sandbox Allow Downloads": "", + "iframe Sandbox Allow Downloads": "iFrame Sandbox: Downloads erlauben", "iframe Sandbox Allow Forms": "iFrame Sandbox: Formulare erlauben", "iframe Sandbox Allow Same Origin": "iFrame Sandbox: Gleichen Ursprung erlauben", - "iframe Sandbox Allow Scripts": "", + "iframe Sandbox Allow Scripts": "iFrame Sandbox: Skripte erlauben", "Image": "Bild", "Image Compression": "Bildkompression", "Image Compression Height": "Bildkompression Höhe", @@ -1438,15 +1438,15 @@ "Image Prompt Generation": "Bild-Prompt-Generierung", "Image Prompt Generation Prompt": "Prompt für Bild-Prompt-Generierung", "Image Size": "Bildgröße", - "Image unavailable": "", - "image/*, video/*": "", + "Image unavailable": "Bild nicht verfügbar", + "image/*, video/*": "image/*, video/*", "Images": "Bilder", "Import": "Importieren", "Import admin configuration from a JSON export file.": "Importiert die Administrationskonfiguration aus einer JSON-Exportdatei.", "Import chat history from a JSON export file.": "Importiert den Chatverlauf aus einer JSON-Exportdatei.", "Import Chats": "Chats importieren", "Import Config": "Konfiguration importieren", - "Import CSV": "", + "Import CSV": "CSV importieren", "Import From Link": "Von Link importieren", "Import JSON": "JSON importieren", "Import Models": "Modelle importieren", @@ -1458,7 +1458,7 @@ "Important Update": "Wichtiges Update", "Imported automations successfully": "Automatisierungen erfolgreich importiert", "Imported notes successfully": "Notizen erfolgreich importiert", - "Importing...": "", + "Importing...": "Wird importiert...", "Inactive": "Inaktiv", "Include": "Einschließen", "Include saved memories in the system context.": "Bindet gespeicherte Erinnerungen in den Systemkontext ein.", @@ -1469,13 +1469,13 @@ "Initials": "Initialen", "Inject entire documents as context for comprehensive processing.": "Bindet vollständige Dokumente als Kontext ein, um sie umfassend zu verarbeiten.", "Inject file content into conversation context": "Injiziere den Datei-Kontext in den Konversations-Kontext", - "Inject stored memories into conversation context": "", + "Inject stored memories into conversation context": "Gespeicherte Erinnerungen in den Gesprächskontext einfügen", "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Gesamten Inhalt als Kontext für umfassende Verarbeitung einfügen; dies wird für komplexe Abfragen empfohlen.", "Inject the entire content as context for comprehensive processing.": "Bindet den gesamten Inhalt als Kontext ein, um ihn umfassend zu verarbeiten.", - "Inline": "", + "Inline": "Eingebettet", "Input": "Eingabe", "Input Key (e.g. text, unet_name, steps)": "Eingabeschlüssel (z. B. text, unet_name, steps)", - "Input needed": "", + "Input needed": "Eingabe erforderlich", "Input Variables": "Eingabevariablen", "Insert": "Einfügen", "Insert Follow-Up Prompt to Input": "Folge-Prompt in Eingabe einfügen", @@ -1492,7 +1492,7 @@ "Interface": "Benutzeroberfläche", "Interface Settings Access": "Zugriff auf Oberflächeneinstellungen", "Invalid file format.": "Ungültiges Dateiformat.", - "Invalid format.": "", + "Invalid format.": "Ungültiges Format.", "Invalid JSON file": "Ungültige JSON-Datei", "Invalid JSON format": "Ungültiges JSON-Format", "Invalid JSON format for ComfyUI Edit Workflow.": "Ungültiges JSON-Format für ComfyUI-Bearbeitungsworkflow.", @@ -1527,13 +1527,13 @@ "Keep in Sidebar": "In Seitenleiste anzeigen", "Key": "Schlüssel", "Key is required": "Schlüssel ist erforderlich", - "key_name": "", + "key_name": "key_name", "Keyboard": "Tastatur", "Knowledge": "Wissen", "Knowledge Access": "Wissenszugriff", "Knowledge Base": "Wissensspeicher", "Knowledge base has been reset": "Wissensspeicher wurde zurückgesetzt", - "Knowledge base not found.": "", + "Knowledge base not found.": "Wissensspeicher nicht gefunden.", "Knowledge created successfully.": "Wissen erfolgreich erstellt.", "Knowledge deleted successfully.": "Wissen erfolgreich gelöscht.", "Knowledge Description": "Wissensbeschreibung", @@ -1601,14 +1601,14 @@ "Linkup API Key": "Linkup-API-Schlüssel", "List": "Liste", "List calendars, search, create, update, and delete calendar events": "Kalender auflisten, suchen, erstellen, aktualisieren und löschen", - "List, search, and read files attached to the current chat": "", + "List, search, and read files attached to the current chat": "Dateien im aktuellen Chat auflisten, durchsuchen und lesen", "Listening...": "Höre zu...", - "LiteLLM": "", + "LiteLLM": "LiteLLM", "Live": "Live", "llama.cpp": "llama.cpp", "LLMs can make mistakes. Verify important information.": "KI-Modelle können Fehler machen. Überprüfen Sie wichtige Informationen.", - "LM Studio": "", - "Load Model": "", + "LM Studio": "LM Studio", + "Load Model": "Modell laden", "Loaded": "geladen", "Loader": "Loader", "Loading Kokoro.js...": "Lade Kokoro.js...", @@ -1646,8 +1646,8 @@ "Map workflow node inputs used for image generation.": "Ordnet die Workflow-Node-Eingaben für die Bildgenerierung zu.", "Mapped Source": "Zugeordnete Quelle", "March": "März", - "Mark all as read": "", - "Mark as unread": "", + "Mark all as read": "Alle als gelesen markieren", + "Mark as unread": "Als ungelesen markieren", "Markdown": "Markdown", "Markdown Header Text Splitter": "Markdown-Header-Text-Splitter", "Max background": "Max. im Hintergrund", @@ -1675,7 +1675,7 @@ "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.": "Die MCP-Unterstützung ist experimentell und ihre Spezifikation ändert sich häufig, was zu Inkompatibilitäten führen kann. Die Unterstützung der OpenAPI-Spezifikation wird direkt vom Open WebUI-Team gepflegt und ist daher die verlässlichere Option.", - "Media upload MIME types the content extraction engine may process.": "", + "Media upload MIME types the content extraction engine may process.": "MIME-Typen für Medien-Uploads, die die Inhaltsextraktion verarbeiten darf.", "Medium": "Mittel", "Member removed successfully": "Mitglied erfolgreich entfernt", "members": "Mitglieder", @@ -1737,18 +1737,18 @@ "Model Capabilities": "Modell Fähigkeiten", "Model created successfully!": "Modell erfolgreich erstellt!", "Model Defaults": "Modell-Standardwerte", - "Model deleted successfully": "", - "Model download started": "", + "Model deleted successfully": "Modell erfolgreich gelöscht", + "Model download started": "Modell-Download gestartet", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Modell-Dateisystempfad erkannt. Modellkurzname ist für das Update erforderlich; Vorgang kann nicht fortgesetzt werden.", "Model Filtering": "Modellfilterung", "Model ID": "Modell-ID", - "Model ID is already added": "", + "Model ID is already added": "Modell-ID wurde bereits hinzugefügt", "Model ID is required.": "Modell-ID ist erforderlich.", "Model IDs": "Modell-IDs", "Model is now private": "Modell ist jetzt privat", "Model is now public": "Modell ist jetzt öffentlich", - "Model list refreshed": "", - "Model loaded successfully": "", + "Model list refreshed": "Modellliste aktualisiert", + "Model loaded successfully": "Modell erfolgreich geladen", "Model Name": "Modellname", "Model name already exists, please choose a different one": "Modellname existiert bereits, bitte wählen Sie einen anderen", "Model Name is required.": "Modellname ist erforderlich.", @@ -1761,10 +1761,10 @@ "Model Parameters": "Modell Parameter", "Model Params": "Modell-Parameter", "Model Permissions": "Modellberechtigungen", - "Model providers": "", + "Model providers": "Modellanbieter", "Model removed from pinned models": "Modell von den angehefteten Modellen entfernt", "Model removed from selected models": "Modell von den ausgewählten Modellen entfernt", - "Model Response Mode": "", + "Model Response Mode": "Antwortmodus des Modells", "Model responses or outputs": "Modellantworten oder -ausgaben", "Model unloaded successfully": "Modell erfolgreich entladen", "Model updated successfully": "Modell erfolgreich aktualisiert", @@ -1804,8 +1804,8 @@ "Name, prompt, and model are required": "Name, Prompt und Modell sind erforderlich", "Native": "Nativ", "Native mode (default) leverages the model's built-in tool-calling capabilities. Legacy mode works with a wider range of models by calling tools once before execution via prompt injection.": "Der native Modus (Standard) nutzt die integrierten Funktionsaufruf-Fähigkeiten des Modells. Der Legacy-Modus funktioniert mit einer größeren Bandbreite an Modellen, indem Werkzeuge einmalig vor der Ausführung per Prompt-Injektion aufgerufen werden.", - "Navigate to Next Chat": "", - "Navigate to Previous Chat": "", + "Navigate to Next Chat": "Zum nächsten Chat wechseln", + "Navigate to Previous Chat": "Zum vorherigen Chat wechseln", "Never": "Nie", "New": "Neu", "New Button": "Neuer Button", @@ -1827,24 +1827,24 @@ "New Tool": "Neues Werkzeug", "New Webhook": "Neuer Webhook", "new-channel": "neuer-kanal", - "Next": "", + "Next": "Weiter", "Next message": "Nächste Nachricht", - "Next month": "", + "Next month": "Nächster Monat", "Next page": "Nächste Seite", "Next run": "Nächster Durchlauf", - "Next version": "", + "Next version": "Nächste Version", "No access grants. Private to you.": "Keine Freigaben konfiguriert. Nur für Sie zugänglich.", "No actions found": "Keine Aktionen gefunden", "No activity data": "Keine Aktivitätsdaten", "No additional headers are sent unless configured.": "Es werden keine zusätzlichen Header gesendet, sofern nicht konfiguriert.", "No authentication": "Keine Authentifizierung", "No automations found": "Keine Automatisierungen gefunden", - "No channels": "", + "No channels": "Keine Kanäle", "No chat alerts": "Keine Chat-Benachrichtigungen", "No chat history": "Kein Chatverlauf", "No chat to compact": "Kein Chat zum Verdichten vorhanden", "No chat to fork": "Kein Chat zum Verzweigen vorhanden", - "No chats": "", + "No chats": "Keine Chats", "No chats found": "Keine Chats gefunden", "No chats found for this user.": "Keine Chats für diesen Benutzer gefunden.", "No chats found.": "Keine Chats gefunden.", @@ -1864,7 +1864,7 @@ "No files in this knowledge base.": "Keine Dateien in diesem Wissensspeicher", "No files yet. Upload files or run Python code to create them.": "Noch keine Dateien. Lad Dateien hoch oder lass Python code laufen um welche zu erstellen.", "No filters found": "Keine Filter gefunden", - "No folders": "", + "No folders": "Keine Ordner", "No functions found": "Keine Funktionen gefunden", "No groups found": "Keine Gruppen gefunden", "No history available": "Keine History verfügbar", @@ -1905,7 +1905,7 @@ "No tools accessible": "Keine Werkzeuge zugänglich", "No tools found": "Keine Werkzeuge gefunden", "No usage data found": "Keine Nutzungsdaten gefunden", - "No user variables configured.": "", + "No user variables configured.": "Keine Benutzervariablen konfiguriert.", "No users were found.": "Keine Benutzer gefunden.", "No valves": "Keine Valves", "No valves to update": "Keine Valves zum Aktualisieren", @@ -1936,7 +1936,7 @@ "OAuth 2.1 (Static)": "OAuth 2.1 (Statisch)", "OAuth client identifier from the provider.": "Client-ID vom OAuth-Anbieter.", "OAuth client secret from the provider.": "Client-Secret vom OAuth-Anbieter.", - "OAuth discovery successful": "", + "OAuth discovery successful": "OAuth-Discovery erfolgreich", "OAuth ID": "OAuth-ID", "OAuth Resource Parameter": "OAuth-Ressourcenparameter", "OAuth Scopes": "OAuth-Scopes", @@ -1961,7 +1961,7 @@ "OneDrive": "OneDrive", "Only active during Voice Mode.": "Nur im Sprachmodus aktiv.", "Only active when \"Paste Large Text as File\" setting is toggled on.": "Nur aktiv, wenn die Einstellung \"Großen Text als Datei einfügen\" aktiviert ist.", - "Only active when a tool call is waiting for approval.": "", + "Only active when a tool call is waiting for approval.": "Nur aktiv, wenn ein Werkzeugaufruf auf Bestätigung wartet.", "Only active when the chat input is in focus and an LLM is generating a response.": "Nur aktiv, wenn das Chat-Eingabefeld fokussiert ist und ein LLM eine Antwort generiert.", "Only active when the chat input is in focus.": "Nur aktiv, wenn das Chat-Eingabefeld fokussiert ist.", "Only alphanumeric characters and hyphens are allowed": "Nur alphanumerische Zeichen und Bindestriche sind erlaubt", @@ -1978,12 +1978,12 @@ "Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! Die URL scheint ungültig zu sein. Bitte überprüfen Sie diese und versuchen Sie es erneut.", "Oops! There was an error in the previous response.": "Ups! Es gab einen Fehler in der vorherigen Antwort.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ups! Sie verwenden eine nicht unterstützte Methode (nur Frontend). Bitte stellen Sie die WebUI über das Backend bereit.", - "Open": "", + "Open": "Öffnen", "Open automation": "Automatisierung öffnen", "Open create menu": "Menü \"Erstellen\" öffnen", "Open detail blocks by default.": "Klappt Detailblöcke standardmäßig auf.", "Open file": "Datei öffnen", - "Open Folder": "", + "Open Folder": "Ordner öffnen", "Open in full screen": "Im Vollbildmodus öffnen", "Open in new tab": "In neuem Tab öffnen", "Open link": "Link öffnen", @@ -2014,12 +2014,12 @@ "OpenAPI Spec": "OpenAPI-Spezifikation", "openapi.json URL or Path": "openapi.json-URL oder Pfad", "OpenID discovery URL for this provider.": "OpenID-Discovery-URL dieses Anbieters.", - "OpenSERP URL": "", + "OpenSERP URL": "OpenSERP-URL", "optional": "optional", "Optional": "Optional", "Optional API key for Ollama requests.": "Optionaler API-Schlüssel für Ollama-Anfragen.", "or": "oder", - "Orchestrator": "", + "Orchestrator": "Orchestrator", "Ordered List": "Nummerierte Liste", "Other": "Andere", "out of": "von", @@ -2043,13 +2043,13 @@ "Passthrough params": "Passthrough-Parameter", "Password": "Passwort", "Password for the bind DN.": "Passwort für den Bind-DN.", - "Password updated. Please sign in again.": "", + "Password updated. Please sign in again.": "Passwort aktualisiert. Bitte melden Sie sich erneut an.", "Passwords do not match.": "Die Passwörter stimmen nicht überein.", "Paste inserted prompts as rich text when possible.": "Fügt eingesetzte Prompts nach Möglichkeit als formatierten Text ein.", "Paste Large Text as File": "Großen Text als Datei einfügen", "Path": "Pfad", "Path copied": "Pfad kopiert", - "Pause a response to ask the user a clarifying question": "", + "Pause a response to ask the user a clarifying question": "Eine Antwort anhalten, um dem Benutzer eine Rückfrage zu stellen", "Paused": "Pausiert", "PDF document (.pdf)": "PDF-Dokument (.pdf)", "PDF Extract Images (OCR)": "Bilder aus PDFs extrahieren (OCR)", @@ -2061,9 +2061,9 @@ "Pending Accounts": "Ausstehende Konten", "Pending User Overlay Content": "Inhalt des Overlays 'Ausstehende Kontoaktivierung'", "Pending User Overlay Title": "Titel des Overlays 'Ausstehende Kontoaktivierung'", - "Per automation": "", - "Per chat": "", - "Percentage of recent messages to keep after older messages are summarized.": "", + "Per automation": "Pro Automatisierung", + "Per chat": "Pro Chat", + "Percentage of recent messages to keep after older messages are summarized.": "Prozentsatz der neuesten Nachrichten, die erhalten bleiben, nachdem ältere Nachrichten zusammengefasst wurden.", "Permanently delete every chat after confirmation.": "Löscht nach Bestätigung alle Chats endgültig.", "Permission denied when accessing media devices": "Zugriff auf Mediengeräte verweigert", "Permission denied when accessing microphone": "Zugriff auf Mikrofon verweigert", @@ -2110,7 +2110,7 @@ "Please enter Client ID and Client Secret": "Bitte Client-ID und Client-Secret eingeben", "Please fill in all fields.": "Bitte füllen Sie alle Felder aus.", "Please register the OAuth client": "Bitte registrieren Sie den OAuth-Client", - "Please save the connection before authorizing OAuth": "", + "Please save the connection before authorizing OAuth": "Bitte speichern Sie die Verbindung, bevor Sie OAuth autorisieren", "Please save the connection to persist the OAuth client information and do not change the ID": "Bitte speichern Sie die Verbindung, um die OAuth-Client-Informationen zu sichern, und ändern Sie die ID nicht.", "Please select a model.": "Bitte wählen Sie ein Modell aus.", "Please select a reason": "Bitte wählen Sie einen Grund aus", @@ -2128,20 +2128,20 @@ "Preferred transcript language codes, separated by commas.": "Bevorzugte Sprachcodes für Transkripte, durch Kommas getrennt.", "Prefix ID": "Präfix-ID", "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "Die Präfix-ID wird verwendet, um Konflikte mit anderen Verbindungen zu vermeiden, indem ein Präfix zu den Modell-IDs hinzugefügt wird - zum Deaktivieren leer lassen.", - "Preparing {{NAME}}...": "", - "Preparing download...": "", + "Preparing {{NAME}}...": "{{NAME}} wird vorbereitet...", + "Preparing download...": "Download wird vorbereitet...", "Press keys...": "Tasten drücken...", "Prevent File Creation": "Dateierstellung verhindern", "Preview": "Vorschau", "Preview Access": "Vorschau-Zugriff", - "Preview failed": "", - "Previous": "", + "Preview failed": "Vorschau fehlgeschlagen", + "Previous": "Zurück", "Previous 30 days": "Letzte 30 Tage", "Previous 7 days": "Letzte 7 Tage", "Previous message": "Vorherige Nachricht", - "Previous month": "", + "Previous month": "Vorheriger Monat", "Previous page": "Vorherige Seite", - "Previous version": "", + "Previous version": "Vorherige Version", "Private": "Privat", "Private conversation between selected users": "Private Unterhaltung zwischen ausgewählten Benutzern", "Production version updated": "Produktiv-Version updated", @@ -2195,13 +2195,13 @@ "Reasoning Effort": "Reasoning Effort", "Reasoning Tags": "Reasoning Tags", "Reasoning text...": "Reasoning text...", - "Rebuild knowledge file, knowledge search, and memory vectors using the current embedding model.": "", - "Rebuild vectors for existing knowledge files, knowledge search, and memories.": "", + "Rebuild knowledge file, knowledge search, and memory vectors using the current embedding model.": "Erstellt die Vektoren für Wissensdateien, Wissenssuche und Erinnerungen mit dem aktuellen Embedding-Modell neu.", + "Rebuild vectors for existing knowledge files, knowledge search, and memories.": "Erstellt die Vektoren für vorhandene Wissensdateien, die Wissenssuche und Erinnerungen neu.", "Receives matching events across the instance, including system/config events and events associated with any user.": "Empfängt passende Ereignisse instanzweit, einschließlich System-/Konfigurationsereignissen und Ereignissen, die einem beliebigen Benutzer zugeordnet sind.", "Receives matching events that are not associated with a user.": "Empfängt passende Ereignisse, die keinem Benutzer zugeordnet sind.", "Receives matching user-associated events only when the actor, user subject, or user data matches these users or current group members. System/config events are not sent.": "Empfängt passende benutzerbezogene Ereignisse nur, wenn der Akteur, das Benutzersubjekt oder die Benutzerdaten mit diesen Benutzern oder aktuellen Gruppenmitgliedern übereinstimmen. System-/Konfigurationsereignisse werden nicht gesendet.", "Recently Used": "Kürzlich verwendet", - "Recommended": "", + "Recommended": "Empfohlen", "Reconnected": "Erneut verbunden", "Record": "Aufnehmen", "Record voice": "Stimme aufnehmen", @@ -2227,8 +2227,8 @@ "Registration failed": "Registrierung fehlgeschlagen", "Registration successful": "Registrierung erfolgreich", "Reindex": "Neu indizieren", - "Reindex Embedding Data": "", - "Reindex Knowledge and Memory Vectors": "", + "Reindex Embedding Data": "Embedding-Daten neu indizieren", + "Reindex Knowledge and Memory Vectors": "Wissens- und Erinnerungsvektoren neu indizieren", "Release Notes": "Versionshinweise", "Releases": "Releases", "Relevance": "Relevanz", @@ -2277,7 +2277,7 @@ "Reset Upload Directory": "Upload-Verzeichnis zurücksetzen", "Reset Vector Storage/Knowledge": "Vektorspeicher/Wissen zurücksetzen", "Reset view": "Ansicht zurücksetzen", - "Reset zoom": "", + "Reset zoom": "Zoom zurücksetzen", "Response": "Antwort", "Response Auto-Scroll": "Automatisch mitscrollen", "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Antwortbenachrichtigungen können nicht aktiviert werden, da die Website-Berechtigungen verweigert wurden. Bitte erteilen Sie in Ihren Browser-Einstellungen den erforderlichen Zugriff.", @@ -2288,7 +2288,7 @@ "Restrict or exclude domains using a comma-separated list.": "Beschränkt Domains anhand einer kommagetrennten Liste oder schließt sie aus.", "Result": "Ergebnis", "RESULT": "ERGEBNIS", - "Retained Messages": "", + "Retained Messages": "Beibehaltene Nachrichten", "Retrieval": "Abruf", "Retrieval Query Generation": "Abfrage-Generierung", "Retrieved {{count}} sources": "{{count}} Quellen abgerufen", @@ -2333,7 +2333,7 @@ "Scheduled time must be in the future": "Geplante Zeit muss in der Zukunft liegen", "Scopes": "Scopes", "Scroll On Branch Change": "Bei Zweigwechsel scrollen", - "Scroll to bottom": "", + "Scroll to bottom": "Nach unten scrollen", "Scroll to the active branch when switching response branches.": "Springt beim Wechsel zwischen Antwortzweigen zum aktiven Zweig.", "Scroll to Top": "Zum Anfang scrollen", "Search": "Suchen", @@ -2344,15 +2344,15 @@ "Search and view user chat history": "Suche und sehe die Chat History des Benutzers ein", "Search Automations": "Automatisierungen suchen", "Search Base": "Suchbasis", - "Search channels": "", + "Search channels": "Kanäle durchsuchen", "Search channels and channel messages": "Suche Kanäle und Kanalnachrichten", "Search Chats": "Chats durchsuchen...", "Search Collection": "Sammlung durchsuchen", "Search Files": "Suche Dateien", - "Search files and contents": "", + "Search files and contents": "Dateien und Inhalte durchsuchen", "Search filters": "Filter durchsuchen", "Search Filters": "Suchfilter", - "Search folders": "", + "Search folders": "Ordner durchsuchen", "search for archived chats": "nach archivierten Chats suchen", "search for folders": "nach Ordnern suchen", "search for pinned chats": "nach angehefteten Chats suchen", @@ -2416,7 +2416,7 @@ "Select an embedding model engine": "Wählen Sie eine Embedding-Modell-Engine", "Select an engine": "Wählen Sie eine Engine", "Select an installed pipeline to configure or remove.": "Wählen Sie eine installierte Pipeline aus, um sie zu konfigurieren oder zu entfernen.", - "Select an instance": "", + "Select an instance": "Instanz auswählen", "Select an Ollama instance": "Wählen Sie eine Ollama-Instanz", "Select an option": "Wähle eine Option", "Select an output format": "Wählen Sie ein Ausgabeformat", @@ -2430,18 +2430,18 @@ "Select Method": "Methode auswählen", "Select model": "Modell auswählen", "Select only one model to call": "Wählen Sie nur ein Modell zum Aufrufen aus", - "Select options": "", + "Select options": "Optionen auswählen", "Select Skill": "Skill auswählen", "Select the Gemini endpoint method to call.": "Wählt die aufzurufende Methode des Gemini-Endpunkts.", "Select the local model precision used by Kokoro.js.": "Wählt die Genauigkeit des lokalen Modells, das Kokoro.js verwendet.", "Select the Pipelines server to manage.": "Wählen Sie den Pipelines-Server aus, den Sie verwalten möchten.", - "Select the Tika server API version.": "", + "Select the Tika server API version.": "Legt die API-Version des Tika-Servers fest.", "Select Tool": "Werkzeug auswählen", "Select view": "Ansicht wählen", "Selected": "Ausgewählt", "Selected model: {{modelName}}": "Ausgewähltes Modell: {{modelName}}", "Selected model(s) do not support image inputs": "Die ausgewählten Modelle unterstützen keine Bildeingaben", - "Selected models define incompatible Chat Variables.": "", + "Selected models define incompatible Chat Variables.": "Die ausgewählten Modelle definieren inkompatible Chat-Variablen.", "semantic": "semantisch", "Send": "Senden", "Send a Message": "Eine Nachricht senden", @@ -2481,7 +2481,7 @@ "Set embedding model": "Embedding-Modell festlegen", "Set embedding model (e.g. {{model}})": "Embedding-Modell festlegen (z. B. {{model}})", "Set reranking model (e.g. {{model}})": "Reranking-Modell festlegen (z. B. {{model}})", - "Set system-wide interface defaults for every account. Personal settings override these defaults.": "", + "Set system-wide interface defaults for every account. Personal settings override these defaults.": "Legt systemweite Standardeinstellungen der Benutzeroberfläche für alle Konten fest. Persönliche Einstellungen überschreiben diese Standardwerte.", "Set the birth date saved with your profile.": "Legt das in Ihrem Profil gespeicherte Geburtsdatum fest.", "Set the default system prompt for new chats.": "Legt den Standard-System-Prompt für neue Chats fest.", "Set the display name shown across your account.": "Legt den Anzeigenamen fest, der in Ihrem Konto verwendet wird.", @@ -2499,7 +2499,7 @@ "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.": "Legt die zu verwendenden Stoppsequenzen fest. Wenn dieses Muster erkannt wird, stoppt das LLM die Textgenerierung. Mehrere Stoppmuster können durch separate Stopp-Parameter in einer Modelldatei angegeben werden.", "Setting": "Einstellung", "Settings": "Einstellungen", - "settings configured": "", + "settings configured": "Einstellungen konfiguriert", "Settings Permissions": "Berechtigungen für Einstellungen", "Settings saved successfully!": "Einstellungen erfolgreich gespeichert!", "Shapes the short label generated for each chat.": "Bestimmt, wie der kurze Titel für jeden Chat erzeugt wird.", @@ -2516,7 +2516,7 @@ "Sharing Permissions": "Freigabeberechtigungen", "Show": "Anzeigen", "Show \"What's New\" Modal on Login": "\"Was gibt's Neues\"-Fenster beim Anmelden anzeigen", - "Show a floating preview of recent messages when hovering a chat in the sidebar.": "", + "Show a floating preview of recent messages when hovering a chat in the sidebar.": "Zeigt eine schwebende Vorschau der letzten Nachrichten, wenn Sie mit der Maus über einen Chat in der Seitenleiste fahren.", "Show admin contact details while an account waits for approval.": "Zeigt die Kontaktdaten des Administrators an, solange ein Konto auf Freigabe wartet.", "Show All": "Alle anzeigen", "Show all ({{COUNT}} characters)": "Zeige alle ({{COUNT}} Zeichen)", @@ -2525,8 +2525,8 @@ "Show Files on Terminal Select": "Dateien bei Terminal-Auswahl anzeigen", "Show formatting controls in the rich text composer.": "Zeigt die Formatierungsleiste im Rich-Text-Eingabefeld an.", "Show Formatting Toolbar": "Formatierungsleiste anzeigen", - "Show Full access and Ask for approval in the chat input menu.": "", - "Show Hidden Files": "", + "Show Full access and Ask for approval in the chat input menu.": "Zeigt \"Full access\" und \"Ask for approval\" im Menü der Chat-Eingabe an.", + "Show Hidden Files": "Versteckte Dateien anzeigen", "Show image preview": "Bildvorschau anzeigen", "Show Model": "Modell anzeigen", "Show more": "Mehr anzeigen", @@ -2541,7 +2541,7 @@ "Show your support!": "Zeigen Sie Ihre Unterstützung!", "Show your username label instead of You in chat bubbles.": "Zeigt in den Sprechblasen Ihren Benutzernamen statt \"Du\" an.", "Showcased creativity": "Kreativität gezeigt", - "Sidebar": "", + "Sidebar": "Seitenleiste", "Sign in": "Anmelden", "Sign in to {{WEBUI_NAME}}": "Bei {{WEBUI_NAME}} anmelden", "Sign in to {{WEBUI_NAME}} with LDAP": "Bei {{WEBUI_NAME}} mit LDAP anmelden", @@ -2552,7 +2552,7 @@ "simultaneous sub-agents": "Sub-Agents", "Single": "Einzeln", "Sink List": "Sink-Liste", - "Size": "", + "Size": "Größe", "sk-1234": "sk-1234", "Skill created successfully": "Skill erfolgreich erstellt", "Skill deleted successfully": "Skill erfolgreich gelöscht", @@ -2569,7 +2569,7 @@ "Skills Sharing": "Teilen von Skills", "Skip Cache": "Cache überspringen", "Skip cached Marker results and rerun inference.": "Überspringt zwischengespeicherte Marker-Ergebnisse und führt die Verarbeitung erneut aus.", - "Skip to main content": "", + "Skip to main content": "Zum Hauptinhalt springen", "Something went wrong :/": "Etwas ist schiefgelaufen :/", "Sonar": "Sonar", "Sonar Deep Research": "Sonar Deep Research", @@ -2592,7 +2592,7 @@ "Start new chats as temporary unless changed.": "Startet neue Chats als temporär, sofern nicht anders gewählt.", "Start of the channel": "Beginn des Kanals", "Start Tag": "Start-Tag", - "Start the chat to use this terminal.": "", + "Start the chat to use this terminal.": "Starten Sie den Chat, um dieses Terminal zu verwenden.", "Starting in {{count}} minutes_one": "Beginnt in {{count}} Minute", "Starting in {{count}} minutes_other": "Beginnt in {{count}} Minuten", "Starting in 1 minute": "Beginnt in 1 minute", @@ -2605,7 +2605,7 @@ "STDOUT/STDERR": "STDOUT/STDERR", "Steps": "Schritte", "Stop": "Stopp", - "Stop camera": "", + "Stop camera": "Kamera ausschalten", "Stop Download": "Download stoppen", "Stop Generating": "Generierung stoppen", "Stop Sequence": "Stoppsequenz", @@ -2621,7 +2621,7 @@ "Su_day_of_week": "So", "Sub Claim": "Sub-Claim", "Sub-agents": "Sub-Agents", - "Submit answers": "", + "Submit answers": "Antworten absenden", "Submit question": "Frage absenden", "Submit suggestion": "Vorschlag absenden", "Subtitle": "Untertitel", @@ -2636,9 +2636,9 @@ "Summarize this note.": "Diese Notiz zusammenfassen.", "Support": "Unterstützung", "Support this plugin:": "Unterstützen Sie dieses Plugin:", - "Supported Media MIME Types": "", + "Supported Media MIME Types": "Unterstützte Medien-MIME-Typen", "Supported MIME Types": "Unterstützte MIME-Typen", - "Switch camera": "", + "Switch camera": "Kamera wechseln", "Switch to JSON editor": "Zum JSON-Editor wechseln", "Switch to visual editor": "Zum visuellen Editor wechseln", "Sync": "Synchronisieren", @@ -2669,7 +2669,7 @@ "Task List": "Aufgabenliste", "Task Management": "Aufgabenverwaltung", "Task Model": "Aufgabenmodell", - "Task Model Parameters": "", + "Task Model Parameters": "Parameter des Aufgabenmodells", "Tasks": "Aufgaben", "tasks completed": "Aufgaben abgeschlossen", "Tavily API Key": "Tavily-API-Schlüssel", @@ -2679,9 +2679,9 @@ "Temporary Chat": "Temporärer Chat", "Temporary Chat by Default": "Temporärer Chat als Standard", "Terminal": "Terminal", - "Terminal Contexts": "", - "Terminal File Display": "", - "Terminal Preview Allow Same Origin": "", + "Terminal Contexts": "Terminal-Kontexte", + "Terminal File Display": "Terminal-Dateianzeige", + "Terminal Preview Allow Same Origin": "Terminal-Vorschau: Gleichen Ursprung erlauben", "Terminal servers saved": "Terminal Server gespeichert", "Test": "Testen", "Test must pass before a source is created.": "Der Test muss erfolgreich sein, bevor eine Quelle angelegt werden kann.", @@ -2713,7 +2713,7 @@ "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "Die Temperatur des Modells. Eine Erhöhung führt zu kreativeren Antworten.", "Theme": "Design", "There was an error syncing your stats. Please try again.": "Beim Synchronisieren Ihrer Statistiken ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", - "These settings are read from environment variables and cannot be edited here while {{ENV_VAR}} is disabled.": "", + "These settings are read from environment variables and cannot be edited here while {{ENV_VAR}} is disabled.": "Diese Einstellungen werden aus Umgebungsvariablen gelesen und können hier nicht bearbeitet werden, solange {{ENV_VAR}} deaktiviert ist.", "thinking, output_config": "thinking, output_config", "Thinking...": "Denke nach...", "This action cannot be undone. Do you wish to continue?": "Diese Aktion kann nicht rückgängig gemacht werden. Möchten Sie fortfahren?", @@ -2734,10 +2734,10 @@ "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 and cannot be undone.": "Dies löscht alle Modelle, einschließlich benutzerdefinierter Modelle, und kann nicht rückgängig gemacht werden.", - "This will delete the cached model and cannot be undone.": "", + "This will delete the cached model and cannot be undone.": "Dadurch wird das zwischengespeicherte Modell gelöscht. Dies kann nicht rückgängig gemacht werden.", "This will permanently delete the calendar \"{{name}}\" and all its events. This action cannot be undone.": "Dies wird den Kalender \"{{name}}\" und alle seine Ereignisse dauerhaft löschen. Diese Aktion kann nicht rückgängig gemacht werden.", "This will remove all files and directories from this knowledge base. This action cannot be undone.": "Dadurch werden alle Dateien und Verzeichnisse aus diesem Wissensspeicher entfernt. Diese Aktion kann nicht rückgängig gemacht werden.", - "This will revoke the current API key.": "", + "This will revoke the current API key.": "Dadurch wird der aktuelle API-Schlüssel widerrufen.", "Thorough explanation": "Ausführliche Erklärung", "Thought": "Gedanke", "Thought for {{DURATION}}": "Nachgedacht für {{DURATION}}", @@ -2747,12 +2747,12 @@ "Through": "Bis", "Thumbs up/down ratings from users on model responses": "Daumen hoch/runter von Benutzer für Modell Antworten", "Tika": "Tika", - "Tika 3.x": "", - "Tika 4.x": "", + "Tika 3.x": "Tika 3.x", + "Tika 4.x": "Tika 4.x", "Tika server endpoint used for content extraction.": "Endpunkt des Tika-Servers für die Inhaltsextraktion.", "Tika Server URL": "Tika-Server-URL", "Tika Server URL required.": "Tika-Server-URL erforderlich.", - "Tika Server Version": "", + "Tika Server Version": "Tika-Server-Version", "Tiktoken": "Tiktoken", "Time": "Zeit", "Time & Calculation": "Zeit & Berechnung", @@ -2783,7 +2783,7 @@ "Today at": "Heute um", "Toggle {{COUNT}} sources": "{{COUNT}} Quellen umschalten", "Toggle 1 source": "Eine Quelle umschalten", - "Toggle Controls": "", + "Toggle Controls": "Steuerung umschalten", "Toggle details": "Details umschalten", "Toggle Dictation": "Diktieren umschalten", "Toggle Mute": "Stummschaltung umschalten", @@ -2800,7 +2800,7 @@ "tokens": "Token", "Tokens": "Token", "Too verbose": "Zu ausführlich", - "tool": "", + "tool": "Werkzeug", "Tool created successfully": "Werkzeug erfolgreich erstellt", "Tool deleted successfully": "Werkzeug erfolgreich gelöscht", "Tool Description": "Werkzeugbeschreibung", @@ -2809,7 +2809,7 @@ "tool loops per sub-agent": "Werkzeugdurchläufe pro Sub-Agent", "Tool Menu": "Werkzeugmenü", "Tool Name": "Werkzeugname", - "Tool Permissions": "", + "Tool Permissions": "Werkzeug-Berechtigungen", "Tool Servers": "Tool-Server", "Tool updated successfully": "Werkzeug erfolgreich aktualisiert", "Tools": "Werkzeuge", @@ -2834,10 +2834,10 @@ "TTS Voice": "TTS-Stimme", "Tu_day_of_week": "Di", "Type": "Typ", - "Type a model ref": "", + "Type a model ref": "Modellreferenz eingeben", "Type here...": "Hier eingeben...", "Type Hugging Face Resolve (Download) URL": "Hugging Face Resolve (Download) URL eingeben", - "Type your answer": "", + "Type your answer": "Antwort eingeben", "Uh-oh! There was an issue with the response.": "Es ist ein Problem mit der Antwort aufgetreten.", "UI": "Benutzeroberfläche", "UI Scale": "UI-Skalierung", @@ -2848,12 +2848,12 @@ "unknown": "unbekannt", "Unknown": "Unbekannt", "Unknown User": "Unbekannter Benutzer", - "Unload Model": "", + "Unload Model": "Modell entladen", "Unloads {{FROM_NOW}}": "Entlädt {{FROM_NOW}}", "Unmute": "Stummschalten aufheben", "Unpin": "Lösen", "Unpin from Sidebar": "Aus der Seitenleiste lösen", - "Unread": "", + "Unread": "Ungelesen", "Unshare All": "Alle Freigaben aufheben", "Unshare All Shared Chats": "Freigabe aller geteilten Chats aufheben", "Unshare Chat": "Chat-Freigabe entfernen", @@ -2861,7 +2861,7 @@ "Untagged": "Ohne Tag", "Untitled": "Unbenannt", "Update": "Aktualisieren", - "Update All Models": "", + "Update All Models": "Alle Modelle aktualisieren", "Update and Copy Link": "Aktualisieren und Link kopieren", "Update Email": "E-Mail aktualisieren", "Update embedding model": "Embedding-Modell aktualisieren", @@ -2882,7 +2882,7 @@ "Upload a workflow.json file exported as API format from ComfyUI.": "Laden Sie eine workflow.json hoch, die in ComfyUI im API-Format exportiert wurde.", "Upload Audio": "Audio hochladen", "Upload directory": "Ordner Hochladen", - "Upload failed": "", + "Upload failed": "Upload fehlgeschlagen", "Upload files": "Dateien hochladen", "Upload Files": "Datei(en) hochladen", "Upload Model": "Modell hochladen", @@ -2920,7 +2920,7 @@ "Use styled formatting when exporting chats to PDF.": "Übernimmt beim PDF-Export von Chats die Formatierung.", "Use the active chat title as the browser tab title.": "Verwendet den Titel des aktiven Chats als Titel des Browser-Tabs.", "Use the rich composer instead of a plain textarea.": "Verwendet das Rich-Text-Eingabefeld statt eines einfachen Textfelds.", - "Use these in model system prompts as {{example}}.": "", + "Use these in model system prompts as {{example}}.": "Verwenden Sie diese in System-Prompts von Modellen als {{example}}.", "Use TLS when connecting to the LDAP server.": "Verwendet TLS für die Verbindung zum LDAP-Server.", "Use Web Search?": "Websuche verwenden?", "user": "Benutzer", @@ -2932,11 +2932,11 @@ "User location successfully retrieved.": "Benutzerstandort erfolgreich abgerufen.", "User menu": "Benutzermenü", "User messages": "Benutzernachrichten", - "User not found.": "", + "User not found.": "Benutzer nicht gefunden.", "User Preview": "Benutzervorschau", "User ratings (thumbs up/down)": "Benutzerbewertungen (Daumen hoch/runter)", "User Status": "Nutzerstatus", - "User Variables": "", + "User Variables": "Benutzervariablen", "User Webhooks": "Benutzer-Webhooks", "Username": "Benutzername", "Username Claim": "Benutzername-Claim", @@ -2951,15 +2951,15 @@ "Valid time units: 's', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "Gültige Zeiteinheiten: 's', 'm', 'h', 'd', 'w' oder '-1' für keinen Ablauf.", "Validate Certificate": "Zertifikat prüfen", "Validate SSL certificates when fetching web content.": "Prüft SSL-Zertifikate beim Abrufen von Webinhalten.", - "Value": "", + "Value": "Wert", "Valves": "Valves", "Valves updated": "Valves aktualisiert", "Valves updated successfully": "Valves erfolgreich aktualisiert", "variable": "Variable", - "Variable key": "", - "Variable keys must be unique.": "", - "Variable keys must use lowercase snake case.": "", - "Variable value": "", + "Variable key": "Variablenschlüssel", + "Variable keys must be unique.": "Variablenschlüssel müssen eindeutig sein.", + "Variable keys must use lowercase snake case.": "Variablenschlüssel müssen in Kleinbuchstaben und Snake Case geschrieben werden.", + "Variable value": "Variablenwert", "Vector Field": "Vektorfeld", "Verify Connection": "Verbindung prüfen", "Verify SSL Certificate": "SSL-Zertifikat prüfen", @@ -2967,15 +2967,15 @@ "Version": "Version", "Version {{selectedVersion}} of {{totalVersions}}": "Version {{selectedVersion}} von {{totalVersions}}", "Version deleted": "Version gelöscht", - "View channel": "", + "View channel": "Kanal anzeigen", "View chat": "Chat ansehen", "View Replies": "Antworten anzeigen", "View Result from {{NAME}}": "Ergebnis von {{NAME}} ansehen", "View source: {{name}}": "Quelle anzeigen: {{name}}", "View source: {{title}}": "Quelle anzeigen: {{title}}", "View the installed version and check release updates.": "Zeigt die installierte Version an und prüft auf Aktualisierungen.", - "Viewport Pinned": "", - "Viewport Unpinned": "", + "Viewport Pinned": "Ansichtsbereich fixiert", + "Viewport Unpinned": "Ansichtsbereich nicht fixiert", "Visibility": "Sichtbarkeit", "Visible": "Sichtbar", "Visible to all users": "Für alle Benutzer sichtbar", @@ -2987,7 +2987,7 @@ "Voice Mode Prompt": "Anruf-Modus Prompt", "Wait for the current response to finish before compacting.": "Warten Sie, bis die aktuelle Antwort abgeschlossen ist, bevor Sie den Kontext verdichten.", "Wait for the current response to finish before forking.": "Warten Sie, bis die aktuelle Antwort abgeschlossen ist, bevor Sie den Chat verzweigen.", - "Waiting for upload": "", + "Waiting for upload": "Warten auf Upload", "Waiting for upload...": "Warte auf Datei upload...", "Warning": "Warnung", "Warning:": "Warnung:", @@ -3088,6 +3088,6 @@ "YouTube": "YouTube", "Youtube Language": "YouTube-Sprache", "Youtube Proxy URL": "YouTube-Proxy-URL", - "Zoom in": "", - "Zoom out": "" + "Zoom in": "Vergrößern", + "Zoom out": "Verkleinern" } From 17cc566707cd2ee78b460e39c7fad23b9c258c70 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 27 Aug 2026 19:23:44 -0400 Subject: [PATCH 17/99] refac --- backend/open_webui/models/users.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/models/users.py b/backend/open_webui/models/users.py index 3d132c529e..b7633759f5 100644 --- a/backend/open_webui/models/users.py +++ b/backend/open_webui/models/users.py @@ -367,7 +367,9 @@ class UsersTable: query = select(User).where(sub_expr == sub) # SQLite preserves JSON numeric type here; Postgres ->> already compares numeric JSON as text. if session.get_bind().dialect.name == 'sqlite' and sub.isdecimal(): - query = select(User).where(or_(sub_expr == sub, sub_expr == int(sub))) + sub_int = int(sub) + if str(sub_int) == sub and sub_int <= 2**63 - 1: + query = select(User).where(or_(sub_expr == sub, sub_expr == sub_int)) row = (await session.execute(query)).scalars().first() return UserModel.model_validate(row) if row else None From b3591e60b18bf2cdc57a57c215f70065882dbf60 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Fri, 28 Aug 2026 01:24:19 +0200 Subject: [PATCH 18/99] fix: apply the selected model's tools and skills when starting a chat from the sidebar (#29058) Clicking a pinned model in the sidebar started a new chat with that model but sent the previous model's tool_ids and skill_ids, and they stayed until the page was reloaded. The model dropdown was unaffected, and so was temporary chat. A pinned entry links to /?model=, which runs the new-chat path. That path applied the model's defaults and then restored the composer draft over the top, and the draft still held the selection from whichever model was active when it was written. The draft save is debounced, so the stale value was reliably the one read back. The draft is now restored before the defaults are applied, so the model always decides which tools and skills are active while the unsent prompt, files and approval mode are still kept. Starting a new chat with several models selected now clears the selection instead of carrying the draft's over, since there are no per-model defaults to apply in that case. Co-authored-by: Claude --- src/lib/components/chat/Chat.svelte | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 9aa7ad720b..a58f53d3ff 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -2113,8 +2113,9 @@ autoScroll = true; - await resetInput(); + // resetInput() must stay last: the selected model's defaults override the draft's selection. await restoreChatInput(sessionStorage.getItem('chat-input')); + await resetInput(); await chatId.set(''); await chatTitle.set(''); From 95492cc0b46cbd72b37d2036b0844b9b26a604e6 Mon Sep 17 00:00:00 2001 From: fengyufeiyang-dot <916664826@qq.com> Date: Fri, 28 Aug 2026 23:28:55 +0800 Subject: [PATCH 19/99] i18n: complete zh-CN translation for Open WebUI v0.11.1 (#29151) Co-authored-by: fengyufeiyang-dot --- src/lib/i18n/locales/zh-CN/translation.json | 1888 ++++++++++--------- 1 file changed, 951 insertions(+), 937 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 6bda3b4114..41f55ae71d 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -6,15 +6,15 @@ "[Today at] h:mm A": "[今天] h:mm A", "[Yesterday at] h:mm A": "[昨天] h:mm A", "{{ models }}": "{{ models }}", - "{{COUNT}} Available Skills": "", + "{{COUNT}} Available Skills": "{{COUNT}} 个可用技能", "{{COUNT}} Available Tools": "{{COUNT}} 个可用工具", "{{COUNT}} characters": "{{COUNT}} 个字符", "{{COUNT}} extracted lines": "已提取 {{COUNT}} 行文本", - "{{count}} files_other": "", + "{{count}} files_other": "{{count}} 个文件", "{{COUNT}} files": "{{COUNT}} 个文件", "{{count}} files selected. Only new and modified files will be uploaded. Deleted files will be removed. The folder structure will be mirrored. Continue?_other": "已选择 {{count}} 个文件。仅会上传新增和已修改的文件,已删除的文件将被移除,并将镜像文件夹结构。是否继续?", - "{{count}} filters_other": "", - "{{count}} groups_other": "", + "{{count}} filters_other": "{{count}} 个过滤器", + "{{count}} groups_other": "{{count}} 个用户组", "{{COUNT}} hidden lines": "已隐藏 {{COUNT}} 行代码", "{{COUNT}} members": "{{COUNT}} 位成员", "{{count}} of {{total}} accessible_other": "可访问 {{count}}/{{total}}", @@ -22,26 +22,26 @@ "{{COUNT}} Rows": "{{COUNT}} 行", "{{count}} selected_other": "已选择 {{count}} 项", "{{COUNT}} Sources": "{{COUNT}} 个引用来源", - "{{count}} users_other": "", + "{{count}} users_other": "{{count}} 个用户", "{{COUNT}} words": "{{COUNT}} 个字", "{{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}}年前", - "{{label}} contains invalid JSON": "", - "{{label}} must be a JSON object": "", + "{{label}} contains invalid JSON": "{{label}} 包含无效的 JSON", + "{{label}} must be a JSON object": "{{label}} 必须是 JSON 对象", "{{model}} download has been canceled": "已取消模型 {{model}} 的下载", "{{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 file": "", - "1 group": "", + "1 file": "1 个文件", + "1 group": "1 个用户组", "1 hour before": "提前 1 小时", "1 Source": "1 个引用来源", - "1 user": "", + "1 user": "1 个用户", "10 minutes before": "提前 10 分钟", "15 minutes before": "提前 15 分钟", "1m_time_ago": "刚刚", @@ -57,9 +57,9 @@ "Access": "访问", "Access Control": "访问控制", "Access Grants": "访问授权", - "Access level": "", + "Access level": "访问级别", "Access List": "访问列表", - "Access prohibited": "", + "Access prohibited": "禁止访问", "Access updated": "访问权限已更新", "Accessible to all users": "对所有用户开放", "Account": "账号", @@ -72,16 +72,16 @@ "Active": "在线", "Active Users": "当前在线用户", "Activity": "活动", - "Activity insights": "", + "Activity insights": "活动分析", "Add": "添加", "Add a model ID": "添加模型 ID", - "Add a preference, fact, or instruction about you": "", + "Add a preference, fact, or instruction about you": "添加关于您的偏好、事实或指令", "Add a short description about what this model does": "添加有关该模型能力的简短描述", "Add a tag": "添加标签", - "Add a tag...": "添加标签...", + "Add a tag...": "添加标签……", "Add Access": "添加访问", "Add Arena Model": "添加盲测模型", - "Add banner": "", + "Add banner": "添加横幅", "Add Connection": "添加连接", "Add Content": "添加内容", "Add content here": "在此添加内容", @@ -89,18 +89,18 @@ "Add Custom Prompt": "增加自定义提示词", "Add description": "添加描述", "Add Details": "丰富细节", - "Add durable context for future chats": "", - "Add filenames, titles, sections, and snippets to improve lexical recall.": "", + "Add durable context for future chats": "为未来的对话添加持久上下文", + "Add filenames, titles, sections, and snippets to improve lexical recall.": "添加文件名、标题、章节和代码片段以提高词汇召回率。", "Add Files": "添加文件", "Add Image": "添加图片", - "Add Knowledge Connection": "", + "Add Knowledge Connection": "添加知识库连接", "Add location": "添加地点", "Add Member": "添加成员", "Add Members": "添加成员", "Add Memory": "添加记忆", - "Add Notification Target": "", - "Add optional profile context visible where profiles are shown.": "", - "Add prompt suggestion": "", + "Add Notification Target": "添加通知目标", + "Add optional profile context visible where profiles are shown.": "添加在个人资料展示区域可见的可选个人资料上下文。", + "Add prompt suggestion": "添加提示词建议", "Add Reaction": "添加表情", "Add tag": "添加标签", "Add Tag": "添加标签", @@ -110,107 +110,107 @@ "Add to favorites": "添加到收藏", "Add User": "添加用户", "Add User Group": "添加用户组", - "Add User Variable": "", - "Add webhook": "", + "Add User Variable": "添加用户变量", + "Add webhook": "添加 Webhook", "Add webpage": "添加网页", "Add your Open Terminal URL and API key in Settings → Integrations.": "请到“设置 → 集成”中配置 Open Terminal 的地址和密钥。", "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": "Datalab 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 Docling parameters in JSON format.": "", + "Additional Docling parameters in JSON format.": "Docling 的附加参数,格式为 JSON。", "Additional feedback comments": "补充反馈说明", - "Additional JSON headers sent to the external document loader.": "", + "Additional JSON headers sent to the external document loader.": "发送到外部文档加载器的附加 JSON 头信息。", "Additional Parameters": "额外参数", - "Adjust how quickly spoken responses are played.": "", + "Adjust how quickly spoken responses are played.": "调整语音回答的播放速度。", "admin": "管理员", "Admin": "管理员", "Admin Contact Email": "管理员联系邮箱", - "Admin Details": "", + "Admin Details": "管理员详情", "Admin Panel": "管理员面板", - "Admin Roles": "", - "Admin-managed service account": "", + "Admin Roles": "管理员角色", + "Admin-managed service account": "管理员管理的服务账号", "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "管理员拥有所有工具的完全访问权限;用户则需在工作空间中为每个模型单独分配工具。", "Advanced": "高级", - "Advanced MinerU parsing parameters in JSON format.": "", + "Advanced MinerU parsing parameters in JSON format.": "MinerU 高级解析参数,格式为 JSON。", "Advanced Parameters": "高级参数", "Advanced Params": "高级参数", - "After changing the embedding model, reindex knowledge, knowledge search, and memory vectors for changes to take effect.": "", + "After changing the embedding model, reindex knowledge, knowledge search, and memory vectors for changes to take effect.": "更改嵌入模型后,需要重新索引知识库、知识搜索和记忆向量才能生效。", "All": "全部", - "All Chats": "", + "All Chats": "所有对话", "All chats have been unarchived.": "已成功取消全部对话的归档状态。", "All day": "全天", - "All events": "", + "All events": "所有事件", "All models are now hidden": "已隐藏全部模型", "All models are now visible": "已显示全部模型", "All models deleted successfully": "已成功删除全部模型", - "All shared chats have been unshared.": "", - "All Sources": "", + "All shared chats have been unshared.": "已取消所有共享对话的分享。", + "All Sources": "所有来源", "All time": "所有时间", "All Users": "所有用户", - "All users and system events": "", - "Allow": "", - "Allow {{NAME}}?": "", - "Allow artifacts to access same-origin browser APIs inside the sandbox.": "", - "Allow automatic names for new chats.": "", - "Allow browser notifications for completed responses.": "", + "All users and system events": "所有用户和系统事件", + "Allow": "允许", + "Allow {{NAME}}?": "允许 {{NAME}}?", + "Allow artifacts to access same-origin browser APIs inside the sandbox.": "允许产物在沙盒内访问同源浏览器 API。", + "Allow automatic names for new chats.": "允许为新对话自动生成名称。", + "Allow browser notifications for completed responses.": "允许在回答完成时发送浏览器通知。", "Allow Call": "允许语音通话", "Allow Chat Controls": "允许使用对话高级设置", "Allow Chat Delete": "允许删除对话记录", "Allow Chat Edit": "允许编辑对话记录", "Allow Chat Export": "允许导出对话", - "Allow Chat Import": "", + "Allow Chat Import": "允许导入对话", "Allow Chat Params": "允许设置模型高级参数", "Allow Chat Share": "允许分享对话", "Allow Chat System Prompt": "允许设置系统提示词", "Allow Chat Valves": "允许修改工具和函数的配置项(Valves)", "Allow Continue Response": "允许继续生成回答", - "Allow delegated sub-agents to keep running while the parent chat continues.": "", + "Allow delegated sub-agents to keep running while the parent chat continues.": "允许被委派的子智能体在父对话继续时保持运行。", "Allow Delete Messages": "允许删除对话消息", - "Allow downloads inside sandboxed iframes.": "", + "Allow downloads inside sandboxed iframes.": "允许在沙盒 iframe 内下载文件。", "Allow File Upload": "允许上传文件", - "Allow forms inside sandboxed artifact iframes.": "", - "Allow Google Drive as a document source.": "", - "Allow models to run generated code and return execution results.": "", - "Allow models to use the code interpreter tool during chats.": "", + "Allow forms inside sandboxed artifact iframes.": "允许在沙盒产物 iframe 内使用表单。", + "Allow Google Drive as a document source.": "允许使用 Google Drive 作为文档源。", + "Allow models to run generated code and return execution results.": "允许模型运行生成的代码并返回执行结果。", + "Allow models to use the code interpreter tool during chats.": "允许模型在对话中使用代码解释器工具。", "Allow Multiple Models in Chat": "允许在对话中使用多个模型", - "Allow new users to create accounts.": "", + "Allow new users to create accounts.": "允许新用户注册账号。", "Allow non-local voices": "允许调用非本土音色", - "Allow OneDrive as a document source.": "", + "Allow OneDrive as a document source.": "允许使用 OneDrive 作为文档源。", "Allow public write access": "允许公开写入", "Allow Rate Response": "允许对回答进行评价", "Allow Regenerate Response": "允许重新生成回答", - "Allow scripts inside sandboxed iframes.": "", - "Allow Sharing With Groups": "", + "Allow scripts inside sandboxed iframes.": "允许在沙盒 iframe 内运行脚本。", + "Allow Sharing With Groups": "允许分享给用户组", "Allow Sharing With Users": "允许分享给其他用户", "Allow Speech to Text": "允许语音转文本", "Allow Temporary Chat": "允许临时对话", - "Allow terminal previews to access same-origin browser APIs.": "", + "Allow terminal previews to access same-origin browser APIs.": "允许终端预览访问同源浏览器 API。", "Allow Text to Speech": "允许文本转语音", - "Allow the AI to delegate tasks to sub-agents. Each sub-agent creates a real chat with full tool access. Uses additional LLM calls.": "", - "Allow Tool Call": "", + "Allow the AI to delegate tasks to sub-agents. Each sub-agent creates a real chat with full tool access. Uses additional LLM calls.": "允许 AI 将任务委派给子智能体。每个子智能体会创建一个拥有完整工具访问权限的真实对话。会消耗额外的 LLM 调用。", + "Allow Tool Call": "允许工具调用", "Allow User Location": "获取您的位置", - "Allow users to access calendar features.": "", - "Allow users to authenticate with an LDAP directory.": "", - "Allow users to authenticate with an OAuth / OIDC provider.": "", - "Allow users to configure webhooks from their account.": "", - "Allow users to create accounts through OAuth.": "", - "Allow users to create and manage notes.": "", - "Allow users to create and run automations.": "", - "Allow users to create API keys for programmatic access.": "", - "Allow users to edit existing images.": "", - "Allow users to generate images from prompts.": "", - "Allow users to organize chats into folders.": "", - "Allow users to save memories for more personalized responses.": "", - "Allow users to search the web from chats.": "", - "Allow users to share chats with the Open WebUI community.": "", - "Allow users to use channels for shared conversations.": "", + "Allow users to access calendar features.": "允许用户使用日程功能。", + "Allow users to authenticate with an LDAP directory.": "允许用户通过 LDAP 目录进行身份验证。", + "Allow users to authenticate with an OAuth / OIDC provider.": "允许用户通过 OAuth / OIDC 提供商进行身份验证。", + "Allow users to configure webhooks from their account.": "允许用户在账号中配置 Webhook。", + "Allow users to create accounts through OAuth.": "允许用户通过 OAuth 创建账号。", + "Allow users to create and manage notes.": "允许用户创建和管理笔记。", + "Allow users to create and run automations.": "允许用户创建和运行自动化任务。", + "Allow users to create API keys for programmatic access.": "允许用户创建 API 密钥以进行编程访问。", + "Allow users to edit existing images.": "允许用户编辑已有图片。", + "Allow users to generate images from prompts.": "允许用户通过提示词生成图片。", + "Allow users to organize chats into folders.": "允许用户将对话整理到分组中。", + "Allow users to save memories for more personalized responses.": "允许用户保存记忆以获得更个性化的回答。", + "Allow users to search the web from chats.": "允许用户在对话中搜索网页。", + "Allow users to share chats with the Open WebUI community.": "允许用户将对话分享到 Open WebUI 社区。", + "Allow users to use channels for shared conversations.": "允许用户使用频道进行共享对话。", "Allow Voice Interruption in Call": "允许语音通话时打断对话", "Allow Web Upload": "允许从网络上传内容", - "Allowed Domains": "", + "Allowed Domains": "允许的域名", "Allowed Endpoints": "允许的接口", "Allowed File Extensions": "允许的文件扩展名", - "Allowed Roles": "", + "Allowed Roles": "允许的角色", "Already have an account?": "已拥有账号?", - "Also bound to {{action}}": "", + "Also bound to {{action}}": "同时绑定到 {{action}}", "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.": "top_p 的替代方法,旨在平衡生成质量与多样性。参数 p 表示一个 token 被考虑的最低概率,该概率相对于最可能 token 的概率。例如,当 p=0.05 且最可能 token 的概率为 0.9 时,概率值低于 0.045 的 token 将被过滤掉。", "Always": "始终", "Always Collapse Code Blocks": "始终折叠代码块", @@ -219,80 +219,80 @@ "an assistant": "一个助手", "Analytics": "分析", "Analyzed": "已分析", - "Analyzing...": "正在分析...", + "Analyzing...": "正在分析……", "and {{COUNT}} more": "还有 {{COUNT}} 个", "and create a new shared link.": "并创建新的分享链接", "Android": "Android", "Anyone": "任何人", - "Anyone with the link can view": "", - "API Auth String": "", + "Anyone with the link can view": "任何拥有链接的人都可以查看", + "API Auth String": "API 认证字符串", "API Base URL": "接口地址", "API Key": "API 密钥", - "API Key / Token": "", + "API Key / Token": "API 密钥 / 令牌", "API Key created.": "API 密钥已创建。", - "API Key deleted.": "", + "API Key deleted.": "API 密钥已删除。", "API Key Endpoint Restrictions": "API 密钥端点限制", - "API key for embedding requests.": "", - "API key sent to Docling.": "", - "API key sent to Mistral OCR.": "", - "API key sent to the external document loader.": "", - "API key sent to the external reranker.": "", - "API key used for MinerU cloud mode.": "", - "API key used to authenticate with Datalab Marker.": "", + "API key for embedding requests.": "用于嵌入请求的 API 密钥。", + "API key sent to Docling.": "已将 API 密钥发送到 Docling。", + "API key sent to Mistral OCR.": "已将 API 密钥发送到 Mistral OCR。", + "API key sent to the external document loader.": "已将 API 密钥发送到外部文档加载器。", + "API key sent to the external reranker.": "已将 API 密钥发送到外部重排序器。", + "API key used for MinerU cloud mode.": "用于 MinerU 云模式的 API 密钥。", + "API key used to authenticate with Datalab Marker.": "用于向 Datalab Marker 进行身份验证的 API 密钥。", "API keys": "API 密钥", "API Keys": "API 密钥", "API Mode": "API 模式", "API Timeout": "API 超时时间", - "API Token": "", - "API token sent to PaddleOCR-vl.": "", + "API Token": "API 令牌", + "API token sent to PaddleOCR-vl.": "已将 API 令牌发送到 PaddleOCR-vl。", "API Type": "接口类型", - "API URL": "", + "API URL": "API 地址", "API Version": "API 版本", "API Version is required": "API 版本是必填项。", - "Append a watermark to assistant responses when configured.": "", + "Append a watermark to assistant responses when configured.": "配置后会在助手回答中附加水印。", "Application DN": "Application DN", "Application DN Password": "Application DN 密码", "applies to all users with the \"user\" role": "用于所有具有“用户”角色的用户", - "Apply image compression to channel uploads too.": "", - "Apply voice-specific instructions while voice mode is active.": "", + "Apply image compression to channel uploads too.": "同时对频道上传的图片进行压缩。", + "Apply voice-specific instructions while voice mode is active.": "在语音模式激活时应用语音专用指令。", "April": "四月", "Archive": "归档", "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 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}}**?": "您确认要删除 **{{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 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}}**?": "确定要删除 **{{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.": "确定要删除此连接吗?此操作无法撤销。", "Are you sure you want to delete this directory?": "确定要删除此目录吗?", "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 webhook? 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 webhook? This action cannot be undone.": "确定要删除此 Webhook 吗?此操作无法撤销。", "Are you sure you want to delete this?": "确定要删除吗?", - "Are you sure you want to reset all permissions to their default values? You will still need to save to apply the changes.": "", - "Are you sure you want to unarchive all archived chats?": "您确认要取消所有已归档的对话吗?", - "Are you sure you want to unshare all shared chats? This will remove all share links.": "", + "Are you sure you want to reset all permissions to their default values? You will still need to save to apply the changes.": "确定要将所有权限重置为默认值吗?您仍需要保存才能应用更改。", + "Are you sure you want to unarchive all archived chats?": "确定要取消所有已归档的对话吗?", + "Are you sure you want to unshare all shared chats? This will remove all share links.": "确定要取消所有共享对话的分享吗?这将移除所有分享链接。", "Arena Models": "模型盲测", "Artifacts": "产物", "Asc": "升序", "Ask": "提问", "Ask a question": "提问", - "Ask a test question": "", - "Ask this knowledge source a test question": "", - "Ask User": "", + "Ask a test question": "提一个测试问题", + "Ask this knowledge source a test question": "向此知识库来源提一个测试问题", + "Ask User": "询问用户", "Assistant": "助手", - "Assistant messages": "", + "Assistant messages": "助手消息", "Async Embedding Processing": "异步嵌入处理", - "at": "", + "at": "于", "At time of event": "事件开始时", "Attach File From Knowledge": "引用知识库中的文件", "Attach Files": "添加文件", - "Attach files with full content or focused retrieval by default.": "", + "Attach files with full content or focused retrieval by default.": "默认以完整内容或聚焦检索方式附加文件。", "Attach Knowledge": "引用知识库", "Attach Notes": "引用笔记", "Attach Webpage": "引用网页", @@ -302,70 +302,70 @@ "Audio": "语音", "August": "八月", "Auth": "认证方式", - "Auth Mode": "", - "Auth required": "", + "Auth Mode": "认证方式", + "Auth required": "需要认证", "Authenticate": "认证", "Authentication": "身份验证", - "Authorize OAuth": "", + "Authorize OAuth": "授权 OAuth", "Auto": "自动", "Auto (Random)": "随机", - "Auto Redirect": "", + "Auto Redirect": "自动重定向", "Auto-Copy Response to Clipboard": "自动复制回答内容到剪贴板", - "Auto-Create Groups": "", + "Auto-Create Groups": "自动创建用户组", "Auto-Playback Response": "自动朗读回答内容", "Autocomplete Generation": "输入框内容自动补全", "Autocomplete Generation Input Max Length": "输入框内容自动补全的最大字符数限制", - "Autocomplete Generation Prompt": "", - "Automatic": "", - "Automatic Delivery": "", - "Automatic Events": "", + "Autocomplete Generation Prompt": "自动补全生成提示词", + "Automatic": "自动", + "Automatic Delivery": "自动发送", + "Automatic Events": "自动事件", "Automatic1111": "Automatic1111", "AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 接口地址是必填项。", "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "在原生函数调用模式下自动注入系统工具(例如时间戳、记忆、对话历史、笔记等)。", "Automation": "自动化任务", "Automation created": "自动化任务已创建", - "Automation Menu": "", + "Automation Menu": "自动化任务菜单", "Automation title": "自动化任务标题", "Automation triggered": "自动化任务已触发", "Automation updated": "自动化任务已更新", "Automations": "自动化任务", "Available list": "可用列表", "Available models": "可用模型", - "Available Skills": "", + "Available Skills": "可用技能", "Available Tools": "可用工具", - "Available variables": "", + "Available variables": "可用变量", "available!": "版本可用!", - "Average messages per active day": "", - "Average tokens per chat": "", + "Average messages per active day": "每个活跃日的平均消息数", + "Average tokens per chat": "每次对话的平均 Token 数", "Away": "离开", "Awful": "糟糕", "Azure AI Speech": "Azure AI 语音", "Azure OpenAI": "Azure OpenAI", - "Azure OpenAI API key.": "", - "Azure OpenAI API version.": "", - "Azure OpenAI endpoint used for embeddings.": "", + "Azure OpenAI API key.": "Azure OpenAI API 密钥。", + "Azure OpenAI API version.": "Azure OpenAI API 版本。", + "Azure OpenAI endpoint used for embeddings.": "用于嵌入的 Azure OpenAI 端点。", "Azure Region": "Azure 区域", "Back": "返回", - "Background sub-agent finished": "", - "background sub-agents": "", + "Background sub-agent finished": "后台子智能体已完成", + "background sub-agents": "后台子智能体", "Bad Response": "点踩此回答", - "Balance semantic and lexical weighting for hybrid search.": "", + "Balance semantic and lexical weighting for hybrid search.": "平衡混合搜索中的语义和词汇权重。", "Banners": "公告横幅", - "Base DN used when searching for users.": "", + "Base DN used when searching for users.": "搜索用户时使用的基础 DN。", "Base Model (From)": "基础模型(来自)", - "Base Model is required.": "", + "Base Model is required.": "基础模型为必填项。", "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.": "仅在启动或保存设置时获取基础模型列表以提升访问速度,但显示的模型列表可能不是最新的。", - "Base URL": "", + "Base URL": "基础地址", "Bearer": "密钥(Bearer)", "before": "之前", "Being lazy": "回答不完整或敷衍了事", - "Bind DN used for directory search.": "", + "Bind DN used for directory search.": "用于目录搜索的绑定 DN。", "Bing": "必应", "Bing Search V7 Endpoint": "Bing 搜索 V7 端点", "Bing Search V7 Subscription Key": "Bing 搜索 V7 订阅密钥", "Bio": "个人简介", "Birth Date": "出生日期", - "Blocked Groups": "", + "Blocked Groups": "已阻止的用户组", "BM25 Weight": "BM25 混合搜索权重", "Bocha Search API Key": "Bocha Search 接口密钥", "Bold": "粗体", @@ -374,7 +374,7 @@ "Brave Search API Key": "Brave Search 接口密钥", "Break down complex requests into trackable steps": "将复杂的请求拆解为可跟踪的步骤", "Browse and query knowledge bases": "浏览和查询知识库", - "Browser Notifications": "", + "Browser Notifications": "浏览器通知", "Builtin Tools": "内置工具", "Bullet List": "无序列表", "Button ID": "按钮 ID", @@ -382,7 +382,7 @@ "Button Prompt": "点击按钮后执行的提示词", "by {{name}}": "由 {{name}} 提供", "By {{name}}": "由 {{name}} 提供", - "By supporting the project through sponsorship or an enterprise license, you help us stay independent, ship new features faster, improve stability, and grow Open WebUI for the long haul.": "", + "By supporting the project through sponsorship or an enterprise license, you help us stay independent, ship new features faster, improve stability, and grow Open WebUI for the long haul.": "通过赞助或企业授权支持本项目,帮助我们保持独立、更快地发布新功能、提升稳定性,并长期发展 Open WebUI。", "Bypass Embedding and Retrieval": "绕过嵌入和检索", "Bypass Web Loader": "绕过网页加载器", "Cache Base Model List": "缓存基础模型列表", @@ -394,7 +394,7 @@ "Calendars Public Sharing": "日程公开分享", "Call": "语音通话", "Call feature is not supported when using Web STT engine": "使用 Web 语音转文字引擎时不支持语音通话功能", - "Callback URI registered with the provider.": "", + "Callback URI registered with the provider.": "在提供商处注册的回调 URI。", "Camera": "摄像头", "Cancel": "取消", "Cancel download of {{model}}": "取消模型 “{{model}}” 的下载", @@ -403,14 +403,14 @@ "Capabilities": "能力", "Capture": "截图", "Capture Audio": "录制音频", - "Certificate file used for TLS verification.": "", + "Certificate file used for TLS verification.": "用于 TLS 验证的证书文件。", "Certificate Path": "证书路径", "Change folder icon": "更换分组图标", "Change Password": "更改密码", "Change User Role": "更换用户角色", "Channel": "频道", "Channel deleted successfully": "删除频道成功", - "Channel is required": "", + "Channel is required": "频道名称为必填项", "Channel Name": "频道名称", "Channel name cannot be empty.": "频道名称不能为空。", "Channel name must be less than 128 characters": "频道名称不能超过 128 个字符。", @@ -419,7 +419,7 @@ "Channels": "频道", "Character": "字符", "Chat": "对话", - "Chat actions": "", + "Chat actions": "对话操作", "Chat archived.": "对话已归档。", "Chat Background Image": "对话背景图片", "Chat Bubble UI": "以聊天气泡的形式显示对话内容", @@ -428,75 +428,75 @@ "Chat deleted.": "对话已删除。", "Chat Direction": "对话显示方向", "Chat exported successfully": "对话已成功导出", - "Chat forked": "", - "Chat history": "", + "Chat forked": "对话已分叉", + "Chat history": "对话历史", "Chat History": "对话历史记录", - "Chat Hover Previews": "", + "Chat Hover Previews": "对话悬停预览", "Chat ID": "对话 ID", - "Chat is too short to compact": "", + "Chat is too short to compact": "对话内容太短,无法压缩", "Chat moved successfully": "移动对话成功", "Chat Permissions": "对话权限", "Chat Tags Auto-Generation": "自动生成对话标签", "Chat unshared successfully.": "已成功取消分享对话。", - "Chat Uploads": "", - "Chat Variables": "", - "Chat Variables have conflicting model definitions": "", + "Chat Uploads": "对话上传", + "Chat Variables": "对话变量", + "Chat Variables have conflicting model definitions": "对话变量存在冲突的模型定义", "chats": "对话", "Chats": "对话", - "Chats Open Sharing": "", + "Chats Open Sharing": "对话公开分享", "Chats Public Sharing": "对话公开分享", "Check Again": "刷新重试", "Check for updates": "检查更新", - "Check OAuth Discovery": "", - "Checking for updates...": "正在检查更新...", - "Choose a dedicated model for context compaction summaries. Current Model follows the active chat model.": "", - "Choose a model before saving...": "保存前选择一个模型...", - "Choose automatic, left-to-right, or right-to-left text flow.": "", - "Choose channel": "", - "Choose fallback models for background tasks. Current Model follows the active chat model.": "", - "Choose folder": "", - "Choose how extracted text is split before indexing.": "", - "Choose how uploaded documents are parsed before indexing.": "", - "Choose how web result pages are fetched and read.": "", - "Choose the browser voice used for speech output.": "", - "Choose the color theme used by the interface.": "", - "Choose the configured text-to-speech service voice.": "", - "Choose the engine used to read assistant responses aloud.": "", - "Choose the engine used to transcribe voice input.": "", - "Choose the gender value stored on your profile.": "", - "Choose the Kokoro.js voice used for speech output.": "", - "Choose the language used for interface text.": "", - "Choose the local or cloud MinerU API mode.": "", - "Choose the provider used for image edits.": "", - "Choose the provider used for image generation.": "", - "Choose the provider used for web search queries.": "", - "Choose the runtime used by the code interpreter tool.": "", - "Choose the runtime used for generated code blocks.": "", - "Choose the speech provider used for assistant audio output.": "", - "Choose the transcription provider used for audio input.": "", - "Choose where model responses to root-level channel mentions are posted.": "", - "Choose where terminal display_file results appear by default.": "", - "Choose whether Enter sends immediately or uses Ctrl+Enter.": "", - "Choose whether the app opens to the default home or chat view.": "", + "Check OAuth Discovery": "检查 OAuth 发现", + "Checking for updates...": "正在检查更新……", + "Choose a dedicated model for context compaction summaries. Current Model follows the active chat model.": "选择用于上下文压缩摘要的专用模型。当前模型跟随活跃对话模型。", + "Choose a model before saving...": "保存前选择一个模型……", + "Choose automatic, left-to-right, or right-to-left text flow.": "选择自动、从左到右或从右到左的文本流向。", + "Choose channel": "选择频道", + "Choose fallback models for background tasks. Current Model follows the active chat model.": "选择后台任务的备选模型。当前模型跟随活跃对话模型。", + "Choose folder": "选择分组", + "Choose how extracted text is split before indexing.": "选择索引前如何拆分提取的文本。", + "Choose how uploaded documents are parsed before indexing.": "选择索引前如何解析上传的文档。", + "Choose how web result pages are fetched and read.": "选择如何获取和读取网页搜索结果。", + "Choose the browser voice used for speech output.": "选择用于语音输出的浏览器语音。", + "Choose the color theme used by the interface.": "选择界面使用的颜色主题。", + "Choose the configured text-to-speech service voice.": "选择已配置的文本转语音服务语音。", + "Choose the engine used to read assistant responses aloud.": "选择用于朗读助手回答的引擎。", + "Choose the engine used to transcribe voice input.": "选择用于转写语音输入的引擎。", + "Choose the gender value stored on your profile.": "选择存储在您个人资料中的性别值。", + "Choose the Kokoro.js voice used for speech output.": "选择用于语音输出的 Kokoro.js 语音。", + "Choose the language used for interface text.": "选择界面文本使用的语言。", + "Choose the local or cloud MinerU API mode.": "选择 MinerU API 的本地或云模式。", + "Choose the provider used for image edits.": "选择用于图片编辑的提供商。", + "Choose the provider used for image generation.": "选择用于图片生成的提供商。", + "Choose the provider used for web search queries.": "选择用于网页搜索查询的提供商。", + "Choose the runtime used by the code interpreter tool.": "选择代码解释器工具使用的运行时。", + "Choose the runtime used for generated code blocks.": "选择生成的代码块使用的运行时。", + "Choose the speech provider used for assistant audio output.": "选择用于助手音频输出的语音提供商。", + "Choose the transcription provider used for audio input.": "选择用于音频输入的转写提供商。", + "Choose where model responses to root-level channel mentions are posted.": "选择模型对频道根级提及的回答发布位置。", + "Choose where terminal display_file results appear by default.": "选择终端 display_file 结果的默认显示位置。", + "Choose whether Enter sends immediately or uses Ctrl+Enter.": "选择按 Enter 键是立即发送还是使用 Ctrl+Enter。", + "Choose whether the app opens to the default home or chat view.": "选择应用打开时显示默认主页还是对话视图。", "Chunk Min Size Target": "最小块的目标大小", "Chunk Overlap": "块重叠 (Chunk Overlap)", "Chunk Size": "块大小 (Chunk Size)", "Ciphers": "加密算法 (Ciphers)", "Citation": "引文", "Citations": "引用", - "Claim containing provider groups.": "", - "Claim containing provider roles.": "", - "Claim used as the display name.": "", - "Claim used as the profile picture URL.": "", - "Claim used as the stable user identifier.": "", - "Claim used as the user email address.": "", - "Clear": "", - "Clear filters to reorder": "", + "Claim containing provider groups.": "包含提供商用户组的声明。", + "Claim containing provider roles.": "包含提供商角色的声明。", + "Claim used as the display name.": "用作显示名称的声明。", + "Claim used as the profile picture URL.": "用作头像 URL 的声明。", + "Claim used as the stable user identifier.": "用作稳定用户标识符的声明。", + "Claim used as the user email address.": "用作用户邮箱的声明。", + "Clear": "清除", + "Clear filters to reorder": "清除过滤器以重新排序", "Clear memory": "清除记忆", "Clear Memory": "清除记忆", "Clear search": "清空搜索内容", "Clear status": "清除状态", - "Clear vector storage and knowledge indexing data.": "", + "Clear vector storage and knowledge indexing data.": "清除向量存储和知识索引数据。", "click here": "点击此处", "Click here for filter guides.": "点击此处查看筛选指南", "Click here for help.": "点击此处获取帮助", @@ -511,7 +511,7 @@ "Click on the user role button to change a user's role.": "点击用户角色按钮以更改用户的角色", "Click to connect": "点击以连接", "Click to copy ID": "点击以复制 ID", - "Click to rebind": "", + "Click to rebind": "点击以重新绑定", "Client ID": "客户端 ID", "Client Secret": "客户端密钥", "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "写入剪贴板时被拒绝。请检查浏览器设置,授予必要权限。", @@ -541,38 +541,38 @@ "Code Interpreter Prompt Template": "代码解释器提示词模板", "Collaboration channel where people join as members": "成员可加入的协作频道", "Collapse": "折叠", - "Collapse code blocks by default.": "", + "Collapse code blocks by default.": "默认折叠代码块。", "Collection": "文件集", - "Collection Field": "", + "Collection Field": "集合字段", "Collections": "文件集", "Color": "颜色", - "Combine semantic and keyword retrieval.": "", + "Combine semantic and keyword retrieval.": "结合语义和关键词检索。", "ComfyUI": "ComfyUI", "ComfyUI Base URL is required.": "ComfyUI 接口地址是必填项。", "ComfyUI Workflow": "ComfyUI 工作流", "ComfyUI Workflow Nodes": "ComfyUI 工作流节点", "Comma separated Node Ids (e.g. 1 or 1,2)": "使用英文逗号分隔的节点 ID(例如 1 或 1,2)", - "Comma-separated API paths that API keys can access.": "", - "Comma-separated audio or video MIME types accepted for upload.": "", - "Comma-separated extensions MinerU should handle.": "", - "Comma-separated group names": "", - "Comma-separated top-level request parameters this upstream may receive without translation. Use * to allow all captured passthrough params.": "", - "Comma-separated upload extensions. Leave empty for all file types.": "", + "Comma-separated API paths that API keys can access.": "API 密钥可访问的 API 路径(逗号分隔)。", + "Comma-separated audio or video MIME types accepted for upload.": "允许上传的音频或视频 MIME 类型(逗号分隔)。", + "Comma-separated extensions MinerU should handle.": "MinerU 应处理的扩展名(逗号分隔)。", + "Comma-separated group names": "逗号分隔的用户组名称", + "Comma-separated top-level request parameters this upstream may receive without translation. Use * to allow all captured passthrough params.": "此上游可能接收的无需转换的顶级请求参数(逗号分隔)。使用 * 允许所有捕获的透传参数。", + "Comma-separated upload extensions. Leave empty for all file types.": "上传的文件扩展名(逗号分隔)。留空表示允许所有文件类型。", "command": "命令", "Command": "命令", - "Commands": "", + "Commands": "命令", "Comment": "注释", "Commit Message": "提交说明", - "Community": "", + "Community": "社区", "Community Reviews": "社区评价", - "Community Sharing": "", - "Compacting context": "", - "Compacting context...": "", - "Compare": "", - "Comparing with knowledge base...": "正在比对知识库...", + "Community Sharing": "社区分享", + "Compacting context": "正在压缩上下文", + "Compacting context...": "正在压缩上下文……", + "Compare": "比较", + "Comparing with knowledge base...": "正在比对知识库……", "Completions": "续写", "Compress Images in Channels": "压缩频道中的图片", - "Compress uploaded images before sending or storage.": "", + "Compress uploaded images before sending or storage.": "在发送或存储前压缩上传的图片。", "Computing checksums ({{count}} files)_other": "正在计算校验码(共 {{count}} 个文件)", "Concurrent Requests": "并发请求", "Config": "配置", @@ -581,24 +581,24 @@ "Confirm": "确认", "Confirm Password": "确认密码", "Confirm Prompt from Embed": "确认嵌入提示词", - "Confirm recording": "", + "Confirm recording": "确认录制", "Confirm your action": "确认要继续吗?", "Confirm your new password": "确认新密码", "Confirm Your Password": "确认您的密码", - "Connect code execution to a Jupyter server endpoint.": "", - "Connect code interpreter to a Jupyter server endpoint.": "", - "Connect to a stable-diffusion-webui server running with the `--api` flag.": "", + "Connect code execution to a Jupyter server endpoint.": "将代码执行连接到 Jupyter 服务器端点。", + "Connect code interpreter to a Jupyter server endpoint.": "将代码解释器连接到 Jupyter 服务器端点。", + "Connect to a stable-diffusion-webui server running with the `--api` flag.": "连接到使用 `--api` 标志运行的 stable-diffusion-webui 服务器。", "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. Admins and users granted access can use file browsing and terminal tools through these servers.": "", - "Connect to the ComfyUI server used for generation.": "", - "Connect to the ComfyUI server used for image edits.": "", + "Connect to Open Terminal instances. Admins and users granted access can use file browsing and terminal tools through these servers.": "连接到 Open Terminal 实例。管理员和获得授权的用户可以通过这些服务器使用文件浏览和终端工具。", + "Connect to the ComfyUI server used for generation.": "连接到用于生成的 ComfyUI 服务器。", + "Connect to the ComfyUI server used for image edits.": "连接到用于图片编辑的 ComfyUI 服务器。", "Connect to your own OpenAI compatible API endpoints.": "连接到符合 OpenAI 接口格式的接口", "Connect to your own OpenAPI compatible external tool servers.": "连接到符合 OpenAPI 规范的外部工具服务器", - "Connected": "", + "Connected": "已连接", "Connected ({{type}})": "已连接({{type}})", "Connection failed": "连接失败", - "Connection lost. Reconnecting...": "连接已断开,正在重新连接...", + "Connection lost. Reconnecting...": "连接已断开,正在重新连接……", "Connection successful": "连接成功", "Connection Type": "连接类型", "Connections": "外部连接", @@ -607,34 +607,34 @@ "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "限制推理模型的推理努力(reasoning effort)。仅适用于支持推理努力控制的特定提供商的推理模型。", "Contact Admin for WebUI Access": "请联系管理员以获取访问权限", "Content": "内容", - "Content Extraction": "", + "Content Extraction": "内容提取", "Content Extraction Engine": "内容提取引擎", - "Content Field": "", + "Content Field": "内容字段", "Content lengths (character counts only)": "内容长度(仅统计字符)", - "Content matches": "", - "Context": "", - "Context compacted": "", - "Context Compaction": "", - "Context compaction failed": "", - "Context compaction is disabled": "", - "Context Compaction Model": "", - "Context Compaction Prompt": "", - "Context Compaction Threshold": "", + "Content matches": "内容匹配", + "Context": "上下文", + "Context compacted": "上下文已压缩", + "Context Compaction": "上下文压缩", + "Context compaction failed": "上下文压缩失败", + "Context compaction is disabled": "上下文压缩已禁用", + "Context Compaction Model": "上下文压缩模型", + "Context Compaction Prompt": "上下文压缩提示词", + "Context Compaction Threshold": "上下文压缩阈值", "Context Tokens": "上下文 Token", - "Continue": "", + "Continue": "继续", "Continue Response": "继续生成", "Continue with {{provider}}": "使用 {{provider}} 继续", "Continue with Email": "使用邮箱登录", "Continue with LDAP": "使用 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.": "设置消息文本拆分方法,用于 TTS 请求。“Punctuation”拆分为句子,“paragraphs”拆分为段落,“none”将消息保留为单个字符串。", - "Control result volume and parallel search requests.": "", + "Control result volume and parallel search requests.": "控制结果数量和并行搜索请求。", "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.": "设置生成文本中标记序列的重复度。较高的值(例如 1.5)表示严厉惩罚重复,而较低的值(例如 1.1)则表示相对宽松。当值为 1 时,此功能将被禁用。", "Controls": "对话高级设置", - "Controls how chat tags are inferred.": "", - "Controls how older messages are rewritten into a running summary.": "", + "Controls how chat tags are inferred.": "控制对话标签的推断方式。", + "Controls how older messages are rewritten into a running summary.": "控制旧消息如何被改写为滚动摘要。", "Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "控制输出文本中连贯性和多样性之间的平衡度。数值越低,生成的文本越聚焦和连贯。", "Conversation saved successfully": "对话保存成功", - "Convert long pasted text into a file attachment.": "", + "Convert long pasted text into a file attachment.": "将粘贴的长文本转换为文件附件。", "Copied": "已复制", "Copied link to clipboard": "已复制链接到剪贴板", "Copied shared chat URL to clipboard!": "已复制对话的分享链接到剪贴板!", @@ -649,16 +649,16 @@ "Copy Link": "复制链接", "Copy Path": "复制路径", "Copy Prompt": "复制提示词", - "Copy rich formatted content instead of plain text.": "", + "Copy rich formatted content instead of plain text.": "复制富格式内容而非纯文本。", "Copy Share Link": "复制分享链接", - "Copy the current session token for authenticated requests.": "", - "Copy the latest assistant response when it completes.": "", + "Copy the current session token for authenticated requests.": "复制当前会话令牌以用于认证请求。", + "Copy the latest assistant response when it completes.": "在助手完成回答时自动复制最新回答。", "Copy to clipboard": "复制到剪贴板", "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 load release notes.": "", + "Could not load release notes.": "无法加载更新日志。", "Could not read file.": "读取文件失败。", "CPU": "CPU", "Create": "创建", @@ -668,56 +668,56 @@ "Create Account": "创建账号", "Create Admin Account": "创建管理员账号", "Create and manage scheduled automations": "创建和管理计划自动化任务", - "Create announcements shown to users in the app.": "", + "Create announcements shown to users in the app.": "创建在应用中向用户展示的公告。", "Create Channel": "创建频道", - "Create chat tags from conversation content.": "", + "Create chat tags from conversation content.": "根据对话内容自动创建标签。", "Create Folder": "创建分组", "Create Image": "图片生成", "Create Knowledge": "创建知识", - "Create missing groups from LDAP groups.": "", - "Create missing groups from OAuth claims.": "", + "Create missing groups from LDAP groups.": "从 LDAP 用户组创建缺失的用户组。", + "Create missing groups from OAuth claims.": "从 OAuth 声明创建缺失的用户组。", "Create Model": "创建模型", "Create new key": "创建新密钥", "Create new secret key": "创建新安全密钥", - "Create Prompt": "", + "Create Prompt": "创建提示词", "Create scheduled prompts that run automatically on a recurring basis.": "创建按周期自动执行的提示词任务。", - "Create your first note from the Create menu.": "", - "Create, copy, or rotate your API key.": "", - "Created": "", + "Create your first note from the Create menu.": "从创建菜单创建您的第一条笔记。", + "Create, copy, or rotate your API key.": "创建、复制或轮换您的 API 密钥。", + "Created": "已创建", "Created at": "创建于", "Created At": "创建于", "Created by": "作者", "Created by you": "由您创建", "Created on {{date}}": "创建于 {{date}}", - "Credential used for Document Intelligence.": "", - "Credentials used to authenticate with the Jupyter server.": "", + "Credential used for Document Intelligence.": "用于 Document Intelligence 的凭据。", + "Credentials used to authenticate with the Jupyter server.": "用于向 Jupyter 服务器进行身份验证的凭据。", "CSV Import": "通过 CSV 文件导入", - "CSV: Name,Email": "", + "CSV: Name,Email": "CSV格式:姓名,邮箱", "Ctrl+Enter to Send": "Ctrl+Enter 发送", - "Current": "", + "Current": "当前", "Current Model": "当前模型", "Current Password": "当前密码", - "Current streak": "", + "Current streak": "当前连续天数", "Custom": "自定义", "Custom color": "自定义颜色", "Custom description enabled": "自定义描述已启用", "Custom Gender": "自定义性别", - "Custom message shown while an account waits for approval.": "", + "Custom message shown while an account waits for approval.": "账号等待审批时显示的自定义消息。", "Custom Parameter Name": "自定义参数名称", "Custom Parameter Value": "自定义参数值", - "Custom permissions": "", - "Custom range": "", - "Custom title shown while an account waits for approval.": "", + "Custom permissions": "自定义权限", + "Custom range": "自定义范围", + "Custom title shown while an account waits for approval.": "账号等待审批时显示的自定义标题。", "Daily": "每日", - "Daily at": "", + "Daily at": "每天于", "Daily Messages": "每日消息数", "Danger Zone": "危险区域", "Dark": "暗色", "Data Controls": "数据", "Database": "数据库", "Datalab Marker API": "Datalab Marker API", - "Datalab Marker service endpoint used for document parsing.": "", - "Date is required": "", + "Datalab Marker service endpoint used for document parsing.": "用于文档解析的 Datalab Marker 服务端点。", + "Date is required": "日期为必填项", "Date Modified": "修改日期", "Day": "天", "DD/MM/YYYY": "DD/MM/YYYY", @@ -733,7 +733,7 @@ "Default Features": "默认功能", "Default Filters": "默认过滤器", "Default Group": "默认用户组", - "Default Interface Settings": "", + "Default Interface Settings": "默认界面设置", "Default Model": "默认模型", "Default model updated": "默认模型已更新", "Default permissions": "默认权限", @@ -741,13 +741,13 @@ "Default Prompt Suggestions": "默认推荐提示词", "Default to 389 or 636 if TLS is enabled": "启用 TLS 将默认使用 389 或 636 端口", "Default to ALL": "默认为:ALL", - "Default to memberOf": "", + "Default to memberOf": "默认为 memberOf", "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "默认进行分段检索以提取重点和相关内容(推荐)", - "Default Upload Mode": "", + "Default Upload Mode": "默认上传模式", "Default User Role": "默认用户角色", - "Default webhook": "", - "Defines the behavior used for spoken conversations.": "", - "Delegate focused work to parallel sub-agents": "", + "Default webhook": "默认 Webhook", + "Defines the behavior used for spoken conversations.": "设置语音对话的行为方式。", + "Delegate focused work to parallel sub-agents": "将专注工作委派给并行子智能体", "Delete": "删除", "Delete {{name}}": "删除 {{name}}", "Delete a model": "删除模型", @@ -755,7 +755,7 @@ "Delete All Chats": "删除所有对话记录", "Delete all contents inside this directory": "删除此目录内的所有内容", "Delete all contents inside this folder": "删除此分组内的所有内容", - "Delete API Key?": "", + "Delete API Key?": "要删除此 API 密钥吗?", "Delete automation?": "要删除此自动化吗?", "Delete calendar": "删除日程", "Delete Calendar": "删除日程", @@ -775,7 +775,7 @@ "Delete skill?": "要删除此技能吗?", "delete this link": "此处删除这个链接", "Delete tool?": "要删除此工具吗?", - "Delete uploaded files from the upload directory.": "", + "Delete uploaded files from the upload directory.": "从上传目录中删除已上传的文件。", "Delete User": "删除用户", "Delete Version": "删除版本", "Deleted": "删除成功", @@ -783,9 +783,9 @@ "Deleted {{name}}": "已删除 {{name}}", "Deleted {{ok}} of {{total}} items": "已删除 {{total}} 项中的 {{ok}} 项", "Deleted User": "已删除用户", - "Denied {{NAME}}": "", - "Deny": "", - "Deny Tool Call": "", + "Denied {{NAME}}": "已拒绝 {{NAME}}", + "Deny": "拒绝", + "Deny Tool Call": "拒绝工具调用", "Deployment names are required for Azure OpenAI": "Azure OpenAI 需要部署名称", "Desc": "降序", "Describe the edit...": "描述本次修改…", @@ -794,10 +794,10 @@ "Describe your knowledge base and objectives": "描述您的知识库和目标", "Description": "描述", "Deselect": "取消选中", - "Destination": "", + "Destination": "目标", "Detect Artifacts Automatically": "自动检测对话产物", - "Detect generated artifacts and show them in the artifact workspace.": "", - "Detected Variables": "", + "Detect generated artifacts and show them in the artifact workspace.": "检测生成的产物并将其显示在产物工作空间中。", + "Detected Variables": "检测到的变量", "Dictate": "语音输入", "Didn't fully follow instructions": "没有完全遵循指令", "Direct": "直接", @@ -811,7 +811,7 @@ "Directory name": "目录名称", "Directory renamed.": "目录已重命名。", "Directory selection was cancelled": "已取消选择目录", - "Disable all": "", + "Disable all": "全部禁用", "Disable All": "全部禁用", "Disable Code Interpreter": "禁用代码解释器", "Disable Image Extraction": "禁用图像提取", @@ -831,57 +831,57 @@ "Display Chat Title in Tab": "在浏览器标签页中显示对话标题", "Display Emoji in Call": "在通话中显示 Emoji", "Display Multi-model Responses in Tabs": "以标签页的形式展示多个模型的回答", - "Display name for this LDAP connection.": "", - "Display name shown for the OAuth provider.": "", + "Display name for this LDAP connection.": "此 LDAP 连接的显示名称。", + "Display name shown for the OAuth provider.": "OAuth 提供商的显示名称。", "Display the Username Instead of You in the Chat": "在对话中显示用户名而不是“你”", "Displays citations in the response": "在回答中显示引用来源", "Displays status updates (e.g., web search progress) in the response": "在回答中显示实时状态信息(例如:网络搜索进度)", - "Do not extract images from PDFs during Marker processing.": "", + "Do not extract images from PDFs during Marker processing.": "在 Marker 处理期间不要从 PDF 中提取图片。", "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?": "您希望将使用统计数据同步至 Open WebUI 社区吗?", "Docling": "Docling", "Docling Parameters": "Docling 参数", - "Docling Server URL": "", + "Docling Server URL": "Docling 服务器 URL", "Docling Server URL required.": "需要提供 Docling 服务器接口地址", - "Docling service endpoint used for parsing.": "", + "Docling service endpoint used for parsing.": "用于解析的 Docling 服务端点。", "Document": "文档", - "Document ID Field": "", + "Document ID Field": "文档 ID 字段", "Document Intelligence": "Document Intelligence", "Document Intelligence endpoint required.": "Document Intelligence 接口地址是必填项。", - "Document Intelligence endpoint used for parsing.": "", + "Document Intelligence endpoint used for parsing.": "用于解析的 Document Intelligence 端点。", "Document Intelligence Model": "Document Intelligence 模型", - "Document Loader URL": "", + "Document Loader URL": "文档加载器 URL", "Documentation": "帮助文档", "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.": "", + "Don't fetch random pipelines from sources you don't trust.": "不要从不可信来源获取随机 Pipeline。", "Don't have an account?": "没有账号?", "Don't like the style": "不喜欢这种文风", "Done": "完成", "Download": "下载", - "Download \"{{searchValue}}\"": "", - "Download \"{{searchValue}}\" from {{provider}}": "", + "Download \"{{searchValue}}\"": "下载“{{searchValue}}”", + "Download \"{{searchValue}}\" from {{provider}}": "从 {{provider}} 下载“{{searchValue}}”", "Download & Delete": "下载并删除", - "Download all users as CSV.": "", + "Download all users as CSV.": "将所有用户下载为 CSV。", "Download as JSON": "下载为 JSON", "Download as SVG": "下载为 SVG", "Download canceled": "下载已取消", - "Download CSV Template": "", - "Download every user's chat history as JSON.": "", - "Download failed": "", - "Download Model": "", - "Download the application database when supported.": "", - "Download the current admin configuration as JSON.": "", - "Download your chat history as a JSON export.": "", - "Downloading \"{{searchValue}}\"": "", - "Downloading stats...": "正在下载统计数据...", - "Drag to reorder": "", + "Download CSV Template": "下载 CSV 模板", + "Download every user's chat history as JSON.": "将每个用户的对话历史下载为 JSON。", + "Download failed": "下载失败", + "Download Model": "下载模型", + "Download the application database when supported.": "在支持时下载应用数据库。", + "Download the current admin configuration as JSON.": "将当前管理员配置下载为 JSON。", + "Download your chat history as a JSON export.": "将您的对话历史下载为 JSON 导出。", + "Downloading \"{{searchValue}}\"": "正在下载“{{searchValue}}”", + "Downloading stats...": "正在下载统计数据……", + "Drag to reorder": "拖拽以重新排序", "Draw": "持平", "Drop any files here to upload": "拖拽文件至此上传", "Drop files here": "请将文件拖到此处", - "Drop to upload": "", + "Drop to upload": "拖放以上传", "DuckDuckGo": "DuckDuckGo", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "例如:“30s”,“10m”。有效的时间单位包括:“s”(秒), “m”(分), “h”(时)", "e.g. 'low', 'medium', 'high'": "如:'low'、'medium'、'high'", @@ -913,24 +913,24 @@ "Edit Default Permissions": "编辑默认权限", "Edit Folder": "编辑分组", "Edit Image": "图片编辑", - "Edit Knowledge Connection": "", + "Edit Knowledge Connection": "编辑知识库连接", "Edit Last Message": "编辑最后一条消息", "Edit Memory": "编辑记忆", "Edit Prompt": "编辑提示词", "Edit Terminal Connection": "编辑终端连接", "Edit User": "编辑用户", "Edit User Group": "编辑用户组", - "Edit User Variable": "", - "Edit webhook": "", + "Edit User Variable": "编辑用户变量", + "Edit webhook": "编辑 Webhook", "Edit workflow.json content": "编辑 workflow.json", "edited": "已编辑", "Eject": "弹出", "Eject model": "卸载模型", "ElevenLabs": "ElevenLabs", "Email": "电子邮箱", - "Email Claim": "", - "Email domains allowed to sign in with OAuth.": "", - "Email shown in the pending account overlay.": "", + "Email Claim": "邮件声明", + "Email domains allowed to sign in with OAuth.": "允许通过 OAuth 登录的邮件域名。", + "Email shown in the pending account overlay.": "在待审核账户覆盖层中显示的邮件。", "Embedding": "嵌入", "Embedding Batch Size": "嵌入层批处理大小 (Embedding Batch Size)", "Embedding Concurrent Requests": "嵌入并发请求数", @@ -938,28 +938,28 @@ "Embedding Model Engine": "嵌入模型引擎", "Emoji": "表情符号", "Emojis": "表情符号", - "Empty": "", + "Empty": "空", "Empty message": "(空消息)", - "Enable accessibility-focused visual enhancements.": "", + "Enable accessibility-focused visual enhancements.": "启用无障碀导向的视觉增强效果。", "Enable All": "全部启用", - "Enable background sub-agents": "", + "Enable background sub-agents": "启用后台子代理", "Enable Code Execution": "启用代码执行", "Enable Code Interpreter": "启用代码解释器", - "Enable Keyboard Shortcuts": "", + "Enable Keyboard Shortcuts": "启用键盘快捷键", "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.": "启用内存锁定 (mlock),防止模型数据被移出内存。此选项将模型的工作集页面锁定在内存中,确保它们不会被交换到磁盘,避免页面错误,确保快速数据访问,从而维持性能。", "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) 加载模型数据。此选项将磁盘文件视作内存中的数据,允许系统使用磁盘存储作为内存的扩展,通过更快的数据访问来提高模型性能。然而,它可能无法在所有系统上正常工作,并且可能会消耗大量磁盘空间。", "Enable Message Queue": "启用消息队列", "Enable Mirostat sampling for controlling perplexity.": "启用 Mirostat 采样以控制困惑度", - "Enable sub-agents": "", + "Enable sub-agents": "启用子代理", "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 call": "", + "End call": "结束通话", "End Tag": "结束标签", - "Endpoint": "", + "Endpoint": "端点", "Endpoint URL": "接口地址", "Enforce Temporary Chat": "强制临时对话", "Enhance": "润色", - "Enhance this note and update it.": "", + "Enhance this note and update it.": "增强此笔记并更新。", "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}} 的对话内容", @@ -967,7 +967,7 @@ "Enter a watermark for the response. Leave empty for none.": "输入复制水印。留空则不添加", "Enter additional headers in JSON format": "输入 JSON 格式的额外 HTTP 标头", "Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "输入 JSON 格式的额外 HTTP 标头(例如:{\"X-Custom-Header\": \"value\"})", - "Enter additional OpenAI-compatible TTS request parameters as JSON.": "", + "Enter additional OpenAI-compatible TTS request parameters as JSON.": "以 JSON 格式输入附加的兼容 OpenAI 的 TTS 请求参数。", "Enter additional parameters in JSON format": "输入 JSON 格式的额外参数", "Enter api auth string (e.g. username:password)": "输入接口鉴权路径(例如:用户名:密码)", "Enter Application DN": "输入 Application DN", @@ -980,8 +980,8 @@ "Enter Chunk Min Size Target": "输入最小块的目标大小", "Enter Chunk Overlap": "输入块重叠 (Chunk Overlap)", "Enter Chunk Size": "输入块大小 (Chunk Size)", - "Enter Client ID": "", - "Enter Client Secret": "", + "Enter Client ID": "输入客户端 ID", + "Enter Client Secret": "输入客户端密钥", "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "输入以逗号分隔的“token:bias_value”对(例如:5432:100, 413:-100)", "Enter content for the pending user info overlay. Leave empty for default.": "输入用户待激活界面的内容。留空使用默认", "Enter coordinates (e.g. 51.505, -0.09)": "输入坐标经纬度(例如:51.505, -0.09)", @@ -1006,7 +1006,7 @@ "Enter Firecrawl Timeout": "输入 Firecrawl 超时时间", "Enter folder name": "输入分组名称", "Enter function name filter list (e.g. func1, !func2)": "输入函数名称过滤列表(例如:func1, !func2)", - "Enter GitHub Raw URL": "", + "Enter GitHub Raw URL": "输入 GitHub Raw URL", "Enter Google PSE API Key": "输入 Google PSE 接口密钥", "Enter Google PSE Engine Id": "输入 Google PSE 引擎 ID", "Enter hex color (e.g. #FF0000)": "输入十六进制颜色(例如:#FF0000)", @@ -1019,11 +1019,11 @@ "Enter Jupyter URL": "输入 Jupyter 接口地址", "Enter Kagi Search API Key": "输入 Kagi Search 接口密钥", "Enter Key Behavior": "Enter 键行为", - "Enter language": "", + "Enter language": "输入语言", "Enter language codes": "输入语言代码", "Enter Linkup API Key": "输入 Linkup 接口密钥", - "Enter Microsoft Web IQ API Base URL": "", - "Enter Microsoft Web IQ API Key": "", + "Enter Microsoft Web IQ API Base URL": "输入 Microsoft Web IQ API 基础 URL", + "Enter Microsoft Web IQ API Key": "输入 Microsoft Web IQ API 密钥", "Enter MinerU API Key": "输入 MinerU 接口密钥", "Enter Mistral API Base URL": "输入 Mistral 接口地址", "Enter Mistral API Key": "输入 Mistral 接口密钥", @@ -1033,7 +1033,7 @@ "Enter New Password": "输入新密码", "Enter Number of Steps (e.g. 50)": "输入步骤数 (Steps)(例如:50)", "Enter Ollama Cloud API Key": "输入 Ollama Cloud 接口密钥", - "Enter OpenSERP Base URL": "", + "Enter OpenSERP Base URL": "输入 OpenSERP 基础 URL", "Enter PaddleOCR-vl API Base URL": "输入 PaddleOCR-vl API 基础地址", "Enter PaddleOCR-vl API Token": "输入 PaddleOCR-vl 接口密钥", "Enter Perplexity API Key": "输入 Perplexity 接口密钥", @@ -1043,7 +1043,7 @@ "Enter prompt here.": "在此输入提示词。", "Enter proxy URL (e.g. https://user:password@host:port)": "输入代理地址(例如:https://用户名:密码@主机名:端口)", "Enter reasoning effort": "输入推理努力", - "Enter Redirect URI": "", + "Enter Redirect URI": "输入重定向 URI", "Enter Score": "输入评分", "Enter SearchApi API Key": "输入 SearchApi 接口密钥", "Enter SearchApi Engine": "输入 SearchApi 引擎", @@ -1053,13 +1053,13 @@ "Enter SerpApi API Key": "输入 SerpApi 接口密钥", "Enter SerpApi Engine": "输入 SerpApi 引擎", "Enter Serper API Key": "输入 Serper 接口密钥", - "Enter SERPHouse API Key": "", + "Enter SERPHouse API Key": "输入 SERPHouse API 密钥", "Enter Serply API Key": "输入 Serply 接口密钥", "Enter Serpstack API Key": "输入 Serpstack 接口密钥", "Enter server host": "输入服务器主机名", "Enter server label": "输入服务器标签", "Enter server port": "输入服务器端口", - "Enter skill instructions in markdown...": "输入 MarkDown 格式的技能指令...", + "Enter skill instructions in markdown...": "输入 MarkDown 格式的技能指令……", "Enter Sougou Search API sID": "输入搜狗搜索 API Secret ID", "Enter Sougou Search API SK": "输入搜狗搜索 API Secret 密钥", "Enter stop sequence": "输入停止序列 (Stop Sequence)", @@ -1072,8 +1072,8 @@ "Enter the URL to import": "输入要导入的链接", "Enter Tika Server URL": "输入 Tika 服务器接口地址", "Enter to Send": "Enter 键发送", - "Enter token threshold": "", - "Enter Tokenizer Model": "", + "Enter token threshold": "输入 token 阈值", + "Enter Tokenizer Model": "输入分词模型 (Tokenizer Model)", "Enter Top K": "输入 Top K", "Enter Top K Reranker": "输入 Top K Reranker", "Enter URL (e.g. http://127.0.0.1:7860/)": "输入 URL(例如:http://127.0.0.1:7860/)", @@ -1098,8 +1098,8 @@ "Enter Your Password": "输入您的密码", "Enter Your Role": "输入您的用户组", "Enter Your Username": "输入您的用户名", - "Enterprise licenses also include dedicated support, customization options, and more, at a fraction of the cost of building and maintaining this stack internally.": "", - "Enterprise licensing": "", + "Enterprise licenses also include dedicated support, customization options, and more, at a fraction of the cost of building and maintaining this stack internally.": "企业许可还包括专属支持、定制选项等,费用只有内部搭建和维护技术栈的一小部分。", + "Enterprise licensing": "企业许可", "Entra ID": "Entra ID", "Environment Variables": "环境变量", "Ephemeral": "临时", @@ -1115,18 +1115,18 @@ "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": "", + "Event": "事件", "Event created": "事件已创建", "Event deleted": "事件已删除", - "Event names may change as Open WebUI evolves. Use broad patterns like user.* for integrations that should continue across new related events.": "", + "Event names may change as Open WebUI evolves. Use broad patterns like user.* for integrations that should continue across new related events.": "随着 Open WebUI 的发展,事件名称可能会变化。对于希望在新的相关事件中继续触发的集成,请使用宽泛的模式,如 user.*。", "Event title": "事件标题", "Event updated": "事件已更新", - "Events": "", - "Every {{count}} hours_other": "", - "Every {{count}} minutes_other": "", - "Every minute": "", + "Events": "事件", + "Every {{count}} hours_other": "每 {{count}} 小时", + "Every {{count}} minutes_other": "每 {{count}} 分钟", + "Every minute": "每分钟", "Exa API Key": "Exa 接口密钥", - "Example": "", + "Example": "示例", "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "例如:(&(objectClass=inetOrgPerson)(uid=%s))", "Example: ALL": "例如:ALL", "Example: mail": "例如:mail", @@ -1136,7 +1136,7 @@ "Exclude": "排除", "Execute code": "执行代码", "Execute code for analysis": "执行代码进行分析", - "Executing {{NAME}}...": "", + "Executing {{NAME}}...": "正在执行 {{NAME}}……", "Expand": "展开", "Experimental": "实验性", "Explain": "解释", @@ -1148,30 +1148,30 @@ "Export chat (.json)": "JSON 文件 (.json)", "Export Chats": "导出对话", "Export Config": "导出配置文件", - "Export JSON": "", + "Export JSON": "导出 JSON", "Export Models": "导出模型配置", "Export Prompts": "导出提示词", - "Export Skills": "", + "Export Skills": "导出技能", "Export to CSV": "导出到 CSV", "Export Tools": "导出工具配置", "External": "外部", - "External connection not found.": "", + "External connection not found.": "未找到外部连接。", "External Document Loader URL required.": "需要外部文档加载器接口地址", - "External Knowledge Source": "", - "External Knowledge Sources": "", - "External reranker endpoint.": "", - "External service endpoint used to load document content.": "", + "External Knowledge Source": "外部知识源", + "External Knowledge Sources": "外部知识源", + "External reranker endpoint.": "外部重排器端点。", + "External service endpoint used to load document content.": "用于加载文档内容的外部服务端点。", "External Task Model": "外部任务模型", - "External Tool Servers": "", - "External vectors must be generated with the same embedding model configured in Open WebUI.": "", + "External Tool Servers": "外部工具服务器", + "External vectors must be generated with the same embedding model configured in Open WebUI.": "外部向量必须使用与 Open WebUI 中配置的相同嵌入模型生成。", "External Web Loader API Key": "外部网页加载器接口密钥", "External Web Loader URL": "外部网页加载器接口地址", "External Web Search API Key": "外部联网搜索接口密钥", "External Web Search URL": "外部联网搜索接口地址", - "Extract action items from this note.": "", - "Extract images from PDFs so OCR can process image-only pages.": "", + "Extract action items from this note.": "从此笔记中提取待办事项。", + "Extract images from PDFs so OCR can process image-only pages.": "从 PDF 中提取图片,以便 OCR 处理纯图片页。", "Fade Effect for Streaming Text": "流式输出内容时启用动态渐显效果", - "Fade streaming text as it arrives.": "", + "Fade streaming text as it arrives.": "流式文本到达时混入显示。", "Failed to add file.": "添加文件失败", "Failed to add members": "添加成员失败", "Failed to archive chat.": "对话归档失败。", @@ -1181,47 +1181,47 @@ "Failed to connect to {{URL}} terminal server": "无法连接到终端服务器:{{URL}}", "Failed to copy link": "复制链接失败", "Failed to create API Key.": "创建接口密钥失败", - "Failed to create chat": "", + "Failed to create chat": "创建对话失败", "Failed to delete calendar": "删除日程失败", "Failed to delete note": "删除笔记失败", - "Failed to delete webhook": "", + "Failed to delete webhook": "删除 Webhook 失败", "Failed to disconnect": "断开连接失败", "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 fork chat": "", + "Failed to fork chat": "分叉对话失败", "Failed to generate title": "生成标题失败", "Failed to import models": "导入模型配置失败", - "Failed to load chat": "", + "Failed to load chat": "加载对话失败", "Failed to load chat preview": "对话预览加载失败", "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 folder": "", + "Failed to load folder": "加载分组失败", "Failed to load Interface settings": "“界面设置”数据加载失败", - "Failed to load policy: {{error}}": "", + "Failed to load policy: {{error}}": "加载策略失败:{{error}}", "Failed to load PPTX file. Please try downloading it instead.": "无法加载 PPTX 文件,请尝试下载后查看。", - "Failed to load usage": "", + "Failed to load usage": "加载用量信息失败", "Failed to move chat": "移动对话失败", "Failed to process URL: {{url}}": "处理链接失败: {{url}}", "Failed to read clipboard contents": "读取剪贴板内容失败", - "Failed to refresh terminals: {{error}}": "", + "Failed to refresh terminals: {{error}}": "刷新终端失败:{{error}}", "Failed to remove member": "移除成员失败", "Failed to render diagram": "图表渲染失败", "Failed to render visualization": "图表渲染失败", - "Failed to save chat variables": "", + "Failed to save chat variables": "保存对话变量失败", "Failed to save connections": "保存连接失败", "Failed to save conversation": "保存对话失败", "Failed to save models configuration": "保存模型配置失败", "Failed to save policy: {{error}}": "保存策略失败:{{error}}", "Failed to save terminal servers": "终端服务器保存失败", - "Failed to save webhook": "", - "Failed to search files": "", + "Failed to save webhook": "保存 Webhook 失败", + "Failed to search files": "搜索文件失败", "Failed to unshare chat.": "取消对话分享失败。", "Failed to update settings": "更新设置失败", "Failed to update status": "更新状态失败", - "Failed to update webhook": "", + "Failed to update webhook": "更新 Webhook 失败", "Failed to upload file.": "上传文件失败", "Features": "功能", "Features Permissions": "功能权限", @@ -1232,7 +1232,7 @@ "Feedback Details": "反馈详情", "Feel free to add specific details": "欢迎补充具体细节", "Female": "女性", - "Fetch page contents without proxy environment variables.": "", + "Fetch page contents without proxy environment variables.": "不使用代理环境变量获取页面内容。", "Fetch URL Content Length Limit": "URL 抓取内容长度上限", "File": "文件", "File added successfully.": "文件成功添加", @@ -1241,7 +1241,7 @@ "File content updated successfully.": "文件内容成功更新", "File Context": "文件上下文", "File deleted successfully.": "文件已成功删除。", - "File Extensions": "", + "File Extensions": "文件扩展名", "File Mode": "文件模式", "File moved.": "文件已移动。", "File name": "文件名", @@ -1252,11 +1252,11 @@ "File Upload": "文件上传", "File uploaded successfully": "文件上传成功", "Filename": "文件名", - "Filename matches": "", + "Filename matches": "文件名匹配", "Files": "文件", - "Filesystem": "", - "Fill the required fields first.": "", - "Fill the source fields and test query first.": "", + "Filesystem": "文件系统", + "Fill the required fields first.": "请先填写必填字段。", + "Fill the source fields and test query first.": "请先填写来源字段并测试查询。", "Filter": "过滤", "Filter is now globally disabled": "过滤器已全局禁用", "Filter is now globally enabled": "过滤器已全局启用", @@ -1279,8 +1279,8 @@ "Folder options": "分组选项", "Folder updated successfully": "分组更新成功", "Folders": "分组", - "Folders Sharing": "", - "Follow assistant responses as they are generated.": "", + "Folders Sharing": "文件夹共享", + "Follow assistant responses as they are generated.": "跟随助手回答的生成过程。", "Follow up": "追问", "Follow Up Generation": "追问生成", "Follow Up Generation Prompt": "追问生成提示词", @@ -1289,13 +1289,13 @@ "Followed instructions perfectly": "完全遵循指令", "for placeholders": "用于占位符", "Force OCR": "强制文字识别", - "Forking chat...": "", + "Forking chat...": "正在复制对话……", "Form": "手动创建", "Format Lines": "行内容格式化", - "Format lines to detect inline math and styles.": "", - "Format Markdown in previews and compact content surfaces.": "", - "Format Markdown syntax in assistant responses.": "", - "Format Markdown syntax in your own messages.": "", + "Format lines to detect inline math and styles.": "格式化行以检测内联数学公式和样式。", + "Format Markdown in previews and compact content surfaces.": "在预览和紧凑内容界面中格式化 Markdown。", + "Format Markdown syntax in assistant responses.": "格式化助手回答中的 Markdown 语法。", + "Format Markdown syntax in your own messages.": "格式化您自己消息中的 Markdown 语法。", "Formatting may be inconsistent from source.": "格式可能会与原始文件不完全一致。", "Forward": "前进", "Forwards system user OAuth access token to authenticate": "转发用户的 OAuth 访问令牌(Access Token)以进行身份验证", @@ -1310,14 +1310,14 @@ "Function imported successfully": "函数导入成功", "Function is now globally disabled": "函数全局已禁用", "Function is now globally enabled": "函数全局已启用", - "Function Menu": "", + "Function Menu": "函数菜单", "Function Name": "函数名称", "Function Name Filter List": "函数名称过滤列表", - "Function starter": "", + "Function starter": "函数引导", "Function updated successfully": "函数更新成功", "Functions": "函数", "Functions allow arbitrary code execution.": "注意:函数有权执行任意代码", - "Functions can execute arbitrary code.": "", + "Functions can execute arbitrary code.": "函数可以执行任意代码。", "Functions imported successfully": "函数导入成功", "Gemini": "Gemini", "Gemini API Key is required.": "Gemini 接口密钥是必填项。", @@ -1326,23 +1326,23 @@ "General": "通用", "Generate": "生成", "Generate an image": "生成图像", - "Generate an image prompt before sending the request.": "", + "Generate an image prompt before sending the request.": "在发送请求之前生成图片提示词。", "Generate and edit images": "生成和编辑图像", - "Generate chat titles automatically from conversation content.": "", - "Generate message pair": "", + "Generate chat titles automatically from conversation content.": "根据对话内容自动生成对话标题。", + "Generate message pair": "生成消息对", "Generate Message Pair": "生成消息对", - "Generate suggested follow-up prompts after responses.": "", - "Generate tags for chats automatically.": "", + "Generate suggested follow-up prompts after responses.": "在回答后生成建议的后续提示词。", + "Generate tags for chats automatically.": "自动为对话生成标签。", "Generated Image": "已生成图像", "Generated images will appear here": "生成的图片将显示在此处", "Generating search query": "生成搜索查询", - "Generating...": "生成中...", - "Generation": "", + "Generating...": "生成中……", + "Generation": "生成", "Get current time and perform date/time calculations": "获取当前时间并进行计算", "Get information on {{name}} in the UI": "在界面中获取 {{name}} 的信息", "Get started": "开始使用", "Get started with {{WEBUI_NAME}}": "开始使用 {{WEBUI_NAME}}", - "GitHub URL": "", + "GitHub URL": "GitHub URL", "Global": "全局", "Good Response": "点赞此回答", "Google": "谷歌", @@ -1352,33 +1352,33 @@ "Gravatar": "Gravatar 头像", "Grid": "网格", "Grokipedia": "Grokipedia", - "group": "", - "Group": "", - "Group assigned to new users by default.": "", - "Group Attribute": "", + "group": "组", + "Group": "用户组", + "Group assigned to new users by default.": "默认分配给新用户的组。", + "Group Attribute": "组属性", "Group Channel": "群组频道", - "Group Claim": "", + "Group Claim": "组声明", "Group created successfully": "用户组创建成功", "Group deleted successfully": "用户组删除成功", "Group Description": "用户组描述", - "Group Mapping": "", - "Group multi-model responses into tabs.": "", + "Group Mapping": "组映射", + "Group multi-model responses into tabs.": "将多个模型的回答分组到标签页。", "Group Name": "用户组名称", "Group updated successfully": "用户组更新成功", "groups": "用户组", "Groups": "用户组", - "Guides how the assistant formats tool and function calls.": "", - "Guides inline completions while users type a message.": "", - "Guides the suggestions shown after an assistant response.": "", + "Guides how the assistant formats tool and function calls.": "引导助手如何格式化工具和函数调用。", + "Guides inline completions while users type a message.": "在用户输入消息时引导行内补全。", + "Guides the suggestions shown after an assistant response.": "引导助手回答后显示的建议内容。", "H1": "一级标题", "H2": "二级标题", "H3": "三级标题", "Haptic Feedback": "震动反馈", - "Header variables": "", + "Header variables": "头部变量", "Headers": "HTTP 标头", "Headers must be a valid JSON object": "HTTP 标头必须是有效的 JSON 格式", "Height": "高度", - "Height in pixels to compress images to. Leave empty for no compression.": "", + "Height in pixels to compress images to. Leave empty for no compression.": "图片压缩后的高度(像素)。留空表示不压缩。", "Hello, {{name}}": "您好,{{name}}", "Help": "帮助", "Help the community discover great models": "帮助社区发现优质模型", @@ -1388,7 +1388,7 @@ "Hide": "隐藏", "Hide All": "全部隐藏", "Hide from Sidebar": "从侧边栏隐藏", - "Hide Hidden Files": "", + "Hide Hidden Files": "隐藏隐藏文件", "Hide Model": "隐藏模型", "High": "高", "High Contrast Mode": "高对比度模式", @@ -1407,13 +1407,13 @@ "ID": "ID", "ID cannot contain \":\" or \"|\" characters": "ID 中不允许包含 “:” 或 “|” 字符", "ID copied to clipboard": "已复制 ID 到剪贴板", - "Identity audit": "", - "Idle only": "", + "Identity audit": "身份审计", + "Idle only": "仅闲置时", "Idle Timeout": "无操作超时时间", - "iframe Sandbox Allow Downloads": "", + "iframe Sandbox Allow Downloads": "iframe 沙箱允许下载", "iframe Sandbox Allow Forms": "iframe 沙盒允许表单提交", "iframe Sandbox Allow Same Origin": "iframe 沙盒允许同源访问", - "iframe Sandbox Allow Scripts": "", + "iframe Sandbox Allow Scripts": "iframe 沙箱允许脚本", "Image": "图像生成", "Image Compression": "压缩图像", "Image Compression Height": "压缩图像高度", @@ -1428,53 +1428,53 @@ "Image Prompt Generation": "图像提示词生成", "Image Prompt Generation Prompt": "用于生成图像提示词的提示词", "Image Size": "图片尺寸", - "Image unavailable": "", - "image/*, video/*": "", + "Image unavailable": "图片不可用", + "image/*, video/*": "image/*, video/*", "Images": "图片", "Import": "导入", - "Import admin configuration from a JSON export file.": "", - "Import chat history from a JSON export file.": "", + "Import admin configuration from a JSON export file.": "从 JSON 导出文件导入管理员配置。", + "Import chat history from a JSON export file.": "从 JSON 导出文件导入对话历史。", "Import Chats": "导入对话记录", "Import Config": "导入配置文件", - "Import CSV": "", + "Import CSV": "导入 CSV", "Import From Link": "从链接导入", - "Import JSON": "", + "Import JSON": "导入 JSON", "Import Models": "导入模型配置", "Import Prompts": "导入提示词", - "Import Skills": "", + "Import Skills": "导入技能", "Import successful": "导入成功", "Import Tools": "导入工具配置", - "Import txt/md": "", + "Import txt/md": "导入 txt/md", "Important Update": "重要更新", - "Imported automations successfully": "", - "Imported notes successfully": "", - "Importing...": "", + "Imported automations successfully": "自动化任务导入成功", + "Imported notes successfully": "笔记导入成功", + "Importing...": "正在导入……", "Inactive": "未激活", "Include": "包括", - "Include saved memories in the system context.": "", - "Include voices that are not provided by a local speech service.": "", + "Include saved memories in the system context.": "将已保存的记忆包含在系统上下文中。", + "Include voices that are not provided by a local speech service.": "包含本地语音服务未提供的语音。", "Increase UI Scale": "增加界面缩放比例", "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 entire documents as context for comprehensive processing.": "", + "Inject entire documents as context for comprehensive processing.": "将完整文档作为上下文注入,以进行全面处理。", "Inject file content into conversation context": "将文件内容注入为对话上下文", - "Inject stored memories into conversation context": "", + "Inject stored memories into conversation context": "将已存储的记忆注入对话上下文", "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "注入整个内容作为上下文进行综合处理,适用于复杂查询", - "Inject the entire content as context for comprehensive processing.": "", - "Inline": "", + "Inject the entire content as context for comprehensive processing.": "将全部内容作为上下文注入,以进行全面处理。", + "Inline": "内联", "Input": "输入", "Input Key (e.g. text, unet_name, steps)": "输入键名(例如:text, unet_name, steps)", - "Input needed": "", + "Input needed": "需要输入", "Input Variables": "插入变量", "Insert": "插入", "Insert Follow-Up Prompt to Input": "回填追问提示词到输入框", - "Insert into note": "", + "Insert into note": "插入到笔记", "Insert Prompt as Rich Text": "以富文本的形式回填提示词", - "Insert selected follow-up prompts directly into the composer.": "", + "Insert selected follow-up prompts directly into the composer.": "将选定的后续提示词直接插入编辑器。", "Insert Suggestion Prompt to Input": "回填推荐提示词到输入框", - "Install": "", - "Installing": "", + "Install": "安装", + "Installing": "正在安装", "Instant Auto-Send After Voice Transcription": "语音转录文字后即时自动发送", "Instructions": "提示词指令", "Integration": "集成", @@ -1482,48 +1482,48 @@ "Interface": "界面", "Interface Settings Access": "允许修改界面设置", "Invalid file format.": "文件格式无效", - "Invalid format.": "", + "Invalid format.": "格式无效。", "Invalid JSON file": "JSON 文件格式无效", - "Invalid JSON format": "", + "Invalid JSON format": "JSON 格式无效", "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}}": "{{NAME}} 的 JSON 格式无效", "Invalid JSON format in Additional Config": "额外配置项的 JSON 格式无效", "Invalid JSON format in MinerU Parameters": "MinerU 参数的 JSON 格式无效", - "is typing...": "正在输入中...", + "is typing...": "正在输入中……", "Italic": "斜体", "January": "一月", "Jina API Base URL": "Jina 接口地址", "Jina API Key": "Jina 接口密钥", "join our Discord for help.": "加入我们的 Discord 寻求帮助", "JSON": "JSON", - "JSON Base64": "", - "JSON options passed to Marker for advanced parsing behavior.": "", + "JSON Base64": "JSON Base64", + "JSON options passed to Marker for advanced parsing behavior.": "传递给 Marker 的 JSON 选项,用于高级解析行为。", "JSON Preview": "JSON 预览", "JSON Spec": "以 JSON 格式定义的接口规范", "July": "七月", "June": "六月", "Jupyter Auth": "Jupyter 身份验证", - "Jupyter Password": "", - "Jupyter Token": "", + "Jupyter Password": "Jupyter 密码", + "Jupyter Token": "Jupyter 令牌", "Jupyter URL": "Jupyter 接口地址", "JWT Expiration": "JWT 过期时间", "JWT Token": "JWT 令牌", "Kagi Search API Key": "Kagi 搜索接口密钥", - "Keep current webhook URL": "", + "Keep current webhook URL": "保留当前 webhook URL", "Keep Follow-Up Prompts in Chat": "在对话中保留追问提示词", - "Keep generated follow-up prompts visible in the chat.": "", + "Keep generated follow-up prompts visible in the chat.": "让生成的后续提示词在对话中保持可见。", "Keep in Sidebar": "保留在侧边栏", "Key": "密匙", "Key is required": "密匙是必填项。", - "key_name": "", - "Keyboard": "", + "key_name": "key_name", + "Keyboard": "键盘", "Knowledge": "知识库", "Knowledge Access": "访问知识库", "Knowledge Base": "知识库", "Knowledge base has been reset": "知识库已重置", - "Knowledge base not found.": "", + "Knowledge base not found.": "未找到知识库。", "Knowledge created successfully.": "知识库创建成功", "Knowledge deleted successfully.": "知识库删除成功", "Knowledge Description": "知识库描述", @@ -1531,8 +1531,8 @@ "Knowledge Name": "知识库名称", "Knowledge Public Sharing": "公开分享知识库", "Knowledge Sharing": "分享知识库", - "Knowledge source created.": "", - "Knowledge source updated.": "", + "Knowledge source created.": "知识源已创建。", + "Knowledge source updated.": "知识源已更新。", "Knowledge updated successfully": "知识库更新成功", "Kokoro.js (Browser)": "Kokoro.js(运行于用户浏览器)", "Kokoro.js Dtype": "Kokoro.js Dtype", @@ -1547,14 +1547,14 @@ "Last Active": "最后在线时间", "Last Modified": "最后修改时间", "Last reply": "最后回复", - "Last run": "", + "Last run": "上次运行", "LDAP": "LDAP", - "LDAP attribute containing the user group memberships.": "", - "LDAP attribute used as the user email address.": "", - "LDAP attribute used as the username.": "", - "LDAP filter used to match signing-in users.": "", - "LDAP server hostname or IP address.": "", - "LDAP server port.": "", + "LDAP attribute containing the user group memberships.": "包含用户组成员身份的 LDAP 属性。", + "LDAP attribute used as the user email address.": "用作用户邮件地址的 LDAP 属性。", + "LDAP attribute used as the username.": "用作用户名的 LDAP 属性。", + "LDAP filter used to match signing-in users.": "用于匹配登录用户的 LDAP 过滤器。", + "LDAP server hostname or IP address.": "LDAP 服务器主机名或 IP 地址。", + "LDAP server port.": "LDAP 服务器端口。", "Leaderboard": "排行榜", "Learn More": "了解更多", "Learn more about Open Terminal": "进一步了解 Open Terminal", @@ -1562,7 +1562,7 @@ "Learn more about Voxtral transcription.": "进一步了解 Voxtral 转录服务", "Leave a public review for {{modelName}}": "为 {{modelName}} 留下公开评论", "Leave empty for no compression": "留空则不压缩", - "Leave empty for the built-in default.": "", + "Leave empty for the built-in default.": "留空使用内置默认值。", "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\" 端点的所有模型", @@ -1572,54 +1572,54 @@ "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(详见 Yandex 搜索 API 文档)", "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 empty to use the default prompt, or enter a custom prompt.": "", + "Leave empty to use the default prompt, or enter a custom prompt.": "留空使用默认提示词,或输入自定义提示词。", "Leave model field empty to use the default model.": "模型字段留空以使用默认模型", "Legacy": "旧版", - "Let speech interrupt the assistant during a voice call.": "", - "Let users rate assistant responses.": "", + "Let speech interrupt the assistant during a voice call.": "允许语音在语音通话期间中断助手。", + "Let users rate assistant responses.": "允许用户对助手回答进行评分。", "lexical": "关键词", "License": "授权", - "Lifecycle JSON": "", - "Lifetime tokens": "", + "Lifecycle JSON": "Lifecycle JSON", + "Lifetime tokens": "终生 token", "Lift List": "上移列表", "Light": "浅色", - "Limit API keys to configured endpoints.": "", + "Limit API keys to configured endpoints.": "将 API 密钥限制在配置的端点。", "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 免费套餐)。", - "Limit how much draft text is sent for suggestion generation.": "", - "Limit parallel web loader requests.": "", - "Link OAuth sign-ins to existing accounts with the same email.": "", + "Limit how much draft text is sent for suggestion generation.": "限制用于建议生成的草稿文本量。", + "Limit parallel web loader requests.": "限制并行网页加载请求。", + "Link OAuth sign-ins to existing accounts with the same email.": "将 OAuth 登录关联到拥有相同邮件的现有账户。", "Linkup API Key": "Linkup 接口密钥", "List": "列表", "List calendars, search, create, update, and delete calendar events": "列出日程,并可搜索、创建、更新和删除日程事件", - "List, search, and read files attached to the current chat": "", - "Listening...": "正在倾听...", - "LiteLLM": "", + "List, search, and read files attached to the current chat": "列出、搜索并读取附加在当前对话中的文件", + "Listening...": "正在倾听……", + "LiteLLM": "LiteLLM", "Live": "实时", "llama.cpp": "llama.cpp", "LLMs can make mistakes. Verify important information.": "大语言模型可能会犯错,请核实关键信息。", - "LM Studio": "", - "Load Model": "", + "LM Studio": "LM Studio", + "Load Model": "加载模型", "Loaded": "已加载", "Loader": "加载器", - "Loading Kokoro.js...": "加载 Kokoro.js 中...", - "Loading policy...": "", - "Loading release notes...": "", - "Loading...": "加载中...", + "Loading Kokoro.js...": "加载 Kokoro.js 中……", + "Loading policy...": "正在加载策略……", + "Loading release notes...": "正在加载发行说明……", + "Loading...": "加载中……", "local": "本地", "Local": "本地", "Local Task Model": "本地任务模型", "Location": "地点", "Location access not allowed": "不允许访问位置信息", - "Longest active chat": "", - "Longest streak": "", + "Longest active chat": "最长活跃对话", + "Longest streak": "最长连续天数", "Lost": "较差", "Low": "低", "LTR": "从左至右", "Made by Open WebUI Community": "由 Open WebUI 社区开发", - "Make Default": "", + "Make Default": "设为默认", "Make password visible in the user interface": "在用户界面中显示密码", - "Make Private": "", - "Make Public": "", + "Make Private": "设为私有", + "Make Public": "设为公开", "Male": "男性", "Manage": "管理", "Manage Connections": "管理连接", @@ -1629,43 +1629,43 @@ "Manage Ollama": "管理 Ollama", "Manage Ollama API Connections": "管理 Ollama 接口连接", "Manage OpenAI API Connections": "管理 OpenAI 接口连接", - "Map LDAP groups to Open WebUI groups.": "", - "Map OAuth claims to Open WebUI groups.": "", - "Map OAuth claims to Open WebUI roles.": "", - "Map workflow node inputs used for image edits.": "", - "Map workflow node inputs used for image generation.": "", - "Mapped Source": "", + "Map LDAP groups to Open WebUI groups.": "将 LDAP 组映射到 Open WebUI 组。", + "Map OAuth claims to Open WebUI groups.": "将 OAuth 声明映射到 Open WebUI 组。", + "Map OAuth claims to Open WebUI roles.": "将 OAuth 声明映射到 Open WebUI 角色。", + "Map workflow node inputs used for image edits.": "映射用于图片编辑的工作流节点输入。", + "Map workflow node inputs used for image generation.": "映射用于图片生成的工作流节点输入。", + "Mapped Source": "映射的来源", "March": "三月", - "Mark all as read": "", - "Mark as unread": "", + "Mark all as read": "标记全部已读", + "Mark as unread": "标记为未读", "Markdown": "Markdown", "Markdown Header Text Splitter": "Markdown 标题文本分割器", - "Max background": "", - "Max concurrent": "", - "Max iterations": "", - "Max output": "", + "Max background": "最大后台数", + "Max concurrent": "最大并发", + "Max iterations": "最大迭代次数", + "Max output": "最大输出", "Max Speakers": "最大扬声器数量", "Max tokens to retrieve (1024-32768, default 8192)": "最大检索 Token 数(1024-32768,默认 8192)", "Max Upload Count": "最大上传数量", "Max Upload Size": "最大上传大小", "Maximum characters to return from fetched URLs. Leave empty for no limit.": "从 URL 抓取内容时返回的最大字符数。留空表示不限制。", - "Maximum concurrent embedding requests. Set to 0 for unlimited.": "", - "Maximum file size in MB. Leave empty for unlimited.": "", + "Maximum concurrent embedding requests. Set to 0 for unlimited.": "最大并发嵌入请求数。设为 0 表示不限制。", + "Maximum file size in MB. Leave empty for unlimited.": "最大文件大小(MB)。留空表示不限制。", "Maximum number of files allowed per folder.": "每个分组允许的最大文件数量。", "Maximum number of files per folder is {{max}}.": "每个分组允许的最大文件数量为 {{max}}。", - "Maximum number of files that can be used at once in chat.": "", - "Maximum number of hybrid results sent to the reranker.": "", - "Maximum number of retrieved chunks returned to the model.": "", + "Maximum number of files that can be used at once in chat.": "对话中可同时使用的最大文件数。", + "Maximum number of hybrid results sent to the reranker.": "发送到重排器的最大混合结果数。", + "Maximum number of retrieved chunks returned to the model.": "返回给模型的最大检索块数。", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可同时下载 3 个模型,请稍后重试。", - "Maximum runtime in seconds before execution is stopped.": "", - "Maximum size for each text chunk.": "", - "Maximum time in seconds to wait for MinerU API responses.": "", - "Maximum time to wait while loading web content.": "", + "Maximum runtime in seconds before execution is stopped.": "执行停止前的最大运行时间(秒)。", + "Maximum size for each text chunk.": "每个文本块的最大大小。", + "Maximum time in seconds to wait for MinerU API responses.": "等待 MinerU API 响应的最大时间(秒)。", + "Maximum time to wait while loading web content.": "加载网页内容时的最大等待时间。", "May": "五月", "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 支持仍处于实验阶段,因其规范变化频繁,可能会出现不兼容的情况。而 OpenAPI 规范由 Open WebUI 团队维护,在兼容性方面更加可靠。", - "Media upload MIME types the content extraction engine may process.": "", + "Media upload MIME types the content extraction engine may process.": "内容提取引擎可处理的媒体上传 MIME 类型。", "Medium": "中", "Member removed successfully": "成员移除成功", "members": "成员", @@ -1677,35 +1677,35 @@ "Memory added successfully": "记忆添加成功", "Memory cleared successfully": "记忆清除成功", "Memory deleted successfully": "记忆删除成功", - "Memory System Context": "", + "Memory System Context": "记忆系统上下文", "Memory updated successfully": "记忆更新成功", - "Merge Accounts by Email": "", - "Merge chunks smaller than this threshold when possible. Set to 0 to disable merging.": "", + "Merge Accounts by Email": "按邮件合并账户", + "Merge chunks smaller than this threshold when possible. Set to 0 to disable merging.": "在可能的情况下合并小于此阈值的块。设为 0 禁用合并。", "Merge Responses": "合并回答", "Merged Response": "合并的回答", "Message": "消息", "Message counts and response timestamps": "消息数量与响应时间戳", "Message counts are based on assistant responses.": "消息条数仅统计模型的回复(不含用户发送的消息)。", - "Message Rating": "", + "Message Rating": "消息评价", "Message rating should be enabled to use this feature": "要使用此功能,需先启用回答评价功能", - "Message shown before web search runs.": "", - "Message text...": "消息文本...", + "Message shown before web search runs.": "网络搜索执行前显示的消息。", + "Message text...": "消息文本……", "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.": "创建链接后发送的消息将不会被分享。通过该链接访问的用户可以查看对话记录。", - "Metadata Field": "", + "Metadata Field": "元数据字段", "Microsoft OneDrive": "Microsoft OneDrive", "Microsoft OneDrive (personal)": "Microsoft OneDrive(个人账户)", "Microsoft OneDrive (work/school)": "Microsoft OneDrive(工作或学校账户)", - "Microsoft Web IQ API Base URL": "", - "Microsoft Web IQ API Key": "", + "Microsoft Web IQ API Base URL": "Microsoft Web IQ API 基础 URL", + "Microsoft Web IQ API Key": "Microsoft Web IQ API 密钥", "min": "分钟", "MinerU": "MinerU", - "MinerU API endpoint for the selected mode.": "", + "MinerU API endpoint for the selected mode.": "所选模式的 MinerU API 端点。", "MinerU API Key required for Cloud API mode.": "使用 MinerU 云服务模式需要接口密钥。", "Mistral OCR": "Mistral OCR", "Mistral OCR API Key required.": "需要 Mistral OCR 接口密钥", - "Mistral OCR service endpoint.": "", + "Mistral OCR service endpoint.": "Mistral OCR 服务端点。", "MistralAI": "MistralAI", "Mo_day_of_week": "周一", "Model": "模型", @@ -1718,50 +1718,50 @@ "Model {{name}} is now visible": "模型 {{name}} 已可见", "Model accepts file inputs": "模型支持文件输入", "Model accepts image inputs": "模型支持图像输入", - "Model added to pinned models": "", - "Model added to selected models": "", + "Model added to pinned models": "模型已添加到固定模型列表", + "Model added to selected models": "模型已添加到已选模型列表", "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 created successfully!": "模型创建成功!", - "Model Defaults": "", - "Model deleted successfully": "", - "Model download started": "", + "Model Defaults": "模型默认设置", + "Model deleted successfully": "模型已成功删除", + "Model download started": "模型下载已开始", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "检测到模型名字为文件路径。需要提供模型简称才能继续执行更新。", "Model Filtering": "模型白名单", "Model ID": "模型 ID", - "Model ID is already added": "", + "Model ID is already added": "模型 ID 已添加", "Model ID is required.": "模型 ID 是必填项。", "Model IDs": "模型 ID", - "Model is now private": "", - "Model is now public": "", - "Model list refreshed": "", - "Model loaded successfully": "", + "Model is now private": "模型已设为私有", + "Model is now public": "模型已设为公开", + "Model list refreshed": "模型列表已刷新", + "Model loaded successfully": "模型加载成功", "Model Name": "模型名称", "Model name already exists, please choose a different one": "模型名称已存在,请使用不同的名称", "Model Name is required.": "模型名称是必填项。", - "Model name used by Document Intelligence.": "", + "Model name used by Document Intelligence.": "Document Intelligence 使用的模型名称。", "Model names and usage frequency": "模型名称与使用频率", "Model not found": "未找到模型", "Model not selected": "未选择模型", - "Model order saved successfully": "", - "Model parameters": "", + "Model order saved successfully": "模型顺序已保存", + "Model parameters": "模型参数", "Model Parameters": "模型参数", "Model Params": "模型参数", "Model Permissions": "模型权限", - "Model providers": "", - "Model removed from pinned models": "", - "Model removed from selected models": "", - "Model Response Mode": "", + "Model providers": "模型服务商", + "Model removed from pinned models": "模型已从固定模型列表移除", + "Model removed from selected models": "模型已从已选模型列表移除", + "Model Response Mode": "模型回答模式", "Model responses or outputs": "模型响应或输出", "Model unloaded successfully": "模型卸载成功", "Model updated successfully": "模型更新成功", "Model Usage": "模型用量", - "Model used to generate embeddings. Reindex knowledge after changing this.": "", - "Model used to rerank retrieved results.": "", - "Model-specific context compaction thresholds cannot exceed this token limit.": "", + "Model used to generate embeddings. Reindex knowledge after changing this.": "用于生成向量嵌入的模型。更改后请重新索引知识库。", + "Model used to rerank retrieved results.": "用于重新排序检索结果的模型。", + "Model-specific context compaction thresholds cannot exceed this token limit.": "模型特定的上下文压缩阈值不能超过此 Token 限制。", "Model(s) do not support file upload": "模型不支持上传文件", "Modelfile Content": "模型文件内容", "Models": "模型", @@ -1772,18 +1772,18 @@ "Models Sharing": "分享模型", "Mojeek": "Mojeek", "Mojeek Search API Key": "Mojeek Search 接口密钥", - "Monday – Friday": "", + "Monday – Friday": "周一至周五", "Month": "月", "Monthly": "每月", "More": "更多", "More Concise": "精炼表达", "More options": "更多选项", "More Options": "更多选项", - "Most used tools": "", + "Most used tools": "最常用工具", "Move": "移动", - "Move every chat into the archive after confirmation.": "", + "Move every chat into the archive after confirmation.": "确认后将每个对话移入归档。", "Moved {{name}}": "移动“{{name}}”成功", - "Multipart Upload": "", + "Multipart Upload": "分片上传", "Mute": "静音", "Muted": "已静音", "My Terminal": "我的终端", @@ -1793,15 +1793,15 @@ "Name your knowledge base": "为您的知识库命名", "Name, prompt, and model are required": "名称、提示词和模型不能为空", "Native": "原生", - "Native mode (default) leverages the model's built-in tool-calling capabilities. Legacy mode works with a wider range of models by calling tools once before execution via prompt injection.": "", - "Navigate to Next Chat": "", - "Navigate to Previous Chat": "", + "Native mode (default) leverages the model's built-in tool-calling capabilities. Legacy mode works with a wider range of models by calling tools once before execution via prompt injection.": "原生模式(默认)利用模型内置的工具调用能力。旧版模式通过提示词注入在执行前一次性调用工具,兼容更多模型。", + "Navigate to Next Chat": "跳转到下一条对话", + "Navigate to Previous Chat": "导航到上一个对话", "Never": "未曾", "New": "最新", "New Button": "新按钮", "New calendar": "新建日程", "New Calendar": "新建日程", - "New chat": "", + "New chat": "新建对话", "New Chat": "新对话", "New directory": "新建目录", "New Directory": "新建目录", @@ -1811,30 +1811,30 @@ "New Group": "新建用户组", "New Note": "创建笔记", "New Password": "新密码", - "New Sign Ups": "", + "New Sign Ups": "新注册用户", "New Temporary Chat": "创建临时对话", "New Terminal": "新建终端", "New Tool": "新建工具", "New Webhook": "新建 Webhook", "new-channel": "新频道", - "Next": "", + "Next": "下一步", "Next message": "下一条消息", - "Next month": "", - "Next page": "", + "Next month": "下个月", + "Next page": "下一页", "Next run": "下次运行", - "Next version": "", - "No access grants. Private to you.": "未共享给他人,仅你可访问。", - "No actions found": "", + "Next version": "下一个版本", + "No access grants. Private to you.": "未共享给他人,仅您可访问。", + "No actions found": "未找到操作", "No activity data": "没有活动数据", - "No additional headers are sent unless configured.": "", + "No additional headers are sent unless configured.": "除非进行配置,否则不发送附加头信息。", "No authentication": "无身份验证", "No automations found": "还没有任何自动化任务", - "No channels": "", - "No chat alerts": "", - "No chat history": "", - "No chat to compact": "", - "No chat to fork": "", - "No chats": "", + "No channels": "没有频道", + "No chat alerts": "没有对话提醒", + "No chat history": "没有对话历史", + "No chat to compact": "没有可紧凑的对话", + "No chat to fork": "没有可复制的对话", + "No chats": "没有对话", "No chats found": "未找到对话记录", "No chats found for this user.": "未找到此用户的对话记录", "No chats found.": "未找到对话记录", @@ -1843,18 +1843,18 @@ "No content to speak": "没有内容可朗读", "No conversation to save": "没有可保存的对话", "No data": "暂无数据", - "No description": "", + "No description": "无描述", "No distance available": "没有可用距离", - "No event webhooks configured.": "", + "No event webhooks configured.": "未配置事件 webhook。", "No expiration can pose security risks.": "未设置 JWT 过期时间会导致安全风险。", - "No external knowledge sources configured.": "", + "No external knowledge sources configured.": "未配置外部知识源。", "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.": "暂无文件。请上传文件或运行 Python 代码以创建文件。", - "No filters found": "", - "No folders": "", + "No filters found": "未找到过滤器", + "No folders": "没有文件夹", "No functions found": "未找到函数", "No groups found": "暂无用户组", "No history available": "暂无历史记录", @@ -1865,24 +1865,24 @@ "No knowledge bases found.": "未找到知识库", "No knowledge found": "未找到知识", "No limit": "无限制", - "No matches": "", - "No model data": "", + "No matches": "未找到匹配项", + "No model data": "没有模型数据", "No model IDs": "没有模型 ID", - "No model usage found": "", + "No model usage found": "未找到模型使用记录", "No models accessible": "没有可访问的模型", "No models available": "暂无可用模型", "No models found": "未找到任何模型", "No Notes": "没有笔记", "No notes found": "没有任何笔记", - "No notification targets configured.": "", + "No notification targets configured.": "未配置通知目标。", "No one": "没有人", "No output items": "没有任何输出项", "No pinned messages": "没有置顶消息", "No prompts found": "未找到提示词", - "No Repeat": "", + "No Repeat": "不重复", "No results": "未找到结果", "No results found": "未找到结果", - "No runs yet": "", + "No runs yet": "尚未运行", "No search query generated": "未生成搜索查询", "No servers detected": "未检测到任何服务器", "No skills found": "没有找到技能", @@ -1894,86 +1894,86 @@ "No tool server connections configured.": "尚未配置任何工具服务器。", "No tools accessible": "没有可访问的工具", "No tools found": "未找到工具", - "No usage data found": "", - "No user variables configured.": "", + "No usage data found": "未找到使用数据", + "No user variables configured.": "未配置用户变量。", "No users were found.": "未找到用户", "No valves": "没有配置项", "No valves to update": "没有需要更新的配置项", "No webhooks yet": "没有 Webhook", "Node Ids": "节点 ID", "None": "无", - "Not configured": "", + "Not configured": "未配置", "Not factually correct": "与事实不符", "Not helpful": "没有任何帮助", "Not Registered": "未注册", "Not scheduled": "未设置定时任务", "Note": "笔记", "Note deleted successfully": "笔记删除成功", - "Note Menu": "", + "Note Menu": "笔记菜单", "Notes": "笔记", "Notes Public Sharing": "公开分享笔记", "Notes Sharing": "分享笔记", - "Nothing to compact": "", + "Nothing to compact": "没有可紧凑的内容", "Notification Sound": "通知提示音", - "Notification Targets": "", + "Notification Targets": "通知目标", "Notifications": "桌面通知", "November": "十一月", - "Number of items processed per embedding batch.": "", - "Number of results processed per reranking batch.": "", + "Number of items processed per embedding batch.": "每批嵌入处理的项目数。", + "Number of results processed per reranking batch.": "每批重排处理的结果数。", "OAuth": "OAuth", - "OAuth / OIDC": "", + "OAuth / OIDC": "OAuth / OIDC", "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "OAuth 2.1(静态)", - "OAuth client identifier from the provider.": "", - "OAuth client secret from the provider.": "", - "OAuth discovery successful": "", + "OAuth client identifier from the provider.": "来自服务提供商的 OAuth 客户端标识符。", + "OAuth client secret from the provider.": "来自服务提供商的 OAuth 客户端密钥。", + "OAuth discovery successful": "OAuth 发现成功", "OAuth ID": "OAuth ID", - "OAuth Resource Parameter": "", - "OAuth Scopes": "", - "OAuth scopes requested during sign-in.": "", + "OAuth Resource Parameter": "OAuth 资源参数", + "OAuth Scopes": "OAuth 作用域", + "OAuth scopes requested during sign-in.": "登录时请求的 OAuth 作用域。", "OAuth Server URL": "OAuth 服务器地址", "OAuth session disconnected": "OAuth 会话已断开", - "OAuth Signup": "", + "OAuth Signup": "OAuth 注册", "October": "十月", "Off": "关闭", "Okay, Let's Go!": "确认,开始使用!", - "Older messages are summarized when estimated context exceeds this token limit.": "", + "Older messages are summarized when estimated context exceeds this token limit.": "当估计上下文超过此 token 限制时,成更旧的消息将被摘要。", "OLED Dark": "漆黑", "Ollama": "Ollama", "Ollama API": "Ollama 接口", "Ollama API settings updated": "Ollama 接口设置已更新", "Ollama Cloud API Key": "Ollama Cloud 接口密钥", - "Ollama endpoint used for embeddings.": "", + "Ollama endpoint used for embeddings.": "用于向量嵌入的 Ollama 端点。", "Ollama Version": "Ollama 版本", - "Omit": "", + "Omit": "省略", "On": "开启", "Once": "单次", "OneDrive": "OneDrive", - "Only active during Voice Mode.": "", + "Only active during Voice Mode.": "仅在语音模式下激活。", "Only active when \"Paste Large Text as File\" setting is toggled on.": "仅在启用“粘贴超长文本为文件”选项时有效。", - "Only active when a tool call is waiting for approval.": "", + "Only active when a tool call is waiting for approval.": "仅当工具调用等待批准时激活。", "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 alphanumeric characters and hyphens are allowed": "只允许使用英文字母,数字 (0-9) 以及连字符 (-)", "Only alphanumeric characters and hyphens are allowed in the command string.": "命令字符串中只允许使用英文字母,数字 (0-9) 以及连字符 (-)。", "Only can be triggered when the chat input is in focus.": "仅在聚焦对话框时有效。", "Only collections can be edited, create a new knowledge base to edit/add documents.": "只能编辑文件集,创建一个新的知识库来编辑/添加文件。", - "Only install functions from sources you trust.": "", - "Only install tools from sources you trust.": "", + "Only install functions from sources you trust.": "仅从您信任的来源安装函数。", + "Only install tools from sources you trust.": "仅从您信任的来源安装工具。", "Only invited users can access": "只有受邀用户才能访问", - "Only return documents with a score greater than or equal to this value.": "", + "Only return documents with a score greater than or equal to this value.": "仅返回得分大于或等于此值的文档。", "Only select users and groups with permission can access": "只有具有权限的用户和组才能访问", "Only sync new/updated chats": "仅同步新增或有更新的对话", - "Only when away": "", + "Only when away": "仅离开时", "Oops! Looks like the URL is invalid. Please double-check and try again.": "此链接似乎为无效链接。请检查后重试。", "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": "", - "Open automation": "", - "Open create menu": "", - "Open detail blocks by default.": "", + "Open": "打开", + "Open automation": "打开自动化任务", + "Open create menu": "打开创建菜单", + "Open detail blocks by default.": "默认展开详细块。", "Open file": "打开文件", - "Open Folder": "", + "Open Folder": "打开文件夹", "Open in full screen": "全屏打开", "Open in new tab": "在新标签页中打开", "Open link": "打开链接", @@ -1981,13 +1981,13 @@ "Open Modal To Manage Floating Quick Actions": "管理快捷操作浮窗", "Open Modal To Manage Image Compression": "打开图片压缩配置窗口", "Open Model Selector": "打开模型选择器", - "Open note": "", + "Open note": "打开笔记", "Open Settings": "打开设置页面", "Open Sidebar": "展开侧边栏", "Open Terminal": "Open Terminal", - "Open the changelog modal after sign-in when enabled.": "", - "Open the file browser after selecting a terminal.": "", - "Open the file manager for uploaded files.": "", + "Open the changelog modal after sign-in when enabled.": "启用后,登录时打开更新日志弹窗。", + "Open the file browser after selecting a terminal.": "选择终端后打开文件浏览器。", + "Open the file manager for uploaded files.": "打开文件管理器查看上传的文件。", "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 使用内置 faster-whisper", @@ -1999,17 +1999,17 @@ "OpenAI API Key is required.": "OpenAI 接口密钥是必填项。", "OpenAI API settings updated": "OpenAI 接口设置已更新", "OpenAI URL/Key required.": "OpenAI 接口地址和密钥是必填项。", - "OpenAI-compatible embeddings endpoint.": "", + "OpenAI-compatible embeddings endpoint.": "兼容 OpenAI 的向量嵌入端点。", "OpenAPI": "OpenAPI", "OpenAPI Spec": "OpenAPI 接口规范", "openapi.json URL or Path": "openapi.json 地址或路径", - "OpenID discovery URL for this provider.": "", - "OpenSERP URL": "", + "OpenID discovery URL for this provider.": "此服务提供商的 OpenID 发现 URL。", + "OpenSERP URL": "OpenSERP URL", "optional": "选填", "Optional": "可选", - "Optional API key for Ollama requests.": "", + "Optional API key for Ollama requests.": "用于 Ollama 请求的可选 API 密钥。", "or": "或", - "Orchestrator": "", + "Orchestrator": "编排器", "Ordered List": "有序列表", "Other": "其他", "out of": "中的", @@ -2017,73 +2017,73 @@ "OUTPUT": "输出", "Output format": "输出格式", "Output Format": "输出格式", - "Overlap preserved between neighboring chunks.": "", - "Override the Gemini image generation endpoint.": "", + "Overlap preserved between neighboring chunks.": "邻近块之间保留重叠。", + "Override the Gemini image generation endpoint.": "覆盖 Gemini 图片生成端点。", "Overview": "概述", "PaddleOCR-vl": "PaddleOCR-vl", "PaddleOCR-vl API URL required.": "PaddleOCR-vl 接口地址是必填项。", - "PaddleOCR-vl service endpoint.": "", + "PaddleOCR-vl service endpoint.": "PaddleOCR-vl 服务端点。", "page": "页", "Page": "页模式", - "Page mode creates one document per page. Single mode keeps pages together for chunking across boundaries.": "", + "Page mode creates one document per page. Single mode keeps pages together for chunking across 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.": "欢迎您参与社区排行榜和评估!同步使用统计数据有助于 Open WebUI 的研发和改进。您的隐私至关重要:我们绝不会发送任何消息内容。", - "Passthrough params": "", + "Passthrough params": "透传参数", "Password": "密码", - "Password for the bind DN.": "", - "Password updated. Please sign in again.": "", + "Password for the bind DN.": "绑定 DN 的密码。", + "Password updated. Please sign in again.": "密码已更新。请重新登录。", "Passwords do not match.": "两次输入的密码不一致。", - "Paste inserted prompts as rich text when possible.": "", + "Paste inserted prompts as rich text when possible.": "尽可能以富文本格式粘贴插入的提示词。", "Paste Large Text as File": "粘贴大文本为文件", - "Path": "", + "Path": "路径", "Path copied": "路径已复制", - "Pause a response to ask the user a clarifying question": "", + "Pause a response to ask the user a clarifying question": "暂停回答以向用户提出澄清问题", "Paused": "已暂停", "PDF document (.pdf)": "PDF 文档 (.pdf)", "PDF Extract Images (OCR)": "PDF 图像提取(使用文字识别)", "PDF Loader Mode": "PDF 加载模式", - "pdf, docx, pptx, xlsx": "", - "Peak tokens": "", + "pdf, docx, pptx, xlsx": "pdf, docx, pptx, xlsx", + "Peak tokens": "峰值 token", "pending": "待激活", "Pending": "待激活", - "Pending Accounts": "", + "Pending Accounts": "待审核账户", "Pending User Overlay Content": "待激活用户界面内容", "Pending User Overlay Title": "待激活用户界面标题", - "Per automation": "", - "Per chat": "", - "Percentage of recent messages to keep after older messages are summarized.": "", - "Permanently delete every chat after confirmation.": "", + "Per automation": "每个自动化任务", + "Per chat": "每个对话", + "Percentage of recent messages to keep after older messages are summarized.": "成更旧消息被摘要后保留的近期消息百分比。", + "Permanently delete every chat after confirmation.": "确认后永久删除每个对话。", "Permission denied when accessing media devices": "申请媒体设备权限被拒绝", "Permission denied when accessing microphone": "申请麦克风权限被拒绝", "Permission denied when accessing microphone: {{error}}": "申请麦克风权限被拒绝:{{error}}", "Permissions": "权限", - "Permissions reset to defaults": "", + "Permissions reset to defaults": "权限已重置为默认值", "Perplexity API Key": "Perplexity 接口密钥", "Perplexity Model": "Perplexity 模型", "Perplexity Search API URL": "Perplexity 搜索接口地址", "Perplexity Search Context Usage": "Perplexity 搜索上下文用量", "Persistent": "持久化", - "Personal": "", + "Personal": "个人", "Personalization": "个性化", - "Picture Claim": "", + "Picture Claim": "头像声明", "Pin": "置顶", "Pin to Sidebar": "固定到侧边栏", "Pinned": "已置顶", "Pinned Messages": "置顶消息", "Pipe": "Pipe", - "Pipeline": "", + "Pipeline": "Pipeline", "Pipeline deleted successfully": "Pipeline 删除成功", "Pipeline downloaded successfully": "Pipeline 下载成功", - "Pipeline URL": "", + "Pipeline URL": "Pipeline URL", "Pipelines": "Pipelines", - "Pipelines are a plugin system with arbitrary code execution.": "", + "Pipelines are a plugin system with arbitrary code execution.": "Pipeline 是一种具有任意代码执行能力的插件系统。", "Pipelines Not Detected": "未检测到 Pipeline", - "Place selected suggestion text into the composer.": "", + "Place selected suggestion text into the composer.": "将选定的建议文本放入编辑器。", "Plain text (.md)": "纯文本文档(.md)", "Plain text (.txt)": "纯文本文档 (.txt)", - "Play assistant responses aloud automatically.": "", + "Play assistant responses aloud automatically.": "自动播放助手回答。", "Playground": "AI 对话探索区", "Playwright Timeout (ms)": "Playwright 超时时间 (ms)", "Playwright WebSocket URL": "Playwright WebSocket 地址", @@ -2100,38 +2100,38 @@ "Please enter Client ID and Client Secret": "请输入客户端 ID 和客户端密钥", "Please fill in all fields.": "请填写所有字段。", "Please register the OAuth client": "请注册 OAuth 客户端", - "Please save the connection before authorizing OAuth": "", + "Please save the connection before authorizing OAuth": "请先保存连接,然后再授权 OAuth", "Please save the connection to persist the OAuth client information and do not change the ID": "请保存连接以保留 OAuth 客户端信息,并确保不要更改 ID", "Please select a model.": "请选择模型。", "Please select a reason": "请选择原因", "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 changes apply to newly provisioned terminals. Refresh matching terminals to apply them to existing terminals.": "", + "Policy changes apply to newly provisioned terminals. Refresh matching terminals to apply them to existing terminals.": "策略更改适用于新创建的终端。刷新匹配的终端以使其生效于现有终端。", "Policy ID": "策略 ID", - "Policy ID is required": "", - "Policy is still loading": "", + "Policy ID is required": "需要策略 ID", + "Policy is still loading": "策略加载中", "Port": "端口", "Ports": "端口", "Positive attitude": "态度积极", "Prefer not to say": "暂不透露", - "Preferred transcript language codes, separated by commas.": "", + "Preferred transcript language codes, separated by commas.": "首选转录语言代码,以逗号分隔。", "Prefix ID": "模型 ID 前缀", "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "在模型 ID 前添加前缀以避免与其它连接提供的模型冲突。留空则禁用此功能。", - "Preparing {{NAME}}...": "", - "Preparing download...": "", - "Press keys...": "", + "Preparing {{NAME}}...": "正在准备 {{NAME}}……", + "Preparing download...": "正在准备下载……", + "Press keys...": "按下键盘键……", "Prevent File Creation": "阻止文件创建", "Preview": "预览", "Preview Access": "预览访问权限", - "Preview failed": "", - "Previous": "", + "Preview failed": "预览失败", + "Previous": "上一个", "Previous 30 days": "过去 30 天", "Previous 7 days": "过去 7 天", "Previous message": "上一条消息", - "Previous month": "", - "Previous page": "", - "Previous version": "", + "Previous month": "上一个月", + "Previous page": "上一页", + "Previous version": "上一个版本", "Private": "私有", "Private conversation between selected users": "所选用户之间的私密对话", "Production version updated": "当前使用版本已更新", @@ -2140,26 +2140,26 @@ "Prompt Autocompletion": "自动补全提示词", "Prompt Content": "提示词内容", "Prompt created successfully": "提示词创建成功", - "Prompt Menu": "", + "Prompt Menu": "提示词菜单", "Prompt Name": "提示词名称", "Prompt Suggestions": "推荐提示词", "Prompt Template": "提示词模板", - "Prompt template used when retrieved context is injected.": "", + "Prompt template used when retrieved context is injected.": "检索到上下文时使用的提示词模板。", "Prompt updated successfully": "提示词更新成功", "Prompts": "提示词", "Prompts Access": "访问提示词", "Prompts Public Sharing": "提示词公开分享", "Prompts Sharing": "分享提示词", - "Provide the --api-auth username and password when required.": "", + "Provide the --api-auth username and password when required.": "在需要时提供 --api-auth 用户名和密码。", "Provider": "提供商", - "Provider groups blocked from signing in.": "", - "Provider Name": "", - "Provider roles allowed to sign in.": "", - "Provider roles that grant admin access.": "", - "Provider URL": "", - "Provider used to generate document embeddings.": "", - "Provider used to rerank hybrid search results.": "", - "Proxy URL used for Youtube loader requests.": "", + "Provider groups blocked from signing in.": "禁止登录的服务提供商组。", + "Provider Name": "服务提供商名称", + "Provider roles allowed to sign in.": "允许登录的服务提供商角色。", + "Provider roles that grant admin access.": "授予管理员权限的服务提供商角色。", + "Provider URL": "服务提供商 URL", + "Provider used to generate document embeddings.": "用于生成文档向量嵌入的服务提供商。", + "Provider used to rerank hybrid search results.": "用于重新排序混合搜索结果的服务提供商。", + "Proxy URL used for Youtube loader requests.": "用于 Youtube 加载器请求的代理 URL。", "Public": "公共", "Pull \"{{searchValue}}\" from Ollama.com": "从 Ollama.com 下载 “{{searchValue}}”", "Pull a model from Ollama.com": "从 Ollama.com 下载模型", @@ -2167,7 +2167,7 @@ "Pyodide file browser": "Pyodide 文件浏览器", "Query Generation Prompt": "查询生成提示词", "Querying": "查询中", - "Queue outgoing messages instead of interrupting active responses.": "", + "Queue outgoing messages instead of interrupting active responses.": "将发送的消息加入队列,而不是中断活跃的回答。", "Quick Actions": "快捷操作", "RAG Template": "RAG 提示词模板", "Ran {{COUNT}} analyses": "已完成 {{COUNT}} 次分析", @@ -2177,35 +2177,35 @@ "Read": "只读", "Read Aloud": "朗读", "Read more →": "了解更多 →", - "Read only": "", + "Read only": "只读", "Read Only": "只读", - "Read the docs": "", + "Read the docs": "查看文档", "Read-Only Access": "只读权限", "Reason": "推理", "Reasoning Effort": "推理努力 (Reasoning Effort)", "Reasoning Tags": "推理过程标签", - "Reasoning text...": "推理文本...", - "Rebuild knowledge file, knowledge search, and memory vectors using the current embedding model.": "", - "Rebuild vectors for existing knowledge files, knowledge search, and memories.": "", - "Receives matching events across the instance, including system/config events and events associated with any user.": "", - "Receives matching events that are not associated with a user.": "", - "Receives matching user-associated events only when the actor, user subject, or user data matches these users or current group members. System/config events are not sent.": "", + "Reasoning text...": "推理文本……", + "Rebuild knowledge file, knowledge search, and memory vectors using the current embedding model.": "使用当前嵌入模型重建知识文件、知识搜索和记忆向量。", + "Rebuild vectors for existing knowledge files, knowledge search, and memories.": "为现有知识文件、知识搜索和记忆重建向量。", + "Receives matching events across the instance, including system/config events and events associated with any user.": "接收所有实例中的匹配事件,包括系统/配置事件和与任何用户关联的事件。", + "Receives matching events that are not associated with a user.": "接收与用户无关的匹配事件。", + "Receives matching user-associated events only when the actor, user subject, or user data matches these users or current group members. System/config events are not sent.": "仅当操作者、用户主体或用户数据匹配这些用户或当前组成员时,才接收匹配的用户关联事件。系统/配置事件不会发送。", "Recently Used": "最近使用", - "Recommended": "", + "Recommended": "推荐", "Reconnected": "已重新连接", "Record": "录制", "Record voice": "录音", - "Redirect URI": "", + "Redirect URI": "重定向 URI", "Redirecting you to Open WebUI Community": "正在将您重定向到 Open WebUI 社区", "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)则更加保守。", "Reference Chats": "引用其他对话", "Refresh": "刷新", - "Refresh requested: {{count}} terminal(s)_other": "", - "Refresh Terminals": "", - "Refresh the account email from OAuth on sign-in.": "", - "Refresh the account name from OAuth on sign-in.": "", - "Refresh the profile picture from OAuth on sign-in.": "", - "Refreshing...": "", + "Refresh requested: {{count}} terminal(s)_other": "已请求刷新:{{count}} 个终端", + "Refresh Terminals": "刷新终端", + "Refresh the account email from OAuth on sign-in.": "登录时从 OAuth 刷新账户邮件。", + "Refresh the account name from OAuth on sign-in.": "登录时从 OAuth 刷新账户名称。", + "Refresh the profile picture from OAuth on sign-in.": "登录时从 OAuth 刷新头像。", + "Refreshing...": "正在刷新……", "Refused when it shouldn't have": "拒绝了我的要求", "Regenerate": "重新生成", "Regenerate Menu": "显示重新生成选项菜单", @@ -2216,8 +2216,8 @@ "Registration failed": "注册失败", "Registration successful": "注册成功", "Reindex": "重建索引", - "Reindex Embedding Data": "", - "Reindex Knowledge and Memory Vectors": "", + "Reindex Embedding Data": "重新索引向量嵌入数据", + "Reindex Knowledge and Memory Vectors": "重新索引知识库和记忆向量", "Release Notes": "更新日志", "Releases": "发行版", "Relevance": "相关性", @@ -2227,85 +2227,85 @@ "Remove": "移除", "Remove {{MODELID}} from list.": "从列表中移除 {{MODELID}}", "Remove action": "删除当前操作", - "Remove existing OCR text and rerun OCR when Force OCR is off.": "", + "Remove existing OCR text and rerun OCR when Force OCR is off.": "当强制 OCR 关闭时,移除现有 OCR 文本并重新运行 OCR。", "Remove file": "移除文件", "Remove File": "移除文件", "Remove from favorites": "从收藏中移除", "Remove image": "移除图像", - "Remove Pinned Model": "", - "Remove prompt suggestion": "", - "Remove Selected Model": "", - "Removing {{count}} stale files..._other": "正在移除 {{count}} 个过期文件...", + "Remove Pinned Model": "移除固定模型", + "Remove prompt suggestion": "移除提示词建议", + "Remove Selected Model": "移除已选模型", + "Removing {{count}} stale files..._other": "正在移除 {{count}} 个过期文件……", "Rename": "重命名", "Renamed to {{name}}": "已重命名为 {{name}}", "Render Markdown in Assistant Messages": "在回答消息中渲染 Markdown", "Render Markdown in Previews": "在文件和引用预览中渲染 Markdown", "Render Markdown in User Messages": "在用户消息中渲染 Markdown", - "Render messages in compact bubble containers.": "", - "Repeat": "", + "Render messages in compact bubble containers.": "在紧凑气泡容器中渲染消息。", + "Repeat": "重复", "Reply": "回复", "Reply in Thread": "回复主题", - "Reply to thread...": "回复主题...", + "Reply to thread...": "回复主题……", "Replying to {{NAME}}": "回复 {{NAME}}", - "Request Format": "", - "Require users to confirm before using Web Search.": "", + "Request Format": "请求格式", + "Require users to confirm before using Web Search.": "要求用户在使用网络搜索前确认。", "required": "必填", "Reranking Batch Size": "重排序批次大小", "Reranking Engine": "重新排名引擎", "Reranking Model": "重新排名模型", - "Research Knowledge": "", + "Research Knowledge": "研究知识库", "Reset": "重置", "Reset All Models": "重置所有模型", - "Reset all permissions to their initial configuration values": "", - "Reset Defaults": "", - "Reset group permissions to match the current default user permissions": "", - "Reset knowledge base?": "确认要重置知识库吗?", - "Reset persisted files": "", - "Reset to Defaults": "", + "Reset all permissions to their initial configuration values": "将所有权限重置为初始配置值", + "Reset Defaults": "重置默认值", + "Reset group permissions to match the current default user permissions": "重置组权限以匹配当前默认用户权限", + "Reset knowledge base?": "确定要重置知识库吗?", + "Reset persisted files": "重置已保存文件", + "Reset to Defaults": "重置为默认值", "Reset Upload Directory": "重置上传目录", "Reset Vector Storage/Knowledge": "重置向量存储/知识", "Reset view": "重置视图", - "Reset zoom": "", + "Reset zoom": "重置缩放", "Response": "回答", - "Response Auto-Scroll": "", + "Response Auto-Scroll": "回答自动滚动", "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 Splitting": "回答分段", "Response Watermark": "复制时添加水印", "Responses": "Responses", "Restart": "重启", - "Restrict or exclude domains using a comma-separated list.": "", + "Restrict or exclude domains using a comma-separated list.": "使用逗号分隔的列表限制或排除域名。", "Result": "结果", "RESULT": "结果", - "Retained Messages": "", + "Retained Messages": "保留的消息", "Retrieval": "检索", "Retrieval Query Generation": "检索查询生成", "Retrieved {{count}} sources": "检索到 {{count}} 个引用来源", "Retrieved {{count}} sources_other": "检索到 {{count}} 个引用来源", "Retrieved 1 source": "检索到 1 个引用来源", - "Retry": "", - "Review and manage chats you have shared.": "", - "Rewrite the selected text.": "", - "Rewrite user requests for knowledge retrieval.": "", - "Rewrite user requests into web-search queries.": "", - "Rewrites user intent into an image-generation prompt.": "", + "Retry": "重试", + "Review and manage chats you have shared.": "查看并管理您已共享的对话。", + "Rewrite the selected text.": "重写选定的文本。", + "Rewrite user requests for knowledge retrieval.": "重写用户请求以进行知识检索。", + "Rewrite user requests into web-search queries.": "将用户请求重写为网络搜索查询。", + "Rewrites user intent into an image-generation prompt.": "将用户意图重写为图片生成提示词。", "Rich Text Input for Chat": "富文本对话框", "Role": "角色", - "Role assigned to new users when they create an account.": "", - "Role Mapping": "", - "Roles Claim": "", + "Role assigned to new users when they create an account.": "新用户创建账户时分配的角色。", + "Role Mapping": "角色映射", + "Roles Claim": "角色声明", "RTL": "从右至左", "Run": "运行", - "Run AI on your own terms. Connect any model, extend with code, and protect what matters without compromise. Your models, your data, your machine, wherever you open it.": "", + "Run AI on your own terms. Connect any model, extend with code, and protect what matters without compromise. Your models, your data, your machine, wherever you open it.": "按您的方式运行 AI。连接任何模型,用代码扩展,毫不妥协地保护有价值的内容。您的模型、您的数据、您的机器,随时随地开启。", "Run All": "运行全部", - "Run embedding tasks concurrently to speed up processing.": "", + "Run embedding tasks concurrently to speed up processing.": "并发运行向量嵌入任务以加速处理。", "Run now": "立即运行", "Run Now": "立即运行", - "Run OCR on all PDF pages, even pages with embedded text.": "", + "Run OCR on all PDF pages, even pages with embedded text.": "对所有 PDF 页执行 OCR,包括含有嵌入文本的页。", "Running": "运行中", - "Running Open WebUI for a team?": "", - "Running...": "运行中...", - "runs": "", - "Runs": "", + "Running Open WebUI for a team?": "为团队运行 Open WebUI?", + "Running...": "运行中……", + "runs": "运行", + "Runs": "运行记录", "Sa_day_of_week": "周六", "Save": "保存", "Save & Create": "保存并创建", @@ -2313,33 +2313,33 @@ "Save As Copy": "另存为副本", "Save Chat": "保存对话", "Saved": "已保存", - "Saved Memories": "", + "Saved Memories": "已保存的记忆", "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": "我们不再支持将对话记录直接保存到浏览器的存储空间。请点击下面的按钮下载并删除您的对话记录。别担心,您可以轻松将对话记录重新导入到后台。", - "Saving...": "", + "Saving...": "正在保存……", "Schedule": "定时", "Scheduled time must be in the future": "定时时间必须晚于当前时间", - "Scopes": "", + "Scopes": "作用域", "Scroll On Branch Change": "切换对话分支时滚动到最新回答", - "Scroll to bottom": "", - "Scroll to the active branch when switching response branches.": "", + "Scroll to bottom": "滚动到底部", + "Scroll to the active branch when switching response branches.": "切换回答分支时滚动到活跃分支。", "Scroll to Top": "回到顶部", "Search": "搜索", "Search a model": "搜索模型", - "Search actions": "", + "Search actions": "搜索操作", "Search all emojis": "搜索 Emoji", "Search and manage user memories": "搜索和管理用户记忆", "Search and view user chat history": "搜索和查看用户对话历史", "Search Automations": "搜索自动化任务", "Search Base": "搜索库", - "Search channels": "", + "Search channels": "搜索频道", "Search channels and channel messages": "搜索频道和频道消息", "Search Chats": "搜索对话", "Search Collection": "搜索内容", "Search Files": "搜索文件", - "Search files and contents": "", - "Search filters": "", + "Search files and contents": "搜索文件和内容", + "Search filters": "搜索过滤器", "Search Filters": "搜索过滤器", - "Search folders": "", + "Search folders": "搜索文件夹", "search for archived chats": "搜索已归档的对话", "search for folders": "搜索分组", "search for pinned chats": "搜索已置顶的对话", @@ -2349,21 +2349,21 @@ "Search Groups": "搜索用户组", "Search In Models": "搜索模型", "Search Knowledge": "搜索知识", - "Search Limits": "", + "Search Limits": "搜索限制", "Search Memories": "搜索记忆", "Search Models": "搜索模型", "Search Notes": "搜索笔记", "Search options": "搜索选项", - "Search or add pattern": "", + "Search or add pattern": "搜索或添加模式", "Search Prompts": "搜索提示词", "Search Result Count": "搜索结果数量", - "Search skills": "", + "Search skills": "搜索技能", "Search Skills": "搜索技能", "Search the internet": "联网搜索", "Search the web and fetch URLs": "搜索网络并获取网页内容", - "Search tools": "", + "Search tools": "搜索工具", "Search Tools": "搜索工具", - "Search users or groups": "", + "Search users or groups": "搜索用户或组", "Search, view, and manage user notes": "搜索、查看和管理用户笔记", "SearchApi API Key": "SearchApi 接口密钥", "SearchApi Engine": "SearchApi 引擎", @@ -2371,16 +2371,16 @@ "Searching": "搜索中", "Searching \"{{searchQuery}}\"": "搜索 \"{{searchQuery}}\" 中", "Searching Knowledge for \"{{searchQuery}}\"": "检索有关 \"{{searchQuery}}\" 的知识中", - "Searching the web": "正在搜索网络...", + "Searching the web": "正在搜索网络……", "Searxng Query URL": "Searxng 查询接口地址", "Searxng search language (all, en, es, de, fr, etc.)": "Searxng 搜索语言 (例如:all, en, es, de, fr 等)", - "Secrets": "", + "Secrets": "机密信息", "See readme.md for instructions": "查看 readme.md 以获取说明", "See what's new": "查阅最新更新内容", "Seed": "种子 (Seed)", "Select": "选择", "Select {{modelName}} model": "选择模型 “{{modelName}}”", - "Select a .py file": "", + "Select a .py file": "选择一个 .py 文件", "Select a base model (e.g. llama3, gpt-4o)": "选择一个基础模型(例如:llama3, gpt-4o)", "Select a conversation to preview": "选择对话进行预览", "Select a engine": "选择搜索引擎", @@ -2397,85 +2397,85 @@ "Select a theme": "选择主题", "Select a tool": "选择工具", "Select a voice": "选择声音", - "Select Action": "", + "Select Action": "选择操作", "Select All": "全选", "Select an auth method": "选择身份验证方式", "Select an embedding model engine": "选择嵌入模型引擎", "Select an engine": "选择引擎", - "Select an installed pipeline to configure or remove.": "", - "Select an instance": "", + "Select an installed pipeline to configure or remove.": "选择一个已安装的 Pipeline 进行配置或移除。", + "Select an instance": "选择一个实例", "Select an Ollama instance": "选择 Ollama 实例", "Select an option": "请选择", "Select an output format": "选择输出格式", "Select dtype": "选择数据类型(Dtype)", "Select Engine": "选择引擎", - "Select Filter": "", - "Select how audio is sent to the OpenAI-compatible endpoint.": "", - "Select how Open WebUI authenticates with the Jupyter server.": "", + "Select Filter": "选择过滤器", + "Select how audio is sent to the OpenAI-compatible endpoint.": "选择音频发送到兼容 OpenAI 端点的方式。", + "Select how Open WebUI authenticates with the Jupyter server.": "选择 Open WebUI 与 Jupyter 服务器的认证方式。", "Select how to split message text for TTS requests": "选择消息文本拆分方法,用于 TTS 请求。", "Select Knowledge": "选择知识", "Select Method": "选择方法", "Select model": "选择模型", "Select only one model to call": "只允许选择一个模型进行语音通话", - "Select options": "", - "Select Skill": "", - "Select the Gemini endpoint method to call.": "", - "Select the local model precision used by Kokoro.js.": "", - "Select the Pipelines server to manage.": "", - "Select the Tika server API version.": "", - "Select Tool": "", + "Select options": "选择选项", + "Select Skill": "选择技能", + "Select the Gemini endpoint method to call.": "选择要调用的 Gemini 端点方法。", + "Select the local model precision used by Kokoro.js.": "选择 Kokoro.js 使用的本地模型精度。", + "Select the Pipelines server to manage.": "选择要管理的 Pipelines 服务器。", + "Select the Tika server API version.": "选择 Tika 服务器 API 版本。", + "Select Tool": "选择工具", "Select view": "选择视图", - "Selected": "", + "Selected": "已选择", "Selected model: {{modelName}}": "已选择:{{modelName}}", "Selected model(s) do not support image inputs": "所选择的模型不支持处理图像", - "Selected models define incompatible Chat Variables.": "", + "Selected models define incompatible Chat Variables.": "已选模型定义了不兼容的对话变量。", "semantic": "语义", "Send": "发送", "Send a Message": "输入消息", - "Send events for": "", - "Send extra JSON parameters with each AUTOMATIC1111 request.": "", - "Send extra JSON parameters with each image generation request.": "", + "Send events for": "发送事件的范围", + "Send extra JSON parameters with each AUTOMATIC1111 request.": "在每个 AUTOMATIC1111 请求中发送附加 JSON 参数。", + "Send extra JSON parameters with each image generation request.": "在每个图片生成请求中发送附加 JSON 参数。", "Send message": "发送消息", - "Send notifications to configured webhook targets": "", + "Send notifications to configured webhook targets": "发送通知到配置的 webhook 目标", "Send now": "立即发送", - "Send PDFs as base64 data URLs instead of uploading first.": "", - "Send product events as JSON to external services. Chat destinations receive readable messages.": "", - "Send Test": "", - "Send transcribed voice input immediately after speech recognition finishes.": "", - "Send users directly to the OAuth provider from the sign-in page.": "", + "Send PDFs as base64 data URLs instead of uploading first.": "将 PDF 以 base64 数据 URL 发送,而不是先上传。", + "Send product events as JSON to external services. Chat destinations receive readable messages.": "将产品事件以 JSON 格式发送到外部服务。对话目标接收可读消息。", + "Send Test": "发送测试", + "Send transcribed voice input immediately after speech recognition finishes.": "在语音识别完成后立即发送转录的语音输入。", + "Send users directly to the OAuth provider from the sign-in page.": "从登录页直接发送用户到 OAuth 服务提供商。", "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 }`。启用此设置后,支持的提供商将在响应中返回 Token 用量信息。", - "Separate output by page with page markers.": "", + "Separate output by page with page markers.": "使用页面标记按页分离输出。", "September": "九月", "SerpApi API Key": "SerpApi 接口密钥", "SerpApi Engine": "SerpApi 引擎", "Serper API Key": "Serper 接口密钥", - "SERPHouse API Key": "", - "SERPHouse Domain": "", + "SERPHouse API Key": "SERPHouse API 密钥", + "SERPHouse Domain": "SERPHouse 域名", "Serply API Key": "Serply 接口密钥", "Serpstack API Key": "Serpstack 接口密钥", "Server connection failed": "服务器连接失败", "Server connection verified": "已验证服务器连接", - "Service Account": "", + "Service Account": "服务账户", "Session": "用户会话(Session)", - "Session expired. Please sign in again.": "", - "Set a local zoom level for the app interface.": "", - "Set a model-specific context compaction token threshold. When set, this overrides the global threshold up to the global cap.": "", - "Set a speech recognition language or leave it blank to detect automatically.": "", + "Session expired. Please sign in again.": "会话已过期。请重新登录。", + "Set a local zoom level for the app interface.": "设置应用界面的本地缩放级别。", + "Set a model-specific context compaction token threshold. When set, this overrides the global threshold up to the global cap.": "设置模型特定的上下文压缩 token 阈值。设置后将覆盖全局阈值(不超过全局上限)。", + "Set a speech recognition language or leave it blank to detect automatically.": "设置语音识别语言,或留空以自动检测。", "Set as default": "设为默认", - "Set as Pinned Model": "", + "Set as Pinned Model": "设为固定模型", "Set as Production": "设为当前使用版本", - "Set as Selected Model": "", + "Set as Selected Model": "设为已选模型", "Set embedding model": "设置嵌入模型", "Set embedding model (e.g. {{model}})": "设置嵌入模型(例如:{{model}})", "Set reranking model (e.g. {{model}})": "设置重排序模型(例如:{{model}})", - "Set system-wide interface defaults for every account. Personal settings override these defaults.": "", - "Set the birth date saved with your profile.": "", - "Set the default system prompt for new chats.": "", - "Set the display name shown across your account.": "", + "Set system-wide interface defaults for every account. Personal settings override these defaults.": "为每个账户设置系统级界面默认值。个人设置将覆盖这些默认值。", + "Set the birth date saved with your profile.": "设置保存在您个人资料中的出生日期。", + "Set the default system prompt for new chats.": "设置新对话的默认系统提示词。", + "Set the display name shown across your account.": "设置您账户中显示的显示名。", "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": "设置音色", - "Set web search availability for new chats.": "", + "Set web search availability for new chats.": "设置新对话的网络搜索可用性。", "Set whisper model": "设置 whisper 模型", "Set your status": "设置您的状态", "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.": "对至少出现过一次的标记设置固定偏置值。较高的值(例如 1.5)表示严厉惩罚重复,而较低的值(例如 0.9)则表示相对宽松。当值为 0 时,此功能将被禁用。", @@ -2486,49 +2486,49 @@ "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.": "设置要使用的停止序列。在该模式下,大语言模型将停止生成文本并返回。可以通过在模型文件中指定多个单独的停止参数来设置多个停止模式。", "Setting": "设置", "Settings": "设置", - "settings configured": "", + "settings configured": "已配置的设置", "Settings Permissions": "设置权限", "Settings saved successfully!": "设置已成功保存!", - "Shapes the short label generated for each chat.": "", + "Shapes the short label generated for each chat.": "决定为每个对话生成的短标签。", "Share": "分享", "Share Chat": "分享对话", "Share link copied to clipboard.": "分享链接已复制到剪贴板。", "Share to Open WebUI Community": "分享到 Open WebUI 社区", "Share your background and interests": "分享您的经历和兴趣爱好", - "Share your current location with features that can use it.": "", - "Shared": "", + "Share your current location with features that can use it.": "和可以使用它的功能分享您的当前位置。", + "Shared": "已分享", "Shared Chats": "已分享的对话", - "Shared prompt for retrieval and web-search query rewriting.": "", + "Shared prompt for retrieval and web-search query rewriting.": "用于检索和网络搜索查询重写的共享提示词。", "Shared with you": "已共享给您", "Sharing Permissions": "共享权限", "Show": "显示", "Show \"What's New\" Modal on Login": "版本更新后首次登录时显示“新功能介绍”弹窗", - "Show a floating preview of recent messages when hovering a chat in the sidebar.": "", - "Show admin contact details while an account waits for approval.": "", + "Show a floating preview of recent messages when hovering a chat in the sidebar.": "在侧边栏悬停对话时显示近期消息的浮动预览。", + "Show admin contact details while an account waits for approval.": "在账户等待审核时显示管理员联系方式。", "Show All": "显示全部", "Show all ({{COUNT}} characters)": "显示全部(共 {{COUNT}} 字符)", - "Show emoji feedback in the call interface.": "", + "Show emoji feedback in the call interface.": "在通话界面中显示表情反馈。", "Show Files": "显示文件", - "Show Files on Terminal Select": "", - "Show formatting controls in the rich text composer.": "", + "Show Files on Terminal Select": "选择终端时显示文件", + "Show formatting controls in the rich text composer.": "在富文本编辑器中显示格式化控件。", "Show Formatting Toolbar": "显示文本格式工具栏", - "Show Full access and Ask for approval in the chat input menu.": "", - "Show Hidden Files": "", + "Show Full access and Ask for approval in the chat input menu.": "在对话输入菜单中显示“完全访问”和“请求审批”。", + "Show Hidden Files": "显示隐藏文件", "Show image preview": "显示图像预览", "Show Model": "显示模型", - "Show more": "", - "Show or hide custom generation parameters.": "", - "Show or hide sensitive account secrets.": "", + "Show more": "显示更多", + "Show or hide custom generation parameters.": "显示或隐藏自定义生成参数。", + "Show or hide sensitive account secrets.": "显示或隐藏敏感的账户机密信息。", "Show Shortcuts": "显示快捷键", - "Show suggested next questions after assistant responses.": "", - "Show the floating quick-action toolbar in chat.": "", - "Show the regenerate action menu for assistant responses.": "", - "Show update toasts to admins when new versions are available.": "", - "Show user status information in the app.": "", + "Show suggested next questions after assistant responses.": "在助手回答后显示建议的下一个问题。", + "Show the floating quick-action toolbar in chat.": "在对话中显示浮动快捷操作工具栏。", + "Show the regenerate action menu for assistant responses.": "显示助手回答的重生操作菜单。", + "Show update toasts to admins when new versions are available.": "当有新版本可用时向管理员显示更新提示。", + "Show user status information in the app.": "在应用中显示用户状态信息。", "Show your support!": "表达您的支持!", - "Show your username label instead of You in chat bubbles.": "", + "Show your username label instead of You in chat bubbles.": "在对话气泡中显示您的用户名标签,而不是“您”。", "Showcased creativity": "很有创意", - "Sidebar": "", + "Sidebar": "侧边栏", "Sign in": "登录", "Sign in to {{WEBUI_NAME}}": "登录 {{WEBUI_NAME}}", "Sign in to {{WEBUI_NAME}} with LDAP": "使用 LDAP 登录 {{WEBUI_NAME}}", @@ -2536,10 +2536,10 @@ "Sign up": "注册", "Sign up to {{WEBUI_NAME}}": "注册 {{WEBUI_NAME}}", "Signing in to {{WEBUI_NAME}}": "正在登录 {{WEBUI_NAME}}", - "simultaneous sub-agents": "", + "simultaneous sub-agents": "同时运行的子代理", "Single": "单文档模式", "Sink List": "下移列表", - "Size": "", + "Size": "大小", "sk-1234": "sk-1234", "Skill created successfully": "技能创建成功", "Skill deleted successfully": "技能删除成功", @@ -2547,7 +2547,7 @@ "Skill ID": "技能 ID", "Skill imported successfully": "技能导入成功", "Skill Instructions": "技能说明", - "Skill Menu": "", + "Skill Menu": "技能菜单", "Skill Name": "技能名称", "Skill updated successfully": "技能更新成功", "Skills": "技能", @@ -2555,8 +2555,8 @@ "Skills Public Sharing": "公开分享“技能”", "Skills Sharing": "分享“技能”", "Skip Cache": "跳过缓存", - "Skip cached Marker results and rerun inference.": "", - "Skip to main content": "", + "Skip cached Marker results and rerun inference.": "跳过 Marker 的缓存结果并重新执行推理。", + "Skip to main content": "跳转到主要内容", "Something went wrong :/": "发生错误", "Sonar": "Sonar", "Sonar Deep Research": "Sonar Deep Research", @@ -2567,22 +2567,22 @@ "Sougou Search API sID": "搜狗搜索接口 Secret ID", "Sougou Search API SK": "搜狗搜索接口 Secret 密钥", "Source": "来源", - "Specific users or groups": "", + "Specific users or groups": "特定用户或组", "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 character or token splitting.": "", - "Sponsor on GitHub": "", + "Split documents by markdown headers before character or token splitting.": "在字符或 token 切割之前,按 markdown 标题分割文档。", + "Sponsor on GitHub": "在 GitHub 上赞助", "Start a new conversation": "开始新对话", - "Start new chats as temporary unless changed.": "", + "Start new chats as temporary unless changed.": "默认创建临时对话,除非更改设置。", "Start of the channel": "频道起点", "Start Tag": "起始标签", - "Start the chat to use this terminal.": "", + "Start the chat to use this terminal.": "开始对话以使用此终端。", "Starting in {{count}} minutes_other": "{{count}} 分钟后开始", "Starting in 1 minute": "1 分钟后开始", - "Starting kernel...": "正在启动内核...", + "Starting kernel...": "正在启动内核……", "Starting now": "现在开始", "Status": "状态", "Status cleared successfully": "状态已清除", @@ -2591,7 +2591,7 @@ "STDOUT/STDERR": "标准输出/标准错误", "Steps": "迭代步数", "Stop": "停止", - "Stop camera": "", + "Stop camera": "停止摄像头", "Stop Download": "停止下载", "Stop Generating": "停止生成", "Stop Sequence": "停止序列 (Stop Sequence)", @@ -2605,26 +2605,26 @@ "STT Settings": "语音转文本设置", "Stylized PDF Export": "美化 PDF 导出", "Su_day_of_week": "周日", - "Sub Claim": "", - "Sub-agents": "", - "Submit answers": "", + "Sub Claim": "子声明", + "Sub-agents": "子代理", + "Submit answers": "提交答案", "Submit question": "提交问题", "Submit suggestion": "提交建议", "Subtitle": "副标题", "Success": "成功", "Successfully imported {{userCount}} users.": "成功导入 {{userCount}} 个用户。", "Suggest a change": "提出修改建议", - "Suggest completions while composing prompts.": "", - "Suggest completions while users type chat messages.": "", + "Suggest completions while composing prompts.": "在编辑提示词时提供补全建议。", + "Suggest completions while users type chat messages.": "在用户输入对话消息时提供补全建议。", "Suggested": "建议", - "Suggested prompts": "", - "Summarize older chat history when the conversation context grows large.": "", - "Summarize this note.": "", + "Suggested prompts": "建议的提示词", + "Summarize older chat history when the conversation context grows large.": "当对话上下文过大时,摘要成更旧的对话历史。", + "Summarize this note.": "摘要此笔记。", "Support": "支持", "Support this plugin:": "支持此插件", - "Supported Media MIME Types": "", + "Supported Media MIME Types": "支持的媒体 MIME 类型", "Supported MIME Types": "支持的 MIME 类型", - "Switch camera": "", + "Switch camera": "切换摄像头", "Switch to JSON editor": "切换到 JSON 编辑器", "Switch to visual editor": "切换到可视化编辑器", "Sync": "同步", @@ -2634,15 +2634,15 @@ "Sync directory": "同步目录", "Sync Failed": "同步失败", "Sync Usage Stats": "同步使用统计数据", - "Syncing stats...": "同步统计数据...", - "Syncing...": "同步中...", + "Syncing stats...": "同步统计数据……", + "Syncing...": "同步中……", "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "仅同步自上次同步时间点后有更新的对话;关闭后将重新同步全部对话。", "System": "系统", - "System events only": "", + "System events only": "仅系统事件", "System Instructions": "系统指令", - "System prompt": "", + "System prompt": "系统提示词", "System Prompt": "系统提示词", - "Table": "", + "Table": "表格", "Tag": "标签", "Tags": "标签", "Tags Generation": "标签生成", @@ -2650,12 +2650,12 @@ "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.": "无尾采样用于减少输出中出现概率较小的 Token 的影响。较高的值(例如 2.0)将进一步减少影响,而值 1.0 则禁用此设置。", "Talk to Model": "与模型对话", "Tap to interrupt": "点击以中断", - "Target ID": "", - "Target ID for notify": "", + "Target ID": "目标 ID", + "Target ID for notify": "通知目标 ID", "Task List": "任务列表", "Task Management": "任务管理", "Task Model": "任务模型", - "Task Model Parameters": "", + "Task Model Parameters": "任务模型参数", "Tasks": "任务", "tasks completed": "项任务已完成", "Tavily API Key": "Tavily 接口密钥", @@ -2665,19 +2665,19 @@ "Temporary Chat": "临时对话", "Temporary Chat by Default": "默认使用临时对话", "Terminal": "终端", - "Terminal Contexts": "", - "Terminal File Display": "", - "Terminal Preview Allow Same Origin": "", + "Terminal Contexts": "终端上下文", + "Terminal File Display": "终端文件显示", + "Terminal Preview Allow Same Origin": "终端预览允许同源", "Terminal servers saved": "终端服务器已保存", - "Test": "", - "Test must pass before a source is created.": "", - "Test notification sent.": "", - "Test Query": "", - "Test returned no results.": "", - "Test succeeded.": "", - "Test the source before creating it.": "", - "Test the source before saving it.": "", - "Text output format returned by Marker.": "", + "Test": "测试", + "Test must pass before a source is created.": "在创建来源之前必须通过测试。", + "Test notification sent.": "测试通知已发送。", + "Test Query": "测试查询", + "Test returned no results.": "测试未返回结果。", + "Test succeeded.": "测试成功。", + "Test the source before creating it.": "创建来源前请先测试。", + "Test the source before saving it.": "保存来源前请先测试。", + "Text output format returned by Marker.": "Marker 返回的文本输出格式。", "Text Splitter": "文本切分器", "Text-to-Speech": "文本转语音", "Text-to-Speech Engine": "文本转语音引擎", @@ -2692,24 +2692,24 @@ "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.": "输入音频的语言。以 ISO-639-1 语言编码格式(例如:en)指定输入语言可提高准确性和响应速度。留空则自动检测语言。", "The LDAP attribute that maps to the mail that users use to sign in.": "映射到用户登录时使用的邮箱的 LDAP 属性。", "The LDAP attribute that maps to the username that users use to sign in.": "映射到用户登录时使用的用户名的 LDAP 属性。", - "The notify tool always sends to an enabled target, regardless of automatic event settings.": "", + "The notify tool always sends to an enabled target, regardless of automatic event settings.": "通知工具始终发送到已启用的目标,无论自动事件设置如何。", "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 temperature of the model. Increasing the temperature will make the model answer more creatively.": "模型的温度。增加温度将使模型的回答更有创意。", "Theme": "主题", "There was an error syncing your stats. Please try again.": "同步使用统计数据时发生错误。请稍后重试。", - "These settings are read from environment variables and cannot be edited here while {{ENV_VAR}} is disabled.": "", - "thinking, output_config": "", - "Thinking...": "正在思考...", - "This action cannot be undone. Do you wish to continue?": "此操作无法撤销。您确认要继续吗?", + "These settings are read from environment variables and cannot be edited here while {{ENV_VAR}} is disabled.": "这些设置从环境变量读取,在 {{ENV_VAR}} 禁用时无法在此处编辑。", + "thinking, output_config": "thinking, output_config", + "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.": "欢迎来到 {{channelName}},本频道创建于 {{createdAt}}。", "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 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 knowledge base retrieves from a connected source. Open WebUI can query it, but cannot upload, sync, edit, delete, reset, or reindex its source data.": "", + "This knowledge base retrieves from a connected source. Open WebUI can query it, but cannot upload, sync, edit, delete, reset, or reindex its source data.": "此知识库从已连接的源检索数据。Open WebUI 可以查询它,但无法上传、同步、编辑、删除、重置或重建其源数据的索引。", "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)": "此选项用于控制模型在收到请求后,保持常驻内存的时长(默认:5 分钟)", "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.": "此选项控制刷新上下文时保留多少 Token。例如,如果设置为 2,则将保留对话上下文的最后 2 个 Token。保留上下文有助于保持对话的连续性,但可能会降低响应新主题的能力。", @@ -2720,30 +2720,30 @@ "This will delete": "这将删除", "This will delete {{NAME}} and all its contents.": "这将删除{{NAME}}及其所有内容。", "This will delete all models including custom models and cannot be undone.": "这将删除所有模型,包括自定义模型,且无法撤销。", - "This will delete the cached model and cannot be undone.": "", + "This will delete the cached model and cannot be undone.": "这将删除缓存的模型,此操作无法撤销。", "This will permanently delete the calendar \"{{name}}\" and all its events. This action cannot be undone.": "这将永久删除日程“{{name}}”及其所有事件。此操作无法撤销。", "This will remove all files and directories from this knowledge base. This action cannot be undone.": "这将移除此知识库中的所有文件和目录。此操作无法撤销。", - "This will revoke the current API key.": "", + "This will revoke the current API key.": "这将撤销当前的 API 密钥。", "Thorough explanation": "解释详尽", "Thought": "思考过程", "Thought for {{DURATION}}": "思考用时 {{DURATION}}", "Thought for {{DURATION}} seconds": "思考用时 {{DURATION}} 秒", "Thought for less than a second": "思考用时小于 1 秒", "Thread": "主题", - "Through": "", + "Through": "通过", "Thumbs up/down ratings from users on model responses": "用户对模型回答的赞/踩评价", "Tika": "Tika", - "Tika 3.x": "", - "Tika 4.x": "", - "Tika server endpoint used for content extraction.": "", - "Tika Server URL": "", + "Tika 3.x": "Tika 3.x", + "Tika 4.x": "Tika 4.x", + "Tika server endpoint used for content extraction.": "用于内容提取的 Tika 服务器端点。", + "Tika Server URL": "Tika 服务器 URL", "Tika Server URL required.": "请输入 Tika 服务器接口地址", - "Tika Server Version": "", + "Tika Server Version": "Tika 服务器版本", "Tiktoken": "Tiktoken", "Time": "时间", "Time & Calculation": "时间和计算", "Timeout": "超时时间", - "Timer": "", + "Timer": "计时器", "Title": "标题", "Title Auto-Generation": "自动生成标题", "Title cannot be an empty string.": "标题不能为空", @@ -2751,56 +2751,56 @@ "Title Generation Prompt": "用于自动生成标题的提示词", "Title is required": "标题为必填项。", "TLS": "TLS", - "TLS cipher list for LDAP connections.": "", + "TLS cipher list for LDAP connections.": "用于 LDAP 连接的 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.": "请联系管理员获取访问权限。管理员可以在后台管理面板中管理用户状态。", "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "如需在此处附加知识库,请先将其添加到工作空间中的“知识库”中", "To learn more about available endpoints, visit our documentation.": "如需了解更多关于可用端点的信息,请访问我们的文档", - "To learn more about SpeechT5,": "", - "To see the available CMU Arctic speaker embeddings,": "", - "To select actions here, add them to the \"Functions\" workspace first.": "", - "To select default filters here, enable toggleable filters for this model first.": "", - "To select filters here, add them to the \"Functions\" workspace first.": "", + "To learn more about SpeechT5,": "要了解更多关于 SpeechT5 的信息,", + "To see the available CMU Arctic speaker embeddings,": "要查看可用的 CMU Arctic 语音嵌入,", + "To select actions here, add them to the \"Functions\" workspace first.": "要在此处选择操作,请先将它们添加到“函数”工作区。", + "To select default filters here, enable toggleable filters for this model first.": "要在此处选择默认过滤器,请先为此模型启用可切换的过滤器。", + "To select filters here, add them to the \"Functions\" workspace first.": "要在此处选择过滤器,请先将它们添加到“函数”工作区。", "To select skills here, add them to the \"Skills\" workspace first.": "若要在此选择技能,请先将其添加到“技能”工作空间中", - "To select toolkits here, add them to the \"Tools\" workspace or enable a tool server first.": "", + "To select toolkits here, add them to the \"Tools\" workspace or enable a tool server first.": "要在此处选择工具包,请先将它们添加到“工具”工作区或启用工具服务器。", "Toast Notifications for New Updates": "检测到新版本时显示更新通知", "Today": "今天", "Today at": "今天", "Toggle {{COUNT}} sources": "展开/收起 {{COUNT}} 个来源", "Toggle 1 source": "展开/收起 1 个来源", - "Toggle Controls": "", + "Toggle Controls": "切换控件", "Toggle details": "展开/收起详情", "Toggle Dictation": "切换为听写模式", - "Toggle Mute": "", + "Toggle Mute": "切换静音", "Toggle Sidebar": "展开或收起侧边栏", "Toggle status history": "展开/收起历史状态", "Toggle whether current connection is active.": "切换当前连接的启用状态", "Token": "Token", - "Token activity": "", - "Token Cap": "", + "Token activity": "Token 活动", + "Token Cap": "Token 上限", "Token counts are estimates and may not reflect actual API usage": "Token 数为估算值,可能与实际接口用量不一致", - "Token Threshold": "", - "Tokenizer Model": "", - "Tokenizer model used for transformer token splitting.": "", + "Token Threshold": "Token 阈值", + "Tokenizer Model": "分词模型 (Tokenizer Model)", + "Tokenizer model used for transformer token splitting.": "用于 transformer token 切割的分词模型。", "tokens": "tokens", "Tokens": "Tokens", "Too verbose": "过于冗长", - "tool": "", + "tool": "工具", "Tool created successfully": "工具创建成功", "Tool deleted successfully": "工具删除成功", "Tool Description": "工具描述", "Tool ID": "工具 ID", "Tool imported successfully": "工具导入成功", - "tool loops per sub-agent": "", - "Tool Menu": "", + "tool loops per sub-agent": "每个子代理的工具循环次数", + "Tool Menu": "工具菜单", "Tool Name": "工具名称", - "Tool Permissions": "", + "Tool Permissions": "工具权限", "Tool Servers": "工具服务器", "Tool updated successfully": "工具更新成功", "Tools": "工具", "Tools Access": "访问工具", - "Tools can execute arbitrary code.": "", + "Tools can execute arbitrary code.": "工具可以执行任意代码。", "Tools Function Calling Prompt": "工具函数调用提示词", "Tools have a function calling system that allows arbitrary code execution.": "注意:工具有权执行任意代码", "Tools Public Sharing": "工具公开分享", @@ -2808,8 +2808,8 @@ "Top": "置顶", "Top K": "Top K", "Top K Reranker": "Top K Reranker", - "Top models": "", - "Total chats": "", + "Top models": "热门模型", + "Total chats": "总对话数", "Transformers": "Transformers", "Trouble accessing Ollama?": "访问 Ollama 时遇到问题?", "Trust Proxy Environment": "信任代理环境", @@ -2820,43 +2820,43 @@ "TTS Voice": "文本转语音音色", "Tu_day_of_week": "周二", "Type": "类型", - "Type a model ref": "", - "Type here...": "请输入内容...", + "Type a model ref": "输入模型引用", + "Type here...": "请输入内容……", "Type Hugging Face Resolve (Download) URL": "输入 Hugging Face 模型解析(下载)地址", - "Type your answer": "", + "Type your answer": "输入您的答案", "Uh-oh! There was an issue with the response.": "抱歉,模型回答失败,请重试。", "UI": "界面", "UI Scale": "界面缩放比例", "Unarchive All": "取消所有存档", "Unarchive Chat": "取消存档当前对话", - "Unassigned": "", + "Unassigned": "未分配", "Underline": "下划线", - "unknown": "", + "unknown": "未知", "Unknown": "未知", "Unknown User": "未知用户", - "Unload Model": "", + "Unload Model": "卸载模型", "Unloads {{FROM_NOW}}": "{{FROM_NOW}} 后卸载", "Unmute": "取消静音", "Unpin": "取消置顶", "Unpin from Sidebar": "从侧边栏取消固定", - "Unread": "", - "Unshare All": "", - "Unshare All Shared Chats": "", + "Unread": "未读", + "Unshare All": "取消全部共享", + "Unshare All Shared Chats": "取消所有已共享的对话", "Unshare Chat": "取消分享对话", "Unsupported file type.": "不支持的文件类型", "Untagged": "无标签", "Untitled": "无标题", "Update": "更新", - "Update All Models": "", + "Update All Models": "更新所有模型", "Update and Copy Link": "更新和复制链接", - "Update Email": "", - "Update embedding model": "", + "Update Email": "更新邮件", + "Update embedding model": "更新向量嵌入模型", "Update for the latest features and improvements.": "更新以获取最新功能与优化", - "Update model": "", - "Update Name": "", + "Update model": "更新模型", + "Update Name": "更新名称", "Update password": "更新密码", - "Update Picture": "", - "Update the password used for email and password sign-in.": "", + "Update Picture": "更新头像", + "Update the password used for email and password sign-in.": "更新用于邮件和密码登录的密码。", "Update your status": "更新您的状态", "Updated": "已更新", "Updated at": "更新于", @@ -2864,21 +2864,21 @@ "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "升级到授权套餐以获得增强功能,包括自定义主题、品牌推广以及专属支持", "Upload": "上传", "Upload a GGUF model": "上传一个 GGUF 模型", - "Upload a local Python pipeline file to the selected server.": "", - "Upload a workflow.json file exported as API format from ComfyUI.": "", + "Upload a local Python pipeline file to the selected server.": "将本地 Python Pipeline 文件上传到所选服务器。", + "Upload a workflow.json file exported as API format from ComfyUI.": "上传从 ComfyUI 导出为 API 格式的 workflow.json 文件。", "Upload Audio": "上传音频", "Upload directory": "上传目录", - "Upload failed": "", + "Upload failed": "上传失败", "Upload files": "上传文件", "Upload Files": "上传文件", "Upload Model": "上传模型", - "Upload or reset the image shown behind chat content.": "", - "Upload Photo": "", + "Upload or reset the image shown behind chat content.": "上传或重置对话内容背景图片。", + "Upload Photo": "上传照片", "Upload Pipeline": "上传 Pipeline", "Upload profile image": "上传头像", "Upload Progress": "上传进度", "Uploaded files or images": "上传的文件或图片", - "Uploading": "", + "Uploading": "正在上传", "Uploading {{current}}/{{total}}: {{file}}": "正在上传 {{current}}/{{total}}:{{file}}", "Uploading...": "正在上传中…", "URL": "URL", @@ -2887,81 +2887,81 @@ "Usage": "用量", "Use": "使用", "Use /v1/chat/completions endpoint instead of /v1/audio/transcriptions for potentially better accuracy.": "使用 /v1/chat/completions 接口替换 /v1/audio/transcriptions 以提高准确性。", - "Use a Gemini API key for image generation.": "", - "Use a valid event name or pattern like user.*": "", - "Use a wider chat layout on large displays.": "", - "Use an API key when your ComfyUI server requires one.": "", - "Use an LLM to improve tables, forms, math, and layout detection.": "", - "Use Base64": "", + "Use a Gemini API key for image generation.": "使用 Gemini API 密钥生成图片。", + "Use a valid event name or pattern like user.*": "使用有效的事件名或模式,如 user.*", + "Use a wider chat layout on large displays.": "在大屏幕上使用更宽的对话布局。", + "Use an API key when your ComfyUI server requires one.": "当您的 ComfyUI 服务器需要时使用 API 密钥。", + "Use an LLM to improve tables, forms, math, and layout detection.": "使用 LLM 提高表格、表单、数学和布局检测的效果。", + "Use Base64": "使用 Base64", "Use Chat Completions API": "使用 Chat Completions 接口", - "Use device vibration feedback on supported Android devices.": "", - "Use discovered scopes": "", + "Use device vibration feedback on supported Android devices.": "在支持的 Android 设备上使用震动反馈。", + "Use discovered scopes": "使用发现的作用域", "Use groups to organize your users and assign permissions.": "使用用户组来管理用户并分配权限。", "Use LLM": "使用大语言模型(LLM)", - "Use proxy environment variables to fetch page contents.": "", - "Use search results without fetching page contents.": "", - "Use segmented retrieval for focused and relevant content extraction.": "", - "Use segmented retrieval for focused and relevant context.": "", - "Use segmented retrieval for focused context.": "", - "Use styled formatting when exporting chats to PDF.": "", - "Use the active chat title as the browser tab title.": "", - "Use the rich composer instead of a plain textarea.": "", - "Use these in model system prompts as {{example}}.": "", - "Use TLS when connecting to the LDAP server.": "", - "Use Web Search?": "", + "Use proxy environment variables to fetch page contents.": "使用代理环境变量获取页面内容。", + "Use search results without fetching page contents.": "使用搜索结果而不获取页面内容。", + "Use segmented retrieval for focused and relevant content extraction.": "使用分段检索进行集中且相关的内容提取。", + "Use segmented retrieval for focused and relevant context.": "使用分段检索获取集中且相关的上下文。", + "Use segmented retrieval for focused context.": "使用分段检索获取集中的上下文。", + "Use styled formatting when exporting chats to PDF.": "将对话导出为 PDF 时使用样式化格式。", + "Use the active chat title as the browser tab title.": "使用当前对话标题作为浏览器标签页标题。", + "Use the rich composer instead of a plain textarea.": "使用富文本编辑器而不是纯文本输入框。", + "Use these in model system prompts as {{example}}.": "在模型系统提示词中使用这些,如 {{example}}。", + "Use TLS when connecting to the LDAP server.": "连接 LDAP 服务器时使用 TLS。", + "Use Web Search?": "使用网络搜索?", "user": "用户", "User": "用户", - "User Access": "", + "User Access": "用户访问权限", "User Activity": "用户动态", - "User Connections": "", + "User Connections": "用户连接", "User Groups": "用户组", "User location successfully retrieved.": "成功检索到用户位置", "User menu": "用户菜单", - "User messages": "", - "User not found.": "", + "User messages": "用户消息", + "User not found.": "未找到用户。", "User Preview": "用户预览", "User ratings (thumbs up/down)": "用户评分(赞/踩)", "User Status": "用户状态", - "User Variables": "", + "User Variables": "用户变量", "User Webhooks": "用户 Webhook", "Username": "用户名", - "Username Claim": "", + "Username Claim": "用户名声明", "users": "用户", "Users": "用户", "Uses DefaultAzureCredential to authenticate": "使用 DefaultAzureCredential 进行身份验证", - "Uses defaults": "", + "Uses defaults": "使用默认值", "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.": "默认会使用全部模型进行盲测。点击上方“+”可添加自定义盲测模型。", - "Valid time units: 's', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "", - "Validate Certificate": "", - "Validate SSL certificates when fetching web content.": "", - "Value": "", + "Valid time units: 's', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "有效时间单位:'s'(秒), 'm'(分), 'h'(时), 'd'(天), 'w'(周),或 '-1' 表示永不过期。", + "Validate Certificate": "验证证书", + "Validate SSL certificates when fetching web content.": "获取网页内容时验证 SSL 证书。", + "Value": "值", "Valves": "配置项", "Valves updated": "配置项已更新", "Valves updated successfully": "配置项更新成功", "variable": "变量", - "Variable key": "", - "Variable keys must be unique.": "", - "Variable keys must use lowercase snake case.": "", - "Variable value": "", - "Vector Field": "", + "Variable key": "变量键", + "Variable keys must be unique.": "变量键必须唯一。", + "Variable keys must use lowercase snake case.": "变量键必须使用小写蛇形命名法。", + "Variable value": "变量值", + "Vector Field": "向量字段", "Verify Connection": "验证连接", "Verify SSL Certificate": "验证 SSL 证书", - "Verify the LDAP server certificate when TLS is enabled.": "", + "Verify the LDAP server certificate when TLS is enabled.": "启用 TLS 时验证 LDAP 服务器证书。", "Version": "版本", "Version {{selectedVersion}} of {{totalVersions}}": "版本 {{selectedVersion}}/{{totalVersions}}", "Version deleted": "版本已删除", - "View channel": "", - "View chat": "", + "View channel": "查看频道", + "View chat": "查看对话", "View Replies": "查看回复", - "View Result from {{NAME}}": "", + "View Result from {{NAME}}": "查看来自 {{NAME}} 的结果", "View source: {{name}}": "查看来源:{{name}}", "View source: {{title}}": "查看来源:{{title}}", - "View the installed version and check release updates.": "", - "Viewport Pinned": "", - "Viewport Unpinned": "", + "View the installed version and check release updates.": "查看已安装版本并检查发行更新。", + "Viewport Pinned": "视口固定", + "Viewport Unpinned": "视口取消固定", "Visibility": "可见性", "Visible": "可见", "Visible to all users": "对所有用户可见", @@ -2971,9 +2971,9 @@ "Voice Input": "语音输入", "Voice mode": "语音模式", "Voice Mode Prompt": "语音模式提示词", - "Wait for the current response to finish before compacting.": "", - "Wait for the current response to finish before forking.": "", - "Waiting for upload": "", + "Wait for the current response to finish before compacting.": "等待当前回答完成后再紧凑。", + "Wait for the current response to finish before forking.": "等待当前回答完成后再复制。", + "Waiting for upload": "等待上传", "Waiting for upload...": "正在等待上传…", "Warning": "警告", "Warning:": "警告:", @@ -2985,15 +2985,15 @@ "Web API": "网页 API", "Web Loader Engine": "网页加载引擎", "Web Search": "联网搜索", - "Web Search Confirmation": "", - "Web Search Confirmation Content": "", + "Web Search Confirmation": "网络搜索确认", + "Web Search Confirmation Content": "网络搜索确认内容", "Web Search Engine": "联网搜索引擎", "Web Search in Chat": "在对话时进行联网搜索", "Web Search Query Generation": "联网搜索关键词生成", - "Webhook": "", - "Webhook deleted": "", + "Webhook": "Webhook", + "Webhook deleted": "Webhook 已删除", "Webhook Name": "Webhook 名称", - "Webhook saved": "", + "Webhook saved": "Webhook 已保存", "Webhooks": "Webhook", "Webpage URLs": "网页链接", "WebUI Settings": "WebUI 设置", @@ -3002,10 +3002,10 @@ "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": "周", - "Week of": "", + "Week of": "本周", "Weekly": "每周", - "Weekly at": "", - "Welcome to your AI home.": "", + "Weekly at": "每周于", + "Welcome to your AI home.": "欢迎来到您的 AI 主页。", "What are you trying to achieve?": "您想要达到什么目标?", "What are you working on?": "您在忙于什么?", "What is NOT shared:": "不共享的内容:", @@ -3013,14 +3013,14 @@ "What's New in": "最近更新内容于", "What's on your mind?": "聊聊您的想法吧!", "When": "时间", - "When disabled, keyboard shortcuts will not trigger any actions.": "", + "When disabled, keyboard shortcuts will not trigger any actions.": "禁用时,键盘快捷键不会触发任何操作。", "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.": "启用后,模型将实时回答每条对话信息,在用户发送信息后立即生成回答。这种模式适用于即时对话应用,但在性能较低的设备上可能会影响响应速度", "Whisper (Local)": "Whisper (本地)", "Who can share to this group": "允许谁可以分享到此组", "Why?": "为什么?", "Widescreen Mode": "宽屏模式", "Width": "宽度", - "Width in pixels to compress images to. Leave empty for no compression.": "", + "Width in pixels to compress images to. Leave empty for no compression.": "图片压缩后的宽度(像素)。留空表示不压缩。", "Wikipedia": "维基百科", "Won": "更好", "Working Directory": "工作目录", @@ -3029,7 +3029,7 @@ "Workspace Permissions": "工作空间权限", "Write": "可写", "Write a summary in 50 words that summarizes {{topic}}.": "用 50 个字写一份总结 [主题或关键词]", - "Write something...": "写点什么...", + "Write something...": "写点什么……", "Write your model system prompt content here\ne.g.) You are Mario from Super Mario Bros, acting as an assistant.": "请在此填写模型的系统提示词\n例如:你是《超级马里奥兄弟》中的马里奥(Mario),扮演助理的角色。", "Yacy Instance URL": "YaCy 实例接口地址", "Yacy Password": "YaCy 密码", @@ -3039,17 +3039,17 @@ "Yandex Web Search API Key": "Yandex 网页搜索接口密钥", "Yandex Web Search config": "Yandex 网页搜索配置", "Yandex Web Search URL": "Yandex 网页搜索地址", - "Yearly": "", + "Yearly": "每年", "Yesterday": "昨天", "You": "你", - "You are a sub-agent...": "", + "You are a sub-agent...": "您是一个子代理……", "You are currently using a trial license. Please contact support to upgrade your license.": "当前为试用许可证,请联系支持人员升级许可证。", "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.": "点击下方“管理”按钮,您可以添加记忆,定制与大语言模型之间的互动,使其提供更加到位的帮助,更符合您的需求。", "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 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.": "您没有权限在当前频道发送消息。", @@ -3057,7 +3057,7 @@ "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 have more than 50 users, which often means this workspace is supporting organizational use. Open WebUI is free to use as-is, with no restrictions or hidden limits, and we want to keep it that way.": "", + "You have more than 50 users, which often means this workspace is supporting organizational use. Open WebUI is free to use as-is, with no restrictions or hidden limits, and we want to keep it that way.": "您有超过 50 名用户,这通常意味着此工作区支持组织级使用。Open WebUI 免费使用,无任何限制或隐藏限制,我们希望保持这样。", "You have no archived conversations.": "没有已归档的对话。", "You have no shared conversations.": "您没有已分享的对话。", "You have shared this chat": "此对话已经分享过", @@ -3069,11 +3069,25 @@ "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 query will be sent to the configured web search provider.": "", + "Your query will be sent to the configured web search provider.": "您的查询将发送到配置的网络搜索服务提供商。", "Your usage stats have been successfully synced.": "已成功同步您的使用统计数据。", "YouTube": "YouTube", "Youtube Language": "Youtube 语言", "Youtube Proxy URL": "Youtube 代理地址", - "Zoom in": "", - "Zoom out": "" -} + "Zoom in": "放大", + "Zoom out": "缩小", + "Computing checksums ({{count}} files)_one": "正在计算校验和({{count}} 个文件)", + "Every {{count}} hours_one": "每 {{count}} 小时", + "Every {{count}} minutes_one": "每 {{count}} 分钟", + "Refresh requested: {{count}} terminal(s)_one": "已请求刷新:{{count}} 个终端", + "Removing {{count}} stale files..._one": "正在移除 {{count}} 个过期文件……", + "Retrieved {{count}} sources_one": "已检索 {{count}} 个来源", + "Starting in {{count}} minutes_one": "{{count}} 分钟后开始", + "{{count}} files selected. Only new and modified files will be uploaded. Deleted files will be removed. The folder structure will be mirrored. Continue?_one": "已选择 {{count}} 个文件。仅上传新增和修改的文件,已删除的文件将被移除。文件夹结构将被镜像复制。是否继续?", + "{{count}} files_one": "{{count}} 个文件", + "{{count}} filters_one": "{{count}} 个过滤器", + "{{count}} groups_one": "{{count}} 个组", + "{{count}} of {{total}} accessible_one": "{{count}}/{{total}} 可访问", + "{{count}} selected_one": "已选择 {{count}} 个", + "{{count}} users_one": "{{count}} 个用户" +} \ No newline at end of file From 62e5eab60bb761de5bea9be63a20975721d4090a Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 28 Aug 2026 12:18:23 -0400 Subject: [PATCH 20/99] refac Co-Authored-By: G30 <50341825+silentoplayz@users.noreply.github.com> --- .github/workflows/docker.yaml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index f14afd6a58..ab9283fa02 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -311,7 +311,6 @@ jobs: runs-on: ubuntu-latest if: ${{ !cancelled() && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) }} needs: [merge] - continue-on-error: true strategy: fail-fast: false matrix: @@ -403,5 +402,16 @@ jobs: [ -z "$TAG" ] && continue DEST="${DOCKERHUB_IMAGE}:${TAG}" echo " -> ${DEST}" - docker buildx imagetools create -t "${DEST}" "${SOURCE}" + for ATTEMPT in 1 2 3; do + if docker buildx imagetools create -t "${DEST}" "${SOURCE}" && \ + docker buildx imagetools inspect "${DEST}"; then + break + fi + if [ "${ATTEMPT}" = "3" ]; then + echo "Failed to copy ${DEST} after ${ATTEMPT} attempts" + exit 1 + fi + echo "Copy attempt ${ATTEMPT} for ${DEST} failed, retrying in 15s..." + sleep 15 + done done <<< "${{ steps.tags.outputs.tags }}" From e6031ea6daec897eddbcf0c8b03c2d6fad2b506e Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 28 Aug 2026 12:18:37 -0400 Subject: [PATCH 21/99] refac --- src/app.css | 86 +++++++++++++------ src/lib/components/chat/SettingsModal.svelte | 2 + .../common/InterfaceSettings.svelte | 6 +- src/lib/components/workspace/Knowledge.svelte | 5 ++ 4 files changed, 72 insertions(+), 27 deletions(-) diff --git a/src/app.css b/src/app.css index a5be2c2d78..93d3b0601e 100644 --- a/src/app.css +++ b/src/app.css @@ -865,77 +865,115 @@ body { padding-bottom: 2rem; /* space for the bottom toolbar */ } -/* High Contrast Mode: placeholders bottom out at 1.58:1 (WCAG 1.4.3 wants 4.5:1). */ +/* Accessibility Mode: placeholders bottom out at 1.58:1 (WCAG 1.4.3 wants 4.5:1). */ @layer utilities { html.high-contrast:not(.dark) :is(input, textarea)::placeholder { - color: var(--color-gray-600); + color: var(--color-gray-700); } html.high-contrast.dark :is(input, textarea)::placeholder { - color: var(--color-gray-500); + color: var(--color-gray-300); } } -/* High Contrast Mode: muted text fails WCAG 1.4.3 (2.07:1 light, 3.12:1 dark). +/* Accessibility Mode: muted text fails WCAG 1.4.3 (2.07:1 light, 3.12:1 dark). :where() keeps these at low specificity so hover variants still win. */ @layer utilities { html:where(.high-contrast):not(:where(.dark)) .text-gray-400 { - color: var(--color-gray-600); + color: var(--color-gray-700); } - html:where(.high-contrast).dark .dark\:text-gray-600 { - color: var(--color-gray-400); + html:where(.high-contrast).dark :is(.dark\:text-gray-400, .dark\:text-gray-500, .dark\:text-gray-600) { + color: var(--color-gray-300); + } + + html:where(.high-contrast).dark + :is( + .dark\:hover\:text-gray-100:hover, + .dark\:hover\:text-gray-200:hover, + .dark\:hover\:text-gray-300:hover, + .dark\:hover\:text-gray-400:hover + ) { + color: #fff; } /* Elements that hover to a lighter grey than the new resting colour. */ - html:where(.high-contrast):not(:where(.dark)) .hover\:text-gray-500:hover { - color: var(--color-gray-800); + html:where(.high-contrast):not(:where(.dark)) + :is( + .hover\:text-gray-500:hover, + .hover\:text-gray-600:hover, + .hover\:text-gray-700:hover, + .hover\:text-gray-800:hover + ) { + color: var(--color-gray-900); } } -/* High Contrast Mode: gray-500 muted text is 2.77:1 in light (WCAG 1.4.3 wants 4.5:1). +/* Accessibility Mode: gray-500 muted text is 2.77:1 in light (WCAG 1.4.3 wants 4.5:1). The utility stays in the layer so hover variants still outrank it; the classes below are unlayered, so their override has to be too. */ @layer utilities { - html:where(.high-contrast):not(:where(.dark)) .text-gray-500 { - color: var(--color-gray-600); + html:where(.high-contrast):not(:where(.dark)) :is(.text-gray-500, .text-gray-600) { + color: var(--color-gray-700); } } html.high-contrast:not(.dark) :is(.app-muted, .app-icon-muted, .tiptap table) { - color: var(--color-gray-600); + color: var(--color-gray-700); } -/* High Contrast Mode: the lightest muted pair, 1.58:1 in light and 2.14:1 in dark. +html.high-contrast.dark :is(.app-muted, .app-icon-muted, .tiptap table) { + color: var(--color-gray-300); +} + +/* Accessibility Mode: the lightest muted pair, 1.58:1 in light and 2.14:1 in dark. text-gray-400/70 is an icon colour, so 1.4.11 governs it, and 2.07:1 misses that too. */ @layer utilities { html:where(.high-contrast):not(:where(.dark)) :is(.text-gray-300, .text-gray-400\/70) { - color: var(--color-gray-600); + color: var(--color-gray-700); } - html:where(.high-contrast).dark .dark\:text-gray-700 { - color: var(--color-gray-400); + html:where(.high-contrast).dark :is(.dark\:text-gray-700, .dark\:text-gray-800) { + color: var(--color-gray-300); } /* Hover states that land lighter than the new resting colour. */ - html:where(.high-contrast):not(:where(.dark)) .hover\:text-gray-500:hover { - color: var(--color-gray-800); + html:where(.high-contrast):not(:where(.dark)) + :is( + .hover\:text-gray-500:hover, + .hover\:text-gray-600:hover, + .hover\:text-gray-700:hover, + .hover\:text-gray-800:hover + ) { + color: var(--color-gray-900); } - html:where(.high-contrast):not(:where(.dark)) .group:hover .group-hover\:text-gray-500 { - color: var(--color-gray-800); + html:where(.high-contrast):not(:where(.dark)) + .group:hover + :is(.group-hover\:text-gray-500, .group-hover\:text-gray-600, .group-hover\:text-gray-700) { + color: var(--color-gray-900); + } + + html:where(.high-contrast).dark + .group:hover + :is( + .dark\:group-hover\:text-gray-200, + .dark\:group-hover\:text-gray-300, + .dark\:group-hover\:text-gray-400 + ) { + color: #fff; } } /* Autocompletion ghost text is 2.65:1 in light; the dark canvas already passes. */ html.high-contrast:not(.dark) .ai-autocompletion::after { - color: var(--color-gray-600); + color: var(--color-gray-700); } /* The shimmer gradient is 2.10:1 in light, and clipping it to the text leaves no solid colour to raise; render it as flat text instead. */ html.high-contrast:not(.dark) .shimmer { background: none; - color: var(--color-gray-700); - -webkit-text-fill-color: var(--color-gray-700); + color: var(--color-gray-800); + -webkit-text-fill-color: var(--color-gray-800); } diff --git a/src/lib/components/chat/SettingsModal.svelte b/src/lib/components/chat/SettingsModal.svelte index c32ef11c77..3f1360a622 100644 --- a/src/lib/components/chat/SettingsModal.svelte +++ b/src/lib/components/chat/SettingsModal.svelte @@ -268,6 +268,8 @@ 'full width mode', 'haptic feedback', 'hapticfeedback', + 'accessibility mode', + 'accessibilitymode', 'high contrast mode', 'highcontrastmode', 'iframe sandbox allow forms', diff --git a/src/lib/components/common/InterfaceSettings.svelte b/src/lib/components/common/InterfaceSettings.svelte index 2bbaee1cd2..51cef5ee3b 100644 --- a/src/lib/components/common/InterfaceSettings.svelte +++ b/src/lib/components/common/InterfaceSettings.svelte @@ -490,13 +490,13 @@
-
- {$i18n.t('High Contrast Mode')} +
+ {$i18n.t('Accessibility Mode')}
Date: Fri, 28 Aug 2026 18:22:23 +0200 Subject: [PATCH 22/99] perf: skip pipeline filter session setup when no filters exist (#29146) process_pipeline_inlet_filter() and its outlet counterpart construct and tear down an aiohttp ClientSession, with its own connector and cookie jar, on every chat completion and every task generation request just to iterate an empty filter list. On deployments without pipelines, which is the default, that is wasted setup on every message. Both functions now return the payload untouched before the session is created when there is nothing to call. The per-call saving is small, a few microseconds of object construction per request on the pinned aiohttp; the point is that requests stop paying setup for a feature that is not configured. --- backend/open_webui/routers/pipelines.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backend/open_webui/routers/pipelines.py b/backend/open_webui/routers/pipelines.py index 827fadf7c9..753c9fc77f 100644 --- a/backend/open_webui/routers/pipelines.py +++ b/backend/open_webui/routers/pipelines.py @@ -69,6 +69,9 @@ async def process_pipeline_inlet_filter(request, payload, user, models): if 'pipeline' in model: sorted_filters.append(model) + if not sorted_filters: + return payload + async with aiohttp.ClientSession(trust_env=True) as session: for filter in sorted_filters: urlIdx = filter.get('urlIdx') @@ -132,6 +135,9 @@ async def process_pipeline_outlet_filter(request, payload, user, models): if 'pipeline' in model: sorted_filters = [model] + sorted_filters + if not sorted_filters: + return payload + async with aiohttp.ClientSession(trust_env=True) as session: for filter in sorted_filters: urlIdx = filter.get('urlIdx') From 12d4b4ac59ccf9401ad9e42121b702802266c089 Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Fri, 28 Aug 2026 12:23:06 -0400 Subject: [PATCH 23/99] fix: give the underline marked extension a renderer (#29118) --- src/lib/utils/marked/extension.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lib/utils/marked/extension.ts b/src/lib/utils/marked/extension.ts index c3f69faada..d82f70578e 100644 --- a/src/lib/utils/marked/extension.ts +++ b/src/lib/utils/marked/extension.ts @@ -102,6 +102,10 @@ function detailsExtension() { }; } +function underlineRenderer(this: any, token: any) { + return `${this.parser.parseInline(token.tokens)}`; +} + function underlineExtension() { return { name: 'underline', @@ -117,7 +121,8 @@ function underlineExtension() { text: match[1], tokens: this.lexer.inlineTokens(match[1]) }; - } + }, + renderer: underlineRenderer }; } From 99cb8257f7cbdb4b8f454a0d7683d8957b6eaeb5 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 28 Aug 2026 13:34:10 -0400 Subject: [PATCH 24/99] refac --- src/lib/components/layout/Sidebar.svelte | 2 +- .../layout/Sidebar/ChannelItem.svelte | 2 +- .../components/layout/Sidebar/ChatMenu.svelte | 26 ++++++++--------- .../layout/Sidebar/Folders/FolderMenu.svelte | 12 ++++---- .../layout/Sidebar/RecursiveFolder.svelte | 4 +-- .../components/layout/Sidebar/UserMenu.svelte | 28 +++++++++---------- 6 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/lib/components/layout/Sidebar.svelte b/src/lib/components/layout/Sidebar.svelte index c2b762c858..755448b01f 100644 --- a/src/lib/components/layout/Sidebar.svelte +++ b/src/lib/components/layout/Sidebar.svelte @@ -1483,7 +1483,7 @@
{/if} + +
diff --git a/src/lib/components/layout/Sidebar/UserMenu.svelte b/src/lib/components/layout/Sidebar/UserMenu.svelte index 0b95e62b35..1be9cf7fbe 100644 --- a/src/lib/components/layout/Sidebar/UserMenu.svelte +++ b/src/lib/components/layout/Sidebar/UserMenu.svelte @@ -573,7 +573,7 @@ const res = await userSignOut(); localStorage.removeItem('token'); - location.href = res?.redirect_url ?? '/auth'; + location.href = res?.redirect_url ?? '/auth?logout=true'; show = false; }} > diff --git a/src/routes/auth/+page.svelte b/src/routes/auth/+page.svelte index 0dc9439b04..d5ccd33076 100644 --- a/src/routes/auth/+page.svelte +++ b/src/routes/auth/+page.svelte @@ -155,7 +155,11 @@ onMount(async () => { const redirectPath = $page.url.searchParams.get('redirect'); - if ($user) { + const logout = $page.url.searchParams.get('logout') === 'true'; + + if (logout) { + await user.set(null); + } else if ($user) { goto(redirectPath || '/'); } else { if (redirectPath) { @@ -175,7 +179,7 @@ // deployment is unambiguously SSO-only (single provider, no login form, // no LDAP). Suppressed by ?form=, ?error=, onboarding, trusted-header // auth, or an existing session/token. - if ($config?.oauth?.auto_redirect && !form && !error) { + if ($config?.oauth?.auto_redirect && !logout && !form && !error) { const providers = Object.keys($config?.oauth?.providers ?? {}); if ( providers.length === 1 && From 97c5f52bbcc406411f16e77ec3ec5491ddef519c Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 30 Aug 2026 23:55:29 -0400 Subject: [PATCH 65/99] refac --- src/routes/auth/+page.svelte | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/routes/auth/+page.svelte b/src/routes/auth/+page.svelte index d5ccd33076..fe7e1d3480 100644 --- a/src/routes/auth/+page.svelte +++ b/src/routes/auth/+page.svelte @@ -157,9 +157,7 @@ const redirectPath = $page.url.searchParams.get('redirect'); const logout = $page.url.searchParams.get('logout') === 'true'; - if (logout) { - await user.set(null); - } else if ($user) { + if ($user && !logout) { goto(redirectPath || '/'); } else { if (redirectPath) { @@ -177,8 +175,8 @@ // Auto-redirect to SSO when OAUTH_AUTO_REDIRECT is enabled and the // deployment is unambiguously SSO-only (single provider, no login form, - // no LDAP). Suppressed by ?form=, ?error=, onboarding, trusted-header - // auth, or an existing session/token. + // no LDAP). Suppressed by ?logout=true, ?form=, ?error=, onboarding, + // trusted-header auth, or an existing session/token. if ($config?.oauth?.auto_redirect && !logout && !form && !error) { const providers = Object.keys($config?.oauth?.providers ?? {}); if ( From 64e6c9f0106fed10bc5bebf0449dfb21d875ab4f Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 30 Aug 2026 23:56:01 -0400 Subject: [PATCH 66/99] refac --- backend/open_webui/utils/middleware.py | 9 ++------- src/lib/components/chat/Chat.svelte | 1 + .../chat/Messages/StructuredOutputRenderer.svelte | 4 +++- src/lib/components/chat/Messages/structuredOutput.ts | 1 - 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 2f60d0aa9b..9710b14177 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -258,12 +258,7 @@ def build_terminal_file_tool_result( if isinstance(tool_result, (list, tuple)) and tool_result and isinstance(tool_result[0], dict): tool_result = tool_result[0] - if ( - tool_function_name != 'display_file' - or tool_function_params.get('inline') is not True - or not isinstance(tool_result, dict) - or tool_result.get('exists') is False - ): + if tool_function_name != 'display_file' or not isinstance(tool_result, dict) or tool_result.get('exists') is False: return None tool_id = (tool or {}).get('tool_id', '') @@ -284,7 +279,7 @@ def build_terminal_file_tool_result( **tool_result, 'type': 'file', 'source': 'open_terminal', - 'displayed': True, + **({'displayed': True} if tool_function_params.get('inline') is True else {}), 'terminal_selector': terminal_selector, **({'terminal_id': terminal_id} if terminal_id else {}), **({'terminal_url': server_url} if server_url and not terminal_id else {}), diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 741c78632b..875aee0e07 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -1144,6 +1144,7 @@ const terminalEventHandler = (type: string, data: any) => { if (type === 'terminal:display_file') { if (!data?.path) return; + if ($settings?.terminalFileDisplay === 'inline') return; displayFileHandler(data.path, { showControls, showFileNavPath }, { page: data?.page }); } else if (type === 'terminal:write_file' || type === 'terminal:replace_file_content') { if (!data?.path) return; diff --git a/src/lib/components/chat/Messages/StructuredOutputRenderer.svelte b/src/lib/components/chat/Messages/StructuredOutputRenderer.svelte index faeff5f179..3fd496707d 100644 --- a/src/lib/components/chat/Messages/StructuredOutputRenderer.svelte +++ b/src/lib/components/chat/Messages/StructuredOutputRenderer.svelte @@ -163,7 +163,9 @@
{:else if displayItem.type === 'file'} - + {#if displayItem.item?.displayed || $settings?.terminalFileDisplay === 'inline'} + + {/if} {:else} {@const detailToken = displayItem.token} {#if detailToken.attributes?.type === 'tool_calls'} diff --git a/src/lib/components/chat/Messages/structuredOutput.ts b/src/lib/components/chat/Messages/structuredOutput.ts index 612aca3dbe..969ecb7be6 100644 --- a/src/lib/components/chat/Messages/structuredOutput.ts +++ b/src/lib/components/chat/Messages/structuredOutput.ts @@ -179,7 +179,6 @@ function getInlineFileFromToolOutput(callItem?: OutputItem, resultItem?: OutputI typeof result !== 'object' || result.type !== 'file' || result.source !== 'open_terminal' || - result.displayed !== true || result.exists === false || !result.path || !result.terminal_selector From 81b9afb731d5de919a75ad82b6c13967feacac77 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 31 Aug 2026 00:03:51 -0400 Subject: [PATCH 67/99] refac --- backend/open_webui/utils/tools.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/utils/tools.py b/backend/open_webui/utils/tools.py index b83d352ba7..3ababccb28 100644 --- a/backend/open_webui/utils/tools.py +++ b/backend/open_webui/utils/tools.py @@ -1338,7 +1338,13 @@ async def get_terminal_servers(request: Request): data = await request.app.state.redis.get(f'{REDIS_KEY_PREFIX}:terminal_servers') if data is not None: terminal_servers = JSONCodec.loads(data) - request.app.state.TERMINAL_SERVERS = terminal_servers + connections = await Config.get('terminal_server.connections', []) or [] + if terminal_servers or not any( + connection.get('url') and connection.get('enabled', True) for connection in connections + ): + request.app.state.TERMINAL_SERVERS = terminal_servers + else: + terminal_servers = None except Exception as e: log.error(f'Error fetching terminal_servers from Redis: {e}') @@ -1374,7 +1380,7 @@ async def get_terminal_tools( # Find the cached spec data for this terminal terminal_servers = await get_terminal_servers(request) - server_data = next((s for s in terminal_servers if s.get('id') == terminal_id), None) + server_data = next((server for server in terminal_servers if server.get('id') == terminal_id), None) if server_data is None: raise RuntimeError(f"Terminal server '{terminal_id}' is unavailable") From 2140c189e16c42cb2b9f621985f299eac421f51e Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 31 Aug 2026 00:05:34 -0400 Subject: [PATCH 68/99] refac --- backend/open_webui/utils/tools.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/utils/tools.py b/backend/open_webui/utils/tools.py index 3ababccb28..0f18d2b753 100644 --- a/backend/open_webui/utils/tools.py +++ b/backend/open_webui/utils/tools.py @@ -1368,7 +1368,10 @@ async def get_terminal_tools( - Builds callables that route through the terminal proxy """ connections = await Config.get('terminal_server.connections', []) or [] - connection = next((c for c in connections if c.get('id') == terminal_id), None) + connection = next( + (terminal_connection for terminal_connection in connections if terminal_connection.get('id') == terminal_id), + None, + ) if connection is None: raise RuntimeError(f"Terminal server '{terminal_id}' not found") if not connection.get('enabled', True): From 09163ccc736e881776c1f3c08e5881cd31c7bd2c Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 31 Aug 2026 00:06:05 -0400 Subject: [PATCH 69/99] refac --- .../workspace/Knowledge/KnowledgeBase.svelte | 115 ++++++++++-------- 1 file changed, 66 insertions(+), 49 deletions(-) diff --git a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte index ed7b109051..b2fb77282a 100644 --- a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte +++ b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte @@ -619,6 +619,51 @@ return currentPath && path ? `${currentPath}/${path}` : currentPath || path; }; + const uploadManifestEntries = async ( + entries: DirectoryManifestEntry[], + resolveDirectoryId: (entry: DirectoryManifestEntry) => string | null | undefined + ) => { + let failedCount = 0; + + for (const [index, entry] of entries.entries()) { + const displayPath = entry.path ? `${entry.path}/${entry.filename}` : entry.filename; + syncing = $i18n.t('Uploading {{current}}/{{total}}: {{file}}', { + current: index + 1, + total: entries.length, + file: displayPath + }); + + const fileObject = new File([entry.file], entry.filename, { type: entry.file.type }); + const uploadedFile = await uploadFile(localStorage.token, fileObject, { + knowledge_id: knowledge.id, + file_hash: entry.checksum, + directory_id: resolveDirectoryId(entry) + }).catch((error) => ({ error })); + + if (!uploadedFile || uploadedFile.error) { + const error = uploadedFile?.error; + const reason = + typeof error === 'string' + ? error + : (error?.detail ?? error?.message ?? $i18n.t('Failed to upload file.')); + + failedCount++; + console.error('Upload failed:', displayPath, reason); + } + } + + if (failedCount > 0) { + toast.error( + $i18n.t('Upload failed for {{failed}} of {{total}} files.', { + failed: failedCount, + total: entries.length + }) + ); + } + + return failedCount; + }; + const uploadDirectoryEntries = async (entries: DirectoryFileEntry[]) => { if (!knowledge) return; @@ -645,30 +690,14 @@ const directoryIdByPath = await createMissingDirectories(diff); - let uploadedCount = 0; - for (const entry of manifest) { - uploadedCount++; - const displayPath = entry.path ? `${entry.path}/${entry.filename}` : entry.filename; - syncing = $i18n.t('Uploading {{current}}/{{total}}: {{file}}', { - current: uploadedCount, - total: manifest.length, - file: displayPath - }); + const failedCount = await uploadManifestEntries(manifest, (entry) => + entry.path ? directoryIdByPath[getDirectoryUploadPath(entry.path)] : currentDirectoryId + ); - const fileObject = new File([entry.file], entry.filename, { type: entry.file.type }); - await uploadFile(localStorage.token, fileObject, { - knowledge_id: knowledge.id, - file_hash: entry.checksum, - directory_id: entry.path - ? directoryIdByPath[getDirectoryUploadPath(entry.path)] - : currentDirectoryId - }).catch((e) => { - toast.error(`${e}`); - return null; - }); + if (failedCount === 0) { + toast.success($i18n.t('File uploaded successfully')); } - toast.success($i18n.t('File uploaded successfully')); init(); } catch (e) { toast.error(`${e}`); @@ -723,36 +752,24 @@ diff.modified.some((m: any) => m.filename === entry.filename && m.path === entry.path) ); - let uploadedCount = 0; - for (const entry of filesToUpload) { - uploadedCount++; - const displayPath = entry.path ? `${entry.path}/${entry.filename}` : entry.filename; - syncing = $i18n.t('Uploading {{current}}/{{total}}: {{file}}', { - current: uploadedCount, - total: filesToUpload.length, - file: displayPath - }); - - const fileObject = new File([entry.file], entry.filename, { type: entry.file.type }); - await uploadFile(localStorage.token, fileObject, { - knowledge_id: knowledge.id, - file_hash: entry.checksum, - directory_id: entry.path ? directoryIdByPath[entry.path] : null - }).catch(() => null); - } + const failedCount = await uploadManifestEntries(filesToUpload, (entry) => + entry.path ? directoryIdByPath[entry.path] : null + ); // ── 7. Report ── - toast.success( - $i18n.t( - 'Sync complete: {{added}} added, {{modified}} modified, {{deleted}} deleted, {{unmodified}} unmodified', - { - added: diff.added.length, - modified: diff.modified.length, - deleted: diff.deleted.length, - unmodified: diff.unmodified_count - } - ) - ); + if (failedCount === 0) { + toast.success( + $i18n.t( + 'Sync complete: {{added}} added, {{modified}} modified, {{deleted}} deleted, {{unmodified}} unmodified', + { + added: diff.added.length, + modified: diff.modified.length, + deleted: diff.deleted.length, + unmodified: diff.unmodified_count + } + ) + ); + } init(); } catch (e) { toast.error(`${e}`); From 9a669197c849dc1ec7c881de1158fa27a19d3874 Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Mon, 31 Aug 2026 00:06:37 -0400 Subject: [PATCH 70/99] fix: let setting row controls shrink so long values do not squeeze the label (#29229) --- src/lib/components/admin/Settings/AdminSettingRow.svelte | 2 +- src/lib/components/chat/Settings/UserSettingRow.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/components/admin/Settings/AdminSettingRow.svelte b/src/lib/components/admin/Settings/AdminSettingRow.svelte index 2dd338ae28..530a92bcf9 100644 --- a/src/lib/components/admin/Settings/AdminSettingRow.svelte +++ b/src/lib/components/admin/Settings/AdminSettingRow.svelte @@ -14,7 +14,7 @@ {label}
-
+
diff --git a/src/lib/components/chat/Settings/UserSettingRow.svelte b/src/lib/components/chat/Settings/UserSettingRow.svelte index d102d6db63..7b187ad1d6 100644 --- a/src/lib/components/chat/Settings/UserSettingRow.svelte +++ b/src/lib/components/chat/Settings/UserSettingRow.svelte @@ -10,7 +10,7 @@ {label}
-
+
From 84d0940da147db08ea093dc2f7919054d8ee5dfd Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 31 Aug 2026 00:11:04 -0400 Subject: [PATCH 71/99] refac --- src/lib/apis/auths/index.ts | 30 +++++++++++++++++++ .../Settings/Account/UpdatePassword.svelte | 4 +-- .../layout/Overlay/AccountPending.svelte | 4 +-- .../components/layout/Sidebar/UserMenu.svelte | 4 +-- src/lib/i18n/locales/en-US/translation.json | 1 + src/routes/auth/+page.svelte | 4 +-- 6 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/lib/apis/auths/index.ts b/src/lib/apis/auths/index.ts index fcd5b1708c..57f72fb27d 100644 --- a/src/lib/apis/auths/index.ts +++ b/src/lib/apis/auths/index.ts @@ -407,6 +407,36 @@ export const userSignOut = async () => { return res; }; +export const getLogoutRedirectUrl = (redirectUrl?: string | null) => { + const logoutUrl = new URL('/auth?state=logout', window.location.origin); + const postLogoutUrl = new URL('/auth', window.location.origin); + if (!redirectUrl) { + return logoutUrl.href; + } + + const url = new URL(redirectUrl, window.location.origin); + if (url.origin === window.location.origin && url.pathname === '/auth') { + url.searchParams.set('state', 'logout'); + return url.href; + } + + const postLogoutRedirectUri = url.searchParams.get('post_logout_redirect_uri'); + if (postLogoutRedirectUri) { + const configuredPostLogoutUrl = new URL(postLogoutRedirectUri, window.location.origin); + if ( + configuredPostLogoutUrl.origin === window.location.origin && + configuredPostLogoutUrl.pathname === '/auth' + ) { + url.searchParams.set('state', 'logout'); + } + return url.href; + } + + url.searchParams.set('post_logout_redirect_uri', postLogoutUrl.href); + url.searchParams.set('state', 'logout'); + return url.href; +}; + export const addUser = async ( token: string, name: string, diff --git a/src/lib/components/chat/Settings/Account/UpdatePassword.svelte b/src/lib/components/chat/Settings/Account/UpdatePassword.svelte index f35cc5e7e2..2146f60095 100644 --- a/src/lib/components/chat/Settings/Account/UpdatePassword.svelte +++ b/src/lib/components/chat/Settings/Account/UpdatePassword.svelte @@ -1,7 +1,7 @@
button]:flex [&>button]:w-full [&>button]:h-[1.6875rem]! [&>button]:items-center [&>button]:gap-2! [&>button]:rounded-xl! [&>button]:bg-transparent [&>button]:px-2! [&>button]:text-[0.8125rem]! [&>button]:font-normal! [&>a]:flex [&>a]:w-full [&>a]:h-[1.6875rem]! [&>a]:items-center [&>a]:gap-2! [&>a]:rounded-xl! [&>a]:bg-transparent [&>a]:px-2! [&>a]:text-[0.8125rem]! [&>a]:font-normal! [&_button_svg]:size-3.5! [&_a_svg]:size-3.5! [&>hr]:my-0.5 [&>hr]:mx-1`} + class={`app-dropdown-menu rounded-xl! p-0.5! border border-gray-100 dark:border-gray-800 z-50 bg-white dark:bg-gray-850 dark:text-white shadow-lg ${className} [&>button]:flex [&>button]:w-full [&>button]:h-[1.6875rem] [&>button]:items-center [&>button]:gap-2 [&>button]:rounded-xl! [&>button]:px-2! [&>button]:text-[13px] [&>button:hover]:bg-gray-50/60 dark:[&>button:hover]:bg-gray-800/60 [&>a]:flex [&>a]:w-full [&>a]:h-[1.6875rem] [&>a]:items-center [&>a]:gap-2 [&>a]:rounded-xl! [&>a]:px-2! [&>a]:text-[13px] [&>a:hover]:bg-gray-50/60 dark:[&>a:hover]:bg-gray-800/60 [&>button_svg]:size-3.5 [&>a_svg]:size-3.5 [&>hr]:my-0.5 [&>hr]:mx-1`} {style} > diff --git a/src/lib/components/common/DropdownSub.svelte b/src/lib/components/common/DropdownSub.svelte index daa15766d0..1a8c355316 100644 --- a/src/lib/components/common/DropdownSub.svelte +++ b/src/lib/components/common/DropdownSub.svelte @@ -1,6 +1,7 @@