From 61bbb99d9e99c69177f1f0230f730fc512b5b293 Mon Sep 17 00:00:00 2001 From: "Ethan T." Date: Mon, 9 Mar 2026 05:36:53 +0800 Subject: [PATCH 01/33] fix: replace bare except with Exception in oauth.py (#22420) * fix: replace bare except with except Exception in main.py * fix: replace bare except with Exception in oauth.py In Python 3, bare 'except:' is discouraged as it catches all SystemExit and KeyboardInterrupt exceptions. Changed to 'except Exception:' to only catch actual exceptions. --- backend/open_webui/main.py | 4 ++-- backend/open_webui/utils/oauth.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 4c27e811c..202bd32c1 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -1864,7 +1864,7 @@ async def process_chat(request, form_data, user, metadata, model): "model": model_id, }, ) - except: + except Exception: pass ctx = build_chat_response_context( @@ -1911,7 +1911,7 @@ async def process_chat(request, form_data, user, metadata, model): {"type": "chat:tasks:cancel"}, ) - except: + except Exception: pass finally: try: diff --git a/backend/open_webui/utils/oauth.py b/backend/open_webui/utils/oauth.py index 392ae74f9..249cc62d7 100644 --- a/backend/open_webui/utils/oauth.py +++ b/backend/open_webui/utils/oauth.py @@ -620,7 +620,7 @@ async def _preflight_authorization_url( payload = json.loads(response_text) error = payload.get("error") error_description = payload.get("error_description", "") - except: + except Exception: pass else: error_description = response_text From f419830a524051ac46a0518ccd9eedee8394df99 Mon Sep 17 00:00:00 2001 From: joaoback <156559121+joaoback@users.noreply.github.com> Date: Sun, 8 Mar 2026 18:37:33 -0300 Subject: [PATCH 02/33] # i18n: (pt-BR) add translations for newly added UI items + consistency pass (#22391) 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 | 48 ++++++++++----------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index 2d69ed5a3..233352321 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -19,11 +19,11 @@ "{{COUNT}} Rows": "{{COUNT}} Linhas", "{{COUNT}} Sources": "{{COUNT}} Origens", "{{COUNT}} words": "{{COUNT}} palavras", - "{{COUNT}}d_time_ago": "", - "{{COUNT}}h_time_ago": "", - "{{COUNT}}m_time_ago": "", - "{{COUNT}}w_time_ago": "", - "{{COUNT}}y_time_ago": "", + "{{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", "{{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}}", @@ -183,7 +183,7 @@ "Are you sure you want to delete this channel?": "Tem certeza de que deseja excluir este canal?", "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?": "", + "Are you sure you want to delete this?": "Tem certeza de que deseja excluir isto?", "Are you sure you want to unarchive all archived chats?": "Você tem certeza que deseja desarquivar todos os chats arquivados?", "Arena Models": "Arena de Modelos", "Artifacts": "Artefatos", @@ -283,7 +283,7 @@ "Character limit for autocomplete generation input": "Limite de caracteres para entrada de geração de preenchimento automático", "Chart new frontiers": "Trace novas fronteiras", "Chat": "Chat", - "Chat archived.": "", + "Chat archived.": "Chat arquivado.", "Chat Background Image": "Imagem de Fundo do Chat", "Chat Bubble UI": "Interface de Bolha de Chat", "Chat Completions": "Gerar Resposta", @@ -487,7 +487,7 @@ "Default User Role": "Padrão para novos usuários", "Defaults": "Padrões", "Delete": "Excluir", - "Delete {{name}}": "", + "Delete {{name}}": "Excluir {{name}}", "Delete a model": "Excluir um modelo", "Delete All": "Excluir tudo", "Delete All Chats": "Excluir Todos os Chats", @@ -580,7 +580,7 @@ "Downloading stats...": "Baixando estatísticas...", "Draw": "Empate", "Drop any files here to upload": "Solte qualquer arquivo aqui para fazer upload", - "Drop files here": "", + "Drop files here": "Solte os arquivos aqui", "Drop files here to upload": "Solte os arquivos aqui para fazer upload", "DuckDuckGo": "DuckDuckGo", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "por exemplo, '30s', '10m'. Unidades de tempo válidas são 's', 'm', 'h'.", @@ -826,7 +826,7 @@ "Fade Effect for Streaming Text": "Efeito de Fade para texto em streaming", "Failed to add file.": "Falha ao adicionar arquivo.", "Failed to add members": "Falha ao adicionar membros", - "Failed to archive chat.": "", + "Failed to archive chat.": "Falha ao arquivar o chat.", "Failed to attach file": "Falha ao anexar arquivo", "Failed to clear status": "Falha ao limpar o status", "Failed to connect to {{URL}} OpenAPI tool server": "Falha ao conectar ao servidor da ferramenta OpenAPI {{URL}}", @@ -841,11 +841,11 @@ "Failed to generate title": "Falha ao gerar título", "Failed to import models": "Falha ao importar modelos", "Failed to load chat preview": "Falha ao carregar a pré-visualização do chat", - "Failed to load DOCX file. Please try downloading it instead.": "", + "Failed to load DOCX file. Please try downloading it instead.": "Não foi possível carregar o arquivo DOCX. Tente baixá-lo em vez disso.", "Failed to load Excel/CSV file. Please try downloading it instead.": "Não foi possível carregar o arquivo Excel/CSV. Tente baixá-lo em vez disso.", "Failed to load file content.": "Falha ao carregar o conteúdo do arquivo.", "Failed to load Interface settings": "Falha ao carregar configurações da Interface", - "Failed to load PPTX file. Please try downloading it instead.": "", + "Failed to load PPTX file. Please try downloading it instead.": "Não foi possível carregar o arquivo PPTX. Tente baixá-lo em vez disso.", "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", @@ -900,7 +900,7 @@ "Focus Chat Input": "Foco na janela do Chat", "Folder": "Pasta", "Folder Background Image": "Imagem de fundo da pasta", - "Folder created successfully": "", + "Folder created successfully": "Pasta criada com sucesso", "Folder deleted successfully": "Pasta excluída com sucesso", "Folder Max File Count": "Contagem máxima de arquivos por pasta", "Folder name": "Nome da pasta", @@ -1265,7 +1265,7 @@ "More options": "Mais opções", "More Options": "Mais opções", "Move": "Mover", - "Moved {{name}}": "", + "Moved {{name}}": "{{name}} movido", "My Terminal": "Meu Terminal", "Name": "Nome", "Name and ID are required, please fill them out": "Nome e ID são obrigatórios, por favor preencha-os", @@ -1308,13 +1308,13 @@ "No file selected": "Nenhum arquivo selecionado", "No files found": "Nenhum arquivo encontrado", "No files in this knowledge base.": "Não existem arquivos nesta base de conhecimento.", - "No files yet. Upload files or run Python code to create them.": "", + "No files yet. Upload files or run Python code to create them.": "Nenhum arquivo ainda. Envie arquivos ou execute código Python para criá-los.", "No functions found": "Nenhuma função encontrada", "No groups found": "Nenhum grupo encontrado", "No history available": "Não há histórico disponível.", "No HTML, CSS, or JavaScript content found.": "Nenhum conteúdo HTML, CSS ou JavaScript encontrado.", "No inference engine with management support found": "Nenhum mecanismo de inferência com suporte de gerenciamento encontrado", - "No kernel": "", + "No kernel": "Sem kernel", "No knowledge bases found.": "Nenhuma base de conhecimento encontrada.", "No knowledge found": "Nenhum conhecimento encontrado", "No memories to clear": "Nenhuma memória para limpar", @@ -1330,7 +1330,7 @@ "No results": "Nenhum resultado encontrado", "No results found": "Nenhum resultado encontrado", "No search query generated": "Nenhuma consulta de pesquisa gerada", - "No servers detected": "", + "No servers detected": "Nenhum servidor detectado", "No skills found": "Nenhuma skill encontrada", "No source available": "Nenhuma fonte disponível", "No sources found": "Nenhuma fonte encontrada", @@ -1486,7 +1486,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.", "Port": "Porta", - "Ports": "", + "Ports": "Portas", "Positive attitude": "Atitude positiva", "Prefer not to say": "Prefiro não dizer", "Prefix ID": "Prefixo ID", @@ -1516,7 +1516,7 @@ "Pull \"{{searchValue}}\" from Ollama.com": "Obter \"{{searchValue}}\" de Ollama.com", "Pull a model from Ollama.com": "Obter um modelo de Ollama.com", "Pull Model": "Obter Modelo", - "Pyodide file browser": "", + "Pyodide file browser": "Navegador de arquivos Pyodide", "Query Generation Prompt": "Prompt de Geração de Consulta", "Querying": "Consultando", "Quick Actions": "Ações rápidas", @@ -1584,7 +1584,7 @@ "Response splitting": "Divisão da Resposta", "Response Watermark": "Marca d'água de resposta", "Responses": "Respostas", - "Restart": "", + "Restart": "Reiniciar", "Result": "Resultado", "RESULT": "Resultado", "Retrieval": "Recuperação", @@ -1598,7 +1598,7 @@ "Role": "Função", "RTL": "Direita para Esquerda", "Run": "Executar", - "Run All": "", + "Run All": "Executar Tudo", "Running": "Executando", "Running...": "Executando...", "Runs embedding tasks concurrently to speed up processing. Turn off if rate limits become an issue.": "Executa tarefas de incorporação simultaneamente para acelerar o processamento. Desative se os limites de taxa se tornarem um problema.", @@ -1789,7 +1789,7 @@ "Start a new conversation": "Iniciar uma nova conversa", "Start of the channel": "Início do canal", "Start Tag": "Tag inicial", - "Starting kernel...": "", + "Starting kernel...": "Iniciando kernel...", "Status": "Status", "Status cleared successfully": "Status liberado com sucesso", "Status updated successfully": "Status atualizado com sucesso", @@ -2134,8 +2134,8 @@ "You're now logged in.": "Você agora está logado.", "Your Account": "Sua conta", "Your account status is currently pending activation.": "O status da sua conta está atualmente aguardando ativação.", - "Your browser does not support the audio tag.": "", - "Your browser does not support the video tag.": "", + "Your browser does not support the audio tag.": "Seu navegador não suporta a tag de áudio.", + "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 usage stats have been successfully synced.": "Suas estatísticas de uso foram sincronizadas com sucesso.", From e1d04be89782ac6c9183499c484b730c850adaed Mon Sep 17 00:00:00 2001 From: joaoback <156559121+joaoback@users.noreply.github.com> Date: Sun, 8 Mar 2026 18:38:24 -0300 Subject: [PATCH 03/33] i18n: (pt-BR) add translations for newly added UI items + consistency pass (#22452) 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. From abe865f4f38f9c6daf8e2bd44780a7494aa84fe5 Mon Sep 17 00:00:00 2001 From: amirsubhi Date: Mon, 9 Mar 2026 05:38:35 +0800 Subject: [PATCH 04/33] i18n : Updated ms-MY Malay (Bahasa Malaysia) Language (#22450) Update ms-MY Malay (Bahasa Malaysia) Language --- src/lib/i18n/locales/ms-MY/translation.json | 3198 +++++++++---------- 1 file changed, 1599 insertions(+), 1599 deletions(-) diff --git a/src/lib/i18n/locales/ms-MY/translation.json b/src/lib/i18n/locales/ms-MY/translation.json index 4f05a58d6..91340356d 100644 --- a/src/lib/i18n/locales/ms-MY/translation.json +++ b/src/lib/i18n/locales/ms-MY/translation.json @@ -1,570 +1,570 @@ { - "-1 for no limit, or a positive integer for a specific limit": "", + "-1 for no limit, or a positive integer for a specific limit": "-1 untuk tanpa had, atau integer positif untuk had tertentu", "'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' or '-1' untuk tiada tempoh luput.", "(e.g. `sh webui.sh --api --api-auth username_password`)": "(contoh `sh webui.sh --api --api-auth username_password`)", "(e.g. `sh webui.sh --api`)": "(contoh `sh webui.sh --api`)", "(latest)": "(terkini)", - "(leave blank for to use commercial endpoint)": "", - "[Last] dddd [at] h:mm A": "", - "[Today at] h:mm A": "", - "[Yesterday at] h:mm A": "", + "(leave blank for to use commercial endpoint)": "(biarkan kosong untuk menggunakan titik akhir komersial)", + "[Last] dddd [at] h:mm A": "[Terakhir] dddd [pada] h:mm A", + "[Today at] h:mm A": "[Hari ini pada] h:mm A", + "[Yesterday at] h:mm A": "[Semalam pada] h:mm A", "{{ models }}": "{{ models }}", - "{{COUNT}} Available Tools": "", - "{{COUNT}} characters": "", - "{{COUNT}} extracted lines": "", - "{{COUNT}} files": "", - "{{COUNT}} hidden lines": "", - "{{COUNT}} members": "", - "{{COUNT}} Replies": "", - "{{COUNT}} Rows": "", - "{{COUNT}} Sources": "", - "{{COUNT}} words": "", - "{{COUNT}}d_time_ago": "", - "{{COUNT}}h_time_ago": "", - "{{COUNT}}m_time_ago": "", - "{{COUNT}}w_time_ago": "", - "{{COUNT}}y_time_ago": "", - "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "", - "{{model}} download has been canceled": "", - "{{modelName}} profile image": "", - "{{NAMES}} reacted with {{REACTION}}": "", + "{{COUNT}} Available Tools": "{{COUNT}} Alat Tersedia", + "{{COUNT}} characters": "{{COUNT}} aksara", + "{{COUNT}} extracted lines": "{{COUNT}} baris yang diekstrak", + "{{COUNT}} files": "{{COUNT}} fail", + "{{COUNT}} hidden lines": "{{COUNT}} baris tersembunyi", + "{{COUNT}} members": "{{COUNT}} ahli", + "{{COUNT}} Replies": "{{COUNT}} Balasan", + "{{COUNT}} Rows": "{{COUNT}} Baris", + "{{COUNT}} Sources": "{{COUNT}} Sumber", + "{{COUNT}} words": "{{COUNT}} perkataan", + "{{COUNT}}d_time_ago": "{{COUNT}}h yang lalu", + "{{COUNT}}h_time_ago": "{{COUNT}}j yang lalu", + "{{COUNT}}m_time_ago": "{{COUNT}}m yang lalu", + "{{COUNT}}w_time_ago": "{{COUNT}}m yang lalu", + "{{COUNT}}y_time_ago": "{{COUNT}}t yang lalu", + "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "{{LOCALIZED_DATE}} pada {{LOCALIZED_TIME}}", + "{{model}} download has been canceled": "Muat turun {{model}} telah dibatalkan", + "{{modelName}} profile image": "Imej profil {{modelName}}", + "{{NAMES}} reacted with {{REACTION}}": "{{NAMES}} bertindak balas dengan {{REACTION}}", "{{user}}'s Chats": "Perbualan {{user}}", "{{webUIName}} Backend Required": "{{webUIName}} Backend diperlukan", - "*Prompt node ID(s) are required for image generation": "", - "1 Source": "", - "1m_time_ago": "", - "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.": "", - "A private conversation between you and selected users": "", + "*Prompt node ID(s) are required for image generation": "*ID nod Prompt diperlukan untuk penjanaan imej", + "1 Source": "1 Sumber", + "1m_time_ago": "1m_masa_lalu", + "A collaboration channel where people join as members": "Saluran kolaborasi di mana orang ramai menyertai sebagai ahli", + "A discussion channel where access is controlled by groups and permissions": "Saluran perbincangan di mana akses dikawal oleh kumpulan dan kebenaran", + "A new version (v{{LATEST_VERSION}}) is now available.": "Versi baru (v{{LATEST_VERSION}}) kini tersedia.", + "A private conversation between you and selected users": "Perbualan peribadi antara anda dan pengguna terpilih", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Model tugas digunakan semasa melaksanakan tugas seperti menjana tajuk untuk perbualan dan pertanyaan carian web.", "a user": "seorang pengguna", "About": "Mengenai", - "Accept Autocomplete Generation\nJump to Prompt Variable": "", - "Access": "", - "Access Control": "", - "Access Grants": "", - "Access List": "", - "Accessible to all users": "", + "Accept Autocomplete Generation\nJump to Prompt Variable": "Terima Penjanaan Autolengkap", + "Access": "Akses", + "Access Control": "Kawalan Akses", + "Access Grants": "Pemberian Akses", + "Access List": "Senarai Akses", + "Accessible to all users": "Boleh diakses oleh semua pengguna", "Account": "Akaun", "Account Activation Pending": "Pengaktifan Akaun belum selesai", "Accurate information": "Informasi tepat", - "Action": "", - "Action not found": "", + "Action": "Tindakan", + "Action not found": "Tindakan tidak ditemui", "Action Required for Chat Log Storage": "Tindakan diperlukan untuk menyimpan log sembang", "Actions": "Tindakan", - "Activate": "", - "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "", + "Activate": "Aktifkan", + "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Aktifkan perintah ini dengan menaip \"/{{COMMAND}}\" ke input sembang.", "Active": "Aktif", "Active Users": "Pengguna Aktif", - "Activity": "", + "Activity": "Aktiviti", "Add": "Tambah", - "Add a model ID": "", + "Add a model ID": "Tambah ID model", "Add a short description about what this model does": "Tambah penerangan ringkas tentang apa yang model ini boleh lakukan", "Add a tag": "Tambah tag", - "Add a tag...": "", - "Add Access": "", - "Add Arena Model": "", - "Add Connection": "", - "Add Content": "", - "Add content here": "", - "Add Custom Parameter": "", - "Add Custom Prompt": "", - "Add Details": "", + "Add a tag...": "Tambah tag...", + "Add Access": "Tambah Akses", + "Add Arena Model": "Tambah Model Arena", + "Add Connection": "Tambah Sambungan", + "Add Content": "Tambah Kandungan", + "Add content here": "Tambah kandungan di sini", + "Add Custom Parameter": "Tambah Parameter Tersuai", + "Add Custom Prompt": "Tambah Prompt Tersuai", + "Add Details": "Tambah Butiran", "Add Files": "Tambah Fail", - "Add Image": "", - "Add Member": "", - "Add Members": "", + "Add Image": "Tambah Imej", + "Add Member": "Tambah Ahli", + "Add Members": "Tambah Ahli", "Add Memory": "Tambah Memori", "Add Model": "Tambah Model", - "Add Reaction": "", - "Add tag": "", + "Add Reaction": "Tambah Reaksi", + "Add tag": "Tambah tag", "Add Tag": "Tambah Tag", - "Add Terminal": "", - "Add Terminal Connection": "", - "Add text content": "", - "Add to favorites": "", + "Add Terminal": "Tambah Terminal", + "Add Terminal Connection": "Tambah Sambungan Terminal", + "Add text content": "Tambah kandungan teks", + "Add to favorites": "Tambah ke kegemaran", "Add User": "Tambah Pengguna", - "Add User Group": "", - "Add webpage": "", - "Add your Open Terminal URL and API key in 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": "", - "Additional feedback comments": "", - "Additional Parameters": "", - "Adds filenames, titles, sections, and snippets into the BM25 text to improve lexical recall.": "", + "Add User Group": "Tambah Kumpulan Pengguna", + "Add webpage": "Tambah halaman web", + "Add your Open Terminal URL and API key in Settings → Integrations.": "Tambah URL Open Terminal dan kunci API anda dalam Tetapan → Integrasi.", + "Additional Config": "Konfigurasi Tambahan", + "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": "Pilihan konfigurasi tambahan untuk penanda. Ini mestilah rentetan JSON dengan pasangan kunci-nilai. Contohnya, '{\"key\": \"value\"}'. Kunci yang disokong termasuk: 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": "Ulasan maklum balas tambahan", + "Additional Parameters": "Parameter Tambahan", + "Adds filenames, titles, sections, and snippets into the BM25 text to improve lexical recall.": "Menambah nama fail, tajuk, bahagian, dan petikan ke dalam teks BM25 untuk meningkatkan penarikan kembali leksikal.", "Adjusting these settings will apply changes universally to all users.": "Melaraskan tetapan ini akan menggunakan perubahan secara universal kepada semua pengguna.", "admin": "pentadbir", "Admin": "Pentadbir", - "Admin Contact Email": "", + "Admin Contact Email": "E-mel Pentadbir", "Admin Panel": "Panel Pentadbir", "Admin Settings": "Tetapan Pentadbir", "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Pentadbir mempunyai akses kepada semua alat pada setiap masa; pengguna memerlukan alat yang ditetapkan mengikut model dalam ruang kerja.", - "Advanced": "", + "Advanced": "Lanjutan", "Advanced Parameters": "Parameter Lanjutan", - "Advanced parameters for MinerU parsing (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)": "", + "Advanced parameters for MinerU parsing (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)": "Parameter lanjutan untuk penghuraian MinerU (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)", "Advanced Params": "Parameter Lanjutan", - "After updating or changing the embedding model, you must reindex the knowledge base for the changes to take effect. You can do this using the \"Reindex\" button below.": "", - "AI": "", - "All": "", - "All chats have been unarchived.": "", - "All models are now hidden": "", - "All models are now visible": "", - "All models deleted successfully": "", - "All time": "", - "All Users": "", - "Allow Call": "", - "Allow Chat Controls": "", - "Allow Chat Delete": "", - "Allow Chat Edit": "", - "Allow Chat Export": "", - "Allow Chat Params": "", - "Allow Chat Share": "", - "Allow Chat System Prompt": "", - "Allow Chat Valves": "", - "Allow Continue Response": "", - "Allow Delete Messages": "", - "Allow File Upload": "", - "Allow Multiple Models in Chat": "", + "After updating or changing the embedding model, you must reindex the knowledge base for the changes to take effect. You can do this using the \"Reindex\" button below.": "Selepas mengemas kini atau mengubah model embedding, anda mesti mengindeks semula pangkalan pengetahuan untuk perubahan berkuat kuasa. Anda boleh melakukan ini menggunakan butang \"Indeks Semula\" di bawah.", + "AI": "AI", + "All": "Semua", + "All chats have been unarchived.": "Semua sembang telah nyaharkib.", + "All models are now hidden": "Semua model kini tersembunyi", + "All models are now visible": "Semua model kini kelihatan", + "All models deleted successfully": "Semua model telah dipadamkan dengan berjaya", + "All time": "Sepanjang masa", + "All Users": "Semua Pengguna", + "Allow Call": "Benarkan Panggilan", + "Allow Chat Controls": "Benarkan Kawalan Sembang", + "Allow Chat Delete": "Benarkan Padam Sembang", + "Allow Chat Edit": "Benarkan Sunting Sembang", + "Allow Chat Export": "Benarkan Eksport Sembang", + "Allow Chat Params": "Benarkan Parameter Sembang", + "Allow Chat Share": "Benarkan Kongsi Sembang", + "Allow Chat System Prompt": "Benarkan arahan Sistem Sembang", + "Allow Chat Valves": "Benarkan Injap Sembang", + "Allow Continue Response": "Benarkan Sambungan Respons", + "Allow Delete Messages": "Benarkan Padam Mesej", + "Allow File Upload": "Benarkan Muat Naik Fail", + "Allow Multiple Models in Chat": "Benarkan Berbilang Model dalam Sembang", "Allow non-local voices": "Benarkan suara bukan tempatan ", - "Allow Rate Response": "", - "Allow Regenerate Response": "", - "Allow Sharing With Users": "", - "Allow Speech to Text": "", - "Allow Temporary Chat": "", - "Allow Text to Speech": "", + "Allow Rate Response": "Benarkan Penilaian Respons", + "Allow Regenerate Response": "Benarkan Jana Semula Respons", + "Allow Sharing With Users": "Benarkan Perkongsian dengan Pengguna", + "Allow Speech to Text": "Benarkan Pertuturan ke Teks", + "Allow Temporary Chat": "Benarkan Sembang Sementara", + "Allow Text to Speech": "Benarkan Teks ke Pertuturan", "Allow User Location": "Benarkan Lokasi Pengguna", "Allow Voice Interruption in Call": "Benarkan gangguan suara dalam panggilan", - "Allow Web Upload": "", - "Allowed Endpoints": "", - "Allowed File Extensions": "", - "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "", - "Already have an account?": "Telah mempunyai akaun?", - "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.": "", - "Always": "", - "Always Collapse Code Blocks": "", - "Always Expand Details": "", - "Always Play Notification Sound": "", - "Amazing": "", + "Allow Web Upload": "Benarkan Muat Naik Web", + "Allowed Endpoints": "Titik Akhir yang Dibenarkan", + "Allowed File Extensions": "Sambungan Fail yang Dibenarkan", + "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "Sambungan fail yang dibenarkan untuk muat naik. Pisahkan bilangan-bilangan sambungan dengan koma. Biarkan kosong untuk semua jenis fail.", + "Already have an account?": "Telah mempunyai aka?", + "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.": "Alternatif kepada top_p, dan bertujuan untuk memastikan keseimbangan antara kualiti dan kepelbagaian. Parameter p mewakili kebarangkalian minimum untuk token dipertimbangkan, relatif kepada kebarangkalian token yang paling berkemungkinan. Sebagai contoh, dengan p=0.05 dan token yang paling berkemungkinan mempunyai kebarangkalian 0.9, logit dengan nilai kurang daripada 0.045 ditapis keluar.", + "Always": "Sentiasa", + "Always Collapse Code Blocks": "Sentiasa Lipat Blok Kod", + "Always Expand Details": "Sentiasa Kembangkan Butiran", + "Always Play Notification Sound": "Sentiasa Mainkan Bunyi Pemberitahuan", + "Amazing": "Hebat", "an assistant": "seorang pembantu", - "An error occurred while fetching the explanation": "", - "Analytics": "", - "Analyzed": "", - "Analyzing...": "", - "and {{COUNT}} more": "", - "and create a new shared link.": "dan cipta pautan kongsi baharu", - "Android": "", - "Anyone": "", + "An error occurred while fetching the explanation": "Ralat berlaku semasa mengambil penjelasan", + "Analytics": "Analitik", + "Analyzed": "Sudah dianalisis", + "Analyzing...": "Menganalisis...", + "and {{COUNT}} more": "dan {{COUNT}} lagi", + "and create a new shared link.": "dan cipta patina kongsi baharu", + "Android": "Android", + "Anyone": "Sesiapa", "API Base URL": "URL Asas API", - "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "", + "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "URL Asas API untuk perkhidmatan Datalab Marker. Lalai kepada: https://www.datalab.to/api/v1/marker", "API Key": "Kunci API", "API Key created.": "Kunci API dicipta", - "API Key Endpoint Restrictions": "", + "API Key Endpoint Restrictions": "Sekatan Titik Akhir Kunci API", "API keys": "Kekunci API", - "API Keys": "", - "API Mode": "", - "API Timeout": "", - "API Type": "", - "API Version": "", - "API Version is required": "", - "Application DN": "", - "Application DN Password": "", - "applies to all users with the \"user\" role": "", + "API Keys": "Kunci API", + "API Mode": "Mod API", + "API Timeout": "Masa Tamat API", + "API Type": "Jenis API", + "API Version": "Versi API", + "API Version is required": "Versi API diperlukan", + "Application DN": "Aplikasi DN", + "Application DN Password": "Kata Laluan Aplikasi DN", + "applies to all users with the \"user\" role": "trepan kepada semua pengguna dengan peranan \"user\"", "April": "April", "Archive": "Arkib", - "Archive All": "", + "Archive All": "Arkibkan Semua", "Archive All Chats": "Arkibkan Semua Perbualan", "Archived Chats": "Perbualan yang diarkibkan", - "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 all chats? This action cannot be undone.": "", - "Are you sure you want to delete this channel?": "", - "Are you sure you want to delete this message?": "", - "Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "", - "Are you sure you want to delete this?": "", - "Are you sure you want to unarchive all archived chats?": "", - "Arena Models": "", - "Artifacts": "", - "Asc": "", - "Ask": "", - "Ask a question": "", - "Assistant": "", - "Async Embedding Processing": "", - "Attach File From Knowledge": "", - "Attach Knowledge": "", - "Attach Notes": "", - "Attach Webpage": "", + "archived-chat-export": "archived-chat-export", + "Are you sure you want to archive all chats? This action cannot be undone.": "Adakah anda pasti ingin mengarkibkan semua obrolan? Tindakan ini tidak boleh dibatalkan.", + "Are you sure you want to clear all memories? This action cannot be undone.": "Adakah anda pasti ingin menghapus semua ingatan? Tindakan ini tidak boleh dibatalkan.", + "Are you sure you want to delete \"{{NAME}}\"?": "Adakah anda pasti ingin menghapus \"{{NAME}}\"?", + "Are you sure you want to delete all chats? This action cannot be undone.": "Adakah anda pasti ingin menghapus semua obrolan? Tindakan ini tidak boleh dibatalkan.", + "Are you sure you want to delete this channel?": "Adakah anda pasti ingin menghapus saluran ini?", + "Are you sure you want to delete this message?": "Adakah anda pasti ingin menghapus mesej ini?", + "Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "Adakah anda pasti ingin menghapus versi ini? Versi anak akan dipautkan semula ke induk versi ini.", + "Are you sure you want to delete this?": "Adakah anda pasti ingin menghapus ini?", + "Are you sure you want to unarchive all archived chats?": "Adakah anda pasti ingin membuka arkib semua obrolan yang diarkibkan?", + "Arena Models": "Model Arena", + "Artifacts": "Artifak", + "Asc": "Naik", + "Ask": "Tanya", + "Ask a question": "Tanya soalan", + "Assistant": "Pembantu", + "Async Embedding Processing": "Pemprosesan Embedding Tak Segerak", + "Attach File From Knowledge": "Lampirkan Fail Daripada Pengetahuan", + "Attach Knowledge": "Lampirkan Pengetahuan", + "Attach Notes": "Lampirkan Nota", + "Attach Webpage": "Lampirkan Halaman Web", "Attention to detail": "Perincian", - "Attribute for Mail": "", - "Attribute for Username": "", + "Attribute for Mail": "Atribut untuk E-mel", + "Attribute for Username": "Atribut untuk Nama Pengguna", "Audio": "Audio", "August": "Ogos", - "Auth": "", - "Authenticate": "", - "Authentication": "", - "Auto": "", - "Auto (Random)": "", + "Auth": "Pengesahan", + "Authenticate": "Sahkan", + "Authentication": "Pengesahan", + "Auto": "Automatik", + "Auto (Random)": "Automatik (Rawak)", "Auto-Copy Response to Clipboard": "Salin Response secara Automatik ke Papan Klip", "Auto-playback response": "Main semula respons secara automatik", - "Autocomplete Generation": "", - "Autocomplete Generation Input Max Length": "", - "Automatic1111": "", + "Autocomplete Generation": "Penjanaan Autolengkap", + "Autocomplete Generation Input Max Length": "Panjang Maksimum Input Penjanaan Autolengkap", + "Automatic1111": "Automatic1111", "AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api Auth String", "AUTOMATIC1111 Base URL": "URL Asas AUTOMATIC1111", "AUTOMATIC1111 Base URL is required.": "URL Asas AUTOMATIC1111 diperlukan.", - "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "", - "Available list": "", - "Available models": "", - "Available Tools": "", + "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "Secara automatik suntikkan alat sistem dalam mod panggilan fungsi asli (cth., setem masa, memori, sejarah sembang, nota, dll)", + "Available list": "Senarai tersedia", + "Available models": "Model tersedia", + "Available Tools": "Alat Tersedia", "available users": "pengguna tersedia", "available!": "tersedia!", "Away": "Tiada di tempat", - "Awful": "", - "Azure AI Speech": "", + "Awful": "Teruk", + "Azure AI Speech": "Azure AI Speech", "Azure OpenAI": "Azure OpenAI", - "Azure Region": "", + "Azure Region": "Kawasan Azure", "Back": "Kembali", "Bad Response": "Maklumbalas Salah", "Banners": "Sepanduk", "Base Model (From)": "Model Asas (Dari)", - "Base Model List Cache speeds up access by fetching base models only at startup or on settings save—faster, but may not show recent base model changes.": "", - "Bearer": "", + "Base Model List Cache speeds up access by fetching base models only at startup or on settings save—faster, but may not show recent base model changes.": "Cache Sonar Model Asas mempercepatkan akses dengan mengambil model asas hanya pada permulaan atau penyimpanan tetapan—lebih pantas, tetapi mungkin tidak menunjukkan perubahan model asas terbaru.", + "Bearer": "Bearer", "before": "sebelum,", "Being lazy": "Menjadi Malas", - "Beta": "", - "Bing": "", - "Bing Search V7 Endpoint": "", - "Bing Search V7 Subscription Key": "", - "Bio": "", - "Birth Date": "", - "BM25 Weight": "", - "Bocha Search API Key": "", - "Bold": "", - "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "", - "Brave": "", + "Beta": "Beta", + "Bing": "Bing", + "Bing Search V7 Endpoint": "Titik Akhir Bing Search V7", + "Bing Search V7 Subscription Key": "Kunci Langganan Bing Search V7", + "Bio": "Biografi", + "Birth Date": "Tarikh Lahir", + "BM25 Weight": "Berat BM25", + "Bocha Search API Key": "Kunci API Mocha Search", + "Bold": "Tebal", + "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Meningkatkan atau mengurangkan token tertentu untuk respons terbatas. Nilai bias akan dihadkan antara -100 dan 100 (termasuk). (Lalai: tiada)", + "Brave": "Brave", "Brave Search API Key": "Kunci API Carian Brave", - "Browse and query knowledge bases": "", - "Builtin Tools": "", - "Bullet List": "", - "Button ID": "", - "Button Label": "", - "Button Prompt": "", - "by {{name}}": "", - "By {{name}}": "", - "Bypass Embedding and Retrieval": "", - "Bypass Web Loader": "", - "Cache Base Model List": "", - "Calendar": "", + "Browse and query knowledge bases": "Semak imbas dan pertanyaan pangkalan pengetahuan", + "Builtin Tools": "Alat Terbina", + "Bullet List": "Senarai Tanda Pleura", + "Button ID": "ID Butang", + "Button Label": "Label Butang", + "Button Prompt": "Prompt Butang", + "by {{name}}": "oleh {{name}}", + "By {{name}}": "Oleh {{name}}", + "Bypass Embedding and Retrieval": "Langkau Pembenaman dan Pencarian Semula", + "Bypass Web Loader": "Langkau Pemuat Web", + "Cache Base Model List": "Senarai Model Asas Cache", + "Calendar": "Kalendar", "Call": "Hubungi", "Call feature is not supported when using Web STT engine": "Ciri panggilan tidak disokong apabila menggunakan enjin Web STT", "Camera": "Kamera", "Cancel": "Batal", - "Cancel download of {{model}}": "", - "Cannot create an empty note.": "", - "Cannot delete the production version": "", + "Cancel download of {{model}}": "Batal muat turun {{model}}", + "Cannot create an empty note.": "Tidak dapat membuat nota kosong.", + "Cannot delete the production version": "Tidak dapat menghapus versi pengeluaran", "Capabilities": "Keupayaan", - "Capture": "", - "Capture Audio": "", - "Certificate Path": "", - "Change folder icon": "", + "Capture": "Tangkap", + "Capture Audio": "Tangkap Audio", + "Certificate Path": "Laluan Sijil", + "Change folder icon": "Tukar ikon folder", "Change Password": "Tukar Kata Laluan", - "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 updated successfully": "", - "Channels": "", - "Character": "", - "Character limit for autocomplete generation input": "", - "Chart new frontiers": "", + "Change User Role": "Tukar Peranan Pengguna", + "Channel": "Saluran", + "Channel deleted successfully": "Saluran berjaya dipadam", + "Channel Name": "Nama Saluran", + "Channel name cannot be empty.": "Nama saluran tidak boleh kosong.", + "Channel name must be less than 128 characters": "Nama saluran mesti kurang daripada 128 aksara", + "Channel Type": "Jenis Saluran", + "Channel updated successfully": "Saluran berjaya dikemas kini", + "Channels": "Saluran-saluran", + "Character": "Aksara", + "Character limit for autocomplete generation input": "Had aksara untuk input penjanaan autolengkap", + "Chart new frontiers": "Jelajahi sempadan baru", "Chat": "Perbualan", - "Chat archived.": "", + "Chat archived.": "Sembang telah diarkibkan.", "Chat Background Image": "Imej Latar Belakang Perbualan", "Chat Bubble UI": "Antaramuka Buih Perbualan", - "Chat Completions": "", - "Chat Conversation": "", + "Chat Completions": "Pelengkapan Sembang", + "Chat Conversation": "Perbualan Sembang", "Chat direction": "Arah Perbualan", - "Chat exported successfully": "", - "Chat History": "", - "Chat ID": "", - "Chat moved successfully": "", - "Chat Permissions": "", - "Chat Tags Auto-Generation": "", - "Chat unshared successfully.": "", - "chats": "", + "Chat exported successfully": "Sembang telah dieksport dengan berjaya", + "Chat History": "Sejarah Sembang", + "Chat ID": "ID Sembang", + "Chat moved successfully": "Sembang telah dipindahkan dengan berjaya", + "Chat Permissions": "Kebenaran Untuk Sembang", + "Chat Tags Auto-Generation": "Penjanaan Auto Tag Sembang", + "Chat unshared successfully.": "Obrolan tidak dikongsi dengan berjaya.", + "chats": "obrolan", "Chats": "Perbualan", "Check Again": "Semak Kembali", "Check for updates": "Semak kemas kini", "Checking for updates...": "Kemas kini sedang disemak", "Choose a model before saving...": "Pilih model sebelum menyimpan", - "Chunk Min Size Target": "", + "Chunk Min Size Target": "Sasaran Saiz Minimum Chunk", "Chunk Overlap": "Tindihan 'Çhunk'", "Chunk Size": "Saiz 'Chunk'", - "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "", - "Ciphers": "", + "Chunks smaller than this threshold will be merged with neighboring chunks when possible. Set to 0 to disable merging.": "Chunk yang lebih kecil daripada ambang ini akan digabungkan dengan chunk yang berdampingan apabila mungkin. Tetapkan kepada 0 untuk melumpuhkan penggabungan.", + "Ciphers": "Cipher", "Citation": "Petikan", - "Citations": "", + "Citations": "Petikan", "Clear memory": "Kosongkan memori", - "Clear Memory": "", - "Clear search": "", - "Clear status": "", - "click here": "", - "Click here for filter guides.": "", + "Clear Memory": "Padam Memori", + "Clear search": "Padam carian", + "Clear status": "Padam status", + "click here": "klik di sini", + "Click here for filter guides.": "Klik di sini untuk panduan penapis.", "Click here for help.": "Klik disini untuk mendapatkan bantuan", "Click here to": "Klik disini untuk", "Click here to download user import template file.": "Klik disini untuk memuat turun fail templat import pengguna", - "Click here to learn more about faster-whisper and see the available models.": "", - "Click here to see available models.": "", + "Click here to learn more about faster-whisper and see the available models.": "Klik di sini untuk mengetahui lebih lanjut tentang faster-whisper dan lihat model yang tersedia.", + "Click here to see available models.": "Klik di sini untuk melihat model yang tersedia.", "Click here to select": "Klik disini untuk memilih", "Click here to select a csv file.": "Klik disini untuk memilih fail csv", "Click here to select a py file.": "Klik disini untuk memilih fail py", - "Click here to upload a workflow.json file.": "", + "Click here to upload a workflow.json file.": "Klik di sini untuk memuat naik fail workflow.json.", "click here.": "klik disini.", "Click on the user role button to change a user's role.": "Klik pada butang peranan pengguna untuk menukar peranan pengguna", - "Click to copy ID": "", + "Click to copy ID": "Klik untuk menyalin ID", "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Kebenaran untuk menulis di papan klip ditolak. Sila semak tetapan pelayan web anda untuk memberikan akses yang diperlukan", "Clone": "Klon", - "Clone Chat": "", - "Clone of {{TITLE}}": "", + "Clone Chat": "Klon Sembang", + "Clone of {{TITLE}}": "Klon {{TITLE}}", "Close": "Tutup", - "Close Banner": "", - "Close chat controls": "", - "Close citation modal": "", - "Close Configure Connection Modal": "", - "Close feedback": "", - "Close modal": "", - "Close Modal": "", - "Close settings modal": "", - "Close Sidebar": "", - "cloud": "", - "CMU ARCTIC speaker embedding name": "", - "Code Block": "", - "Code Editor": "", - "Code execution": "", - "Code Execution": "", - "Code Execution Engine": "", - "Code Execution Timeout": "", + "Close Banner": "Tutup Sepanduk", + "Close chat controls": "Tutup kawalan sembang", + "Close citation modal": "Tutup modal petikan", + "Close Configure Connection Modal": "Tutup Konfigurasi Sambungan Modal", + "Close feedback": "Tutup maklum balas", + "Close modal": "Tutup modal", + "Close Modal": "Tutup Modal", + "Close settings modal": "Tutup modal tetapan", + "Close Sidebar": "Tutup Bar Sisi", + "cloud": "awan", + "CMU ARCTIC speaker embedding name": "Nama pembenaman pembicara CMU ARCTIC", + "Code Block": "Blok Kod", + "Code Editor": "Editor Kod", + "Code execution": "Pelaksanaan kod", + "Code Execution": "Pelaksanaan Kod", + "Code Execution Engine": "Enjin Pelaksanaan Kod", + "Code Execution Timeout": "Tamat Masa Pelaksanaan Kod", "Code formatted successfully": "Kod berjaya diformatkan", - "Code Interpreter": "", - "Code Interpreter Engine": "", - "Code Interpreter Prompt Template": "", - "Collaboration channel where people join as members": "", - "Collapse": "", + "Code Interpreter": "Penterjemah Kod", + "Code Interpreter Engine": "Enjin Penterjemah Kod", + "Code Interpreter Prompt Template": "Templat Prompt Penterjemah Kod", + "Collaboration channel where people join as members": "Saluran kolaborasi di mana orang bergabung sebagai ahli", + "Collapse": "Runtuhkan", "Collection": "Koleksi", - "Collections": "", - "Color": "", + "Collections": "Koleksi", + "Color": "Warna", "ComfyUI": "ComfyUI", - "ComfyUI API Key": "", + "ComfyUI API Key": "Kunci API ComfyUI", "ComfyUI Base URL": "URL asas ComfyUI", "ComfyUI Base URL is required.": "URL asas ComfyUI diperlukan", - "ComfyUI Workflow": "", - "ComfyUI Workflow Nodes": "", - "Comma separated Node Ids (e.g. 1 or 1,2)": "", - "command": "", + "ComfyUI Workflow": "Aliran Kerja ComfyUI", + "ComfyUI Workflow Nodes": "Nod Aliran Kerja ComfyUI", + "Comma separated Node Ids (e.g. 1 or 1,2)": "ID Nod yang dipisahkan dengan koma (cth. 1 atau 1,2)", + "command": "perintah", "Command": "Arahan", - "Comment": "", - "Commit Message": "", - "Community Reviews": "", - "Completions": "", - "Compress Images in Channels": "", + "Comment": "Komen", + "Commit Message": "Mesej Komit", + "Community Reviews": "Ulasan Komuniti", + "Completions": "Penyelesaian", + "Compress Images in Channels": "Mampat Imej dalam Saluran", "Concurrent Requests": "Permintaan Serentak", - "Config": "", - "Config imported successfully": "", - "Configure": "", + "Config": "Konfigurasi", + "Config imported successfully": "Konfigurasi diimport dengan berjaya", + "Configure": "Konfigurasikan", "Confirm": "Sahkan", "Confirm Password": "Sahkan kata laluan", "Confirm your action": "Sahkan tindakan anda", - "Confirm your new password": "", - "Confirm Your Password": "", - "Connect to an AI provider to start chatting": "", - "Connect to Open Terminal instances to browse files and use them as always-on tools. Only one can be active at a time.": "", - "Connect to Open Terminal instances. All users will have access to file browsing and terminal tools through these servers.": "", - "Connect to your own OpenAI compatible API endpoints.": "", - "Connect to your own OpenAPI compatible external tool servers.": "", - "Connection failed": "", - "Connection successful": "", - "Connection Type": "", + "Confirm your new password": "Sahkan kata laluan baru anda", + "Confirm Your Password": "Sahkan Kata Laluan Anda", + "Connect to an AI provider to start chatting": "Sambung ke penyedia AI untuk mulai berbual", + "Connect to Open Terminal instances to browse files and use them as always-on tools. Only one can be active at a time.": "Sambung ke instans Terminal Terbuka untuk layar fail dan gunakannya sebagai alat sentiasa aktif. Hanya satu boleh aktif pada satu masa.", + "Connect to Open Terminal instances. All users will have access to file browsing and terminal tools through these servers.": "Sambung ke instans Terminal Terbuka. Semua pengguna akan mempunyai akses kepada penyemakan fail dan alat terminal melalui pelayan ini.", + "Connect to your own OpenAI compatible API endpoints.": "Sambung ke titik akhir API yang serasi dengan OpenAI anda sendiri.", + "Connect to your own OpenAPI compatible external tool servers.": "Sambung ke pelayan alat luaran yang serasi dengan OpenAPI anda sendiri.", + "Connection failed": "Sambungan gagal", + "Connection successful": "Sambungan berjaya", + "Connection Type": "Jenis Sambungan", "Connections": "Sambungan", - "Connections saved successfully": "", - "Connections settings updated": "", - "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "", + "Connections saved successfully": "Sambungan disimpan dengan berjaya", + "Connections settings updated": "Tetapan sambungan dikemas kini", + "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "Mengehadkan usaha pada penaakulan untuk model penaakulan. Hanya terpakai pada model penaakulan daripada pembekal tertentu yang menyokong usaha penaakulan.", "Contact Admin for WebUI Access": "Hubungi admin untuk akses WebUI", "Content": "Kandungan", - "Content Extraction Engine": "", - "Content lengths (character counts only)": "", + "Content Extraction Engine": "Enjin Pengekstrakan Kandungan", + "Content lengths (character counts only)": "Panjang kandungan (kiraan aksara sahaja)", "Continue Response": "Teruskan Respons", "Continue with {{provider}}": "Teruskan dengan {{provider}}", - "Continue with Email": "", - "Continue with LDAP": "", - "Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "", - "Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "", + "Continue with Email": "Teruskan dengan Email", + "Continue with LDAP": "Teruskan dengan LDAP", + "Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "Kawal cara teks mesej dibahagi untuk permintaan TTS. 'Punctuation' membahagi kepada ayat, 'paragraphs' membahagi kepada perenggan, dan 'none' mengekalkan mesej sebagai satu rentetan.", + "Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "Kawal pengulangan jujukan token dalam teks yang dijana. Nilai yang lebih tinggi (cth. 1.5) akan menghukum pengulangan dengan lebih kuat, manakala nilai yang lebih rendah (cth. 1.1) akan lebih lembut. Pada 1, ia dilumpuhkan.", "Controls": "Kawalan", - "Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "", - "Conversation saved successfully": "", + "Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "Mengawal keseimbangan antara koheren dan kepelbagaian output. Nilai yang lebih rendah akan menghasilkan teks yang lebih fokus dan koheren.", + "Conversation saved successfully": "Perbualan disimpan dengan berjaya", "Copied": "Disalin", - "Copied link to clipboard": "", + "Copied link to clipboard": "Pautan disalin ke papan klip", "Copied shared chat URL to clipboard!": "Menyalin URL sembang kongsi ke papan klip", - "Copied to clipboard": "", + "Copied to clipboard": "Disalin ke papan klip", "Copy": "Salin", - "Copy API Key": "", - "Copy content": "", - "Copy Formatted Text": "", - "Copy Last Code Block": "", - "Copy Last Response": "", - "Copy link": "", + "Copy API Key": "Salin Kunci API", + "Copy content": "Salin kandungan", + "Copy Formatted Text": "Salin Teks Terformat", + "Copy Last Code Block": "Salin Blok Kod Terakhir", + "Copy Last Response": "Salin Respons Terakhir", + "Copy link": "Salin Pautan", "Copy Link": "Salin Pautan", - "Copy Prompt": "", - "Copy Share Link": "", - "Copy to clipboard": "", - "Copy Token": "", - "Copy URL": "", + "Copy Prompt": "Salin Prompt", + "Copy Share Link": "Salin Pautan Kongsian", + "Copy to clipboard": "Salin ke Papan Klip", + "Copy Token": "Salin Token", + "Copy URL": "Salin URL", "Copying to clipboard was successful!": "Menyalin ke papan klip berjaya!", - "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", - "Could not read file.": "", - "Create": "", - "Create a knowledge base": "", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS mesti dikonfigurasi dengan betul oleh pembekal untuk membenarkan permintaan daripada Open WebUI.", + "Could not read file.": "Tidak dapat membaca fail.", + "Create": "Buat", + "Create a knowledge base": "Buat pangkalan pengetahuan", "Create a model": "Cipta model", - "Create a new note": "", + "Create a new note": "Buat nota baru", "Create Account": "Cipta Akaun", - "Create Admin Account": "", - "Create Channel": "", - "Create Folder": "", - "Create Image": "", - "Create Knowledge": "", - "Create Model": "", + "Create Admin Account": "Buat Akaun Admin", + "Create Channel": "Buat Saluran", + "Create Folder": "Buat Folder", + "Create Image": "Buat Imej", + "Create Knowledge": "Buat Pengetahuan", + "Create Model": "Buat Model", "Create new key": "Cipta kekunci baharu", "Create new secret key": "Cipta kekunci rahsia baharu", - "Create note": "", - "Create Note": "", - "Create your first note by clicking on the plus button below.": "", + "Create note": "Buat nota", + "Create Note": "Buat Nota", + "Create your first note by clicking on the plus button below.": "Buat nota pertama anda dengan mengklik butang tambah di bawah.", "Created at": "Dicipta di", "Created At": "Dicipta Pada", "Created by": "Dicipta oleh", - "Created by you": "", - "Created on {{date}}": "", + "Created by you": "Dibuat oleh anda", + "Created on {{date}}": "Dibuat pada {{date}}", "CSV Import": "Import CSV", - "Ctrl+Enter to Send": "", + "Ctrl+Enter to Send": "Ctrl+Enter untuk Hantar", "Current Model": "Model Semasa", "Current Password": "Kata laluan semasa", "Custom": "Tersuai", - "Custom description enabled": "", - "Custom Gender": "", - "Custom Parameter Name": "", - "Custom Parameter Value": "", - "Daily Messages": "", - "Danger Zone": "", + "Custom description enabled": "Penerangan tersuai didayakan", + "Custom Gender": "Jantina Tersuai", + "Custom Parameter Name": "Nama Parameter Tersuai", + "Custom Parameter Value": "Nilai Parameter Tersuai", + "Daily Messages": "Mesej Harian", + "Danger Zone": "Zon Bahaya", "Dark": "Gelap", - "Data Controls": "", + "Data Controls": "Kawalan Data", "Database": "Pangkalan Data", - "Datalab Marker API": "", - "DD/MM/YYYY": "", - "DDGS Backend": "", + "Datalab Marker API": "API Penanda Datalab", + "DD/MM/YYYY": "DD/MM/YYYY", + "DDGS Backend": "Bahagian Belakang DDGS", "December": "Disember", - "Decrease UI Scale": "", - "Deepgram": "", + "Decrease UI Scale": "Kurangkan Skala UI", + "Deepgram": "Deepgram", "Default": "Lalai", - "Default (Open AI)": "", + "Default (Open AI)": "Lalai (Open AI)", "Default (SentenceTransformers)": "Lalai (SentenceTransformers)", - "Default action buttons will be used.": "", - "Default description enabled": "", - "Default Features": "", - "Default Filters": "", - "Default Group": "", - "Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model's built-in tool-calling capabilities, but requires the model to inherently support this feature.": "", + "Default action buttons will be used.": "Butang tindakan lalai akan digunakan.", + "Default description enabled": "Penerangan lalai diaktifkan", + "Default Features": "Fitur Lalai", + "Default Filters": "Penapis Lalai", + "Default Group": "Kumpulan Lalai", + "Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model's built-in tool-calling capabilities, but requires the model to inherently support this feature.": "Mode lalai berfungsi dengan rangkaian model yang lebih luas dengan memanggil alat sekali sebelum pelaksanaan. Mode asli memanfaatkan keupayaan panggilan alat terbina dalam model, tetapi memerlukan model untuk menyokong ciri ini secara bawaan.", "Default Model": "Model Lalai", "Default model updated": "Model lalai dikemas kini", - "Default permissions": "", - "Default permissions updated successfully": "", - "Default Prompt Suggestions": "Cadangan Gesaan Lalai", - "Default to 389 or 636 if TLS is enabled": "", - "Default to ALL": "", - "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "", + "Default permissions": "Kebenaran Lalai", + "Default permissions updated successfully": "Kebenaran lalai dikemas kini dengan berjaya", + "Default Prompt Suggestions": "Cadangan arahan Lalai", + "Default to 389 or 636 if TLS is enabled": "Lalai kepada 389 atau 636 jika TLS didayakan", + "Default to ALL": "Lalai kepada SEMUA", + "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "Lalai kepada pengambilan tersegmen untuk pengekstrakan kandungan yang berfokus dan relevan, ini disyorkan untuk kebanyakan kes.", "Default User Role": "Peranan Pengguna Lalai", - "Defaults": "", + "Defaults": "Lalai", "Delete": "Padam", - "Delete {{name}}": "", + "Delete {{name}}": "Padam {{name}}", "Delete a model": "Padam Model", - "Delete All": "", + "Delete All": "Padam Semua", "Delete All Chats": "Padam Semua Perbualan", - "Delete all contents inside this folder": "", + "Delete all contents inside this folder": "Padam semua kandungan dalam folder ini", "Delete Chat": "Padam Perbualan", "Delete chat?": "Padam perbualan?", - "Delete File": "", - "Delete folder?": "", + "Delete File": "Padam Fail", + "Delete folder?": "Padam folder?", "Delete function?": "Padam fungsi?", - "Delete Message": "", - "Delete message?": "", - "Delete Model": "", - "Delete note?": "", - "Delete prompt?": "Padam Gesaan?", - "Delete skill?": "", + "Delete Message": "Padam Mesej", + "Delete message?": "Padam mesej?", + "Delete Model": "Padam Model", + "Delete note?": "Padam nota?", + "Delete prompt?": "Padam arahan?", + "Delete skill?": "Padam kemahiran?", "delete this link": "Padam pautan ini?", "Delete tool?": "Padam alat?", "Delete User": "Padam Pengguna", - "Delete Version": "", - "Deleted": "", + "Delete Version": "Padam Versi", + "Deleted": "Sudah Dipadam", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} dipadam", "Deleted {{name}}": "{{name}} dipadam", - "Deleted User": "", - "Deployment names are required for Azure OpenAI": "", - "Desc": "", - "Describe the edit...": "", - "Describe the image...": "", - "Describe what changed...": "", - "Describe your knowledge base and objectives": "", + "Deleted User": "Pengguna yang Dipadam", + "Deployment names are required for Azure OpenAI": "Nama penggunaan diperlukan untuk Azure OpenAI", + "Desc": "Penerangan", + "Describe the edit...": "Terangkan pengeditan...", + "Describe the image...": "Terangkan imej...", + "Describe what changed...": "Terangkan apa yang berubah...", + "Describe your knowledge base and objectives": "Terangkan pangkalan pengetahuan dan objektif anda", "Description": "Penerangan", - "Detect Artifacts Automatically": "", - "Dictate": "", + "Detect Artifacts Automatically": "Kesan Artifak Secara Automatik", + "Dictate": "Dikte", "Didn't fully follow instructions": "Tidak mengikut arahan sepenuhnya", - "Direct": "", - "Direct Connections": "", - "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", - "Direct Message": "", - "Direct Tool Servers": "", - "Directory selection was cancelled": "", - "Disable All": "", - "Disable Code Interpreter": "", - "Disable Image Extraction": "", - "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", + "Direct": "Langsung", + "Direct Connections": "Sambungan Langsung", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Sambungan Langsung membenarkan pengguna untuk menyambung ke titik akhir API yang serasi dengan OpenAI mereka sendiri.", + "Direct Message": "Mesej Langsung", + "Direct Tool Servers": "Pelayan Alat Langsung", + "Directory selection was cancelled": "Pemilihan direktori telah dibatalkan", + "Disable All": "Nyahlumpuhkan Semua", + "Disable Code Interpreter": "Nyahlumpuhkan Penterjemah Kod", + "Disable Image Extraction": "Nyahlumpuhkan Pengekstrakan Imej", + "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Melumpuhkan pengekstrakan imej daripada PDF. Jika Gunakan LLM didayakan, imej akan diselia secara automatik. Lalai kepada Palsu.", "Disabled": "Dilumpuhkan", "Discover a function": "Temui fungsi", "Discover a model": "Temui model", - "Discover a prompt": "Temui gesaan", + "Discover a prompt": "Temui arahan", "Discover a tool": "Temui alat", - "Discover how to use Open WebUI and seek support from the community.": "", - "Discover wonders": "", + "Discover how to use Open WebUI and seek support from the community.": "Temui cara menggunakan Open WebUI dan dapatkan sokongan daripada komuniti.", + "Discover wonders": "Temui keajaiban", "Discover, download, and explore custom functions": "Temui, muat turun dan teroka fungsi tersuai", - "Discover, download, and explore custom prompts": "Temui, muat turun dan teroka gesaan tersuai", + "Discover, download, and explore custom prompts": "Temui, muat turun dan teroka arahan tersuai", "Discover, download, and explore custom tools": "Temui, muat turun dan teroka alat tersuai", "Discover, download, and explore model presets": "Temui, muat turun dan teroka model pratetap", - "Discussion channel where access is based on groups and permissions": "", - "Display": "", - "Display chat title in tab": "", + "Discussion channel where access is based on groups and permissions": "Saluran perbincangan di mana akses berdasarkan kumpulan dan kebenaran", + "Display": "Paparan", + "Display chat title in tab": "Paparkan tajuk sembang dalam tab", "Display Emoji in Call": "Paparkan Emoji dalam Panggilan", - "Display Multi-model Responses in Tabs": "", + "Display Multi-model Responses in Tabs": "Paparkan Respons Multi-model dalam Tab", "Display the username instead of You in the Chat": "Paparkan nama pengguna dan bukannya 'Anda' dalam Sembang", - "Displays citations in the response": "", - "Displays status updates (e.g., web search progress) in the response": "", - "Dive into knowledge": "", + "Displays citations in the response": "Memaparkan petikan dalam respons", + "Displays status updates (e.g., web search progress) in the response": "Memaparkan kemas kini status (cth., kemajuan carian web) dalam respons", + "Dive into knowledge": "Menyelami pengetahuan", "Do not install functions from sources you do not fully trust.": "Jangan pasang fungsi daripada sumber yang anda tidak percayai sepenuhnya.", "Do not install tools from sources you do not fully trust.": "Jangan pasang alat daripada sumber yang anda tidak percaya sepenuhnya.", - "Do you want to sync your usage stats with Open WebUI Community?": "", - "Docling": "", - "Docling Parameters": "", - "Docling Server URL required.": "", + "Do you want to sync your usage stats with Open WebUI Community?": "Adakah anda ingin menyegerakkan statistik penggunaan anda dengan Komuniti Open WebUI?", + "Docling": "Docling", + "Docling Parameters": "Parameter Docling", + "Docling Server URL required.": "URL Pelayan Docling diperlukan.", "Document": "Dokumen", - "Document Intelligence": "", - "Document Intelligence endpoint required.": "", - "Document Intelligence Model": "", + "Document Intelligence": "Kecerdasan Dokumen", + "Document Intelligence endpoint required.": "Titik akhir Dokumen Kecerdasan diperlukan.", + "Document Intelligence Model": "Document Model Kecerdasan", "Documentation": "Dokumentasi", - "Documents": "", + "Documents": "Dokumen", "does not make any external connections, and your data stays securely on your locally hosted server.": "tidak membuat sebarang sambungan luaran, dan data anda kekal selamat pada pelayan yang dihoskan ditempat anda", - "Domain Filter List": "", + "Domain Filter List": "Senarai Penapis Domain", "don't fetch random pipelines from sources you don't trust.": "Jangan ambil pipeline rawak daripada sumber yang anda tidak percayai.", "Don't have an account?": "Anda tidak mempunyai akaun?", "don't install random functions from sources you don't trust.": "jangan pasang mana-mana fungsi daripada sumber yang anda tidak percayai.", @@ -573,793 +573,793 @@ "Done": "Selesai", "Download": "Muat Turun", "Download & Delete": "Muat turun & Padam", - "Download as JSON": "", - "Download as SVG": "", + "Download as JSON": "Muat Turun sebagai JSON", + "Download as SVG": "Muat turun sebagai SVG", "Download canceled": "Muat Turun dibatalkan", "Download Database": "Muat turun Pangkalan Data", - "Downloading stats...": "", - "Draw": "", - "Drop any files here to upload": "", - "Drop files here": "", - "Drop files here to upload": "", - "DuckDuckGo": "", + "Downloading stats...": "Memuat turun statistik...", + "Draw": "Lukis", + "Drop any files here to upload": "Lepaskan fail di sini untuk muat naik", + "Drop files here": "Lepaskan fail di sini", + "Drop files here to upload": "Lepaskan fail di sini untuk muat naik", + "DuckDuckGo": "DuckDuckGo", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "cth '30s','10m'. Unit masa yang sah ialah 's', 'm', 'h'.", - "e.g. 'low', 'medium', 'high'": "", - "e.g. \"json\" or a JSON schema": "", - "e.g. 60": "", - "e.g. A filter to remove profanity from text": "", - "e.g. about the Roman Empire": "", - "e.g. alloy, echo, shimmer": "", - "e.g. Code Review Guidelines": "", - "e.g. code-review-guidelines": "", - "e.g. en": "", - "e.g. My Filter": "", - "e.g. My Tools": "", - "e.g. my_filter": "", - "e.g. my_tools": "", - "e.g. pdf, docx, txt": "", - "e.g. Step-by-step instructions for code reviews": "", - "e.g. Tell me a fun fact": "", - "e.g. Tell me a fun fact about the Roman Empire": "", - "e.g. Tools for performing various operations": "", - "e.g., 3, 4, 5 (leave blank for default)": "", - "e.g., audio/wav,audio/mpeg,video/* (leave blank for defaults)": "", - "e.g., en-US,ja-JP (leave blank for auto-detect)": "", - "e.g., westus (leave blank for eastus)": "", + "e.g. 'low', 'medium', 'high'": "cth. 'rendah', 'sederhana', 'tinggi'", + "e.g. \"json\" or a JSON schema": "cth. \"json\" atau skema JSON", + "e.g. 60": "cth. 60", + "e.g. A filter to remove profanity from text": "cth. Penapis untuk membuang kata-kata lucah daripada teks", + "e.g. about the Roman Empire": "cth. tentang Empayar Rom", + "e.g. alloy, echo, shimmer": "cth. aloi, gema, kilauan", + "e.g. Code Review Guidelines": "cth. Garis Panduan Semakan Kod", + "e.g. code-review-guidelines": "cth. garis-panduan-semakan-kod", + "e.g. en": "cth. ms", + "e.g. My Filter": "cth. Penapis Saya", + "e.g. My Tools": "cth. Alatan Saya", + "e.g. my_filter": "cth. penapis_saya", + "e.g. my_tools": "cth. alatan_saya", + "e.g. pdf, docx, txt": "cth. pdf, docx, txt", + "e.g. Step-by-step instructions for code reviews": "cth. Arahan langkah demi langkah untuk semakan kod", + "e.g. Tell me a fun fact": "cth. Beritahu saya fakta menarik", + "e.g. Tell me a fun fact about the Roman Empire": "cth. Beritahu saya fakta menarik tentang Empayar Rom", + "e.g. Tools for performing various operations": "cth. Alat untuk melakukan pelbagai operasi", + "e.g., 3, 4, 5 (leave blank for default)": "cth., 3, 4, 5 (biarkan kosong untuk lalai)", + "e.g., audio/wav,audio/mpeg,video/* (leave blank for defaults)": "cth., audio/wav,audio/mpeg,video/* (biarkan kosong untuk lalai)", + "e.g., en-US,ja-JP (leave blank for auto-detect)": "cth., en-US,ja-JP (biarkan kosong untuk auto-detect)", + "e.g., westus (leave blank for eastus)": "cth., westus (biarkan kosong untuk eastus)", "Edit": "Edit", - "Edit Arena Model": "", - "Edit Channel": "", - "Edit Connection": "", - "Edit Default Permissions": "", - "Edit Folder": "", - "Edit Image": "", - "Edit Last Message": "", + "Edit Arena Model": "Edit Model Arena", + "Edit Channel": "Edit Saluran", + "Edit Connection": "Edit Sambungan", + "Edit Default Permissions": "Edit Kebenaran Lalai", + "Edit Folder": "Edit Folder", + "Edit Image": "Edit Imej", + "Edit Last Message": "Edit Mesej Terakhir", "Edit Memory": "Edit Memori", - "Edit Prompt": "", - "Edit Terminal Connection": "", + "Edit Prompt": "Edit Arahan", + "Edit Terminal Connection": "Edit Sambungan Terminal", "Edit User": "Edit Penggunal", - "Edit User Group": "", - "Edit workflow.json content": "", - "edited": "", - "Edited": "", - "Editing": "", - "Eject": "", - "Eject model": "", + "Edit User Group": "Edit Kumpulan Pengguna", + "Edit workflow.json content": "Edit kandungan workflow.json", + "edited": "disunting", + "Edited": "Disunting", + "Editing": "Menyunting", + "Eject": "Keluarkan", + "Eject model": "Keluarkan model", "ElevenLabs": "ElevenLabs", "Email": "E-mel", - "Embark on adventures": "", - "Embedding": "", + "Embark on adventures": "Mulai petualangan", + "Embedding": "Pembenaman", "Embedding Batch Size": "Membenamkan Saiz Kelompok", - "Embedding Concurrent Requests": "", + "Embedding Concurrent Requests": "Permintaan Serentak Pembenaman", "Embedding Model": "Model Benamkan", "Embedding Model Engine": "Enjin Model Benamkan", - "Enable All": "", - "Enable API Keys": "", - "Enable autocomplete generation for chat messages": "", - "Enable Code Execution": "", - "Enable Code Interpreter": "", + "Enable All": "Dayakan Semua", + "Enable API Keys": "Dayakan Kunci API", + "Enable autocomplete generation for chat messages": "Aktifkan penjanaan auto-lengkap untuk mesej sembang", + "Enable Code Execution": "Aktifkan Pelaksanaan Kod", + "Enable Code Interpreter": "Aktifkan Pentafsir Kod", "Enable Community Sharing": "Benarkan Perkongsian Komuniti", - "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.": "", - "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.": "", - "Enable Message Queue": "", - "Enable Message Rating": "", - "Enable Mirostat sampling for controlling perplexity.": "", + "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.": "Aktifkan Penguncian Memori (mlock) untuk mencegah data model daripada ditukar keluar daripada RAM. Pilihan ini mengunci set halaman kerja model ke dalam RAM, memastikan bahawa ia tidak akan ditukar ke cakera. Ini boleh membantu mengekalkan prestasi dengan mengelakkan kesalahan halaman dan memastikan akses data yang cepat.", + "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.": "Aktifkan Pemetaan Memori (mmap) untuk memuatkan data model. Pilihan ini membenarkan sistem menggunakan storan cakera sebagai lanjutan RAM dengan memperlakukan fail cakera seolah-olah ia berada di dalam RAM. Ini boleh meningkatkan prestasi model dengan membenarkan akses data yang lebih cepat. Walau bagaimanapun, ia mungkin tidak berfungsi dengan betul pada semua sistem dan boleh menggunakan sejumlah besar ruang cakera.", + "Enable Message Queue": "Aktifkan Barisan Mesej", + "Enable Message Rating": "Aktifkan Penilaian Mesej", + "Enable Mirostat sampling for controlling perplexity.": "Aktifkan pensampelan Mirostat untuk mengawal kekeliruan.", "Enable New Sign Ups": "Benarkan Pendaftaran Baharu", - "Enable, disable, or customize the reasoning tags used by the model. \"Enabled\" uses default tags, \"Disabled\" turns off reasoning tags, and \"Custom\" lets you specify your own start and end tags.": "", + "Enable, disable, or customize the reasoning tags used by the model. \"Enabled\" uses default tags, \"Disabled\" turns off reasoning tags, and \"Custom\" lets you specify your own start and end tags.": "Aktifkan, nyahaktifkan, atau sesuaikan teg penaakulan yang digunakan oleh model. \"Diaktifkan\" menggunakan teg lalai, \"Dilumpuhkan\" mematikan teg penaakulan, dan \"Tersuai\" membenarkan anda menentukan teg permulaan dan akhir anda sendiri.", "Enabled": "Dibenarkan", - "End Tag": "", - "Endpoint URL": "", - "Enforce Temporary Chat": "", - "Enhance": "", - "Enrich Hybrid Search Text": "", + "End Tag": "Teg Akhir", + "Endpoint URL": "URL Titik Akhir", + "Enforce Temporary Chat": "Kuatkuasakan Sembang Sementara", + "Enhance": "Tingkatkan", + "Enrich Hybrid Search Text": "Perkaya Teks Carian Hibrid", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "astikan fail CSV anda mengandungi 4 lajur dalam susunan ini: Nama, E-mel, Kata Laluan, Peranan.", "Enter {{role}} message here": "Masukkan mesej {{role}} di sini", "Enter a detail about yourself for your LLMs to recall": "Masukkan butiran tentang diri anda untuk diingati oleh LLM anda", - "Enter a title for the pending user info overlay. Leave empty for default.": "", - "Enter a watermark for the response. Leave empty for none.": "", - "Enter additional headers in JSON format": "", - "Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "", - "Enter additional parameters in JSON format": "", + "Enter a title for the pending user info overlay. Leave empty for default.": "Masukkan tajuk untuk overlay maklumat pengguna yang tertunda. Biarkan kosong untuk lalai.", + "Enter a watermark for the response. Leave empty for none.": "Masukkan tera air untuk respons. Biarkan kosong untuk tiada.", + "Enter additional headers in JSON format": "Masukkan pengepala tambahan dalam format JSON", + "Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "Masukkan pengepala tambahan dalam format JSON (cth. {\"X-Custom-Header\": \"value\"}", + "Enter additional parameters in JSON format": "Masukkan parameter tambahan dalam format JSON", "Enter api auth string (e.g. username:password)": "Masukkan kekunci auth api ( cth nama pengguna:kata laluan )", - "Enter Application DN": "", - "Enter Application DN Password": "", - "Enter Bing Search V7 Endpoint": "", - "Enter Bing Search V7 Subscription Key": "", - "Enter Bocha Search API Key": "", + "Enter Application DN": "Masukkan DN Aplikasi", + "Enter Application DN Password": "Masukkan Kata Laluan DN Aplikasi", + "Enter Bing Search V7 Endpoint": "Masukkan Titik Akhir Bing Search V7", + "Enter Bing Search V7 Subscription Key": "Masukkan Kunci Langganan Bing Search V7", + "Enter Bocha Search API Key": "Masukkan Kunci API Pencarian Bocha", "Enter Brave Search API Key": "Masukkan Kekunci API carian Brave", - "Enter certificate path": "", - "Enter Chunk Min Size Target": "", + "Enter certificate path": "Masukkan laluan sertifikat", + "Enter Chunk Min Size Target": "Masukkan Saiz Minimum Chunk Target", "Enter Chunk Overlap": "Masukkan Tindihan 'Chunk'", "Enter Chunk Size": "Masukkan Saiz 'Chunk'", - "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "", - "Enter content for the pending user info overlay. Leave empty for default.": "", - "Enter coordinates (e.g. 51.505, -0.09)": "", - "Enter Datalab Marker API Base URL": "", - "Enter Datalab Marker API Key": "", - "Enter description": "", - "Enter Docling API Key": "", - "Enter Docling Server URL": "", - "Enter Document Intelligence Endpoint": "", - "Enter Document Intelligence Key": "", - "Enter Document Intelligence Model": "", - "Enter domains separated by commas (e.g., example.com,site.org,!excludedsite.com)": "", - "Enter Exa API Key": "", - "Enter External Document Loader API Key": "", - "Enter External Document Loader URL": "", - "Enter External Web Loader API Key": "", - "Enter External Web Loader URL": "", - "Enter External Web Search API Key": "", - "Enter External Web Search URL": "", - "Enter Firecrawl API Base URL": "", - "Enter Firecrawl API Key": "", - "Enter Firecrawl Timeout": "", - "Enter folder name": "", - "Enter function name filter list (e.g. func1, !func2)": "", + "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Masukkan pasangan \"token:bias_value\" yang dipisahkan dengan koma (contoh: 5432:100, 413:-100)", + "Enter content for the pending user info overlay. Leave empty for default.": "Masukkan kandungan untuk lapisan maklumat pengguna tertangguh. Biarkan kosong untuk lalai.", + "Enter coordinates (e.g. 51.505, -0.09)": "Masukkan koordinat (cth. 51.505, -0.09)", + "Enter Datalab Marker API Base URL": "Masukkan URL Asas API Penanda Datalab", + "Enter Datalab Marker API Key": "Masukkan Kunci API Datalab Marker", + "Enter description": "Masukkan penerangan", + "Enter Docling API Key": "Masukkan Kunci API Docling", + "Enter Docling Server URL": "Masukkan URL Pelayan Docling", + "Enter Document Intelligence Endpoint": "Masukkan Titik Akhir Document Intelligence", + "Enter Document Intelligence Key": "Masukkan Kunci Document Intelligence", + "Enter Document Intelligence Model": "Masukkan Model Document Intelligence", + "Enter domains separated by commas (e.g., example.com,site.org,!excludedsite.com)": "Masukkan domain yang dipisahkan dengan koma (cth. example.com,site.org,!excludedsite.com)", + "Enter Exa API Key": "Masukkan Kunci API Exa", + "Enter External Document Loader API Key": "Masukkan Kunci API Pemuat Dokumen Luaran", + "Enter External Document Loader URL": "Masukkan URL Pemuat Dokumen Luaran", + "Enter External Web Loader API Key": "Masukkan Kunci API Pemuat Web Luaran", + "Enter External Web Loader URL": "Masukkan URL Pemuat Web Luaran", + "Enter External Web Search API Key": "Masukkan Kunci API Carian Web Luaran", + "Enter External Web Search URL": "Masukkan URL Carian Web Luaran", + "Enter Firecrawl API Base URL": "Masukkan URL Asas API Firecrawl", + "Enter Firecrawl API Key": "Masukkan Kunci API Firecrawl", + "Enter Firecrawl Timeout": "Masukkan Masa Tamat Firecrawl", + "Enter folder name": "Masukkan nama folder", + "Enter function name filter list (e.g. func1, !func2)": "Masukkan senarai penapis nama fungsi (cth. func1, !func2)", "Enter Github Raw URL": "Masukkan URL 'Github Raw'", "Enter Google PSE API Key": "Masukkan kunci API Google PSE", "Enter Google PSE Engine Id": "Masukkan Id Enjin Google PSE", - "Enter hex color (e.g. #FF0000)": "", + "Enter hex color (e.g. #FF0000)": "Masukkan warna heks (cth. #FF0000)", "Enter Image Size (e.g. 512x512)": "Masukkan Saiz Imej (cth 512x512)", - "Enter Jina API Base URL": "", - "Enter Jina API Key": "", - "Enter JSON config (e.g., {\"disable_links\": true})": "", - "Enter Jupyter Password": "", - "Enter Jupyter Token": "", - "Enter Jupyter URL": "", - "Enter Kagi Search API Key": "", - "Enter Key Behavior": "", + "Enter Jina API Base URL": "Masukkan URL Asas API Jina", + "Enter Jina API Key": "Masukkan Kunci API Jina", + "Enter JSON config (e.g., {\"disable_links\": true})": "Masukkan konfigurasi JSON (cth., {\"disable_links\": true})", + "Enter Jupyter Password": "Masukkan Kata Laluan Jupyter", + "Enter Jupyter Token": "Masukkan Token Jupyter", + "Enter Jupyter URL": "Masukkan URL Jupyter", + "Enter Kagi Search API Key": "Masukkan Kunci API Pencarian Kagi", + "Enter Key Behavior": "Masukkan Perilaku Kunci", "Enter language codes": "Masukkan kod bahasa", - "Enter MinerU API Key": "", - "Enter Mistral API Base URL": "", - "Enter Mistral API Key": "", - "Enter Model ID": "", + "Enter MinerU API Key": "Masukkan Kunci API MinerU", + "Enter Mistral API Base URL": "Masukkan URL Asas API Mistral", + "Enter Mistral API Key": "Masukkan Kunci API Mistral", + "Enter Model ID": "Masukkan ID Model", "Enter model tag (e.g. {{modelTag}})": "Masukkan tag model (cth {{ modelTag }})", - "Enter Mojeek Search API Key": "", - "Enter name": "", - "Enter New Password": "", + "Enter Mojeek Search API Key": "Masukkan Kunci API Pencarian Mojeek", + "Enter name": "Masukkan nama", + "Enter New Password": "Masukkan Kata Laluan Baharu", "Enter Number of Steps (e.g. 50)": "Masukkan Bilangan Langkah (cth 50)", - "Enter Ollama Cloud API Key": "", - "Enter Perplexity API Key": "", - "Enter Perplexity Search API URL": "", - "Enter Playwright Timeout": "", - "Enter Playwright WebSocket URL": "", - "Enter proxy URL (e.g. https://user:password@host:port)": "", - "Enter reasoning effort": "", + "Enter Ollama Cloud API Key": "Masukkan Kunci API Ollama Cloud", + "Enter Perplexity API Key": "Masukkan Kunci API Perplexity", + "Enter Perplexity Search API URL": "Masukkan URL API Pencarian Perplexity", + "Enter Playwright Timeout": "Masukkan Masa Tamat Playwright", + "Enter Playwright WebSocket URL": "Masukkan URL WebSocket Playwright", + "Enter proxy URL (e.g. https://user:password@host:port)": "Masukkan URL proksi (contoh: https://user:password@host:port)", + "Enter reasoning effort": "Masukkan usaha penaakulan", "Enter Score": "Masukkan Skor", - "Enter SearchApi API Key": "", - "Enter SearchApi Engine": "", + "Enter SearchApi API Key": "Masukkan Kunci API SearchApi", + "Enter SearchApi Engine": "Masukkan Enjin SearchApi", "Enter Searxng Query URL": "Masukkan URL 'Searxng Query'", - "Enter Searxng search language": "", - "Enter Seed": "", - "Enter SerpApi API Key": "", - "Enter SerpApi Engine": "", + "Enter Searxng search language": "Masukkan bahasa carian Searxng", + "Enter Seed": "Masukkan Benih", + "Enter SerpApi API Key": "Masukkan Kunci API SerpApi", + "Enter SerpApi Engine": "Masukkan Enjin SerpApi", "Enter Serper API Key": "Masukkan Kunci API Serper", "Enter Serply API Key": "Masukkan Kunci API Serply", "Enter Serpstack API Key": "Masukkan Kunci API Serpstack", - "Enter server host": "", - "Enter server label": "", - "Enter server port": "", - "Enter skill instructions in markdown...": "", - "Enter Sougou Search API sID": "", - "Enter Sougou Search API SK": "", + "Enter server host": "Masukkan hos pelayan", + "Enter server label": "Masukkan label pelayan", + "Enter server port": "Masukkan port pelayan", + "Enter skill instructions in markdown...": "Masukkan arahan kemahiran dalam markdown...", + "Enter Sougou Search API sID": "Masukkan sID API Pencarian Sougou", + "Enter Sougou Search API SK": "Masukkan SK API Pencarian Sougou", "Enter stop sequence": "Masukkan urutan hentian", - "Enter system prompt": "Masukkan gesaan sistem", - "Enter system prompt here": "", + "Enter system prompt": "Masukkan arahan sistem", + "Enter system prompt here": "Masukkan gesaran sistem di sini", "Enter Tavily API Key": "Masukkan Kunci API Tavily", - "Enter Tavily Extract Depth": "", - "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "", - "Enter the URL of the function to import": "", - "Enter the URL to import": "", + "Enter Tavily Extract Depth": "Masukkan Kedalaman Ekstrak Tavily", + "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Masukkan URL awam WebUI anda. URL ini akan digunakan untuk menjana pautan dalam pemberitahuan.", + "Enter the URL of the function to import": "Masukkan URL fungsi untuk diimport", + "Enter the URL to import": "Masukkan URL untuk diimport", "Enter Tika Server URL": "Masukkan URL Pelayan Tika", - "Enter timeout in seconds": "", - "Enter to Send": "", + "Enter timeout in seconds": "Masukkan had masa dalam saat", + "Enter to Send": "Tekan untuk Hantar", "Enter Top K": "Masukkan 'Top K'", - "Enter Top K Reranker": "", + "Enter Top K Reranker": "Masukkan Top K Penyusun Semula", "Enter URL (e.g. http://127.0.0.1:7860/)": "Masukkan URL (cth http://127.0.0.1:7860/)", "Enter URL (e.g. http://localhost:11434)": "Masukkan URL (cth http://localhost:11434)", - "Enter value": "", - "Enter value (true/false)": "", - "Enter Yacy Password": "", - "Enter Yacy URL (e.g. http://yacy.example.com:8090)": "", - "Enter Yacy Username": "", - "Enter Yandex Web Search API Key": "", - "Enter Yandex Web Search URL": "", - "Enter You.com API Key": "", + "Enter value": "Masukkan nilai", + "Enter value (true/false)": "Masukkan nilai (benar/salah)", + "Enter Yacy Password": "Masukkan Kata Laluan Yacy", + "Enter Yacy URL (e.g. http://yacy.example.com:8090)": "Masukkan URL Yacy (cth. http://yacy.example.com:8090)", + "Enter Yacy Username": "Masukkan Nama Pengguna Yacy", + "Enter Yandex Web Search API Key": "Masukkan Kunci API Pencarian Web Yandex", + "Enter Yandex Web Search URL": "Masukkan URL Pencarian Web Yandex", + "Enter You.com API Key": "Masukkan Kunci API You.com", "Enter your code here...": "Masukkan kod anda di sini...", - "Enter your current password": "", + "Enter your current password": "Masukkan kata laluan semasa anda", "Enter Your Email": "Masukkan E-mel Anda", "Enter Your Full Name": "Masukkan Nama Penuh Anda", - "Enter your gender": "", + "Enter your gender": "Masukkan jantina anda", "Enter your message": "Masukkan mesej anda", - "Enter your name": "", - "Enter Your Name": "", - "Enter your new password": "", + "Enter your name": "Masukkan nama anda", + "Enter Your Name": "Masukkan Nama Anda", + "Enter your new password": "Masukkan kata laluan baru anda", "Enter Your Password": "Masukkan Kata Laluan Anda", "Enter Your Role": "Masukkan Peranan Anda", - "Enter Your Username": "", - "Enter your webhook URL": "", - "Entra ID": "", + "Enter Your Username": "Masukkan Nama Pengguna Anda", + "Enter your webhook URL": "Masukkan URL webhook anda", + "Entra ID": "Entra ID", "Error": "Ralat", - "ERROR": "", - "Error accessing directory": "", - "Error accessing Google Drive: {{error}}": "", - "Error accessing media devices.": "", - "Error starting recording.": "", - "Error unloading model: {{error}}": "", - "Error uploading file: {{error}}": "", - "Error: A model with the ID '{{modelId}}' already exists. Please select a different ID to proceed.": "", - "Error: Model ID cannot be empty. Please enter a valid ID to proceed.": "", - "Evaluations": "", - "Exa API Key": "", - "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "", - "Example: ALL": "", - "Example: mail": "", - "Example: ou=users,dc=foo,dc=example": "", - "Example: sAMAccountName or uid or userPrincipalName": "", - "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "", - "Exclude": "", - "Execute code": "", - "Execute code for analysis": "", - "Executing **{{NAME}}**...": "", - "Expand": "", + "ERROR": "RALAT", + "Error accessing directory": "Ralat mengakses direktori", + "Error accessing Google Drive: {{error}}": "Ralat mengakses Google Drive: {{error}}", + "Error accessing media devices.": "Ralat mengakses peranti media.", + "Error starting recording.": "Ralat memulai rakaman.", + "Error unloading model: {{error}}": "Ralat memunggah model: {{error}}", + "Error uploading file: {{error}}": "Ralat memuat naik fail: {{error}}", + "Error: A model with the ID '{{modelId}}' already exists. Please select a different ID to proceed.": "Ralat: Model dengan ID '{{modelId}}' sudah wujud. Sila pilih ID yang berbeza untuk meneruskan.", + "Error: Model ID cannot be empty. Please enter a valid ID to proceed.": "Ralat: ID Model tidak boleh kosong. Sila masukkan ID yang sah untuk meneruskan.", + "Evaluations": "Penilaian", + "Exa API Key": "Kunci API Exa", + "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Example: (&(objectClass=inetOrgPerson)(uid=%s))", + "Example: ALL": "Contoh: SEMUA", + "Example: mail": "Contoh: mail", + "Example: ou=users,dc=foo,dc=example": "Contoh: ou=users,dc=foo,dc=example", + "Example: sAMAccountName or uid or userPrincipalName": "Contoh: sAMAccountName atau uid atau userPrincipalName", + "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "Telah melampaui bilangan tempat duduk dalam lesen anda. Sila hubungi sokongan untuk meningkatkan bilangan tempat duduk.", + "Exclude": "Kecualikan", + "Execute code": "Laksanakan kod", + "Execute code for analysis": "Laksanakan kod untuk analisis", + "Executing **{{NAME}}**...": "Melaksanakan **{{NAME}}**...", + "Expand": "Kembangkan", "Experimental": "Percubaan", - "Explain": "", - "Explore the cosmos": "", + "Explain": "Jelaskan", + "Explore the cosmos": "Jelajahi alam semesta", "Export": "Eksport", - "Export All Archived Chats": "", + "Export All Archived Chats": "Eksport Semua Sembang Tersimpan", "Export All Chats (All Users)": "Eksport Semua Perbualan (Semua Pengguna)", "Export chat (.json)": "Eksport perbualan (.json)", "Export Chats": "Eksport Perbualan", - "Export Config": "", - "Export Models": "", - "Export Prompts": "", - "Export to CSV": "", - "Export Tools": "", - "Export Users": "", - "External": "", - "External Document Loader URL required.": "", - "External Task Model": "", - "External Web Loader API Key": "", - "External Web Loader URL": "", - "External Web Search API Key": "", - "External Web Search URL": "", - "Fade Effect for Streaming Text": "", - "Failed to add file.": "", - "Failed to add members": "", - "Failed to archive chat.": "", - "Failed to attach file": "", - "Failed to clear status": "", - "Failed to connect to {{URL}} OpenAPI tool server": "", - "Failed to connect to {{URL}} terminal server": "", - "Failed to copy link": "", + "Export Config": "Eksport Konfigurasi", + "Export Models": "Eksport Model", + "Export Prompts": "Eksport Prompt", + "Export to CSV": "Eksport ke CSV", + "Export Tools": "Eksport Alat", + "Export Users": "Eksport Pengguna", + "External": "Luaran", + "External Document Loader URL required.": "URL Pemuat Dokumen Luaran diperlukan.", + "External Task Model": "Model Tugas Luaran", + "External Web Loader API Key": "Kunci API Pemuat Web Luaran", + "External Web Loader URL": "URL Pemuat Web Luaran", + "External Web Search API Key": "Kunci API Carian Web Luaran", + "External Web Search URL": "URL Carian Web Luaran", + "Fade Effect for Streaming Text": "Kesan Pudar untuk Teks Penstriman", + "Failed to add file.": "Gagal menambah fail.", + "Failed to add members": "Gagal menambah ahli", + "Failed to archive chat.": "Gagal mengarkibkan sembang.", + "Failed to attach file": "Gagal melampirkan fail", + "Failed to clear status": "Gagal mengosongkan status", + "Failed to connect to {{URL}} OpenAPI tool server": "Gagal menyambung ke pelayan alat OpenAPI {{URL}}", + "Failed to connect to {{URL}} terminal server": "Gagal menyambung ke pelayan terminal {{URL}}", + "Failed to copy link": "Gagal menyalin pautan", "Failed to create API Key.": "Gagal mencipta kekunci API", - "Failed to delete note": "", - "Failed to download image": "", - "Failed to extract content from the file: {{error}}": "", - "Failed to extract content from the file.": "", - "Failed to fetch models": "", - "Failed to generate title": "", - "Failed to import models": "", - "Failed to load chat preview": "", - "Failed to load DOCX file. Please try downloading it instead.": "", - "Failed to load Excel/CSV file. Please try downloading it instead.": "", - "Failed to load file content.": "", - "Failed to load Interface settings": "", - "Failed to load PPTX file. Please try downloading it instead.": "", - "Failed to move chat": "", - "Failed to process URL: {{url}}": "", + "Failed to delete note": "Gagal memadamkan nota", + "Failed to download image": "Gagal memuat turun imej", + "Failed to extract content from the file: {{error}}": "Gagal mengekstrak kandungan daripada fail: {{error}}", + "Failed to extract content from the file.": "Gagal mengekstrak kandungan daripada fail.", + "Failed to fetch models": "Gagal mengambil model", + "Failed to generate title": "Gagal menjana tajuk", + "Failed to import models": "Gagal mengimport model", + "Failed to load chat preview": "Gagal memuatkan pratonton obrolan", + "Failed to load DOCX file. Please try downloading it instead.": "Gagal memuatkan fail DOCX. Sila cuba muat turun sebaliknya.", + "Failed to load Excel/CSV file. Please try downloading it instead.": "Gagal memuatkan fail Excel/CSV. Sila cuba muat turun sebaliknya.", + "Failed to load file content.": "Gagal memuatkan kandungan fail.", + "Failed to load Interface settings": "Gagal memuatkan tetapan Antara Muka", + "Failed to load PPTX file. Please try downloading it instead.": "Gagal memuatkan fail PPTX. Sila cuba muat turun sebaliknya.", + "Failed to move chat": "Gagal memindahkan obrolan", + "Failed to process URL: {{url}}": "Gagal memproses URL: {{url}}", "Failed to read clipboard contents": "Gagal membaca konten papan klip", - "Failed to remove member": "", - "Failed to render diagram": "", - "Failed to render visualization": "", - "Failed to save connections": "", + "Failed to remove member": "Gagal mengeluarkan ahli", + "Failed to render diagram": "Gagal merender rajah", + "Failed to render visualization": "Gagal merender visualisasi", + "Failed to save connections": "Gagal menyimpan sambungan", "Failed to save conversation": "Gagal menyimpan perbualan", - "Failed to save models configuration": "", - "Failed to save terminal servers": "", - "Failed to unshare chat.": "", + "Failed to save models configuration": "Gagal menyimpan konfigurasi model", + "Failed to save terminal servers": "Gagal menyimpan pelayan terminal", + "Failed to unshare chat.": "Gagal membatalkan perkongsian sembang.", "Failed to update settings": "Gagal mengemaskini tetapan", - "Failed to update status": "", - "Failed to upload file.": "", - "Features": "", - "Features Permissions": "", + "Failed to update status": "Gagal mengemaskini status", + "Failed to upload file.": "Gagal memuat naik fail.", + "Features": "Ciri-ciri", + "Features Permissions": "Kebenaran Ciri-ciri", "February": "Febuari", - "Feedback": "", - "Feedback Activity": "", - "Feedback deleted successfully": "", - "Feedback Details": "", - "Feedback History": "", + "Feedback": "Maklum Balas", + "Feedback Activity": "Aktiviti Maklum Balas", + "Feedback deleted successfully": "Maklum balas telah dipadam dengan berjaya", + "Feedback Details": "Butiran Maklum Balas", + "Feedback History": "Sejarah Maklum Balas", "Feel free to add specific details": "Jangan ragu untuk menambah butiran khusus", - "Female": "", + "Female": "Perempuan", "File": "Fail", - "File added successfully.": "", - "File attached to chat": "", - "File browser": "", - "File content": "", - "File content updated successfully.": "", - "File Context": "", - "File deleted successfully.": "", + "File added successfully.": "Fail telah ditambah dengan berjaya.", + "File attached to chat": "Fail dilampirkan pada sembang", + "File browser": "Pelayar fail", + "File content": "Kandungan fail", + "File content updated successfully.": "Kandungan fail dikemas kini dengan berjaya.", + "File Context": "Konteks Fail", + "File deleted successfully.": "Fail telah dipadamkan dengan berjaya.", "File Mode": "Mod Fail", - "File name": "", + "File name": "Nama fail", "File not found.": "Fail tidak dijumpai", - "File removed successfully.": "", - "File size should not exceed {{maxSize}} MB.": "", - "File Upload": "", - "File uploaded successfully": "", - "File uploaded!": "", - "Filename": "", + "File removed successfully.": "Fail telah dialihkan dengan berjaya.", + "File size should not exceed {{maxSize}} MB.": "Saiz fail tidak boleh melebihi {{maxSize}} MB.", + "File Upload": "Muat Naik Fail", + "File uploaded successfully": "Fail dimuat naik dengan berjaya", + "File uploaded!": "Fail dimuat naik!", + "Filename": "Nama fail", "Files": "Fail-Fail", - "Filter": "", + "Filter": "Penapis", "Filter is now globally disabled": "Tapisan kini dilumpuhkan secara global", "Filter is now globally enabled": "Tapisan kini dibenarkan secara global", "Filters": "Tapisan", "Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Peniruan cap jari dikesan, tidak dapat menggunakan nama pendek sebagai avatar. Lalai kepada imej profail asal", - "Firecrawl API Base URL": "", - "Firecrawl API Key": "", - "Firecrawl Timeout (s)": "", - "Floating Quick Actions": "", - "Focus Chat Input": "", - "Folder": "", - "Folder Background Image": "", - "Folder created successfully": "", - "Folder deleted successfully": "", - "Folder Max File Count": "", - "Folder name": "", - "Folder Name": "", - "Folder name cannot be empty.": "", - "Folder name updated successfully": "", - "Folder options": "", - "Folder updated successfully": "", - "Folders": "", - "Follow up": "", - "Follow Up Generation": "", - "Follow Up Generation Prompt": "", - "Follow up: {{question}}": "", - "Follow-Up Auto-Generation": "", + "Firecrawl API Base URL": "URL Asas API Firecrawl", + "Firecrawl API Key": "Kunci API Firecrawl", + "Firecrawl Timeout (s)": "Masa Tamat Firecrawl (s)", + "Floating Quick Actions": "Tindakan Pantas Terapung", + "Focus Chat Input": "Fokus Input Sembang", + "Folder": "Folder", + "Folder Background Image": "Imej Latar Belakang Folder", + "Folder created successfully": "Folder berjaya dibuat", + "Folder deleted successfully": "Folder berjaya dipadamkan", + "Folder Max File Count": "Bilangan Fail Maksimum Folder", + "Folder name": "Nama folder", + "Folder Name": "Nama Folder", + "Folder name cannot be empty.": "Nama folder tidak boleh kosong.", + "Folder name updated successfully": "Nama folder berjaya dikemas kini", + "Folder options": "Pilihan folder", + "Folder updated successfully": "Folder berjaya dikemas kini", + "Folders": "Folder-folder", + "Follow up": "Susulan", + "Follow Up Generation": "Penjanaan Susulan", + "Follow Up Generation Prompt": "Prompt Penjanaan Susulan", + "Follow up: {{question}}": "Susulan: {{question}}", + "Follow-Up Auto-Generation": "Auto-Penjanaan Susulan", "Followed instructions perfectly": "Mengikut arahan dengan sempurna", - "for placeholders": "", - "Force OCR": "", - "Force OCR on all pages of the PDF. This can lead to worse results if you have good text in your PDFs. Defaults to False.": "", - "Forge new paths": "", + "for placeholders": "untuk pemegang tempat", + "Force OCR": "Paksa OCR", + "Force OCR on all pages of the PDF. This can lead to worse results if you have good text in your PDFs. Defaults to False.": "Paksa OCR pada semua halaman PDF. Ini boleh menghasilkan hasil yang lebih teruk jika anda mempunyai teks yang baik dalam PDF anda. Lalai kepada False.", + "Forge new paths": "Membuka jalan baru", "Form": "Borang", - "Format Lines": "", - "Format the lines in the output. Defaults to False. If set to True, the lines will be formatted to detect inline math and styles.": "", - "Formatting may be inconsistent from source.": "", - "Forwards system user OAuth access token to authenticate": "", - "Forwards system user session credentials to authenticate": "", - "Full Context Mode": "", - "Function": "", - "Function Calling": "", + "Format Lines": "Format Baris", + "Format the lines in the output. Defaults to False. If set to True, the lines will be formatted to detect inline math and styles.": "Format baris dalam output. Lalai kepada False. Jika ditetapkan kepada True, baris akan diformat untuk mengesan matematik sebaris dan gaya.", + "Formatting may be inconsistent from source.": "Pemformatan mungkin tidak konsisten dari sumber.", + "Forwards system user OAuth access token to authenticate": "Meneruskan token akses OAuth pengguna sistem untuk pengesahan", + "Forwards system user session credentials to authenticate": "Meneruskan bukti kelayakan sesi pengguna sistem untuk pengesahan", + "Full Context Mode": "Mod Konteks Penuh", + "Function": "Fungsi", + "Function Calling": "Pemanggilan Fungsi", "Function created successfully": "Fungsi berjaya dibuat", "Function deleted successfully": "Fungsi berjaya dipadamkan", - "Function Description": "", - "Function ID": "", - "Function imported successfully": "", + "Function Description": "Penerangan Fungsi", + "Function ID": "ID Fungsi", + "Function imported successfully": "Fungsi diimport dengan berjaya", "Function is now globally disabled": "Fungsi kini dilumpuhkan secara global", "Function is now globally enabled": "Fungsi kini dibenarkan secara global", - "Function Name": "", - "Function Name Filter List": "", + "Function Name": "Nama Fungsi", + "Function Name Filter List": "Senarai Penapis Nama Fungsi", "Function updated successfully": "Fungsi berjaya dikemaskini", "Functions": "Fungsi", "Functions allow arbitrary code execution.": "Fungsi membenarkan pelaksanaan kod sewenang-wenangnya.", "Functions imported successfully": "Fungsi berjaya diimport", - "Gemini": "", - "Gemini API Key": "", - "Gemini API Key is required.": "", - "Gemini Base URL": "", - "Gemini Endpoint Method": "", - "Gender": "", + "Gemini": "Gemini", + "Gemini API Key": "Kunci API Gemini", + "Gemini API Key is required.": "Kunci API Gemini diperlukan.", + "Gemini Base URL": "URL Asas Gemini", + "Gemini Endpoint Method": "Kaedah Titik Akhir Gemini", + "Gender": "Jantina", "General": "Umum", - "Generate": "", - "Generate an image": "", - "Generate and edit images": "", - "Generate Message Pair": "", - "Generated Image": "", - "Generated images will appear here": "", + "Generate": "Janakan", + "Generate an image": "Janakan imej", + "Generate and edit images": "Janakan dan edit imej", + "Generate Message Pair": "Janakan Pasangan Mesej", + "Generated Image": "Imej yang Dijana", + "Generated images will appear here": "Imej yang dijana akan muncul di sini", "Generating search query": "Jana pertanyaan carian", - "Generating...": "", - "Get current time and perform date/time calculations": "", - "Get information on {{name}} in the UI": "", - "Get started": "", - "Get started with {{WEBUI_NAME}}": "", + "Generating...": "Menjana...", + "Get current time and perform date/time calculations": "Dapatkan masa semasa dan lakukan pengiraan tarikh/masa", + "Get information on {{name}} in the UI": "Dapatkan maklumat tentang {{name}} dalam UI", + "Get started": "Mulai", + "Get started with {{WEBUI_NAME}}": "Mulai dengan {{WEBUI_NAME}}", "Global": "Global", "Good Response": "Respons Baik", - "Google": "", - "Google Drive": "", + "Google": "Google", + "Google Drive": "Google Drive", "Google PSE API Key": "Kunci API Google PSE", "Google PSE Engine Id": "ID Enjin Google PSE", - "Gravatar": "", - "Grid": "", - "Grokipedia": "", - "Group Channel": "", - "Group created successfully": "", - "Group deleted successfully": "", - "Group Description": "", - "Group Name": "", - "Group updated successfully": "", - "groups": "", - "Groups": "", - "H1": "", - "H2": "", - "H3": "", - "Haptic Feedback": "", - "Headers": "", - "Headers must be a valid JSON object": "", - "Height": "", + "Gravatar": "Gravatar", + "Grid": "Grid", + "Grokipedia": "Grokipedia", + "Group Channel": "Saluran Kumpulan", + "Group created successfully": "Kumpulan berjaya dibuat", + "Group deleted successfully": "Kumpulan berjaya dipadamkan", + "Group Description": "Penerangan Kumpulan", + "Group Name": "Nama Kumpulan", + "Group updated successfully": "Kumpulan berjaya dikemaskini", + "groups": "kumpulan", + "Groups": "Kumpulan", + "H1": "H1", + "H2": "H2", + "H3": "H3", + "Haptic Feedback": "Maklum Balas Haptic", + "Headers": "Tajuk", + "Headers must be a valid JSON object": "Tajuk mesti menjadi objek JSON yang sah", + "Height": "Ketinggian", "Hello, {{name}}": "Hello, {{name}}", "Help": "Bantuan", - "Help the community discover great models": "", - "Hex Color": "", - "Hex Color - Leave empty for default color": "", - "Hidden": "", + "Help the community discover great models": "Bantu komuniti menemui model-model hebat", + "Hex Color": "Warna Heks", + "Hex Color - Leave empty for default color": "Warna Heks - Biarkan kosong untuk warna lalai", + "Hidden": "Tersembunyi", "Hide": "Sembunyi", - "Hide All": "", - "Hide from Sidebar": "", - "Hide Model": "", - "High": "", - "High Contrast Mode": "", - "History": "", - "Home": "", - "Host": "", - "Hourly Messages": "", + "Hide All": "Sembunyikan Semua", + "Hide from Sidebar": "Sembunyikan daripada Sidebar", + "Hide Model": "Sembunyikan Model", + "High": "Tinggi", + "High Contrast Mode": "Mode Kontras Tinggi", + "History": "Sejarah", + "Home": "Halaman Utama", + "Host": "Hos", + "Hourly Messages": "Mesej Setiap Jam", "How can I help you today?": "Bagaimana saya boleh membantu anda hari ini?", - "How would you rate this response?": "", - "HTML": "", - "http://localhost:8000": "", - "https://mineru.net/api/v4": "", + "How would you rate this response?": "Bagaimana anda menilai respons ini?", + "HTML": "HTML", + "http://localhost:8000": "http://localhost:8000", + "https://mineru.net/api/v4": "https://mineru.net/api/v4", "Hybrid Search": "Carian Hibrid", "I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Saya mengakui bahawa saya telah membaca dan saya memahami implikasi tindakan saya. Saya sedar tentang risiko yang berkaitan dengan melaksanakan kod sewenang-wenangnya dan saya telah mengesahkan kebolehpercayaan sumber tersebut.", - "ID": "", - "ID cannot contain \":\" or \"|\" characters": "", - "ID copied to clipboard": "", - "iframe Sandbox Allow Forms": "", - "iframe Sandbox Allow Same Origin": "", - "Ignite curiosity": "", - "Image": "", - "Image Compression": "", - "Image Compression Height": "", - "Image Compression Width": "", - "Image Edit": "", - "Image Edit Engine": "", - "Image Generation": "", + "ID": "ID", + "ID cannot contain \":\" or \"|\" characters": "ID tidak boleh mengandungi aksara \":\" atau \"|\"", + "ID copied to clipboard": "ID disalin ke papan kerja", + "iframe Sandbox Allow Forms": "iframe Sandbox Benarkan Borang", + "iframe Sandbox Allow Same Origin": "Benarkan Asal Sama untuk Sandbox iframe", + "Ignite curiosity": "Nyalakan rasa ingin tahu", + "Image": "Imej", + "Image Compression": "Mampatan Imej", + "Image Compression Height": "Tinggi Mampatan Imej", + "Image Compression Width": "Lebar Mampatan Imej", + "Image Edit": "Edit Imej", + "Image Edit Engine": "Enjin Edit Imej", + "Image Generation": "Penjanaan Imej", "Image Generation Engine": "Enjin Penjanaan Imej", - "Image Max Compression Size": "", - "Image Max Compression Size height": "", - "Image Max Compression Size width": "", - "Image Prompt Generation": "", - "Image Prompt Generation Prompt": "", - "Image Size": "", - "Images": "", - "Import": "", + "Image Max Compression Size": "Saiz Mampatan Imej Maksimum", + "Image Max Compression Size height": "Tinggi Saiz Mampatan Imej Maksimum", + "Image Max Compression Size width": "Lebar Saiz Mampatan Imej Maksimum", + "Image Prompt Generation": "Penjanaan Arahan Imej", + "Image Prompt Generation Prompt": "Arahan Penjanaan Imej", + "Image Size": "Saiz Imej", + "Images": "Imej", + "Import": "Import", "Import Chats": "Import Perbualan", - "Import Config": "", - "Import From Link": "", - "Import Models": "", - "Import Prompts": "", - "Import successful": "", - "Import Tools": "", + "Import Config": "Konfigurasi Import", + "Import From Link": "Import Dari Pautan", + "Import Models": "Import Model", + "Import Prompts": "Import Prompts", + "Import successful": "Import Berjaya", + "Import Tools": "Import Alat", "Important Update": "Kemas kini penting", - "Inactive": "", - "Include": "", + "Inactive": "Tidak Aktif", + "Include": "Sertakan", "Include `--api-auth` flag when running stable-diffusion-webui": "Sertakan bendera `-- api -auth` semasa menjalankan stable-diffusion-webui ", "Include `--api` flag when running stable-diffusion-webui": "Sertakan bendera `-- api ` semasa menjalankan stable-diffusion-webui", "Includes SharePoint": "Termasuk SharePoint", - "Increase UI Scale": "", - "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "", + "Increase UI Scale": "Tingkatkan Skala UI", + "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "Mempengaruhi seberapa cepat algoritma merespons umpan balik dari teks yang dihasilkan. Kadar pembelajaran yang lebih rendah akan menghasilkan penyesuaian yang lebih lambat, sementara kadar pembelajaran yang lebih tinggi akan membuat algoritma lebih responsif.", "Info": "Maklumat", - "Initials": "", - "Inject file content into conversation context": "", - "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "", - "Input": "", - "Input Key (e.g. text, unet_name, steps)": "", - "Input Variables": "", - "Insert": "", - "Insert Follow-Up Prompt to Input": "", - "Insert Prompt as Rich Text": "", - "Insert Suggestion Prompt to Input": "", + "Initials": "Inisial", + "Inject file content into conversation context": "Suntikkan kandungan fail ke dalam konteks perbualan", + "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Suntikkan seluruh kandungan sebagai konteks untuk pemprosesan komprehensif, ini disyorkan untuk pertanyaan yang kompleks.", + "Input": "Input", + "Input Key (e.g. text, unet_name, steps)": "Kunci Input (cth: text, unet_name, steps)", + "Input Variables": "Pembolehubah Input", + "Insert": "Sisipkan", + "Insert Follow-Up Prompt to Input": "Sisipkan Arahan Susulan ke Input", + "Insert Prompt as Rich Text": "Sisipkan Arahan sebagai Teks Kaya", + "Insert Suggestion Prompt to Input": "Sisipkan Arahan Cadangan ke Input", "Install from Github URL": "Pasang daripada URL Github", "Instant Auto-Send After Voice Transcription": "Hantar Secara Automatik Dengan Segera Selepas Transkripsi Suara", - "Integration": "", - "Integrations": "", + "Integration": "Integrasi", + "Integrations": "Integrasi", "Interface": "Antaramuka", - "Interface Settings Access": "", - "Invalid file content": "", - "Invalid file format.": "", - "Invalid JSON file": "", - "Invalid JSON format for ComfyUI Edit Workflow.": "", - "Invalid JSON format for ComfyUI Workflow.": "", - "Invalid JSON format for Parameters": "", - "Invalid JSON format in {{NAME}}": "", - "Invalid JSON format in Additional Config": "", - "Invalid JSON format in MinerU Parameters": "", - "is typing...": "", - "Italic": "", + "Interface Settings Access": "Akses Tetapan Antara Muka", + "Invalid file content": "Kandungan fail tidak sah", + "Invalid file format.": "Format fail tidak sah.", + "Invalid JSON file": "Fail JSON tidak sah", + "Invalid JSON format for ComfyUI Edit Workflow.": "Format JSON tidak sah untuk ComfyUI Edit Workflow.", + "Invalid JSON format for ComfyUI Workflow.": "Format JSON tidak sah untuk ComfyUI Workflow.", + "Invalid JSON format for Parameters": "Format JSON tidak sah untuk Parameters", + "Invalid JSON format in {{NAME}}": "Format JSON tidak sah dalam {{NAME}}", + "Invalid JSON format in Additional Config": "Format JSON tidak sah dalam Additional Config", + "Invalid JSON format in MinerU Parameters": "Format JSON tidak sah dalam MinerU Parameters", + "is typing...": "sedang menaip...", + "Italic": "Miring", "January": "Januari", - "Jina API Base URL": "", - "Jina API Key": "", + "Jina API Base URL": "URL Asas API Jina", + "Jina API Key": "Kunci API Jina", "join our Discord for help.": "sertai Discord kami untuk mendapatkan bantuan.", "JSON": "JSON", "JSON Preview": "Pratonton JSON", - "JSON Spec": "", + "JSON Spec": "Spesifikasi JSON", "July": "Julai", "June": "Jun", - "Jupyter Auth": "", - "Jupyter URL": "", + "Jupyter Auth": "Pengesahan Jupyter", + "Jupyter URL": "URL Jupyter", "JWT Expiration": "Tempoh Tamat JWT", "JWT Token": "Token JWT", - "Kagi Search API Key": "", - "Keep Follow-Up Prompts in Chat": "", - "Keep in Sidebar": "", - "Key": "", - "Key is required": "", + "Kagi Search API Key": "Kunci API Pencarian Kagi", + "Keep Follow-Up Prompts in Chat": "Simpan Gesaran Susulan dalam Sembang", + "Keep in Sidebar": "Simpan dalam Bar Sisi", + "Key": "Kunci", + "Key is required": "Kunci diperlukan", "Keyboard shortcuts": "Pintasan papan kekunci", - "Keyboard Shortcuts": "", + "Keyboard Shortcuts": "Pintasan Papan Kekunci", "Knowledge": "Pengetahuan", - "Knowledge Access": "", - "Knowledge Base": "", - "Knowledge created successfully.": "", - "Knowledge deleted successfully.": "", - "Knowledge Description": "", - "Knowledge exported successfully": "", - "Knowledge Name": "", - "Knowledge Public Sharing": "", - "Knowledge reset successfully.": "", - "Knowledge Sharing": "", - "Knowledge updated successfully": "", - "Kokoro.js (Browser)": "", - "Kokoro.js Dtype": "", - "Label": "", - "Landing Page Mode": "", + "Knowledge Access": "Akses Pengetahuan", + "Knowledge Base": "Pangkalan Pengetahuan", + "Knowledge created successfully.": "Pengetahuan berjaya dibuat.", + "Knowledge deleted successfully.": "Pengetahuan berjaya dipadam.", + "Knowledge Description": "Penerangan Pengetahuan", + "Knowledge exported successfully": "Pengetahuan berjaya dieksport", + "Knowledge Name": "Nama Pengetahuan", + "Knowledge Public Sharing": "Perkongsian Awam Pengetahuan", + "Knowledge reset successfully.": "Pengetahuan telah direset dengan berjaya.", + "Knowledge Sharing": "Perkongsian Pengetahuan", + "Knowledge updated successfully": "Pengetahuan telah dikemas kini dengan berjaya", + "Kokoro.js (Browser)": "Kokoro.js (Penyemak Imbas)", + "Kokoro.js Dtype": "Kokoro.js Dtype", + "Label": "Label", + "Landing Page Mode": "Mod Halaman Pendaratan", "Language": "Bahasa", - "Language Locales": "", - "Last 24 hours": "", - "Last 30 days": "", - "Last 7 days": "", - "Last 90 days": "", + "Language Locales": "Lokalisasi Bahasa", + "Last 24 hours": "24 jam terakhir", + "Last 30 days": "30 hari terakhir", + "Last 7 days": "7 hari lepas", + "Last 90 days": "90 hari lepas", "Last Active": "Dilihat aktif terakhir pada", "Last Modified": "Kemaskini terakhir pada", - "Last reply": "", - "LDAP": "", - "LDAP server updated": "", - "Leaderboard": "", - "Learn more": "", - "Learn More": "", - "Learn more about Open Terminal": "", - "Learn more about OpenAPI tool servers.": "", - "Learn more about Voxtral transcription.": "", - "Leave a public review for {{modelName}}": "", - "Leave empty for no compression": "", - "Leave empty for unlimited": "", - "Leave empty to include all models from \"{{url}}\" endpoint": "", - "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "", - "Leave empty to include all models from \"{{url}}/models\" endpoint": "", - "Leave empty to include all models or select specific models": "", - "Leave empty to use first admin user": "", - "Leave empty to use the default config, or enter a valid json (see https://yandex.cloud/en/docs/search-api/api-ref/WebSearch/search#yandex.cloud.searchapi.v2.WebSearchRequest)": "", - "Leave empty to use the default model (voxtral-mini-latest).": "", - "Leave empty to use the default prompt, or enter a custom prompt": "", - "Leave model field empty to use the default model.": "", - "Legacy": "", - "lexical": "", - "License": "", - "Lift List": "", + "Last reply": "Balasan terakhir", + "LDAP": "LDAP", + "LDAP server updated": "Pelayan LDAP dikemas kini", + "Leaderboard": "Papan Kedudukan", + "Learn more": "Ketahui lebih lanjut", + "Learn More": "Ketahui Lebih Lanjut", + "Learn more about Open Terminal": "Ketahui lebih lanjut tentang Terminal Terbuka", + "Learn more about OpenAPI tool servers.": "Ketahui lebih lanjut tentang pelayan alat OpenAPI.", + "Learn more about Voxtral transcription.": "Ketahui lebih lanjut tentang transkripsi Voxtral.", + "Leave a public review for {{modelName}}": "Tinggalkan ulasan awam untuk {{modelName}}", + "Leave empty for no compression": "Biarkan kosong untuk tiada pemampatan", + "Leave empty for unlimited": "Biarkan kosong untuk tanpa had", + "Leave empty to include all models from \"{{url}}\" endpoint": "Biarkan kosong untuk memasukkan semua model dari endpoint \"{{url}}\"", + "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "Biarkan kosong untuk memasukkan semua model dari endpoint \"{{url}}/api/tags\"", + "Leave empty to include all models from \"{{url}}/models\" endpoint": "Biarkan kosong untuk memasukkan semua model dari endpoint \"{{url}}/models\"", + "Leave empty to include all models or select specific models": "Biarkan kosong untuk memasukkan semua model atau pilih model tertentu", + "Leave empty to use first admin user": "Biarkan kosong untuk menggunakan pengguna admin pertama", + "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)": "Biarkan kosong untuk menggunakan konfigurasi lalai, atau masukkan json yang sah (lihat 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).": "Biarkan kosong untuk menggunakan model lalai (voxtral-mini-latest).", + "Leave empty to use the default prompt, or enter a custom prompt": "Biarkan kosong untuk menggunakan prompt lalai, atau masukkan prompt tersuai", + "Leave model field empty to use the default model.": "Biarkan medan model kosong untuk menggunakan model lalai.", + "Legacy": "Warisan", + "lexical": "leksikal", + "License": "Lesen", + "Lift List": "Senarai Angkat", "Light": "Cerah", - "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "", - "Limits the number of concurrent embedding requests. Set to 0 for unlimited.": "", - "List": "", + "Limit concurrent search queries. 0 = unlimited (default). Set to 1 for sequential execution (recommended for APIs with strict rate limits like Brave free tier).": "Hadkan pertanyaan carian serentak. 0 = tanpa had (lalai). Tetapkan kepada 1 untuk pelaksanaan berurutan (disyorkan untuk API dengan had kadar ketat seperti peringkat percuma Brave).", + "Limits the number of concurrent embedding requests. Set to 0 for unlimited.": "Mengehadkan jumlah permintaan pembenaman serentak. Tetapkan kepada 0 untuk tanpa had.", + "List": "Senarai", "Listening...": "Mendengar...", - "Live": "", - "Llama.cpp": "", + "Live": "Langsung", + "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "LLM boleh membuat kesilapan. Sahkan maklumat penting", - "Loader": "", - "Loading Kokoro.js...": "", + "Loader": "Pemuat", + "Loading Kokoro.js...": "Memuatkan Kokoro.js...", "Loading...": "Memuatkan...", - "local": "", - "Local": "", - "Local Task Model": "", - "Location access not allowed": "", - "Lost": "", - "Low": "", + "local": "tempatan", + "Local": "Tempatan", + "Local Task Model": "Model Tugas Tempatan", + "Location access not allowed": "Akses lokasi tidak dibenarkan", + "Lost": "Hilang", + "Low": "Rendah", "LTR": "LTR", "Made by Open WebUI Community": "Dicipta oleh Komuniti OpenWebUI", - "Make password visible in the user interface": "", - "Make sure to export a workflow.json file as API format from ComfyUI.": "", - "Male": "", + "Make password visible in the user interface": "Buat kata laluan kelihatan dalam antara muka pengguna", + "Make sure to export a workflow.json file as API format from ComfyUI.": "Pastikan untuk mengeksport fail workflow.json sebagai format API daripada ComfyUI.", + "Male": "Lelaki", "Manage": "Urus", - "Manage Connections": "", - "Manage Direct Connections": "", - "Manage Files": "", - "Manage Models": "", - "Manage Ollama": "", - "Manage Ollama API Connections": "", - "Manage OpenAI API Connections": "", + "Manage Connections": "Urus Sambungan", + "Manage Direct Connections": "Urus Sambungan Langsung", + "Manage Files": "Urus Fail", + "Manage Models": "Urus Model", + "Manage Ollama": "Urus Ollama", + "Manage Ollama API Connections": "Urus Sambungan API Ollama", + "Manage OpenAI API Connections": "Urus Sambungan API OpenAI", "Manage Pipelines": "Urus 'Pipelines'", - "Manage Tool Servers": "", - "Manage your account information.": "", + "Manage Tool Servers": "Kelola Pelayan Alat", + "Manage your account information.": "Kelola maklumat akaun anda.", "March": "Mac", - "Markdown": "", - "Markdown Header Text Splitter": "", - "Max Speakers": "", - "Max Upload Count": "", - "Max Upload Size": "", - "Maximum number of files allowed per folder.": "", - "Maximum number of files per folder is {{max}}.": "", + "Markdown": "Markdown", + "Markdown Header Text Splitter": "Pemisah Teks Tajuk Markdown", + "Max Speakers": "Pembicara Maksimum", + "Max Upload Count": "Bilangan Muat Naik Maksimum", + "Max Upload Size": "Saiz Muat Naik Maksimum", + "Maximum number of files allowed per folder.": "Bilangan maksimum fail yang dibenarkan setiap folder.", + "Maximum number of files per folder is {{max}}.": "Bilangan maksimum fail setiap folder ialah {{max}}.", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksimum 3 model boleh dimuat turun serentak. Sila cuba sebentar lagi.", "May": "Mei", - "MBR": "", - "MCP": "", - "MCP support is experimental and its specification changes often, which can lead to incompatibilities. OpenAPI specification support is directly maintained by the Open WebUI team, making it the more reliable option for compatibility.": "", - "Medium": "", - "Member removed successfully": "", - "members": "", - "Members": "", - "Members added successfully": "", - "Memories": "", + "MBR": "MBR", + "MCP": "MCP", + "MCP support is experimental and its specification changes often, which can lead to incompatibilities. OpenAPI specification support is directly maintained by the Open WebUI team, making it the more reliable option for compatibility.": "Sokongan MCP adalah eksperimental dan spesifikasinya kerap berubah, yang boleh menyebabkan ketidakserasian. Sokongan spesifikasi OpenAPI dikekalkan secara langsung oleh pasukan Open WebUI, menjadikannya pilihan yang lebih boleh dipercayai untuk keserasian.", + "Medium": "Sederhana", + "Member removed successfully": "Ahli telah dikeluarkan dengan berjaya", + "members": "ahli", + "Members": "Ahli", + "Members added successfully": "Ahli telah ditambah dengan berjaya", + "Memories": "Ingatan", "Memories accessible by LLMs will be shown here.": "Memori yang boleh diakses oleh LLM akan ditunjukkan di sini.", "Memory": "Memori", "Memory added successfully": "Memori berjaya ditambah", "Memory cleared successfully": "Memori berjaya dikosongkan", "Memory deleted successfully": "Memori berjaya dihapuskan", "Memory updated successfully": "Memori berjaya dikemaskini", - "Merge Responses": "", + "Merge Responses": "Gabungkan Respons", "Merged Response": "Respons Digabungkan", - "Message": "", - "Message counts and response timestamps": "", - "Message counts are based on assistant responses.": "", - "Message rating should be enabled to use this feature": "", - "messages": "", - "Messages": "", + "Message": "Mesej", + "Message counts and response timestamps": "Kiraan mesej dan cap masa respons", + "Message counts are based on assistant responses.": "Kiraan mesej adalah berdasarkan respons pembantu.", + "Message rating should be enabled to use this feature": "Penilaian mesej mesti didayakan untuk menggunakan ciri ini", + "messages": "mesej", + "Messages": "Mesej", "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Mesej yang anda hantar selepas membuat pautan anda tidak akan dikongsi. Pengguna dengan URL akan dapat melihat perbualan yang dikongsi.", - "Microsoft OneDrive": "", - "Microsoft OneDrive (personal)": "", - "Microsoft OneDrive (work/school)": "", - "MinerU": "", - "MinerU API Key required for Cloud API mode.": "", - "Mistral OCR": "", - "Mistral OCR API Key required.": "", - "MistralAI": "", - "Model": "", + "Microsoft OneDrive": "Microsoft OneDrive", + "Microsoft OneDrive (personal)": "Microsoft OneDrive (peribadi)", + "Microsoft OneDrive (work/school)": "Microsoft OneDrive (kerja/sekolah)", + "MinerU": "MinerU", + "MinerU API Key required for Cloud API mode.": "Kunci API MinerU diperlukan untuk mod Cloud API.", + "Mistral OCR": "Mistral OCR", + "Mistral OCR API Key required.": "Kunci API Mistral OCR diperlukan.", + "MistralAI": "MistralAI", + "Model": "Model", "Model '{{modelName}}' has been successfully downloaded.": "Model '{{ modelName }}' telah berjaya dimuat turun.", "Model '{{modelTag}}' is already in queue for downloading.": "Model '{{ modelTag }}' sudah dalam baris gilir untuk dimuat turun.", "Model {{modelId}} not found": "Model {{ modelId }} tidak dijumpai", "Model {{modelName}} is not vision capable": "Model {{ modelName }} tidak mempunyai keupayaan penglihatan", "Model {{name}} is now {{status}}": "Model {{name}} kini {{status}}", - "Model {{name}} is now hidden": "", - "Model {{name}} is now visible": "", - "Model accepts file inputs": "", - "Model accepts image inputs": "", - "Model can execute code and perform calculations": "", - "Model can generate images based on text prompts": "", - "Model can search the web for information": "", - "Model Capabilities": "", + "Model {{name}} is now hidden": "Model {{name}} kini tersembunyi", + "Model {{name}} is now visible": "Model {{name}} kini dapat dilihat", + "Model accepts file inputs": "Model menerima input fail", + "Model accepts image inputs": "Model menerima input imej", + "Model can execute code and perform calculations": "Model dapat melaksanakan kod dan melakukan pengiraan", + "Model can generate images based on text prompts": "Model dapat menjana imej berdasarkan gesaran teks", + "Model can search the web for information": "Model boleh mencari web untuk maklumat", + "Model Capabilities": "Keupayaan Model", "Model created successfully!": "Model berjaya dibuat!", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Laluan sistem fail model dikesan. Nama pendek model diperlukan untuk kemas kini, tidak boleh diteruskan.", - "Model Filtering": "", + "Model Filtering": "Penapis Model", "Model ID": "ID Model", - "Model ID is required.": "", - "Model IDs": "", - "Model Name": "", - "Model name already exists, please choose a different one": "", - "Model Name is required.": "", - "Model names and usage frequency": "", - "Model not found": "", + "Model ID is required.": "ID Model diperlukan.", + "Model IDs": "ID Model", + "Model Name": "Nama Model", + "Model name already exists, please choose a different one": "Nama model sudah wujud, sila pilih yang lain", + "Model Name is required.": "Nama Model diperlukan.", + "Model names and usage frequency": "Nama model dan frekuensi penggunaan", + "Model not found": "Model tidak dijumpai", "Model not selected": "Model tidak dipilih", - "Model Parameters": "", + "Model Parameters": "Parameter Model", "Model Params": "Model Params", - "Model Permissions": "", - "Model responses or outputs": "", - "Model unloaded successfully": "", + "Model Permissions": "Kebenaran Model", + "Model responses or outputs": "Respons atau output model", + "Model unloaded successfully": "Model dimuat keluar dengan berjaya", "Model updated successfully": "Model berjaya dikemas kini", - "Model Usage": "", - "Model(s) do not support file upload": "", + "Model Usage": "Penggunaan Model", + "Model(s) do not support file upload": "Model tidak menyokong muat naik fail", "Modelfile Content": "Kandungan Modelfail", "Models": "Model", - "Models Access": "", - "Models configuration saved successfully": "", - "Models imported successfully": "", - "Models Public Sharing": "", - "Models Sharing": "", - "Mojeek": "", - "Mojeek Search API Key": "", + "Models Access": "Akses Model", + "Models configuration saved successfully": "Konfigurasi model disimpan dengan berjaya", + "Models imported successfully": "Model diimport dengan berjaya", + "Models Public Sharing": "Perkongsian Awam Model", + "Models Sharing": "Perkongsian Model", + "Mojeek": "Mojeek", + "Mojeek Search API Key": "Kunci API Pencarian Mojeek", "More": "Lagi", - "More Concise": "", - "More options": "", - "More Options": "", - "Move": "", - "Moved {{name}}": "", - "My Terminal": "", + "More Concise": "Lebih Ringkas", + "More options": "Lebih banyak pilihan", + "More Options": "Pilihan Lanjutan", + "Move": "Pindah", + "Moved {{name}}": "{{name}} telah dipindahkan", + "My Terminal": "Terminal Saya", "Name": "Nama", - "Name and ID are required, please fill them out": "", - "Name your knowledge base": "", - "Native": "", - "New": "", - "New Button": "", + "Name and ID are required, please fill them out": "Nama dan ID diperlukan, sila isi semuanya", + "Name your knowledge base": "Namakan pangkalan pengetahuan anda", + "Native": "Asli", + "New": "Baru", + "New Button": "Butang Baru", "New Chat": "Perbualan Baru", - "New File": "", - "New Folder": "", - "New Function": "", - "New Group": "", - "New Knowledge": "", - "New Model": "", - "New Note": "", + "New File": "Fail Baru", + "New Folder": "Folder Baru", + "New Function": "Fungsi Baru", + "New Group": "Kumpulan Baru", + "New Knowledge": "Pengetahuan Baru", + "New Model": "Model Baru", + "New Note": "Nota Baru", "New Password": "Kata Laluan Baru", - "New Prompt": "", - "New Skill": "", - "New Temporary Chat": "", - "New Terminal": "", - "New Tool": "", - "New Webhook": "", - "new-channel": "", - "Next message": "", - "No access grants. Private to you.": "", - "No activity data": "", - "No authentication": "", - "No chats found": "", - "No chats found for this user.": "", - "No chats found.": "", - "No content": "", - "No content found": "", + "New Prompt": "Prompt Baru", + "New Skill": "Kemahiran Baru", + "New Temporary Chat": "Obrolan Sementara Baru", + "New Terminal": "Terminal Baru", + "New Tool": "Alat Baru", + "New Webhook": "Webhook Baru", + "new-channel": "saluran-baru", + "Next message": "Mesej Seterusnya", + "No access grants. Private to you.": "Tiada geran akses. Peribadi untuk anda.", + "No activity data": "Tiada data aktiviti", + "No authentication": "Tiada pengesahan", + "No chats found": "Tiada sembang ditemui", + "No chats found for this user.": "Tiada sembang ditemui untuk pengguna ini.", + "No chats found.": "Tiada sembang ditemui.", + "No content": "Tiada kandungan", + "No content found": "Tiada kandungan ditemui", "No content to speak": "Tiada kandungan untuk bercakap", - "No conversation to save": "", - "No data": "", - "No data found": "", - "No distance available": "", - "No expiration can pose security risks.": "", - "No feedback found": "", + "No conversation to save": "Tiada perbualan untuk disimpan", + "No data": "Tiada data", + "No data found": "Tiada data ditemui", + "No distance available": "Tiada jarak tersedia", + "No expiration can pose security risks.": "Tiada tamat tempoh boleh menimbulkan risiko keselamatan.", + "No feedback found": "Tiada maklum balas ditemui", "No file selected": "Tiada fail dipilih", - "No files found": "", - "No files in this knowledge base.": "", - "No files yet. Upload files or run Python code to create them.": "", - "No functions found": "", - "No groups found": "", - "No history available": "", - "No HTML, CSS, or JavaScript content found.": "", - "No inference engine with management support found": "", - "No kernel": "", - "No knowledge bases found.": "", - "No knowledge found": "", - "No memories to clear": "", - "No model IDs": "", - "No models available": "", - "No models found": "", - "No models selected": "", - "No Notes": "", - "No notes found": "", - "No one": "", - "No pinned messages": "", - "No prompts found": "", + "No files found": "Tiada fail ditemui", + "No files in this knowledge base.": "Tiada fail dalam pangkalan pengetahuan ini.", + "No files yet. Upload files or run Python code to create them.": "Tiada fail lagi. Muat naik fail atau jalankan kod Python untuk menciptanya.", + "No functions found": "Tiada fungsi ditemui", + "No groups found": "Tiada kumpulan ditemui", + "No history available": "Tiada sejarah tersedia", + "No HTML, CSS, or JavaScript content found.": "Tiada kandungan HTML, CSS, atau JavaScript ditemui.", + "No inference engine with management support found": "Tiada enjin inferens dengan sokongan pengurusan ditemui", + "No kernel": "Tiada kernel", + "No knowledge bases found.": "Tiada pangkalan pengetahuan ditemui.", + "No knowledge found": "Tiada pengetahuan ditemui", + "No memories to clear": "Tiada ingatan untuk dipadam", + "No model IDs": "Tiada ID model", + "No models available": "Tiada model tersedia", + "No models found": "Tiada model ditemui", + "No models selected": "Tiada model dipilih", + "No Notes": "Tiada Nota", + "No notes found": "Tiada nota ditemui", + "No one": "Tiada sesiapa", + "No pinned messages": "Tiada mesej disematkan", + "No prompts found": "Tiada prompt ditemui", "No results": "Tiada keputusan dijumpai", "No results found": "Tiada keputusan dijumpai", "No search query generated": "Tiada pertanyaan carian dijana", - "No servers detected": "", - "No skills found": "", + "No servers detected": "Tiada pelayan dikesan", + "No skills found": "Tiada kemahiran ditemui", "No source available": "Tiada sumber tersedia", - "No sources found": "", + "No sources found": "Tiada sumber ditemui", "No suggestion prompts": "Tiada prompt cadangan", - "No Terminal connection configured.": "", - "No terminal connections configured.": "", - "No tool server connections configured.": "", - "No tools found": "", - "No users were found.": "", - "No valves": "", + "No Terminal connection configured.": "Tiada sambungan Terminal dikonfigurasi.", + "No terminal connections configured.": "Tiada sambungan terminal dikonfigurasi.", + "No tool server connections configured.": "Tiada sambungan pelayan alat dikonfigurasi.", + "No tools found": "Tiada alat ditemui", + "No users were found.": "Tiada pengguna ditemui.", + "No valves": "Tiada injap", "No valves to update": "Tiada 'valve' untuk dikemas kini", - "No webhooks yet": "", - "Node Ids": "", + "No webhooks yet": "Tiada webhook lagi", + "Node Ids": "Id Nod", "None": "Tiada", "Not factually correct": "Tidak tepat secara fakta", - "Not helpful": "", - "Not Registered": "", - "Note": "", - "Note deleted successfully": "", + "Not helpful": "Tidak berguna", + "Not Registered": "Tidak Didaftar", + "Note": "Nota", + "Note deleted successfully": "Nota telah dipadamkan dengan berjaya", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Jika anda menetapkan skor minimum, carian hanya akan mengembalikan dokumen dengan skor lebih besar daripada atau sama dengan skor minimum.", - "Notes": "", - "Notes Public Sharing": "", - "Notes Sharing": "", - "Notification Sound": "", - "Notification Webhook": "", + "Notes": "Nota-nota", + "Notes Public Sharing": "Perkongsian Awam Nota", + "Notes Sharing": "Perkongsian Nota", + "Notification Sound": "Bunyi Pemberitahuan", + "Notification Webhook": "Webhook Pemberitahuan", "Notifications": "Pemberitahuan", "November": "November", - "OAuth": "", - "OAuth 2.1": "", + "OAuth": "OAuth", + "OAuth 2.1": "OAuth 2.1", "OAuth ID": "ID OAuth", "October": "Oktober", "Off": "Mati", @@ -1367,777 +1367,777 @@ "OLED Dark": "OLED Gelap", "Ollama": "Ollama", "Ollama API": "API Ollama", - "Ollama API settings updated": "", - "Ollama Cloud API Key": "", + "Ollama API settings updated": "Tetapan API Ollama dikemas kini", + "Ollama Cloud API Key": "Kunci API Ollama Cloud", "Ollama Version": "Versi Ollama", "On": "Hidup", - "OneDrive": "", - "Only active when \"Paste Large Text as File\" setting is toggled on.": "", - "Only active when the chat input is in focus and an LLM is generating a response.": "", - "Only active when the chat input is in focus.": "", - "Only alphanumeric characters and hyphens are allowed": "", + "OneDrive": "OneDrive", + "Only active when \"Paste Large Text as File\" setting is toggled on.": "Hanya aktif apabila tetapan \"Tampal Teks Besar sebagai Fail\" dihidupkan.", + "Only active when the chat input is in focus and an LLM is generating a response.": "Hanya aktif apabila input sembang berada dalam fokus dan LLM sedang menjana respons.", + "Only active when the chat input is in focus.": "Hanya aktif apabila input sembang berada dalam fokus.", + "Only alphanumeric characters and hyphens are allowed": "Hanya aksara alfanumerik dan tanda hubung dibenarkan", "Only alphanumeric characters and hyphens are allowed in the command string.": "Hanya aksara alfanumerik dan sempang dibenarkan dalam rentetan arahan.", - "Only can be triggered when the chat input is in focus.": "", - "Only collections can be edited, create a new knowledge base to edit/add documents.": "", - "Only invited users can access": "", - "Only markdown files are allowed": "", - "Only select users and groups with permission can access": "", - "Only sync new/updated chats": "", + "Only can be triggered when the chat input is in focus.": "Hanya boleh dicetuskan apabila input sembang berada dalam fokus.", + "Only collections can be edited, create a new knowledge base to edit/add documents.": "Hanya koleksi yang boleh disunting, buat pangkalan pengetahuan baru untuk menyunting/menambah dokumen.", + "Only invited users can access": "Hanya pengguna yang dijemput boleh mengakses", + "Only markdown files are allowed": "Hanya fail markdown dibenarkan", + "Only select users and groups with permission can access": "Hanya pengguna dan kumpulan terpilih dengan kebenaran boleh mengakses", + "Only sync new/updated chats": "Hanya segerak sembang baharu/terkini", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Maaf, didapati URL tidak sah. Sila semak semula dan cuba lagi.", - "Oops! There are files still uploading. Please wait for the upload to complete.": "", - "Oops! There was an error in the previous response.": "", + "Oops! There are files still uploading. Please wait for the upload to complete.": "Aduh! Masih ada fail sedang dimuat naik. Sila tunggu sehingga muatan selesai.", + "Oops! There was an error in the previous response.": "Oops! Ada ralat dalam respons sebelumnya.", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Maaf, Anda menggunakan kaedah yang tidak disokong (bahagian 'frontend' sahaja). Sila sediakan WebUI dari 'backend'.", - "Open file": "", - "Open in full screen": "", - "Open link": "", - "Open modal to configure connection": "", - "Open Modal To Manage Floating Quick Actions": "", - "Open Modal To Manage Image Compression": "", - "Open Model Selector": "", - "Open Settings": "", - "Open Sidebar": "", - "Open Terminal": "", - "Open User Profile Menu": "", - "Open WebUI can use tools provided by any OpenAPI server.": "", - "Open WebUI uses faster-whisper internally.": "", - "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "", - "Open WebUI version": "", + "Open file": "Buka fail", + "Open in full screen": "Buka dalam skrin penuh", + "Open link": "Buka pautan", + "Open modal to configure connection": "Buka modal untuk mengkonfigurasi sambungan", + "Open Modal To Manage Floating Quick Actions": "Buka Modal Untuk Menguruskan Tindakan Pantas Terapung", + "Open Modal To Manage Image Compression": "Buka Modal Untuk Menguruskan Pemampatan Imej", + "Open Model Selector": "Buka Pemilih Model", + "Open Settings": "Buka Tetapan", + "Open Sidebar": "Buka Bar Sisi", + "Open Terminal": "Buka Terminal", + "Open User Profile Menu": "Buka Menu Profil Pengguna", + "Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI boleh menggunakan alat yang disediakan oleh mana-mana pelayan OpenAPI.", + "Open WebUI uses faster-whisper internally.": "Open WebUI menggunakan faster-whisper secara dalaman.", + "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI menggunakan SpeechT5 dan pembenaman pembicara CMU Arctic.", + "Open WebUI version": "Versi Open WebUI", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) adalah lebih rendah daripada versi yang diperlukan iaitu (v{{REQUIRED_VERSION}})", "OpenAI": "OpenAI", "OpenAI API": "API OpenAI", - "OpenAI API Base URL": "", - "OpenAI API Key": "", + "OpenAI API Base URL": "URL Asas API OpenAI", + "OpenAI API Key": "Kunci API OpenAI", "OpenAI API Key is required.": "Kekunci API OpenAI diperlukan", - "OpenAI API settings updated": "", - "OpenAI API Version": "", + "OpenAI API settings updated": "Tetapan API OpenAI telah dikemas kini", + "OpenAI API Version": "Versi API OpenAI", "OpenAI URL/Key required.": "URL/Kekunci OpenAI diperlukan", - "OpenAPI": "", - "OpenAPI Spec": "", - "openapi.json URL or Path": "", - "optional": "", - "Optional": "", + "OpenAPI": "OpenAPI", + "OpenAPI Spec": "Spesifikasi OpenAPI", + "openapi.json URL or Path": "URL atau Laluan openapi.json", + "optional": "pilihan", + "Optional": "Pilihan", "or": "atau", - "Ordered List": "", + "Ordered List": "Senarai Tertib", "Other": "Lain-lain", - "Output": "", - "OUTPUT": "", - "Output format": "", - "Output Format": "", - "Overview": "", - "page": "", - "Page": "", - "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "", - "Paginate": "", - "Parameters": "", - "Parent message not found": "", - "Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.": "", + "Output": "Output", + "OUTPUT": "OUTPUT", + "Output format": "Format output", + "Output Format": "Format Output", + "Overview": "Gambaran Keseluruhan", + "page": "halaman", + "Page": "Halaman", + "Page mode creates one document per page. Single mode combines all pages into one document for better chunking across page boundaries.": "Mode Halaman membuat satu dokumen per halaman. Mode Tunggal menggabungkan semua halaman ke dalam satu dokumen untuk chunking yang lebih baik merentas sempadan halaman.", + "Paginate": "Pagina", + "Parameters": "Parameter", + "Parent message not found": "Mesej induk tidak ditemui", + "Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.": "Sertai papan kedudukan komuniti dan penilaian! Menyegerakkan statistik penggunaan yang diagregat membantu mendorong penyelidikan dan penambahbaikan kepada Open WebUI. Privasi anda adalah yang terpenting: kandungan mesej tidak pernah dikongsi.", "Password": "Kata Laluan", - "Passwords do not match.": "", - "Paste Large Text as File": "", + "Passwords do not match.": "Kata laluan tidak sepadan.", + "Paste Large Text as File": "Tampal Teks Besar sebagai Fail", "PDF document (.pdf)": "Dokumen PDF (.pdf)", "PDF Extract Images (OCR)": "Imej Ekstrak PDF (OCR)", - "PDF Loader Mode": "", + "PDF Loader Mode": "Mode Pemuat PDF", "pending": "tertunda", - "Pending": "", - "Pending User Overlay Content": "", - "Pending User Overlay Title": "", + "Pending": "Tertunda", + "Pending User Overlay Content": "Kandungan Lapisan Pengguna Tertunda", + "Pending User Overlay Title": "Tajuk Lapisan Pengguna Tertunda", "Permission denied when accessing media devices": "Tidak mendapat kebenaran apabila cuba mengakses peranti media", "Permission denied when accessing microphone": "Tidak mendapat kebenaran apabila cuba mengakses mikrofon", "Permission denied when accessing microphone: {{error}}": "Tidak mendapat kebenaran apabila cuba mengakses mikrofon: {{error}}", - "Permissions": "", - "Perplexity API Key": "", - "Perplexity Model": "", - "Perplexity Search API URL": "", - "Perplexity Search Context Usage": "", + "Permissions": "Kebenaran", + "Perplexity API Key": "Kunci API Perplexity", + "Perplexity Model": "Model Perplexity", + "Perplexity Search API URL": "URL API Pencarian Perplexity", + "Perplexity Search Context Usage": "Penggunaan Konteks Pencarian Perplexity", "Personalization": "Personalisasi", "Pin": "Pin", "Pinned": "Disemat", - "Pinned Messages": "", - "Pinned Models": "", - "Pioneer insights": "", - "Pipe": "", + "Pinned Messages": "Mesej Disematkan", + "Pinned Models": "Model Tersapu", + "Pioneer insights": "Panduan Pelopor", + "Pipe": "Saluran", "Pipeline deleted successfully": "'Pipeline' berjaya dipadam", "Pipeline downloaded successfully": "'Pipeline' berjaya dimuat turun", - "Pipelines": "", + "Pipelines": "Saluran Paip", "Pipelines are a plugin system with arbitrary code execution —": "Pipelines ialah sistem pemalam dengan pelaksanaan kod sewenang‑wenangnya —", "Pipelines Not Detected": "'Pipeline' tidak ditemui", "Pipelines Valves": "'Pipeline Valves'", - "Plain text (.md)": "", + "Plain text (.md)": "Teks Biasa (.md)", "Plain text (.txt)": "Teks biasa (.txt)", "Playground": "Taman Permainan", - "Playwright Timeout (ms)": "", - "Playwright WebSocket URL": "", + "Playwright Timeout (ms)": "Masa Tamat Playwright (ms)", + "Playwright WebSocket URL": "URL WebSocket Playwright", "Please carefully review the following warnings:": "Sila semak dengan teliti amaran berikut:", - "Please do not close the settings page while loading the model.": "", - "Please enter a message or attach a file.": "", - "Please enter a prompt": "", - "Please enter a valid ID": "", - "Please enter a valid JSON spec": "", - "Please enter a valid path": "", - "Please enter a valid URL": "", - "Please enter a valid URL.": "", - "Please fill in all fields.": "", - "Please register the OAuth client": "", - "Please save the connection to persist the OAuth client information and do not change the ID": "", - "Please select a model first.": "", - "Please select a model.": "", - "Please select a reason": "", - "Please select a valid JSON file": "", - "Please select at least one user for Direct Message channel.": "", - "Please wait until all files are uploaded.": "", - "Port": "", - "Ports": "", + "Please do not close the settings page while loading the model.": "Sila jangan tutup halaman tetapan semasa memuat model.", + "Please enter a message or attach a file.": "Sila masukkan mesej atau lampirkan fail.", + "Please enter a prompt": "Sila masukkan arahan", + "Please enter a valid ID": "Sila masukkan ID yang sah", + "Please enter a valid JSON spec": "Sila masukkan spesifikasi JSON yang sah", + "Please enter a valid path": "Sila masukkan laluan yang sah", + "Please enter a valid URL": "Sila masukkan URL yang sah", + "Please enter a valid URL.": "Sila masukkan URL yang sah.", + "Please fill in all fields.": "Sila isi semua medan.", + "Please register the OAuth client": "Sila daftarkan klien OAuth", + "Please save the connection to persist the OAuth client information and do not change the ID": "Sila simpan sambungan untuk mengekalkan maklumat klien OAuth dan jangan ubah ID", + "Please select a model first.": "Sila pilih model terlebih dahulu.", + "Please select a model.": "Sila pilih model.", + "Please select a reason": "Sila pilih satu sebab", + "Please select a valid JSON file": "Sila pilih fail JSON yang sah", + "Please select at least one user for Direct Message channel.": "Sila pilih sekurang-kurangnya satu pengguna untuk saluran Direct Message.", + "Please wait until all files are uploaded.": "Sila tunggu sehingga semua fail dimuat naik.", + "Port": "Port", + "Ports": "Port", "Positive attitude": "Sikap positif", - "Prefer not to say": "", - "Prefix ID": "", - "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "", - "Prevent File Creation": "", - "Preview": "", + "Prefer not to say": "Lebih suka tidak menjawab", + "Prefix ID": "ID Awalan", + "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "ID Awalan digunakan untuk mengelakkan konflik dengan sambungan lain dengan menambah awalan pada ID model - biarkan kosong untuk melumpuhkan", + "Prevent File Creation": "Cegah Penciptaan Fail", + "Preview": "Pratonton", "Previous 30 days": "30 hari sebelumnya", "Previous 7 days": "7 hari sebelumnya", - "Previous message": "", - "Private": "", - "Private conversation between selected users": "", - "Production version updated": "", + "Previous message": "Mesej sebelumnya", + "Private": "Peribadi", + "Private conversation between selected users": "Perbualan peribadi antara pengguna terpilih", + "Production version updated": "Versi pengeluaran dikemas kini", "Profile": "Profil", - "Prompt": "", - "Prompt Autocompletion": "", - "Prompt Content": "Kandungan Gesaan", - "Prompt created successfully": "", - "Prompt Name": "", - "Prompt Suggestions": "", - "Prompt updated successfully": "", - "Prompts": "Gesaan", - "Prompts Access": "", - "Prompts Public Sharing": "", - "Prompts Sharing": "", - "Provider Type": "", - "Public": "", + "Prompt": "Arahan", + "Prompt Autocompletion": "Auto lengkapkan Arahan", + "Prompt Content": "Kandungan arahan", + "Prompt created successfully": "Arahan berjaya dibuat", + "Prompt Name": "Nama Arahan", + "Prompt Suggestions": "Cadangan Arahan", + "Prompt updated successfully": "Arahan dikemas kini dengan berjaya", + "Prompts": "arahan", + "Prompts Access": "Akses Arahan", + "Prompts Public Sharing": "Arahan Perkongsian Awam", + "Prompts Sharing": "Perkongsian Arahan", + "Provider Type": "Jenis Penyedia", + "Public": "Awam", "Pull \"{{searchValue}}\" from Ollama.com": "Tarik \"{{ searchValue }}\" daripada Ollama.com", "Pull a model from Ollama.com": "Tarik model dari Ollama.com", - "Pull Model": "", - "Pyodide file browser": "", - "Query Generation Prompt": "", - "Querying": "", - "Quick Actions": "", + "Pull Model": "Model Tarik", + "Pyodide file browser": "Pelayar fail Pyodide", + "Query Generation Prompt": "Prompt Penjanaan Pertanyaan", + "Querying": "Sedang Membuat Pertanyaan", + "Quick Actions": "Tindakan Pantas", "RAG Template": "Templat RAG", - "Rate {{rating}} out of 10": "", - "Rating": "", - "Re-rank models by topic similarity": "", - "Read": "", + "Rate {{rating}} out of 10": "Kadar {{rating}} daripada 10", + "Rating": "Penilaian", + "Re-rank models by topic similarity": "Susun semula model mengikut persamaan topik", + "Read": "Baca", "Read Aloud": "Baca dengan lantang", - "Read more →": "", - "Read Only": "", - "Read-Only Access": "", - "Reason": "", - "Reasoning Effort": "", - "Reasoning Tags": "", - "Record": "", + "Read more →": "Baca lanjut →", + "Read Only": "Baca Sahaja", + "Read-Only Access": "Akses Baca Sahaja", + "Reason": "Sebab", + "Reasoning Effort": "Usaha Penaakulan", + "Reasoning Tags": "Tag Penaakulan", + "Record": "Rakaman", "Record voice": "Rakam suara", "Redirecting you to Open WebUI Community": "Membawa anda ke Komuniti 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.": "", + "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.": "Mengurangkan kebarangkalian menjana jawapan tanpa makna. Nilai yang lebih tinggi (cth. 100) akan memberikan jawapan yang lebih pelbagai, manakala nilai yang lebih rendah (cth. 10) akan lebih konservatif.", "Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Rujuk diri anda sebagai \"User\" (cth, \"Pengguna sedang belajar bahasa Sepanyol\")", - "Reference Chats": "", - "Refresh": "", + "Reference Chats": "Sembang Rujukan", + "Refresh": "Segarkan", "Refused when it shouldn't have": "Menolak dimana ia tidak sepatutnya", "Regenerate": "Jana semula", - "Regenerate Menu": "", - "Regenerate Response": "", - "Register Again": "", - "Register Client": "", - "Registered": "", - "Registration failed": "", - "Registration successful": "", - "Reindex": "", - "Reindex Knowledge Base Vectors": "", + "Regenerate Menu": "Menu Jana Semula", + "Regenerate Response": "Respons Jana Semula", + "Register Again": "Daftar Semula", + "Register Client": "Daftar Klien", + "Registered": "Didaftarkan", + "Registration failed": "Pendaftaran gagal", + "Registration successful": "Pendaftaran berjaya", + "Reindex": "Indeks semula", + "Reindex Knowledge Base Vectors": "Indeks semula Vektor Pangkalan Pengetahuan", "Release Notes": "Nota Keluaran", - "Releases": "", - "Relevance": "", - "Relevance Threshold": "", - "Remember Dismissal": "", + "Releases": "Keluaran", + "Relevance": "Perkaitan", + "Relevance Threshold": "Ambang Perkaitan", + "Remember Dismissal": "Ingat Penutupan", "Remove": "Hapuskan", - "Remove {{MODELID}} from list.": "", - "Remove action": "", - "Remove file": "", - "Remove File": "", - "Remove from favorites": "", - "Remove image": "", + "Remove {{MODELID}} from list.": "Keluarkan {{MODELID}} daripada senarai.", + "Remove action": "Keluarkan tindakan", + "Remove file": "Buang fail", + "Remove File": "Buang Fail", + "Remove from favorites": "Buang daripada kegemaran", + "Remove image": "Buang imej", "Remove Model": "Hapuskan Model", "Rename": "Namakan Semula", - "Render Markdown in Previews": "", - "Reorder Models": "", - "Reply": "", - "Reply in Thread": "", - "Reply to thread...": "", - "Replying to {{NAME}}": "", - "required": "", - "Reranking Engine": "", + "Render Markdown in Previews": "Render Markdown dalam Pratonton", + "Reorder Models": "Susun Semula Model", + "Reply": "Balas", + "Reply in Thread": "Balas dalam Benang", + "Reply to thread...": "Balas ke benang...", + "Replying to {{NAME}}": "Membalas kepada {{NAME}}", + "required": "diperlukan", + "Reranking Engine": "Enjin Penyusunan Semula", "Reranking Model": "Model 'Reranking'", "Reset": "Tetapkan Semula", - "Reset All Models": "", + "Reset All Models": "Tetapkan Semula Semua Model", "Reset Image": "Tetapkan Semula Imej", "Reset Upload Directory": "Tetapkan Semula Direktori Muat Naik", - "Reset Vector Storage/Knowledge": "", - "Reset view": "", - "Response": "", + "Reset Vector Storage/Knowledge": "Tetapkan Semula Storan Vektor/Pengetahuan", + "Reset view": "Tetapkan Semula Paparan", + "Response": "Respons", "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Pemberitahuan respons tidak boleh diaktifkan kerana kebenaran tapak web tidak diberi. Sila lawati tetapan pelayar web anda untuk memberikan akses yang diperlukan.", - "Response splitting": "", - "Response Watermark": "", - "Responses": "", - "Restart": "", - "Result": "", + "Response splitting": "Pemisahan Respons", + "Response Watermark": "Tera Air Respons", + "Responses": "Respons", + "Restart": "Mula Semula", + "Result": "Hasil", "RESULT": "KEPUTUSAN", - "Retrieval": "", - "Retrieval Query Generation": "", - "Retrieved {{count}} sources": "", - "Retrieved {{count}} sources_other": "", - "Retrieved 1 source": "", - "Rich Text Input for Chat": "", + "Retrieval": "Pengambilan", + "Retrieval Query Generation": "Penjanaan Pertanyaan Pengambilan", + "Retrieved {{count}} sources": "Mengambil {{count}} sumber", + "Retrieved {{count}} sources_other": "Mengambil {{count}} sumber", + "Retrieved 1 source": "Mengambil 1 sumber", + "Rich Text Input for Chat": "Input Teks Kaya untuk Sembang", "Role": "Peranan", "RTL": "RTL", "Run": "Jalankan", - "Run All": "", + "Run All": "Jalankan Semua", "Running": "Sedang dijalankan", "Running...": "Sedang dijalankan...", - "Runs embedding tasks concurrently to speed up processing. Turn off if rate limits become an issue.": "", + "Runs embedding tasks concurrently to speed up processing. Turn off if rate limits become an issue.": "Menjalankan tugas penyisipan secara serentak untuk mempercepatkan pemprosesan. Matikan jika had kadar menjadi isu.", "Save": "Simpan", "Save & Create": "Simpan & Cipta", "Save & Update": "Simpan & Kemas Kini", - "Save As Copy": "", - "Save Chat": "", - "Saved": "", + "Save As Copy": "Simpan Sebagai Salinan", + "Save Chat": "Simpan Obrolan", + "Saved": "Tersimpan", "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": "Penyimpanan log perbualan terus ke storan pelayan web anda tidak lagi disokong. Sila luangkan sedikit masa untuk memuat turun dan memadam log perbualan anda dengan mengklik butang di bawah. Jangan risau, anda boleh mengimport semula log perbualan anda dengan mudah melalui 'backend'", - "Scroll On Branch Change": "", + "Scroll On Branch Change": "Skrol Semasa Pertukaran Cabang", "Search": "Carian", "Search a model": "Cari Model", - "Search all emojis": "", - "Search and manage user memories": "", - "Search and view user chat history": "", - "Search Base": "", - "Search channels and channel messages": "", + "Search all emojis": "Cari semua emoji", + "Search and manage user memories": "Cari dan urus ingatan pengguna", + "Search and view user chat history": "Cari dan lihat sejarah obrolan pengguna", + "Search Base": "Cari Pangkalan", + "Search channels and channel messages": "Cari saluran dan mesej saluran", "Search Chats": "Cari Perbualan", - "Search Collection": "", - "Search Files": "", - "Search Filters": "", - "search for archived chats": "", - "search for folders": "", - "search for pinned chats": "", - "search for shared chats": "", - "search for tags": "", + "Search Collection": "Cari Koleksi", + "Search Files": "Cari Fail", + "Search Filters": "Penapis Carian", + "search for archived chats": "cari untuk sembang yang disarkibkan", + "search for folders": "cari untuk folder", + "search for pinned chats": "cari untuk sembang yang disematkan", + "search for shared chats": "cari untuk sembang yang dikongsi", + "search for tags": "cari untuk teg", "Search Functions": "Carian Fungsi", - "Search Groups": "", - "Search In Models": "", - "Search Knowledge": "", + "Search Groups": "Cari Kumpulan", + "Search In Models": "Cari Dalam Model", + "Search Knowledge": "Cari Pengetahuan", "Search Models": "Carian Model", - "Search Notes": "", - "Search options": "", - "Search Prompts": "Carian Gesaan", + "Search Notes": "Cari Nota", + "Search options": "Pilihan carian", + "Search Prompts": "Carian arahan", "Search Result Count": "Kiraan Hasil Carian", - "Search Skills": "", - "Search the internet": "", - "Search the web and fetch URLs": "", + "Search Skills": "Cari Kemahiran", + "Search the internet": "Cari di internet", + "Search the web and fetch URLs": "Cari di web dan ambil URL", "Search Tools": "Alat Carian", - "Search, view, and manage user notes": "", - "SearchApi API Key": "", - "SearchApi Engine": "", - "Searched {{count}} sites": "", - "Searching": "", + "Search, view, and manage user notes": "Cari, lihat, dan urus nota pengguna", + "SearchApi API Key": "Kunci API SearchApi", + "SearchApi Engine": "Enjin SearchApi", + "Searched {{count}} sites": "Telah mencari {{count}} laman", + "Searching": "Sedang mencari", "Searching \"{{searchQuery}}\"": "encari \"{{ searchQuery }}\"", - "Searching Knowledge for \"{{searchQuery}}\"": "", - "Searching the web": "", + "Searching Knowledge for \"{{searchQuery}}\"": "Mencari Pengetahuan untuk \"{{searchQuery}}\"", + "Searching the web": "Mencari di web", "Searxng Query URL": "URL Pertanyaan Searxng", - "Searxng search language (all, en, es, de, fr, etc.)": "", + "Searxng search language (all, en, es, de, fr, etc.)": "Bahasa carian Searxng (semua, en, es, de, fr, dsb.)", "See readme.md for instructions": "Lihat readme.md untuk arahan", "See what's new": "Lihat apa yang terbaru", "Seed": "Benih", - "Select": "", - "Select {{modelName}} model": "", + "Select": "Pilih", + "Select {{modelName}} model": "Pilih model {{modelName}}", "Select a base model": "Pilih model asas", - "Select a base model (e.g. llama3, gpt-4o)": "", - "Select a conversation to preview": "", + "Select a base model (e.g. llama3, gpt-4o)": "Pilih model asas (cth. llama3, gpt-4o)", + "Select a conversation to preview": "Pilih perbualan untuk pratonton", "Select a engine": "Pilih enjin", "Select a function": "Pilih fungsi", - "Select a group": "", - "Select a language": "", - "Select a mode": "", + "Select a group": "Pilih kumpulan", + "Select a language": "Pilih bahasa", + "Select a mode": "Pilih mod", "Select a model": "Pilih model", - "Select a model (optional)": "", + "Select a model (optional)": "Pilih model (pilihan)", "Select a pipeline": "Pilih 'pipeline'", "Select a pipeline url": "Pilih url 'pipeline'", - "Select a reranking model engine": "", - "Select a role": "", - "Select a theme": "", + "Select a reranking model engine": "Pilih enjin model penyusun semula", + "Select a role": "Pilih peranan", + "Select a theme": "Pilih tema", "Select a tool": "Pilih alat", - "Select a voice": "", - "Select an auth method": "", - "Select an embedding model engine": "", - "Select an engine": "", - "Select an Ollama instance": "", - "Select an option": "", - "Select an output format": "", - "Select dtype": "", - "Select Engine": "", - "Select how to split message text for TTS requests": "", - "Select Knowledge": "", - "Select Method": "", + "Select a voice": "Pilih suara", + "Select an auth method": "Pilih kaedah pengesahan", + "Select an embedding model engine": "Pilih enjin model terbenam", + "Select an engine": "Pilih enjin", + "Select an Ollama instance": "Pilih contoh Ollama", + "Select an option": "Pilih pilihan", + "Select an output format": "Pilih format keluaran", + "Select dtype": "Pilih dtype", + "Select Engine": "Pilih Enjin", + "Select how to split message text for TTS requests": "Pilih cara untuk membahagikan teks mesej untuk permintaan TTS", + "Select Knowledge": "Pilih Pengetahuan", + "Select Method": "Pilih Kaedah", "Select only one model to call": "Pilih hanya satu model untuk dipanggil", - "Select view": "", - "Selected model: {{modelName}}": "", + "Select view": "Pilih paparan", + "Selected model: {{modelName}}": "Model terpilih: {{modelName}}", "Selected model(s) do not support image inputs": "Model dipilih tidak menyokong input imej", - "Selected Models": "", - "semantic": "", + "Selected Models": "Model Terpilih", + "semantic": "semantik", "Send": "Hantar", "Send a Message": "Hantar Pesanan", "Send message": "Hantar pesanan", - "Send now": "", - "Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "", + "Send now": "Hantar sekarang", + "Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "Menghantar `stream_options: { include_usage: true }` dalam permintaan. Pembekal yang disokong akan mengembalikan maklumat penggunaan token dalam respons apabila ditetapkan.", "September": "September", - "SerpApi API Key": "", - "SerpApi Engine": "", + "SerpApi API Key": "Kunci API SerpApi", + "SerpApi Engine": "Enjin SerpApi", "Serper API Key": "Kunci API Serper", "Serply API Key": "Kunci API Serply", "Serpstack API Key": "Kunci API Serpstack", "Server connection verified": "Sambungan pelayan disahkan", - "Session": "", + "Session": "Sesi", "Set as default": "Tetapkan sebagai lalai", - "Set as Production": "", - "Set embedding model": "", + "Set as Production": "Tetapkan sebagai Pengeluaran", + "Set embedding model": "Tetapkan model pembenaman", "Set embedding model (e.g. {{model}})": "Tetapkan model benamkan (cth {{model}})", "Set reranking model (e.g. {{model}})": "Tetapkan model 'reranking' (cth {{model}})", - "Set the default models that are automatically selected for all users when a new chat is created.": "", - "Set the models that are automatically pinned to the sidebar for all users.": "", - "Set the number of layers, which will be off-loaded to GPU. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "", - "Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "", + "Set the default models that are automatically selected for all users when a new chat is created.": "Tetapkan model lalai yang dipilih secara automatik untuk semua pengguna apabila percakapan baharu dibuat.", + "Set the models that are automatically pinned to the sidebar for all users.": "Tetapkan model yang disematkan secara automatik ke bar sisi untuk semua pengguna.", + "Set the number of layers, which will be off-loaded to GPU. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "Tetapkan bilangan lapisan yang akan dimunggahkan ke GPU. Meningkatkan nilai ini dapat meningkatkan prestasi dengan ketara untuk model yang dioptimalkan untuk pecutan GPU tetapi mungkin juga menggunakan lebih banyak kuasa dan sumber GPU.", + "Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Tetapkan bilangan benang pekerja yang digunakan untuk pengiraan. Pilihan ini mengawal berapa banyak benang yang digunakan untuk memproses permintaan masuk secara serentak. Meningkatkan nilai ini dapat meningkatkan prestasi di bawah beban kerja keserenakan tinggi tetapi mungkin juga menggunakan lebih banyak sumber CPU.", "Set Voice": "Tetapan Suara", - "Set whisper model": "", - "Set your status": "", - "Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "", - "Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "", - "Sets how far back for the model to look back to prevent repetition.": "", - "Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "", - "Sets the size of the context window used to generate the next token.": "", - "Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "", - "Setting": "", + "Set whisper model": "Tetapkan model whisper", + "Set your status": "Tetapkan status anda", + "Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "Menetapkan bias rata terhadap token yang telah muncul sekurang-kurangnya sekali. Nilai yang lebih tinggi (cth. 1.5) akan menghukum pengulangan dengan lebih kuat, manakala nilai yang lebih rendah (cth. 0.9) akan lebih belas kasihan. Pada 0, ia dilumpuhkan.", + "Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "Menetapkan bias penskalaan terhadap token untuk menghukum pengulangan, berdasarkan berapa kali ia telah muncul. Nilai yang lebih tinggi (cth. 1.5) akan menghukum pengulangan dengan lebih kuat, manakala nilai yang lebih rendah (cth. 0.9) akan lebih belas kasihan. Pada 0, ia dilumpuhkan.", + "Sets how far back for the model to look back to prevent repetition.": "Menetapkan sejauh mana model perlu melihat ke belakang untuk mencegah pengulangan.", + "Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "Menetapkan benih nombor rawak yang digunakan untuk penjanaan. Menetapkan ini kepada nombor tertentu akan membuat model menjana teks yang sama untuk prompt yang sama.", + "Sets the size of the context window used to generate the next token.": "Menetapkan saiz tetingkap konteks yang digunakan untuk menjana token seterusnya.", + "Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Menetapkan jujukan berhenti yang akan digunakan. Apabila corak ini dijumpai, LLM akan berhenti menjana teks dan kembali. Berbilang corak berhenti boleh ditetapkan dengan menentukan berbilang parameter berhenti yang berasingan dalam modelfile.", + "Setting": "Tetapan", "Settings": "Tetapan", - "Settings Permissions": "", + "Settings Permissions": "Kebenaran Tetapan", "Settings saved successfully!": "Tetapan berjaya disimpan!", "Share": "Kongsi", "Share Chat": "Kongsi Perbualan", - "Share link copied to clipboard.": "", + "Share link copied to clipboard.": "Pautan kongsi telah disalin ke papan klip.", "Share to Open WebUI Community": "Kongsi kepada Komuniti OpenWebUI", - "Share your background and interests": "", - "Shared Chats": "", - "Shared with you": "", - "Sharing Permissions": "", + "Share your background and interests": "Kongsi latar belakang dan minat anda", + "Shared Chats": "Perbualan yang Dikongsi", + "Shared with you": "Dikongsi dengan anda", + "Sharing Permissions": "Kebenaran Berkongsi", "Show": "Tunjukkan", - "Show \"What's New\" modal on login": "", + "Show \"What's New\" modal on login": "Paparkan modal \"Apa yang Baru\" semasa log masuk", "Show Admin Details in Account Pending Overlay": "Tunjukkan Butiran Pentadbir dalam Akaun Menunggu Tindanan", - "Show All": "", - "Show all ({{COUNT}} characters)": "", - "Show Files": "", - "Show Formatting Toolbar": "", - "Show image preview": "", - "Show Model": "", - "Show Shortcuts": "", + "Show All": "Paparkan Semua", + "Show all ({{COUNT}} characters)": "Paparkan semua ({{COUNT}} aksara)", + "Show Files": "Paparkan Fail", + "Show Formatting Toolbar": "Paparkan Bar Alatan Format", + "Show image preview": "Tunjukkan pratonton imej", + "Show Model": "Tunjukkan Model", + "Show Shortcuts": "Tunjukkan Pintasan", "Show your support!": "Tunjukkan sokongan anda!", "Showcased creativity": "eativiti yang dipamerkan", - "Showing all messages (user + assistant) per user.": "", + "Showing all messages (user + assistant) per user.": "Menunjukkan semua mesej (pengguna + pembantu) setiap pengguna.", "Sign in": "Daftar masuk", - "Sign in to {{WEBUI_NAME}}": "", - "Sign in to {{WEBUI_NAME}} with LDAP": "", + "Sign in to {{WEBUI_NAME}}": "Daftar masuk ke {{WEBUI_NAME}}", + "Sign in to {{WEBUI_NAME}} with LDAP": "Daftar masuk ke {{WEBUI_NAME}} dengan LDAP", "Sign Out": "Daftar keluar", "Sign up": "Daftar", - "Sign up to {{WEBUI_NAME}}": "", - "Significantly improves accuracy by using an LLM to enhance tables, forms, inline math, and layout detection. Will increase latency. Defaults to False.": "", - "Signing in to {{WEBUI_NAME}}": "", - "Single": "", - "Sink List": "", - "sk-1234": "", - "Skill created successfully": "", - "Skill deleted successfully": "", - "Skill Description": "", - "Skill ID": "", - "Skill imported successfully": "", - "Skill Instructions": "", - "Skill Name": "", - "Skill updated successfully": "", - "Skills": "", - "Skills Access": "", - "Skills Public Sharing": "", - "Skills Sharing": "", - "Skip Cache": "", - "Skip the cache and re-run the inference. Defaults to False.": "", - "Something went wrong :/": "", - "Sonar": "", - "Sonar Deep Research": "", - "Sonar Pro": "", - "Sonar Reasoning": "", - "Sonar Reasoning Pro": "", - "Sort": "", - "Sort by": "", - "Sougou Search API sID": "", - "Sougou Search API SK": "", + "Sign up to {{WEBUI_NAME}}": "Daftar akaun ke {{WEBUI_NAME}}", + "Significantly improves accuracy by using an LLM to enhance tables, forms, inline math, and layout detection. Will increase latency. Defaults to False.": "Meningkatkan ketepatan secara signifikan dengan menggunakan LLM untuk meningkatkan jadual, borang, matematik sebaris, dan pengesanan susun atur. Akan meningkatkan kependaman. Lalai kepada False.", + "Signing in to {{WEBUI_NAME}}": "Sedang daftar masuk ke {{WEBUI_NAME}}", + "Single": "Tunggal", + "Sink List": "Senarai Sinki", + "sk-1234": "sk-1234", + "Skill created successfully": "Kemahiran berjaya dibuat", + "Skill deleted successfully": "Kemahiran berjaya dihapus", + "Skill Description": "Penerangan Kemahiran", + "Skill ID": "ID Kemahiran", + "Skill imported successfully": "Kemahiran berjaya diimport", + "Skill Instructions": "Arahan Kemahiran", + "Skill Name": "Nama Kemahiran", + "Skill updated successfully": "Kemahiran berjaya dikemas kini", + "Skills": "Kemahiran", + "Skills Access": "Akses Kemahiran", + "Skills Public Sharing": "Perkongsian Awam Kemahiran", + "Skills Sharing": "Perkongsian Kemahiran", + "Skip Cache": "Langkau Cache", + "Skip the cache and re-run the inference. Defaults to False.": "Langkau cache dan jalankan semula inferens. Lalai kepada False.", + "Something went wrong :/": "Ada yang salah :/", + "Sonar": "Sonar", + "Sonar Deep Research": "Penyelidikan Mendalam Sonar", + "Sonar Pro": "Sonar Pro", + "Sonar Reasoning": "Penaakulan Sonar", + "Sonar Reasoning Pro": "Penaakulan Sonar Pro", + "Sort": "Isih", + "Sort by": "Isih mengikut", + "Sougou Search API sID": "ID Sonar API Carian Sougou", + "Sougou Search API SK": "SK Sonar API Carian Sougou", "Source": "Sumber", - "Speech Playback Speed": "", + "Speech Playback Speed": "Kecepatan Pemutaran Suara", "Speech recognition error: {{error}}": "Ralat pengecaman pertuturan: {{error}}", - "Speech-to-Text": "", + "Speech-to-Text": "Pertuturan-ke-Teks", "Speech-to-Text Engine": "Enjin Ucapan-ke-Teks", - "Speech-to-Text Language": "", - "Split documents by markdown headers before applying character/token splitting.": "", - "Start a new conversation": "", + "Speech-to-Text Language": "Bahasa Pertuturan-ke-Teks", + "Split documents by markdown headers before applying character/token splitting.": "Bahagikan dokumen mengikut tajuk markdown sebelum menggunakan pemisahan aksara/token.", + "Start a new conversation": "Mulai perbualan baru", "Start of the channel": "Permulaan saluran", - "Start Tag": "", - "Starting kernel...": "", - "Status": "", - "Status cleared successfully": "", - "Status updated successfully": "", - "Status Updates": "", + "Start Tag": "Tag Permulaan", + "Starting kernel...": "Kernel sedang dimulakan...", + "Status": "Status", + "Status cleared successfully": "Status telah dihapus dengan berjaya", + "Status updated successfully": "Status telah dikemas kini dengan berjaya", + "Status Updates": "Kemas Kini Status", "STDOUT/STDERR": "STDOUT/STDERR", - "Steps": "", - "Stop": "", - "Stop Download": "", - "Stop Generating": "", + "Steps": "Langkah-langkah", + "Stop": "Henti", + "Stop Download": "Hentikan Muat Turun", + "Stop Generating": "Hentikan Penjanaan", "Stop Sequence": "Jujukan Henti", - "Stream Chat Response": "", - "Stream Delta Chunk Size": "", - "Streamable HTTP": "", - "Strikethrough": "", - "Strip Existing OCR": "", - "Strip existing OCR text from the PDF and re-run OCR. Ignored if Force OCR is enabled. Defaults to False.": "", + "Stream Chat Response": "Respons Sembang Aliran", + "Stream Delta Chunk Size": "Saiz Ketulan Delta Aliran", + "Streamable HTTP": "HTTP Boleh Alir", + "Strikethrough": "Garis Potong", + "Strip Existing OCR": "Alih Keluar OCR Sedia Ada", + "Strip existing OCR text from the PDF and re-run OCR. Ignored if Force OCR is enabled. Defaults to False.": "Alih keluar teks OCR sedia ada daripada PDF dan jalankan semula OCR. Diabaikan jika Paksa OCR didayakan. Lalai kepada Palsu.", "STT Model": "Model STT", "STT Settings": "Tetapan STT", - "Stylized PDF Export": "", - "Submit question": "", - "Submit suggestion": "", - "Subtitle": "", + "Stylized PDF Export": "Eksport PDF Bergaya", + "Submit question": "Hantar soalan", + "Submit suggestion": "Hantar cadangan", + "Subtitle": "Subtitle", "Success": "Berjaya", - "Successfully imported {{userCount}} users.": "", + "Successfully imported {{userCount}} users.": "Berjaya mengimport {{userCount}} pengguna.", "Successfully updated.": "Berjaya Dikemaskini", - "Suggest a change": "", + "Suggest a change": "Cadangkan perubahan", "Suggested": "Cadangan", "Support": "Sokongan", "Support this plugin:": "Sokong plugin ini", - "Supported MIME Types": "", - "Sync": "", - "Sync Complete!": "", - "Sync directory": "", - "Sync Failed": "", - "Sync Usage Stats": "", - "Syncing stats...": "", - "Syncing...": "", - "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "", + "Supported MIME Types": "Jenis MIME yang Disokong", + "Sync": "Sinkron", + "Sync Complete!": "Sinkron Lengkap!", + "Sync directory": "Direktori Sinkron", + "Sync Failed": "Sinkron Gagal", + "Sync Usage Stats": "Statistik Penggunaan Sinkron", + "Syncing stats...": "Mensinkronkan statistik...", + "Syncing...": "Sedang menyegerak...", + "Syncs only chats with updates after your last sync timestamp. Disable to re-sync all chats.": "Hanya menyegerak sembang dengan kemas kini selepas cap masa segerak terakhir anda. Nyahaktifkan untuk menyegerak semula semua sembang.", "System": "Sistem", - "System Instructions": "", - "System Prompt": "Gesaan Sistem", - "Tag": "", - "Tags": "", - "Tags Generation": "", - "Tags Generation Prompt": "", - "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "", - "Talk to Model": "", + "System Instructions": "Arahan Sistem", + "System Prompt": "Arahan Sistem", + "Tag": "Tag", + "Tags": "Tag-tag", + "Tags Generation": "Penjanaan Tag", + "Tags Generation Prompt": "Arahan Penjanaan Tag", + "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Persampelan bebas ekor digunakan untuk mengurangkan kesan token yang kurang berkemungkinan daripada output. Nilai yang lebih tinggi (cth., 2.0) akan mengurangkan kesan lebih banyak, manakala nilai 1.0 melumpuhkan tetapan ini.", + "Talk to Model": "Bual dengan Model", "Tap to interrupt": "Sentuh untuk mengganggu", - "Task List": "", - "Task Model": "", - "Tasks": "", + "Task List": "Senarai Tugas", + "Task Model": "Model Tugas", + "Tasks": "Tugas", "Tavily API Key": "Kunci API Tavily", - "Tavily Extract Depth": "", + "Tavily Extract Depth": "Kedalaman Ekstrak Tavily", "Tell us more:": "Beritahu kami lebih lanjut", "Temperature": "Suhu", - "Temporary Chat": "", - "Temporary Chat by Default": "", - "Terminal": "", - "Terminal servers saved": "", - "Text Splitter": "", - "Text-to-Speech": "", + "Temporary Chat": "Sembang Sementara", + "Temporary Chat by Default": "Sembang Sementara secara Default", + "Terminal": "Terminal", + "Terminal servers saved": "Server Terminal Disimpan", + "Text Splitter": "Pemisah Teks", + "Text-to-Speech": "Teks-ke-Ucapan", "Text-to-Speech Engine": "Enjin Teks-ke-Ucapan", "Thanks for your feedback!": "Terima kasih atas maklum balas anda!", - "The Application Account DN you bind with for search": "", - "The base to search for users": "", - "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.": "", + "The Application Account DN you bind with for search": "DN Akaun Aplikasi yang anda ikat untuk carian", + "The base to search for users": "Pangkalan untuk mencari pengguna", + "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.": "Saiz kelompok menentukan berapa banyak permintaan teks yang diproses bersama sekaligus. Saiz kelompok yang lebih tinggi dapat meningkatkan prestasi dan kecepatan model, tetapi ia juga memerlukan lebih banyak memori.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Pembangun di sebalik 'plugin' ini adalah sukarelawan yang bersemangat daripada komuniti. Jika anda mendapati 'plugin' ini membantu, sila pertimbangkan untuk menyumbang kepada pembangunannya.", - "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", - "The format to return a response in. Format can be json or a JSON schema.": "", - "The height in pixels to compress images to. Leave empty for no compression.": "", - "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", - "The LDAP attribute that maps to the mail that users use to sign in.": "", - "The LDAP attribute that maps to the username that users use to sign in.": "", - "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", - "The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "", - "The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "", - "The output format for the text. Can be 'json', 'markdown', or 'html'. Defaults to 'markdown'.": "", - "The passwords you entered don't quite match. Please double-check and try again.": "", + "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Papan kedudukan penilaian berdasarkan sistem penarafan Elo dan dikemas kini secara masa nyata.", + "The format to return a response in. Format can be json or a JSON schema.": "Format untuk mengembalikan respons. Format boleh berupa json atau skema JSON.", + "The height in pixels to compress images to. Leave empty for no compression.": "Ketinggian dalam piksel untuk memampatkan imej. Biarkan kosong untuk tanpa pemampatan.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "Bahasa audio input. Memberikan bahasa input dalam format ISO-639-1 (cth. en) akan meningkatkan ketepatan dan latensi. Biarkan kosong untuk mengesan bahasa secara automatik.", + "The LDAP attribute that maps to the mail that users use to sign in.": "Atribut LDAP yang dipetakan ke mel yang digunakan pengguna untuk log masuk.", + "The LDAP attribute that maps to the username that users use to sign in.": "Atribut LDAP yang dipetakan ke nama pengguna yang digunakan pengguna untuk log masuk.", + "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Papan kedudukan kini dalam versi beta, dan kami mungkin melaraskan pengiraan penarafan apabila kami menyempurnakan algoritma.", + "The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "Saiz fail maksimum dalam MB. Jika saiz fail melebihi had ini, fail tidak akan dimuat naik.", + "The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "Jumlah maksimum fail yang boleh digunakan sekaligus dalam chat. Jika bilangan fail melebihi had ini, fail tidak akan dimuat naik.", + "The output format for the text. Can be 'json', 'markdown', or 'html'. Defaults to 'markdown'.": "Format output untuk teks. Boleh menjadi 'json', 'markdown', atau 'html'. Lalai kepada 'markdown'.", + "The passwords you entered don't quite match. Please double-check and try again.": "Kata laluan yang anda masukkan tidak sepadan. Sila semak semula dan cuba lagi.", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Skor hendaklah berada diantara 0.0 (0%) dan 1.0 (100%).", - "The stream delta chunk size for the model. Increasing the chunk size will make the model respond with larger pieces of text at once.": "", - "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "", - "The Weight of BM25 Hybrid Search. 0 more semantic, 1 more lexical. Default 0.5": "", - "The width in pixels to compress images to. Leave empty for no compression.": "", + "The stream delta chunk size for the model. Increasing the chunk size will make the model respond with larger pieces of text at once.": "Saiz chunk delta aliran untuk model. Meningkatkan saiz chunk akan menyebabkan model bertindak balas dengan sekeping teks yang lebih besar sekaligus.", + "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "Suhu model. Meningkatkan suhu akan menyebabkan model menjawab dengan lebih kreatif.", + "The Weight of BM25 Hybrid Search. 0 more semantic, 1 more lexical. Default 0.5": "Berat Carian Hibrid BM25. 0 lebih semantik, 1 lebih leksikal. Lalai 0.5", + "The width in pixels to compress images to. Leave empty for no compression.": "Lebar dalam piksel untuk memampatkan imej. Biarkan kosong untuk tanpa mampatan.", "Theme": "Tema", - "There was an error syncing your stats. Please try again.": "", + "There was an error syncing your stats. Please try again.": "Terdapat ralat dalam menyegerakkan statistik anda. Sila cuba lagi.", "Thinking...": "Berfikir...", "This action cannot be undone. Do you wish to continue?": "Tindakan ini tidak boleh diubah semula kepada asal. Adakah anda ingin teruskan", - "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "", - "This chat won't appear in history and your messages will not be saved.": "", + "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Saluran ini telah diwujudkan pada {{createdAt}}. Ini adalah permulaan saluran {{channelName}}.", + "This chat won't appear in history and your messages will not be saved.": "Perbualan ini tidak akan dipaparkan dalam sejarah dan mesej anda tidak akan disimpan.", "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ini akan memastikan bahawa perbualan berharga anda disimpan dengan selamat ke pangkalan data 'backend' anda. Terima kasih!", - "This feature is currently experimental and may not work as expected.": "", - "This feature is experimental and may be modified or discontinued without notice.": "", - "This folder is empty": "", - "This is a default user permission and will remain enabled.": "", + "This feature is currently experimental and may not work as expected.": "Ciri ini sedang dalam peringkat eksperimental dan mungkin tidak berfungsi seperti yang dijangkakan.", + "This feature is experimental and may be modified or discontinued without notice.": "Ciri ini sedang dalam peringkat eksperimental dan mungkin diubah atau dihentikan tanpa notis.", + "This folder is empty": "Folder ini kosong", + "This is a default user permission and will remain enabled.": "Ini ialah kebenaran pengguna lalai dan akan tetap didayakan.", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "ni adalah ciri percubaan, ia mungkin tidak berfungsi seperti yang diharapkan dan tertakluk kepada perubahan pada bila-bila masa.", - "This model is not publicly available. Please select another model.": "", - "This option controls how long the model will stay loaded into memory following the request (default: 5m)": "", - "This 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.": "", - "This option enables or disables the use of the reasoning feature in Ollama, which allows the model to think before generating a response. When enabled, the model can take a moment to process the conversation context and generate a more thoughtful response.": "", - "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", - "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", - "This response was generated by \"{{model}}\"": "", + "This model is not publicly available. Please select another model.": "Model ini tidak tersedia secara terbuka. Sila pilih model lain.", + "This option controls how long the model will stay loaded into memory following the request (default: 5m)": "Pilihan ini mengawal berapa lama model akan tetap dimuatkan ke dalam memori selepas permintaan (lalai: 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.": "Pilihan ini mengawal berapa banyak token yang disimpan apabila menyegarkan konteks. Sebagai contoh, jika ditetapkan kepada 2, 2 token terakhir konteks perbualan akan dikekalkan. Memelihara konteks boleh membantu mengekalkan kesinambungan perbualan, tetapi ia mungkin mengurangkan keupayaan untuk bertindak balas terhadap topik baru.", + "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.": "Pilihan ini mendayakan atau melumpuhkan penggunaan ciri penalaran dalam Ollama, yang membenarkan model untuk berfikir sebelum menjana respons. Apabila didayakan, model boleh mengambil masa untuk memproses konteks perbualan dan menjana respons yang lebih teliti.", + "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Pilihan ini menetapkan bilangan maksimum token yang boleh dijana oleh model dalam responsnya. Meningkatkan had ini membenarkan model memberikan jawapan yang lebih panjang, tetapi ia juga mungkin meningkatkan kemungkinan kandungan yang tidak berguna atau tidak relevan dijana.", + "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Pilihan ini akan memadamkan semua fail sedia ada dalam koleksi dan menggantinya dengan fail yang baru dimuat naik.", + "This response was generated by \"{{model}}\"": "Respons ini dijana oleh \"{{model}}\"", "This will delete": "Ini akan memadam", - "This will delete {{NAME}} and all its contents.": "", - "This will delete all models including custom models": "", - "This will delete all models including custom models and cannot be undone.": "", - "This will reset the knowledge base and sync all files. Do you wish to continue?": "", + "This will delete {{NAME}} and all its contents.": "Ini akan memadam {{NAME}} dan semua kandungannya.", + "This will delete all models including custom models": "Ini akan memadam semua model termasuk model tersuai", + "This will delete all models including custom models and cannot be undone.": "Ini akan memadam semua model termasuk model tersuai dan tidak boleh dibuat asal.", + "This will reset the knowledge base and sync all files. Do you wish to continue?": "Ini akan menetapkan semula pangkalan pengetahuan dan menyegerakkan semua fail. Adakah anda ingin meneruskan?", "Thorough explanation": "Penjelasan menyeluruh", - "Thought for {{DURATION}}": "", - "Thought for {{DURATION}} seconds": "", - "Thought for less than a second": "", + "Thought for {{DURATION}}": "Berfikir selama {{DURATION}}", + "Thought for {{DURATION}} seconds": "Berfikir selama {{DURATION}} saat", + "Thought for less than a second": "Berfikir selama kurang dari satu saat", "Thread": "Utas", - "Thumbs up/down ratings from users on model responses": "", + "Thumbs up/down ratings from users on model responses": "Rating ibu jari naik/turun daripada pengguna pada respons model", "Tika": "Tika", "Tika Server URL required.": "URL Pelayan Tika diperlukan.", - "Tiktoken": "", - "Time & Calculation": "", - "Timeout": "", + "Tiktoken": "Tiktoken", + "Time & Calculation": "Masa & Pengiraan", + "Timeout": "Tamat Masa", "Title": "Tajuk", "Title Auto-Generation": "Penjanaan Auto Tajuk", "Title cannot be an empty string.": "Tajuk tidak boleh menjadi rentetan kosong", - "Title Generation": "", - "Title Generation Prompt": "Gesaan Penjanaan Tajuk", - "TLS": "", + "Title Generation": "Penjanaan Tajuk", + "Title Generation Prompt": "Arahan Penjanaan Tajuk", + "TLS": "TLS", "To access the available model names for downloading,": "Untuk mengakses nama model yang tersedia untuk dimuat turun,", "To access the GGUF models available for downloading,": "Untuk mengakses model GGUF yang tersedia untuk dimuat turun,", "To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Untuk mengakses WebUI , sila hubungi pentadbir. Pentadbir boleh menguruskan status pengguna daripada Panel Pentadbiran", - "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "", - "To learn more about available endpoints, visit our documentation.": "", - "To select skills here, add them to the \"Skills\" workspace first.": "", + "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Untuk melampirkan pangkalan pengetahuan di sini, tambahkannya ke ruang kerja \"Knowledge\" terlebih dahulu.", + "To learn more about available endpoints, visit our documentation.": "Untuk mengetahui lebih lanjut tentang titik akhir yang tersedia, lawati dokumentasi kami.", + "To select skills here, add them to the \"Skills\" workspace first.": "Untuk memilih kemahiran di sini, tambahkannya ke ruang kerja \"Skills\" terlebih dahulu.", "To select toolkits here, add them to the \"Tools\" workspace first.": "Untuk memilih kit alatan di sini, tambahkannya pada ruang kerja \"Tools\" dahulu.", - "Toast notifications for new updates": "", + "Toast notifications for new updates": "Pemberitahuan Toast untuk kemas kini baharu", "Today": "Hari Ini", - "Today at {{LOCALIZED_TIME}}": "", - "Toggle {{COUNT}} sources": "", - "Toggle 1 source": "", - "Toggle Dictation": "", - "Toggle Sidebar": "", - "Toggle status history": "", - "Toggle whether current connection is active.": "", - "Token": "", - "Token counts are estimates and may not reflect actual API usage": "", - "tokens": "", - "Tokens": "", - "Too verbose": "", + "Today at {{LOCALIZED_TIME}}": "Hari ini pada {{LOCALIZED_TIME}}", + "Toggle {{COUNT}} sources": "Togol {{COUNT}} sumber", + "Toggle 1 source": "Togol 1 sumber", + "Toggle Dictation": "Togol Diktasi", + "Toggle Sidebar": "Togol Sisi Bar", + "Toggle status history": "Togol sejarah status", + "Toggle whether current connection is active.": "Togol sama ada sambungan semasa aktif.", + "Token": "Token", + "Token counts are estimates and may not reflect actual API usage": "Kiraan token adalah anggaran dan mungkin tidak mencerminkan penggunaan API sebenar", + "tokens": "token", + "Tokens": "Token", + "Too verbose": "Terlalu verbose", "Tool created successfully": "Alat berjaya dibuat", "Tool deleted successfully": "Alat berjaya dipadamkan", - "Tool Description": "", - "Tool ID": "", + "Tool Description": "Deskripsi Alat", + "Tool ID": "ID Alat", "Tool imported successfully": "Alat berjaya diimport", - "Tool Name": "", - "Tool Servers": "", + "Tool Name": "Nama Alat", + "Tool Servers": "Server Alat", "Tool updated successfully": "Alat berjaya dikemas kini", "Tools": "Alatan", - "Tools Access": "", + "Tools Access": "Akses Alat", "Tools are a function calling system with arbitrary code execution": "Alatan ialah sistem panggilan fungsi dengan pelaksanaan kod sewenang-wenangnya", - "Tools Function Calling Prompt": "", + "Tools Function Calling Prompt": "Prompt Pemanggilan Fungsi Alat", "Tools have a function calling system that allows arbitrary code execution.": "Alatan mempunyai sistem panggilan fungsi yang membolehkan pelaksanaan kod sewenang-wenangnya.", - "Tools Public Sharing": "", - "Tools Sharing": "", - "Top": "", + "Tools Public Sharing": "Perkongsian Awam Alat", + "Tools Sharing": "Perkongsian Alat", + "Top": "Teratas", "Top K": "'Top K'", - "Top K Reranker": "", - "Transformers": "", + "Top K Reranker": "Pemeringkat K Teratas", + "Transformers": "Transformers", "Trouble accessing Ollama?": "Masalah mengakses Ollama?", - "Trust Proxy Environment": "", - "Try adjusting your search or filter to find what you are looking for.": "", - "Try Again": "", + "Trust Proxy Environment": "Persekitaran Proksi Terpercaya", + "Try adjusting your search or filter to find what you are looking for.": "Coba sesuaikan pencarian atau penapis anda untuk mencari apa yang anda cari.", + "Try Again": "Cuba Lagi", "TTS Model": "Model TTS", "TTS Settings": "Tetapan TTS", "TTS Voice": "Suara TTS", "Type": "jenis", - "Type here...": "", + "Type here...": "Taip di sini...", "Type Hugging Face Resolve (Download) URL": "Taip URL 'Hugging Face Resolve (Download)'", - "Uh-oh! There was an issue with the response.": "", + "Uh-oh! There was an issue with the response.": "Alamak! Ada masalah dengan respons.", "UI": "UI", - "UI Scale": "", - "Unarchive All": "", - "Unarchive All Archived Chats": "", - "Unarchive Chat": "", - "Underline": "", - "Unknown": "", - "Unknown User": "", - "Unloads {{FROM_NOW}}": "", - "Unlock mysteries": "", + "UI Scale": "Skala UI", + "Unarchive All": "Nyaharkibkan Semua", + "Unarchive All Archived Chats": "Nyaharkibkan Semua Sembang Terarkib", + "Unarchive Chat": "Nyaharkibkan Sembang", + "Underline": "Garis Bawah", + "Unknown": "Tidak Diketahui", + "Unknown User": "Pengguna Tidak Diketahui", + "Unloads {{FROM_NOW}}": "Membuang {{FROM_NOW}}", + "Unlock mysteries": "Buka Misteri", "Unpin": "Nyahsematkan", - "Unravel secrets": "", - "Unshare Chat": "", - "Unsupported file type.": "", - "Untagged": "", - "Untitled": "", + "Unravel secrets": "Ungkap Rahsia", + "Unshare Chat": "Batalkan Perkongsian Sembang", + "Unsupported file type.": "Jenis fail tidak disokong.", + "Untagged": "Tanpa Tag", + "Untitled": "Tanpa Tajuk", "Update": "Kemaskini", "Update and Copy Link": "Kemaskini dan salin pautan", - "Update for the latest features and improvements.": "", + "Update for the latest features and improvements.": "Kemas kini untuk fitur dan peningkatan terbaru.", "Update password": "Kemaskini Kata Laluan", - "Update your status": "", - "Updated": "", + "Update your status": "Kemas kini status anda", + "Updated": "Dikemas kini", "Updated at": "Dikemaskini pada", - "Updated At": "", - "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "", + "Updated At": "Dikemas kini Pada", + "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "Tingkatkan ke pelan berlesen untuk keupayaan yang ditingkatkan, termasuk tema khusus dan penjenamaan, serta sokongan berdedikasi.", "Upload": "Muatnaik", "Upload a GGUF model": "Muatnaik model GGUF", - "Upload Audio": "", - "Upload directory": "", - "Upload files": "", + "Upload Audio": "Muat Naik Audio", + "Upload directory": "Muat Naik Direktori", + "Upload files": "Muat Naik Fail", "Upload Files": "Muatnaik fail", - "Upload Model": "", + "Upload Model": "Muat Naik Model", "Upload Pipeline": "Muatnaik 'Pipeline'", - "Upload profile image": "", + "Upload profile image": "Muat Naik Imej Profil", "Upload Progress": "Kemajuan Muatnaik", - "Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "", - "Uploaded files or images": "", - "Uploading file...": "", - "Uploading...": "", - "URL": "", - "URL is required": "", + "Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Kemajuan Muat Naik: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)", + "Uploaded files or images": "Fail atau imej yang dimuat naik", + "Uploading file...": "Memuat naik fail...", + "Uploading...": "Memuat naik...", + "URL": "URL", + "URL is required": "URL diperlukan", "URL Mode": "Mod URL", - "Usage": "", - "Use": "", - "Use '#' in the prompt input to load and include your knowledge.": "", - "Use /v1/chat/completions endpoint instead of /v1/audio/transcriptions for potentially better accuracy.": "", - "Use Chat Completions API": "", - "Use groups to organize your users and assign permissions.": "", - "Use LLM": "", - "Use no proxy to fetch page contents.": "", - "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", + "Usage": "Penggunaan", + "Use": "Gunakan", + "Use '#' in the prompt input to load and include your knowledge.": "Gunakan '#' dalam input gesaran untuk memuatkan dan memasukkan pengetahuan anda.", + "Use /v1/chat/completions endpoint instead of /v1/audio/transcriptions for potentially better accuracy.": "Gunakan titik akhir /v1/chat/completions daripada /v1/audio/transcriptions untuk ketepatan yang berpotensi lebih baik.", + "Use Chat Completions API": "Gunakan Chat Completions API", + "Use groups to organize your users and assign permissions.": "Gunakan kumpulan untuk mengorganisir pengguna anda dan menetapkan kebenaran.", + "Use LLM": "Gunakan LLM", + "Use no proxy to fetch page contents.": "Jangan gunakan proksi untuk mengambil kandungan halaman.", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "Gunakan proksi yang ditetapkan oleh pembolehubah persekitaran http_proxy dan https_proxy untuk mengambil kandungan halaman.", "user": "pengguna", - "User": "", - "User Activity": "", - "User Groups": "", + "User": "Pengguna", + "User Activity": "Aktiviti Pengguna", + "User Groups": "Kumpulan Pengguna", "User location successfully retrieved.": "Lokasi pengguna berjaya diambil.", - "User menu": "", - "User ratings (thumbs up/down)": "", - "User Status": "", - "User Webhooks": "", - "Username": "", - "users": "", + "User menu": "Menu Pengguna", + "User ratings (thumbs up/down)": "Penilaian Pengguna (ibu jari naik/turun)", + "User Status": "Status Pengguna", + "User Webhooks": "Webhook Pengguna", + "Username": "Nama Pengguna", + "users": "pengguna", "Users": "Pengguna", - "Uses DefaultAzureCredential to authenticate": "", - "Uses OAuth 2.1 Dynamic Client Registration": "", - "Using Entire Document": "", - "Using Focused Retrieval": "", - "Using the default arena model with all models. Click the plus button to add custom models.": "", + "Uses DefaultAzureCredential to authenticate": "Menggunakan DefaultAzureCredential untuk pengesahan", + "Uses OAuth 2.1 Dynamic Client Registration": "Menggunakan Pendaftaran Klien Dinamik OAuth 2.1", + "Using Entire Document": "Menggunakan Seluruh Dokumen", + "Using Focused Retrieval": "Menggunakan Pengambilan Tertumpu", + "Using the default arena model with all models. Click the plus button to add custom models.": "Menggunakan model arena lalai dengan semua model. Klik butang tambah untuk menambah model tersuai.", "Valid time units:": "Unit masa yang sah:", - "Validate certificate": "", + "Validate certificate": "Sahkan Sijil", "Valves": "'Valves'", "Valves updated": "'Valves' dikemaskini", "Valves updated successfully": "'Valves' berjaya dikemaskini", "variable": "pembolehubah", - "Verify Connection": "", - "Verify SSL Certificate": "", + "Verify Connection": "Sahkan Sambungan", + "Verify SSL Certificate": "Sahkan Sijil SSL", "Version": "Versi", - "Version {{selectedVersion}} of {{totalVersions}}": "", - "Version deleted": "", - "View Replies": "", - "View Result from **{{NAME}}**": "", - "View source: {{name}}": "", - "View source: {{title}}": "", - "Visibility": "", - "Visible": "", - "Visible to all users": "", - "Vision": "", + "Version {{selectedVersion}} of {{totalVersions}}": "Versi {{selectedVersion}} daripada {{totalVersions}}", + "Version deleted": "Versi telah dihapus", + "View Replies": "Lihat Balasan", + "View Result from **{{NAME}}**": "Lihat Hasil daripada **{{NAME}}**", + "View source: {{name}}": "Lihat sumber: {{name}}", + "View source: {{title}}": "Lihat sumber: {{title}}", + "Visibility": "Ketampakan", + "Visible": "Boleh Dilihat", + "Visible to all users": "Terlihat kepada semua pengguna", + "Vision": "Penglihatan", "Voice": "Suara", - "Voice Input": "", - "Voice mode": "", - "Voice Mode Custom Prompt": "", - "Voice Mode Prompt": "", - "Waiting for upload...": "", + "Voice Input": "Input Suara", + "Voice mode": "Mode Suara", + "Voice Mode Custom Prompt": "Prompt Kustom Mode Suara", + "Voice Mode Prompt": "Prompt Mode Suara", + "Waiting for upload...": "Menunggu pemuat...", "Warning": "Amaran", "Warning:": "Amaran:", - "Warning: Enabling this will allow users to upload arbitrary code on the server.": "", - "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "", + "Warning: Enabling this will allow users to upload arbitrary code on the server.": "Amaran: Mengaktifkan ini akan membenarkan pengguna memuat naik kod arbitrari pada pelayan.", + "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Amaran: Pelaksanaan Jupyter membolehkan pelaksanaan kod arbitrari, menimbulkan risiko keselamatan yang teruk—teruskan dengan berhati-hati.", "Web": "Web", "Web API": "API Web", - "Web Loader Engine": "", + "Web Loader Engine": "Enjin Pemuatan Web", "Web Search": "Carian Web", "Web Search Engine": "Enjin Carian Web", - "Web Search in Chat": "", - "Web Search Query Generation": "", - "Webhook Name": "", + "Web Search in Chat": "Carian Web dalam Sembang", + "Web Search Query Generation": "Penjanaan Pertanyaan Carian Web", + "Webhook Name": "Nama Webhook", "Webhook URL": "URL 'Webhook'", - "Webhooks": "", - "Webpage URLs": "", + "Webhooks": "Webhook", + "Webpage URLs": "URL Halaman Web", "WebUI Settings": "Tetapan WebUI", - "WebUI URL": "", - "WebUI will make requests to \"{{url}}\"": "", - "WebUI will make requests to \"{{url}}/api/chat\"": "", - "WebUI will make requests to \"{{url}}/chat/completions\"": "", - "What are you trying to achieve?": "", - "What are you working on?": "", - "What is NOT shared:": "", - "What is shared:": "", + "WebUI URL": "URL WebUI", + "WebUI will make requests to \"{{url}}\"": "WebUI akan membuat permintaan ke \"{{url}}\"", + "WebUI will make requests to \"{{url}}/api/chat\"": "WebUI akan membuat permintaan ke \"{{url}}/api/chat\"", + "WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI akan membuat permintaan ke \"{{url}}/chat/completions\"", + "What are you trying to achieve?": "Apa yang ingin anda capai?", + "What are you working on?": "Apa yang sedang anda kerjakan?", + "What is NOT shared:": "Apa yang TIDAK dikongsi:", + "What is shared:": "Apa yang dikongsi:", "What's New in": "Apakah yang terbaru dalam", - "What's on your mind?": "", - "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "", - "wherever you are": "", - "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "", + "What's on your mind?": "Apa yang terlintas di fikiran anda?", + "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Apabila didayakan, model akan bertindak balas kepada setiap mesej sembang secara masa nyata, menjana respons sebaik sahaja pengguna menghantar mesej. Mod ini berguna untuk aplikasi sembang langsung, tetapi mungkin menjejaskan prestasi pada perkakasan yang lebih perlahan.", + "wherever you are": "di mana pun anda berada", + "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "Sama ada untuk memisahkan output mengikut halaman. Setiap halaman akan dipisahkan oleh garis mendatar dan nombor halaman. Lalai kepada False.", "Whisper (Local)": "Whisper (Local)", - "Who can share to this group": "", - "Why?": "", + "Who can share to this group": "Siapa yang boleh berkongsi kepada kumpulan ini", + "Why?": "Mengapa?", "Widescreen Mode": "Mod Skrin Lebar", - "Width": "", - "Wikipedia": "", - "Won": "", - "Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "", + "Width": "Lebar", + "Wikipedia": "Wikipedia", + "Won": "Menang", + "Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Berfungsi bersama dengan top-k. Nilai yang lebih tinggi (contohnya, 0.95) akan menghasilkan teks yang lebih pelbagai, manakala nilai yang lebih rendah (contohnya, 0.5) akan menghasilkan teks yang lebih fokus dan konservatif.", "Workspace": "Ruangan Kerja", - "Workspace Permissions": "", - "Write": "", + "Workspace Permissions": "Kebenaran Ruang Kerja", + "Write": "Tulis", "Write a summary in 50 words that summarizes {{topic}}.": "Tulis ringkasan dalam 50 patah perkataan yang meringkaskan [topik atau kata kunci].", - "Write something...": "", + "Write something...": "Tulis sesuatu...", "Write your model system prompt content here\ne.g.) You are Mario from Super Mario Bros, acting as an assistant.": "Tulis kandungan arahan sistem (system prompt) model anda di sini\ncth.: Anda ialah Mario daripada Super Mario Bros dan bertindak sebagai pembantu.", - "Yacy Instance URL": "", - "Yacy Password": "", - "Yacy Username": "", - "Yahoo": "", - "Yandex": "", - "Yandex Web Search API Key": "", - "Yandex Web Search config": "", - "Yandex Web Search URL": "", + "Yacy Instance URL": "URL Instans Yacy", + "Yacy Password": "Kata Laluan Yacy", + "Yacy Username": "Nama Pengguna Yacy", + "Yahoo": "Yahoo", + "Yandex": "Yandex", + "Yandex Web Search API Key": "Kunci API Pencarian Web Yandex", + "Yandex Web Search config": "Konfigurasi Pencarian Web Yandex", + "Yandex Web Search URL": "URL Pencarian Web Yandex", "Yesterday": "Semalam", - "Yesterday at {{LOCALIZED_TIME}}": "", + "Yesterday at {{LOCALIZED_TIME}}": "Semalam pada {{LOCALIZED_TIME}}", "You": "Anda", - "You are currently using a trial license. Please contact support to upgrade your license.": "", - "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "", + "You are currently using a trial license. Please contact support to upgrade your license.": "Anda sedang menggunakan lesen percubaan. Sila hubungi sokongan untuk menaik taraf lesen anda.", + "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Anda hanya boleh berbual dengan maksimum {{maxCount}} fail sekaligus.", "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Anda boleh memperibadikan interaksi anda dengan LLM dengan menambahkan memori melalui butang 'Urus' di bawah, menjadikannya lebih membantu dan disesuaikan dengan anda.", - "You cannot upload an empty file.": "", - "You do not have permission to edit this model": "", - "You do not have permission to edit this prompt.": "", - "You do not have permission to edit this skill.": "", - "You do not have permission to edit this tool": "", - "You do not have permission to make this public": "", - "You do not have permission to send messages in this channel.": "", - "You do not have permission to send messages in this thread.": "", - "You do not have permission to upload files to this knowledge base.": "", - "You do not have permission to upload files.": "", - "You do not have permission to upload web content.": "", + "You cannot upload an empty file.": "Anda tidak boleh memuat naik fail kosong.", + "You do not have permission to edit this model": "Anda tidak mempunyai kebenaran untuk mengedit model ini.", + "You do not have permission to edit this prompt.": "Anda tidak mempunyai kebenaran untuk mengedit gesaran ini.", + "You do not have permission to edit this skill.": "Anda tidak mempunyai kebenaran untuk mengedit kemahiran ini.", + "You do not have permission to edit this tool": "Anda tidak mempunyai kebenaran untuk mengedit alat ini.", + "You do not have permission to make this public": "Anda tidak mempunyai kebenaran untuk menjadikan ini awam.", + "You do not have permission to send messages in this channel.": "Anda tidak mempunyai kebenaran untuk menghantar mesej dalam saluran ini.", + "You do not have permission to send messages in this thread.": "Anda tidak mempunyai kebenaran untuk menghantar mesej dalam utas ini.", + "You do not have permission to upload files to this knowledge base.": "Anda tidak mempunyai kebenaran untuk memuat naik fail ke pangkalan pengetahuan ini.", + "You do not have permission to upload files.": "Anda tidak mempunyai kebenaran untuk memuat naik fail.", + "You do not have permission to upload web content.": "Anda tidak mempunyai kebenaran untuk memuat naik kandungan web.", "You have no archived conversations.": "Anda tidak mempunyai perbualan yang diarkibkan", - "You have no shared conversations.": "", + "You have no shared conversations.": "Anda tidak mempunyai perbualan yang dikongsi.", "You have shared this chat": "Anda telah berkongsi perbualan ini", - "You.com API Key": "", + "You.com API Key": "Kunci API You.com", "You're a helpful assistant.": "Anda seorang pembantu yang bagus", "You're now logged in.": "Anda kini telah log masuk.", - "Your Account": "", + "Your Account": "Akaun Anda", "Your account status is currently pending activation.": "Status akaun anda ialah sedang menunggu pengaktifan.", - "Your browser does not support the audio tag.": "", - "Your browser does not support the video tag.": "", + "Your browser does not support the audio tag.": "Pelayar anda tidak menyokong teg audio.", + "Your browser does not support the video tag.": "Pelayar anda tidak menyokong teg video.", "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.": "Seluruh sumbangan anda akan dihantar terus kepada pembangun 'plugin'; Open WebUI tidak mengambil sebarang peratusan keuntungan daripadanya. Walau bagaimanapun, platform pembiayaan yang dipilih mungkin mempunyai caj tersendiri.", - "Your message text or inputs": "", - "Your usage stats have been successfully synced.": "", + "Your message text or inputs": "Teks atau input mesej anda", + "Your usage stats have been successfully synced.": "Statistik penggunaan anda telah berjaya disegerakkan.", "YouTube": "Youtube", - "Youtube Language": "", - "Youtube Proxy URL": "" + "Youtube Language": "Bahasa Youtube", + "Youtube Proxy URL": "URL Proksi Youtube" } From 2c35bdbcf5729227a932703f505a9d2aba5b2cd4 Mon Sep 17 00:00:00 2001 From: Alvin Tang <104285249+alvinttang@users.noreply.github.com> Date: Mon, 9 Mar 2026 05:39:09 +0800 Subject: [PATCH 05/33] fix: replace bare string raises with proper exception types (#22446) `raise "string"` in Python raises TypeError instead of the intended error, making error messages confusing and debugging difficult. Co-authored-by: gambletan Co-authored-by: Claude Opus 4.6 --- backend/open_webui/retrieval/utils.py | 4 ++-- backend/open_webui/routers/ollama.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index 86b4acc06..e19563861 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -590,7 +590,7 @@ def generate_openai_batch_embeddings( if "data" in data: return [elem["embedding"] for elem in data["data"]] else: - raise "Something went wrong :/" + raise ValueError("Unexpected OpenAI embeddings response: missing 'data' key") except Exception as e: log.exception(f"Error generating openai batch embeddings: {e}") return None @@ -767,7 +767,7 @@ def generate_ollama_batch_embeddings( if "embeddings" in data: return data["embeddings"] else: - raise "Something went wrong :/" + raise ValueError("Unexpected Ollama embeddings response: missing 'embeddings' key") except Exception as e: log.exception(f"Error generating ollama batch embeddings: {e}") return None diff --git a/backend/open_webui/routers/ollama.py b/backend/open_webui/routers/ollama.py index 926e2c02a..f1170b8f8 100644 --- a/backend/open_webui/routers/ollama.py +++ b/backend/open_webui/routers/ollama.py @@ -1747,7 +1747,7 @@ async def download_file_stream( yield f"data: {json.dumps(res)}\n\n" else: - raise "Ollama: Could not create blob, Please try again." + raise RuntimeError("Ollama: Could not create blob, Please try again.") # url = "https://huggingface.co/TheBloke/stablelm-zephyr-3b-GGUF/resolve/main/stablelm-zephyr-3b.Q2_K.gguf" From 67e26fd3af8fc156958297b84903b70ce959590d Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 8 Mar 2026 16:40:20 -0500 Subject: [PATCH 06/33] refac --- backend/open_webui/routers/tools.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/routers/tools.py b/backend/open_webui/routers/tools.py index 938e3c3ee..351c491bd 100644 --- a/backend/open_webui/routers/tools.py +++ b/backend/open_webui/routers/tools.py @@ -30,7 +30,11 @@ ) from open_webui.utils.tools import get_tool_specs from open_webui.utils.auth import get_admin_user, get_verified_user -from open_webui.utils.access_control import has_permission, filter_allowed_access_grants +from open_webui.utils.access_control import ( + has_permission, + has_access, + filter_allowed_access_grants, +) from open_webui.utils.tools import get_tool_servers from open_webui.config import CACHE_DIR, BYPASS_ADMIN_ACCESS_CONTROL From 710320601a3b15dc65acc3944c81455257be46ac Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 8 Mar 2026 16:41:21 -0500 Subject: [PATCH 07/33] refac --- backend/open_webui/retrieval/loaders/main.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/open_webui/retrieval/loaders/main.py b/backend/open_webui/retrieval/loaders/main.py index 83adb8823..d4cc4391a 100644 --- a/backend/open_webui/retrieval/loaders/main.py +++ b/backend/open_webui/retrieval/loaders/main.py @@ -86,6 +86,9 @@ "hs", "lhs", "json", + "yaml", + "yml", + "toml", ] From 63a0befd3cd05d9a83ed7ee3da2be961dcac6cb4 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 8 Mar 2026 22:41:42 +0100 Subject: [PATCH 08/33] fix: add missing opentelemetry-instrumentation-system-metrics dependency (#22447) --- backend/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/requirements.txt b/backend/requirements.txt index 3d3a54965..86bb8d23a 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -155,3 +155,4 @@ opentelemetry-instrumentation-requests==0.61b0 opentelemetry-instrumentation-logging==0.61b0 opentelemetry-instrumentation-httpx==0.61b0 opentelemetry-instrumentation-aiohttp-client==0.61b0 +opentelemetry-instrumentation-system-metrics==0.61b0 From bbbe2b66b42e07cc73d83e7e8dfaf5b514dc02e4 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sun, 8 Mar 2026 22:44:03 +0100 Subject: [PATCH 09/33] fix: use static month names in getTimeRange to prevent OS locale leaking into sidebar (#22454) getTimeRange returns month names that are used as i18n translation keys (consumed via \.t(chat.time_range) in the sidebar, search modal, etc.). The keys must be exact English strings like 'January', 'February', etc. Previously, toLocaleString('default', { month: 'long' }) was used to generate these keys. The 'default' locale defers to the browser's locale resolution, which in Firefox with intl.regional_prefs.use_os_locales=true picks up OS regional settings instead of the browser language. This caused German month names (e.g. 'Februar', 'Januar') to appear in the sidebar for users whose OS region is set to Germany, even when both browser and app language are set to English. Chrome was unaffected because it ignores OS regional settings for the 'default' locale. Since i18n has no translation key for 'Februar', the German string passed through untranslated. Replace toLocaleString with a static MONTH_NAMES array lookup to make the intent explicit and eliminate any browser/OS locale dependency. --- src/lib/utils/index.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 61ecb75c8..41b132881 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -1094,6 +1094,22 @@ export const approximateToHumanReadable = (nanoseconds: number) => { return results.reverse().join(' '); }; +// Month names used as i18n translation keys — must be English regardless of locale +const MONTH_NAMES = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December' +]; + export const getTimeRange = (timestamp) => { const now = new Date(); const date = new Date(timestamp * 1000); // Convert Unix timestamp to milliseconds @@ -1119,7 +1135,7 @@ export const getTimeRange = (timestamp) => { } else if (diffDays <= 30) { return 'Previous 30 days'; } else if (nowYear === dateYear) { - return date.toLocaleString('default', { month: 'long' }); + return MONTH_NAMES[dateMonth]; } else { return date.getFullYear().toString(); } From f78b238b40a9dc927e6cbf4c6ee9bee5dfabdca2 Mon Sep 17 00:00:00 2001 From: Alvin Tang <104285249+alvinttang@users.noreply.github.com> Date: Mon, 9 Mar 2026 05:44:35 +0800 Subject: [PATCH 10/33] fix: prevent pipeline filter from corrupting payload on HTTP error (#22445) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In both inlet and outlet filter processing, response.json() was called BEFORE response.raise_for_status(). When a filter endpoint returns an HTTP error, the user's chat payload gets silently overwritten with the error response body. If the error is not caught, the corrupted payload propagates through subsequent filters and into the chat completion. Swapped the order so raise_for_status() runs first — payload is only updated on success. Co-authored-by: gambletan --- backend/open_webui/routers/pipelines.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/routers/pipelines.py b/backend/open_webui/routers/pipelines.py index ebedd3027..fa1b77a09 100644 --- a/backend/open_webui/routers/pipelines.py +++ b/backend/open_webui/routers/pipelines.py @@ -92,8 +92,8 @@ async def process_pipeline_inlet_filter(request, payload, user, models): json=request_data, ssl=AIOHTTP_CLIENT_SESSION_SSL, ) as response: - payload = await response.json() response.raise_for_status() + payload = await response.json() except aiohttp.ClientResponseError as e: res = ( await response.json() @@ -145,8 +145,8 @@ async def process_pipeline_outlet_filter(request, payload, user, models): json=request_data, ssl=AIOHTTP_CLIENT_SESSION_SSL, ) as response: - payload = await response.json() response.raise_for_status() + payload = await response.json() except aiohttp.ClientResponseError as e: try: res = ( From 3e513be96343f39a024aad0b4ebd1597352011fb Mon Sep 17 00:00:00 2001 From: Alvin Tang <104285249+alvinttang@users.noreply.github.com> Date: Mon, 9 Mar 2026 05:45:21 +0800 Subject: [PATCH 11/33] fix: prevent TypeError in Teams webhook when user data is missing (#22444) json.loads(event_data.get("user", {})) crashes with TypeError when the "user" key is absent because the default value {} is a dict, not a JSON string. json.loads expects str/bytes, not dict. Also handle the case where "user" is already a dict (not serialized JSON) to make the webhook more robust. Co-authored-by: gambletan --- backend/open_webui/utils/webhook.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/utils/webhook.py b/backend/open_webui/utils/webhook.py index eb2688851..62d35f299 100644 --- a/backend/open_webui/utils/webhook.py +++ b/backend/open_webui/utils/webhook.py @@ -26,9 +26,14 @@ async def post_webhook(name: str, url: str, message: str, event_data: dict) -> b # Microsoft Teams Webhooks elif "webhook.office.com" in url: action = event_data.get("action", "undefined") + user_data = event_data.get("user", "{}") + if isinstance(user_data, dict): + user_dict = user_data + else: + user_dict = json.loads(user_data) facts = [ {"name": name, "value": value} - for name, value in json.loads(event_data.get("user", {})).items() + for name, value in user_dict.items() ] payload = { "@type": "MessageCard", From 7a3c5c0f8a5e1f6174bcdff8b21c7da309a872f6 Mon Sep 17 00:00:00 2001 From: "Ethan T." Date: Mon, 9 Mar 2026 05:45:36 +0800 Subject: [PATCH 12/33] fix: replace bare except with except Exception in main.py (#22423) From 138c4cbfcf5734d882c4b6ae27fe596223c25a41 Mon Sep 17 00:00:00 2001 From: Fu-Jie <33599649+Fu-Jie@users.noreply.github.com> Date: Mon, 9 Mar 2026 05:46:56 +0800 Subject: [PATCH 13/33] fix: filter out internal tool methods starting with underscore (#22408) --- backend/open_webui/utils/tools.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/utils/tools.py b/backend/open_webui/utils/tools.py index 081e2f5fa..e525a8284 100644 --- a/backend/open_webui/utils/tools.py +++ b/backend/open_webui/utils/tools.py @@ -707,8 +707,8 @@ def get_functions_from_tool(tool: object) -> list[Callable]: getattr(tool, func) ) # checks if the attribute is callable (a method or function). and not func.startswith( - "__" - ) # filters out special (dunder) methods like init, str, etc. — these are usually built-in functions of an object that you might not need to use directly. + "_" + ) # filters out internal methods (starting with _) and special (dunder) methods. and not inspect.isclass( getattr(tool, func) ) # ensures that the callable is not a class itself, just a method or function. From a97f5adf95016813ab992b68d15ef132bed060ae Mon Sep 17 00:00:00 2001 From: "Ethan T." Date: Mon, 9 Mar 2026 05:47:47 +0800 Subject: [PATCH 14/33] fix: URL-encode OAuth error message in redirect URL (#22415) - URL-encodes the OAuth error message when constructing the redirect URL in the OIDC callback handler - Without encoding, error messages containing spaces, ampersands, or other special characters produce malformed URLs that the frontend cannot parse correctly - The custom OAuth client callback handler already correctly uses urllib.parse.quote_plus() for the same purpose; this fix brings the OIDC handler in line with that pattern Co-authored-by: gambletan --- backend/open_webui/utils/oauth.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/utils/oauth.py b/backend/open_webui/utils/oauth.py index 249cc62d7..4b6568bee 100644 --- a/backend/open_webui/utils/oauth.py +++ b/backend/open_webui/utils/oauth.py @@ -1706,7 +1706,7 @@ async def handle_callback(self, request, provider, response, db=None): redirect_url = f"{redirect_base_url}/auth" if error_message: - redirect_url = f"{redirect_url}?error={error_message}" + redirect_url = f"{redirect_url}?error={urllib.parse.quote_plus(error_message)}" return RedirectResponse(url=redirect_url, headers=response.headers) response = RedirectResponse(url=redirect_url, headers=response.headers) From 7aa7bbc390c9a2a1bab23c1a4846ed72865e473d Mon Sep 17 00:00:00 2001 From: Alvin Tang <104285249+alvinttang@users.noreply.github.com> Date: Mon, 9 Mar 2026 05:50:25 +0800 Subject: [PATCH 15/33] fix: correct Azure TTS locale extraction for SSML xml:lang (#22443) The locale for Azure TTS SSML was being extracted with `split("-")[:1]`, which only takes the first segment (e.g., "en" from "en-US"). The xml:lang attribute in SSML requires a full locale like "en-US", not just a language code. This caused Azure TTS to either fail or use incorrect pronunciation rules. Changed `[:1]` to `[:2]` to properly extract the locale (e.g., "en-US"). Co-authored-by: gambletan --- backend/open_webui/routers/audio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/routers/audio.py b/backend/open_webui/routers/audio.py index 315607832..65d17d53d 100644 --- a/backend/open_webui/routers/audio.py +++ b/backend/open_webui/routers/audio.py @@ -492,7 +492,7 @@ async def speech(request: Request, user=Depends(get_verified_user)): region = request.app.state.config.TTS_AZURE_SPEECH_REGION or "eastus" base_url = request.app.state.config.TTS_AZURE_SPEECH_BASE_URL language = request.app.state.config.TTS_VOICE - locale = "-".join(request.app.state.config.TTS_VOICE.split("-")[:1]) + locale = "-".join(request.app.state.config.TTS_VOICE.split("-")[:2]) output_format = request.app.state.config.TTS_AZURE_SPEECH_OUTPUT_FORMAT try: From 3e952044bdf5c79d7281998c478dc61401e8c4ec Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 8 Mar 2026 17:09:41 -0500 Subject: [PATCH 16/33] refac --- src/lib/components/layout/Sidebar/ChatItem.svelte | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/lib/components/layout/Sidebar/ChatItem.svelte b/src/lib/components/layout/Sidebar/ChatItem.svelte index 36a76a932..2653f6ca9 100644 --- a/src/lib/components/layout/Sidebar/ChatItem.svelte +++ b/src/lib/components/layout/Sidebar/ChatItem.svelte @@ -78,10 +78,6 @@ let chat = null; let mouseOver = false; - let draggable = false; - $: if (mouseOver) { - loadChat(); - } const loadChat = async () => { if (!chat) { @@ -375,7 +371,7 @@ id="sidebar-chat-group" bind:this={itemElement} class=" w-full {className} relative group" - draggable={draggable && !confirmEdit} + draggable={!confirmEdit} > {#if confirmEdit}
Date: Sun, 8 Mar 2026 23:11:12 +0100 Subject: [PATCH 17/33] fix: add missing group_id filter to analytics token usage query (#22167) The get_token_usage_by_user query lacked group_id filtering, while the companion get_message_count_by_user query already supported it. When an admin filtered analytics by user group, message counts were correctly scoped to the group but token usage totals included data from all users. Add the group_id parameter and subquery filter to get_token_usage_by_user, matching the pattern used by get_message_count_by_user and other analytics queries, and pass group_id through from the analytics endpoint. --- backend/open_webui/models/chat_messages.py | 9 +++++++++ backend/open_webui/routers/analytics.py | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/models/chat_messages.py b/backend/open_webui/models/chat_messages.py index b707ab358..00609ce7f 100644 --- a/backend/open_webui/models/chat_messages.py +++ b/backend/open_webui/models/chat_messages.py @@ -420,11 +420,13 @@ def get_token_usage_by_user( self, start_date: Optional[int] = None, end_date: Optional[int] = None, + group_id: Optional[str] = None, db: Optional[Session] = None, ) -> dict[str, dict]: """Aggregate token usage by user using database-level aggregation.""" with get_db_context(db) as db: from sqlalchemy import func, cast, Integer + from open_webui.models.groups import GroupMember dialect = db.bind.dialect.name @@ -464,6 +466,13 @@ def get_token_usage_by_user( query = query.filter(ChatMessage.created_at >= start_date) if end_date: query = query.filter(ChatMessage.created_at <= end_date) + if group_id: + group_users = ( + db.query(GroupMember.user_id) + .filter(GroupMember.group_id == group_id) + .subquery() + ) + query = query.filter(ChatMessage.user_id.in_(group_users)) results = query.group_by(ChatMessage.user_id).all() diff --git a/backend/open_webui/routers/analytics.py b/backend/open_webui/routers/analytics.py index 1bd12f7bd..9579845a4 100644 --- a/backend/open_webui/routers/analytics.py +++ b/backend/open_webui/routers/analytics.py @@ -86,7 +86,7 @@ async def get_user_analytics( start_date=start_date, end_date=end_date, group_id=group_id, db=db ) token_usage = ChatMessages.get_token_usage_by_user( - start_date=start_date, end_date=end_date, db=db + start_date=start_date, end_date=end_date, group_id=group_id, db=db ) # Get user info for top users From 265d1b28242b157026ebfa048e34d00d1c6fa285 Mon Sep 17 00:00:00 2001 From: Code with love <30664075+seulement55@users.noreply.github.com> Date: Mon, 9 Mar 2026 05:13:14 +0700 Subject: [PATCH 18/33] Add support for mariadb-vector as backing vector DB (#21931) --- Dockerfile | 1 + backend/open_webui/config.py | 72 +++ .../retrieval/vector/dbs/mariadb_vector.py | 570 ++++++++++++++++++ .../open_webui/retrieval/vector/factory.py | 4 + backend/open_webui/retrieval/vector/type.py | 1 + backend/requirements.txt | 1 + pyproject.toml | 4 + 7 files changed, 653 insertions(+) create mode 100644 backend/open_webui/retrieval/vector/dbs/mariadb_vector.py diff --git a/Dockerfile b/Dockerfile index 1c0ae0b3c..2a7e9bd20 100644 --- a/Dockerfile +++ b/Dockerfile @@ -127,6 +127,7 @@ RUN chown -R $UID:$GID /app $HOME RUN apt-get update && \ apt-get install -y --no-install-recommends \ git build-essential pandoc gcc netcat-openbsd curl jq \ + libmariadb-dev \ python3-dev \ ffmpeg libsm6 libxext6 zstd \ && rm -rf /var/lib/apt/lists/* diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index f029b6ba2..114ccfae7 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -2359,6 +2359,78 @@ class BannerModel(BaseModel): CHROMA_HTTP_SSL = os.environ.get("CHROMA_HTTP_SSL", "false").lower() == "true" # this uses the model defined in the Dockerfile ENV variable. If you dont use docker or docker based deployments such as k8s, the default embedding model will be used (sentence-transformers/all-MiniLM-L6-v2) + +# MariaDB Vector (mariadb-vector) +MARIADB_VECTOR_DB_URL = os.environ.get("MARIADB_VECTOR_DB_URL", "").strip() + +MARIADB_VECTOR_INITIALIZE_MAX_VECTOR_LENGTH = int( + os.environ.get("MARIADB_VECTOR_INITIALIZE_MAX_VECTOR_LENGTH", "1536").strip() or "1536" +) + +# Distance strategy: +# - cosine => vec_distance_cosine(...) +# - euclidean => vec_distance_euclidean(...) +MARIADB_VECTOR_DISTANCE_STRATEGY = ( + os.environ.get("MARIADB_VECTOR_DISTANCE_STRATEGY", "cosine").strip().lower() +) + +# HNSW M parameter (MariaDB VECTOR INDEX ... M=) +MARIADB_VECTOR_INDEX_M = int(os.environ.get("MARIADB_VECTOR_INDEX_M", "8").strip() or "8") + +# Pooling (MariaDB-Vector) +MARIADB_VECTOR_POOL_SIZE = os.environ.get("MARIADB_VECTOR_POOL_SIZE", None) + +if MARIADB_VECTOR_POOL_SIZE != None: + try: + MARIADB_VECTOR_POOL_SIZE = int(MARIADB_VECTOR_POOL_SIZE) + except Exception: + MARIADB_VECTOR_POOL_SIZE = None + +MARIADB_VECTOR_POOL_MAX_OVERFLOW = os.environ.get("MARIADB_VECTOR_POOL_MAX_OVERFLOW", 0) + +if MARIADB_VECTOR_POOL_MAX_OVERFLOW == "": + MARIADB_VECTOR_POOL_MAX_OVERFLOW = 0 +else: + try: + MARIADB_VECTOR_POOL_MAX_OVERFLOW = int(MARIADB_VECTOR_POOL_MAX_OVERFLOW) + except Exception: + MARIADB_VECTOR_POOL_MAX_OVERFLOW = 0 + +MARIADB_VECTOR_POOL_TIMEOUT = os.environ.get("MARIADB_VECTOR_POOL_TIMEOUT", 30) + +if MARIADB_VECTOR_POOL_TIMEOUT == "": + MARIADB_VECTOR_POOL_TIMEOUT = 30 +else: + try: + MARIADB_VECTOR_POOL_TIMEOUT = int(MARIADB_VECTOR_POOL_TIMEOUT) + except Exception: + MARIADB_VECTOR_POOL_TIMEOUT = 30 + +MARIADB_VECTOR_POOL_RECYCLE = os.environ.get("MARIADB_VECTOR_POOL_RECYCLE", 3600) + +if MARIADB_VECTOR_POOL_RECYCLE == "": + MARIADB_VECTOR_POOL_RECYCLE = 3600 +else: + try: + MARIADB_VECTOR_POOL_RECYCLE = int(MARIADB_VECTOR_POOL_RECYCLE) + except Exception: + MARIADB_VECTOR_POOL_RECYCLE = 3600 + +ENABLE_MARIADB_VECTOR = True +if VECTOR_DB == "mariadb-vector": + if not MARIADB_VECTOR_DB_URL: + ENABLE_MARIADB_VECTOR = False + else: + try: + parsed = urlparse(MARIADB_VECTOR_DB_URL) + scheme = (parsed.scheme or "").lower() + # Require official driver so VECTOR binds as float32 bytes correctly + if scheme != "mariadb+mariadbconnector": + ENABLE_MARIADB_VECTOR = False + except Exception: + ENABLE_MARIADB_VECTOR = False + + # Milvus MILVUS_URI = os.environ.get("MILVUS_URI", f"{DATA_DIR}/vector_db/milvus.db") MILVUS_DB = os.environ.get("MILVUS_DB", "default") diff --git a/backend/open_webui/retrieval/vector/dbs/mariadb_vector.py b/backend/open_webui/retrieval/vector/dbs/mariadb_vector.py new file mode 100644 index 000000000..06d11adec --- /dev/null +++ b/backend/open_webui/retrieval/vector/dbs/mariadb_vector.py @@ -0,0 +1,570 @@ +from __future__ import annotations + +import array +import json +import logging +import math +import re +import sys +from contextlib import contextmanager +from typing import Any, Dict, List, Optional, Tuple + +from sqlalchemy import create_engine +from sqlalchemy.pool import NullPool, QueuePool + +from open_webui.config import ( + MARIADB_VECTOR_DB_URL, + MARIADB_VECTOR_DISTANCE_STRATEGY, + MARIADB_VECTOR_INDEX_M, + MARIADB_VECTOR_INITIALIZE_MAX_VECTOR_LENGTH, + MARIADB_VECTOR_POOL_SIZE, + MARIADB_VECTOR_POOL_MAX_OVERFLOW, + MARIADB_VECTOR_POOL_TIMEOUT, + MARIADB_VECTOR_POOL_RECYCLE, +) +from open_webui.retrieval.vector.main import GetResult, SearchResult, VectorDBBase, VectorItem +from open_webui.retrieval.vector.utils import process_metadata + +log = logging.getLogger(__name__) + +VECTOR_LENGTH = int(MARIADB_VECTOR_INITIALIZE_MAX_VECTOR_LENGTH) + + +def _embedding_to_f32_bytes(vec: List[float]) -> bytes: + """ + Convert a Python float vector into the binary payload expected by MariaDB VECTOR. + + MariaDB Vector expects the vector argument to be bound as a little-endian float32 + byte sequence. We use array('f') to avoid a numpy dependency and byteswap on + big-endian platforms for portability. + """ + a = array.array("f", [float(x) for x in vec]) # float32 + if sys.byteorder != "little": + a.byteswap() + return a.tobytes() + + +def _safe_json(v: Any) -> Dict[str, Any]: + """ + Normalize a potentially JSON-like value into a Python dict. + + Accepts: + - dict: returned as-is + - str / bytes: parsed as JSON if possible + - None / other types: returns {} + """ + if v is None: + return {} + if isinstance(v, dict): + return v + if isinstance(v, (bytes, bytearray)): + try: + v = v.decode("utf-8") + except Exception: + return {} + if isinstance(v, str): + try: + j = json.loads(v) + return j if isinstance(j, dict) else {} + except Exception: + return {} + return {} + + +class MariaDBVectorClient(VectorDBBase): + """ + MariaDB + MariaDB Vector backend using DBAPI cursor parameter binding. + + IMPORTANT: + - Intended for: mariadb+mariadbconnector://... (official MariaDB driver). + - Uses qmark ("?") params and binds vectors as float32 bytes. + - Uses binary binding for BOTH inserts/updates and distance computations. + """ + + def __init__( + self, + db_url: Optional[str] = None, + vector_length: int = VECTOR_LENGTH, + distance_strategy: str = MARIADB_VECTOR_DISTANCE_STRATEGY, + index_m: int = MARIADB_VECTOR_INDEX_M, + ) -> None: + """ + Initialize a MariaDB Vector-backed VectorDBBase implementation. + + Validates URL scheme/driver requirements, ensures schema exists, and guards + against dimension mismatch with an existing VECTOR(n) column. + """ + self.db_url = (db_url or MARIADB_VECTOR_DB_URL).strip() + self.vector_length = int(vector_length) + self.distance_strategy = (distance_strategy or "cosine").strip().lower() + self.index_m = int(index_m) + + if self.distance_strategy not in {"cosine", "euclidean"}: + raise ValueError("distance_strategy must be 'cosine' or 'euclidean'") + + if not self.db_url.lower().startswith("mariadb+mariadbconnector://"): + raise ValueError( + "MariaDBVectorClient requires mariadb+mariadbconnector:// (official MariaDB driver) " + "to ensure qmark paramstyle and correct VECTOR binding." + ) + + if isinstance(MARIADB_VECTOR_POOL_SIZE, int): + if MARIADB_VECTOR_POOL_SIZE > 0: + self.engine = create_engine( + self.db_url, + pool_size=MARIADB_VECTOR_POOL_SIZE, + max_overflow=MARIADB_VECTOR_POOL_MAX_OVERFLOW, + pool_timeout=MARIADB_VECTOR_POOL_TIMEOUT, + pool_recycle=MARIADB_VECTOR_POOL_RECYCLE, + pool_pre_ping=True, + poolclass=QueuePool, + ) + else: + self.engine = create_engine( + self.db_url, pool_pre_ping=True, poolclass=NullPool + ) + else: + self.engine = create_engine(self.db_url, pool_pre_ping=True) + self._init_schema() + self._check_vector_length() + + @contextmanager + def _connect(self): + """ + Yield a context-managed DBAPI connection (SQLAlchemy raw_connection()). + + Callers can use: + with self._connect() as conn: + with conn.cursor() as cur: + ... + """ + conn = self.engine.raw_connection() + try: + yield conn + finally: + try: + conn.close() + except Exception: + pass + + def _init_schema(self) -> None: + """ + Create the backing table and vector index if they do not exist. + + Uses a PK definition compatible with MariaDB Vector's VECTOR INDEX key-size constraints. + """ + with self._connect() as conn: + with conn.cursor() as cur: + try: + dist = self.distance_strategy + cur.execute( + f""" + CREATE TABLE IF NOT EXISTS document_chunk ( + -- MariaDB Vector requires the table PRIMARY KEY used with a VECTOR INDEX to be <= 256 bytes. + -- VARCHAR has internal length/metadata overhead, so VARCHAR(255) can exceed the 256-byte limit. + -- We use VARCHAR(254) to stay safely under the limit, and force ASCII (1 byte/char) so the byte + -- size is predictable (avoid utf8mb4 where a "255 char" key could be up to 1020 bytes). + -- ascii_bin gives bytewise, case-sensitive comparisons for stable ID matching. + id VARCHAR(254) CHARACTER SET ascii COLLATE ascii_bin PRIMARY KEY, + embedding VECTOR({self.vector_length}) NOT NULL, + collection_name VARCHAR(255) NOT NULL, + text LONGTEXT NULL, + vmetadata JSON NULL, + VECTOR INDEX (embedding) M={self.index_m} DISTANCE={dist}, + INDEX idx_document_chunk_collection_name (collection_name) + ) ENGINE=InnoDB; + """ + ) + conn.commit() + except Exception as e: + conn.rollback() + log.exception(f"Error during database initialization: {e}") + raise + + def _check_vector_length(self) -> None: + """ + Validate that the existing VECTOR column dimension matches this client's configured dimension. + + Dimension guard: if table already exists with + a different VECTOR(n), refuse to silently mismatch. + """ + with self._connect() as conn: + with conn.cursor() as cur: + cur.execute("SHOW CREATE TABLE document_chunk") + row = cur.fetchone() + if not row or len(row) < 2: + return + ddl = row[1] + m = re.search(r"vector\\((\\d+)\\)", ddl, flags=re.IGNORECASE) + if not m: + return + existing = int(m.group(1)) + if existing != int(self.vector_length): + raise Exception( + f"VECTOR_LENGTH {self.vector_length} does not match existing vector column dimension {existing}. " + "Cannot change vector size after initialization without migrating the data." + ) + + def adjust_vector_length(self, vector: List[float]) -> List[float]: + """ + Pad or truncate a vector to match `self.vector_length`. + """ + n = len(vector) + if n < self.vector_length: + return vector + [0.0] * (self.vector_length - n) + if n > self.vector_length: + return vector[: self.vector_length] + return vector + + def _dist_fn(self) -> str: + """ + Return the MariaDB Vector distance function name for the configured strategy. + """ + return "vec_distance_cosine" if self.distance_strategy == "cosine" else "vec_distance_euclidean" + + def _score_from_dist(self, dist: float) -> float: + """ + Convert a DB distance value into a normalized score in (0, 1]. + + - cosine: score ~= 1 - cosine_distance, clamped to [0, 1] + - euclidean: score = 1 / (1 + dist) + """ + if self.distance_strategy == "cosine": + score = 1.0 - dist + if score < 0.0: + score = 0.0 + if score > 1.0: + score = 1.0 + return score + return 1.0 / (1.0 + max(0.0, dist)) + + def _build_filter_sql_qmark(self, expr: Any) -> Tuple[str, List[Any]]: + """ + Build a WHERE-clause fragment and qmark params from a minimal Mongo-like filter. + + Supported forms: + - {"field": "v"} + - {"field": {"$in": ["a","b"]}} + - {"$and": [ ... ]} + - {"$or": [ ... ]} + """ + if not expr or not isinstance(expr, dict): + return "", [] + + if "$and" in expr: + parts: List[str] = [] + params: List[Any] = [] + for e in expr.get("$and") or []: + s, p = self._build_filter_sql_qmark(e) + if s: + parts.append(s) + params.extend(p) + return ("(" + " AND ".join(parts) + ")") if parts else "", params + + if "$or" in expr: + parts: List[str] = [] + params: List[Any] = [] + for e in expr.get("$or") or []: + s, p = self._build_filter_sql_qmark(e) + if s: + parts.append(s) + params.extend(p) + return ("(" + " OR ".join(parts) + ")") if parts else "", params + + clauses: List[str] = [] + params: List[Any] = [] + for key, value in expr.items(): + if key.startswith("$"): + continue + json_expr = f"JSON_UNQUOTE(JSON_EXTRACT(vmetadata, '$.{key}'))" + if isinstance(value, dict) and "$in" in value: + vals = [str(v) for v in (value.get("$in") or [])] + if not vals: + clauses.append("0=1") + continue + ors = [] + for v in vals: + ors.append(f"{json_expr} = ?") + params.append(v) + clauses.append("(" + " OR ".join(ors) + ")") + else: + clauses.append(f"{json_expr} = ?") + params.append(str(value)) + return ("(" + " AND ".join(clauses) + ")") if clauses else "", params + + def insert(self, collection_name: str, items: List[VectorItem]) -> None: + """ + Insert items into the given collection (best-effort, ignores duplicates). + + Uses executemany() with binary VECTOR binding for high-throughput ingestion. + """ + if not items: + return + with self._connect() as conn: + with conn.cursor() as cur: + try: + sql = """ + INSERT IGNORE INTO document_chunk + (id, embedding, collection_name, text, vmetadata) + VALUES + (?, ?, ?, ?, ?) + """ + params: List[Tuple[Any, ...]] = [] + for item in items: + v = self.adjust_vector_length(item["vector"]) + emb = _embedding_to_f32_bytes(v) + meta = process_metadata(item.get("metadata") or {}) + params.append( + ( + item["id"], + emb, + collection_name, + item.get("text"), + json.dumps(meta), + ) + ) + cur.executemany(sql, params) + conn.commit() + except Exception as e: + conn.rollback() + log.exception(f"Error during insert: {e}") + raise + + def upsert(self, collection_name: str, items: List[VectorItem]) -> None: + """ + Insert or update items in the given collection by primary key. + + Uses executemany() and updates embedding/text/metadata on conflicts. + """ + if not items: + return + with self._connect() as conn: + with conn.cursor() as cur: + try: + sql = """ + INSERT INTO document_chunk + (id, embedding, collection_name, text, vmetadata) + VALUES + (?, ?, ?, ?, ?) + ON DUPLICATE KEY UPDATE + embedding = VALUES(embedding), + collection_name = VALUES(collection_name), + text = VALUES(text), + vmetadata = VALUES(vmetadata) + """ + params: List[Tuple[Any, ...]] = [] + for item in items: + v = self.adjust_vector_length(item["vector"]) + emb = _embedding_to_f32_bytes(v) + meta = process_metadata(item.get("metadata") or {}) + params.append( + ( + item["id"], + emb, + collection_name, + item.get("text"), + json.dumps(meta), + ) + ) + cur.executemany(sql, params) + conn.commit() + except Exception as e: + conn.rollback() + log.exception(f"Error during upsert: {e}") + raise + + def search( + self, + collection_name: str, + vectors: List[List[float]], + filter: Optional[Dict[str, Any]] = None, + limit: int = 10, + ) -> Optional[SearchResult]: + """ + Perform a vector similarity search. + + Args: + collection_name: Logical collection partition key. + vectors: One or more query vectors. + filter: Optional metadata filter (Mongo-like subset). + limit: Top-k per query vector. + + Returns a SearchResult where distances are normalized scores (higher is better). + """ + if not vectors: + return None + + dist_fn = self._dist_fn() + ids: List[List[str]] = [[] for _ in vectors] + distances: List[List[float]] = [[] for _ in vectors] + documents: List[List[str]] = [[] for _ in vectors] + metadatas: List[List[Any]] = [[] for _ in vectors] + + try: + with self._connect() as conn: + with conn.cursor() as cur: + fsql, fparams = self._build_filter_sql_qmark(filter or {}) + where = "collection_name = ?" + base_params: List[Any] = [collection_name] + if fsql: + where = where + " AND " + fsql + base_params.extend(fparams) + + sql = f""" + SELECT + id, + text, + vmetadata, + {dist_fn}(embedding, ?) AS dist + FROM document_chunk + WHERE {where} + ORDER BY dist ASC + LIMIT ? + """ + + for q_idx, q in enumerate(vectors): + qv = self.adjust_vector_length(q) + qbin = _embedding_to_f32_bytes(qv) + params = [qbin] + list(base_params) + [int(limit)] + cur.execute(sql, params) + rows = cur.fetchall() + + for r in rows: + rid, rtext, rmeta, rdist = r[0], r[1], r[2], r[3] + ids[q_idx].append(str(rid)) + try: + dist = float(rdist) if rdist is not None else 1.0 + except Exception: + dist = 1.0 + if math.isnan(dist) or math.isinf(dist): + dist = 1.0 + distances[q_idx].append(self._score_from_dist(dist)) + documents[q_idx].append(rtext) + metadatas[q_idx].append(_safe_json(rmeta)) + + return SearchResult(ids=ids, distances=distances, documents=documents, metadatas=metadatas) + except Exception as e: + log.exception(f"[MARIADB_VECTOR] search() failed: {e}") + return None + + def query(self, collection_name: str, filter: Dict[str, Any], limit: Optional[int] = None) -> Optional[GetResult]: + """ + Retrieve documents by metadata filter (non-vector query). + """ + with self._connect() as conn: + with conn.cursor() as cur: + fsql, fparams = self._build_filter_sql_qmark(filter or {}) + where = "collection_name = ?" + params: List[Any] = [collection_name] + if fsql: + where = where + " AND " + fsql + params.extend(fparams) + sql = f"SELECT id, text, vmetadata FROM document_chunk WHERE {where}" + if limit is not None: + sql += " LIMIT ?" + params.append(int(limit)) + cur.execute(sql, params) + rows = cur.fetchall() + if not rows: + return None + ids = [[str(r[0]) for r in rows]] + documents = [[r[1] for r in rows]] + metadatas = [[_safe_json(r[2]) for r in rows]] + return GetResult(ids=ids, documents=documents, metadatas=metadatas) + + def get(self, collection_name: str, limit: Optional[int] = None) -> Optional[GetResult]: + """ + Retrieve documents in a collection without filtering (optionally limited). + """ + with self._connect() as conn: + with conn.cursor() as cur: + sql = "SELECT id, text, vmetadata FROM document_chunk WHERE collection_name = ?" + params: List[Any] = [collection_name] + if limit is not None: + sql += " LIMIT ?" + params.append(int(limit)) + cur.execute(sql, params) + rows = cur.fetchall() + if not rows: + return None + ids = [[str(r[0]) for r in rows]] + documents = [[r[1] for r in rows]] + metadatas = [[_safe_json(r[2]) for r in rows]] + return GetResult(ids=ids, documents=documents, metadatas=metadatas) + + def delete( + self, + collection_name: str, + ids: Optional[List[str]] = None, + filter: Optional[Dict[str, Any]] = None, + ) -> None: + """ + Delete rows from a collection by id list and/or metadata filter. + + If both are provided, they are combined with AND semantics. + """ + with self._connect() as conn: + with conn.cursor() as cur: + try: + where = ["collection_name = ?"] + params: List[Any] = [collection_name] + + if ids: + ph = ", ".join(["?"] * len(ids)) + where.append(f"id IN ({ph})") + params.extend(ids) + + if filter: + fsql, fparams = self._build_filter_sql_qmark(filter) + if fsql: + where.append(fsql) + params.extend(fparams) + + sql = "DELETE FROM document_chunk WHERE " + " AND ".join(where) + cur.execute(sql, params) + conn.commit() + except Exception as e: + conn.rollback() + log.exception(f"Error during delete: {e}") + raise + + def reset(self) -> None: + """ + Truncate the vector table (drops all collections). + """ + with self._connect() as conn: + with conn.cursor() as cur: + try: + cur.execute("TRUNCATE TABLE document_chunk") + conn.commit() + except Exception as e: + conn.rollback() + log.exception(f"Error during reset: {e}") + raise + + def has_collection(self, collection_name: str) -> bool: + """ + Return True if the collection contains at least one row, else False. + """ + try: + with self._connect() as conn: + with conn.cursor() as cur: + cur.execute("SELECT 1 FROM document_chunk WHERE collection_name = ? LIMIT 1", (collection_name,)) + return cur.fetchone() is not None + except Exception: + return False + + def delete_collection(self, collection_name: str) -> None: + """ + Delete all rows in a collection. + """ + self.delete(collection_name) + + def close(self) -> None: + """ + Dispose the underlying SQLAlchemy engine. + """ + try: + self.engine.dispose() + except Exception as e: + log.exception(f"Error during dispose the underlying SQLAlchemy engine: {e}") diff --git a/backend/open_webui/retrieval/vector/factory.py b/backend/open_webui/retrieval/vector/factory.py index 68595fb59..f1ead76d8 100644 --- a/backend/open_webui/retrieval/vector/factory.py +++ b/backend/open_webui/retrieval/vector/factory.py @@ -57,6 +57,10 @@ def get_vector(vector_type: str) -> VectorDBBase: from open_webui.retrieval.vector.dbs.opengauss import OpenGaussClient return OpenGaussClient() + case VectorType.MARIADB_VECTOR: + from open_webui.retrieval.vector.dbs.mariadb_vector import MariaDBVectorClient + + return MariaDBVectorClient() case VectorType.ELASTICSEARCH: from open_webui.retrieval.vector.dbs.elasticsearch import ( ElasticsearchClient, diff --git a/backend/open_webui/retrieval/vector/type.py b/backend/open_webui/retrieval/vector/type.py index de20133fc..df9453aa3 100644 --- a/backend/open_webui/retrieval/vector/type.py +++ b/backend/open_webui/retrieval/vector/type.py @@ -3,6 +3,7 @@ class VectorType(StrEnum): MILVUS = "milvus" + MARIADB_VECTOR = "mariadb-vector" QDRANT = "qdrant" CHROMA = "chroma" PINECONE = "pinecone" diff --git a/backend/requirements.txt b/backend/requirements.txt index 86bb8d23a..295b6cfa8 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -119,6 +119,7 @@ pgvector==0.4.2 PyMySQL==1.1.2 boto3==1.42.62 +mariadb==1.1.14 pymilvus==2.6.9 qdrant-client==1.17.0 diff --git a/pyproject.toml b/pyproject.toml index 251240ac4..2ec9d033b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -137,11 +137,15 @@ postgres = [ "psycopg2-binary==2.9.11", "pgvector==0.4.2", ] +mariadb = [ + "mariadb==1.1.14", +] all = [ "pymongo", "psycopg2-binary==2.9.11", "pgvector==0.4.2", + "mariadb==1.1.14", "moto[s3]>=5.0.26", "gcp-storage-emulator>=2024.8.3", "docker~=7.1.0", From d513eb8c4d5e2d881392f8390f905c93219ced70 Mon Sep 17 00:00:00 2001 From: fama-05 <185788143+fama-05@users.noreply.github.com> Date: Sun, 8 Mar 2026 23:14:43 +0100 Subject: [PATCH 19/33] Update Citations.svelte (#21897) Add on:error handler to img --- src/lib/components/chat/Messages/Citations.svelte | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lib/components/chat/Messages/Citations.svelte b/src/lib/components/chat/Messages/Citations.svelte index 194044868..8f0d93ce6 100644 --- a/src/lib/components/chat/Messages/Citations.svelte +++ b/src/lib/components/chat/Messages/Citations.svelte @@ -178,6 +178,9 @@ src="https://www.google.com/s2/favicons?sz=32&domain={citation.source.name}" alt="favicon" class="size-4 rounded-full shrink-0 border border-white dark:border-gray-850 bg-white dark:bg-gray-900" + on:error={(e) => { + e.target.src = '/favicon.png'; + }} /> {/each}
From c97767424f6ac7daf61daa84e15cdb10f1965d36 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 8 Mar 2026 17:26:29 -0500 Subject: [PATCH 20/33] refac/fix --- backend/open_webui/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 202bd32c1..f13d31710 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -1732,8 +1732,8 @@ async def chat_completion( } # Check base model existence for custom models - if model_info_params.get("base_model_id"): - base_model_id = model_info_params.get("base_model_id") + if model_info and model_info.base_model_id: + base_model_id = model_info.base_model_id if base_model_id not in request.app.state.MODELS: if ENABLE_CUSTOM_MODEL_FALLBACK: default_models = ( From defeddf21b450e207d51ec9479049a905a7ee9e0 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 8 Mar 2026 17:28:26 -0500 Subject: [PATCH 21/33] fix: display image thumbnails in pending message queue Previously, QueuedMessageItem only rendered text content and ignored the files array, causing queued messages with only images to appear blank. Now passes files to the component and renders image thumbnails and file name indicators inline. Fixes #22256 --- src/lib/components/chat/MessageInput.svelte | 1 + .../MessageInput/QueuedMessageItem.svelte | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index 9bf3a0813..4664940d3 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -1187,6 +1187,7 @@ import { getContext } from 'svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte'; + import Image from '$lib/components/common/Image.svelte'; import GarbageBin from '$lib/components/icons/GarbageBin.svelte'; import EditPencil from '$lib/components/icons/EditPencil.svelte'; import ArrowForward from '$lib/components/icons/ArrowForward.svelte'; + import { WEBUI_API_BASE_URL } from '$lib/constants'; const i18n = getContext('i18n'); export let id: string; export let content: string; + export let files: any[] = []; export let onSendNow: (id: string) => void; export let onEdit: (id: string) => void; export let onDelete: (id: string) => void; @@ -21,8 +24,34 @@ -
-

{content}

+
+ {#if files.length > 0} +
+ {#each files as file} + {#if file.type === 'image' || (file?.content_type ?? '').startsWith('image/')} + {@const fileUrl = + file.url?.startsWith('data') || file.url?.startsWith('http') + ? file.url + : `${WEBUI_API_BASE_URL}/files/${file.url}${file?.content_type ? '/content' : ''}`} + + {:else} +
+ {file.name ?? 'file'} +
+ {/if} + {/each} +
+ {/if} + + {#if content} +

{content}

+ {:else if files.length === 0} +

{$i18n.t('Empty message')}

+ {/if}
From 9d8f590fc516d8ba80e2eaa86f82a6a37f9e4b51 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 8 Mar 2026 17:43:23 -0500 Subject: [PATCH 22/33] feat: support pipe filters for per-message content truncation in task templates Add |middletruncate:n, |start:n, and |end:n pipe filters to the {{MESSAGES}} template variable, enabling per-message character truncation for task models (title, tags, follow-up, etc.). Example: {{MESSAGES:END:2|middletruncate:500}} This optimizes task model prompt size for conversations with very long messages (e.g. pasted documents), reducing latency for local models and API costs. Closes #21499 --- backend/open_webui/utils/task.py | 126 +++++++++++++++++++++++++------ 1 file changed, 105 insertions(+), 21 deletions(-) diff --git a/backend/open_webui/utils/task.py b/backend/open_webui/utils/task.py index abc892088..f5177eb78 100644 --- a/backend/open_webui/utils/task.py +++ b/backend/open_webui/utils/task.py @@ -142,41 +142,125 @@ def replacement_function(match): return template +def truncate_content(content: str, max_chars: int, mode: str = "middletruncate") -> str: + """Truncate a string to max_chars using the specified mode. + + Modes: + - middletruncate: keep beginning and end, join with '...' + - start: keep first max_chars characters + - end: keep last max_chars characters + """ + if not content or len(content) <= max_chars: + return content + + if mode == "start": + return content[:max_chars] + elif mode == "end": + return content[-max_chars:] + else: # middletruncate + half = max_chars // 2 + return f"{content[:half]}...{content[-(max_chars - half):]}" + + +def apply_content_filter( + messages: list[dict], filter_str: str +) -> list[dict]: + """Apply a content filter to each message's content. + + filter_str is like 'middletruncate:500', 'start:200', or 'end:200'. + Returns a new list with truncated content (original messages are not mutated). + """ + parts = filter_str.split(":") + if len(parts) != 2: + return messages + + mode = parts[0].lower() + try: + max_chars = int(parts[1]) + except ValueError: + return messages + + if mode not in ("middletruncate", "start", "end"): + return messages + + result = [] + for msg in messages: + new_msg = dict(msg) + if isinstance(new_msg.get("content"), str): + new_msg["content"] = truncate_content(new_msg["content"], max_chars, mode) + elif isinstance(new_msg.get("content"), list): + new_content = [] + for item in new_msg["content"]: + if isinstance(item, dict) and item.get("type") == "text": + new_item = dict(item) + new_item["text"] = truncate_content( + item.get("text", ""), max_chars, mode + ) + new_content.append(new_item) + else: + new_content.append(item) + new_msg["content"] = new_content + result.append(new_msg) + return result + + def replace_messages_variable( template: str, messages: Optional[list[dict]] = None ) -> str: def replacement_function(match): - full_match = match.group(0) - start_length = match.group(1) - end_length = match.group(2) - middle_length = match.group(3) + # Groups: (1) filter for bare MESSAGES + # (2) START count, (3) filter for START + # (4) END count, (5) filter for END + # (6) MIDDLE count,(7) filter for MIDDLE + bare_filter = match.group(1) + start_length = match.group(2) + start_filter = match.group(3) + end_length = match.group(4) + end_filter = match.group(5) + middle_length = match.group(6) + middle_filter = match.group(7) + # If messages is None, handle it as an empty list if messages is None: return "" - # Process messages based on the number of messages required - if full_match == "{{MESSAGES}}": - return get_messages_content(messages) - elif start_length is not None: - return get_messages_content(messages[: int(start_length)]) + # Select messages based on the variant + if start_length is not None: + selected = messages[: int(start_length)] + content_filter = start_filter elif end_length is not None: - return get_messages_content(messages[-int(end_length) :]) + selected = messages[-int(end_length) :] + content_filter = end_filter elif middle_length is not None: mid = int(middle_length) - if len(messages) <= mid: - return get_messages_content(messages) - # Handle middle truncation: split to get start and end portions of the messages list - half = mid // 2 - start_msgs = messages[:half] - end_msgs = messages[-half:] if mid % 2 == 0 else messages[-(half + 1) :] - formatted_start = get_messages_content(start_msgs) - formatted_end = get_messages_content(end_msgs) - return f"{formatted_start}\n{formatted_end}" - return "" + selected = messages + else: + half = mid // 2 + start_msgs = messages[:half] + end_msgs = ( + messages[-half:] if mid % 2 == 0 else messages[-(half + 1) :] + ) + selected = start_msgs + end_msgs + content_filter = middle_filter + else: + # Bare {{MESSAGES}} or {{MESSAGES|filter}} + selected = messages + content_filter = bare_filter + + # Apply content filter if present + if content_filter: + selected = apply_content_filter(selected, content_filter) + + return get_messages_content(selected) template = re.sub( - r"{{MESSAGES}}|{{MESSAGES:START:(\d+)}}|{{MESSAGES:END:(\d+)}}|{{MESSAGES:MIDDLETRUNCATE:(\d+)}}", + r"(?:" + r"\{\{MESSAGES(?:\|(\w+:\d+))?\}\}" + r"|\{\{MESSAGES:START:(\d+)(?:\|(\w+:\d+))?\}\}" + r"|\{\{MESSAGES:END:(\d+)(?:\|(\w+:\d+))?\}\}" + r"|\{\{MESSAGES:MIDDLETRUNCATE:(\d+)(?:\|(\w+:\d+))?\}\}" + r")", replacement_function, template, ) From 3f350f865920daf2844769a758b2d2e6a7ee3efa Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 8 Mar 2026 17:52:49 -0500 Subject: [PATCH 23/33] refac --- backend/open_webui/config.py | 11 +++++++++-- backend/open_webui/routers/auths.py | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 114ccfae7..79421874e 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -469,6 +469,12 @@ def __getattr__(self, key): os.environ.get("OPENID_PROVIDER_URL", ""), ) +OPENID_END_SESSION_ENDPOINT = PersistentConfig( + "OPENID_END_SESSION_ENDPOINT", + "oauth.oidc.end_session_endpoint", + os.environ.get("OPENID_END_SESSION_ENDPOINT", ""), +) + OPENID_REDIRECT_URI = PersistentConfig( "OPENID_REDIRECT_URI", "oauth.oidc.redirect_uri", @@ -844,13 +850,14 @@ def feishu_oauth_register(oauth: OAuth): if FEISHU_CLIENT_ID.value: configured_providers.append("Feishu") - if configured_providers and not OPENID_PROVIDER_URL.value: + if configured_providers and not OPENID_PROVIDER_URL.value and not OPENID_END_SESSION_ENDPOINT.value: provider_list = ", ".join(configured_providers) log.warning( f"⚠️ OAuth providers configured ({provider_list}) but OPENID_PROVIDER_URL not set - logout will not work!" ) log.warning( - f"Set OPENID_PROVIDER_URL to your OAuth provider's OpenID Connect discovery endpoint to fix logout functionality." + f"Set OPENID_PROVIDER_URL to your OAuth provider's OpenID Connect discovery endpoint," + f" or set OPENID_END_SESSION_ENDPOINT to a custom logout URL to fix logout functionality." ) diff --git a/backend/open_webui/routers/auths.py b/backend/open_webui/routers/auths.py index f3c4fbc6d..f5a60c59e 100644 --- a/backend/open_webui/routers/auths.py +++ b/backend/open_webui/routers/auths.py @@ -46,6 +46,7 @@ from fastapi.responses import RedirectResponse, Response, JSONResponse from open_webui.config import ( OPENID_PROVIDER_URL, + OPENID_END_SESSION_ENDPOINT, ENABLE_OAUTH_SIGNUP, ENABLE_LDAP, ENABLE_PASSWORD_AUTH, @@ -824,6 +825,19 @@ async def signout( response.delete_cookie("oauth_session_id") session = OAuthSessions.get_session_by_id(oauth_session_id, db=db) + + # If a custom end_session_endpoint is configured (e.g. AWS Cognito), redirect + # there directly instead of attempting OIDC discovery. + if OPENID_END_SESSION_ENDPOINT.value: + return JSONResponse( + status_code=200, + content={ + "status": True, + "redirect_url": OPENID_END_SESSION_ENDPOINT.value, + }, + headers=response.headers, + ) + oauth_server_metadata_url = ( request.app.state.oauth_manager.get_server_metadata_url(session.provider) if session From 2cb28369b76434ef9a7ae318e27cb3f28951cfa9 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 8 Mar 2026 18:08:12 -0500 Subject: [PATCH 24/33] refac --- backend/open_webui/models/files.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/models/files.py b/backend/open_webui/models/files.py index 09060f9bd..59459cfb9 100644 --- a/backend/open_webui/models/files.py +++ b/backend/open_webui/models/files.py @@ -289,7 +289,7 @@ def search_files( db: Optional database session. Returns: - List of matching FileModel objects, ordered by updated_at descending. + List of matching FileModel objects, ordered by created_at descending. """ with get_db_context(db) as db: query = db.query(File) @@ -303,7 +303,7 @@ def search_files( return [ FileModel.model_validate(file) - for file in query.order_by(File.updated_at.desc()) + for file in query.order_by(File.created_at.desc(), File.id.desc()) .offset(skip) .limit(limit) .all() From 352391fa76a42384963753f9d5b6ec1bdb37930d Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 8 Mar 2026 18:14:09 -0500 Subject: [PATCH 25/33] chore: format --- backend/open_webui/config.py | 13 +++++-- backend/open_webui/retrieval/utils.py | 8 +++- .../retrieval/vector/dbs/mariadb_vector.py | 39 ++++++++++++++----- .../open_webui/retrieval/vector/factory.py | 4 +- backend/open_webui/routers/files.py | 1 + backend/open_webui/routers/ollama.py | 4 +- backend/open_webui/utils/oauth.py | 4 +- backend/open_webui/utils/task.py | 8 +--- backend/open_webui/utils/webhook.py | 3 +- .../MessageInput/QueuedMessageItem.svelte | 14 +++---- src/lib/i18n/locales/ar-BH/translation.json | 1 + src/lib/i18n/locales/ar/translation.json | 1 + src/lib/i18n/locales/bg-BG/translation.json | 1 + src/lib/i18n/locales/bn-BD/translation.json | 1 + src/lib/i18n/locales/bo-TB/translation.json | 1 + src/lib/i18n/locales/bs-BA/translation.json | 1 + src/lib/i18n/locales/ca-ES/translation.json | 1 + src/lib/i18n/locales/ceb-PH/translation.json | 1 + src/lib/i18n/locales/cs-CZ/translation.json | 1 + src/lib/i18n/locales/da-DK/translation.json | 1 + src/lib/i18n/locales/de-DE/translation.json | 1 + src/lib/i18n/locales/dg-DG/translation.json | 1 + src/lib/i18n/locales/el-GR/translation.json | 1 + src/lib/i18n/locales/en-GB/translation.json | 1 + src/lib/i18n/locales/en-US/translation.json | 1 + src/lib/i18n/locales/es-ES/translation.json | 1 + src/lib/i18n/locales/et-EE/translation.json | 1 + src/lib/i18n/locales/eu-ES/translation.json | 1 + src/lib/i18n/locales/fa-IR/translation.json | 1 + src/lib/i18n/locales/fi-FI/translation.json | 1 + src/lib/i18n/locales/fr-CA/translation.json | 1 + src/lib/i18n/locales/fr-FR/translation.json | 1 + src/lib/i18n/locales/gl-ES/translation.json | 1 + src/lib/i18n/locales/he-IL/translation.json | 1 + src/lib/i18n/locales/hi-IN/translation.json | 1 + src/lib/i18n/locales/hr-HR/translation.json | 1 + src/lib/i18n/locales/hu-HU/translation.json | 1 + src/lib/i18n/locales/id-ID/translation.json | 1 + src/lib/i18n/locales/ie-GA/translation.json | 1 + src/lib/i18n/locales/it-IT/translation.json | 1 + src/lib/i18n/locales/ja-JP/translation.json | 1 + src/lib/i18n/locales/ka-GE/translation.json | 1 + src/lib/i18n/locales/kab-DZ/translation.json | 1 + src/lib/i18n/locales/ko-KR/translation.json | 1 + src/lib/i18n/locales/lt-LT/translation.json | 1 + src/lib/i18n/locales/lv-LV/translation.json | 1 + src/lib/i18n/locales/ms-MY/translation.json | 1 + src/lib/i18n/locales/nb-NO/translation.json | 1 + src/lib/i18n/locales/nl-NL/translation.json | 1 + src/lib/i18n/locales/pa-IN/translation.json | 1 + src/lib/i18n/locales/pl-PL/translation.json | 1 + src/lib/i18n/locales/pt-BR/translation.json | 1 + src/lib/i18n/locales/pt-PT/translation.json | 1 + src/lib/i18n/locales/ro-RO/translation.json | 1 + src/lib/i18n/locales/ru-RU/translation.json | 1 + src/lib/i18n/locales/sk-SK/translation.json | 1 + src/lib/i18n/locales/sr-RS/translation.json | 1 + src/lib/i18n/locales/sv-SE/translation.json | 1 + src/lib/i18n/locales/th-TH/translation.json | 1 + src/lib/i18n/locales/tk-TM/translation.json | 1 + src/lib/i18n/locales/tr-TR/translation.json | 1 + src/lib/i18n/locales/ug-CN/translation.json | 1 + src/lib/i18n/locales/uk-UA/translation.json | 1 + src/lib/i18n/locales/ur-PK/translation.json | 1 + .../i18n/locales/uz-Cyrl-UZ/translation.json | 1 + .../i18n/locales/uz-Latn-Uz/translation.json | 1 + src/lib/i18n/locales/vi-VN/translation.json | 1 + src/lib/i18n/locales/zh-CN/translation.json | 1 + src/lib/i18n/locales/zh-TW/translation.json | 1 + 69 files changed, 124 insertions(+), 33 deletions(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 79421874e..fb313e278 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -850,7 +850,11 @@ def feishu_oauth_register(oauth: OAuth): if FEISHU_CLIENT_ID.value: configured_providers.append("Feishu") - if configured_providers and not OPENID_PROVIDER_URL.value and not OPENID_END_SESSION_ENDPOINT.value: + if ( + configured_providers + and not OPENID_PROVIDER_URL.value + and not OPENID_END_SESSION_ENDPOINT.value + ): provider_list = ", ".join(configured_providers) log.warning( f"⚠️ OAuth providers configured ({provider_list}) but OPENID_PROVIDER_URL not set - logout will not work!" @@ -2371,7 +2375,8 @@ class BannerModel(BaseModel): MARIADB_VECTOR_DB_URL = os.environ.get("MARIADB_VECTOR_DB_URL", "").strip() MARIADB_VECTOR_INITIALIZE_MAX_VECTOR_LENGTH = int( - os.environ.get("MARIADB_VECTOR_INITIALIZE_MAX_VECTOR_LENGTH", "1536").strip() or "1536" + os.environ.get("MARIADB_VECTOR_INITIALIZE_MAX_VECTOR_LENGTH", "1536").strip() + or "1536" ) # Distance strategy: @@ -2382,7 +2387,9 @@ class BannerModel(BaseModel): ) # HNSW M parameter (MariaDB VECTOR INDEX ... M=) -MARIADB_VECTOR_INDEX_M = int(os.environ.get("MARIADB_VECTOR_INDEX_M", "8").strip() or "8") +MARIADB_VECTOR_INDEX_M = int( + os.environ.get("MARIADB_VECTOR_INDEX_M", "8").strip() or "8" +) # Pooling (MariaDB-Vector) MARIADB_VECTOR_POOL_SIZE = os.environ.get("MARIADB_VECTOR_POOL_SIZE", None) diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index e19563861..5030a6eec 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -590,7 +590,9 @@ def generate_openai_batch_embeddings( if "data" in data: return [elem["embedding"] for elem in data["data"]] else: - raise ValueError("Unexpected OpenAI embeddings response: missing 'data' key") + raise ValueError( + "Unexpected OpenAI embeddings response: missing 'data' key" + ) except Exception as e: log.exception(f"Error generating openai batch embeddings: {e}") return None @@ -767,7 +769,9 @@ def generate_ollama_batch_embeddings( if "embeddings" in data: return data["embeddings"] else: - raise ValueError("Unexpected Ollama embeddings response: missing 'embeddings' key") + raise ValueError( + "Unexpected Ollama embeddings response: missing 'embeddings' key" + ) except Exception as e: log.exception(f"Error generating ollama batch embeddings: {e}") return None diff --git a/backend/open_webui/retrieval/vector/dbs/mariadb_vector.py b/backend/open_webui/retrieval/vector/dbs/mariadb_vector.py index 06d11adec..b1b899626 100644 --- a/backend/open_webui/retrieval/vector/dbs/mariadb_vector.py +++ b/backend/open_webui/retrieval/vector/dbs/mariadb_vector.py @@ -22,7 +22,12 @@ MARIADB_VECTOR_POOL_TIMEOUT, MARIADB_VECTOR_POOL_RECYCLE, ) -from open_webui.retrieval.vector.main import GetResult, SearchResult, VectorDBBase, VectorItem +from open_webui.retrieval.vector.main import ( + GetResult, + SearchResult, + VectorDBBase, + VectorItem, +) from open_webui.retrieval.vector.utils import process_metadata log = logging.getLogger(__name__) @@ -157,8 +162,7 @@ def _init_schema(self) -> None: with conn.cursor() as cur: try: dist = self.distance_strategy - cur.execute( - f""" + cur.execute(f""" CREATE TABLE IF NOT EXISTS document_chunk ( -- MariaDB Vector requires the table PRIMARY KEY used with a VECTOR INDEX to be <= 256 bytes. -- VARCHAR has internal length/metadata overhead, so VARCHAR(255) can exceed the 256-byte limit. @@ -173,8 +177,7 @@ def _init_schema(self) -> None: VECTOR INDEX (embedding) M={self.index_m} DISTANCE={dist}, INDEX idx_document_chunk_collection_name (collection_name) ) ENGINE=InnoDB; - """ - ) + """) conn.commit() except Exception as e: conn.rollback() @@ -220,7 +223,11 @@ def _dist_fn(self) -> str: """ Return the MariaDB Vector distance function name for the configured strategy. """ - return "vec_distance_cosine" if self.distance_strategy == "cosine" else "vec_distance_euclidean" + return ( + "vec_distance_cosine" + if self.distance_strategy == "cosine" + else "vec_distance_euclidean" + ) def _score_from_dist(self, dist: float) -> float: """ @@ -442,12 +449,19 @@ def search( documents[q_idx].append(rtext) metadatas[q_idx].append(_safe_json(rmeta)) - return SearchResult(ids=ids, distances=distances, documents=documents, metadatas=metadatas) + return SearchResult( + ids=ids, + distances=distances, + documents=documents, + metadatas=metadatas, + ) except Exception as e: log.exception(f"[MARIADB_VECTOR] search() failed: {e}") return None - def query(self, collection_name: str, filter: Dict[str, Any], limit: Optional[int] = None) -> Optional[GetResult]: + def query( + self, collection_name: str, filter: Dict[str, Any], limit: Optional[int] = None + ) -> Optional[GetResult]: """ Retrieve documents by metadata filter (non-vector query). """ @@ -472,7 +486,9 @@ def query(self, collection_name: str, filter: Dict[str, Any], limit: Optional[in metadatas = [[_safe_json(r[2]) for r in rows]] return GetResult(ids=ids, documents=documents, metadatas=metadatas) - def get(self, collection_name: str, limit: Optional[int] = None) -> Optional[GetResult]: + def get( + self, collection_name: str, limit: Optional[int] = None + ) -> Optional[GetResult]: """ Retrieve documents in a collection without filtering (optionally limited). """ @@ -549,7 +565,10 @@ def has_collection(self, collection_name: str) -> bool: try: with self._connect() as conn: with conn.cursor() as cur: - cur.execute("SELECT 1 FROM document_chunk WHERE collection_name = ? LIMIT 1", (collection_name,)) + cur.execute( + "SELECT 1 FROM document_chunk WHERE collection_name = ? LIMIT 1", + (collection_name,), + ) return cur.fetchone() is not None except Exception: return False diff --git a/backend/open_webui/retrieval/vector/factory.py b/backend/open_webui/retrieval/vector/factory.py index f1ead76d8..d92b33586 100644 --- a/backend/open_webui/retrieval/vector/factory.py +++ b/backend/open_webui/retrieval/vector/factory.py @@ -58,7 +58,9 @@ def get_vector(vector_type: str) -> VectorDBBase: return OpenGaussClient() case VectorType.MARIADB_VECTOR: - from open_webui.retrieval.vector.dbs.mariadb_vector import MariaDBVectorClient + from open_webui.retrieval.vector.dbs.mariadb_vector import ( + MariaDBVectorClient, + ) return MariaDBVectorClient() case VectorType.ELASTICSEARCH: diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index 6e3271d7e..15eb81770 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -583,6 +583,7 @@ def update_file_data_content_by_id( request, ProcessFileForm(file_id=id, content=form_data.content), user=user, + db=db, ) file = Files.get_file_by_id(id=id, db=db) except Exception as e: diff --git a/backend/open_webui/routers/ollama.py b/backend/open_webui/routers/ollama.py index f1170b8f8..14ff55b10 100644 --- a/backend/open_webui/routers/ollama.py +++ b/backend/open_webui/routers/ollama.py @@ -1747,7 +1747,9 @@ async def download_file_stream( yield f"data: {json.dumps(res)}\n\n" else: - raise RuntimeError("Ollama: Could not create blob, Please try again.") + raise RuntimeError( + "Ollama: Could not create blob, Please try again." + ) # url = "https://huggingface.co/TheBloke/stablelm-zephyr-3b-GGUF/resolve/main/stablelm-zephyr-3b.Q2_K.gguf" diff --git a/backend/open_webui/utils/oauth.py b/backend/open_webui/utils/oauth.py index 4b6568bee..636ad957d 100644 --- a/backend/open_webui/utils/oauth.py +++ b/backend/open_webui/utils/oauth.py @@ -1706,7 +1706,9 @@ async def handle_callback(self, request, provider, response, db=None): redirect_url = f"{redirect_base_url}/auth" if error_message: - redirect_url = f"{redirect_url}?error={urllib.parse.quote_plus(error_message)}" + redirect_url = ( + f"{redirect_url}?error={urllib.parse.quote_plus(error_message)}" + ) return RedirectResponse(url=redirect_url, headers=response.headers) response = RedirectResponse(url=redirect_url, headers=response.headers) diff --git a/backend/open_webui/utils/task.py b/backend/open_webui/utils/task.py index f5177eb78..0ea525c93 100644 --- a/backend/open_webui/utils/task.py +++ b/backend/open_webui/utils/task.py @@ -162,9 +162,7 @@ def truncate_content(content: str, max_chars: int, mode: str = "middletruncate") return f"{content[:half]}...{content[-(max_chars - half):]}" -def apply_content_filter( - messages: list[dict], filter_str: str -) -> list[dict]: +def apply_content_filter(messages: list[dict], filter_str: str) -> list[dict]: """Apply a content filter to each message's content. filter_str is like 'middletruncate:500', 'start:200', or 'end:200'. @@ -238,9 +236,7 @@ def replacement_function(match): else: half = mid // 2 start_msgs = messages[:half] - end_msgs = ( - messages[-half:] if mid % 2 == 0 else messages[-(half + 1) :] - ) + end_msgs = messages[-half:] if mid % 2 == 0 else messages[-(half + 1) :] selected = start_msgs + end_msgs content_filter = middle_filter else: diff --git a/backend/open_webui/utils/webhook.py b/backend/open_webui/utils/webhook.py index 62d35f299..b3a3c6bcd 100644 --- a/backend/open_webui/utils/webhook.py +++ b/backend/open_webui/utils/webhook.py @@ -32,8 +32,7 @@ async def post_webhook(name: str, url: str, message: str, event_data: dict) -> b else: user_dict = json.loads(user_data) facts = [ - {"name": name, "value": value} - for name, value in user_dict.items() + {"name": name, "value": value} for name, value in user_dict.items() ] payload = { "@type": "MessageCard", diff --git a/src/lib/components/chat/MessageInput/QueuedMessageItem.svelte b/src/lib/components/chat/MessageInput/QueuedMessageItem.svelte index d1c985074..ed0adce37 100644 --- a/src/lib/components/chat/MessageInput/QueuedMessageItem.svelte +++ b/src/lib/components/chat/MessageInput/QueuedMessageItem.svelte @@ -33,13 +33,11 @@ file.url?.startsWith('data') || file.url?.startsWith('http') ? file.url : `${WEBUI_API_BASE_URL}/files/${file.url}${file?.content_type ? '/content' : ''}`} - + {:else} -
+
{file.name ?? 'file'}
{/if} @@ -50,7 +48,9 @@ {#if content}

{content}

{:else if files.length === 0} -

{$i18n.t('Empty message')}

+

+ {$i18n.t('Empty message')} +

{/if}
diff --git a/src/lib/i18n/locales/ar-BH/translation.json b/src/lib/i18n/locales/ar-BH/translation.json index dff6be6fe..8c940b7a2 100644 --- a/src/lib/i18n/locales/ar-BH/translation.json +++ b/src/lib/i18n/locales/ar-BH/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "نموذج التضمين", "Embedding Model Engine": "تضمين محرك النموذج", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/ar/translation.json b/src/lib/i18n/locales/ar/translation.json index c98f286a1..db010bd2f 100644 --- a/src/lib/i18n/locales/ar/translation.json +++ b/src/lib/i18n/locales/ar/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "نموذج التضمين", "Embedding Model Engine": "تضمين محرك النموذج", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "تفعيل توليد الإكمال التلقائي لرسائل الدردشة", diff --git a/src/lib/i18n/locales/bg-BG/translation.json b/src/lib/i18n/locales/bg-BG/translation.json index 9d1d0ec7a..7d5b9cacf 100644 --- a/src/lib/i18n/locales/bg-BG/translation.json +++ b/src/lib/i18n/locales/bg-BG/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Модел за вграждане", "Embedding Model Engine": "Двигател на модела за вграждане", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Активиране на автоматично довършване на съобщения в чата", diff --git a/src/lib/i18n/locales/bn-BD/translation.json b/src/lib/i18n/locales/bn-BD/translation.json index df3b6aaea..f5c7bef4a 100644 --- a/src/lib/i18n/locales/bn-BD/translation.json +++ b/src/lib/i18n/locales/bn-BD/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "ইমেজ ইমেবডিং মডেল", "Embedding Model Engine": "ইমেজ ইমেবডিং মডেল ইঞ্জিন", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/bo-TB/translation.json b/src/lib/i18n/locales/bo-TB/translation.json index 6a4fe4509..768a0de0c 100644 --- a/src/lib/i18n/locales/bo-TB/translation.json +++ b/src/lib/i18n/locales/bo-TB/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "ཚུད་འཇུག་དཔེ་དབྱིབས།", "Embedding Model Engine": "ཚུད་འཇུག་དཔེ་དབྱིབས་འཕྲུལ་འཁོར།", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "ཁ་བརྡའི་འཕྲིན་ཡིག་གི་ཆེད་དུ་རང་འཚང་བཟོ་སྐྲུན་སྒུལ་བསྐྱོད་བྱེད་པ།", diff --git a/src/lib/i18n/locales/bs-BA/translation.json b/src/lib/i18n/locales/bs-BA/translation.json index a62d7e5d2..1b694a547 100644 --- a/src/lib/i18n/locales/bs-BA/translation.json +++ b/src/lib/i18n/locales/bs-BA/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Embedding model", "Embedding Model Engine": "Embedding model pogon", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index 89228d5a7..9b297744e 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "Peticions concurrents d'incrustació", "Embedding Model": "Model d'incrustació", "Embedding Model Engine": "Motor de model d'incrustació", + "Empty message": "", "Enable All": "Habilitar tot", "Enable API Keys": "Permetre claus API", "Enable autocomplete generation for chat messages": "Activar la generació automàtica per als missatges del xat", diff --git a/src/lib/i18n/locales/ceb-PH/translation.json b/src/lib/i18n/locales/ceb-PH/translation.json index b0ff5202f..eed49b3f1 100644 --- a/src/lib/i18n/locales/ceb-PH/translation.json +++ b/src/lib/i18n/locales/ceb-PH/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "", "Embedding Model Engine": "", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/cs-CZ/translation.json b/src/lib/i18n/locales/cs-CZ/translation.json index 894164066..f8c4ea400 100644 --- a/src/lib/i18n/locales/cs-CZ/translation.json +++ b/src/lib/i18n/locales/cs-CZ/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Model pro vektorizaci", "Embedding Model Engine": "Jádro modelu pro vektorizaci", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Povolit generování automatického dokončování pro zprávy v konverzaci", diff --git a/src/lib/i18n/locales/da-DK/translation.json b/src/lib/i18n/locales/da-DK/translation.json index 27e62191d..343a79c33 100644 --- a/src/lib/i18n/locales/da-DK/translation.json +++ b/src/lib/i18n/locales/da-DK/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Embedding Model", "Embedding Model Engine": "Embedding Model engine", + "Empty message": "", "Enable All": "", "Enable API Keys": "Aktiver API nøgler", "Enable autocomplete generation for chat messages": "Aktiver autofuldførsel for chatbeskeder", diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index 673bcaaba..672f451bc 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "Gleichzeitige Embedding Anfragen", "Embedding Model": "Embedding-Modell", "Embedding Model Engine": "Embedding-Modell-Engine", + "Empty message": "", "Enable All": "Alle aktivieren", "Enable API Keys": "API-Schlüssel aktivieren", "Enable autocomplete generation for chat messages": "Autovervollständigung für Chat-Nachrichten aktivieren", diff --git a/src/lib/i18n/locales/dg-DG/translation.json b/src/lib/i18n/locales/dg-DG/translation.json index 8774cee65..11ebfa8b7 100644 --- a/src/lib/i18n/locales/dg-DG/translation.json +++ b/src/lib/i18n/locales/dg-DG/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "", "Embedding Model Engine": "", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/el-GR/translation.json b/src/lib/i18n/locales/el-GR/translation.json index 21441dc20..d017f2531 100644 --- a/src/lib/i18n/locales/el-GR/translation.json +++ b/src/lib/i18n/locales/el-GR/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Μοντέλο Ενσωμάτωσης", "Embedding Model Engine": "Μηχανή Μοντέλου Ενσωμάτωσης", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Ενεργοποίηση αυτόματης συμπλήρωσης για συνομιλίες", diff --git a/src/lib/i18n/locales/en-GB/translation.json b/src/lib/i18n/locales/en-GB/translation.json index 06b8ac6a1..8738a4e69 100644 --- a/src/lib/i18n/locales/en-GB/translation.json +++ b/src/lib/i18n/locales/en-GB/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "", "Embedding Model Engine": "", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index 77d52c644..40b81d871 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "", "Embedding Model Engine": "", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index 76765f004..4b8b8ac5d 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "Número de Peticiones Concurrentes en Incrustración", "Embedding Model": "Modelo de Incrustación", "Embedding Model Engine": "Motor del Modelo de Incrustación", + "Empty message": "", "Enable All": "Habilitar Todo", "Enable API Keys": "Habilitar Claves API", "Enable autocomplete generation for chat messages": "Habilitar generación de autocompletado para mensajes de chat", diff --git a/src/lib/i18n/locales/et-EE/translation.json b/src/lib/i18n/locales/et-EE/translation.json index 535e195b2..a6827ff48 100644 --- a/src/lib/i18n/locales/et-EE/translation.json +++ b/src/lib/i18n/locales/et-EE/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Manustamise mudel", "Embedding Model Engine": "Manustamise mudeli mootor", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Luba automaattäitmise genereerimine vestlussõnumitele", diff --git a/src/lib/i18n/locales/eu-ES/translation.json b/src/lib/i18n/locales/eu-ES/translation.json index d46fe503b..acac50bbd 100644 --- a/src/lib/i18n/locales/eu-ES/translation.json +++ b/src/lib/i18n/locales/eu-ES/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Embedding Eredua", "Embedding Model Engine": "Embedding Eredu Motorea", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/fa-IR/translation.json b/src/lib/i18n/locales/fa-IR/translation.json index f01fb5f7a..c14f22520 100644 --- a/src/lib/i18n/locales/fa-IR/translation.json +++ b/src/lib/i18n/locales/fa-IR/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "مدل پیدائش", "Embedding Model Engine": "محرک مدل پیدائش", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "فعال\u200cسازی تولید تکمیل خودکار برای پیام\u200cهای چت", diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index a3a549fba..f2297cdc6 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "Samanaikaiset upotuspyynnöt", "Embedding Model": "Upotusmalli", "Embedding Model Engine": "Upotusmallin moottori", + "Empty message": "", "Enable All": "Ota kaikki käyttöön", "Enable API Keys": "Ota API-avaimet käyttöön", "Enable autocomplete generation for chat messages": "Ota automaattinen täydennys käyttöön keskusteluviesteissä", diff --git a/src/lib/i18n/locales/fr-CA/translation.json b/src/lib/i18n/locales/fr-CA/translation.json index 903522f04..66df34c8f 100644 --- a/src/lib/i18n/locales/fr-CA/translation.json +++ b/src/lib/i18n/locales/fr-CA/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Modèle d'embedding", "Embedding Model Engine": "Moteur de modèle d'embedding", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Activer la génération des suggestions pour les messages", diff --git a/src/lib/i18n/locales/fr-FR/translation.json b/src/lib/i18n/locales/fr-FR/translation.json index a226b43bc..9b31e6901 100644 --- a/src/lib/i18n/locales/fr-FR/translation.json +++ b/src/lib/i18n/locales/fr-FR/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Modèle d'embedding", "Embedding Model Engine": "Moteur de modèle d'embedding", + "Empty message": "", "Enable All": "Activer tout", "Enable API Keys": "Autoriser les clés API", "Enable autocomplete generation for chat messages": "Activer la génération des suggestions pour les messages", diff --git a/src/lib/i18n/locales/gl-ES/translation.json b/src/lib/i18n/locales/gl-ES/translation.json index 63b37f939..e2425db49 100644 --- a/src/lib/i18n/locales/gl-ES/translation.json +++ b/src/lib/i18n/locales/gl-ES/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Modelo de Embedding", "Embedding Model Engine": "Motor de Modelo de Embedding", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Habilitar xeneración de autocompletado para mensaxes de chat", diff --git a/src/lib/i18n/locales/he-IL/translation.json b/src/lib/i18n/locales/he-IL/translation.json index ab44c359e..b8a360efa 100644 --- a/src/lib/i18n/locales/he-IL/translation.json +++ b/src/lib/i18n/locales/he-IL/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "מודל הטמעה", "Embedding Model Engine": "מנוע מודל הטמעה", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/hi-IN/translation.json b/src/lib/i18n/locales/hi-IN/translation.json index 54938dabc..c3894c954 100644 --- a/src/lib/i18n/locales/hi-IN/translation.json +++ b/src/lib/i18n/locales/hi-IN/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "मॉडेल अनुकूलन", "Embedding Model Engine": "एंबेडिंग मॉडल इंजन", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/hr-HR/translation.json b/src/lib/i18n/locales/hr-HR/translation.json index 5bacffb41..f60e902a1 100644 --- a/src/lib/i18n/locales/hr-HR/translation.json +++ b/src/lib/i18n/locales/hr-HR/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Embedding model", "Embedding Model Engine": "Embedding model pogon", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/hu-HU/translation.json b/src/lib/i18n/locales/hu-HU/translation.json index da7cdd448..948582524 100644 --- a/src/lib/i18n/locales/hu-HU/translation.json +++ b/src/lib/i18n/locales/hu-HU/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Beágyazási modell", "Embedding Model Engine": "Beágyazási modell motor", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Automatikus kiegészítés engedélyezése csevegőüzenetekhez", diff --git a/src/lib/i18n/locales/id-ID/translation.json b/src/lib/i18n/locales/id-ID/translation.json index 2ce4e232b..d6f1dd0b9 100644 --- a/src/lib/i18n/locales/id-ID/translation.json +++ b/src/lib/i18n/locales/id-ID/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Model Penyematan", "Embedding Model Engine": "Mesin Model Penyematan", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/ie-GA/translation.json b/src/lib/i18n/locales/ie-GA/translation.json index e12c64549..dcc43a847 100644 --- a/src/lib/i18n/locales/ie-GA/translation.json +++ b/src/lib/i18n/locales/ie-GA/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "Iarratais Chomhuaineacha a Leabú", "Embedding Model": "Samhail Leabháilte", "Embedding Model Engine": "Inneall Samhail Leabaithe", + "Empty message": "", "Enable All": "Cumasaigh Gach Rud", "Enable API Keys": "Cumasaigh Eochracha API", "Enable autocomplete generation for chat messages": "Cumasaigh giniúint uathchríochnaithe le haghaidh teachtaireachtaí comhrá", diff --git a/src/lib/i18n/locales/it-IT/translation.json b/src/lib/i18n/locales/it-IT/translation.json index 135cca43b..2d6bd1822 100644 --- a/src/lib/i18n/locales/it-IT/translation.json +++ b/src/lib/i18n/locales/it-IT/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Modello Embedding", "Embedding Model Engine": "Motore Modello di Embedding", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Abilita generazione autocompletamento per i messaggi di chat", diff --git a/src/lib/i18n/locales/ja-JP/translation.json b/src/lib/i18n/locales/ja-JP/translation.json index 71a84cbf0..fc5232677 100644 --- a/src/lib/i18n/locales/ja-JP/translation.json +++ b/src/lib/i18n/locales/ja-JP/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "埋め込みモデル", "Embedding Model Engine": "埋め込みモデルエンジン", + "Empty message": "", "Enable All": "", "Enable API Keys": "API キーを有効にする", "Enable autocomplete generation for chat messages": "チャットメッセージの自動補完を有効にする", diff --git a/src/lib/i18n/locales/ka-GE/translation.json b/src/lib/i18n/locales/ka-GE/translation.json index 5775c767e..d9834853e 100644 --- a/src/lib/i18n/locales/ka-GE/translation.json +++ b/src/lib/i18n/locales/ka-GE/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "მოდელის ჩაშენება", "Embedding Model Engine": "ჩაშენებული მოდელის ძრავა", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/kab-DZ/translation.json b/src/lib/i18n/locales/kab-DZ/translation.json index 7132052c0..06dd0559b 100644 --- a/src/lib/i18n/locales/kab-DZ/translation.json +++ b/src/lib/i18n/locales/kab-DZ/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Tamudemt n ujmak", "Embedding Model Engine": "Amsedday n tmudemt n ujmak", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Rmed tasuta tawurmant tummidt i udiwenni iznan", diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index cd847b89c..0016d8e2e 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "임베딩 모델", "Embedding Model Engine": "임베딩 모델 엔진", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "채팅 메시지에 대한 자동 완성 생성 활성화", diff --git a/src/lib/i18n/locales/lt-LT/translation.json b/src/lib/i18n/locales/lt-LT/translation.json index 8479aa0f6..69c413b82 100644 --- a/src/lib/i18n/locales/lt-LT/translation.json +++ b/src/lib/i18n/locales/lt-LT/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Embedding modelis", "Embedding Model Engine": "Embedding modelio variklis", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/lv-LV/translation.json b/src/lib/i18n/locales/lv-LV/translation.json index 07202c58a..a6b9888ae 100644 --- a/src/lib/i18n/locales/lv-LV/translation.json +++ b/src/lib/i18n/locales/lv-LV/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Iegulšanas modelis", "Embedding Model Engine": "Iegulšanas modeļa dzinējs", + "Empty message": "", "Enable All": "", "Enable API Keys": "Iespējot API atslēgas", "Enable autocomplete generation for chat messages": "Iespējot automātisko pabeigšanu tērzēšanas ziņojumiem", diff --git a/src/lib/i18n/locales/ms-MY/translation.json b/src/lib/i18n/locales/ms-MY/translation.json index 91340356d..403999ff7 100644 --- a/src/lib/i18n/locales/ms-MY/translation.json +++ b/src/lib/i18n/locales/ms-MY/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "Permintaan Serentak Pembenaman", "Embedding Model": "Model Benamkan", "Embedding Model Engine": "Enjin Model Benamkan", + "Empty message": "", "Enable All": "Dayakan Semua", "Enable API Keys": "Dayakan Kunci API", "Enable autocomplete generation for chat messages": "Aktifkan penjanaan auto-lengkap untuk mesej sembang", diff --git a/src/lib/i18n/locales/nb-NO/translation.json b/src/lib/i18n/locales/nb-NO/translation.json index b7e521cd9..0691b1aaa 100644 --- a/src/lib/i18n/locales/nb-NO/translation.json +++ b/src/lib/i18n/locales/nb-NO/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Innbyggingsmodell", "Embedding Model Engine": "Motor for innbygging av modeller", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Aktiver automatisk utfylling av chatmeldinger", diff --git a/src/lib/i18n/locales/nl-NL/translation.json b/src/lib/i18n/locales/nl-NL/translation.json index 7013db4a4..70661dcb5 100644 --- a/src/lib/i18n/locales/nl-NL/translation.json +++ b/src/lib/i18n/locales/nl-NL/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Embedding Model", "Embedding Model Engine": "Embedding Model Engine", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Automatische aanvullingsgeneratie voor chatberichten inschakelen", diff --git a/src/lib/i18n/locales/pa-IN/translation.json b/src/lib/i18n/locales/pa-IN/translation.json index b824faf43..98ff23a3f 100644 --- a/src/lib/i18n/locales/pa-IN/translation.json +++ b/src/lib/i18n/locales/pa-IN/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "ਐਮਬੈੱਡਿੰਗ ਮਾਡਲ", "Embedding Model Engine": "ਐਮਬੈੱਡਿੰਗ ਮਾਡਲ ਇੰਜਣ", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/pl-PL/translation.json b/src/lib/i18n/locales/pl-PL/translation.json index d2420efd8..d4e3da9a0 100644 --- a/src/lib/i18n/locales/pl-PL/translation.json +++ b/src/lib/i18n/locales/pl-PL/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Model embeddingów", "Embedding Model Engine": "Silnik modelu embeddingów", + "Empty message": "", "Enable All": "", "Enable API Keys": "Włącz klucze API", "Enable autocomplete generation for chat messages": "Włącz autouzupełnianie w czacie", diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index 233352321..c29dc729a 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "Solicitações Simultâneas de Embedding", "Embedding Model": "Modelo de Embedding", "Embedding Model Engine": "Motor do Modelo de Embedding", + "Empty message": "", "Enable All": "Ativar tudo", "Enable API Keys": "Habilitar Chaves de API", "Enable autocomplete generation for chat messages": "Habilitar geração de preenchimento automático para mensagens do chat", diff --git a/src/lib/i18n/locales/pt-PT/translation.json b/src/lib/i18n/locales/pt-PT/translation.json index b45ec49cc..4fe00e6f6 100644 --- a/src/lib/i18n/locales/pt-PT/translation.json +++ b/src/lib/i18n/locales/pt-PT/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Modelo de Embedding", "Embedding Model Engine": "Motor de Modelo de Embedding", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/ro-RO/translation.json b/src/lib/i18n/locales/ro-RO/translation.json index 37cc71aa3..89e6ce06e 100644 --- a/src/lib/i18n/locales/ro-RO/translation.json +++ b/src/lib/i18n/locales/ro-RO/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Model de Încapsulare", "Embedding Model Engine": "Motor de Model de Încapsulare", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Activează generarea automată pentru mesajele de chat", diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 99a5189ae..5b9872d07 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Модель встраивания", "Embedding Model Engine": "Движок модели встраивания", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Включить генерацию автозаполнения для сообщений чата", diff --git a/src/lib/i18n/locales/sk-SK/translation.json b/src/lib/i18n/locales/sk-SK/translation.json index 693e6734f..b63dbdf47 100644 --- a/src/lib/i18n/locales/sk-SK/translation.json +++ b/src/lib/i18n/locales/sk-SK/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Vkladací model (Embedding Model)", "Embedding Model Engine": "", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/sr-RS/translation.json b/src/lib/i18n/locales/sr-RS/translation.json index 2146eec35..ed38bc8da 100644 --- a/src/lib/i18n/locales/sr-RS/translation.json +++ b/src/lib/i18n/locales/sr-RS/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Модел уградње", "Embedding Model Engine": "Мотор модела уградње", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/sv-SE/translation.json b/src/lib/i18n/locales/sv-SE/translation.json index 2bd95feb5..86e715140 100644 --- a/src/lib/i18n/locales/sv-SE/translation.json +++ b/src/lib/i18n/locales/sv-SE/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Inbäddningsmodell", "Embedding Model Engine": "Motor för inbäddningsmodell", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Aktivera automatisk komplettering av generering för chattmeddelanden", diff --git a/src/lib/i18n/locales/th-TH/translation.json b/src/lib/i18n/locales/th-TH/translation.json index e2b451c7c..6b8051c1c 100644 --- a/src/lib/i18n/locales/th-TH/translation.json +++ b/src/lib/i18n/locales/th-TH/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "โมเดล Embedding", "Embedding Model Engine": "เอ็นจินโมเดล Embedding", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "เปิดใช้งานการเติมข้อความอัตโนมัติสำหรับข้อความแชท", diff --git a/src/lib/i18n/locales/tk-TM/translation.json b/src/lib/i18n/locales/tk-TM/translation.json index 651254fa2..2786872cb 100644 --- a/src/lib/i18n/locales/tk-TM/translation.json +++ b/src/lib/i18n/locales/tk-TM/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "", "Embedding Model Engine": "", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/tr-TR/translation.json b/src/lib/i18n/locales/tr-TR/translation.json index 9c0d3c9bd..c442363e6 100644 --- a/src/lib/i18n/locales/tr-TR/translation.json +++ b/src/lib/i18n/locales/tr-TR/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Gömme Modeli", "Embedding Model Engine": "Gömme Modeli Motoru", + "Empty message": "", "Enable All": "Tümünü Etkinleştir", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Sohbet mesajları için otomatik tamamlama üretimini etkinleştir", diff --git a/src/lib/i18n/locales/ug-CN/translation.json b/src/lib/i18n/locales/ug-CN/translation.json index 3b45c2202..d5530c937 100644 --- a/src/lib/i18n/locales/ug-CN/translation.json +++ b/src/lib/i18n/locales/ug-CN/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "سىڭدۈرۈش مودېلى", "Embedding Model Engine": "سىڭدۈرۈش مودېل ماتورى", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "سۆھبەت ئۇچۇرلىرىغا ئاپتوماتىك تولدۇرۇش قوزغىتىش", diff --git a/src/lib/i18n/locales/uk-UA/translation.json b/src/lib/i18n/locales/uk-UA/translation.json index 6c949f2fe..cdd32362f 100644 --- a/src/lib/i18n/locales/uk-UA/translation.json +++ b/src/lib/i18n/locales/uk-UA/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Модель вбудовування", "Embedding Model Engine": "Рушій моделі вбудовування ", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Увімкнути генерацію автозаповнення для повідомлень чату", diff --git a/src/lib/i18n/locales/ur-PK/translation.json b/src/lib/i18n/locales/ur-PK/translation.json index b165ac17f..2bd69a6b0 100644 --- a/src/lib/i18n/locales/ur-PK/translation.json +++ b/src/lib/i18n/locales/ur-PK/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "ایمبیڈنگ ماڈل", "Embedding Model Engine": "ایمبیڈنگ ماڈل انجن", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "", diff --git a/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json b/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json index b1168b60d..4fe68bfb5 100644 --- a/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json +++ b/src/lib/i18n/locales/uz-Cyrl-UZ/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Ўрнатиш модели", "Embedding Model Engine": "Двигател моделини ўрнатиш", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Чат хабарлари учун автоматик тўлдиришни яратишни ёқинг", diff --git a/src/lib/i18n/locales/uz-Latn-Uz/translation.json b/src/lib/i18n/locales/uz-Latn-Uz/translation.json index 9087fe70e..dee9c103c 100644 --- a/src/lib/i18n/locales/uz-Latn-Uz/translation.json +++ b/src/lib/i18n/locales/uz-Latn-Uz/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "O'rnatish modeli", "Embedding Model Engine": "Dvigatel modelini o'rnatish", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Chat xabarlari uchun avtomatik to‘ldirishni yaratishni yoqing", diff --git a/src/lib/i18n/locales/vi-VN/translation.json b/src/lib/i18n/locales/vi-VN/translation.json index 5b190c6b1..ae40e383f 100644 --- a/src/lib/i18n/locales/vi-VN/translation.json +++ b/src/lib/i18n/locales/vi-VN/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "Mô hình embedding", "Embedding Model Engine": "Trình xử lý embedding", + "Empty message": "", "Enable All": "", "Enable API Keys": "", "Enable autocomplete generation for chat messages": "Bật tạo tự động hoàn thành cho tin nhắn chat", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 6ca92acdc..6300a44f2 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "嵌入并发请求数", "Embedding Model": "嵌入模型", "Embedding Model Engine": "嵌入模型引擎", + "Empty message": "", "Enable All": "全部启用", "Enable API Keys": "启用接口密钥", "Enable autocomplete generation for chat messages": "启用对话输入框内容自动补全", diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index dcff1e574..ee1b588ac 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -633,6 +633,7 @@ "Embedding Concurrent Requests": "嵌入並發請求數", "Embedding Model": "嵌入模型", "Embedding Model Engine": "嵌入模型引擎", + "Empty message": "", "Enable All": "全部啟用", "Enable API Keys": "啟用 API 金鑰", "Enable autocomplete generation for chat messages": "啟用對話訊息的自動完成", From 1364df09136af2f30365a187ad4bf716435926e9 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 8 Mar 2026 18:26:36 -0500 Subject: [PATCH 26/33] refac --- backend/open_webui/models/files.py | 10 ++++++- backend/open_webui/utils/misc.py | 45 ++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/models/files.py b/backend/open_webui/models/files.py index 59459cfb9..84dd43f5e 100644 --- a/backend/open_webui/models/files.py +++ b/backend/open_webui/models/files.py @@ -4,6 +4,7 @@ from sqlalchemy.orm import Session from open_webui.internal.db import Base, JSONField, get_db, get_db_context +from open_webui.utils.misc import sanitize_metadata from pydantic import BaseModel, ConfigDict, model_validator from sqlalchemy import BigInteger, Column, String, Text, JSON @@ -127,9 +128,16 @@ def insert_new_file( self, user_id: str, form_data: FileForm, db: Optional[Session] = None ) -> Optional[FileModel]: with get_db_context(db) as db: + file_data = form_data.model_dump() + + # Sanitize meta to remove non-JSON-serializable objects + # (e.g. callable tool functions, MCP client instances from middleware) + if file_data.get("meta"): + file_data["meta"] = sanitize_metadata(file_data["meta"]) + file = FileModel( **{ - **form_data.model_dump(), + **file_data, "user_id": user_id, "created_at": int(time.time()), "updated_at": int(time.time()), diff --git a/backend/open_webui/utils/misc.py b/backend/open_webui/utils/misc.py index 35e19d70c..bab1bb4bb 100644 --- a/backend/open_webui/utils/misc.py +++ b/backend/open_webui/utils/misc.py @@ -566,6 +566,51 @@ def sanitize_data_for_db(obj): return obj +def sanitize_metadata(metadata: dict) -> dict: + """ + Return a JSON-safe copy of a metadata dict for database storage. + + The middleware metadata accumulates non-serializable Python objects + (e.g. callable tool functions, MCP client instances) that cause + PostgreSQL JSON inserts to fail. This helper strips those out while + preserving the primitive data needed for file-to-chat linking. + """ + if not isinstance(metadata, dict): + return metadata + + def _sanitize(obj): + if isinstance(obj, (str, int, float, bool, type(None))): + return obj + if isinstance(obj, dict): + return { + k: _sanitize(v) + for k, v in obj.items() + if not callable(v) and _is_serializable(v) + } + if isinstance(obj, list): + return [_sanitize(v) for v in obj if not callable(v) and _is_serializable(v)] + if callable(obj): + return None + # Last resort: try to see if it's serializable + try: + json.dumps(obj) + return obj + except (TypeError, ValueError): + return None + + def _is_serializable(obj): + """Quick check whether a value can survive JSON serialization.""" + if isinstance(obj, (str, int, float, bool, type(None), dict, list)): + return True + try: + json.dumps(obj) + return True + except (TypeError, ValueError): + return False + + return _sanitize(metadata) + + def extract_folders_after_data_docs(path): # Convert the path to a Path object if it's not already path = Path(path) From 0bfacca0a0a9e71fb4f2a1dea3fb09196dc01192 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 8 Mar 2026 18:30:16 -0500 Subject: [PATCH 27/33] refac --- backend/open_webui/routers/files.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index 15eb81770..5268ea657 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -590,6 +590,29 @@ def update_file_data_content_by_id( log.exception(e) log.error(f"Error processing file: {file.id}") + # Propagate content change to all knowledge collections referencing + # this file. Without this the old embeddings remain in the knowledge + # collection and RAG returns both stale and current data (#20558). + knowledges = Knowledges.get_knowledges_by_file_id(id, db=db) + for knowledge in knowledges: + try: + # Remove old embeddings for this file from the KB collection + VECTOR_DB_CLIENT.delete( + collection_name=knowledge.id, filter={"file_id": id} + ) + # Re-add from the now-updated file-{file_id} collection + process_file( + request, + ProcessFileForm(file_id=id, collection_name=knowledge.id), + user=user, + db=db, + ) + except Exception as e: + log.warning( + f"Failed to update knowledge {knowledge.id} after " + f"content change for file {id}: {e}" + ) + return {"content": file.data.get("content", "")} else: raise HTTPException( From c3e1d2d894038104253a6336a5ac5db078d9bb59 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 8 Mar 2026 18:40:47 -0500 Subject: [PATCH 28/33] refac --- backend/open_webui/routers/audio.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/routers/audio.py b/backend/open_webui/routers/audio.py index 65d17d53d..41b6a07c1 100644 --- a/backend/open_webui/routers/audio.py +++ b/backend/open_webui/routers/audio.py @@ -852,17 +852,36 @@ def transcription_handler(request, file_path, metadata, user=None): except requests.exceptions.RequestException as e: log.exception(e) detail = None + status_code = getattr(r, "status_code", 500) if r else 500 try: if r is not None and r.status_code != 200: res = r.json() - if "error" in res: + # Azure returns {"code": "...", "message": "...", "innerError": {...}} + if "code" in res and "message" in res: + azure_code = res.get("innerError", {}).get( + "code", res["code"] + ) + user_facing_codes = { + "EmptyAudioFile", + "AudioLengthLimitExceeded", + "NoLanguageIdentified", + "MultipleLanguagesIdentified", + } + if azure_code in user_facing_codes: + detail = res["message"] + else: + log.error( + f"Azure STT error [{azure_code}]: {res['message']}" + ) + detail = "An error occurred during transcription." + elif "error" in res: detail = f"External: {res['error'].get('message', '')}" except Exception: detail = f"External: {e}" raise HTTPException( - status_code=getattr(r, "status_code", 500) if r else 500, + status_code=status_code, detail=detail if detail else "Open WebUI: Server Connection Error", ) @@ -1087,6 +1106,8 @@ def transcribe( for future in futures: try: results.append(future.result()) + except HTTPException: + raise except Exception as transcribe_exc: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, @@ -1226,6 +1247,8 @@ def transcription( "filename": os.path.basename(file_path), } + except HTTPException: + raise except Exception as e: log.exception(e) @@ -1234,6 +1257,8 @@ def transcription( detail="Transcription failed.", ) + except HTTPException: + raise except Exception as e: log.exception(e) From 61366cbcda45d2989807eab2451178e021e42284 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 8 Mar 2026 18:57:20 -0500 Subject: [PATCH 29/33] refac --- backend/open_webui/retrieval/vector/dbs/s3vector.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/open_webui/retrieval/vector/dbs/s3vector.py b/backend/open_webui/retrieval/vector/dbs/s3vector.py index 96e487f11..4a1e70cdc 100644 --- a/backend/open_webui/retrieval/vector/dbs/s3vector.py +++ b/backend/open_webui/retrieval/vector/dbs/s3vector.py @@ -61,6 +61,11 @@ def _create_index( dataType=data_type, dimension=dimension, distanceMetric=distance_metric, + metadataConfiguration={ + "nonFilterableMetadataKeys": [ + "text", + ] + }, ) log.info( f"Created S3 index: {index_name} (dim={dimension}, type={data_type}, metric={distance_metric})" From cb73257f140fc2599619009b6f453d24cc96fee7 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Mon, 9 Mar 2026 00:58:01 +0100 Subject: [PATCH 30/33] chore: Changelog updates (#22460) * Add v0.8.10 changelog entry * changelog: docker startup fix for missing opentelemetry dependency * changelog: add translation updates for v0.8.10 * changelog: oauth-error-handling, exception-messages * changelog: fix YAML file processing with Docling (#22399) * changelog: tool access fix for non-admin users * changelog: fix time range month names localization * changelog: pipeline filter, webhook crash, shutdown handling * changelog: tool method filtering, OAuth URL encoding, Azure TTS * changelog: add analytics group filtering fix * changelog: api-calls, optimization, performance * changelog: add MariaDB Vector support entry * changelog: add web search favicon fallback fix * changelog: custom model fallback fix * changelog: pending message image display fix (#22256) * changelog: task message truncation for title and tag generation * changelog: oidc, logout, custom-endpoint * changelog: files list stability fix for issue #21879 * Remove empty Changed section from v0.8.10 * changelog: file metadata sanitization fix * Remove empty Changed section from v0.8.10 * changelog: fix knowledge file embedding updates for RAG * changelog: add Azure speech transcription error fix --- CHANGELOG.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 259f2f61e..722ed6717 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,40 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.8.10] - 2026-03-08 + +### Added + +- ⚡ **API call optimization.** Reduced excessive API calls when hovering over the model selector or scrolling through chat history by adding a 30-second cooldown to model list fetches and a 200ms debounce to chat loading. [#22457](https://github.com/open-webui/open-webui/pull/22457) +- 🗄️ **MariaDB Vector support.** Added MariaDB Vector as a new vector database backend, enabling deployments with VECTOR_DB=mariadb-vector; supports cosine and euclidean distance strategies with configurable HNSW indexing. [#21931](https://github.com/open-webui/open-webui/pull/21931) +- 📝 **Task message truncation.** Chat messages sent to task models for title and tag generation can now be truncated using a filter in the prompt template, reducing token usage and processing time for long conversations. [#21499](https://github.com/open-webui/open-webui/issues/21499) +- 🔐 **Custom OIDC logout endpoint.** Administrators can now configure a custom OpenID Connect logout URL via OPENID_END_SESSION_ENDPOINT, enabling logout functionality for OIDC providers that require custom endpoints like AWS Cognito. [Commit](https://github.com/open-webui/open-webui/commit/3f350f865920daf2844769a758b2d2e6a7ee3efa) +- 🔄 **General improvements.** Various improvements were implemented across the application to enhance performance, stability, and security. +- 🌐 Translations for Portuguese (Brazil), Spanish, and Malay were enhanced and expanded. + +### Fixed + +- 🔗 **Pipeline filter HTTP errors.** Fixed a bug where HTTP errors in pipeline inlet/outlet filters would silently corrupt the user's chat payload; errors are now properly raised before parsing the response. [#22445](https://github.com/open-webui/open-webui/pull/22445) +- 📚 **Knowledge file embedding updates.** Fixed a bug where updating knowledge files left old embeddings in the database, causing search results to include duplicate and stale data. [#20558](https://github.com/open-webui/open-webui/issues/20558) +- 📁 **Files list stability.** Fixed the files list ordering to use created_at with id as secondary sort, ensuring consistent ordering and preventing page crashes when managing many files. [#21879](https://github.com/open-webui/open-webui/issues/21879) +- 📨 **Teams webhook crash.** Fixed a TypeError crash in the Teams webhook handler when user data is missing from the event payload. [#22444](https://github.com/open-webui/open-webui/pull/22444) +- 🛠️ **Process shutdown handling.** Fixed bare except clauses in the main process that prevented clean shutdown; replaced with proper exception handling. [#22423](https://github.com/open-webui/open-webui/pull/22423) +- 🐳 **Docker deployment startup.** Docker deployments now start correctly; the missing OpenTelemetry system metrics dependency was added. [#22447](https://github.com/open-webui/open-webui/pull/22447), [#22401](https://github.com/open-webui/open-webui/issues/22401) +- 🛠️ **Tool access for non-admin users.** Fixed a NameError that prevented non-admin users from viewing tools; the missing has_access function is now properly imported. [#22393](https://github.com/open-webui/open-webui/issues/22393) +- 🔐 **OAuth error handling.** Fixed a bug where bare except clauses silently caught SystemExit and KeyboardInterrupt, preventing clean process shutdown during OAuth authentication. [#22420](https://github.com/open-webui/open-webui/pull/22420) +- 🛠️ **Exception error messages.** Fixed three locations where incorrect exception raising caused confusing TypeError messages instead of proper error descriptions, making debugging much easier. [#22446](https://github.com/open-webui/open-webui/pull/22446) +- 📄 **YAML file processing.** Fixed an error when uploading YAML files with Docling enabled; YAML and YML files are now properly recognized as text files and processed correctly. [#22399](https://github.com/open-webui/open-webui/pull/22399), [#22263](https://github.com/open-webui/open-webui/issues/22263) +- 📅 **Time range month names.** Fixed month names in time range labels appearing in the wrong language when OS regional settings differ from browser language; month names now consistently display in English. [#22454](https://github.com/open-webui/open-webui/pull/22454) +- 🔐 **OAuth error URL encoding.** Fixed OAuth error messages with special characters causing malformed redirect URLs; error messages are now properly URL-encoded. [#22415](https://github.com/open-webui/open-webui/pull/22415) +- 🛠️ **Internal tool method filtering.** Tools no longer expose internal methods starting with underscore to the LLM, reducing clutter and improving accuracy. [#22408](https://github.com/open-webui/open-webui/pull/22408) +- 🔊 **Azure TTS locale extraction.** Fixed Azure text-to-speech using incomplete locale codes in SSML; now correctly uses full locale like "en-US" instead of just "en". [#22443](https://github.com/open-webui/open-webui/pull/22443) +- 🎤 **Azure speech transcription errors.** Improved Azure AI Speech error handling to display user-friendly messages instead of generic connection errors; empty transcripts, no language identified, and other Azure-specific errors now show clear descriptions. [#20485](https://github.com/open-webui/open-webui/issues/20485) +- 📊 **Analytics group filtering.** Fixed token usage analytics not being filtered by user group; the query now properly respects group filters like other analytics metrics. [#22167](https://github.com/open-webui/open-webui/pull/22167) +- 🔍 **Web search favicon fallback.** Fixed web search sources showing broken image icons when favicons couldn't be loaded from external sources; now falls back to the default Open WebUI favicon. [#21897](https://github.com/open-webui/open-webui/pull/21897) +- 🔄 **Custom model fallback.** Fixed custom model fallback not working when the base model is unavailable; the base model ID is now correctly retrieved from model info instead of empty params. [#22456](https://github.com/open-webui/open-webui/issues/22456) +- 🖼️ **Pending message image display.** Fixed images in queued messages appearing blank; image thumbnails are now properly displayed in the pending message queue. [#22256](https://github.com/open-webui/open-webui/issues/22256) +- 🛠️ **File metadata sanitization.** Fixed file uploads failing with JSON serialization errors when metadata contained non-serializable objects like callable functions; metadata is now sanitized before database insertion. [#20561](https://github.com/open-webui/open-webui/issues/20561) + ## [0.8.9] - 2026-03-07 ### Added From 97cc94756e92f481e8ea58da3002db39bfad17fc Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 8 Mar 2026 19:00:50 -0500 Subject: [PATCH 31/33] chore: bump --- CHANGELOG.md | 5 ++--- backend/open_webui/routers/audio.py | 4 +--- backend/open_webui/utils/misc.py | 4 +++- package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 722ed6717..250d70cc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,10 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- ⚡ **API call optimization.** Reduced excessive API calls when hovering over the model selector or scrolling through chat history by adding a 30-second cooldown to model list fetches and a 200ms debounce to chat loading. [#22457](https://github.com/open-webui/open-webui/pull/22457) -- 🗄️ **MariaDB Vector support.** Added MariaDB Vector as a new vector database backend, enabling deployments with VECTOR_DB=mariadb-vector; supports cosine and euclidean distance strategies with configurable HNSW indexing. [#21931](https://github.com/open-webui/open-webui/pull/21931) -- 📝 **Task message truncation.** Chat messages sent to task models for title and tag generation can now be truncated using a filter in the prompt template, reducing token usage and processing time for long conversations. [#21499](https://github.com/open-webui/open-webui/issues/21499) - 🔐 **Custom OIDC logout endpoint.** Administrators can now configure a custom OpenID Connect logout URL via OPENID_END_SESSION_ENDPOINT, enabling logout functionality for OIDC providers that require custom endpoints like AWS Cognito. [Commit](https://github.com/open-webui/open-webui/commit/3f350f865920daf2844769a758b2d2e6a7ee3efa) +- 🗄️ **MariaDB Vector community support.** Added MariaDB Vector as a new vector database backend, enabling deployments with VECTOR_DB=mariadb-vector; supports cosine and euclidean distance strategies with configurable HNSW indexing. [#21931](https://github.com/open-webui/open-webui/pull/21931) +- 📝 **Task message truncation.** Chat messages sent to task models for title and tag generation can now be truncated using a filter in the prompt template, reducing token usage and processing time for long conversations. [#21499](https://github.com/open-webui/open-webui/issues/21499) - 🔄 **General improvements.** Various improvements were implemented across the application to enhance performance, stability, and security. - 🌐 Translations for Portuguese (Brazil), Spanish, and Malay were enhanced and expanded. diff --git a/backend/open_webui/routers/audio.py b/backend/open_webui/routers/audio.py index 41b6a07c1..a1f3ac523 100644 --- a/backend/open_webui/routers/audio.py +++ b/backend/open_webui/routers/audio.py @@ -859,9 +859,7 @@ def transcription_handler(request, file_path, metadata, user=None): res = r.json() # Azure returns {"code": "...", "message": "...", "innerError": {...}} if "code" in res and "message" in res: - azure_code = res.get("innerError", {}).get( - "code", res["code"] - ) + azure_code = res.get("innerError", {}).get("code", res["code"]) user_facing_codes = { "EmptyAudioFile", "AudioLengthLimitExceeded", diff --git a/backend/open_webui/utils/misc.py b/backend/open_webui/utils/misc.py index bab1bb4bb..643648862 100644 --- a/backend/open_webui/utils/misc.py +++ b/backend/open_webui/utils/misc.py @@ -588,7 +588,9 @@ def _sanitize(obj): if not callable(v) and _is_serializable(v) } if isinstance(obj, list): - return [_sanitize(v) for v in obj if not callable(v) and _is_serializable(v)] + return [ + _sanitize(v) for v in obj if not callable(v) and _is_serializable(v) + ] if callable(obj): return None # Last resort: try to see if it's serializable diff --git a/package-lock.json b/package-lock.json index 5a359dd05..04f397331 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "open-webui", - "version": "0.8.9", + "version": "0.8.10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "open-webui", - "version": "0.8.9", + "version": "0.8.10", "dependencies": { "@azure/msal-browser": "^4.5.0", "@codemirror/lang-javascript": "^6.2.2", diff --git a/package.json b/package.json index 49a72efa3..1eb043de5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-webui", - "version": "0.8.9", + "version": "0.8.10", "private": true, "scripts": { "dev": "npm run pyodide:fetch && vite dev --host", From c6a1469fada032ec92e3c40f296cce12dde901fb Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 8 Mar 2026 19:05:15 -0500 Subject: [PATCH 32/33] refac --- backend/open_webui/retrieval/vector/dbs/elasticsearch.py | 4 ++++ backend/open_webui/retrieval/vector/dbs/mariadb_vector.py | 4 ++++ backend/open_webui/retrieval/vector/dbs/milvus.py | 4 ++++ .../open_webui/retrieval/vector/dbs/milvus_multitenancy.py | 4 ++++ backend/open_webui/retrieval/vector/dbs/opengauss.py | 4 ++++ backend/open_webui/retrieval/vector/dbs/opensearch.py | 4 ++++ backend/open_webui/retrieval/vector/dbs/oracle23ai.py | 2 ++ backend/open_webui/retrieval/vector/dbs/pinecone.py | 4 ++++ backend/open_webui/retrieval/vector/dbs/qdrant.py | 4 ++++ .../open_webui/retrieval/vector/dbs/qdrant_multitenancy.py | 4 ++++ backend/open_webui/retrieval/vector/dbs/s3vector.py | 4 ++++ backend/open_webui/retrieval/vector/dbs/weaviate.py | 4 ++++ 12 files changed, 46 insertions(+) diff --git a/backend/open_webui/retrieval/vector/dbs/elasticsearch.py b/backend/open_webui/retrieval/vector/dbs/elasticsearch.py index e209453f5..dfb02ec02 100644 --- a/backend/open_webui/retrieval/vector/dbs/elasticsearch.py +++ b/backend/open_webui/retrieval/vector/dbs/elasticsearch.py @@ -1,3 +1,7 @@ +""" +NOTE: This vector database integration is community-supported and maintained on a best-effort basis. +""" + from elasticsearch import Elasticsearch, BadRequestError from typing import Optional import ssl diff --git a/backend/open_webui/retrieval/vector/dbs/mariadb_vector.py b/backend/open_webui/retrieval/vector/dbs/mariadb_vector.py index b1b899626..dfcfb3da5 100644 --- a/backend/open_webui/retrieval/vector/dbs/mariadb_vector.py +++ b/backend/open_webui/retrieval/vector/dbs/mariadb_vector.py @@ -1,3 +1,7 @@ +""" +NOTE: This vector database integration is community-supported and maintained on a best-effort basis. +""" + from __future__ import annotations import array diff --git a/backend/open_webui/retrieval/vector/dbs/milvus.py b/backend/open_webui/retrieval/vector/dbs/milvus.py index 35cf6b382..4dcf76c64 100644 --- a/backend/open_webui/retrieval/vector/dbs/milvus.py +++ b/backend/open_webui/retrieval/vector/dbs/milvus.py @@ -1,3 +1,7 @@ +""" +NOTE: This vector database integration is community-supported and maintained on a best-effort basis. +""" + from pymilvus import MilvusClient as Client from pymilvus import FieldSchema, DataType from pymilvus import connections, Collection diff --git a/backend/open_webui/retrieval/vector/dbs/milvus_multitenancy.py b/backend/open_webui/retrieval/vector/dbs/milvus_multitenancy.py index c58189b2a..0ecbac15d 100644 --- a/backend/open_webui/retrieval/vector/dbs/milvus_multitenancy.py +++ b/backend/open_webui/retrieval/vector/dbs/milvus_multitenancy.py @@ -1,3 +1,7 @@ +""" +NOTE: This vector database integration is community-supported and maintained on a best-effort basis. +""" + import logging from typing import Optional, Tuple, List, Dict, Any diff --git a/backend/open_webui/retrieval/vector/dbs/opengauss.py b/backend/open_webui/retrieval/vector/dbs/opengauss.py index 7d4f9ea09..679847a1d 100644 --- a/backend/open_webui/retrieval/vector/dbs/opengauss.py +++ b/backend/open_webui/retrieval/vector/dbs/opengauss.py @@ -1,3 +1,7 @@ +""" +NOTE: This vector database integration is community-supported and maintained on a best-effort basis. +""" + from typing import Optional, List, Dict, Any import logging import re diff --git a/backend/open_webui/retrieval/vector/dbs/opensearch.py b/backend/open_webui/retrieval/vector/dbs/opensearch.py index ed5a931c6..3ad82d744 100644 --- a/backend/open_webui/retrieval/vector/dbs/opensearch.py +++ b/backend/open_webui/retrieval/vector/dbs/opensearch.py @@ -1,3 +1,7 @@ +""" +NOTE: This vector database integration is community-supported and maintained on a best-effort basis. +""" + from opensearchpy import OpenSearch from opensearchpy.helpers import bulk from typing import Optional diff --git a/backend/open_webui/retrieval/vector/dbs/oracle23ai.py b/backend/open_webui/retrieval/vector/dbs/oracle23ai.py index f4258c9ef..10428de38 100644 --- a/backend/open_webui/retrieval/vector/dbs/oracle23ai.py +++ b/backend/open_webui/retrieval/vector/dbs/oracle23ai.py @@ -1,4 +1,6 @@ """ +NOTE: This vector database integration is community-supported and maintained on a best-effort basis. + Oracle 23ai Vector Database Client - Fixed Version # .env diff --git a/backend/open_webui/retrieval/vector/dbs/pinecone.py b/backend/open_webui/retrieval/vector/dbs/pinecone.py index 156894bc9..27bc50b70 100644 --- a/backend/open_webui/retrieval/vector/dbs/pinecone.py +++ b/backend/open_webui/retrieval/vector/dbs/pinecone.py @@ -1,3 +1,7 @@ +""" +NOTE: This vector database integration is community-supported and maintained on a best-effort basis. +""" + from typing import Optional, List, Dict, Any, Union import logging import time # for measuring elapsed time diff --git a/backend/open_webui/retrieval/vector/dbs/qdrant.py b/backend/open_webui/retrieval/vector/dbs/qdrant.py index d42984e1d..e774bb875 100644 --- a/backend/open_webui/retrieval/vector/dbs/qdrant.py +++ b/backend/open_webui/retrieval/vector/dbs/qdrant.py @@ -1,3 +1,7 @@ +""" +NOTE: This vector database integration is community-supported and maintained on a best-effort basis. +""" + from typing import Optional import logging from urllib.parse import urlparse diff --git a/backend/open_webui/retrieval/vector/dbs/qdrant_multitenancy.py b/backend/open_webui/retrieval/vector/dbs/qdrant_multitenancy.py index f87f85a23..5ad2ac692 100644 --- a/backend/open_webui/retrieval/vector/dbs/qdrant_multitenancy.py +++ b/backend/open_webui/retrieval/vector/dbs/qdrant_multitenancy.py @@ -1,3 +1,7 @@ +""" +NOTE: This vector database integration is community-supported and maintained on a best-effort basis. +""" + import logging from typing import Optional, Tuple, List, Dict, Any from urllib.parse import urlparse diff --git a/backend/open_webui/retrieval/vector/dbs/s3vector.py b/backend/open_webui/retrieval/vector/dbs/s3vector.py index 4a1e70cdc..1a30e04e5 100644 --- a/backend/open_webui/retrieval/vector/dbs/s3vector.py +++ b/backend/open_webui/retrieval/vector/dbs/s3vector.py @@ -1,3 +1,7 @@ +""" +NOTE: This vector database integration is community-supported and maintained on a best-effort basis. +""" + from open_webui.retrieval.vector.utils import process_metadata from open_webui.retrieval.vector.main import ( VectorDBBase, diff --git a/backend/open_webui/retrieval/vector/dbs/weaviate.py b/backend/open_webui/retrieval/vector/dbs/weaviate.py index dcc648c78..c9b09ad63 100644 --- a/backend/open_webui/retrieval/vector/dbs/weaviate.py +++ b/backend/open_webui/retrieval/vector/dbs/weaviate.py @@ -1,3 +1,7 @@ +""" +NOTE: This vector database integration is community-supported and maintained on a best-effort basis. +""" + import weaviate import re import uuid From afd09b033d8f065ff7efec63dcd84f5ce07c0445 Mon Sep 17 00:00:00 2001 From: orenzhang <41963680+OrenZhang@users.noreply.github.com> Date: Mon, 9 Mar 2026 13:28:13 +0800 Subject: [PATCH 33/33] chore(repo): merge from remote --- CHANGELOG_EXTRA.md | 6 + src/lib/i18n/locales/en-US/translation.json | 143 ++++++++++++++++++++ src/lib/i18n/locales/zh-CN/translation.json | 2 +- 3 files changed, 150 insertions(+), 1 deletion(-) diff --git a/CHANGELOG_EXTRA.md b/CHANGELOG_EXTRA.md index be0201145..cc3bd517c 100644 --- a/CHANGELOG_EXTRA.md +++ b/CHANGELOG_EXTRA.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.8.10.1] - 2026.03.09 + +### Changed + +- 合并官方 0.8.10 改动 + ## [0.8.9.1] - 2026.03.08 ### Changed diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index 40b81d871..5b45e7560 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -68,6 +68,7 @@ "Add Connection": "", "Add Content": "", "Add content here": "", + "Add Credit": "", "Add Custom Parameter": "", "Add Custom Prompt": "", "Add Details": "", @@ -105,7 +106,14 @@ "Advanced parameters for MinerU parsing (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)": "", "Advanced Params": "", "After updating or changing the embedding model, you must reindex the knowledge base for the changes to take effect. You can do this using the \"Reindex\" button below.": "", + "After verify, will auto change to role User": "", "AI": "", + "Alipay": "", + "Alipay App Private Key": "", + "Alipay AppID": "", + "Alipay Product Code": "", + "Alipay Public Key": "", + "Alipay Server URL": "", "All": "", "All chats have been unarchived.": "", "All models are now hidden": "", @@ -146,6 +154,7 @@ "Always Expand Details": "", "Always Play Notification Sound": "", "Amazing": "", + "Amount must be greater than 0": "", "an assistant": "", "An error occurred while fetching the explanation": "", "Analytics": "", @@ -215,6 +224,7 @@ "AUTOMATIC1111 Base URL": "", "AUTOMATIC1111 Base URL is required.": "", "Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "", + "Available": "", "Available list": "", "Available models": "", "Available Tools": "", @@ -228,6 +238,7 @@ "Back": "", "Bad Response": "", "Banners": "", + "Base Configuration": "", "Base Model (From)": "", "Base Model List Cache speeds up access by fetching base models only at startup or on settings save—faster, but may not show recent base model changes.": "", "Bearer": "", @@ -256,6 +267,7 @@ "Bypass Embedding and Retrieval": "", "Bypass Web Loader": "", "Cache Base Model List": "", + "Calculate Token": "", "Calendar": "", "Call": "", "Call feature is not supported when using Web STT engine": "", @@ -264,6 +276,7 @@ "Cancel download of {{model}}": "", "Cannot create an empty note.": "", "Cannot delete the production version": "", + "Cannot edit a used redemption code": "", "Capabilities": "", "Capture": "", "Capture Audio": "", @@ -281,6 +294,7 @@ "Channels": "", "Character": "", "Character limit for autocomplete generation input": "", + "Charge Amount Control": "", "Chart new frontiers": "", "Chat": "", "Chat archived.": "", @@ -370,6 +384,10 @@ "Comment": "", "Commit Message": "", "Community Reviews": "", + "Completion Long Ctx Threshold": "", + "Completion Long Ctx Token Price": "", + "Completion Price For 1M Tokens": "", + "Completion Token Price": "", "Completions": "", "Compress Images in Channels": "", "Concurrent Requests": "", @@ -426,6 +444,8 @@ "Copying to clipboard was successful!": "", "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Could not read file.": "", + "Count": "", + "Count must be between 1 and 1000": "", "Create": "", "Create a knowledge base": "", "Create a model": "", @@ -441,14 +461,24 @@ "Create new secret key": "", "Create note": "", "Create Note": "", + "Create Redemption Code": "", + "Create Redemption Codes": "", "Create your first note by clicking on the plus button below.": "", "Created at": "", "Created At": "", "Created by": "", "Created by you": "", "Created on {{date}}": "", + "Creating...": "", + "Credit": "", + "Credit amount": "", + "Credit Amount": "", + "Credit Exchange Ratio": "", + "Credit Log": "", + "Credit Statistics": "", "CSV Import": "", "Ctrl+Enter to Send": "", + "Currency Amount": "", "Current Model": "", "Current Password": "", "Custom": "", @@ -456,12 +486,14 @@ "Custom Gender": "", "Custom Parameter Name": "", "Custom Parameter Value": "", + "Custom Price Configuration": "", "Daily Messages": "", "Danger Zone": "", "Dark": "", "Data Controls": "", "Database": "", "Datalab Marker API": "", + "Date": "", "DD/MM/YYYY": "", "DDGS Backend": "", "December": "", @@ -471,7 +503,9 @@ "Default (Open AI)": "", "Default (SentenceTransformers)": "", "Default action buttons will be used.": "", + "Default Credit for User": "", "Default description enabled": "", + "Default Encoding Model": "", "Default Features": "", "Default Filters": "", "Default Group": "", @@ -487,6 +521,8 @@ "Default User Role": "", "Defaults": "", "Delete": "", + "Delete {{count}} Logs Successfully_one": "", + "Delete {{count}} Logs Successfully_other": "", "Delete {{name}}": "", "Delete a model": "", "Delete All": "", @@ -494,9 +530,11 @@ "Delete all contents inside this folder": "", "Delete Chat": "", "Delete chat?": "", + "Delete Credit Logs Before This Time": "", "Delete File": "", "Delete folder?": "", "Delete function?": "", + "Delete Logs": "", "Delete Message": "", "Delete message?": "", "Delete Model": "", @@ -616,6 +654,7 @@ "Edit Last Message": "", "Edit Memory": "", "Edit Prompt": "", + "Edit Redemption Code": "", "Edit Terminal Connection": "", "Edit User": "", "Edit User Group": "", @@ -633,6 +672,7 @@ "Embedding Concurrent Requests": "", "Embedding Model": "", "Embedding Model Engine": "", + "Embedding Price": "", "Empty message": "", "Enable All": "", "Enable API Keys": "", @@ -646,6 +686,7 @@ "Enable Message Rating": "", "Enable Mirostat sampling for controlling perplexity.": "", "Enable New Sign Ups": "", + "Enable Sign Up Verify": "", "Enable, disable, or customize the reasoning tags used by the model. \"Enabled\" uses default tags, \"Disabled\" turns off reasoning tags, and \"Custom\" lets you specify your own start and end tags.": "", "Enabled": "", "End Tag": "", @@ -703,6 +744,7 @@ "Enter Image Size (e.g. 512x512)": "", "Enter Jina API Base URL": "", "Enter Jina API Key": "", + "Enter JSON array configuration": "", "Enter JSON config (e.g., {\"disable_links\": true})": "", "Enter Jupyter Password": "", "Enter Jupyter Token": "", @@ -756,6 +798,8 @@ "Enter to Send": "", "Enter Top K": "", "Enter Top K Reranker": "", + "Enter topic for these codes": "", + "Enter topic for this code": "", "Enter URL (e.g. http://127.0.0.1:7860/)": "", "Enter URL (e.g. http://localhost:11434)": "", "Enter value": "", @@ -776,6 +820,7 @@ "Enter Your Name": "", "Enter your new password": "", "Enter Your Password": "", + "Enter your redemption code": "", "Enter Your Role": "", "Enter Your Username": "", "Enter your webhook URL": "", @@ -804,6 +849,10 @@ "Executing **{{NAME}}**...": "", "Expand": "", "Experimental": "", + "Expiration Time": "", + "Expiration time must be in the future": "", + "Expired": "", + "Expired At": "", "Explain": "", "Explore the cosmos": "", "Export": "", @@ -811,9 +860,11 @@ "Export All Chats (All Users)": "", "Export chat (.json)": "", "Export Chats": "", + "Export completed": "", "Export Config": "", "Export Models": "", "Export Prompts": "", + "Export Redemption Codes": "", "Export to CSV": "", "Export Tools": "", "Export Users": "", @@ -824,6 +875,11 @@ "External Web Loader URL": "", "External Web Search API Key": "", "External Web Search URL": "", + "EZFP Endpoint": "", + "EZFP Key": "", + "EZFP Pay Type Priority": "", + "EZFP Payment": "", + "EZFP PID": "", "Fade Effect for Streaming Text": "", "Failed to add file.": "", "Failed to add members": "", @@ -861,6 +917,7 @@ "Failed to update settings": "", "Failed to update status": "", "Failed to upload file.": "", + "Feature Price": "", "Features": "", "Features Permissions": "", "February": "", @@ -917,6 +974,9 @@ "Follow up: {{question}}": "", "Follow-Up Auto-Generation": "", "Followed instructions perfectly": "", + "For 1M requests": "", + "For example: 10-20,30,40-50": "", + "For multiple configurations, use commas (,) to separate them, and use a hyphen (-) for ranges": "", "for placeholders": "", "Force OCR": "", "Force OCR on all pages of the PDF. This can lead to worse results if you have good text in your PDFs. Defaults to False.": "", @@ -943,6 +1003,7 @@ "Functions": "", "Functions allow arbitrary code execution.": "", "Functions imported successfully": "", + "Fuzzy Search Username": "", "Gemini": "", "Gemini API Key": "", "Gemini API Key is required.": "", @@ -1012,6 +1073,8 @@ "ID": "", "ID cannot contain \":\" or \"|\" characters": "", "ID copied to clipboard": "", + "If empty, will use username as the from address": "", + "If there is no Usage returned, and the model cannot be matched, then use the tiktoken encoder of this model to calculate the Token": "", "iframe Sandbox Allow Forms": "", "iframe Sandbox Allow Same Origin": "", "Ignite curiosity": "", @@ -1079,6 +1142,7 @@ "Jina API Key": "", "join our Discord for help.": "", "JSON": "", + "JSON array configuration for custom function/tool billing patterns of 1M requests, e.g. [{\"name\": \"web search\", \"path\": \"$.tools[*].type\", \"value\": \"web_search_preview\", \"exists\": false, \"cost\": 1000000}]": "", "JSON Preview": "", "JSON Spec": "", "July": "", @@ -1129,6 +1193,7 @@ "Learn more about Voxtral transcription.": "", "Leave a public review for {{modelName}}": "", "Leave empty for no compression": "", + "Leave empty for no expiration": "", "Leave empty for unlimited": "", "Leave empty to include all models from \"{{url}}\" endpoint": "", "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "", @@ -1151,6 +1216,7 @@ "Live": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "", + "Load More": "", "Loader": "", "Loading Kokoro.js...": "", "Loading...": "", @@ -1158,6 +1224,7 @@ "Local": "", "Local Task Model": "", "Location access not allowed": "", + "Long Context Configuration": "", "Lost": "", "Low": "", "LTR": "", @@ -1215,6 +1282,8 @@ "Microsoft OneDrive (work/school)": "", "MinerU": "", "MinerU API Key required for Cloud API mode.": "", + "Minimum Cost Per Request": "", + "Minimum Credit Required": "", "Mistral OCR": "", "Mistral OCR API Key required.": "", "MistralAI": "", @@ -1233,11 +1302,13 @@ "Model can search the web for information": "", "Model Capabilities": "", "Model created successfully!": "", + "Model Credit Cost": "", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "", "Model Filtering": "", "Model ID": "", "Model ID is required.": "", "Model IDs": "", + "Model Logo URL": "", "Model Name": "", "Model name already exists, please choose a different one": "", "Model Name is required.": "", @@ -1247,7 +1318,9 @@ "Model Parameters": "", "Model Params": "", "Model Permissions": "", + "Model Prefix to Remove": "", "Model responses or outputs": "", + "Model Tokens Cost": "", "Model unloaded successfully": "", "Model updated successfully": "", "Model Usage": "", @@ -1294,6 +1367,7 @@ "No access grants. Private to you.": "", "No activity data": "", "No authentication": "", + "No Charge When Empty Response": "", "No chats found": "", "No chats found for this user.": "", "No chats found.": "", @@ -1301,6 +1375,7 @@ "No content found": "", "No content to speak": "", "No conversation to save": "", + "No Credit Message": "", "No data": "", "No data found": "", "No distance available": "", @@ -1318,6 +1393,7 @@ "No kernel": "", "No knowledge bases found.": "", "No knowledge found": "", + "No Log": "", "No memories to clear": "", "No model IDs": "", "No models available": "", @@ -1328,6 +1404,7 @@ "No one": "", "No pinned messages": "", "No prompts found": "", + "No redemption code selected": "", "No results": "", "No results found": "", "No search query generated": "", @@ -1359,6 +1436,7 @@ "Notification Webhook": "", "Notifications": "", "November": "", + "Number of redemption codes": "", "OAuth": "", "OAuth 2.1": "", "OAuth ID": "", @@ -1388,6 +1466,7 @@ "Oops! There are files still uploading. Please wait for the upload to complete.": "", "Oops! There was an error in the previous response.": "", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "", + "Open Delete Log Modal": "", "Open file": "", "Open in full screen": "", "Open link": "", @@ -1415,11 +1494,13 @@ "OpenAPI": "", "OpenAPI Spec": "", "openapi.json URL or Path": "", + "OpenWebUI Host": "", "optional": "", "Optional": "", "or": "", "Ordered List": "", "Other": "", + "Other Configuration": "", "Output": "", "OUTPUT": "", "Output format": "", @@ -1435,6 +1516,7 @@ "Password": "", "Passwords do not match.": "", "Paste Large Text as File": "", + "Pay Type": "", "PDF document (.pdf)": "", "PDF Extract Images (OCR)": "", "PDF Loader Mode": "", @@ -1469,15 +1551,20 @@ "Playwright Timeout (ms)": "", "Playwright WebSocket URL": "", "Please carefully review the following warnings:": "", + "Please check your email inbox for the activation link.": "", "Please do not close the settings page while loading the model.": "", + "Please enter a keyword to export": "", "Please enter a message or attach a file.": "", "Please enter a prompt": "", "Please enter a valid ID": "", "Please enter a valid JSON spec": "", "Please enter a valid path": "", + "Please enter a valid redemption code": "", "Please enter a valid URL": "", "Please enter a valid URL.": "", "Please fill in all fields.": "", + "Please input amount": "", + "Please refresh after payment": "", "Please register the OAuth client": "", "Please save the connection to persist the OAuth client information and do not change the ID": "", "Please select a model first.": "", @@ -1485,6 +1572,7 @@ "Please select a reason": "", "Please select a valid JSON file": "", "Please select at least one user for Direct Message channel.": "", + "Please use a private key in PKCS#1 format. You can convert it using a format-conversion tool.": "", "Please wait until all files are uploaded.": "", "Port": "", "Ports": "", @@ -1497,16 +1585,24 @@ "Previous 30 days": "", "Previous 7 days": "", "Previous message": "Previous message", + "Price": "", + "Price For 1M Requests": "", "Private": "", "Private conversation between selected users": "", "Production version updated": "", "Profile": "", "Prompt": "", "Prompt Autocompletion": "", + "Prompt Cache Configuration": "", + "Prompt Cache Price For 1M Tokens": "", "Prompt Content": "", "Prompt created successfully": "", + "Prompt Long Ctx Threshold": "", + "Prompt Long Ctx Token Price": "", "Prompt Name": "", + "Prompt Price For 1M Tokens": "", "Prompt Suggestions": "", + "Prompt Token Price": "", "Prompt updated successfully": "", "Prompts": "", "Prompts Access": "", @@ -1518,6 +1614,7 @@ "Pull a model from Ollama.com": "", "Pull Model": "", "Pyodide file browser": "", + "QRCode": "", "Query Generation Prompt": "", "Querying": "", "Quick Actions": "", @@ -1535,6 +1632,16 @@ "Reasoning Tags": "", "Record": "", "Record voice": "", + "Redeem": "", + "Redeem Code": "", + "Redeem Credit Code": "", + "Redemption Code": "", + "Redemption code applied successfully": "", + "Redemption code deleted successfully": "", + "Redemption code updated successfully": "", + "Redemption Codes": "", + "Redemption Information": "", + "Redirect Link": "", "Redirecting you to Open WebUI Community": "", "Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "", "Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "", @@ -1559,6 +1666,7 @@ "Remove": "", "Remove {{MODELID}} from list.": "", "Remove action": "", + "Remove characters that prefix matched": "", "Remove file": "", "Remove File": "", "Remove from favorites": "", @@ -1571,6 +1679,8 @@ "Reply in Thread": "", "Reply to thread...": "", "Replying to {{NAME}}": "", + "Request Price": "", + "Request price has higher priority than token price": "", "required": "", "Reranking Engine": "", "Reranking Model": "", @@ -1616,6 +1726,7 @@ "Search and manage user memories": "", "Search and view user chat history": "", "Search Base": "", + "Search by code or topic": "", "Search channels and channel messages": "", "Search Chats": "", "Search Collection": "", @@ -1649,6 +1760,7 @@ "Searching the web": "", "Searxng Query URL": "", "Searxng search language (all, en, es, de, fr, etc.)": "", + "Second revision by OVINC CN": "", "See readme.md for instructions": "", "See what's new": "", "Seed": "", @@ -1749,6 +1861,7 @@ "Sign in to {{WEBUI_NAME}} with LDAP": "", "Sign Out": "", "Sign up": "", + "Sign Up Email Domain Whitelist": "", "Sign up to {{WEBUI_NAME}}": "", "Significantly improves accuracy by using an LLM to enhance tables, forms, inline math, and layout detection. Will increase latency. Defaults to False.": "", "Signing in to {{WEBUI_NAME}}": "", @@ -1769,6 +1882,11 @@ "Skills Sharing": "", "Skip Cache": "", "Skip the cache and re-run the inference. Defaults to False.": "", + "SMTP Host": "", + "SMTP Password": "", + "SMTP Port": "", + "SMTP Sent From": "", + "SMTP Username": "", "Something went wrong :/": "", "Sonar": "", "Sonar Deep Research": "", @@ -1809,10 +1927,12 @@ "STT Model": "", "STT Settings": "", "Stylized PDF Export": "", + "Submit": "", "Submit question": "", "Submit suggestion": "", "Subtitle": "", "Success": "", + "Successfully created {{total}} redemption codes": "", "Successfully imported {{userCount}} users.": "", "Successfully updated.": "", "Suggest a change": "", @@ -1853,11 +1973,17 @@ "Text-to-Speech": "", "Text-to-Speech Engine": "", "Thanks for your feedback!": "", + "The above values mean that only 10-20 yuan, 30 yuan, and 40-50 yuan can be recharged.": "", + "The address of your service must be accessible by Alipay; do not include any paths, only the HTTP protocol and the domain name": "", + "The address of your service must be accessible by Epay; do not include any paths, only the HTTP protocol and the domain name": "", + "The allowed range of recharge amounts; if not set, there is no limit": "", "The Application Account DN you bind with for search": "", "The base to search for users": "", "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.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The exchange ratio of legal currency to credit: 1:{{ratio}}; Currently Equal to {{credit}} credit": "", + "The exchange ratio of legal currency to credit. If you need a discount, please set it to be greater than 1": "", "The format to return a response in. Format can be json or a JSON schema.": "", "The height in pixels to compress images to. Leave empty for no compression.": "", "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", @@ -1891,6 +2017,7 @@ "This option enables or disables the use of the reasoning feature in Ollama, which allows the model to think before generating a response. When enabled, the model can take a moment to process the conversation context and generate a more thoughtful response.": "", "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "", + "This redemption code has already been used and cannot be edited": "", "This response was generated by \"{{model}}\"": "", "This will delete": "", "This will delete {{NAME}} and all its contents.": "", @@ -1908,6 +2035,7 @@ "Tiktoken": "", "Time & Calculation": "", "Timeout": "", + "Timestamp cannot be empty": "", "Title": "", "Title Auto-Generation": "", "Title cannot be an empty string.": "", @@ -1953,6 +2081,12 @@ "Top": "", "Top K": "", "Top K Reranker": "", + "Topic": "", + "Topic is required": "", + "Total Credit Cost": "", + "Total Payment": "", + "Total Token Cost": "", + "Trace ticket qrcode pay to input QR_CODE_OFFLINE": "", "Transformers": "", "Trouble accessing Ollama?": "", "Trust Proxy Environment": "", @@ -1971,6 +2105,7 @@ "Unarchive All Archived Chats": "", "Unarchive Chat": "", "Underline": "", + "Unit: 1M tokens or 1M requests": "", "Unknown": "", "Unknown User": "", "Unloads {{FROM_NOW}}": "", @@ -1989,6 +2124,7 @@ "Updated": "", "Updated at": "", "Updated At": "", + "Updating...": "", "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "", "Upload": "", "Upload a GGUF model": "", @@ -2016,14 +2152,20 @@ "Use LLM": "", "Use no proxy to fetch page contents.": "", "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", + "Used": "", + "Used At": "", + "Used By": "", "user": "", "User": "", "User Activity": "", + "User Credit Cost": "", "User Groups": "", "User location successfully retrieved.": "", "User menu": "", + "User Payment Stats": "", "User ratings (thumbs up/down)": "", "User Status": "", + "User Tokens Cost": "", "User Webhooks": "", "Username": "", "users": "", @@ -2101,6 +2243,7 @@ "Write a summary in 50 words that summarizes {{topic}}.": "", "Write something...": "", "Write your model system prompt content here\ne.g.) You are Mario from Super Mario Bros, acting as an assistant.": "Write your model system prompt content here\n e.g.) You are Mario from Super Mario Bros, acting as an assistant.", + "WXPay": "", "Yacy Instance URL": "", "Yacy Password": "", "Yacy Username": "", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 621a922b7..f2a4c5d3b 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -671,8 +671,8 @@ "Embedding Concurrent Requests": "嵌入并发请求数", "Embedding Model": "嵌入模型", "Embedding Model Engine": "嵌入模型引擎", - "Empty message": "", "Embedding Price": "嵌入价格", + "Empty message": "", "Enable All": "全部启用", "Enable API Keys": "启用接口密钥", "Enable autocomplete generation for chat messages": "启用对话输入框内容自动补全",