From 651a02ed2f3f1f887d13ccd77dbd3495fd8ffe16 Mon Sep 17 00:00:00 2001 From: joaoback <156559121+joaoback@users.noreply.github.com> Date: Mon, 29 Jun 2026 23:14:01 -0300 Subject: [PATCH 01/42] i18n: add pt-BR translations for newly added UI items and consistency pass (#26391) 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 | 396 ++++++++++---------- 1 file changed, 198 insertions(+), 198 deletions(-) diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index 1ca6fd0e37..d387319cd6 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -17,12 +17,12 @@ "{{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}} arquivo selecionado. Apenas arquivos novos e modificados serão enviados. Arquivos excluídos serão removidos. A estrutura de pastas será espelhada. Continuar?", "{{count}} files selected. Only new and modified files will be uploaded. Deleted files will be removed. The folder structure will be mirrored. Continue?_many": "{{count}} arquivos selecionados. Apenas arquivos novos e modificados serão enviados. Arquivos excluídos serão removidos. A estrutura de pastas será espelhada. Continuar?", "{{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}} arquivos selecionados. Apenas arquivos novos e modificados serão enviados. Arquivos excluídos serão removidos. A estrutura de pastas será espelhada. Continuar?", - "{{count}} filters_one": "", - "{{count}} filters_many": "", - "{{count}} filters_other": "", - "{{count}} groups_one": "", - "{{count}} groups_many": "", - "{{count}} groups_other": "", + "{{count}} filters_one": "{{count}} filtro", + "{{count}} filters_many": "{{count}} filtros", + "{{count}} filters_other": "{{count}} filtros", + "{{count}} groups_one": "{{count}} grupo", + "{{count}} groups_many": "{{count}} grupos", + "{{count}} groups_other": "{{count}} grupos", "{{COUNT}} hidden lines": "{{COUNT}} linhas ocultas", "{{COUNT}} members": "{{COUNT}} membros", "{{count}} of {{total}} accessible_one": "{{count}} de {{total}} acessível", @@ -34,17 +34,17 @@ "{{count}} selected_many": "{{count}} selecionados", "{{count}} selected_other": "{{count}} selecionados", "{{COUNT}} Sources": "{{COUNT}} Origens", - "{{count}} users_one": "", - "{{count}} users_many": "", - "{{count}} users_other": "", + "{{count}} users_one": "{{count}} usuário", + "{{count}} users_many": "{{count}} usuários", + "{{count}} users_other": "{{count}} usuários", "{{COUNT}} words": "{{COUNT}} palavras", "{{COUNT}}d_time_ago": "{{COUNT}}d atrás", "{{COUNT}}h_time_ago": "{{COUNT}}h atrás", "{{COUNT}}m_time_ago": "{{COUNT}}m atrás", "{{COUNT}}w_time_ago": "{{COUNT}}sem atrás", "{{COUNT}}y_time_ago": "{{COUNT}}a atrás", - "{{label}} contains invalid JSON": "", - "{{label}} must be a JSON object": "", + "{{label}} contains invalid JSON": "{{label}} contém JSON inválido", + "{{label}} must be a JSON object": "{{label}} deve ser um objeto JSON", "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "{{LOCALIZED_DATE}} às {{LOCALIZED_TIME}}", "{{model}} download has been canceled": "O download do {{model}} foi cancelado", "{{modelName}} profile image": "Imagem de perfil de {{modelName}}", @@ -52,10 +52,10 @@ "{{user}}'s Chats": "Chats de {{user}}", "{{webUIName}} Backend Required": "Backend {{webUIName}} necessário", "*Prompt node ID(s) are required for image generation": "*Prompt node ID(s) são obrigatórios para gerar imagens", - "1 group": "", + "1 group": "1 grupo", "1 hour before": "1 hora antes", "1 Source": "1 Origem", - "1 user": "", + "1 user": "1 usuário", "10 minutes before": "10 minutos antes", "15 minutes before": "15 minutos antes", "1m_time_ago": "1m atrás", @@ -73,7 +73,7 @@ "Access Control": "Controle de Acesso", "Access Grants": "Concessões de Acesso", "Access List": "Lista de acesso", - "Access prohibited": "", + "Access prohibited": "Acesso proibido", "Access updated": "Acesso atualizado", "Accessible to all users": "Acessível para todos os usuários", "Account": "Conta", @@ -89,7 +89,7 @@ "Activity": "Atividade", "Add": "Adicionar", "Add a model ID": "Adicione um ID de modelo", - "Add a preference, fact, or instruction about you": "", + "Add a preference, fact, or instruction about you": "Adicione uma preferência, fato ou instrução sobre você", "Add a short description about what this model does": "Adicione uma descrição curta sobre o que este modelo faz", "Add a tag": "Adicionar uma tag", "Add a tag...": "Adicione uma tag...", @@ -102,10 +102,10 @@ "Add Custom Prompt": "Adicionar prompt personalizado", "Add description": "Adicionar descrição", "Add Details": "Adicionar detalhes", - "Add durable context for future chats": "", + "Add durable context for future chats": "Adicionar contexto durável para chats futuros", "Add Files": "Adicionar Arquivos", "Add Image": "Adicionar imagem", - "Add Knowledge Connection": "", + "Add Knowledge Connection": "Adicionar Conexão de Conhecimento", "Add location": "Adicionar localização", "Add Member": "Adicionar membro", "Add Members": "Adicionar membros", @@ -120,7 +120,7 @@ "Add to favorites": "Adicionar aos favoritos", "Add User": "Adicionar Usuário", "Add User Group": "Adicionar grupo de usuários", - "Add webhook": "", + "Add webhook": "Adicionar webhook", "Add webpage": "Adicionar página web", "Add your Open Terminal URL and API key in Settings → Integrations.": "Adicione a URL do Open Terminal e a chave de API em Configurações → Integrações.", "Additional Config": "Configuração adicional", @@ -133,9 +133,9 @@ "Admin": "Admin", "Admin Contact Email": "E-mail de contato do administrador", "Admin Panel": "Painel do Admin", - "Admin Roles": "", + "Admin Roles": "Funções de Admin", "Admin Settings": "Configurações do Admin", - "Admin-managed service account": "", + "Admin-managed service account": "Conta de serviço gerenciada pelo admin", "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Os administradores têm acesso a todas as ferramentas o tempo todo; os usuários precisam de ferramentas atribuídas, por modelo, no workspace.", "Advanced": "Avançado", "Advanced Parameters": "Parâmetros Avançados", @@ -146,21 +146,21 @@ "All": "Tudo", "All chats have been unarchived.": "Todos os chats foram desarquivados.", "All day": "O dia todo", - "All events": "", + "All events": "Todos os eventos", "All models are now hidden": "Todos os modelos estão agora ocultos", "All models are now visible": "Todos os modelos estão agora visíveis", "All models deleted successfully": "Todos os modelos foram excluídos com sucesso", - "All shared chats have been unshared.": "", - "All Sources": "", + "All shared chats have been unshared.": "Todos os chats compartilhados foram descompartilhados.", + "All Sources": "Todas as Origens", "All time": "Todo o período", "All Users": "Todos os usuários", - "All users and system events": "", + "All users and system events": "Todos os usuários e eventos do sistema", "Allow Call": "Permitir chamada", "Allow Chat Controls": "Permitir Controles de Chats", "Allow Chat Delete": "Permitir Exclusão de Chats", "Allow Chat Edit": "Permitir Edição de Chats", "Allow Chat Export": "Permitir Exportação de Chat", - "Allow Chat Import": "", + "Allow Chat Import": "Permitir Importação de Chat", "Allow Chat Params": "Permitir Parâmetros de Chat", "Allow Chat Share": "Permitir Compartilhamento de Chat", "Allow Chat System Prompt": "Permitir Prompt do Sistema no Chat", @@ -180,11 +180,11 @@ "Allow User Location": "Permitir Localização do Usuário", "Allow Voice Interruption in Call": "Permitir Interrupção de Voz na Chamada", "Allow Web Upload": "Permitir Upload da Web", - "Allowed Domains": "", + "Allowed Domains": "Domínios Permitidos", "Allowed Endpoints": "Endpoints Permitidos", "Allowed File Extensions": "Extensões de arquivo permitidas", "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "Extensões de arquivo permitidas para upload. Separe várias extensões com vírgulas. Deixe em branco para todos os tipos de arquivo.", - "Allowed Roles": "", + "Allowed Roles": "Funções Permitidas", "Already have an account?": "Já possui uma conta?", "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.": "Alternativa ao top_p, visando garantir um equilíbrio entre qualidade e variedade. O parâmetro p representa a probabilidade mínima de um token ser considerado, em relação à probabilidade do token mais provável. Por exemplo, com p = 0,05 e o token mais provável tendo uma probabilidade de 0,9, logits com valor inferior a 0,045 são filtrados.", "Always": "Sempre", @@ -203,7 +203,7 @@ "API Base URL": "URL Base da API", "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "URL base da API para o serviço Datalab Marker. O padrão é: https://www.datalab.to/api/v1/marker", "API Key": "Chave API", - "API Key / Token": "", + "API Key / Token": "Chave API / Token", "API Key created.": "Chave API criada.", "API Key Endpoint Restrictions": "Restrições de endpoint de chave de API", "API keys": "Chaves API", @@ -233,18 +233,18 @@ "Are you sure you want to delete this memory? This action cannot be undone.": "Tem certeza de que deseja excluir esta memória? Esta ação não pode ser desfeita.", "Are you sure you want to delete this message?": "Tem certeza de que deseja excluir esta mensagem?", "Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "Tem certeza de que deseja excluir esta versão? As versões filhas serão vinculadas novamente à versão pai.", - "Are you sure you want to delete this webhook? This action cannot be undone.": "", + "Are you sure you want to delete this webhook? This action cannot be undone.": "Tem certeza de que deseja excluir este webhook? Esta ação não pode ser desfeita.", "Are you sure you want to delete this?": "Tem certeza de que deseja excluir isto?", - "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 reset all permissions to their default values? You will still need to save to apply the changes.": "Tem certeza de que deseja redefinir todas as permissões para seus valores padrão? Você ainda precisará salvar para aplicar as alterações.", "Are you sure you want to unarchive all archived chats?": "Você tem certeza que deseja desarquivar todos os chats arquivados?", - "Are you sure you want to unshare all shared chats? This will remove all share links.": "", + "Are you sure you want to unshare all shared chats? This will remove all share links.": "Tem certeza de que deseja descompartilhar todos os chats compartilhados? Isso removerá todos os links de compartilhamento.", "Arena Models": "Arena de Modelos", "Artifacts": "Artefatos", "Asc": "Crescente", "Ask": "Perguntar", "Ask a question": "Faça uma pergunta", - "Ask a test question": "", - "Ask this knowledge source a test question": "", + "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", "Assistant": "Assistente", "Async Embedding Processing": "Processamento de Embedding assíncrono", "At time of event": "No horário do evento", @@ -259,20 +259,20 @@ "Audio": "Áudio", "August": "Agosto", "Auth": "Autenticação", - "Auth Mode": "", - "Auth required": "", + "Auth Mode": "Modo de Autenticação", + "Auth required": "Autenticação necessária", "Authenticate": "Autenticar", "Authentication": "Autenticação", "Auto": "Auto", "Auto (Random)": "Automático (Aleatório)", - "Auto Redirect": "", + "Auto Redirect": "Redirecionamento Automático", "Auto-Copy Response to Clipboard": "Cópia Automática da Resposta para a Área de Transferência", - "Auto-Create Groups": "", + "Auto-Create Groups": "Criação Automática de Grupos", "Auto-Playback Response": "Reprodução automática da resposta", "Autocomplete Generation": "Geração de preenchimento automático", "Autocomplete Generation Input Max Length": "Comprimento máximo de entrada de geração de preenchimento automático", - "Autocomplete Generation Prompt": "", - "Automatic": "", + "Autocomplete Generation Prompt": "Prompt de Geração de Preenchimento Automático", + "Automatic": "Automático", "Automatic1111": "Automatic1111", "AUTOMATIC1111 Api Auth String": "String de Autenticação da API AUTOMATIC1111", "AUTOMATIC1111 Base URL": "URL Base AUTOMATIC1111", @@ -290,7 +290,7 @@ "Available Skills": "Habilidades disponíveis", "Available Tools": "Ferramentas disponíveis", "available users": "usuários disponíveis", - "Available variables": "", + "Available variables": "Variáveis disponíveis", "available!": "disponível!", "Away": "Ausente", "Awful": "Horrível", @@ -301,7 +301,7 @@ "Bad Response": "Resposta Ruim", "Banners": "Banners", "Base Model (From)": "Modelo Base (De)", - "Base Model is required.": "", + "Base Model is required.": "Modelo Base é obrigatório.", "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.": "O cache da lista de modelos base acelera o acesso buscando modelos base somente na inicialização ou ao salvar as configurações — mais rápido, mas pode não mostrar alterações recentes no modelo base.", "Bearer": "Bearer", "before": "antes", @@ -311,7 +311,7 @@ "Bing Search V7 Subscription Key": "Chave de assinatura do Bing Search V7", "Bio": "Sobre você", "Birth Date": "Data de nascimento", - "Blocked Groups": "", + "Blocked Groups": "Grupos Bloqueados", "BM25 Weight": "Peso BM25", "Bocha Search API Key": "Chave da API de pesquisa Bocha", "Bold": "Negrito", @@ -440,7 +440,7 @@ "Collaboration channel where people join as members": "Canal de colaboração onde as pessoas se juntam como membros.", "Collapse": "Recolher", "Collection": "Coleção", - "Collection Field": "", + "Collection Field": "Campo de Coleção", "Collections": "Coleções", "Color": "Cor", "ComfyUI": "ComfyUI", @@ -450,14 +450,14 @@ "ComfyUI Workflow": "Fluxo de trabalho ComfyUI", "ComfyUI Workflow Nodes": "Nós do fluxo de trabalho ComfyUI", "Comma separated Node Ids (e.g. 1 or 1,2)": "IDs de Nodes separados por vírgula (por exemplo, 1 ou 1,2)", - "Comma-separated group names": "", + "Comma-separated group names": "Nomes de grupos separados por vírgula", "Comma-separated list of file extensions MinerU will handle (e.g. pdf, docx, pptx, xlsx)": "Lista de extensões de arquivo separadas por vírgulas que o MinerU processará (por exemplo, pdf, docx, pptx, xlsx)", "command": "comando", "Command": "Comando", "Comment": "Comentário", "Commit Message": "Mensagem de Commit", "Community Reviews": "Avaliações da comunidade", - "Compacting context": "", + "Compacting context": "Compactando contexto", "Comparing with knowledge base...": "Comparando com a base de conhecimento...", "Completions": "Completions", "Compress Images in Channels": "Comprimir imagens em canais", @@ -480,7 +480,7 @@ "Connect to Open Terminal instances. All users will have access to file browsing and terminal tools through these servers.": "Conecte-se a instâncias do Open Terminal. Todos os usuários terão acesso à navegação de arquivos e ferramentas de terminal por meio desses servidores.", "Connect to your own OpenAI compatible API endpoints.": "Conecte-se aos seus próprios endpoints de API compatíveis com OpenAI.", "Connect to your own OpenAPI compatible external tool servers.": "Conecte-se aos seus próprios servidores de ferramentas externas compatíveis com OpenAPI.", - "Connected": "", + "Connected": "Conectado", "Connected ({{type}})": "Conectado ({{type}})", "Connection failed": "Falha na conexão", "Connection lost. Reconnecting...": "Conexão perdida. Reconectando...", @@ -493,16 +493,16 @@ "Contact Admin for WebUI Access": "Contate o Administrador para verificar seu acesso", "Content": "Conteúdo", "Content Extraction Engine": "Mecanismo de Extração de Conteúdo", - "Content Field": "", + "Content Field": "Campo de Conteúdo", "Content lengths (character counts only)": "Extensão do conteúdo (apenas em caracteres)", - "Context": "", - "Context compacted": "", - "Context Compaction": "", - "Context compaction failed": "", - "Context Compaction Prompt": "", - "Context Compaction Threshold": "", + "Context": "Contexto", + "Context compacted": "Contexto compactado", + "Context Compaction": "Compactação de Contexto", + "Context compaction failed": "Falha na compactação de contexto", + "Context Compaction Prompt": "Prompt de Compactação de Contexto", + "Context Compaction Threshold": "Limite de Compactação de Contexto", "Context Tokens": "Tokens de Contexto", - "Continue": "", + "Continue": "Continuar", "Continue Response": "Continuar Resposta", "Continue with {{provider}}": "Continuar com {{provider}}", "Continue with Email": "Continuar com Email", @@ -550,7 +550,7 @@ "Create new secret key": "Criar nova chave secreta", "Create note": "Criar nota", "Create Note": "Criar Nota", - "Create one read-only Knowledge source per external collection. Test must pass before the source is created.": "", + "Create one read-only Knowledge source per external collection. Test must pass before the source is created.": "Criar uma fonte de Conhecimento somente leitura por coleção externa. O teste deve passar antes que a fonte seja criada.", "Create scheduled prompts that run automatically on a recurring basis.": "Crie prompts agendados que sejam executados automaticamente de forma recorrente.", "Create your first note by clicking on the plus button below.": "Crie sua primeira nota clicando no botão de adição abaixo.", "Created at": "Criado em", @@ -568,7 +568,7 @@ "Custom Gender": "Gênero personalizado", "Custom Parameter Name": "Nome do parâmetro personalizado", "Custom Parameter Value": "Valor do parâmetro personalizado", - "Custom range": "", + "Custom range": "Intervalo personalizado", "Daily": "Diário", "Daily Messages": "Mensagens Diárias", "Danger Zone": "Zona de Perigo", @@ -600,7 +600,7 @@ "Default to ALL": "Padrão para TODOS", "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "Use a recuperação segmentada como padrão para extração de conteúdo focado e relevante; isso é recomendado para a maioria dos casos.", "Default User Role": "Padrão para novos usuários", - "Default webhook": "", + "Default webhook": "Webhook padrão", "Defaults": "Padrões", "Delete": "Excluir", "Delete {{name}}": "Excluir {{name}}", @@ -661,8 +661,8 @@ "Disable Code Interpreter": "Desativar o interpretador de código", "Disable Image Extraction": "Desativar extração de imagem", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Desabilite a extração de imagens do PDF. Se a opção Usar LLM estiver habilitada, as imagens serão legendadas automaticamente. O padrão é Falso.", - "Disable Image Generation": "", - "Disable Web Search": "", + "Disable Image Generation": "Desativar Geração de Imagem", + "Disable Web Search": "Desativar Pesquisa na Web", "Disabled": "Desativado", "Disconnect OAuth": "Desconectar OAuth", "Discover a function": "Descubra uma função", @@ -691,7 +691,7 @@ "Docling Parameters": "Parâmetros Docling", "Docling Server URL required.": "URL do servidor Docling necessária.", "Document": "Documento", - "Document ID Field": "", + "Document ID Field": "Campo de ID do Documento", "Document Intelligence": "Inteligência de documentos", "Document Intelligence endpoint required.": "É necessário o endpoint do Document Intelligence.", "Document Intelligence Model": "Modelo de Inteligência de Documentos", @@ -747,14 +747,14 @@ "Edit Default Permissions": "Editar Permissões Padrão", "Edit Folder": "Editar Pasta", "Edit Image": "Editar imagem", - "Edit Knowledge Connection": "", + "Edit Knowledge Connection": "Editar Conexão de Conhecimento", "Edit Last Message": "Editar última mensagem", "Edit Memory": "Editar Memória", "Edit Prompt": "Editar prompt", "Edit Terminal Connection": "Editar Conexão de Terminal", "Edit User": "Editar Usuário", "Edit User Group": "Editar Grupo de Usuários", - "Edit webhook": "", + "Edit webhook": "Editar webhook", "Edit workflow.json content": "Editar conteúdo do workflow.json", "edited": "editado", "Edited": "Editado", @@ -763,7 +763,7 @@ "Eject model": "Ejetar modelo", "ElevenLabs": "ElevenLabs", "Email": "Email", - "Email Claim": "", + "Email Claim": "Reivindicação de Email", "Embark on adventures": "Embarque em aventuras", "Embedding": "Embedding", "Embedding Batch Size": "Tamanho do Lote de Embedding", @@ -772,7 +772,7 @@ "Embedding Model Engine": "Motor do Modelo de Embedding", "Emoji": "Emoji", "Emojis": "Emojis", - "Empty": "", + "Empty": "Vazio", "Empty message": "Mensagem vazia", "Enable All": "Ativar tudo", "Enable API Keys": "Habilitar Chaves de API", @@ -780,21 +780,21 @@ "Enable Code Execution": "Habilitar execução de código", "Enable Code Interpreter": "Habilitar intérprete de código", "Enable Community Sharing": "Ativar Compartilhamento com a Comunidade", - "Enable Group Mapping": "", - "Enable Image Generation": "", + "Enable Group Mapping": "Habilitar Mapeamento de Grupos", + "Enable Image Generation": "Habilitar Geração de Imagem", "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.": "Habilite o bloqueio de memória (mlock) para evitar que os dados do modelo sejam transferidos da RAM para a área de troca (swap). Essa opção bloqueia o conjunto de páginas em uso pelo modelo na RAM, garantindo que elas não sejam transferidas para o disco. Isso pode ajudar a manter o desempenho, evitando falhas de página e garantindo acesso rápido aos dados.", "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.": "Habilite o mapeamento de memória (mmap) para carregar dados do modelo. Esta opção permite que o sistema use o armazenamento em disco como uma extensão da RAM, tratando os arquivos do disco como se estivessem na RAM. Isso pode melhorar o desempenho do modelo, permitindo acesso mais rápido aos dados. No entanto, pode não funcionar corretamente com todos os sistemas e consumir uma quantidade significativa de espaço em disco.", "Enable Message Queue": "Habilitar fila de mensagens", "Enable Message Rating": "Ativar Avaliação de Mensagens", "Enable Mirostat sampling for controlling perplexity.": "Habilitar amostragem Mirostat para controlar a perplexidade.", "Enable New Sign Ups": "Ativar Novos Cadastros", - "Enable OAuth Signup": "", - "Enable Role Mapping": "", - "Enable Web Search": "", + "Enable OAuth Signup": "Habilitar Cadastro OAuth", + "Enable Role Mapping": "Habilitar Mapeamento de Funções", + "Enable Web Search": "Habilitar Pesquisa na Web", "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.": "Habilite, desabilite ou personalize as tags de raciocínio usadas pelo modelo. \"Ativado\" usa tags padrão, \"Desativado\" desativa as tags de raciocínio e \"Personalizado\" permite que você especifique suas próprias tags de início e fim.", "Enabled": "Ativado", "End Tag": "Tag final", - "Endpoint": "", + "Endpoint": "Endpoint", "Endpoint URL": "URL do Endpoint", "Enforce Temporary Chat": "Aplicar chat temporário", "Enhance": "Melhorar", @@ -817,8 +817,8 @@ "Enter Chunk Min Size Target": "Insira o tamanho mínimo desejado para cada bloco.", "Enter Chunk Overlap": "Digite a Sobreposição de Chunk", "Enter Chunk Size": "Digite o Tamanho do Chunk", - "Enter Client ID": "", - "Enter Client Secret": "", + "Enter Client ID": "Insira o ID do Cliente", + "Enter Client Secret": "Insira a Chave Secreta do Cliente", "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Insira pares \"token:bias_value\" separados por vírgulas (exemplo: 5432:100, 413:-100)", "Enter content for the pending user info overlay. Leave empty for default.": "Insira o conteúdo para a sobreposição de informações pendentes do usuário. Deixe em branco para o padrão.", "Enter coordinates (e.g. 51.505, -0.09)": "Insira as coordenadas (por exemplo, 51,505, -0,09)", @@ -856,11 +856,11 @@ "Enter Jupyter URL": "Insira a URL do Jupyter", "Enter Kagi Search API Key": "Insira a chave da API de pesquisa do Kagi", "Enter Key Behavior": "Comportamento da tecla Enter", - "Enter language": "", + "Enter language": "Insira o idioma", "Enter language codes": "Digite os códigos de idioma", "Enter Linkup API Key": "Insira a chave da API Linkup", - "Enter Microsoft Web IQ API Base URL": "", - "Enter Microsoft Web IQ API Key": "", + "Enter Microsoft Web IQ API Base URL": "Insira a URL base da API Microsoft Web IQ", + "Enter Microsoft Web IQ API Key": "Insira a chave da API Microsoft Web IQ", "Enter MinerU API Key": "Insira a chave da API do MinerU", "Enter Mistral API Base URL": "Insira a URL base da API Mistral", "Enter Mistral API Key": "Insira a chave da API Mistral", @@ -880,7 +880,7 @@ "Enter prompt here.": "Insira o prompt aqui.", "Enter proxy URL (e.g. https://user:password@host:port)": "Insira a URL do proxy (por exemplo, https://usuário:senha@host:porta)", "Enter reasoning effort": "Insira o esforço de raciocínio", - "Enter Redirect URI": "", + "Enter Redirect URI": "Insira o URI de Redirecionamento", "Enter Score": "Digite a Pontuação", "Enter SearchApi API Key": "Digite a Chave API do SearchApi", "Enter SearchApi Engine": "Digite o Motor do SearchApi", @@ -890,7 +890,7 @@ "Enter SerpApi API Key": "Insira a chave da API SerpApi", "Enter SerpApi Engine": "Digite o mecanismo/engine SerpApi", "Enter Serper API Key": "Digite a Chave API do Serper", - "Enter SERPHouse API Key": "", + "Enter SERPHouse API Key": "Insira a chave da API SERPHouse", "Enter Serply API Key": "Digite a Chave API do Serply", "Enter Serpstack API Key": "Digite a Chave API do Serpstack", "Enter server host": "Digite o host do servidor", @@ -911,8 +911,8 @@ "Enter Tika Server URL": "Digite a URL do Servidor Tika", "Enter timeout in seconds": "Insira o tempo limite em segundos", "Enter to Send": "Enter para Enviar", - "Enter token threshold": "", - "Enter Tokenizer Model": "", + "Enter token threshold": "Insira o limite de token", + "Enter Tokenizer Model": "Insira o Modelo de Tokenizador", "Enter Top K": "Digite o Top K", "Enter Top K Reranker": "Digite o Top K Reranker", "Enter URL (e.g. http://127.0.0.1:7860/)": "Digite a URL (por exemplo, http://127.0.0.1:7860/)", @@ -953,15 +953,15 @@ "Error: A model with the ID '{{modelId}}' already exists. Please select a different ID to proceed.": "Erro: Já existe um modelo com o ID '{{modelId}}'. Selecione um ID diferente para prosseguir.", "Error: Model ID cannot be empty. Please enter a valid ID to proceed.": "Erro: O ID do modelo não pode estar vazio. Insira um ID válido para prosseguir.", "Evaluations": "Avaliações", - "Event": "", + "Event": "Evento", "Event created": "Evento criado", "Event deleted": "Evento excluído", - "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.": "Os nomes dos eventos podem mudar conforme o OWUI evolui. Use padrões amplos como user.* para integrações que devam continuar em novos eventos relacionados.", "Event title": "Título do evento", "Event updated": "Evento atualizado", - "Events": "", + "Events": "Eventos", "Exa API Key": "Chave da API Exa", - "Example": "", + "Example": "Exemplo", "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Exemplo: (&(objectClass=inetOrgPerson)(uid=%s))", "Example: ALL": "Exemplo: ALL", "Example: mail": "Exemplo: mail", @@ -989,18 +989,18 @@ "Export Config": "Exportar Configuração", "Export Models": "Exportar Modelos", "Export Prompts": "Exportar Prompts", - "Export Skills": "", + "Export Skills": "Exportar Skills", "Export to CSV": "Exportar para CSV", "Export Tools": "Exportar Ferramentas", "Export Users": "Exportar Usuários", "External": "Externo", - "External connection not found.": "", + "External connection not found.": "Conexão externa não encontrada.", "External Document Loader URL required.": "URL do carregador de documentos externo necessária.", - "External Knowledge Source": "", - "External Knowledge Sources": "", + "External Knowledge Source": "Fonte de Conhecimento Externa", + "External Knowledge Sources": "Fontes de Conhecimento Externas", "External Task Model": "Modelo de Tarefa Externa", - "External Tool Servers": "", - "External vectors must be generated with the same embedding model configured in Open WebUI.": "", + "External Tool Servers": "Servidores de Ferramentas Externas", + "External vectors must be generated with the same embedding model configured in Open WebUI.": "Os vetores externos devem ser gerados com o mesmo modelo de embedding configurado no OWUI.", "External Web Loader API Key": "Chave de API do carregador da Web externo", "External Web Loader URL": "URL do carregador da Web externo", "External Web Search API Key": "Chave de API de pesquisa na Web externa", @@ -1018,7 +1018,7 @@ "Failed to create API Key.": "Falha ao criar a Chave API.", "Failed to delete calendar": "Falha ao excluir calendário", "Failed to delete note": "Falha ao excluir a nota", - "Failed to delete webhook": "", + "Failed to delete webhook": "Falha ao excluir webhook", "Failed to disconnect": "Falha ao desconectar", "Failed to download image": "Falha ao baixar a imagem", "Failed to extract content from the file: {{error}}": "Falha ao extrair conteúdo do arquivo: {{error}}", @@ -1026,7 +1026,7 @@ "Failed to fetch models": "Falha ao buscar modelos", "Failed to generate title": "Falha ao gerar título", "Failed to import models": "Falha ao importar modelos", - "Failed to load chat": "", + "Failed to load chat": "Falha ao carregar chat", "Failed to load chat preview": "Falha ao carregar a pré-visualização do chat", "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.", @@ -1036,7 +1036,7 @@ "Failed to move chat": "Falha ao mover o chat", "Failed to process URL: {{url}}": "Falha ao processar URL: {{url}}", "Failed to read clipboard contents": "Falha ao ler o conteúdo da área de transferência", - "Failed to refresh terminals: {{error}}": "", + "Failed to refresh terminals: {{error}}": "Falha ao atualizar terminais: {{error}}", "Failed to remove member": "Falha ao remover membro", "Failed to render diagram": "Falha ao renderizar o diagrama", "Failed to render visualization": "Falha ao renderizar a visualização", @@ -1045,11 +1045,11 @@ "Failed to save models configuration": "Falha ao salvar a configuração dos modelos", "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": "", + "Failed to save webhook": "Falha ao salvar webhook", "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", - "Failed to update webhook": "", + "Failed to update webhook": "Falha ao atualizar webhook", "Failed to upload file.": "Falha ao carregar o arquivo.", "Features": "Funcionalidades", "Features Permissions": "Permissões das Funcionalidades", @@ -1082,8 +1082,8 @@ "File uploaded successfully": "Arquivo carregado com sucesso", "Filename": "Nome do arquivo", "Files": "Arquivos", - "Fill the required fields first.": "", - "Fill the source fields and test query first.": "", + "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", "Filter is now globally disabled": "O filtro está agora desativado globalmente", "Filter is now globally enabled": "O filtro está agora ativado globalmente", @@ -1106,7 +1106,7 @@ "Folder options": "Opções da pasta", "Folder updated successfully": "Pasta atualizada com sucesso", "Folders": "Pastas", - "Folders Sharing": "", + "Folders Sharing": "Compartilhamento de Pastas", "Follow up": "Acompanhamento", "Follow Up Generation": "Geração de Acompanhamento", "Follow Up Generation Prompt": "Prompt para Geração dos Acompanhamentos", @@ -1137,7 +1137,7 @@ "Function is now globally enabled": "A função está agora ativada globalmente", "Function Name": "Nome da Função", "Function Name Filter List": "Lista de filtros de nomes de funções", - "Function starter": "", + "Function starter": "Inicializador de função", "Function updated successfully": "Função atualizada com sucesso", "Functions": "Funções", "Functions allow arbitrary code execution.": "Funções permitem a execução arbitrária de código.", @@ -1170,10 +1170,10 @@ "Gravatar": "Gravatar", "Grid": "Grade", "Grokipedia": "Grokipedia", - "group": "", - "Group": "", + "group": "grupo", + "Group": "Grupo", "Group Channel": "Canal do grupo", - "Group Claim": "", + "Group Claim": "Reivindicação de Grupo", "Group created successfully": "Grupo criado com sucesso", "Group deleted successfully": "Grupo excluído com sucesso", "Group Description": "Descrição do Grupo", @@ -1185,7 +1185,7 @@ "H2": "Subtítulo", "H3": "Sub-subtítulo", "Haptic Feedback": "Feedback Tátil", - "Header variables": "", + "Header variables": "Variáveis de cabeçalho", "Headers": "Cabeçalhos", "Headers must be a valid JSON object": "Os cabeçalhos devem ser um objeto JSON válido", "Height": "Altura", @@ -1216,8 +1216,8 @@ "ID": "ID", "ID cannot contain \":\" or \"|\" characters": "O ID não pode conter caracteres \":\" ou \"|\"", "ID copied to clipboard": "ID copiado para a área de transferência", - "Identity audit": "", - "Idle only": "", + "Identity audit": "Auditoria de identidade", + "Idle only": "Apenas inativo", "Idle Timeout": "Tempo Limite de Inatividade", "iframe Sandbox Allow Forms": "Permitir formulários no sandbox do iframe", "iframe Sandbox Allow Same Origin": "Permitir mesma origem no sandbox do iframe", @@ -1243,7 +1243,7 @@ "Import From Link": "Importar do link", "Import Models": "Importar Modelos", "Import Prompts": "Importar Prompts", - "Import Skills": "", + "Import Skills": "Importar Skills", "Import successful": "Importação bem-sucedida", "Import Tools": "Importar Ferramentas", "Important Update": "Atualização importante", @@ -1313,8 +1313,8 @@ "Knowledge Name": "Nome da Base de Conhecimento", "Knowledge Public Sharing": "Compartilhamento Público da Base de Conhecimento", "Knowledge Sharing": "Compartilhamento da Base de Conhecimento", - "Knowledge source created.": "", - "Knowledge source updated.": "", + "Knowledge source created.": "Fonte de conhecimento criada.", + "Knowledge source updated.": "Fonte de conhecimento atualizada.", "Knowledge updated successfully": "Conhecimento atualizado com sucesso", "Kokoro.js (Browser)": "Kokoro.js (Navegador)", "Kokoro.js Dtype": "Dtype do Kokoro.js", @@ -1352,7 +1352,7 @@ "Legacy": "Legado", "lexical": "lexical", "License": "Licença", - "Lifecycle JSON": "", + "Lifecycle JSON": "JSON de ciclo de vida", "Lift List": "Lista de elevação", "Light": "Claro", "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "Limitar consultas de pesquisa simultâneas. 0 = ilimitado (padrão). Defina como 1 para execução sequencial (recomendado para APIs com limites de taxa rígidos, como o nível gratuito do Brave).", @@ -1376,7 +1376,7 @@ "Location access not allowed": "Acesso ao local não permitido", "Lost": "Perdeu", "Low": "Baixo", - "Lower the context compaction token threshold for this model. The global context compaction threshold remains the maximum.": "", + "Lower the context compaction token threshold for this model. The global context compaction threshold remains the maximum.": "Reduza o limite de token de compactação de contexto para este modelo. O limite global de compactação de contexto permanece o máximo.", "LTR": "Esquerda para Direita", "Made by Open WebUI Community": "Feito pela Comunidade OpenWebUI", "Make password visible in the user interface": "Tornar a senha visível na interface do usuário", @@ -1393,7 +1393,7 @@ "Manage Pipelines": "Gerenciar Pipelines", "Manage Tool Servers": "Gerenciar servidores de ferramentas", "Manage your account information.": "Gerencie as informações da sua conta.", - "Mapped Source": "", + "Mapped Source": "Fonte Mapeada", "March": "Março", "Markdown": "Markdown", "Markdown Header Text Splitter": "Separador de texto de cabeçalho Markdown", @@ -1421,7 +1421,7 @@ "Memory cleared successfully": "Memória limpa com sucesso", "Memory deleted successfully": "Memória excluída com sucesso", "Memory updated successfully": "Memória atualizada com sucesso", - "Merge Accounts by Email": "", + "Merge Accounts by Email": "Mesclar Contas por Email", "Merge Responses": "Mesclar respostas", "Merged Response": "Resposta Mesclada", "Message": "Mensagem", @@ -1432,12 +1432,12 @@ "messages": "mensagens", "Messages": "Mensagens", "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Mensagens enviadas após criar seu link não serão compartilhadas. Usuários com o URL poderão visualizar o chat compartilhado.", - "Metadata Field": "", + "Metadata Field": "Campo de Metadados", "Microsoft OneDrive": "Microsoft OneDrive", "Microsoft OneDrive (personal)": "Microsoft OneDrive (pessoal)", "Microsoft OneDrive (work/school)": "Microsoft OneDrive (trabalho/escola)", - "Microsoft Web IQ API Base URL": "", - "Microsoft Web IQ API Key": "", + "Microsoft Web IQ API Base URL": "URL base da API Microsoft Web IQ", + "Microsoft Web IQ API Key": "Chave da API Microsoft Web IQ", "min": "min", "MinerU": "MinerU", "MinerU API Key required for Cloud API mode.": "Chave de API MinerU necessária para o modo Cloud API.", @@ -1490,7 +1490,7 @@ "Models Sharing": "Compartilhamento de Modelos", "Mojeek": "Mojeek", "Mojeek Search API Key": "Chave de API Mojeek Search", - "Monday – Friday": "", + "Monday – Friday": "Segunda – Sexta", "Month": "Mês", "Monthly": "Mensal", "More": "Mais", @@ -1508,7 +1508,7 @@ "Name your knowledge base": "Nome da sua base de conhecimento", "Name, prompt, and model are required": "Nome, prompt e modelo são obrigatórios.", "Native": "Nativo", - "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.": "", + "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.": "O modo nativo (padrão) aproveita as capacidades de chamada de ferramentas integradas do modelo. O modo legado funciona com uma gama mais ampla de modelos chamando ferramentas uma vez antes da execução via injeção de prompt.", "Never": "Nunca", "New": "Novo", "New Automation": "Nova Automação", @@ -1538,7 +1538,7 @@ "Next run": "Próxima execução", "No access grants. Private to you.": "Sem permissões de acesso. Privacidade exclusiva para você.", "No activity data": "Sem dados de atividade", - "No additional headers are sent unless configured.": "", + "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 chats found": "Nenhum chat encontrado", @@ -1551,10 +1551,10 @@ "No data": "Sem dados", "No data found": "Nenhum dado encontrado", "No distance available": "Sem distância disponível", - "No event webhooks configured.": "", + "No event webhooks configured.": "Nenhum webhook de evento configurado.", "No execution logs available yet": "Ainda não há registros de execução disponíveis.", "No expiration can pose security risks.": "A ausência de expiração pode representar riscos de segurança.", - "No external knowledge sources configured.": "", + "No external knowledge sources configured.": "Nenhuma fonte de conhecimento externa configurada.", "No feedback found": "Nenhum feedback encontrado", "No file selected": "Nenhum arquivo selecionado", "No files found": "Nenhum arquivo encontrado", @@ -1582,7 +1582,7 @@ "No output items": "Nenhum item de saída", "No pinned messages": "Nenhuma mensagem fixada", "No prompts found": "Nenhum prompt encontrado", - "No Repeat": "", + "No Repeat": "Sem Repetição", "No results": "Nenhum resultado encontrado", "No results found": "Nenhum resultado encontrado", "No search query generated": "Nenhuma consulta de pesquisa gerada", @@ -1602,7 +1602,7 @@ "No webhooks yet": "Ainda não há webhooks", "Node Ids": "IDs dos nós", "None": "Nenhum", - "Not configured": "", + "Not configured": "Não configurado", "Not factually correct": "Não está factualmente correto", "Not helpful": "Não é útil", "Not Registered": "Não registrado", @@ -1618,25 +1618,25 @@ "Notifications": "Notificações", "November": "Novembro", "OAuth": "OAuth", - "OAuth / OIDC": "", + "OAuth / OIDC": "OAuth / OIDC", "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "OAuth 2.1 (Estático)", "OAuth ID": "OAuth ID", - "OAuth Resource Parameter": "", - "OAuth Scopes": "", + "OAuth Resource Parameter": "Parâmetro de Recurso OAuth", + "OAuth Scopes": "Escopos OAuth", "OAuth Server URL": "URL do Servidor OAuth", "OAuth session disconnected": "Sessão OAuth desconectada", "October": "Outubro", "Off": "Desligado", "Okay, Let's Go!": "Ok, Vamos Lá!", - "Older messages are summarized when estimated context exceeds this token limit.": "", + "Older messages are summarized when estimated context exceeds this token limit.": "Mensagens mais antigas são resumidas quando o contexto estimado excede este limite de token.", "OLED Dark": "OLED Escuro", "Ollama": "Ollama", "Ollama API": "API Ollama", "Ollama API settings updated": "Configurações da API Ollama atualizadas", "Ollama Cloud API Key": "Chave da API Ollama Cloud", "Ollama Version": "Versão Ollama", - "Omit": "", + "Omit": "Omitir", "On": "Ligado", "Once": "Uma vez", "OneDrive": "OneDrive", @@ -1707,7 +1707,7 @@ "Password": "Senha", "Passwords do not match.": "As senhas não coincidem.", "Paste Large Text as File": "Cole Textos Longos como Arquivo", - "Path": "", + "Path": "Caminho", "Path copied": "Caminho copiado", "Paused": "Em pausa", "PDF document (.pdf)": "Documento PDF (.pdf)", @@ -1716,21 +1716,21 @@ "pdf, docx, pptx, xlsx": "pdf, docx, pptx, xlsx", "pending": "pendente", "Pending": "Pendente", - "Pending Accounts": "", + "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", "Permission denied when accessing media devices": "Permissão negada ao acessar dispositivos de mídia", "Permission denied when accessing microphone": "Permissão negada ao acessar o microfone", "Permission denied when accessing microphone: {{error}}": "Permissão negada ao acessar o microfone: {{error}}", "Permissions": "Permissões", - "Permissions reset to defaults": "", + "Permissions reset to defaults": "Permissões redefinidas para os padrões", "Perplexity API Key": "Chave API da Perplexity", "Perplexity Model": "Modelo Perplexity", "Perplexity Search API URL": "URL da API de pesquisa Perplexity", "Perplexity Search Context Usage": "Uso do contexto de pesquisa do Perplexity", "Persistent": "Persistente", "Personalization": "Personalização", - "Picture Claim": "", + "Picture Claim": "Reivindicação de Foto", "Pin": "Fixar", "Pin to Sidebar": "Fixar na barra lateral", "Pinned": "Fixado", @@ -1769,7 +1769,7 @@ "Please select at least one user for Direct Message channel.": "Por favor, selecione pelo menos um usuário para o canal de Mensagens Diretas.", "Please wait until all files are uploaded.": "Aguarde até que todos os arquivos sejam enviados.", "Policy ID": "ID da Política", - "Policy ID is required": "", + "Policy ID is required": "ID da Política é obrigatório", "Port": "Porta", "Ports": "Portas", "Positive attitude": "Atitude positiva", @@ -1799,8 +1799,8 @@ "Prompts Public Sharing": "Compartilhamento Público dos Prompts", "Prompts Sharing": "Compartilhamento de Prompts", "Provider": "Provedor", - "Provider Name": "", - "Provider URL": "", + "Provider Name": "Nome do Provedor", + "Provider URL": "URL do Provedor", "Public": "Público", "Pull \"{{searchValue}}\" from Ollama.com": "Obter \"{{searchValue}}\" de Ollama.com", "Pull a model from Ollama.com": "Obter um modelo de Ollama.com", @@ -1818,30 +1818,30 @@ "Read": "Ler", "Read Aloud": "Ler em Voz Alta", "Read more →": "Leia mais →", - "Read only": "", + "Read only": "Somente leitura", "Read Only": "Somente leitura", "Read-Only Access": "Acesso somente leitura", "Reason": "Razão", "Reasoning Effort": "Esforço de raciocínio", "Reasoning Tags": "Tags de raciocínio", "Reasoning text...": "Texto de raciocínio...", - "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.": "", + "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", "Reconnected": "Reconectado", "Record": "Gravar", "Record voice": "Gravar voz", - "Redirect URI": "", + "Redirect URI": "URI de Redirecionamento", "Redirecting you to Open WebUI Community": "Redirecionando você para a Comunidade OpenWebUI", "Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "Reduz a probabilidade de gerar respostas sem sentido. Um valor mais alto (por exemplo, 100) resultará em respostas mais diversas, enquanto um valor mais baixo (por exemplo, 10) será mais conservador.", "Reference Chats": "Chats de Referência", "Refresh": "Atualizar", - "Refresh requested: {{count}} terminal(s)_one": "", - "Refresh requested: {{count}} terminal(s)_many": "", - "Refresh requested: {{count}} terminal(s)_other": "", - "Refresh Terminals": "", - "Refreshing...": "", + "Refresh requested: {{count}} terminal(s)_one": "Atualização solicitada: {{count}} terminal", + "Refresh requested: {{count}} terminal(s)_many": "Atualização solicitada: {{count}} terminais", + "Refresh requested: {{count}} terminal(s)_other": "Atualização solicitada: {{count}} terminais", + "Refresh Terminals": "Atualizar Terminais", + "Refreshing...": "Atualizando...", "Refused when it shouldn't have": "Recusado quando não deveria", "Regenerate": "Gerar novamente", "Regenerate Menu": "Regenerar Menu", @@ -1876,26 +1876,26 @@ "Render Markdown in Previews": "Renderizar Markdown nas Pré-visualizações", "Render Markdown in User Messages": "Renderizar Markdown nas Mensagens do Usuário", "Reorder Models": "Reordenar modelos", - "Repeat": "", + "Repeat": "Repetir", "Repeats": "Repetições", "Reply": "Responder", "Reply in Thread": "Responder no tópico", "Reply to thread...": "Responder ao tópico...", "Replying to {{NAME}}": "Respondendo para {{NAME}}", - "Require users to confirm before using Web Search.": "", + "Require users to confirm before using Web Search.": "Exigir que os usuários confirmem antes de usar a Pesquisa na Web.", "required": "obrigatório", "Reranking Batch Size": "Tamanho do lote de reclassificação", "Reranking Engine": "Motor de Reclassificação", "Reranking Model": "Modelo de Reclassificação", - "Research Knowledge": "", + "Research Knowledge": "Pesquisar Conhecimento", "Reset": "Redefinir", "Reset All Models": "Redefinir todos os modelos", - "Reset all permissions to their initial configuration values": "", - "Reset group permissions to match the current default user permissions": "", + "Reset all permissions to their initial configuration values": "Redefinir todas as permissões para seus valores de configuração inicial", + "Reset group permissions to match the current default user permissions": "Redefinir permissões do grupo para corresponder às permissões padrão atuais do usuário", "Reset Image": "Redefinir imagem", "Reset knowledge base?": "Redefinir base de conhecimento?", - "Reset persisted files": "", - "Reset to Defaults": "", + "Reset persisted files": "Redefinir arquivos persistidos", + "Reset to Defaults": "Redefinir para Padrões", "Reset Upload Directory": "Redefinir Diretório de Upload", "Reset Vector Storage/Knowledge": "Redefinir Armazenamento de Vetores/Conhecimento", "Reset view": "Redefinir visualização", @@ -1916,7 +1916,7 @@ "Retrieved 1 source": "1 fonte recuperada", "Rich Text Input for Chat": "Entrada de rich text para o chat", "Role": "Função", - "Roles Claim": "", + "Roles Claim": "Reivindicação de Funções", "RTL": "Direita para Esquerda", "Run": "Executar", "Run All": "Executar Tudo", @@ -1935,12 +1935,12 @@ "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": "Salvar registros de chat diretamente no armazenamento do seu navegador não é mais suportado. Por favor, reserve um momento para baixar e excluir seus registros de chat clicando no botão abaixo. Não se preocupe, você pode facilmente reimportar seus registros de chat para o backend através de", "Schedule": "Agendar", "Scheduled time must be in the future": "O horário agendado deve ser no futuro.", - "Scopes": "", + "Scopes": "Escopos", "Scroll On Branch Change": "Rolar na mudança de ramo", "Scroll to Top": "Rolar para o topo", "Search": "Pesquisar", "Search a model": "Pesquisar um modelo", - "Search actions": "", + "Search actions": "Pesquisar ações", "Search all emojis": "Pesquisar todos os emojis", "Search and manage user memories": "Pesquisar e gerenciar memórias de usuários", "Search and view user chat history": "Pesquise e visualize o histórico de chat do usuário", @@ -1950,7 +1950,7 @@ "Search Chats": "Pesquisar Chats", "Search Collection": "Pesquisar Coleção", "Search Files": "Pesquisar arquivos", - "Search filters": "", + "Search filters": "Filtros de pesquisa", "Search Filters": "Pesquisar Filtros", "search for archived chats": "pesquisar por chats arquivados", "search for folders": "procurar pastas", @@ -1965,16 +1965,16 @@ "Search Models": "Pesquisar Modelos", "Search Notes": "Pesquisar Notas", "Search options": "Opções de pesquisa", - "Search or add pattern": "", + "Search or add pattern": "Pesquisar ou adicionar padrão", "Search Prompts": "Pesquisar Prompts", "Search Result Count": "Contagem de Resultados da Pesquisa", - "Search skills": "", + "Search skills": "Pesquisar habilidades", "Search Skills": "Pesquisar Skills", "Search the internet": "Pesquisar na Internet", "Search the web and fetch URLs": "Pesquise na web e obtenha URLs", - "Search tools": "", + "Search tools": "Pesquisar ferramentas", "Search Tools": "Pesquisar Ferramentas", - "Search users or groups": "", + "Search users or groups": "Pesquisar usuários ou grupos", "Search, view, and manage user notes": "Pesquise, visualize e gerencie notas do usuário.", "SearchApi API Key": "Chave API SearchApi", "SearchApi Engine": "Motor SearchApi", @@ -2027,25 +2027,25 @@ "semantic": "semântica", "Send": "Enviar", "Send a Message": "Enviar uma Mensagem", - "Send events for": "", + "Send events for": "Enviar eventos para", "Send message": "Enviar mensagem", "Send now": "Enviar agora", - "Send product events as JSON to external services. Chat destinations receive readable messages.": "", - "Send the PDF as a base64 data URL instead of uploading it first.": "", + "Send product events as JSON to external services. Chat destinations receive readable messages.": "Enviar eventos de produto como JSON para serviços externos. Destinos de chat recebem mensagens legíveis.", + "Send the PDF as a base64 data URL instead of uploading it first.": "Enviar o PDF como uma URL de dados base64 em vez de fazer upload primeiro.", "Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "Envia `stream_options: { include_usage: true }` na solicitação. Provedores compatíveis retornarão informações sobre o uso de tokens na resposta quando configurado.", "September": "Setembro", "SerpApi API Key": "Chave da API SerpApi", "SerpApi Engine": "Motor SerpApi", "Serper API Key": "Chave da API Serper", - "SERPHouse API Key": "", - "SERPHouse Domain": "", + "SERPHouse API Key": "Chave da API SERPHouse", + "SERPHouse Domain": "Domínio SERPHouse", "Serply API Key": "Chave da API Serply", "Serpstack API Key": "Chave da API Serpstack", "Server connection failed": "Falha na conexão com o servidor", "Server connection verified": "Conexão com o servidor verificada", - "Service Account": "", + "Service Account": "Conta de Serviço", "Session": "Sessão", - "Session expired. Please sign in again.": "", + "Session expired. Please sign in again.": "Sessão expirada. Por favor, faça login novamente.", "Set as default": "Definir como padrão", "Set as Production": "Definir como Produção", "Set embedding model": "Definir modelo de embedding", @@ -2073,7 +2073,7 @@ "Share link copied to clipboard.": "Link de compartilhamento copiado para a área de transferência.", "Share to Open WebUI Community": "Compartilhar com a Comunidade OpenWebUI", "Share your background and interests": "Fale sobre você e seus interesses", - "Shared": "", + "Shared": "Compartilhado", "Shared Chats": "Chats compartilhados", "Shared with you": "Compartilhado com você", "Sharing Permissions": "Permissões de compartilhamento", @@ -2083,7 +2083,7 @@ "Show All": "Mostrar Tudo", "Show all ({{COUNT}} characters)": "Mostrar todos os ({{COUNT}} caracteres)", "Show Files": "Mostrar arquivos", - "Show Files on Terminal Select": "", + "Show Files on Terminal Select": "Mostrar Arquivos ao Selecionar Terminal", "Show Formatting Toolbar": "Mostrar barra de ferramentas de formatação", "Show image preview": "Mostrar pré-visualização da imagem", "Show Model": "Mostrar modelo", @@ -2127,7 +2127,7 @@ "Sougou Search API sID": "sID da API de pesquisa Sougou", "Sougou Search API SK": "SK da API de pesquisa Sougou", "Source": "Fonte", - "Specific users or groups": "", + "Specific users or groups": "Usuários ou grupos específicos", "Speech Playback Speed": "Velocidade de reprodução de fala", "Speech recognition error: {{error}}": "Erro de reconhecimento de fala: {{error}}", "Speech-to-Text": "Fala-para-Texto", @@ -2165,7 +2165,7 @@ "STT Settings": "Configurações STT", "Stylized PDF Export": "Exportação de PDF estilizado", "Su_day_of_week": "Dom", - "Sub Claim": "", + "Sub Claim": "Reivindicação Sub", "Submit question": "Enviar pergunta", "Submit suggestion": "Enviar sugestão", "Subtitle": "Subtítulo", @@ -2190,10 +2190,10 @@ "Syncing...": "Sincronizando...", "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "Sincroniza apenas as conversas com atualizações posteriores à sua última sincronização. Desative para sincronizar todas as conversas novamente.", "System": "Sistema", - "System events only": "", + "System events only": "Apenas eventos do sistema", "System Instructions": "Instruções do sistema", "System Prompt": "Prompt do Sistema", - "Table": "", + "Table": "Tabela", "Tag": "Tag", "Tags": "Tags", "Tags Generation": "Geração de tags", @@ -2214,12 +2214,12 @@ "Temporary Chat by Default": "Chat temporário por padrão", "Terminal": "Terminal", "Terminal servers saved": "Servidores de terminal salvos", - "Test": "", - "Test Query": "", - "Test returned no results.": "", - "Test succeeded.": "", - "Test the source before creating it.": "", - "Test the source before saving it.": "", + "Test": "Testar", + "Test Query": "Consulta de Teste", + "Test returned no results.": "O teste não retornou resultados.", + "Test succeeded.": "Teste bem-sucedido.", + "Test the source before creating it.": "Teste a fonte antes de criá-la.", + "Test the source before saving it.": "Teste a fonte antes de salvá-la.", "Text Splitter": "Divisor de Texto", "Text-to-Speech": "Texto-para-Fala", "Text-to-Speech Engine": "Motor de Texto para Fala", @@ -2256,7 +2256,7 @@ "This folder is empty": "Esta pasta está vazia", "This is a default user permission and will remain enabled.": "Esta é uma permissão de usuário padrão e permanecerá ativada.", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "Esta é uma funcionalidade experimental, pode não funcionar como esperado e está sujeita a alterações a qualquer momento.", - "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.": "Esta base de conhecimento recupera de uma fonte conectada. O OWUI pode consultá-la, mas não pode fazer upload, sincronizar, editar, excluir, redefinir ou reindexar seus dados de origem.", "This model is not publicly available. Please select another model.": "Este modelo não está disponível publicamente. Selecione outro modelo.", "This option controls how long the model will stay loaded into memory following the request (default: 5m)": "Esta opção controla por quanto tempo o modelo permanecerá carregado na memória após a solicitação (padrão: 5m)", "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "Esta opção controla quantos tokens são preservados ao atualizar o contexto. Por exemplo, se definido como 2, os últimos 2 tokens do contexto da conversa serão mantidos. Preservar o contexto pode ajudar a manter a continuidade de uma conversa, mas pode reduzir a capacidade de responder a novos tópicos.", @@ -2311,8 +2311,8 @@ "Toggle whether current connection is active.": "Alterna se a conexão atual está ativa.", "Token": "Token", "Token counts are estimates and may not reflect actual API usage": "A contagem de tokens é uma estimativa e pode não refletir o uso real da API.", - "Token Threshold": "", - "Tokenizer Model": "", + "Token Threshold": "Limite de Token", + "Tokenizer Model": "Modelo de Tokenizador", "tokens": "tokens", "Tokens": "Tokens", "Too verbose": "Muito detalhado", @@ -2361,19 +2361,19 @@ "Unpin": "Desfixar", "Unpin from Sidebar": "Desfixar da barra lateral", "Unravel secrets": "Desvendar segredos", - "Unshare All": "", - "Unshare All Shared Chats": "", + "Unshare All": "Descompartilhar Tudo", + "Unshare All Shared Chats": "Descompartilhar Todos os Chats Compartilhados", "Unshare Chat": "Cancelar compartilhamento do chat", "Unsupported file type.": "Tipo de arquivo não suportado.", "Untagged": "Sem tag", "Untitled": "Sem título", "Update": "Atualizar", "Update and Copy Link": "Atualizar e Copiar Link", - "Update Email": "", + "Update Email": "Atualizar Email", "Update for the latest features and improvements.": "Atualizar para as novas funcionalidades e melhorias.", - "Update Name": "", + "Update Name": "Atualizar Nome", "Update password": "Atualizar senha", - "Update Picture": "", + "Update Picture": "Atualizar Foto", "Update your status": "Atualize seu status", "Updated": "Atualizado", "Updated at": "Atualizado em", @@ -2400,18 +2400,18 @@ "Use": "Usar", "Use '#' in the prompt input to load and include your knowledge.": "Usar '#' no prompt para carregar e incluir seus conhecimentos.", "Use /v1/chat/completions endpoint instead of /v1/audio/transcriptions for potentially better accuracy.": "Use o endpoint /v1/chat/completions em vez de /v1/audio/transcriptions para obter uma precisão potencialmente melhor.", - "Use a valid event name or pattern like user.*": "", - "Use Base64": "", + "Use a valid event name or pattern like user.*": "Use um nome de evento válido ou padrão como user.*", + "Use Base64": "Usar Base64", "Use Chat Completions API": "Usar API de Chat Completions", - "Use discovered scopes": "", + "Use discovered scopes": "Usar escopos descobertos", "Use groups to organize your users and assign permissions.": "Use grupos para organizar seus usuários e atribuir permissões.", "Use LLM": "Usar LLM", "Use no proxy to fetch page contents.": "Não utilize proxy para buscar o conteúdo da página.", "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "Use o proxy designado pelas variáveis de ambiente http_proxy e https_proxy para buscar o conteúdo da página.", - "Use Web Search?": "", + "Use Web Search?": "Usar Pesquisa na Web?", "user": "usuário", "User": "Usuário", - "User Access": "", + "User Access": "Acesso do Usuário", "User Activity": "Atividade do usuário", "User Groups": "Grupos de usuários", "User location successfully retrieved.": "Localização do usuário recuperada com sucesso.", @@ -2421,7 +2421,7 @@ "User Status": "Status do usuário", "User Webhooks": "Webhooks do usuário", "Username": "Nome do Usuário", - "Username Claim": "", + "Username Claim": "Reivindicação de Nome de Usuário", "users": "usuários", "Users": "Usuários", "Uses DefaultAzureCredential to authenticate": "Usa DefaultAzureCredential para autenticar", @@ -2435,7 +2435,7 @@ "Valves updated": "Configurações atualizadas", "Valves updated successfully": "Configurações atualizadas com sucesso", "variable": "variável", - "Vector Field": "", + "Vector Field": "Campo de Vetor", "Verify Connection": "Verificar conexão", "Verify SSL Certificate": "Verificar certificado SSL", "Version": "Versão", @@ -2465,14 +2465,14 @@ "Web API": "API Web", "Web Loader Engine": "Motor de carregamento da Web", "Web Search": "Pesquisa na Web", - "Web Search Confirmation": "", - "Web Search Confirmation Content": "", + "Web Search Confirmation": "Confirmação de Pesquisa na Web", + "Web Search Confirmation Content": "Conteúdo de Confirmação de Pesquisa na Web", "Web Search Engine": "Mecanismo de Busca na Web", "Web Search in Chat": "Pesquisa na Web no Chat", "Web Search Query Generation": "Geração de consulta de pesquisa na Web", - "Webhook deleted": "", + "Webhook deleted": "Webhook excluído", "Webhook Name": "Nome do Webhook", - "Webhook saved": "", + "Webhook saved": "Webhook salvo", "Webhooks": "Webhooks", "Webpage URLs": "URLs de páginas da web", "WebUI Settings": "Configurações da WebUI", @@ -2515,7 +2515,7 @@ "Yandex Web Search API Key": "Chave da API de pesquisa Yandex", "Yandex Web Search config": "Configuração de pesquisa Yandex", "Yandex Web Search URL": "URL de pesquisa Yandex", - "Yearly": "", + "Yearly": "Anual", "Yesterday": "Ontem", "Yesterday at {{LOCALIZED_TIME}}": "Ontem às {{LOCALIZED_TIME}}", "You": "Você", @@ -2545,7 +2545,7 @@ "Your browser does not support the video tag.": "Seu navegador não suporta a tag de vídeo.", "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.": "Toda a sua contribuição irá diretamente para o desenvolvedor do plugin; o Open WebUI não retém nenhuma porcentagem. No entanto, a plataforma de financiamento escolhida pode ter suas próprias taxas.", "Your message text or inputs": "Seu texto de mensagem ou entradas", - "Your query will be sent to the configured web search provider.": "", + "Your query will be sent to the configured web search provider.": "Sua consulta será enviada ao provedor de pesquisa na web configurado.", "Your usage stats have been successfully synced.": "Suas estatísticas de uso foram sincronizadas com sucesso.", "YouTube": "YouTube", "Youtube Language": "Idioma do YouTube", From 4067e357b2ff9e2fb59866d24656e832908fb6fe Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 29 Jun 2026 21:31:49 -0500 Subject: [PATCH 02/42] refac --- .env.example | 3 +++ backend/open_webui/config.py | 2 ++ backend/open_webui/routers/auths.py | 2 ++ backend/open_webui/utils/middleware.py | 2 +- src/lib/components/admin/Settings/General.svelte | 10 ++++++++++ 5 files changed, 18 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index df63e08e0e..55bf5d386f 100644 --- a/.env.example +++ b/.env.example @@ -13,6 +13,9 @@ OPENAI_API_KEY='' # CORS_ALLOW_ORIGIN='http://localhost:5173;http://localhost:8080' CORS_ALLOW_ORIGIN='*' +# Set to false to keep memory tools enabled without adding memory context to the system context. +ENABLE_MEMORY_SYSTEM_CONTEXT=true + # For production you should set this to match the proxy configuration (127.0.0.1) FORWARDED_ALLOW_IPS='*' diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 7cadde33fe..058348365b 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -394,6 +394,7 @@ CODE_EXECUTION_JUPYTER_TIMEOUT = int(os.getenv('CODE_EXECUTION_JUPYTER_TIMEOUT', ENABLE_CODE_INTERPRETER = os.getenv('ENABLE_CODE_INTERPRETER', 'True').lower() == 'true' ENABLE_MEMORIES = os.getenv('ENABLE_MEMORIES', 'True').lower() == 'true' +ENABLE_MEMORY_SYSTEM_CONTEXT = os.getenv('ENABLE_MEMORY_SYSTEM_CONTEXT', 'True').lower() == 'true' ENABLE_MEMORY_BACKGROUND_REVIEW = os.getenv('ENABLE_MEMORY_BACKGROUND_REVIEW', 'False').lower() == 'true' MEMORIES_REVIEW_INTERVAL_TURNS = int(os.getenv('MEMORIES_REVIEW_INTERVAL_TURNS', '10')) MEMORIES_USER_CHAR_LIMIT = int(os.getenv('MEMORIES_USER_CHAR_LIMIT', '2000')) @@ -2741,6 +2742,7 @@ DEFAULT_CONFIG = { 'code_execution.jupyter.timeout': CODE_EXECUTION_JUPYTER_TIMEOUT, 'code_interpreter.enable': ENABLE_CODE_INTERPRETER, 'memories.enable': ENABLE_MEMORIES, + 'memories.system_context.enable': ENABLE_MEMORY_SYSTEM_CONTEXT, 'memories.background_review.enable': ENABLE_MEMORY_BACKGROUND_REVIEW, 'memories.review_interval_turns': MEMORIES_REVIEW_INTERVAL_TURNS, 'memories.user_char_limit': MEMORIES_USER_CHAR_LIMIT, diff --git a/backend/open_webui/routers/auths.py b/backend/open_webui/routers/auths.py index 9f71ecafb8..660b9e7d96 100644 --- a/backend/open_webui/routers/auths.py +++ b/backend/open_webui/routers/auths.py @@ -105,6 +105,7 @@ ADMIN_CONFIG_KEYS = { 'ENABLE_CHANNELS': 'channels.enable', 'ENABLE_CALENDAR': 'calendar.enable', 'ENABLE_MEMORIES': 'memories.enable', + 'ENABLE_MEMORY_SYSTEM_CONTEXT': 'memories.system_context.enable', 'ENABLE_NOTES': 'notes.enable', 'ENABLE_USER_WEBHOOKS': 'ui.enable_user_webhooks', 'ENABLE_USER_STATUS': 'users.enable_status', @@ -1142,6 +1143,7 @@ class AdminConfig(BaseModel): ENABLE_CHANNELS: bool ENABLE_CALENDAR: bool ENABLE_MEMORIES: bool + ENABLE_MEMORY_SYSTEM_CONTEXT: bool ENABLE_NOTES: bool ENABLE_USER_WEBHOOKS: bool ENABLE_USER_STATUS: bool diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index fc8802a683..c9121120f7 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -2427,7 +2427,7 @@ async def process_chat_payload(request, form_data, user, metadata, model): form_data['messages'], ) - if 'memory' in features and features['memory']: + if 'memory' in features and features['memory'] and await Config.get('memories.system_context.enable'): form_data = await add_memory_context(request, form_data, user, model) if 'web_search' in features and features['web_search']: diff --git a/src/lib/components/admin/Settings/General.svelte b/src/lib/components/admin/Settings/General.svelte index 44c4f44628..3d0a916a1b 100644 --- a/src/lib/components/admin/Settings/General.svelte +++ b/src/lib/components/admin/Settings/General.svelte @@ -297,6 +297,16 @@ + {#if adminConfig.ENABLE_MEMORIES} +
+
+ {$i18n.t('Memory System Context')} +
+ + +
+ {/if} +
{$i18n.t('Notes')} From 1014c212a4b436c0b8da2f04df7833912d81ff1c Mon Sep 17 00:00:00 2001 From: Sicknine <156204309+SNaytiP@users.noreply.github.com> Date: Wed, 1 Jul 2026 03:18:18 +0700 Subject: [PATCH 03/42] i18n(th-TH): translate missing Thai keys/fix typo (#26406) --- src/lib/i18n/locales/th-TH/translation.json | 282 ++++++++++---------- 1 file changed, 141 insertions(+), 141 deletions(-) diff --git a/src/lib/i18n/locales/th-TH/translation.json b/src/lib/i18n/locales/th-TH/translation.json index bb40186d82..5990dc46c6 100644 --- a/src/lib/i18n/locales/th-TH/translation.json +++ b/src/lib/i18n/locales/th-TH/translation.json @@ -5,64 +5,64 @@ "(e.g. `sh webui.sh --api`)": "(เช่น `sh webui.sh --api`)", "(latest)": "(ล่าสุด)", "(leave blank for to use commercial endpoint)": "(เว้นว่างไว้เพื่อใช้ endpoint เชิงพาณิชย์)", - "[Last] dddd [at] h:mm A": "[Last] dddd [เวลา] h:mm A", + "[Last] dddd [at] h:mm A": "[ล่าสุด] dddd [เวลา] h:mm A", "[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": "", + "{{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}} filters_other": "", - "{{count}} groups_other": "", + "{{count}} filters_other": "{{count}} ตัวกรอง", + "{{count}} groups_other": "{{count}} กลุ่ม", "{{COUNT}} hidden lines": "{{COUNT}} บรรทัดที่ซ่อนอยู่", - "{{COUNT}} members": "", - "{{count}} of {{total}} accessible_other": "", + "{{COUNT}} members": "{{COUNT}} สมาชิก", + "{{count}} of {{total}} accessible_other": "{{count}} จาก {{total}} ที่เข้าถึงได้", "{{COUNT}} Replies": "{{COUNT}} คำตอบ", - "{{COUNT}} Rows": "", - "{{count}} selected_other": "", + "{{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}}h_time_ago": "", - "{{COUNT}}m_time_ago": "", - "{{COUNT}}w_time_ago": "", - "{{COUNT}}y_time_ago": "", - "{{label}} contains invalid JSON": "", - "{{label}} must be a JSON object": "", + "{{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}} มี JSON ที่ไม่ถูกต้อง", + "{{label}} must be a JSON object": "{{label}} ต้องเป็น JSON object", "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "{{LOCALIZED_DATE}} เมื่อ {{LOCALIZED_TIME}}", "{{model}} download has been canceled": "การดาวน์โหลด {{model}} ถูกยกเลิกแล้ว", - "{{modelName}} profile image": "", - "{{NAMES}} reacted with {{REACTION}}": "", + "{{modelName}} profile image": "รูปโปรไฟล์ของ {{modelName}}", + "{{NAMES}} reacted with {{REACTION}}": "{{NAMES}} แสดงความรู้สึก {{REACTION}}", "{{user}}'s Chats": "การแชทของ {{user}}", "{{webUIName}} Backend Required": "ต้องใช้ Backend ของ {{webUIName}}", "*Prompt node ID(s) are required for image generation": "*ต้องระบุ ID ของ prompt node สำหรับการสร้างภาพ", - "1 group": "", - "1 hour before": "", + "1 group": "1 กลุ่ม", + "1 hour before": "1 ชั่วโมงก่อน", "1 Source": "1 แหล่งที่มา", - "1 user": "", - "10 minutes before": "", - "15 minutes before": "", - "1m_time_ago": "", - "30 minutes before": "", - "5 minutes before": "", - "A collaboration channel where people join as members": "", - "A discussion channel where access is controlled by groups and permissions": "", + "1 user": "1 ผู้ใช้", + "10 minutes before": "10 นาทีก่อน", + "15 minutes before": "15 นาทีก่อน", + "1m_time_ago": "1 นาทีที่แล้ว", + "30 minutes before": "30 นาทีก่อน", + "5 minutes before": "5 นาทีก่อน", + "A collaboration channel where people join as members": "ช่องทางการทำงานร่วมกันที่ผู้คนเข้าร่วมเป็นสมาชิก", + "A discussion channel where access is controlled by groups and permissions": "ช่องทางการสนทนาที่การเข้าถึงถูกควบคุมโดยกลุ่มและสิทธิ์", "A new version (v{{LATEST_VERSION}}) is now available.": "เวอร์ชันใหม่ (v{{LATEST_VERSION}}) พร้อมให้ใช้งานแล้ว", - "A private conversation between you and selected users": "", + "A private conversation between you and selected users": "การสนทนาส่วนตัวระหว่างคุณและผู้ใช้ที่เลือก", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Task Model จะถูกใช้เมื่อทำภารกิจต่างๆ เช่น การสร้างหัวข้อแชทและการค้นหาเว็บ", "a user": "ผู้ใช้", "About": "เกี่ยวกับ", "Accept Autocomplete Generation\nJump to Prompt Variable": "ยอมรับการสร้างอัตโนมัติ\nข้ามไปยังตัวแปรพรอมต์", "Access": "การเข้าถึง", "Access Control": "การควบคุมการเข้าถึง", - "Access Grants": "", - "Access List": "", - "Access prohibited": "", - "Access updated": "", + "Access Grants": "การให้สิทธิ์การเข้าถึง", + "Access List": "รายการการเข้าถึง", + "Access prohibited": "การเข้าถึงถูกห้าม", + "Access updated": "การเข้าถึงได้รับการอัปเดต", "Accessible to all users": "เข้าถึงได้สำหรับผู้ใช้ทั้งหมด", "Account": "บัญชี", "Account Activation Pending": "การเปิดใช้งานบัญชีกำลังดำเนินการ", @@ -74,58 +74,58 @@ "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "เปิดใช้งานคำสั่งนี้โดยพิมพ์ \"/{{COMMAND}}\" ในช่องแชท", "Active": "กำลังใช้งาน", "Active Users": "ผู้ใช้ที่ใช้งานอยู่", - "Activity": "", + "Activity": "กิจกรรม", "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 Access": "", + "Add a tag...": "เพิ่มแท็ก...", + "Add Access": "เพิ่มการเข้าถึง", "Add Arena Model": "เพิ่มโมเดล Arena", "Add Connection": "เพิ่มการเชื่อมต่อ", "Add Content": "เพิ่มเนื้อหา", "Add content here": "เพิ่มเนื้อหาตรงนี้", "Add Custom Parameter": "เพิ่มพารามิเตอร์ที่กำหนดเอง", "Add Custom Prompt": "เพิ่มพรอมต์ที่กำหนดเอง", - "Add description": "", + "Add description": "เพิ่มคำอธิบาย", "Add Details": "เพิ่มรายละเอียด", - "Add durable context for future chats": "", + "Add durable context for future chats": "เพิ่มบริบทสำหรับการแชทในอนาคต", "Add Files": "เพิ่มไฟล์", - "Add Image": "", - "Add Knowledge Connection": "", - "Add location": "", - "Add Member": "", - "Add Members": "", + "Add Image": "เพิ่มรูปภาพ", + "Add Knowledge Connection": "เพิ่มการเชื่อมต่อknowledge", + "Add location": "เพิ่มตำแหน่ง", + "Add Member": "เพิ่มสมาชิก", + "Add Members": "เพิ่มสมาชิก", "Add Memory": "เพิ่มความจำ", "Add Model": "เพิ่มโมเดล", "Add Reaction": "เพิ่มรีแอคชัน", - "Add tag": "", + "Add tag": "เพิ่มแท็ก", "Add Tag": "เพิ่มแท็ก", - "Add Terminal": "", - "Add Terminal Connection": "", + "Add Terminal": "เพิ่ม Terminal", + "Add Terminal Connection": "เพิ่มการเชื่อมต่อ Terminal", "Add text content": "เพิ่มเนื้อหาข้อความ", - "Add to favorites": "", + "Add to favorites": "เพิ่มไปยังรายการโปรด", "Add User": "เพิ่มผู้ใช้", "Add User Group": "เพิ่มกลุ่มผู้ใช้", - "Add webhook": "", - "Add webpage": "", - "Add your Open Terminal URL and API key in Settings → Integrations.": "", + "Add webhook": "เพิ่ม webhook", + "Add webpage": "เพิ่ม web page", + "Add your Open Terminal URL and API key in Settings → Integrations.": "เพิ่มURLและAPI keyของOpen TerminalของคุณในSettings → Integrations", "Additional Config": "การกำหนดค่าเพิ่มเติม", "Additional configuration options for marker. This should be a JSON string with key-value pairs. For example, '{\"key\": \"value\"}'. Supported keys include: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level": "ตัวเลือกการกำหนดค่าเพิ่มเติมสำหรับ marker ควรเป็นสตริง JSON ที่มีคู่ key-value เช่น '{\"key\": \"value\"}' คีย์ที่รองรับได้แก่: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level", - "Additional feedback comments": "", + "Additional feedback comments": "ข้อเสนอแนะเพิ่มเติม", "Additional Parameters": "พารามิเตอร์เพิ่มเติม", - "Adds filenames, titles, sections, and snippets into the BM25 text to improve lexical recall.": "", + "Adds filenames, titles, sections, and snippets into the BM25 text to improve lexical recall.": "เพิ่มชื่อไฟล์ ชื่อเรื่อง ส่วน และข้อความย่อเข้าไปในข้อความ BM25 เพื่อปรับปรุงการเรียกคืนทางด้านคำศัพท์", "Adjusting these settings will apply changes universally to all users.": "การปรับการตั้งค่าเหล่านี้จะมีผลกับผู้ใช้ทุกคนทั่วทั้งระบบ", "admin": "ผู้ดูแลระบบ", "Admin": "ผู้ดูแลระบบ", - "Admin Contact Email": "", + "Admin Contact Email": "อีเมลผู้ดูแลระบบ", "Admin Panel": "แผงผู้ดูแลระบบ", - "Admin Roles": "", + "Admin Roles": "บทบาทผู้ดูแลระบบ", "Admin Settings": "การตั้งค่าผู้ดูแลระบบ", - "Admin-managed service account": "", + "Admin-managed service account": "บัญชีบริการที่จัดการโดยผู้ดูแลระบบ", "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "ผู้ดูแลระบบสามารถเข้าถึงเครื่องมือทั้งหมดได้ตลอดเวลา ส่วนผู้ใช้ต้องได้รับการกำหนดเครื่องมือต่อโมเดลในแต่ละพื้นที่ทำงาน", - "Advanced": "", + "Advanced": "ขั้นสูง", "Advanced Parameters": "พารามิเตอร์ขั้นสูง", "Advanced parameters for MinerU parsing (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)": "พารามิเตอร์ขั้นสูงสำหรับการแยกวิเคราะห์ MinerU (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)", "Advanced Params": "พารามิเตอร์ขั้นสูง", @@ -133,22 +133,22 @@ "AI": "AI", "All": "ทั้งหมด", "All chats have been unarchived.": "ยกเลิกการเก็บถาวรการแชททั้งหมดแล้ว", - "All day": "", - "All events": "", - "All models are now hidden": "", - "All models are now visible": "", + "All day": "ทั้งวัน", + "All events": "ทุกevents", + "All models are now hidden": "ทุกโมเดลถูกซ่อนแล้ว", + "All models are now visible": "ทุกโมเดลแสดงแล้ว", "All models deleted successfully": "ลบโมเดลทั้งหมดเรียบร้อยแล้ว", - "All shared chats have been unshared.": "", - "All Sources": "", - "All time": "", - "All Users": "", - "All users and system events": "", + "All shared chats have been unshared.": "แชทที่แชร์ทั้งหมดถูกยกเลิกการแชร์แล้ว", + "All Sources": "ทุกแห่งที่มา", + "All time": "ทั้งหมด", + "All Users": "ทุกผู้ใช้", + "All users and system events": "ทุกผู้ใช้และเหตุการณ์ของระบบ", "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": "อนุญาต System Prompt สำหรับแชท", @@ -158,21 +158,21 @@ "Allow File Upload": "อนุญาตให้อัปโหลดไฟล์", "Allow Multiple Models in Chat": "อนุญาตการใช้หลายโมเดลในการแชท", "Allow non-local voices": "อนุญาตเสียงที่ไม่ใช่แบบ Local", - "Allow public write access": "", + "Allow public write access": "อนุญาตให้เข้าถึงการเขียนสาธารณะ", "Allow Rate Response": "อนุญาตให้ให้คะแนนคำตอบ", "Allow Regenerate Response": "อนุญาตให้สร้างคำตอบใหม่", - "Allow Sharing With Users": "", + "Allow Sharing With Users": "อนุญาตให้แชร์กับผู้ใช้", "Allow Speech to Text": "อนุญาตให้แปลงเสียงเป็นข้อความ", "Allow Temporary Chat": "อนุญาตการแชทชั่วคราว", "Allow Text to Speech": "อนุญาตการแปลงข้อความเป็นเสียง", "Allow User Location": "อนุญาตให้เข้าถึงตำแหน่งที่อยู่ของผู้ใช้", "Allow Voice Interruption in Call": "อนุญาตให้ขัดจังหวะด้วยเสียงระหว่างสาย", - "Allow Web Upload": "", - "Allowed Domains": "", + "Allow Web Upload": "อนุญาตให้อัปโหลดจากเว็บ", + "Allowed Domains": "โดเมนที่อนุญาต", "Allowed Endpoints": "Endpoints ที่อนุญาต", "Allowed File Extensions": "นามสกุลไฟล์ที่อนุญาต", "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "นามสกุลไฟล์ที่อนุญาตให้อัปโหลด คั่นแต่ละนามสกุลด้วยเครื่องหมายจุลภาค เว้นว่างเพื่ออนุญาตไฟล์ทุกประเภท", - "Allowed Roles": "", + "Allowed Roles": "Roles ที่อนุญาต", "Already have an account?": "มีบัญชีอยู่แล้ว?", "Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "ทางเลือกแทน top_p และมุ่งเน้นการสร้างสมดุลระหว่างคุณภาพและความหลากหลาย พารามิเตอร์ p แทนค่าความน่าจะเป็นต่ำสุดสำหรับโทเค็นที่จะถูกพิจารณา โดยอ้างอิงกับความน่าจะเป็นของโทเค็นที่มีโอกาสสูงที่สุด ตัวอย่างเช่น เมื่อ p=0.05 และโทเค็นที่มีโอกาสสูงที่สุดมีความน่าจะเป็น 0.9 logits ที่มีค่าน้อยกว่า 0.045 จะถูกกรองออก", "Always": "เสมอ", @@ -187,57 +187,57 @@ "and {{COUNT}} more": "และอีก {{COUNT}} รายการ", "and create a new shared link.": "และสร้างลิงก์ที่แชร์ใหม่", "Android": "Android", - "Anyone": "", + "Anyone": "ใครก็ได้", "API Base URL": "URL พื้นฐานของ API", "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "URL พื้นฐานของ API สำหรับบริการ Datalab Marker ค่าเริ่มต้น: https://www.datalab.to/api/v1/marker", "API Key": "คีย์ API", - "API Key / Token": "", + "API Key / Token": "คีย์ API / Token", "API Key created.": "สร้างคีย์ API แล้ว", "API Key Endpoint Restrictions": "ข้อจำกัด Endpoint ของ API Key", "API keys": "คีย์ API", - "API Keys": "", + "API Keys": "คีย์ API", "API Mode": "โหมด API", - "API Timeout": "", - "API Type": "", + "API Timeout": "API หมดเวลา", + "API Type": "ประเภท API", "API Version": "เวอร์ชัน API", "API Version is required": "ต้องระบุเวอร์ชัน API", "Application DN": "DN ของแอปพลิเคชัน", "Application DN Password": "รหัสผ่าน DN ของแอปพลิเคชัน", "applies to all users with the \"user\" role": "ใช้กับผู้ใช้ทั้งหมดที่มีบทบาท \"user\"", "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}}\"?": "", - "Are you sure you want to delete **{{modelName}}**?": "", - "Are you sure you want to delete all chats? This action cannot be undone.": "", - "Are you sure you want to delete this channel?": "คุณแน่ใจหรือว่าต้องการลบช่องนี้?", - "Are you sure you want to delete this connection? This action cannot be undone.": "", - "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?": "", - "Are you sure you want to reset all permissions to their default values? You will still need to save to apply the changes.": "", + "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 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.": "คุณแน่ใจใช่มั้ยว่าต้องการลบ 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 unshare all shared chats? This will remove all share links.": "คุณแน่ใจใช่มั้ยว่าต้องการเลิกแชร์แชททั้งหมด? การดำเนินการนี้จะนำลิงก์แชร์ทั้งหมดออก", "Arena Models": "โมเดลใน Arena", "Artifacts": "Artifacts", "Asc": "", "Ask": "ถาม", "Ask a question": "ถามคำถาม", - "Ask a test question": "", - "Ask this knowledge source a test question": "", + "Ask a test question": "ถามคำถามทดสอบ", + "Ask this knowledge source a test question": "ถามคำถามทดสอบกับแหล่งความรู้นี้", "Assistant": "ผู้ช่วย", "Async Embedding Processing": "", - "At time of event": "", + "At time of event": "ณ เวลาของevent", "Attach File From Knowledge": "แนบไฟล์จากฐานความรู้", - "Attach Files": "", + "Attach Files": "แนบไฟล์", "Attach Knowledge": "แนบฐานความรู้", "Attach Notes": "แนบบันทึก", "Attach Webpage": "แนบหน้าเว็บ", @@ -247,38 +247,38 @@ "Audio": "เสียง", "August": "สิงหาคม", "Auth": "การยืนยันตัวตน", - "Auth Mode": "", - "Auth required": "", + "Auth Mode": "โหมดการยืนยันตัวตน", + "Auth required": "จำเป็นต้องยืนยันตัวตน", "Authenticate": "ยืนยันตัวตน", "Authentication": "การยืนยันตัวตน", "Auto": "อัตโนมัติ", - "Auto (Random)": "", - "Auto Redirect": "", + "Auto (Random)": "อัตโนมัติ (สุ่ม)", + "Auto Redirect": "อัตโนมัติ แบบ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": "", + "Autocomplete Generation Input Max Length": "ความยาวสูงสุดของinputของการสร้างข้อความอัตโนมัติ", + "Autocomplete Generation Prompt": "การสร้างpromptอัตโนมัติ", + "Automatic": "อัตโนมัติ", "Automatic1111": "Automatic1111", "AUTOMATIC1111 Api Auth String": "สตริงการตรวจสอบสิทธิ์ API ของ AUTOMATIC1111", "AUTOMATIC1111 Base URL": "URL พื้นฐานของ AUTOMATIC1111", "AUTOMATIC1111 Base URL is required.": "จำเป็นต้องระบุ Base URL ของ AUTOMATIC1111", "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "", - "Automation": "", - "Automation created": "", - "Automation Name": "", - "Automation title": "", - "Automation triggered": "", - "Automation updated": "", - "Automations": "", - "Available list": "รายการที่มีอยู่", - "Available models": "", - "Available Skills": "", - "Available Tools": "เครื่องมือที่มีให้ใช้", - "available users": "ผู้ใช้ที่มีอยู่", - "Available variables": "", + "Automation": "ระบบอัตโนมัติ", + "Automation created": "ระบบอัตโนมัติถูกสร้าง", + "Automation Name": "ชื่อระบบอัตโนมัติ", + "Automation title": "หัวข้อระบบอัตโนมัติ", + "Automation triggered": "ระบบอัตโนมัติถูกเรียกใช้งาน", + "Automation updated": "ระบบอัตโนมัติถูกอัปเดต", + "Automations": "ระบบอัตโนมัติ", + "Available list": "รายการที่พร้อมใช้งาน", + "Available models": "โมเดลที่พร้อมใช้งาน", + "Available Skills": "สกิลที่พร้อมใช้งาน", + "Available Tools": "เครื่องมือที่พร้อมใช้งาน", + "available users": "ผู้ใช้ที่พร้อมใช้งาน", + "Available variables": "ตัวแปรที่มีอยู่", "available!": "พร้อมใช้งาน!", "Away": "ไม่อยู่", "Awful": "แย่", @@ -289,7 +289,7 @@ "Bad Response": "การตอบกลับไม่ถูกต้อง", "Banners": "แบนเนอร์", "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 Model ช่วยเร่งการเข้าถึงโดยดึงข้อมูลโมเดลเฉพาะตอนเริ่มต้นระบบหรือเมื่อบันทึกการตั้งค่า ซึ่งทำให้เร็วขึ้น แต่อาจไม่แสดงการเปลี่ยนแปลงโมเดลล่าสุด", "Bearer": "Bearer", "before": "ก่อน", @@ -299,51 +299,51 @@ "Bing Search V7 Subscription Key": "Subscription Key ของ Bing Search V7", "Bio": "ประวัติส่วนตัว", "Birth Date": "วันเกิด", - "Blocked Groups": "", + "Blocked Groups": "กลุ่มที่ถูกบล็อก", "BM25 Weight": "น้ำหนัก BM25", "Bocha Search API Key": "API Key ของ Bocha Search", "Bold": "ตัวหนา", "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "เพิ่มหรือลดน้ำหนักโทเค็นเฉพาะสำหรับการตอบกลับที่มีข้อจำกัด ค่าไบแอสจะถูกจำกัดระหว่าง -100 ถึง 100 (รวม) (ค่าเริ่มต้น: ไม่มี)", "Brave": "", "Brave Search API Key": "คีย์ API ของ Brave Search", - "Break down complex requests into trackable steps": "", - "Browse and query knowledge bases": "", - "Builtin Tools": "", + "Break down complex requests into trackable steps": "แจ้งคำขอที่ซับซ้อนออกเป็นขั้นตอนที่สามารถติดตามได้", + "Browse and query knowledge bases": "เรียกดูและqueryฐานความรู้", + "Builtin Tools": "อุปกรณ์ที่มีอยู่ในตัว", "Bullet List": "รายการหัวข้อย่อย", "Button ID": "ID ของปุ่ม", "Button Label": "ป้ายชื่อปุ่ม", "Button Prompt": "พรอมต์ของปุ่ม", - "by {{name}}": "", + "by {{name}}": "โดย {{name}}", "By {{name}}": "โดย {{name}}", "Bypass Embedding and Retrieval": "ข้าม Embedding และการค้นคืน", "Bypass Web Loader": "ข้ามตัวโหลดเว็บไซต์", "Cache Base Model List": "แคชรายการโมเดลพื้นฐาน", "Calendar": "ปฏิทิน", - "Calendar created": "", - "Calendar deleted": "", - "Calendar name": "", - "Calendars": "", - "Calendars Public Sharing": "", + "Calendar created": "ปฏิทินถูกสร้าง", + "Calendar deleted": "ปฏิทินถูกลบ", + "Calendar name": "ชื่อปฏิทิน", + "Calendars": "ปฏิทิน", + "Calendars Public Sharing": "การแชร์ปฏิทินสาธารณะ", "Call": "โทร", "Call feature is not supported when using Web STT engine": "ไม่รองรับฟีเจอร์การโทรเมื่อใช้เอนจิน Web STT", "Camera": "กล้อง", "Cancel": "ยกเลิก", - "Cancel download of {{model}}": "", - "Cannot create an empty note.": "", - "Cannot delete the production version": "", + "Cancel download of {{model}}": "ยกเลิกการดาวน์โหลด {{model}}", + "Cannot create an empty note.": "ไม่สามารถสร้างบันทึกว่างได้", + "Cannot delete the production version": "ไม่สามารถลบเวอร์ชันที่ใช้งานจริงได้", "Capabilities": "ความสามารถ", "Capture": "จับภาพ", "Capture Audio": "จับเสียง", "Certificate Path": "เส้นทางใบรับรอง", - "Change folder icon": "", + "Change folder icon": "เปลี่ยนไอคอนโฟลเดอร์", "Change Password": "เปลี่ยนรหัสผ่าน", - "Change User Role": "", + "Change User Role": "เปลี่ยนบทบาทผู้ใช้", "Channel": "ช่องทาง", "Channel deleted successfully": "ลบช่องสำเร็จแล้ว", "Channel Name": "ชื่อช่องทาง", "Channel name cannot be empty.": "ชื่อช่องไม่สามารถเว้นว่างได้", - "Channel name must be less than 128 characters": "", - "Channel Type": "", + "Channel name must be less than 128 characters": "ชื่อช่องต้องมีความยาวน้อยกว่า 128 ตัวอักษร", + "Channel Type": "ประเภทช่องทาง", "Channel updated successfully": "อัปเดตช่องสำเร็จแล้ว", "Channels": "ช่องทาง", "Character": "ตัวละคร", From 6ed56b07c43108763b0dd6ac71378c685ffb0108 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 30 Jun 2026 16:55:25 -0500 Subject: [PATCH 04/42] refac --- src/lib/components/chat/ModelSelector/Selector.svelte | 7 ++++--- src/lib/components/workspace/Models/ModelEditor.svelte | 5 ++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/lib/components/chat/ModelSelector/Selector.svelte b/src/lib/components/chat/ModelSelector/Selector.svelte index 62621689a7..d7645cc2b6 100644 --- a/src/lib/components/chat/ModelSelector/Selector.svelte +++ b/src/lib/components/chat/ModelSelector/Selector.svelte @@ -47,6 +47,7 @@ export let searchEnabled = true; export let searchPlaceholder = $i18n.t('Search a model'); export let selectionOnly = false; + export let includeHidden = false; export let items: { label: string; @@ -218,7 +219,7 @@ return item.model?.direct; } }) - ).filter((item) => !(item.model?.info?.meta?.hidden ?? false)); + ).filter((item) => includeHidden || !(item.model?.info?.meta?.hidden ?? false)); $: if ( selectedTag !== undefined || @@ -391,7 +392,7 @@ onMount(async () => { if (items) { tags = items - .filter((item) => !(item.model?.info?.meta?.hidden ?? false)) + .filter((item) => includeHidden || !(item.model?.info?.meta?.hidden ?? false)) .flatMap((item) => item.model?.tags ?? []) .map((tag) => tag.name.toLowerCase()); // Remove duplicates and sort @@ -595,7 +596,7 @@ {/if}
- {#if tags && items.filter((item) => !(item.model?.info?.meta?.hidden ?? false)).length > 0} + {#if tags && items.filter((item) => includeHidden || !(item.model?.info?.meta?.hidden ?? false)).length > 0}
{ diff --git a/src/lib/components/workspace/Models/ModelEditor.svelte b/src/lib/components/workspace/Models/ModelEditor.svelte index 8be5346cbc..b054678ee8 100644 --- a/src/lib/components/workspace/Models/ModelEditor.svelte +++ b/src/lib/components/workspace/Models/ModelEditor.svelte @@ -123,7 +123,9 @@ !baseModel?.preset && baseModel?.owned_by !== 'arena' && !(baseModel?.direct ?? false) && - (!(baseModel?.info?.meta?.hidden ?? false) || baseModel.id === info.base_model_id) + ($user?.role === 'admin' || + !(baseModel?.info?.meta?.hidden ?? false) || + baseModel.id === info.base_model_id) ) .map((baseModel) => ({ value: baseModel.id, @@ -654,6 +656,7 @@ className="w-[32rem]" triggerClassName="text-sm" selectionOnly + includeHidden={$user?.role === 'admin'} bind:value={info.base_model_id} />
From 139206f0fe189b0320ffd5256d914e844cd853b8 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 30 Jun 2026 16:59:02 -0500 Subject: [PATCH 05/42] refac --- .../components/admin/Settings/Models/ModelMenu.svelte | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib/components/admin/Settings/Models/ModelMenu.svelte b/src/lib/components/admin/Settings/Models/ModelMenu.svelte index aca1f84013..a80a6c9924 100644 --- a/src/lib/components/admin/Settings/Models/ModelMenu.svelte +++ b/src/lib/components/admin/Settings/Models/ModelMenu.svelte @@ -50,7 +50,7 @@ class="min-w-[170px] rounded-xl p-1 border border-gray-100 dark:border-gray-800 z-50 bg-white dark:bg-gray-850 dark:text-white shadow-sm" >
From 0b0eec05f88a7121a43709d212d7c39304bb15f9 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 1 Jul 2026 00:43:00 -0500 Subject: [PATCH 09/42] refac --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index ef274fa918..f06ce4bdb9 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1 @@ -github: tjbck +github: open-webui From 56ee875e21cb3b137a5aa1eca6eb3c0731b14045 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 1 Jul 2026 01:46:36 -0500 Subject: [PATCH 10/42] refac --- src/routes/+layout.svelte | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 57d0a692e2..1e797d2928 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -810,18 +810,17 @@ }); }; - const isAuthFailureResponse = async (response) => { - try { - const data = await response.clone().json(); - const detail = data?.detail; - return ( - detail === '401 Unauthorized' || - detail === 'Not authenticated' || - detail === 'Your session has expired or the token is invalid. Please sign in again.' - ); - } catch { - return true; - } + const isCurrentSessionUnauthorized = async (originalFetch) => { + return originalFetch(`${WEBUI_API_BASE_URL}/auths/`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${localStorage.token}` + }, + credentials: 'include' + }) + .then((res) => res.status === 401) + .catch(() => false); }; const checkTokenExpiry = async () => { @@ -954,7 +953,7 @@ response.status === 401 && localStorage.token && isAuthenticatedBackendFetch(input, init) && - (await isAuthFailureResponse(response)) + (await isCurrentSessionUnauthorized(originalFetch)) ) { redirectToAuthAfterUnauthorized(); } From 2ed8934f5b2bc8a11c74ef2f34cdb62ef024809e Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 1 Jul 2026 02:05:14 -0500 Subject: [PATCH 11/42] refac --- .../workspace/Knowledge/KnowledgeBase.svelte | 403 ++++++++---------- 1 file changed, 185 insertions(+), 218 deletions(-) diff --git a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte index fb8a865fca..cffe0ed852 100644 --- a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte +++ b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte @@ -92,6 +92,9 @@ let showResetConfirm = false; let minSize = 0; + type DirectoryFileEntry = { path: string; filename: string; file: File }; + type DirectoryManifestEntry = DirectoryFileEntry & { checksum: string; size: number }; + type Knowledge = { id: string; name: string; @@ -463,19 +466,9 @@ }; const uploadDirectoryHandler = async () => { - // Check if File System Access API is supported - const isFileSystemAccessSupported = 'showDirectoryPicker' in window; - - try { - if (isFileSystemAccessSupported) { - // Modern browsers (Chrome, Edge) implementation - await handleModernBrowserUpload(); - } else { - // Firefox fallback - await handleFirefoxUpload(); - } - } catch (error) { - handleUploadError(error); + const entries = await collectDirectoryFiles(); + if (entries?.length) { + await uploadDirectoryEntries(entries); } }; @@ -484,146 +477,6 @@ return path.split('/').some((part) => part.startsWith('.')); }; - // Modern browsers implementation using File System Access API - const handleModernBrowserUpload = async () => { - const dirHandle = await window.showDirectoryPicker(); - let totalFiles = 0; - let uploadedFiles = 0; - - // Function to update the UI with the progress - const updateProgress = () => { - const percentage = (uploadedFiles / totalFiles) * 100; - toast.info( - $i18n.t('Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)', { - uploadedFiles: uploadedFiles, - totalFiles: totalFiles, - percentage: percentage.toFixed(2) - }) - ); - }; - - // Recursive function to count all files excluding hidden ones - async function countFiles(dirHandle) { - for await (const entry of dirHandle.values()) { - // Skip hidden files and directories - if (entry.name.startsWith('.')) continue; - - if (entry.kind === 'file') { - totalFiles++; - } else if (entry.kind === 'directory') { - // Only process non-hidden directories - if (!entry.name.startsWith('.')) { - await countFiles(entry); - } - } - } - } - - // Recursive function to process directories excluding hidden files and folders - async function processDirectory(dirHandle, path = '') { - for await (const entry of dirHandle.values()) { - // Skip hidden files and directories - if (entry.name.startsWith('.')) continue; - - const entryPath = path ? `${path}/${entry.name}` : entry.name; - - // Skip if the path contains any hidden folders - if (hasHiddenFolder(entryPath)) continue; - - if (entry.kind === 'file') { - const file = await entry.getFile(); - const fileWithPath = new File([file], entryPath, { type: file.type }); - - await uploadFileHandler(fileWithPath); - uploadedFiles++; - updateProgress(); - } else if (entry.kind === 'directory') { - // Only process non-hidden directories - if (!entry.name.startsWith('.')) { - await processDirectory(entry, entryPath); - } - } - } - } - - await countFiles(dirHandle); - updateProgress(); - - if (totalFiles > 0) { - await processDirectory(dirHandle); - } else { - console.log('No files to upload.'); - } - }; - - // Firefox fallback implementation using traditional file input - const handleFirefoxUpload = async () => { - return new Promise((resolve, reject) => { - // Create hidden file input - const input = document.createElement('input'); - input.type = 'file'; - input.webkitdirectory = true; - input.directory = true; - input.multiple = true; - input.style.display = 'none'; - - // Add input to DOM temporarily - document.body.appendChild(input); - - input.onchange = async () => { - try { - const files = Array.from(input.files) - // Filter out files from hidden folders - .filter((file) => !hasHiddenFolder(file.webkitRelativePath)); - - let totalFiles = files.length; - let uploadedFiles = 0; - - // Function to update the UI with the progress - const updateProgress = () => { - const percentage = (uploadedFiles / totalFiles) * 100; - toast.info( - $i18n.t('Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)', { - uploadedFiles: uploadedFiles, - totalFiles: totalFiles, - percentage: percentage.toFixed(2) - }) - ); - }; - - updateProgress(); - - // Process all files - for (const file of files) { - // Skip hidden files (additional check) - if (!file.name.startsWith('.')) { - const relativePath = file.webkitRelativePath || file.name; - const fileWithPath = new File([file], relativePath, { type: file.type }); - - await uploadFileHandler(fileWithPath); - uploadedFiles++; - updateProgress(); - } - } - - // Clean up - document.body.removeChild(input); - resolve(); - } catch (error) { - reject(error); - } - }; - - input.onerror = (error) => { - document.body.removeChild(input); - reject(error); - }; - - // Trigger file picker - input.click(); - }); - }; - // Error handler const handleUploadError = (error) => { if (error.name === 'AbortError') { @@ -634,18 +487,14 @@ } }; - // Collect files from a directory without uploading — returns {path, filename, file}[] - const collectDirectoryFiles = async (): Promise | null> => { + // Collect files from a directory without uploading. + const collectDirectoryFiles = async (): Promise => { const isFileSystemAccessSupported = 'showDirectoryPicker' in window; try { if (isFileSystemAccessSupported) { const dirHandle = await window.showDirectoryPicker(); - const collected: Array<{ path: string; filename: string; file: File }> = []; + const collected: DirectoryFileEntry[] = []; async function traverse(handle: FileSystemDirectoryHandle, dirPath = '') { for await (const entry of handle.values()) { @@ -662,7 +511,7 @@ } } - await traverse(dirHandle); + await traverse(dirHandle, dirHandle.name); return collected; } else { // Firefox fallback @@ -683,10 +532,8 @@ const collected = files.map((file) => { const parts = file.webkitRelativePath.split('/'); - // Remove root dir name, extract path and filename - const withoutRoot = parts.slice(1); - const filename = withoutRoot.pop() || file.name; - const path = withoutRoot.join('/'); + const filename = parts.pop() || file.name; + const path = parts.join('/'); return { path, filename, file }; }); @@ -712,6 +559,106 @@ } }; + const buildDirectoryManifest = async ( + entries: DirectoryFileEntry[] + ): Promise => { + return Promise.all( + entries.map(async (entry) => ({ + ...entry, + checksum: await computeFileHash(entry.file), + size: entry.file.size + })) + ); + }; + + const createMissingDirectories = async (diff: any) => { + if (!knowledge) return {}; + + const directoryIdByPath: Record = { ...(diff.directory_map || {}) }; + + for (const dirPath of diff.mkdir) { + const segments = dirPath.split('/'); + const name = segments.at(-1)!; + const parentPath = segments.slice(0, -1).join('/'); + const parentId = parentPath ? directoryIdByPath[parentPath] : null; + + const directory = await createKnowledgeDirectory( + localStorage.token, + knowledge.id, + name, + parentId + ); + if (directory) { + directoryIdByPath[dirPath] = directory.id; + } + } + + return directoryIdByPath; + }; + + const getDirectoryUploadPath = (path: string) => { + const currentPath = breadcrumbs.map((crumb) => crumb.name).join('/'); + return currentPath && path ? `${currentPath}/${path}` : currentPath || path; + }; + + const uploadDirectoryEntries = async (entries: DirectoryFileEntry[]) => { + if (!knowledge) return; + + try { + syncing = $i18n.t('Computing checksums ({{count}} files)', { count: entries.length }); + const manifest = await buildDirectoryManifest(entries); + + syncing = $i18n.t('Comparing with knowledge base...'); + const diff = await syncKnowledgeDiff( + localStorage.token, + id, + manifest.map(({ filename, path, checksum, size }) => ({ + filename, + path: getDirectoryUploadPath(path), + checksum, + size + })) + ); + + if (!diff) { + toast.error($i18n.t('Failed to compare files.')); + return; + } + + 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 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; + }); + } + + toast.success($i18n.t('File uploaded successfully')); + init(); + } catch (e) { + toast.error(`${e}`); + } finally { + syncing = null; + } + }; + // Incremental sync: hash locally → diff on server → upload only what changed const syncDirectoryHandler = async () => { if (!pendingSyncFiles?.length) return; @@ -721,13 +668,7 @@ syncing = $i18n.t('Computing checksums ({{count}} files)', { count: pendingSyncFiles.length }); - const manifest = await Promise.all( - pendingSyncFiles.map(async (entry) => ({ - ...entry, - checksum: await computeFileHash(entry.file), - size: entry.file.size - })) - ); + const manifest = await buildDirectoryManifest(pendingSyncFiles); pendingSyncFiles = null; // ── 3. Diff against knowledge base ── @@ -755,23 +696,7 @@ } // ── 5. mkdir — create missing directories (parents first) ── - const directoryIdByPath: Record = { ...(diff.directory_map || {}) }; - for (const dirPath of diff.mkdir) { - const segments = dirPath.split('/'); - const name = segments.at(-1)!; - const parentPath = segments.slice(0, -1).join('/'); - const parentId = parentPath ? directoryIdByPath[parentPath] : null; - - const directory = await createKnowledgeDirectory( - localStorage.token, - knowledge.id, - name, - parentId - ); - if (directory) { - directoryIdByPath[dirPath] = directory.id; - } - } + const directoryIdByPath = await createMissingDirectories(diff); // ── 6. Upload added + modified files ── const filesToUpload = manifest.filter( @@ -1039,6 +964,53 @@ } }; + const readDirectoryEntries = async (reader: any) => { + const entries: any[] = []; + + while (true) { + const batch = await new Promise((resolve, reject) => { + reader.readEntries(resolve, reject); + }); + + if (batch.length === 0) { + break; + } + + entries.push(...batch); + } + + return entries; + }; + + const collectDroppedEntryFiles = async ( + entry: any, + entryPath = entry.name + ): Promise => { + if (entry.name.startsWith('.') || hasHiddenFolder(entryPath)) { + return []; + } + + if (entry.isFile) { + const file = await new Promise((resolve, reject) => { + entry.file(resolve, reject); + }); + const parts = entryPath.split('/'); + const filename = parts.pop() || file.name; + return [{ path: parts.join('/'), filename, file }]; + } + + if (entry.isDirectory) { + const reader = entry.createReader(); + const entries = await readDirectoryEntries(reader); + const nested = await Promise.all( + entries.map((child) => collectDroppedEntryFiles(child, `${entryPath}/${child.name}`)) + ); + return nested.flat(); + } + + return []; + }; + const onDragOver = (e) => { e.preventDefault(); @@ -1063,40 +1035,35 @@ return; } - const handleUploadingFileFolder = (items) => { - for (const item of items) { - if (item.isFile) { - item.file((file) => { - uploadFileHandler(file); - }); - continue; - } - - // Not sure why you have to call webkitGetAsEntry and isDirectory seperate, but it won't work if you try item.webkitGetAsEntry().isDirectory - const wkentry = item.webkitGetAsEntry(); - const isDirectory = wkentry.isDirectory; - if (isDirectory) { - // Read the directory - wkentry.createReader().readEntries( - (entries) => { - handleUploadingFileFolder(entries); - }, - (error) => { - console.error('Error reading directory entries:', error); - } - ); - } else { - uploadFileHandler(item.getAsFile()); - } - } - }; - if (e.dataTransfer?.types?.includes('Files')) { if (e.dataTransfer?.files) { const inputItems = e.dataTransfer?.items; if (inputItems && inputItems.length > 0) { - handleUploadingFileFolder(inputItems); + const directoryEntries: DirectoryFileEntry[] = []; + const looseFiles: File[] = []; + + for (const rawItem of Array.from(inputItems)) { + const item = rawItem as DataTransferItem & { webkitGetAsEntry?: () => any }; + const entry = item.webkitGetAsEntry?.(); + + if (entry?.isDirectory) { + directoryEntries.push(...(await collectDroppedEntryFiles(entry))); + } else { + const file = item.getAsFile(); + if (file) { + looseFiles.push(file); + } + } + } + + for (const file of looseFiles) { + await uploadFileHandler(file); + } + + if (directoryEntries.length > 0) { + await uploadDirectoryEntries(directoryEntries); + } } else { toast.error($i18n.t(`File not found.`)); } From 9866a02863c12c466100aed832f0006225759493 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 1 Jul 2026 02:08:34 -0500 Subject: [PATCH 12/42] refac --- backend/open_webui/routers/users.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/routers/users.py b/backend/open_webui/routers/users.py index d15708941a..378b682357 100644 --- a/backend/open_webui/routers/users.py +++ b/backend/open_webui/routers/users.py @@ -326,7 +326,7 @@ async def update_user_settings_by_session_user( db: AsyncSession = Depends(get_async_session), ): if user.role != 'admin' and not await has_permission( - user.id, 'settings.interface', request.app.state.config.USER_PERMISSIONS + user.id, 'settings.interface', await Config.get('user.permissions') ): raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, From 2d7fc04bfbbd8747114500afeabdb690440d2054 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Wed, 1 Jul 2026 09:08:56 +0200 Subject: [PATCH 13/42] fix: use updated_at for sidebar chat timestamp (#26454) The sidebar time-ago indicator rendered `created_at`, so the relative time stayed pinned to the chat's creation age and never reflected new activity. After sending a message the chat would jump to the top of the list (which sorts by `updated_at`) while still showing a stale label such as "3w", which is confusing. The indicator was originally added using `updated_at` and was inadvertently switched to `created_at` during a later refactor. Restore `updated_at` (falling back to `created_at` when absent) so the timestamp matches the list ordering and updates whenever a chat is modified. Fixes #26451 --- src/lib/components/layout/Sidebar/ChatItem.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/components/layout/Sidebar/ChatItem.svelte b/src/lib/components/layout/Sidebar/ChatItem.svelte index 0e7c2bf181..5a0a55a9fd 100644 --- a/src/lib/components/layout/Sidebar/ChatItem.svelte +++ b/src/lib/components/layout/Sidebar/ChatItem.svelte @@ -570,9 +570,9 @@
- {#if createdAt && !mouseOver} + {#if (updatedAt ?? createdAt) && !mouseOver}
- {formatTimeAgo(createdAt)} + {formatTimeAgo(updatedAt ?? createdAt)}
{/if} From a78f0c030261954f9dd5bf0e2b7e1a4e7d294b26 Mon Sep 17 00:00:00 2001 From: Algorithm5838 <108630393+Algorithm5838@users.noreply.github.com> Date: Wed, 1 Jul 2026 10:09:19 +0300 Subject: [PATCH 14/42] fix: use absolute indexURL for pyodide sandbox (#26625) --- src/lib/pyodide/pyodideSandboxHost.ts | 77 +++++++++++++++------------ 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/src/lib/pyodide/pyodideSandboxHost.ts b/src/lib/pyodide/pyodideSandboxHost.ts index 33c9c6451a..1fbf322974 100644 --- a/src/lib/pyodide/pyodideSandboxHost.ts +++ b/src/lib/pyodide/pyodideSandboxHost.ts @@ -17,7 +17,7 @@ const sandboxScript = String.raw` stdout = null; stderr = null; pyodide = await loadPyodide({ - indexURL: '/pyodide/', + indexURL: self.__PYODIDE_INDEX_URL__ || '/pyodide/', stdout: function (text) { stdout = stdout ? stdout + text + '\n' : text + '\n'; }, @@ -145,45 +145,52 @@ const sandboxScript = String.raw` if (event.source !== parent) return; const data = event.data || {}; const id = data.id; - if (!data.type || data.type === 'execute') { - await ensureRuntime(data.packages || []); - await execute(id, data.code, data.files); - return; - } - await ensureRuntime(); - switch (data.type) { - case 'fs:upload': - upload(data.files, data.dir); - post({ id: id, type: data.type, success: true }); - break; - case 'fs:list': - post({ id: id, type: data.type, entries: list(data.path) }); - break; - case 'fs:read': - try { - const buffer = pyodide.FS.readFile(data.path).buffer; - post({ id: id, type: data.type, data: buffer }, [buffer]); - } catch (error) { - post({ id: id, type: data.type, error: error && error.message ? error.message : String(error) }); - } - break; - case 'fs:delete': - remove(data.path); - post({ id: id, type: data.type, success: true }); - break; - case 'fs:mkdir': - pyodide.FS.mkdirTree(data.path); - post({ id: id, type: data.type, success: true }); - break; - case 'fs:sync': - post({ id: id, type: data.type, success: true }); - break; + try { + if (!data.type || data.type === 'execute') { + await ensureRuntime(data.packages || []); + await execute(id, data.code, data.files); + return; + } + await ensureRuntime(); + switch (data.type) { + case 'fs:upload': + upload(data.files, data.dir); + post({ id: id, type: data.type, success: true }); + break; + case 'fs:list': + post({ id: id, type: data.type, entries: list(data.path) }); + break; + case 'fs:read': + try { + const buffer = pyodide.FS.readFile(data.path).buffer; + post({ id: id, type: data.type, data: buffer }, [buffer]); + } catch (error) { + post({ id: id, type: data.type, error: error && error.message ? error.message : String(error) }); + } + break; + case 'fs:delete': + remove(data.path); + post({ id: id, type: data.type, success: true }); + break; + case 'fs:mkdir': + pyodide.FS.mkdirTree(data.path); + post({ id: id, type: data.type, success: true }); + break; + case 'fs:sync': + post({ id: id, type: data.type, success: true }); + break; + } + } catch (error) { + post({ id: id, stderr: error && error.message ? error.message : String(error) }); } }); })(); `; -const sandboxHtml = ``; +// indexURL must be absolute because about:srcdoc can't be a base URL +const pyodideIndexURL = `${globalThis.location?.origin ?? ''}/pyodide/`; + +const sandboxHtml = ``; export class PyodideSandboxHost { onmessage: MessageListener | null = null; From 980786f574f4d21eb19fc1582fa2831acfe9d983 Mon Sep 17 00:00:00 2001 From: JuanMa Diaz Date: Wed, 1 Jul 2026 09:10:37 +0200 Subject: [PATCH 15/42] i18n: fix Spanish relative time labels (#26463) --- src/lib/i18n/locales/es-ES/translation.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index e792ec0937..bc53b50c05 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -38,11 +38,11 @@ "{{count}} users_many": "", "{{count}} users_other": "", "{{COUNT}} words": "{{COUNT}} palabras", - "{{COUNT}}d_time_ago": "hace_{{COUNT}}d", - "{{COUNT}}h_time_ago": "hace_{{COUNT}}h", - "{{COUNT}}m_time_ago": "hace_{{COUNT}}m", - "{{COUNT}}w_time_ago": "hace_{{COUNT}}s", - "{{COUNT}}y_time_ago": "hace_{{COUNT}}a", + "{{COUNT}}d_time_ago": "hace {{COUNT}} d", + "{{COUNT}}h_time_ago": "hace {{COUNT}} h", + "{{COUNT}}m_time_ago": "hace {{COUNT}} min", + "{{COUNT}}w_time_ago": "hace {{COUNT}} sem", + "{{COUNT}}y_time_ago": "hace {{COUNT}} a", "{{label}} contains invalid JSON": "", "{{label}} must be a JSON object": "", "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "{{LOCALIZED_DATE}} a las {{LOCALIZED_TIME}}", @@ -58,7 +58,7 @@ "1 user": "", "10 minutes before": "hace 10 minutos", "15 minutes before": "hace 15 minutos", - "1m_time_ago": "hace_1m", + "1m_time_ago": "hace 1 min", "30 minutes before": "hace 30 minutos", "5 minutes before": "hace 5 minutos", "A collaboration channel where people join as members": "Canal colaborativo donde la gente se une como miembro", From 9ed7af823c088640ed7bc8758d431a6a4932b15e Mon Sep 17 00:00:00 2001 From: Aleix Dorca Date: Wed, 1 Jul 2026 09:11:24 +0200 Subject: [PATCH 16/42] Update and fix Catalan translation.json (#26409) --- src/lib/i18n/locales/ca-ES/translation.json | 478 ++++++++++---------- 1 file changed, 239 insertions(+), 239 deletions(-) diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index 149f870d2e..4295f6fcab 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -17,12 +17,12 @@ "{{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}} fitxer seleccionat. Només es penjaran els fitxers nous i modificats. Els fitxers suprimits s'eliminaran. L'estructura de carpetes es duplicarà. Continuar?", "{{count}} files selected. Only new and modified files will be uploaded. Deleted files will be removed. The folder structure will be mirrored. Continue?_many": "{{count}} fitxers seleccionats. Només es penjaran els fitxers nous i modificats. Els fitxers suprimits s'eliminaran. L'estructura de carpetes es duplicarà. Continuar?", "{{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}} fitxers seleccionats. Només es penjaran els fitxers nous i modificats. Els fitxers suprimits s'eliminaran. L'estructura de carpetes es duplicarà. Continuar?", - "{{count}} filters_one": "", - "{{count}} filters_many": "", - "{{count}} filters_other": "", - "{{count}} groups_one": "", - "{{count}} groups_many": "", - "{{count}} groups_other": "", + "{{count}} filters_one": "{{count}} filtre", + "{{count}} filters_many": "{{count}} filtres", + "{{count}} filters_other": "{{count}} filtres", + "{{count}} groups_one": "{{count}} grup", + "{{count}} groups_many": "{{count}} grups", + "{{count}} groups_other": "{{count}} grups", "{{COUNT}} hidden lines": "{{COUNT}} línies ocultes", "{{COUNT}} members": "{{COUNT}} membres", "{{count}} of {{total}} accessible_one": "{{count}} de {{total}} accessible", @@ -34,17 +34,17 @@ "{{count}} selected_many": "{{count}} seleccionats", "{{count}} selected_other": "{{count}} seleccionats", "{{COUNT}} Sources": "{{COUNT}} fonts", - "{{count}} users_one": "", - "{{count}} users_many": "", - "{{count}} users_other": "", + "{{count}} users_one": "{{count}} usuari", + "{{count}} users_many": "{{count}} usuaris", + "{{count}} users_other": "{{count}} usuaris", "{{COUNT}} words": "{{COUNT}} paraules", "{{COUNT}}d_time_ago": "{{COUNT}}d", "{{COUNT}}h_time_ago": "{{COUNT}}h", "{{COUNT}}m_time_ago": "{{COUNT}}m", "{{COUNT}}w_time_ago": "{{COUNT}}s", "{{COUNT}}y_time_ago": "{{COUNT}}a", - "{{label}} contains invalid JSON": "", - "{{label}} must be a JSON object": "", + "{{label}} contains invalid JSON": "{{label}} conté JSON no vàlid", + "{{label}} must be a JSON object": "{{label}} ha de ser un objecte JSON", "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "{{LOCALIZED_DATE}} a les {{LOCALIZED_TIME}}", "{{model}} download has been canceled": "La descàrrega del model {{model}} s'ha cancel·lat", "{{modelName}} profile image": "Imatge del perfil {{modelName}}", @@ -52,10 +52,10 @@ "{{user}}'s Chats": "Els xats de {{user}}", "{{webUIName}} Backend Required": "El Backend de {{webUIName}} és necessari", "*Prompt node ID(s) are required for image generation": "*Els identificadors de nodes d'indicacions són necessaris per a la generació d'imatges", - "1 group": "", + "1 group": "1 grup", "1 hour before": "1 hora abans", "1 Source": "1 font", - "1 user": "", + "1 user": "1 usuari", "10 minutes before": "10 minuts abans", "15 minutes before": "15 minuts abans", "1m_time_ago": "1m", @@ -73,7 +73,7 @@ "Access Control": "Control d'accés", "Access Grants": "Assignacions d'accés", "Access List": "Llista d'accés", - "Access prohibited": "", + "Access prohibited": "Accés prohibit", "Access updated": "Accés actualitzat", "Accessible to all users": "Accessible a tots els usuaris", "Account": "Compte", @@ -89,7 +89,7 @@ "Activity": "Activitat", "Add": "Afegir", "Add a model ID": "Afegir un ID de model", - "Add a preference, fact, or instruction about you": "", + "Add a preference, fact, or instruction about you": "Afegeix una preferència, un fet o una instrucció sobre tu", "Add a short description about what this model does": "Afegeix una breu descripció sobre què fa aquest model", "Add a tag": "Afegir una etiqueta", "Add a tag...": "Afegir una etiqueta...", @@ -102,10 +102,10 @@ "Add Custom Prompt": "Afegir indicació personalitzada", "Add description": "Afegir descripció", "Add Details": "Afegir detalls", - "Add durable context for future chats": "", + "Add durable context for future chats": "Afegeix un context durador per a futurs xats", "Add Files": "Afegir arxius", "Add Image": "Afegir imatge", - "Add Knowledge Connection": "", + "Add Knowledge Connection": "Afegeix una connexió de coneixement", "Add location": "Afegir ubicació", "Add Member": "Afegir membre", "Add Members": "Afegir membres", @@ -120,7 +120,7 @@ "Add to favorites": "Afegir als favorits", "Add User": "Afegir un usuari", "Add User Group": "Afegir grup d'usuaris", - "Add webhook": "", + "Add webhook": "Afegeix un webhook", "Add webpage": "Afegir pàgina web", "Add your Open Terminal URL and API key in Settings → Integrations.": "Afegeix l'URL i la clau API de l'Open Terminal a Configuració → Integracions.", "Additional Config": "Configuració addicional", @@ -133,9 +133,9 @@ "Admin": "Administrador", "Admin Contact Email": "Afegir correu electrònic de contacte", "Admin Panel": "Panell d'administració", - "Admin Roles": "", + "Admin Roles": "Funcions d'administrador", "Admin Settings": "Preferències d'administració", - "Admin-managed service account": "", + "Admin-managed service account": "Compte de servei gestionat per l'administrador", "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Els administradors tenen accés a totes les eines en tot moment; els usuaris necessiten eines assignades per model a l'espai de treball.", "Advanced": "Avançat", "Advanced Parameters": "Paràmetres avançats", @@ -146,21 +146,21 @@ "All": "Tots", "All chats have been unarchived.": "Tots els xats han estat desarxivats.", "All day": "Tot el dia", - "All events": "", + "All events": "Tots els esdeveniments", "All models are now hidden": "Tots els models estan amagats, ara", "All models are now visible": "Tots els models són visibles, ara", "All models deleted successfully": "Tots els models s'han eliminat correctament", - "All shared chats have been unshared.": "", - "All Sources": "", + "All shared chats have been unshared.": "S'han deixat de compartir tots els xats compartits.", + "All Sources": "Totes les fonts", "All time": "Sempre", "All Users": "Tots els usuaris", - "All users and system events": "", + "All users and system events": "Tots els usuaris i esdeveniments del sistema", "Allow Call": "Permetre la trucada", "Allow Chat Controls": "Permetre els controls de xat", "Allow Chat Delete": "Permetre eliminar el xat", "Allow Chat Edit": "Permetre editar el xat", "Allow Chat Export": "Permetre exportar el xat", - "Allow Chat Import": "", + "Allow Chat Import": "Permet la importació de xat", "Allow Chat Params": "Permetre els paràmetres de xat", "Allow Chat Share": "Permetre compartir el xat", "Allow Chat System Prompt": "Permet la indicació de sistema al xat", @@ -180,11 +180,11 @@ "Allow User Location": "Permetre la ubicació de l'usuari", "Allow Voice Interruption in Call": "Permetre la interrupció de la veu en una trucada", "Allow Web Upload": "Permetre la pujada web", - "Allowed Domains": "", + "Allowed Domains": "Dominis permesos", "Allowed Endpoints": "Punts d'accés permesos", "Allowed File Extensions": "Extensions de fitxer permeses", "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "Extensions de fitxer permeses per a la càrrega. Separa múltiples extensions amb comes. Deixa buit per a tots els tipus de fitxer.", - "Allowed Roles": "", + "Allowed Roles": "Rols permesos", "Already have an account?": "Ja tens un compte?", "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.": "Alternativa al top_p, i pretén garantir un equilibri de qualitat i varietat. El paràmetre p representa la probabilitat mínima que es consideri un token, en relació amb la probabilitat del token més probable. Per exemple, amb p=0,05 i el token més probable amb una probabilitat de 0,9, es filtren els logits amb un valor inferior a 0,045.", "Always": "Sempre", @@ -203,7 +203,7 @@ "API Base URL": "URL Base de l'API", "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "URL base de l'API per al servei de marcadors de Datalab. Per defecte: https://www.datalab.to/api/v1/marker", "API Key": "clau API", - "API Key / Token": "", + "API Key / Token": "Clau de l'API/Token", "API Key created.": "clau API creada.", "API Key Endpoint Restrictions": "Restriccions del punt d'accés de la Clau API", "API keys": "Claus de l'API", @@ -233,18 +233,18 @@ "Are you sure you want to delete this memory? This action cannot be undone.": "Estàs segur que vols suprimir aquest record? Aquesta acció no es pot desfer.", "Are you sure you want to delete this message?": "Estàs segur que vols eliminar aquest missatge?", "Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "Estàs segur que vols suprimir aquesta versió? Les versions filles es tornaran a enllaçar amb la versió principal d'aquesta versió.", - "Are you sure you want to delete this webhook? This action cannot be undone.": "", + "Are you sure you want to delete this webhook? This action cannot be undone.": "Estàs segur que vols suprimir aquest webhook? Aquesta acció no es pot desfer.", "Are you sure you want to delete this?": "Estàs segur que vols eliminar això", - "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 reset all permissions to their default values? You will still need to save to apply the changes.": "Estàs segur que vols restablir tots els permisos als valors predeterminats? Encara hauràs de desar per aplicar els canvis.", "Are you sure you want to unarchive all archived chats?": "Estàs segur que vols desarxivar tots els xats arxivats?", - "Are you sure you want to unshare all shared chats? This will remove all share links.": "", + "Are you sure you want to unshare all shared chats? This will remove all share links.": "Confirmes que vols deixar de compartir tots els xats compartits? Això eliminarà tots els enllaços compartits.", "Arena Models": "Models de l'Arena", "Artifacts": "Artefactes", "Asc": "Ascendent", "Ask": "Preguntar", "Ask a question": "Fer una pregunta", - "Ask a test question": "", - "Ask this knowledge source a test question": "", + "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", "Assistant": "Assistent", "Async Embedding Processing": "Procés d'incrustat asíncron", "At time of event": "Al moment de l'esdeveniment", @@ -259,20 +259,20 @@ "Audio": "Àudio", "August": "Agost", "Auth": "Autenticació", - "Auth Mode": "", - "Auth required": "", + "Auth Mode": "Mode d'autenticació", + "Auth required": "Es requereix l'autenticació", "Authenticate": "Autenticar", "Authentication": "Autenticació", "Auto": "Automàtic", "Auto (Random)": "Automàtic (aleatori)", - "Auto Redirect": "", + "Auto Redirect": "Redirecció automàtica", "Auto-Copy Response to Clipboard": "Copiar la resposta automàticament al porta-retalls", - "Auto-Create Groups": "", + "Auto-Create Groups": "Crear grups automàticament", "Auto-Playback Response": "Reproduir la resposta automàticament", "Autocomplete Generation": "Generació automàtica", "Autocomplete Generation Input Max Length": "Entrada màxima de la generació automàtica", - "Autocomplete Generation Prompt": "", - "Automatic": "", + "Autocomplete Generation Prompt": "Petició de generació d'autocompletar", + "Automatic": "Automàtic", "Automatic1111": "Automatic1111", "AUTOMATIC1111 Api Auth String": "Cadena d'autenticació de l'API d'AUTOMATIC1111", "AUTOMATIC1111 Base URL": "URL Base d'AUTOMATIC1111", @@ -290,7 +290,7 @@ "Available Skills": "Habilitats disponibles", "Available Tools": "Eines disponibles", "available users": "usuaris disponibles", - "Available variables": "", + "Available variables": "Variables disponibles", "available!": "disponible!", "Away": "Absent", "Awful": "Terrible", @@ -301,7 +301,7 @@ "Bad Response": "Resposta errònia", "Banners": "Banners", "Base Model (From)": "Model base (des de)", - "Base Model is required.": "", + "Base Model is required.": "Es requereix el model base.", "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.": "La memòria cau de la llista de models base accelera l'accés obtenint els models base només a l'inici o en desar la configuració; és més ràpid, però és possible que no mostri els canvis recents del model base.", "Bearer": "Bearer", "before": "abans", @@ -311,7 +311,7 @@ "Bing Search V7 Subscription Key": "Clau de subscripció a Bing Search V7", "Bio": "Bio", "Birth Date": "Data de naixement", - "Blocked Groups": "", + "Blocked Groups": "Grups bloquejats", "BM25 Weight": "Pes BM25", "Bocha Search API Key": "Clau API de Bocha Search", "Bold": "Negreta", @@ -378,7 +378,7 @@ "Chat unshared successfully.": "El xat s'ha deixat de compartir correctament", "chats": "xats", "Chats": "Xats", - "Chats Public Sharing": "Compartició pública delx xats", + "Chats Public Sharing": "Compartició pública dels xats", "Check Again": "Comprovar-ho de nou", "Check for updates": "Comprovar si hi ha actualitzacions", "Checking for updates...": "Comprovant actualitzacions...", @@ -440,7 +440,7 @@ "Collaboration channel where people join as members": "Canal de col·laboració on la gent s'uneix com a membres", "Collapse": "Col·lapsar", "Collection": "Col·lecció", - "Collection Field": "", + "Collection Field": "Camp de col·lecció", "Collections": "Col·lecccions", "Color": "Color", "ComfyUI": "ComfyUI", @@ -450,14 +450,14 @@ "ComfyUI Workflow": "Flux de treball de ComfyUI", "ComfyUI Workflow Nodes": "Nodes del flux de treball de ComfyUI", "Comma separated Node Ids (e.g. 1 or 1,2)": "Identificadors de node separats per comes (p. ex. 1 o 1,2)", - "Comma-separated group names": "", + "Comma-separated group names": "Noms de grups separats per comes", "Comma-separated list of file extensions MinerU will handle (e.g. pdf, docx, pptx, xlsx)": "Llista separada per comes d'extensions de fitxer que MinerU gestionarà (per exemple, pdf, docx, pptx, xlsx)", "command": "comanda", "Command": "Comanda", "Comment": "Comentari", "Commit Message": "Enviar el missatge", "Community Reviews": "Comentaris de la comunitat", - "Compacting context": "", + "Compacting context": "Compactant el context", "Comparing with knowledge base...": "Comparant amb la base de coneixement...", "Completions": "Completaments", "Compress Images in Channels": "Comprimir imatges en els canals", @@ -480,7 +480,7 @@ "Connect to Open Terminal instances. All users will have access to file browsing and terminal tools through these servers.": "Connecta't a instàncies d'Open Terminal. Tots els usuaris tindran accés a la navegació de fitxers i a les eines del terminal a través d'aquests servidors.", "Connect to your own OpenAI compatible API endpoints.": "Connecta als teus propis punts de connexió de l'API compatible amb OpenAI", "Connect to your own OpenAPI compatible external tool servers.": "Connecta als teus propis servidors d'eines externs compatibles amb OpenAPI", - "Connected": "", + "Connected": "Connectat", "Connected ({{type}})": "Connectat ({{type}})", "Connection failed": "La connexió ha fallat", "Connection lost. Reconnecting...": "Connexió perduda. Reconnectant...", @@ -493,16 +493,16 @@ "Contact Admin for WebUI Access": "Posa't en contacte amb l'administrador per accedir a WebUI", "Content": "Contingut", "Content Extraction Engine": "Motor d'extracció de contingut", - "Content Field": "", + "Content Field": "Camp de contingut", "Content lengths (character counts only)": "Mida del contingut (només els caràcters)", - "Context": "", - "Context compacted": "", - "Context Compaction": "", - "Context compaction failed": "", - "Context Compaction Prompt": "", - "Context Compaction Threshold": "", + "Context": "Context", + "Context compacted": "Context compactat", + "Context Compaction": "Compactació del context", + "Context compaction failed": "La compactació del context ha fallat", + "Context Compaction Prompt": "Petició de compactació de context", + "Context Compaction Threshold": "Llindar de compactació del context", "Context Tokens": "Tokens de context", - "Continue": "", + "Continue": "Continua", "Continue Response": "Continuar la resposta", "Continue with {{provider}}": "Continuar amb {{provider}}", "Continue with Email": "Continuar amb el correu", @@ -550,7 +550,7 @@ "Create new secret key": "Crear una nova clau secreta", "Create note": "Crear una nota", "Create Note": "Crea nota", - "Create one read-only Knowledge source per external collection. Test must pass before the source is created.": "", + "Create one read-only Knowledge source per external collection. Test must pass before the source is created.": "Crea una font de coneixement de només lectura per col·lecció externa. La prova ha de passar abans de crear la font.", "Create scheduled prompts that run automatically on a recurring basis.": "Crea sol·licituds programades que s'executin automàticament de manera recurrent.", "Create your first note by clicking on the plus button below.": "Crea la teva primera nota prement sobre el botó 'més' inferior", "Created at": "Creat el", @@ -568,7 +568,7 @@ "Custom Gender": "Gènere personalitzat", "Custom Parameter Name": "Nom del paràmetre personalitzat", "Custom Parameter Value": "Valor del paràmetre personalitzat", - "Custom range": "", + "Custom range": "Rang personalitzat", "Daily": "Cada dia", "Daily Messages": "Missatges diaris", "Danger Zone": "Zona de perill", @@ -600,7 +600,7 @@ "Default to ALL": "Per defecte TOTS", "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "Per defecte, Segmented Retrieval per a l'extracció de contingut rellevant, es recomana en la majoria dels casos.", "Default User Role": "Rol d'usuari per defecte", - "Default webhook": "", + "Default webhook": "Webhook predeterminat", "Defaults": "Valors per defecte", "Delete": "Eliminar", "Delete {{name}}": "Eliminar {{name}}", @@ -661,8 +661,8 @@ "Disable Code Interpreter": "Deshabilitar l'interpret de codi", "Disable Image Extraction": "Deshabilitar l'extracció d'imatges", "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Desactiva l'extracció d'imatges del PDF. Si Utilitza LLM està habilitat, les imatges es descriuran automàticament. Per defecte és Fals.", - "Disable Image Generation": "", - "Disable Web Search": "", + "Disable Image Generation": "Desactiva la generació d'imatges", + "Disable Web Search": "Desactiva la cerca web", "Disabled": "Deshabilitat", "Disconnect OAuth": "Desconnectar OAuth", "Discover a function": "Descobrir una funció", @@ -691,7 +691,7 @@ "Docling Parameters": "Paràmetres de Docling", "Docling Server URL required.": "La URL del servidor Docling és necessària", "Document": "Document", - "Document ID Field": "", + "Document ID Field": "Camp ID del document", "Document Intelligence": "Document Intelligence", "Document Intelligence endpoint required.": "Es necessita un punt de connexió de Document Intelligence", "Document Intelligence Model": "Model de Document Intelligence", @@ -747,14 +747,14 @@ "Edit Default Permissions": "Editar el permisos per defecte", "Edit Folder": "Editar la carpeta", "Edit Image": "Editar la imatge", - "Edit Knowledge Connection": "", + "Edit Knowledge Connection": "Edita la connexió de coneixement", "Edit Last Message": "Editar el darrer missatge", "Edit Memory": "Editar la memòria", "Edit Prompt": "Editar la indicació", "Edit Terminal Connection": "Editar la connexió al terminal", "Edit User": "Editar l'usuari", "Edit User Group": "Editar el grup d'usuaris", - "Edit webhook": "", + "Edit webhook": "Edita el webhook", "Edit workflow.json content": "Editar el contingut de workflow.json", "edited": "editat", "Edited": "Editat", @@ -763,7 +763,7 @@ "Eject model": "Expulsar el model", "ElevenLabs": "ElevenLabs", "Email": "Correu electrònic", - "Email Claim": "", + "Email Claim": "Reclamació per correu electrònic", "Embark on adventures": "Embarcar en aventures", "Embedding": "Incrustació", "Embedding Batch Size": "Mida del lot d'incrustació", @@ -772,7 +772,7 @@ "Embedding Model Engine": "Motor de model d'incrustació", "Emoji": "Emoji", "Emojis": "Emojis", - "Empty": "", + "Empty": "Buit", "Empty message": "Missatge buit", "Enable All": "Habilitar tot", "Enable API Keys": "Permetre claus API", @@ -780,21 +780,21 @@ "Enable Code Execution": "Permetre l'execució de codi", "Enable Code Interpreter": "Activar l'intèrpret de codi", "Enable Community Sharing": "Activar l'ús compartit amb la comunitat", - "Enable Group Mapping": "", - "Enable Image Generation": "", + "Enable Group Mapping": "Habilita l'assignació de grups", + "Enable Image Generation": "Activa la generació d'imatges", "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.": "Activar el bloqueig de memòria (mlock) per evitar que les dades del model s'intercanviïn fora de la memòria RAM. Aquesta opció bloqueja el conjunt de pàgines de treball del model a la memòria RAM, assegurant-se que no s'intercanviaran al disc. Això pot ajudar a mantenir el rendiment evitant errors de pàgina i garantint un accés ràpid a les dades.", "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.": "Activar l'assignació de memòria (mmap) per carregar les dades del model. Aquesta opció permet que el sistema utilitzi l'emmagatzematge en disc com a extensió de la memòria RAM tractant els fitxers de disc com si estiguessin a la memòria RAM. Això pot millorar el rendiment del model permetent un accés més ràpid a les dades. Tanmateix, és possible que no funcioni correctament amb tots els sistemes i pot consumir una quantitat important d'espai en disc.", "Enable Message Queue": "Activar la cua de missatges", "Enable Message Rating": "Permetre la qualificació de missatges", "Enable Mirostat sampling for controlling perplexity.": "Permetre el mostreig de Mirostat per controlar la perplexitat", "Enable New Sign Ups": "Permetre nous registres", - "Enable OAuth Signup": "", - "Enable Role Mapping": "", - "Enable Web Search": "", + "Enable OAuth Signup": "Activa la inscripció a OAuth", + "Enable Role Mapping": "Habilita l'assignació de rols", + "Enable Web Search": "Activa la cerca web", "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.": "Activar, desactivar o personalitzar les etiquetes de raonament que utilitza el model. \"Activat\" utilitza etiquetes predeterminades, \"Desactivat\" desactiva les etiquetes de raonament i \"Personalitzat\" permet especificar les etiquetes d'inici i finalització.", "Enabled": "Habilitat", "End Tag": "Etiqueta de finalització", - "Endpoint": "", + "Endpoint": "Punt final", "Endpoint URL": "URL de connexió", "Enforce Temporary Chat": "Forçar els xats temporals", "Enhance": "Millorar", @@ -817,8 +817,8 @@ "Enter Chunk Min Size Target": "Introdueix la mida mínima del bloc objectiu", "Enter Chunk Overlap": "Introdueix la mida de solapament de blocs", "Enter Chunk Size": "Introdueix la mida del bloc", - "Enter Client ID": "", - "Enter Client Secret": "", + "Enter Client ID": "Introdueix l'identificador de client", + "Enter Client Secret": "Introdueix el secret del client", "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Introdueix parelles de \"token:valor de biaix\" separats per comes (exemple: 5432:100, 413:-100)", "Enter content for the pending user info overlay. Leave empty for default.": "Introdueix el contingut per a la finestra de dades d'usuari pendent. Deixa-ho buit per a valor per defecte.", "Enter coordinates (e.g. 51.505, -0.09)": "Entra les coordenades (p. ex. 51.505, -0.09)", @@ -856,11 +856,11 @@ "Enter Jupyter URL": "Introdueix la URL de Jupyter", "Enter Kagi Search API Key": "Introdueix la clau API de Kagi Search", "Enter Key Behavior": "Introdueix el comportament de clau", - "Enter language": "", + "Enter language": "Introdueix l'idioma", "Enter language codes": "Introdueix els codis de llenguatge", "Enter Linkup API Key": "Entra la clau API per a Linkup", - "Enter Microsoft Web IQ API Base URL": "", - "Enter Microsoft Web IQ API Key": "", + "Enter Microsoft Web IQ API Base URL": "Introdueix l'URL de base de l'API de Microsoft Web IQ", + "Enter Microsoft Web IQ API Key": "Introdueix la clau de l'API de Microsoft Web IQ", "Enter MinerU API Key": "Introdueix la clau API de MinerU", "Enter Mistral API Base URL": "Entra la URL Base de l'API de Mistral", "Enter Mistral API Key": "Entra la clau API de Mistral", @@ -874,13 +874,13 @@ "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", - "Enter Perplexity Search API URL": "Introduïu l'URL de l'API de cerca de Perplexity", + "Enter Perplexity Search API URL": "Introdueix l'URL de l'API de cerca de Perplexity", "Enter Playwright Timeout": "Introdueix el temps d'espera de Playwright", "Enter Playwright WebSocket URL": "Introdueix la URL de Playwright WebSocket", "Enter prompt here.": "Introdueix el prompt aquí.", "Enter proxy URL (e.g. https://user:password@host:port)": "Entra la URL (p. ex. https://user:password@host:port)", "Enter reasoning effort": "Introdueix l'esforç de raonament", - "Enter Redirect URI": "", + "Enter Redirect URI": "Introdueix l'URI de redirecció", "Enter Score": "Introdueix la puntuació", "Enter SearchApi API Key": "Introdueix la clau API SearchApi", "Enter SearchApi Engine": "Introdueix el motor SearchApi", @@ -890,7 +890,7 @@ "Enter SerpApi API Key": "Introdueix la clau API SerpApi", "Enter SerpApi Engine": "Introdueix el motor API SerpApi", "Enter Serper API Key": "Introdueix la clau API Serper", - "Enter SERPHouse API Key": "", + "Enter SERPHouse API Key": "Introdueix la clau de l'API de SERPhouse", "Enter Serply API Key": "Introdueix la clau API Serply", "Enter Serpstack API Key": "Introdueix la clau API Serpstack", "Enter server host": "Introdueix el servidor", @@ -911,8 +911,8 @@ "Enter Tika Server URL": "Introdueix la URL del servidor Tika", "Enter timeout in seconds": "Entra el temps d'espera en segons", "Enter to Send": "Enter per enviar", - "Enter token threshold": "", - "Enter Tokenizer Model": "", + "Enter token threshold": "Introdueix el llindar tokens", + "Enter Tokenizer Model": "Introdueix el model de tokenitzador", "Enter Top K": "Introdueix Top K", "Enter Top K Reranker": "Introdueix el Top K Reranker", "Enter URL (e.g. http://127.0.0.1:7860/)": "Introdueix la URL (p. ex. http://127.0.0.1:7860/)", @@ -925,7 +925,7 @@ "Enter Yandex Web Search API Key": "Introdueix la clau API per a la cerca web Yandex", "Enter Yandex Web Search URL": "Introdueix la URL per a la cerca web Yandex", "Enter You.com API Key": "Introdueix la clau API de You.com", - "Enter your code here...": "Introduïu el vostre codi aquí...", + "Enter your code here...": "Introdueix el teu codi aquí...", "Enter your current password": "Introdueix la teva contrasenya actual", "Enter Your Email": "Introdueix el teu correu electrònic", "Enter Your Full Name": "Introdueix el teu nom complet", @@ -953,21 +953,21 @@ "Error: A model with the ID '{{modelId}}' already exists. Please select a different ID to proceed.": "Error: Ja existeix un model amb l'ID '{{modelId}}'. Selecciona un ID diferent per continuar.", "Error: Model ID cannot be empty. Please enter a valid ID to proceed.": "Error: ID de model no pot ser buit. Entra un ID de model vàlid per continuar.", "Evaluations": "Avaluacions", - "Event": "", + "Event": "Esdeveniment", "Event created": "Esdeveniment creat", "Event deleted": "Esdeveniment eliminat", - "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.": "Els noms d'esdeveniments poden canviar a mesura que evoluciona Open WebUI. Utilitza patrons amplis com user.* per a integracions que haurien de continuar amb nous esdeveniments relacionats.", "Event title": "Títol de l'esdeveniment", "Event updated": "Esdeveniment actualitzat", - "Events": "", + "Events": "Esdeveniments", "Exa API Key": "Clau API d'EXA", - "Example": "", + "Example": "Exemple", "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Exemple: (&(objectClass=inetOrgPerson)(uid=%s))", "Example: ALL": "Exemple: TOTS", "Example: mail": "Exemple: mail", "Example: ou=users,dc=foo,dc=example": "Exemple: ou=users,dc=foo,dc=example", "Example: sAMAccountName or uid or userPrincipalName": "Exemple: sAMAccountName o uid o userPrincipalName", - "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "S'ha superat el nombre de places a la vostra llicència. Poseu-vos en contacte amb el servei d'assistència per augmentar el nombre de places.", + "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "S'ha superat el nombre de places a la teva llicència. Posa't en contacte amb el servei d'assistència per augmentar el nombre de places.", "Exclude": "Excloure", "Execute code": "Executa el codi", "Execute code for analysis": "Executar el codi per analitzar-lo", @@ -989,54 +989,54 @@ "Export Config": "Exportar la configuració", "Export Models": "Exportar els models", "Export Prompts": "Exportar les indicacions", - "Export Skills": "", + "Export Skills": "Habilitats d'exportació", "Export to CSV": "Exportar a CSV", "Export Tools": "Exportar les eines", "Export Users": "Exportar els usuaris", "External": "Extern", - "External connection not found.": "", + "External connection not found.": "No s'ha trobat la connexió externa.", "External Document Loader URL required.": "Fa falta la URL per a Document Loader", - "External Knowledge Source": "", - "External Knowledge Sources": "", + "External Knowledge Source": "Font de coneixement extern", + "External Knowledge Sources": "Fonts de coneixement externes", "External Task Model": "Model de tasques extern", - "External Tool Servers": "", - "External vectors must be generated with the same embedding model configured in Open WebUI.": "", + "External Tool Servers": "Servidors d'eines externes", + "External vectors must be generated with the same embedding model configured in Open WebUI.": "Els vectors externs s'han de generar amb el mateix model d'incrustació configurat a Open WebUI.", "External Web Loader API Key": "Clau API d'External Web Loader", "External Web Loader URL": "URL d'External Web Loader", "External Web Search API Key": "Clau API d'External Web Search", "External Web Search URL": "URL d'External Web Search", "Fade Effect for Streaming Text": "Efecte de fos a negre per al text en streaming", "Failed to add file.": "No s'ha pogut afegir l'arxiu.", - "Failed to add members": "No s'han pogut afegir el membres", + "Failed to add members": "No s'han pogut afegir els membres", "Failed to archive chat.": "No s'ha pogut arxivar el xat", "Failed to attach file": "No s'ha pogut adjuntar l'arxiu", "Failed to clear status": "No s'ha pogut esborar l'estat", "Failed to compare files.": "No s'han pogut comparar els arxius.", - "Failed to connect to {{URL}} OpenAPI tool server": "No s'ha pogut connecta al servidor d'eines OpenAPI {{URL}}", - "Failed to connect to {{URL}} terminal server": "No s'ha pogut connecta al servidor de terminal {{URL}}", + "Failed to connect to {{URL}} OpenAPI tool server": "No s'ha pogut connectar al servidor d'eines OpenAPI {{URL}}", + "Failed to connect to {{URL}} terminal server": "No s'ha pogut connectar al servidor de terminal {{URL}}", "Failed to copy link": "No s'ha pogut copiar l'enllaç", "Failed to create API Key.": "No s'ha pogut crear la clau API.", "Failed to delete calendar": "No s'ha pogut eliminar el calendari", "Failed to delete note": "No s'ha pogut eliminar la nota", - "Failed to delete webhook": "", + "Failed to delete webhook": "No s'ha pogut suprimir el webhook", "Failed to disconnect": "No s'ha pogut desconnectar", "Failed to download image": "No s'ha pogut descarregar la imatge", "Failed to extract content from the file: {{error}}": "No s'ha pogut extreure el contingut del fitxer: {{error}}", "Failed to extract content from the file.": "No s'ha pogut extreure el contingut del fitxer", "Failed to fetch models": "No s'han pogut obtenir els models", "Failed to generate title": "No s'ha pogut generar el títol", - "Failed to import models": "No s'han pogut importar el models", - "Failed to load chat": "", + "Failed to import models": "No s'han pogut importar els models", + "Failed to load chat": "No s'ha pogut carregar el xat", "Failed to load chat preview": "No s'ha pogut carregar la previsualització del xat", "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 Interface settings": "No s'ha pogut carregar la configuració de la interficie", + "Failed to load Interface settings": "No s'ha pogut carregar la configuració de la interfície", "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.", "Failed to move chat": "No s'ha pogut moure el xat", "Failed to process URL: {{url}}": "No s'ha pogut processar la URL: {{url}}", "Failed to read clipboard contents": "No s'ha pogut llegir el contingut del porta-retalls", - "Failed to refresh terminals: {{error}}": "", + "Failed to refresh terminals: {{error}}": "No s'han pogut actualitzar els terminals: {{error}}", "Failed to remove member": "No s'ha pogut eliminar el membre", "Failed to render diagram": "No s'ha pogut renderitzar el diagrama", "Failed to render visualization": "No s'ha pogut renderitzar la visualització", @@ -1045,11 +1045,11 @@ "Failed to save models configuration": "No s'ha pogut desar la configuració dels models", "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": "", + "Failed to save webhook": "No s'ha pogut desar el webhook", "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", - "Failed to update webhook": "", + "Failed to update webhook": "No s'ha pogut actualitzar el webhook", "Failed to upload file.": "No s'ha pogut pujar l'arxiu.", "Features": "Característiques", "Features Permissions": "Permisos de les característiques", @@ -1082,8 +1082,8 @@ "File uploaded successfully": "Arxiu pujat satisfactòriament", "Filename": "Nom de l'arxiu", "Files": "Arxius", - "Fill the required fields first.": "", - "Fill the source fields and test query first.": "", + "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", "Filter is now globally disabled": "El filtre ha estat desactivat globalment", "Filter is now globally enabled": "El filtre ha estat activat globalment", @@ -1104,9 +1104,9 @@ "Folder name cannot be empty.": "El nom de la carpeta no pot ser buit.", "Folder name updated successfully": "Nom de la carpeta actualitzat correctament", "Folder options": "Opcions de la carpeta", - "Folder updated successfully": "Carpeta actualitazda correctament", + "Folder updated successfully": "Carpeta actualitzada correctament", "Folders": "Carpetes", - "Folders Sharing": "", + "Folders Sharing": "Compartició de carpetes", "Follow up": "Seguir", "Follow Up Generation": "Generació d'indicacions de continuació", "Follow Up Generation Prompt": "Indicació per a la generació d'indicacions de continuació", @@ -1122,7 +1122,7 @@ "Format the lines in the output. Defaults to False. If set to True, the lines will be formatted to detect inline math and styles.": "Formata les línies a la sortida. Per defecte, és Fals. Si es defineix com a Cert, les línies es formataran per detectar matemàtiques i estils en línia.", "Formatting may be inconsistent from source.": "La formatació pot ser inconsistent amb l'origen", "Forward": "Endavant", - "Forwards system user OAuth access token to authenticate": "Reenvia el testimoni d'accés OAuth de l'usuari del sistema per autenticar-se.", + "Forwards system user OAuth access token to authenticate": "Reenvia el token d'accés OAuth de l'usuari del sistema per autenticar-se.", "Forwards system user session credentials to authenticate": "Envia les credencials de l'usuari del sistema per autenticar", "Fr_day_of_week": "Divendres", "Full Context Mode": "Mode de context complert", @@ -1137,7 +1137,7 @@ "Function is now globally enabled": "La funció ha estat activada globalment", "Function Name": "Nom de la funció", "Function Name Filter List": "Llista de filtres de noms de funció", - "Function starter": "", + "Function starter": "Funció d'arrencada", "Function updated successfully": "La funció s'ha actualitzat correctament", "Functions": "Funcions", "Functions allow arbitrary code execution.": "Les funcions permeten l'execució de codi arbitrari.", @@ -1154,11 +1154,11 @@ "Generate and edit images": "Generar i editar imatges", "Generate Message Pair": "Generar parella de missatges", "Generated Image": "Imatge generada", - "Generated images will appear here": "Les imatges generadoes apareixeran aquí", + "Generated images will appear here": "Les imatges generades apareixeran aquí", "Generating search query": "Generant consulta", "Generating...": "Generant...", "Get current time and perform date/time calculations": "Obtenir l'hora actual i realitzar càlculs de data i hora", - "Get information on {{name}} in the UI": "Obtenir informació de {{name}} a l'interficie d'usuari", + "Get information on {{name}} in the UI": "Obtenir informació de {{name}} a l'interfície d'usuari", "Get started": "Començar", "Get started with {{WEBUI_NAME}}": "Comença amb {{WEBUI_NAME}}", "Global": "Global", @@ -1170,10 +1170,10 @@ "Gravatar": "Gravatar", "Grid": "Graella", "Grokipedia": "Grokipedia", - "group": "", - "Group": "", + "group": "grup", + "Group": "Grup", "Group Channel": "Canal de grup", - "Group Claim": "", + "Group Claim": "Reclamació de grup", "Group created successfully": "El grup s'ha creat correctament", "Group deleted successfully": "El grup s'ha eliminat correctament", "Group Description": "Descripció del grup", @@ -1185,7 +1185,7 @@ "H2": "H2", "H3": "H3", "Haptic Feedback": "Retorn hàptic", - "Header variables": "", + "Header variables": "Variables de capçalera", "Headers": "Capçaleres", "Headers must be a valid JSON object": "Les capçaleres han de ser un objecte JSON vàlid", "Height": "Alçada", @@ -1216,8 +1216,8 @@ "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", - "Identity audit": "", - "Idle only": "", + "Identity audit": "Auditoria d'identitat", + "Idle only": "Només inactiu", "Idle Timeout": "Temps d'espera d'inactivitat", "iframe Sandbox Allow Forms": "Permetre formularis sandbox iframe", "iframe Sandbox Allow Same Origin": "Permetre same-origin sandbox iframe", @@ -1243,7 +1243,7 @@ "Import From Link": "Importar des d'un enllaç", "Import Models": "Importar models", "Import Prompts": "Importar indicacions", - "Import Skills": "", + "Import Skills": "Importa habilitats", "Import successful": "Importació correcta", "Import Tools": "Importar eines", "Important Update": "Actualització important", @@ -1313,8 +1313,8 @@ "Knowledge Name": "Nom del coneixement", "Knowledge Public Sharing": "Compartir públicament el Coneixement", "Knowledge Sharing": "Compartir el coneixement", - "Knowledge source created.": "", - "Knowledge source updated.": "", + "Knowledge source created.": "Font de coneixement creada.", + "Knowledge source updated.": "Font de coneixement actualitzada.", "Knowledge updated successfully": "Coneixement actualitzat correctament.", "Kokoro.js (Browser)": "Kokoro.js (Navegador)", "Kokoro.js Dtype": "Kokoro.js Dtype", @@ -1346,13 +1346,13 @@ "Leave empty to include all models or select specific models": "Deixa-ho en blanc per incloure tots els models o selecciona models específics", "Leave empty to use first admin user": "Deixa-ho buit per utilitzar el primer usuari administrador", "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)": "Deixa-ho en blanc per utilitzar la configuració predeterminada o introdueix un JSON vàlid (mira https://yandex.cloud/en/docs/search-api/api-ref/WebSearch/search#yandex.cloud.searchapi.v2.WebSearchRequest)", - "Leave empty to use the default model (voxtral-mini-latest).": "Deixau-ho en blanc per utilitzar el model per defecte (voxtral-mini-latest).", + "Leave empty to use the default model (voxtral-mini-latest).": "Deixa-ho en blanc per utilitzar el model per defecte (voxtral-mini-latest).", "Leave empty to use the default prompt, or enter a custom prompt": "Deixa-ho en blanc per utilitzar la indicació predeterminada o introdueix una indicació personalitzada", "Leave model field empty to use the default model.": "Deixa el camp de model buit per utilitzar el model per defecte.", "Legacy": "Llegat", "lexical": "lèxic", "License": "Llicència", - "Lifecycle JSON": "", + "Lifecycle JSON": "JSON del cicle de vida", "Lift List": "Aixecar la llista", "Light": "Clar", "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "Limita les consultes de cerca simultànies. 0 = il·limitada (per defecte). Estableix-ho a 1 per a l'execució seqüencial (recomanat per a API amb límits de velocitat estrictes com el nivell gratuït de Brave).", @@ -1376,10 +1376,10 @@ "Location access not allowed": "Accés a la ubicació no permesa", "Lost": "Perdut", "Low": "Baix", - "Lower the context compaction token threshold for this model. The global context compaction threshold remains the maximum.": "", + "Lower the context compaction token threshold for this model. The global context compaction threshold remains the maximum.": "Baixa el llindar de compactació de context per a aquest model. El llindar de compactació del context global segueix sent el màxim.", "LTR": "LTR", "Made by Open WebUI Community": "Creat per la Comunitat OpenWebUI", - "Make password visible in the user interface": "Fer que la contrasenya sigui visible a la interficie d'usuari", + "Make password visible in the user interface": "Fer que la contrasenya sigui visible a la interfície d'usuari", "Make sure to export a workflow.json file as API format from ComfyUI.": "Assegura't d'exportar un fitxer workflow.json com a format API des de ComfyUI.", "Male": "Home", "Manage": "Gestionar", @@ -1393,7 +1393,7 @@ "Manage Pipelines": "Gestionar les Pipelines", "Manage Tool Servers": "Gestionar els servidors d'eines", "Manage your account information.": "Gestionar la informació del teu compte.", - "Mapped Source": "", + "Mapped Source": "Font mapejada", "March": "Març", "Markdown": "Markdown", "Markdown Header Text Splitter": "Divisor de text de capçalera de Markdown", @@ -1421,7 +1421,7 @@ "Memory cleared successfully": "Memòria eliminada correctament", "Memory deleted successfully": "Memòria eliminada correctament", "Memory updated successfully": "Memòria actualitzada correctament", - "Merge Accounts by Email": "", + "Merge Accounts by Email": "Combina els comptes per correu electrònic", "Merge Responses": "Fusionar les respostes", "Merged Response": "Resposta combinada", "Message": "Missatge", @@ -1432,12 +1432,12 @@ "messages": "missatges", "Messages": "Missatges", "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Els missatges enviats després de crear el teu enllaç no es compartiran. Els usuaris amb la URL podran veure el xat compartit.", - "Metadata Field": "", + "Metadata Field": "Camp de metadades", "Microsoft OneDrive": "Microsoft OneDrive", "Microsoft OneDrive (personal)": "Microsoft OneDrive (personal)", "Microsoft OneDrive (work/school)": "Microsoft OneDrive (feina/escola)", - "Microsoft Web IQ API Base URL": "", - "Microsoft Web IQ API Key": "", + "Microsoft Web IQ API Base URL": "URL de base de l'API Microsoft Web IQ", + "Microsoft Web IQ API Key": "Clau de l'API de Microsoft Web IQ", "min": "mínim", "MinerU": "MinerU", "MinerU API Key required for Cloud API mode.": "És necessària la clau API de MinerU pel mode Cloud API", @@ -1490,7 +1490,7 @@ "Models Sharing": "Compartir els models", "Mojeek": "Mojeek", "Mojeek Search API Key": "Clau API de Mojeek Search", - "Monday – Friday": "", + "Monday – Friday": "dilluns – divendres", "Month": "Mes", "Monthly": "Cada mes", "More": "Més", @@ -1508,7 +1508,7 @@ "Name your knowledge base": "Anomena la teva base de coneixement", "Name, prompt, and model are required": "Nom, indicació i model són necessaris", "Native": "Natiu", - "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.": "", + "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.": "El mode natiu (per defecte) aprofita les capacitats de trucada d'eines integrades del model. El mode heretat funciona amb una gamma més àmplia de models trucant a les eines una vegada abans de l'execució mitjançant una injecció ràpida.", "Never": "Mai", "New": "Nou", "New Automation": "Nova automatització", @@ -1538,7 +1538,7 @@ "Next run": "Següent execució", "No access grants. Private to you.": "Sense permisos d'accés. Privat per a tu.", "No activity data": "No hi ha dades d'activitat", - "No additional headers are sent unless configured.": "", + "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 chats found": "No s'han trobat xats", @@ -1551,10 +1551,10 @@ "No data": "No hi ha dades", "No data found": "No s'han trobat dades", "No distance available": "No hi ha distància disponible", - "No event webhooks configured.": "", + "No event webhooks configured.": "No s'ha configurat cap webhook d'esdeveniments.", "No execution logs available yet": "No hi ha registres d'execució encara", "No expiration can pose security risks.": "No posar expiració pot suposar problemes de seguretat.", - "No external knowledge sources configured.": "", + "No external knowledge sources configured.": "No s'han configurat fonts de coneixement externes.", "No feedback found": "No s'ha trobat cap retorn", "No file selected": "No s'ha escollit cap fitxer", "No files found": "No s'han trobat arxius", @@ -1582,7 +1582,7 @@ "No output items": "No hi ha element de sortida", "No pinned messages": "No hi ha missatges fixats", "No prompts found": "No s'han trobat indicacions", - "No Repeat": "", + "No Repeat": "Sense repetició", "No results": "No s'han trobat resultats", "No results found": "No s'han trobat resultats", "No search query generated": "No s'ha generat cap consulta", @@ -1602,7 +1602,7 @@ "No webhooks yet": "No hi ha webhooks encara", "Node Ids": "Id de nodes", "None": "Cap", - "Not configured": "", + "Not configured": "No configurat", "Not factually correct": "No és clarament correcte", "Not helpful": "No ajuda", "Not Registered": "No registrat", @@ -1618,29 +1618,29 @@ "Notifications": "Notificacions", "November": "Novembre", "OAuth": "OAuth", - "OAuth / OIDC": "", + "OAuth / OIDC": "OAuth / OIDC", "OAuth 2.1": "OAuth 2.1", "OAuth 2.1 (Static)": "OAuth 2.1 (Estàtic)", "OAuth ID": "ID OAuth", - "OAuth Resource Parameter": "", - "OAuth Scopes": "", + "OAuth Resource Parameter": "Paràmetre de recurs OAuth", + "OAuth Scopes": "Àmbits d'OAuth", "OAuth Server URL": "URL del servidor OAuth", "OAuth session disconnected": "Sessió OAuth desconnectada", "October": "Octubre", "Off": "Desactivat", "Okay, Let's Go!": "D'acord, som-hi!", - "Older messages are summarized when estimated context exceeds this token limit.": "", + "Older messages are summarized when estimated context exceeds this token limit.": "Els missatges més antics es resumeixen quan el context estimat supera aquest límit de tokens.", "OLED Dark": "OLED Fosc", "Ollama": "Ollama", "Ollama API": "API d'Ollama", "Ollama API settings updated": "La configuració de l'API d'Ollama s'ha actualitzat", "Ollama Cloud API Key": "Clau API d'Ollama Cloud", "Ollama Version": "Versió d'Ollama", - "Omit": "", + "Omit": "Omet", "On": "Activat", "Once": "Una vegada", "OneDrive": "OneDrive", - "Only active during Voice Mode.": "Només actiu en le mode de Veu.", + "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 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.", @@ -1682,7 +1682,7 @@ "OpenAI API Version": "Versió de l'API d'OpenAI", "OpenAI URL/Key required.": "URL/Clau d'OpenAI requerides.", "OpenAPI": "OpenAPI", - "OpenAPI Spec": "Espeecificació OpenAPI", + "OpenAPI Spec": "Especificació OpenAPI", "openapi.json URL or Path": "Camí o URL a openapi.json", "optional": "opcional", "Optional": "Opcional", @@ -1707,7 +1707,7 @@ "Password": "Contrasenya", "Passwords do not match.": "Les contrasenyes no coincideixen", "Paste Large Text as File": "Enganxa un text llarg com a fitxer", - "Path": "", + "Path": "Camí", "Path copied": "Camí copiat", "Paused": "Pausat", "PDF document (.pdf)": "Document PDF (.pdf)", @@ -1716,21 +1716,21 @@ "pdf, docx, pptx, xlsx": "pdf, docx, pptx, xlsx", "pending": "pendent", "Pending": "Pendent", - "Pending Accounts": "", + "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", "Permission denied when accessing media devices": "Permís denegat en accedir a dispositius multimèdia", "Permission denied when accessing microphone": "Permís denegat en accedir al micròfon", "Permission denied when accessing microphone: {{error}}": "Permís denegat en accedir al micròfon: {{error}}", "Permissions": "Permisos", - "Permissions reset to defaults": "", + "Permissions reset to defaults": "Els permisos es restableixen als valors predeterminats", "Perplexity API Key": "Clau API de Perplexity", "Perplexity Model": "Model de Perplexity", "Perplexity Search API URL": "URL API per a Perplexity Search", "Perplexity Search Context Usage": "Utilització del context de cerca de Perplexity", "Persistent": "Persistent", "Personalization": "Personalització", - "Picture Claim": "", + "Picture Claim": "Reclamació d'imatge", "Pin": "Fixar", "Pin to Sidebar": "Fixar a la barra lateral", "Pinned": "Fixat", @@ -1769,7 +1769,7 @@ "Please select at least one user for Direct Message channel.": "Selecciona com a mínim un usuari per al canal de missatge directe.", "Please wait until all files are uploaded.": "Si us plau, espera fins que s'hagin carregat tots els fitxers.", "Policy ID": "ID de política", - "Policy ID is required": "", + "Policy ID is required": "L'identificador de la política és obligatori", "Port": "Port", "Ports": "Ports", "Positive attitude": "Actitud positiva", @@ -1796,11 +1796,11 @@ "Prompt updated successfully": "Indicació actualitzada correctament", "Prompts": "Indicacions", "Prompts Access": "Accés a les indicacions", - "Prompts Public Sharing": "Compartició pública de indicacions", + "Prompts Public Sharing": "Compartició pública d'indicacions", "Prompts Sharing": "Compartir les indicacions", "Provider": "Proveïdor", - "Provider Name": "", - "Provider URL": "", + "Provider Name": "Nom del proveïdor", + "Provider URL": "URL del proveïdor", "Public": "Públic", "Pull \"{{searchValue}}\" from Ollama.com": "Obtenir \"{{searchValue}}\" de Ollama.com", "Pull a model from Ollama.com": "Obtenir un model d'Ollama.com", @@ -1818,30 +1818,30 @@ "Read": "Llegit", "Read Aloud": "Llegir en veu alta", "Read more →": "Llegeix més →", - "Read only": "", + "Read only": "Només lectura", "Read Only": "Només lectura", "Read-Only Access": "Accés de només lectura", "Reason": "Raó", "Reasoning Effort": "Esforç de raonament", "Reasoning Tags": "Etiqueta de raonament", "Reasoning text...": "Text de raonament...", - "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.": "", + "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", "Reconnected": "Reconnectat", "Record": "Enregistrar", "Record voice": "Enregistrar la veu", - "Redirect URI": "", + "Redirect URI": "URI de redirecció", "Redirecting you to Open WebUI Community": "Redirigint-te a la comunitat OpenWebUI", "Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "Redueix la probabilitat de generar ximpleries. Un valor més alt (p. ex. 100) donarà respostes més diverses, mentre que un valor més baix (p. ex. 10) serà més conservador.", "Reference Chats": "Xats de referència", "Refresh": "Refrescar", - "Refresh requested: {{count}} terminal(s)_one": "", - "Refresh requested: {{count}} terminal(s)_many": "", - "Refresh requested: {{count}} terminal(s)_other": "", - "Refresh Terminals": "", - "Refreshing...": "", + "Refresh requested: {{count}} terminal(s)_one": "Actualització sol·licitada: {{count}} terminal", + "Refresh requested: {{count}} terminal(s)_many": "Actualització sol·licitada: {{count}} terminals", + "Refresh requested: {{count}} terminal(s)_other": "Actualització sol·licitada: {{count}} terminals", + "Refresh Terminals": "Actualitzar terminals", + "Refreshing...": "Refrescant...", "Refused when it shouldn't have": "Refusat quan no hauria d'haver estat", "Regenerate": "Regenerar", "Regenerate Menu": "Regenerar el menú", @@ -1852,7 +1852,7 @@ "Registration failed": "El registre ha fallat", "Registration successful": "Registre correcte", "Reindex": "Reindexar", - "Reindex Knowledge Base Vectors": "Reindexar els vector base del Coneixement", + "Reindex Knowledge Base Vectors": "Reindexar els vectors base del Coneixement", "Release Notes": "Notes de la versió", "Releases": "Versions", "Relevance": "Rellevància", @@ -1871,36 +1871,36 @@ "Removing {{count}} stale files..._many": "Eliminant arxius obsolets...", "Removing {{count}} stale files..._other": "Eliminant arxius obsolets...", "Rename": "Canviar el nom", - "Renamed to {{name}}": "S'ha renombrat a {{name}}", + "Renamed to {{name}}": "S'ha reanomenat a {{name}}", "Render Markdown in Assistant Messages": "Renderitzar el Markdown dels missatges de l'assistent", "Render Markdown in Previews": "Renderitzar el Markdown a les previsualitzacions", "Render Markdown in User Messages": "Renderitzar el Markdown dels missatges de l'usuari", "Reorder Models": "Reordenar els models", - "Repeat": "", + "Repeat": "Repetir", "Repeats": "Repeticions", "Reply": "Respondre", "Reply in Thread": "Respondre al fil", - "Reply to thread...": "Respondra al fil...", + "Reply to thread...": "Respondre al fil...", "Replying to {{NAME}}": "Responent a {{NAME}}", - "Require users to confirm before using Web Search.": "", + "Require users to confirm before using Web Search.": "Demana als usuaris que confirmin abans d'utilitzar la cerca web.", "required": "necessari", "Reranking Batch Size": "Mida del lot de reclassificació", "Reranking Engine": "Motor de valoració", "Reranking Model": "Model de reavaluació", - "Research Knowledge": "", + "Research Knowledge": "Recerca Coneixement", "Reset": "Restableix", "Reset All Models": "Restablir tots els models", - "Reset all permissions to their initial configuration values": "", - "Reset group permissions to match the current default user permissions": "", + "Reset all permissions to their initial configuration values": "Restableix tots els permisos als seus valors de configuració inicials", + "Reset group permissions to match the current default user permissions": "Restableix els permisos del grup perquè coincideixin amb els permisos d'usuari predeterminats actuals", "Reset Image": "Restableix la imatge", "Reset knowledge base?": "Reiniciar la base de coneixement?", - "Reset persisted files": "", - "Reset to Defaults": "", + "Reset persisted files": "Restableix els fitxers persistents", + "Reset to Defaults": "Restableix els valors per defecte", "Reset Upload Directory": "Restableix el directori de pujades", "Reset Vector Storage/Knowledge": "Restableix el Repositori de vectors/Coneixement", "Reset view": "Netejar la vista", "Response": "Resposta", - "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Les notifications 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.", + "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.", "Response splitting": "Divisió de la resposta", "Response Watermark": "Marca d'aigua de la resposta", "Responses": "Respostes", @@ -1916,7 +1916,7 @@ "Retrieved 1 source": "S'ha obtingut una font", "Rich Text Input for Chat": "Entrada de text ric per al xat", "Role": "Rol", - "Roles Claim": "", + "Roles Claim": "Reclamació de rols", "RTL": "RTL", "Run": "Executar", "Run All": "Executar tot", @@ -1930,17 +1930,17 @@ "Save & Create": "Desar i crear", "Save & Update": "Desar i actualitzar", "Save As Copy": "Desar com a còpia", - "Save Chat": "Dear el xat", + "Save Chat": "Desar el xat", "Saved": "Desat", - "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": "Desar els registres de xat directament a l'emmagatzematge del teu navegador ja no està suportat. Si us plau, descarregr i elimina els registres de xat fent clic al botó de sota. No et preocupis, pots tornar a importar fàcilment els teus registres de xat al backend a través de", + "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": "Desar els registres de xat directament a l'emmagatzematge del teu navegador ja no està suportat. Si us plau, descarrega i elimina els registres de xat fent clic al botó de sota. No et preocupis, pots tornar a importar fàcilment els teus registres de xat al backend a través de", "Schedule": "Programar", - "Scheduled time must be in the future": "La data d'execucuío ha de ser en el futur", - "Scopes": "", + "Scheduled time must be in the future": "La data d'execucuió ha de ser en el futur", + "Scopes": "Àmbits", "Scroll On Branch Change": "Fer scroll en canviar de branca", "Scroll to Top": "Anar a dalt", "Search": "Cercar", "Search a model": "Cercar un model", - "Search actions": "", + "Search actions": "Accions de cerca", "Search all emojis": "Cercar tots els emojis", "Search and manage user memories": "Cerca i gestiona les memòries d'usuari", "Search and view user chat history": "Cerca i mostra l'historial de xats", @@ -1950,7 +1950,7 @@ "Search Chats": "Cercar xats", "Search Collection": "Cercar col·leccions", "Search Files": "Cerca arxius", - "Search filters": "", + "Search filters": "Filtres de cerca", "Search Filters": "Filtres de cerca", "search for archived chats": "cercar xats arxivats", "search for folders": "cercar carpetes", @@ -1965,16 +1965,16 @@ "Search Models": "Cercar models", "Search Notes": "Cercar notes", "Search options": "Opcions de cerca", - "Search or add pattern": "", + "Search or add pattern": "Cerca o afegeix un patró", "Search Prompts": "Cercar indicacions", "Search Result Count": "Recompte de resultats de cerca", - "Search skills": "", + "Search skills": "Habilitats de cerca", "Search Skills": "Cerca habilitats", "Search the internet": "Cercar a internet", "Search the web and fetch URLs": "Cerca la web i obté les URL", - "Search tools": "", + "Search tools": "Eines de cerca", "Search Tools": "Cercar eines", - "Search users or groups": "", + "Search users or groups": "Cerca usuaris o grups", "Search, view, and manage user notes": "Cerca, mostra i gestiona les notes d'usuari", "SearchApi API Key": "Clau API de SearchApi", "SearchApi Engine": "Motor de SearchApi", @@ -1984,7 +1984,7 @@ "Searching Knowledge for \"{{searchQuery}}\"": "Cercant \"{{searchQuery}}\" al coneixement", "Searching the web": "Cercant la web...", "Searxng Query URL": "URL de consulta de Searxng", - "Searxng search language (all, en, es, de, fr, etc.)": "Idioma de cerca de cerca (all, en, es, de, fr, etc.)", + "Searxng search language (all, en, es, de, fr, etc.)": "Idioma de cerca (all, en, es, de, fr, etc.)", "See readme.md for instructions": "Consulta l'arxiu readme.md per obtenir instruccions", "See what's new": "Veure què hi ha de nou", "Seed": "Llavor", @@ -2027,25 +2027,25 @@ "semantic": "semàntic", "Send": "Enviar", "Send a Message": "Enviar un missatge", - "Send events for": "", + "Send events for": "Enviar esdeveniments per a", "Send message": "Enviar missatge", "Send now": "Enviar ara", - "Send product events as JSON to external services. Chat destinations receive readable messages.": "", - "Send the PDF as a base64 data URL instead of uploading it first.": "", + "Send product events as JSON to external services. Chat destinations receive readable messages.": "Envia esdeveniments de producte com a JSON a serveis externs. Les destinacions de xat reben missatges llegibles.", + "Send the PDF as a base64 data URL instead of uploading it first.": "Envia el PDF com a URL de dades base64 en lloc de penjar-lo primer.", "Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "Envia `stream_options: { include_usage: true }` a la sol·licitud.\nEls proveïdors compatibles retornaran la informació d'ús del token a la resposta quan s'estableixi.", "September": "Setembre", "SerpApi API Key": "Clau API de SerpApi", "SerpApi Engine": "Motor de SerpApi", "Serper API Key": "Clau API de Serper", - "SERPHouse API Key": "", - "SERPHouse Domain": "", + "SERPHouse API Key": "Clau de l'API SERPHouse", + "SERPHouse Domain": "Domini SERPhouse", "Serply API Key": "Clau API de Serply", "Serpstack API Key": "Clau API de Serpstack", "Server connection failed": "La connexió al servidor ha fallat", "Server connection verified": "Connexió al servidor verificada", - "Service Account": "", + "Service Account": "Compte de servei", "Session": "Sessió", - "Session expired. Please sign in again.": "", + "Session expired. Please sign in again.": "Sessió expirada. Si us plau, inicia sessió de nou.", "Set as default": "Establir com a predeterminat", "Set as Production": "Establir com a producció", "Set embedding model": "Establir el model d'incrustació", @@ -2073,7 +2073,7 @@ "Share link copied to clipboard.": "Compartir l'enllaç copiat al portaretalls", "Share to Open WebUI Community": "Compartir amb la comunitat OpenWebUI", "Share your background and interests": "Compartir la teva informació i interessos", - "Shared": "", + "Shared": "Compartit", "Shared Chats": "Xats compartits", "Shared with you": "Compartit amb tu", "Sharing Permissions": "Compartir els permisos", @@ -2081,9 +2081,9 @@ "Show \"What's New\" Modal on Login": "Veure 'Què hi ha de nou' a l'entrada", "Show Admin Details in Account Pending Overlay": "Mostrar els detalls de l'administrador a la superposició del compte pendent", "Show All": "Mostrar tot", - "Show all ({{COUNT}} characters)": "Mostra tot ({{COUNT}} caràcters", + "Show all ({{COUNT}} characters)": "Mostra tot ({{COUNT}} caràcters)", "Show Files": "Mostra els arxius", - "Show Files on Terminal Select": "", + "Show Files on Terminal Select": "Mostra fitxers en seleccionar terminal", "Show Formatting Toolbar": "Mostrar la barra de format", "Show image preview": "Mostrar la previsualització de la imatge", "Show Model": "Mostrar el model", @@ -2104,7 +2104,7 @@ "sk-1234": "sk-1234", "Skill created successfully": "Habilitat creada correctament", "Skill deleted successfully": "Habilitat suprimida correctament", - "Skill Description": "Descipció de l'habilitat", + "Skill Description": "Descripció de l'habilitat", "Skill ID": "ID de l'habilitat", "Skill imported successfully": "L'habilitat s'ha importat correctament", "Skill Instructions": "Instruccions de l'habilitat", @@ -2127,7 +2127,7 @@ "Sougou Search API sID": "sID de l'API de Sougou Search", "Sougou Search API SK": "SK de l'API de Sougou Search", "Source": "Font", - "Specific users or groups": "", + "Specific users or groups": "Usuaris o grups específics", "Speech Playback Speed": "Velocitat de la parla", "Speech recognition error: {{error}}": "Error de reconeixement de veu: {{error}}", "Speech-to-Text": "Àudio-a-Text", @@ -2165,7 +2165,7 @@ "STT Settings": "Preferències de STT", "Stylized PDF Export": "Exportació en PDF estilitzat", "Su_day_of_week": "Diumenge", - "Sub Claim": "", + "Sub Claim": "Reclamació sub", "Submit question": "Enviar la pregunta", "Submit suggestion": "Enviar un suggeriment", "Subtitle": "Subtítol", @@ -2185,15 +2185,15 @@ "Sync Complete!": "Sincronia completada", "Sync directory": "Sincronitzar directori", "Sync Failed": "La sincronia ha fallat", - "Sync Usage Stats": "Mostra la estadístiques d'ús", + "Sync Usage Stats": "Mostra les estadístiques d'ús", "Syncing stats...": "Sincronitzant les estadístiques...", "Syncing...": "Sincronitzant", "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "Sincronitza només els xats amb actualitzacions posteriors a la data i hora de l'última sincronització. Desactiva-ho per tornar a sincronitzar tots els xats.", "System": "Sistema", - "System events only": "", + "System events only": "Només esdeveniments del sistema", "System Instructions": "Instruccions de sistema", "System Prompt": "Indicació del Sistema", - "Table": "", + "Table": "Taula", "Tag": "Etiqueta", "Tags": "Etiquetes", "Tags Generation": "Generació d'etiquetes", @@ -2214,12 +2214,12 @@ "Temporary Chat by Default": "Xat temporal per defecte", "Terminal": "Terminal", "Terminal servers saved": "Servidors de terminal desats", - "Test": "", - "Test Query": "", - "Test returned no results.": "", - "Test succeeded.": "", - "Test the source before creating it.": "", - "Test the source before saving it.": "", + "Test": "Prova", + "Test Query": "Consulta de prova", + "Test returned no results.": "La prova no ha retornat resultats.", + "Test succeeded.": "La prova ha estat correcta.", + "Test the source before creating it.": "Prova la font abans de crear-la.", + "Test the source before saving it.": "Prova la font abans de desar-la.", "Text Splitter": "Separador de text", "Text-to-Speech": "Text-a-veu", "Text-to-Speech Engine": "Motor de text a veu", @@ -2228,7 +2228,7 @@ "The Application Account DN you bind with for search": "El DN del compte d'aplicació per realitzar la cerca", "The base to search for users": "La base per cercar usuaris", "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "La mida del lot determina quantes sol·licituds de text es processen alhora. Una mida de lot més gran pot augmentar el rendiment i la velocitat del model, però també requereix més memòria.", - "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Els desenvolupadors d'aquest complement són voluntaris apassionats de la comunitat. Si trobeu útil aquest complement, considereu contribuir al seu desenvolupament.", + "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Els desenvolupadors d'aquest complement són voluntaris apassionats de la comunitat. Si trobes útil aquest complement, considera contribuir al seu desenvolupament.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "La classificació d'avaluació es basa en el sistema de qualificació Elo i s'actualitza en temps real.", "The format to return a response in. Format can be json or a JSON schema.": "El format per retornar una resposta. El format pot ser json o un esquema JSON.", "The height in pixels to compress images to. Leave empty for no compression.": "L'alçada en píxels per comprimir imatges. Deixar-ho buit per a cap compressió.", @@ -2256,8 +2256,8 @@ "This folder is empty": "Aquesta carpeta està buida", "This is a default user permission and will remain enabled.": "Aquest és un permís d'usuari per defecte i romandrà habilitat.", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "Aquesta és una funció experimental, és possible que no funcioni com s'espera i està subjecta a canvis en qualsevol moment.", - "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 model is not publicly available. Please select another model.": "Aquest model no està disponible públicament. Seleccioneu-ne un altre.", + "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.": "Aquesta base de coneixement es recupera d'una font connectada. Open WebUI pot consultar-lo, però no pot carregar, sincronitzar, editar, suprimir, restablir ni reindexar les seves dades font.", + "This model is not publicly available. Please select another model.": "Aquest model no està disponible públicament. Selecciona'n un altre.", "This option controls how long the model will stay loaded into memory following the request (default: 5m)": "Aquesta opció controla quant temps el model romandrà carregat en memòria després de la sol·licitud (per defecte: 5m)", "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "Aquesta opció controla quants tokens es conserven en actualitzar el context. Per exemple, si s'estableix en 2, es conservaran els darrers 2 tokens del context de conversa. Preservar el context pot ajudar a mantenir la continuïtat d'una conversa, però pot reduir la capacitat de respondre a nous temes.", "This option enables or disables the use of the reasoning feature in Ollama, which allows the model to think before generating a response. When enabled, the model can take a moment to process the conversation context and generate a more thoughtful response.": "Aquesta opció activa o desactiva l'ús de la funció de raonament a Ollama, que permet que el model pensi abans de generar una resposta. Quan està activada, el model pot trigar una estona en processar el context de la conversa i generar una resposta més reflexiva.", @@ -2288,13 +2288,13 @@ "Title cannot be an empty string.": "El títol no pot ser una cadena buida.", "Title Generation": "Generació de títols", "Title Generation Prompt": "Indicació de generació de títol", - "Title is required": "El tìtol és necessari", + "Title is required": "El títol és necessari", "TLS": "TLS", "To access the available model names for downloading,": "Per accedir als noms dels models disponibles per descarregar,", "To access the GGUF models available for downloading,": "Per accedir als models GGUF disponibles per descarregar,", - "To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Per accedir a la WebUI, poseu-vos en contacte amb l'administrador. Els administradors poden gestionar els estats dels usuaris des del tauler d'administració.", - "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Per adjuntar la base de coneixement aquí, afegiu-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, visiteu la nostra documentació.", + "To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Per accedir a la WebUI, posa't en contacte amb l'administrador. Els administradors poden gestionar els estats dels usuaris des del tauler d'administració.", + "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 select skills here, add them to the \"Skills\" workspace first.": "Per seleccionar habilitats aquí, afegeix-les primer a l'espai de treball \"Habilitats\".", "To select toolkits here, add them to the \"Tools\" workspace first.": "Per seleccionar kits d'eines aquí, afegeix-los primer a l'espai de treball \"Eines\".", "Toast Notifications for New Updates": "Notificacions Toast de noves actualitzacions", @@ -2311,11 +2311,11 @@ "Toggle whether current connection is active.": "Alterna si la connexió actual està activa.", "Token": "Token", "Token counts are estimates and may not reflect actual API usage": "El nombre de tokens és estimat i pot no reflectir l'ús real de l'API.", - "Token Threshold": "", - "Tokenizer Model": "", + "Token Threshold": "Llindar de tokens", + "Tokenizer Model": "Model de tokenitzador", "tokens": "tokens", "Tokens": "Tokens", - "Too verbose": "Massa explicit", + "Too verbose": "Massa explícit", "Tool created successfully": "Eina creada correctament", "Tool deleted successfully": "Eina eliminada correctament", "Tool Description": "Descripció de l'eina", @@ -2361,19 +2361,19 @@ "Unpin": "Alliberar", "Unpin from Sidebar": "No fixis a la barra lateral", "Unravel secrets": "Descobreix els secrets", - "Unshare All": "", - "Unshare All Shared Chats": "", + "Unshare All": "Deixa de compartir-ho tot", + "Unshare All Shared Chats": "Deixa de compartir tots els xats compartits", "Unshare Chat": "Deixar de compartir el xat", "Unsupported file type.": "Tipus no suportat", "Untagged": "Sense etiquetes", "Untitled": "Sense títol", "Update": "Actualitzar", "Update and Copy Link": "Actualitzar i copiar l'enllaç", - "Update Email": "", + "Update Email": "Correu electrònic d'actualització", "Update for the latest features and improvements.": "Actualitza per a les darreres característiques i millores.", - "Update Name": "", + "Update Name": "Actualitza el nom", "Update password": "Actualitzar la contrasenya", - "Update Picture": "", + "Update Picture": "Actualitza la imatge", "Update your status": "Actualitza el teu estat", "Updated": "Actualitzat", "Updated at": "Actualitzat el", @@ -2394,24 +2394,24 @@ "Uploading {{current}}/{{total}}: {{file}}": "Pujant {{current}}/{{total}}: {{arxiu}}", "Uploading...": "Pujant...", "URL": "URL", - "URL is required": "La URL és necessaria", + "URL is required": "La URL és necessària", "URL Mode": "Mode URL", "Usage": "Ús", "Use": "Ús", "Use '#' in the prompt input to load and include your knowledge.": "Utilitza '#' a l'entrada de la indicació per carregar i incloure els teus coneixements.", "Use /v1/chat/completions endpoint instead of /v1/audio/transcriptions for potentially better accuracy.": "Fes servir l'endpoint /v1/chat/completions en comptes de /v1/audio/transcriptions per a una precisió potencialment millor.", - "Use a valid event name or pattern like user.*": "", - "Use Base64": "", + "Use a valid event name or pattern like user.*": "Utilitza un nom o un patró d'esdeveniment vàlid com ara usuari.*", + "Use Base64": "Utilitza Base64", "Use Chat Completions API": "Utilitza l'API de completació de xat", - "Use discovered scopes": "", + "Use discovered scopes": "Utilitza els àmbits descoberts", "Use groups to organize your users and assign permissions.": "Utilitza grups per organitzar els usuaris i assignar permisos.", - "Use LLM": "Utilizar model de llenguatge", + "Use LLM": "Utilitzar un model de llenguatge", "Use no proxy to fetch page contents.": "No utilitzis un proxy per obtenir contingut de la pàgina.", "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "Utilitza el proxy designat per les variables d'entorn http_proxy i https_proxy per obtenir el contingut de la pàgina.", - "Use Web Search?": "", + "Use Web Search?": "Utilitzar la cerca web?", "user": "usuari", "User": "Usuari", - "User Access": "", + "User Access": "Accés d'usuari", "User Activity": "Activitat d'usuari", "User Groups": "Grups d'usuari", "User location successfully retrieved.": "Ubicació de l'usuari obtinguda correctament", @@ -2421,7 +2421,7 @@ "User Status": "Estats d'usuari", "User Webhooks": "Webhooks d'usuari", "Username": "Nom d'usuari", - "Username Claim": "", + "Username Claim": "Reclamació de nom d'usuari", "users": "usuaris", "Users": "Usuaris", "Uses DefaultAzureCredential to authenticate": "Utilitza DefaultAzureCredential per a l'autenticació", @@ -2435,7 +2435,7 @@ "Valves updated": "Valves actualitzades", "Valves updated successfully": "Valves actualitzades correctament", "variable": "variable", - "Vector Field": "", + "Vector Field": "Camp vectorial", "Verify Connection": "Verificar la connexió", "Verify SSL Certificate": "Verificar el certificat SSL", "Version": "Versió", @@ -2459,20 +2459,20 @@ "Warning:": "Avís:", "Warning: Enabling this will allow users to run scheduled prompts automatically.": "Avís: Si actives aquesta opció, els usuaris podran executar sol·licituds programades automàticament.", "Warning: Enabling this will allow users to upload arbitrary code on the server.": "Avís: Habilitar això permetrà als usuaris penjar codi arbitrari al servidor.", - "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Avís: l'execució de Jupyter permet l'execució de codi arbitrari, la qual cosa comporta greus riscos de seguretat; procediu amb extrema precaució.", + "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Avís: l'execució de Jupyter permet l'execució de codi arbitrari, la qual cosa comporta greus riscos de seguretat; continua amb extrema precaució.", "We_day_of_week": "Dimecres", "Web": "Web", "Web API": "Web API", "Web Loader Engine": "Motor de càrrega Web", "Web Search": "Cerca la web", - "Web Search Confirmation": "", - "Web Search Confirmation Content": "", + "Web Search Confirmation": "Confirmació de la cerca web", + "Web Search Confirmation Content": "Contingut de confirmació de la cerca web", "Web Search Engine": "Motor de cerca de la web", "Web Search in Chat": "Cerca a internet al xat", "Web Search Query Generation": "Generació de consultes per a la cerca de la web", - "Webhook deleted": "", + "Webhook deleted": "Webhook suprimit", "Webhook Name": "Nom del webhook", - "Webhook saved": "", + "Webhook saved": "Webhook desat", "Webhooks": "Webhooks", "Webpage URLs": "URLs de la pàgina", "WebUI Settings": "Preferències de WebUI", @@ -2515,11 +2515,11 @@ "Yandex Web Search API Key": "Clau API de la cerca web Yandex", "Yandex Web Search config": "Configuració de la cerca web Yandex", "Yandex Web Search URL": "URL de la cerca web Yandex", - "Yearly": "", + "Yearly": "Anualment", "Yesterday": "Ahir", "Yesterday at {{LOCALIZED_TIME}}": "Ahir a les {{LOCALIZED_TIME}}", "You": "Tu", - "You are currently using a trial license. Please contact support to upgrade your license.": "Actualment esteu utilitzant una llicència de prova. Poseu-vos en contacte amb el servei d'assistència per actualitzar la vostra llicència.", + "You are currently using a trial license. Please contact support to upgrade your license.": "Actualment estàs utilitzant una llicència de prova. Posa't en contacte amb el servei d'assistència per actualitzar la teva llicència.", "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Només pots xatejar amb un màxim de {{maxCount}} fitxers alhora.", "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Pots personalitzar les teves interaccions amb els models de llenguatge afegint memòries mitjançant el botó 'Gestiona' que hi ha a continuació, fent-les més útils i adaptades a tu.", "You cannot upload an empty file.": "No es pot pujar un arxiu buit.", @@ -2545,9 +2545,9 @@ "Your browser does not support the video tag.": "El teu navegador no admet l'etiqueta de vídeo.", "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.": "Tota la teva contribució anirà directament al desenvolupador del complement; Open WebUI no se'n queda cap percentatge. Tanmateix, la plataforma de finançament escollida pot tenir les seves pròpies comissions.", "Your message text or inputs": "El text o les entrades del teu missatge", - "Your query will be sent to the configured web search provider.": "", + "Your query will be sent to the configured web search provider.": "La teva consulta s'enviarà al proveïdor de cerca web configurat.", "Your usage stats have been successfully synced.": "Les teves estadístiques d'ús s'han sincronitzat correctament.", - "YouTube": "Youtube", + "YouTube": "YouTube", "Youtube Language": "Idioma de YouTube", "Youtube Proxy URL": "URL de Proxy de Youtube" } From 19d8f03bd2c64013b510f2a0eeb3513d452814a3 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 1 Jul 2026 02:15:16 -0500 Subject: [PATCH 17/42] refac --- backend/open_webui/config.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 058348365b..e735ea9a72 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -290,6 +290,16 @@ OLLAMA_BASE_URLS = [url.strip() for url in OLLAMA_BASE_URLS.split(';')] OLLAMA_BASE_URLS = OLLAMA_BASE_URLS OLLAMA_API_CONFIGS = {} +_ollama_api_configs = os.getenv('OLLAMA_API_CONFIGS', '') +if _ollama_api_configs: + try: + parsed = json.loads(_ollama_api_configs) + if isinstance(parsed, dict): + OLLAMA_API_CONFIGS = parsed + else: + log.warning('OLLAMA_API_CONFIGS must be a JSON object, ignoring') + except (json.JSONDecodeError, TypeError): + log.warning('OLLAMA_API_CONFIGS is not valid JSON, ignoring') #################################### # OPENAI_API @@ -327,6 +337,16 @@ OPENAI_API_BASE_URLS = [ OPENAI_API_BASE_URLS = OPENAI_API_BASE_URLS OPENAI_API_CONFIGS = {} +_openai_api_configs = os.getenv('OPENAI_API_CONFIGS', '') +if _openai_api_configs: + try: + parsed = json.loads(_openai_api_configs) + if isinstance(parsed, dict): + OPENAI_API_CONFIGS = parsed + else: + log.warning('OPENAI_API_CONFIGS must be a JSON object, ignoring') + except (json.JSONDecodeError, TypeError): + log.warning('OPENAI_API_CONFIGS is not valid JSON, ignoring') # Get the actual OpenAI API key based on the base URL OPENAI_API_KEY = '' From 688bda09fbe26619613aa487beda8059a5fd55ef Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 1 Jul 2026 02:20:16 -0500 Subject: [PATCH 18/42] refac Co-Authored-By: Syed Osama Ali Shah <86572800+osamaali313@users.noreply.github.com> --- backend/open_webui/retrieval/web/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/retrieval/web/main.py b/backend/open_webui/retrieval/web/main.py index 56f796db58..23cbf08aeb 100644 --- a/backend/open_webui/retrieval/web/main.py +++ b/backend/open_webui/retrieval/web/main.py @@ -19,7 +19,7 @@ def get_filtered_results(results, filter_list): if not validators.url(url): continue - domain = urlparse(url).netloc + domain = urlparse(url).hostname if not domain: continue From ab22fe64bdd10ba86845dcd46dfd7f619b22366f Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 1 Jul 2026 02:20:50 -0500 Subject: [PATCH 19/42] refac Co-Authored-By: Syed Osama Ali Shah <86572800+osamaali313@users.noreply.github.com> --- backend/open_webui/models/config.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backend/open_webui/models/config.py b/backend/open_webui/models/config.py index 86d325c894..4c0cf0baed 100644 --- a/backend/open_webui/models/config.py +++ b/backend/open_webui/models/config.py @@ -14,6 +14,7 @@ import logging import time from typing import Any, ClassVar +from fastapi.encoders import jsonable_encoder from open_webui.internal.db import Base, get_async_db from sqlalchemy import JSON, BigInteger, Column, Text, delete, select @@ -86,6 +87,10 @@ def _assign_path(target: dict, path: list[str], value: Any) -> None: current[path[-1]] = value +def _json_value(value: Any) -> Any: + return jsonable_encoder(value) + + # ── Model ──────────────────────────────────────────────────────────────────── @@ -191,6 +196,7 @@ class Config(Base): async with get_async_db() as db: now = int(time.time()) for key, value in updates.items(): + value = _json_value(value) existing = await db.get(Config, key) if existing: existing.value = value @@ -232,6 +238,7 @@ class Config(Base): new_count = 0 for key, value in defaults.items(): if key not in existing_keys: + value = _json_value(value) db.add(Config(key=key, value=value, updated_at=now)) existing_keys.add(key) new_count += 1 From 8fe480250f649824441a7b4d725a502683134713 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 1 Jul 2026 02:25:20 -0500 Subject: [PATCH 20/42] refac --- .../admin/Settings/Documents.svelte | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index ba38a05659..23e758d9de 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -1247,12 +1247,14 @@
{/if} + {/if} -
-
{$i18n.t('Retrieval')}
+
+
{$i18n.t('Retrieval')}
-
+
+ {#if !RAGConfig.BYPASS_EMBEDDING_AND_RETRIEVAL}
{$i18n.t('Full Context Mode')}
@@ -1500,36 +1502,34 @@
{/if} {/if} + {/if} -
-
{$i18n.t('RAG Template')}
-
- +
{$i18n.t('RAG Template')}
+
+ +