Unverified Commit 3e0d9ad7 authored by Timothy Jaeryang Baek's avatar Timothy Jaeryang Baek Committed by GitHub
Browse files

Merge branch 'dev' into feat/cancel-model-download

parents e008738f 85187deb
from fastapi import FastAPI, Request, Response, HTTPException, Depends, status
from fastapi import (
FastAPI,
Request,
Response,
HTTPException,
Depends,
status,
UploadFile,
File,
BackgroundTasks,
)
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import StreamingResponse
from fastapi.concurrency import run_in_threadpool
from pydantic import BaseModel, ConfigDict
import os
import copy
import random
import requests
import json
import uuid
import aiohttp
import asyncio
from urllib.parse import urlparse
from typing import Optional, List, Union
from apps.web.models.users import Users
from constants import ERROR_MESSAGES
from utils.utils import decode_token, get_current_user, get_admin_user
from config import OLLAMA_BASE_URLS, MODEL_FILTER_ENABLED, MODEL_FILTER_LIST
from utils.misc import calculate_sha256
from typing import Optional, List, Union
from config import OLLAMA_BASE_URLS, MODEL_FILTER_ENABLED, MODEL_FILTER_LIST, UPLOAD_DIR
app = FastAPI()
......@@ -913,6 +929,211 @@ async def generate_openai_chat_completion(
)
class UrlForm(BaseModel):
url: str
class UploadBlobForm(BaseModel):
filename: str
def parse_huggingface_url(hf_url):
try:
# Parse the URL
parsed_url = urlparse(hf_url)
# Get the path and split it into components
path_components = parsed_url.path.split("/")
# Extract the desired output
user_repo = "/".join(path_components[1:3])
model_file = path_components[-1]
return model_file
except ValueError:
return None
async def download_file_stream(
ollama_url, file_url, file_path, file_name, chunk_size=1024 * 1024
):
done = False
if os.path.exists(file_path):
current_size = os.path.getsize(file_path)
else:
current_size = 0
headers = {"Range": f"bytes={current_size}-"} if current_size > 0 else {}
timeout = aiohttp.ClientTimeout(total=600) # Set the timeout
async with aiohttp.ClientSession(timeout=timeout) as session:
async with session.get(file_url, headers=headers) as response:
total_size = int(response.headers.get("content-length", 0)) + current_size
with open(file_path, "ab+") as file:
async for data in response.content.iter_chunked(chunk_size):
current_size += len(data)
file.write(data)
done = current_size == total_size
progress = round((current_size / total_size) * 100, 2)
yield f'data: {{"progress": {progress}, "completed": {current_size}, "total": {total_size}}}\n\n'
if done:
file.seek(0)
hashed = calculate_sha256(file)
file.seek(0)
url = f"{ollama_url}/api/blobs/sha256:{hashed}"
response = requests.post(url, data=file)
if response.ok:
res = {
"done": done,
"blob": f"sha256:{hashed}",
"name": file_name,
}
os.remove(file_path)
yield f"data: {json.dumps(res)}\n\n"
else:
raise "Ollama: Could not create blob, Please try again."
# def number_generator():
# for i in range(1, 101):
# yield f"data: {i}\n"
# url = "https://huggingface.co/TheBloke/stablelm-zephyr-3b-GGUF/resolve/main/stablelm-zephyr-3b.Q2_K.gguf"
@app.post("/models/download")
@app.post("/models/download/{url_idx}")
async def download_model(
form_data: UrlForm,
url_idx: Optional[int] = None,
):
if url_idx == None:
url_idx = 0
url = app.state.OLLAMA_BASE_URLS[url_idx]
file_name = parse_huggingface_url(form_data.url)
if file_name:
file_path = f"{UPLOAD_DIR}/{file_name}"
return StreamingResponse(
download_file_stream(url, form_data.url, file_path, file_name),
)
else:
return None
@app.post("/models/upload")
@app.post("/models/upload/{url_idx}")
def upload_model(file: UploadFile = File(...), url_idx: Optional[int] = None):
if url_idx == None:
url_idx = 0
ollama_url = app.state.OLLAMA_BASE_URLS[url_idx]
file_path = f"{UPLOAD_DIR}/{file.filename}"
# Save file in chunks
with open(file_path, "wb+") as f:
for chunk in file.file:
f.write(chunk)
def file_process_stream():
nonlocal ollama_url
total_size = os.path.getsize(file_path)
chunk_size = 1024 * 1024
try:
with open(file_path, "rb") as f:
total = 0
done = False
while not done:
chunk = f.read(chunk_size)
if not chunk:
done = True
continue
total += len(chunk)
progress = round((total / total_size) * 100, 2)
res = {
"progress": progress,
"total": total_size,
"completed": total,
}
yield f"data: {json.dumps(res)}\n\n"
if done:
f.seek(0)
hashed = calculate_sha256(f)
f.seek(0)
url = f"{ollama_url}/api/blobs/sha256:{hashed}"
response = requests.post(url, data=f)
if response.ok:
res = {
"done": done,
"blob": f"sha256:{hashed}",
"name": file.filename,
}
os.remove(file_path)
yield f"data: {json.dumps(res)}\n\n"
else:
raise Exception(
"Ollama: Could not create blob, Please try again."
)
except Exception as e:
res = {"error": str(e)}
yield f"data: {json.dumps(res)}\n\n"
return StreamingResponse(file_process_stream(), media_type="text/event-stream")
# async def upload_model(file: UploadFile = File(), url_idx: Optional[int] = None):
# if url_idx == None:
# url_idx = 0
# url = app.state.OLLAMA_BASE_URLS[url_idx]
# file_location = os.path.join(UPLOAD_DIR, file.filename)
# total_size = file.size
# async def file_upload_generator(file):
# print(file)
# try:
# async with aiofiles.open(file_location, "wb") as f:
# completed_size = 0
# while True:
# chunk = await file.read(1024*1024)
# if not chunk:
# break
# await f.write(chunk)
# completed_size += len(chunk)
# progress = (completed_size / total_size) * 100
# print(progress)
# yield f'data: {json.dumps({"status": "uploading", "percentage": progress, "total": total_size, "completed": completed_size, "done": False})}\n'
# except Exception as e:
# print(e)
# yield f"data: {json.dumps({'status': 'error', 'message': str(e)})}\n"
# finally:
# await file.close()
# print("done")
# yield f'data: {json.dumps({"status": "completed", "percentage": 100, "total": total_size, "completed": completed_size, "done": True})}\n'
# return StreamingResponse(
# file_upload_generator(copy.deepcopy(file)), media_type="text/event-stream"
# )
@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"])
async def deprecated_proxy(path: str, request: Request, user=Depends(get_current_user)):
url = app.state.OLLAMA_BASE_URLS[0]
......
......@@ -95,20 +95,6 @@ class ChatTable:
except:
return None
def update_chat_by_id(self, id: str, chat: dict) -> Optional[ChatModel]:
try:
query = Chat.update(
chat=json.dumps(chat),
title=chat["title"] if "title" in chat else "New Chat",
timestamp=int(time.time()),
).where(Chat.id == id)
query.execute()
chat = Chat.get(Chat.id == id)
return ChatModel(**model_to_dict(chat))
except:
return None
def get_chat_lists_by_user_id(
self, user_id: str, skip: int = 0, limit: int = 50
) -> List[ChatModel]:
......
......@@ -21,155 +21,6 @@ from constants import ERROR_MESSAGES
router = APIRouter()
class UploadBlobForm(BaseModel):
filename: str
from urllib.parse import urlparse
def parse_huggingface_url(hf_url):
try:
# Parse the URL
parsed_url = urlparse(hf_url)
# Get the path and split it into components
path_components = parsed_url.path.split("/")
# Extract the desired output
user_repo = "/".join(path_components[1:3])
model_file = path_components[-1]
return model_file
except ValueError:
return None
async def download_file_stream(url, file_path, file_name, chunk_size=1024 * 1024):
done = False
if os.path.exists(file_path):
current_size = os.path.getsize(file_path)
else:
current_size = 0
headers = {"Range": f"bytes={current_size}-"} if current_size > 0 else {}
timeout = aiohttp.ClientTimeout(total=600) # Set the timeout
async with aiohttp.ClientSession(timeout=timeout) as session:
async with session.get(url, headers=headers) as response:
total_size = int(response.headers.get("content-length", 0)) + current_size
with open(file_path, "ab+") as file:
async for data in response.content.iter_chunked(chunk_size):
current_size += len(data)
file.write(data)
done = current_size == total_size
progress = round((current_size / total_size) * 100, 2)
yield f'data: {{"progress": {progress}, "completed": {current_size}, "total": {total_size}}}\n\n'
if done:
file.seek(0)
hashed = calculate_sha256(file)
file.seek(0)
url = f"{OLLAMA_BASE_URLS[0]}/api/blobs/sha256:{hashed}"
response = requests.post(url, data=file)
if response.ok:
res = {
"done": done,
"blob": f"sha256:{hashed}",
"name": file_name,
}
os.remove(file_path)
yield f"data: {json.dumps(res)}\n\n"
else:
raise "Ollama: Could not create blob, Please try again."
@router.get("/download")
async def download(
url: str,
):
# url = "https://huggingface.co/TheBloke/stablelm-zephyr-3b-GGUF/resolve/main/stablelm-zephyr-3b.Q2_K.gguf"
file_name = parse_huggingface_url(url)
if file_name:
file_path = f"{UPLOAD_DIR}/{file_name}"
return StreamingResponse(
download_file_stream(url, file_path, file_name),
media_type="text/event-stream",
)
else:
return None
@router.post("/upload")
def upload(file: UploadFile = File(...)):
file_path = f"{UPLOAD_DIR}/{file.filename}"
# Save file in chunks
with open(file_path, "wb+") as f:
for chunk in file.file:
f.write(chunk)
def file_process_stream():
total_size = os.path.getsize(file_path)
chunk_size = 1024 * 1024
try:
with open(file_path, "rb") as f:
total = 0
done = False
while not done:
chunk = f.read(chunk_size)
if not chunk:
done = True
continue
total += len(chunk)
progress = round((total / total_size) * 100, 2)
res = {
"progress": progress,
"total": total_size,
"completed": total,
}
yield f"data: {json.dumps(res)}\n\n"
if done:
f.seek(0)
hashed = calculate_sha256(f)
f.seek(0)
url = f"{OLLAMA_BASE_URLS[0]}/blobs/sha256:{hashed}"
response = requests.post(url, data=f)
if response.ok:
res = {
"done": done,
"blob": f"sha256:{hashed}",
"name": file.filename,
}
os.remove(file_path)
yield f"data: {json.dumps(res)}\n\n"
else:
raise Exception(
"Ollama: Could not create blob, Please try again."
)
except Exception as e:
res = {"error": str(e)}
yield f"data: {json.dumps(res)}\n\n"
return StreamingResponse(file_process_stream(), media_type="text/event-stream")
@router.get("/gravatar")
async def get_gravatar(
email: str,
......
......@@ -45,3 +45,4 @@ PyJWT
pyjwt[crypto]
black
langfuse
{
"name": "open-webui",
"version": "0.1.112",
"version": "0.1.113",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "open-webui",
"version": "0.1.112",
"version": "0.1.113",
"dependencies": {
"@sveltejs/adapter-node": "^1.3.1",
"async": "^3.2.5",
......
......@@ -390,6 +390,73 @@ export const pullModel = async (token: string, tagName: string, urlIdx: string |
return res;
};
export const downloadModel = async (
token: string,
download_url: string,
urlIdx: string | null = null
) => {
let error = null;
const res = await fetch(
`${OLLAMA_API_BASE_URL}/models/download${urlIdx !== null ? `/${urlIdx}` : ''}`,
{
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`
},
body: JSON.stringify({
url: download_url
})
}
).catch((err) => {
console.log(err);
error = err;
if ('detail' in err) {
error = err.detail;
}
return null;
});
if (error) {
throw error;
}
return res;
};
export const uploadModel = async (token: string, file: File, urlIdx: string | null = null) => {
let error = null;
const formData = new FormData();
formData.append('file', file);
const res = await fetch(
`${OLLAMA_API_BASE_URL}/models/upload${urlIdx !== null ? `/${urlIdx}` : ''}`,
{
method: 'POST',
headers: {
Authorization: `Bearer ${token}`
},
body: formData
}
).catch((err) => {
console.log(err);
error = err;
if ('detail' in err) {
error = err.detail;
}
return null;
});
if (error) {
throw error;
}
return res;
};
// export const pullModel = async (token: string, tagName: string) => {
// return await fetch(`${OLLAMA_API_BASE_URL}/pull`, {
// method: 'POST',
......
......@@ -5,10 +5,12 @@
import {
createModel,
deleteModel,
downloadModel,
getOllamaUrls,
getOllamaVersion,
pullModel,
cancelOllamaRequest
cancelOllamaRequest,
uploadModel
} from '$lib/apis/ollama';
import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
import { WEBUI_NAME, models, user } from '$lib/stores';
......@@ -61,11 +63,13 @@
let pullProgress = null;
let modelUploadMode = 'file';
let modelInputFile = '';
let modelInputFile: File[] | null = null;
let modelFileUrl = '';
let modelFileContent = `TEMPLATE """{{ .System }}\nUSER: {{ .Prompt }}\nASSISTANT: """\nPARAMETER num_ctx 4096\nPARAMETER stop "</s>"\nPARAMETER stop "USER:"\nPARAMETER stop "ASSISTANT:"`;
let modelFileDigest = '';
let uploadProgress = null;
let uploadMessage = '';
let deleteModelTag = '';
......@@ -185,35 +189,32 @@
const uploadModelHandler = async () => {
modelTransferring = true;
uploadProgress = 0;
let uploaded = false;
let fileResponse = null;
let name = '';
if (modelUploadMode === 'file') {
const file = modelInputFile[0];
const formData = new FormData();
formData.append('file', file);
fileResponse = await fetch(`${WEBUI_API_BASE_URL}/utils/upload`, {
method: 'POST',
headers: {
...($user && { Authorization: `Bearer ${localStorage.token}` })
},
body: formData
}).catch((error) => {
console.log(error);
const file = modelInputFile ? modelInputFile[0] : null;
if (file) {
uploadMessage = 'Uploading...';
fileResponse = await uploadModel(localStorage.token, file, selectedOllamaUrlIdx).catch(
(error) => {
toast.error(error);
return null;
});
} else {
fileResponse = await fetch(`${WEBUI_API_BASE_URL}/utils/download?url=${modelFileUrl}`, {
method: 'GET',
headers: {
...($user && { Authorization: `Bearer ${localStorage.token}` })
}
}).catch((error) => {
console.log(error);
);
}
} else {
uploadProgress = 0;
fileResponse = await downloadModel(
localStorage.token,
modelFileUrl,
selectedOllamaUrlIdx
).catch((error) => {
toast.error(error);
return null;
});
}
......@@ -236,6 +237,9 @@
let data = JSON.parse(line.replace(/^data: /, ''));
if (data.progress) {
if (uploadMessage) {
uploadMessage = '';
}
uploadProgress = data.progress;
}
......@@ -319,7 +323,11 @@
}
modelFileUrl = '';
modelInputFile = '';
if (modelUploadInputElement) {
modelUploadInputElement.value = '';
}
modelInputFile = null;
modelTransferring = false;
uploadProgress = null;
......@@ -821,7 +829,7 @@
{#if (modelUploadMode === 'file' && modelInputFile && modelInputFile.length > 0) || (modelUploadMode === 'url' && modelFileUrl !== '')}
<button
class="px-3 text-gray-100 bg-emerald-600 hover:bg-emerald-700 disabled:bg-gray-700 disabled:cursor-not-allowed rounded transition"
class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg disabled:bg-gray-700 disabled:cursor-not-allowed transition"
type="submit"
disabled={modelTransferring}
>
......@@ -876,7 +884,7 @@
<div class=" my-2.5 text-sm font-medium">{$i18n.t('Modelfile Content')}</div>
<textarea
bind:value={modelFileContent}
class="w-full rounded py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none resize-none"
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-100 dark:text-gray-100 dark:bg-gray-850 outline-none resize-none"
rows="6"
/>
</div>
......@@ -891,7 +899,23 @@
>
</div>
{#if uploadProgress !== null}
{#if uploadMessage}
<div class="mt-2">
<div class=" mb-2 text-xs">{$i18n.t('Upload Progress')}</div>
<div class="w-full rounded-full dark:bg-gray-800">
<div
class="dark:bg-gray-600 bg-gray-500 text-xs font-medium text-gray-100 text-center p-0.5 leading-none rounded-full"
style="width: 100%"
>
{uploadMessage}
</div>
</div>
<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;">
{modelFileDigest}
</div>
</div>
{:else if uploadProgress !== null}
<div class="mt-2">
<div class=" mb-2 text-xs">{$i18n.t('Upload Progress')}</div>
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -3,6 +3,10 @@
"code": "en-US",
"title": "English (US)"
},
{
"code": "bg-BG",
"title": "Bulgarian (BG)"
},
{
"code": "ca-ES",
"title": "Catalan"
......@@ -27,6 +31,22 @@
"code": "fr-FR",
"title": "French (France)"
},
{
"code": "it-IT",
"title": "Italian"
},
{
"code": "ja-JP",
"title": "Japanese"
},
{
"code": "nl-NL",
"title": "Dutch (Netherlands)"
},
{
"code": "pt-PT",
"title": "Portuguese (Portugal)"
},
{
"code": "ru-RU",
"title": "Russian (Russia)"
......
{
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' of '-1' for geen vervaldatum.",
"(Beta)": "(Beta)",
"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
"(latest)": "(nieuwste)",
"{{modelName}} is thinking...": "{{modelName}} is aan het denken...",
"{{webUIName}} Backend Required": "{{webUIName}} Backend Verlpicht",
"a user": "",
"About": "Over",
"Account": "Account",
"Action": "Actie",
"Add a model": "Voeg een model toe",
"Add a model tag name": "Voeg een model tag naam toe",
"Add a short description about what this modelfile does": "Voeg een korte beschrijving toe over wat dit modelfile doet",
"Add a short title for this prompt": "Voeg een korte titel toe voor deze prompt",
"Add a tag": "Voeg een tag toe",
"Add Docs": "Voeg Docs toe",
"Add Files": "Voege Bestanden toe",
"Add message": "Voeg bericht toe",
"add tags": "voeg tags toe",
"Adjusting these settings will apply changes universally to all users.": "Het aanpassen van deze instellingen zal universeel worden toegepast op alle gebruikers.",
"admin": "admin",
"Admin Panel": "Administratieve Paneel",
"Admin Settings": "Administratieve Settings",
"Advanced Parameters": "Geavanceerde Parameters",
"all": "alle",
"All Users": "Alle Gebruikers",
"Allow": "Toestaan",
"Allow Chat Deletion": "Sta Chat Verwijdering toe",
"alphanumeric characters and hyphens": "alfanumerieke karakters en streepjes",
"Already have an account?": "Heb je al een account?",
"an assistant": "een assistent",
"and": "en",
"API Base URL": "API Base URL",
"API Key": "API Key",
"API RPM": "API RPM",
"are allowed - Activate this command by typing": "zijn toegestaan - Activeer deze commando door te typen",
"Are you sure?": "",
"Audio": "Audio",
"Auto-playback response": "Automatisch afspelen van antwoord",
"Auto-send input after 3 sec.": "Automatisch verzenden van input na 3 sec.",
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Base URL",
"AUTOMATIC1111 Base URL is required.": "",
"available!": "beschikbaar!",
"Back": "Terug",
"Builder Mode": "Bouwer Modus",
"Cancel": "Annuleren",
"Categories": "Categorieën",
"Change Password": "Wijzig Wachtwoord",
"Chat": "Chat",
"Chat History": "Chat Geschiedenis",
"Chat History is off for this browser.": "Chat Geschiedenis is uitgeschakeld voor deze browser.",
"Chats": "Chats",
"Check Again": "Controleer Opnieuw",
"Check for updates": "Controleer op updates",
"Checking for updates...": "Controleren op updates...",
"Choose a model before saving...": "Kies een model voordat je opslaat...",
"Chunk Overlap": "Chunk Overlap",
"Chunk Params": "Chunk Params",
"Chunk Size": "Chunk Grootte",
"Click here for help.": "Klik hier voor help.",
"Click here to check other modelfiles.": "Klik hier om andere modelfiles te controleren.",
"Click here to select": "",
"Click here to select documents.": "",
"click here.": "click here.",
"Click on the user role button to change a user's role.": "Klik op de gebruikersrol knop om de rol van een gebruiker te wijzigen.",
"Close": "Sluiten",
"Collection": "Verzameling",
"Command": "Commando",
"Confirm Password": "Bevestig Wachtwoord",
"Connections": "Verbindingen",
"Content": "Inhoud",
"Context Length": "Context Lengte",
"Conversation Mode": "Gespreksmodus",
"Copy last code block": "Kopieer laatste code blok",
"Copy last response": "Kopieer laatste antwoord",
"Copying to clipboard was successful!": "Kopiëren naar klembord was succesvol!",
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Maak een beknopte, 3-5 woorden tellende zin als kop voor de volgende query, strikt aanhoudend aan de 3-5 woorden limiet en het vermijden van het gebruik van het woord 'titel':",
"Create a modelfile": "Maak een modelfile",
"Create Account": "Maak Account",
"Created at": "Gemaakt op",
"Created by": "Gemaakt door",
"Current Model": "Huidig Model",
"Current Password": "Huidig Wachtwoord",
"Custom": "Aangepast",
"Customize Ollama models for a specific purpose": "Pas Ollama modellen aan voor een specifiek doel",
"Dark": "Donker",
"Database": "Database",
"DD/MM/YYYY HH:mm": "YYYY/MM/DD HH:mm",
"Default": "Standaard",
"Default (Automatic1111)": "",
"Default (Web API)": "Standaard (Web API)",
"Default model updated": "Standaard model bijgewerkt",
"Default Prompt Suggestions": "Standaard Prompt Suggesties",
"Default User Role": "Standaard Gebruikersrol",
"delete": "verwijderen",
"Delete a model": "Verwijder een model",
"Delete chat": "Verwijder chat",
"Delete Chats": "Verwijder Chats",
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} is verwijderd",
"Deleted {tagName}": "{tagName} is verwijderd",
"Description": "Beschrijving",
"Desktop Notifications": "Desktop Notificaties",
"Disabled": "Uitgeschakeld",
"Discover a modelfile": "Ontdek een modelfile",
"Discover a prompt": "Ontdek een prompt",
"Discover, download, and explore custom prompts": "Ontdek, download en verken aangepaste prompts",
"Discover, download, and explore model presets": "Ontdek, download en verken model presets",
"Display the username instead of You in the Chat": "Toon de gebruikersnaam in plaats van Jij in de Chat",
"Document": "Document",
"Document Settings": "Document Instellingen",
"Documents": "Documenten",
"does not make any external connections, and your data stays securely on your locally hosted server.": "maakt geen externe verbindingen, en je gegevens blijven veilig op je lokaal gehoste server.",
"Don't Allow": "Niet Toestaan",
"Don't have an account?": "Heb je geen account?",
"Download as a File": "Download als Bestand",
"Download Database": "Download Database",
"Drop any files here to add to the conversation": "Sleep bestanden hier om toe te voegen aan het gesprek",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "bijv. '30s', '10m'. Geldige tijdseenheden zijn 's', 'm', 'h'.",
"Edit Doc": "Wijzig Doc",
"Edit User": "Wijzig Gebruiker",
"Email": "Email",
"Enable Chat History": "Schakel Chat Geschiedenis in",
"Enable New Sign Ups": "Schakel Nieuwe Registraties in",
"Enabled": "Ingeschakeld",
"Enter {{role}} message here": "",
"Enter API Key": "",
"Enter Chunk Overlap": "",
"Enter Chunk Size": "",
"Enter Image Size (e.g. 512x512)": "",
"Enter LiteLLM API Base URL (litellm_params.api_base)": "",
"Enter LiteLLM API Key (litellm_params.api_key)": "",
"Enter LiteLLM API RPM (litellm_params.rpm)": "",
"Enter LiteLLM Model (litellm_params.model)": "",
"Enter Max Tokens (litellm_params.max_tokens)": "",
"Enter model tag (e.g. {{modelTag}})": "",
"Enter Number of Steps (e.g. 50)": "",
"Enter stop sequence": "Zet stop sequentie",
"Enter Top K": "",
"Enter URL (e.g. http://127.0.0.1:7860/)": "",
"Enter Your Email": "Voer je Email in",
"Enter Your Full Name": "Voer je Volledige Naam in",
"Enter Your Password": "Voer je Wachtwoord in",
"Experimental": "Experimenteel",
"Export All Chats (All Users)": "Exporteer Alle Chats (Alle Gebruikers)",
"Export Chats": "Exporteer Chats",
"Export Documents Mapping": "Exporteer Documenten Mapping",
"Export Modelfiles": "Exporteer Modelfiles",
"Export Prompts": "Exporteer Prompts",
"Failed to read clipboard contents": "Kan klembord inhoud niet lezen",
"File Mode": "Bestandsmodus",
"File not found.": "Bestand niet gevonden.",
"Focus chat input": "Focus chat input",
"Format your variables using square brackets like this:": "Formatteer je variabelen met vierkante haken zoals dit:",
"From (Base Model)": "Van (Basis Model)",
"Full Screen Mode": "Volledig Scherm Modus",
"General": "Algemeen",
"General Settings": "Algemene Instellingen",
"Hello, {{name}}": "Hallo, {{name}}",
"Hide": "Verberg",
"Hide Additional Params": "Verberg Extra Params",
"How can I help you today?": "Hoe kan ik je vandaag helpen?",
"Image Generation (Experimental)": "Afbeelding Generatie (Experimenteel)",
"Image Generation Engine": "",
"Image Settings": "Afbeelding Instellingen",
"Images": "Afbeeldingen",
"Import Chats": "Importeer Chats",
"Import Documents Mapping": "Importeer Documenten Mapping",
"Import Modelfiles": "Importeer Modelfiles",
"Import Prompts": "Importeer Prompts",
"Include `--api` flag when running stable-diffusion-webui": "Voeg `--api` vlag toe bij het uitvoeren van stable-diffusion-webui",
"Interface": "Interface",
"join our Discord for help.": "join onze Discord voor hulp.",
"JSON": "JSON",
"JWT Expiration": "JWT Expiration",
"JWT Token": "JWT Token",
"Keep Alive": "Houd Actief",
"Keyboard shortcuts": "Toetsenbord snelkoppelingen",
"Language": "Taal",
"Light": "Licht",
"Listening...": "Luisteren...",
"LLMs can make mistakes. Verify important information.": "LLMs kunnen fouten maken. Verifieer belangrijke informatie.",
"Made by OpenWebUI Community": "Gemaakt door OpenWebUI Community",
"Make sure to enclose them with": "Zorg ervoor dat je ze omringt met",
"Manage LiteLLM Models": "Beheer LiteLLM Modellen",
"Manage Models": "Beheer Modellen",
"Manage Ollama Models": "Beheer Ollama Modellen",
"Max Tokens": "Max Tokens",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maximaal 3 modellen kunnen tegelijkertijd worden gedownload. Probeer het later opnieuw.",
"Mirostat": "Mirostat",
"Mirostat Eta": "Mirostat Eta",
"Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "MMMM DD, YYYY",
"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' is succesvol gedownload.",
"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' staat al in de wachtrij voor downloaden.",
"Model {{modelId}} not found": "Model {{modelId}} niet gevonden",
"Model {{modelName}} already exists.": "Model {{modelName}} bestaat al.",
"Model Name": "Model Naam",
"Model not selected": "Model niet geselecteerd",
"Model Tag Name": "Model Tag Naam",
"Model Whitelisting": "Model Whitelisting",
"Model(s) Whitelisted": "Model(len) zijn ge-whitelist",
"Modelfile": "Modelfile",
"Modelfile Advanced Settings": "Modelfile Geavanceerde Instellingen",
"Modelfile Content": "Modelfile Inhoud",
"Modelfiles": "Modelfiles",
"Models": "Modellen",
"My Documents": "Mijn Documenten",
"My Modelfiles": "Mijn Modelfiles",
"My Prompts": "Mijn Prompts",
"Name": "Naam",
"Name Tag": "Naam Tag",
"Name your modelfile": "Benoem je modelfile",
"New Chat": "Nieuwe Chat",
"New Password": "Nieuw Wachtwoord",
"Not sure what to add?": "Niet zeker wat toe te voegen?",
"Not sure what to write? Switch to": "Niet zeker wat te schrijven? Schakel over naar",
"Off": "Uit",
"Okay, Let's Go!": "Okay, Laten we gaan!",
"Ollama Base URL": "",
"Ollama Version": "Ollama Versie",
"On": "Aan",
"Only": "Alleen",
"Only alphanumeric characters and hyphens are allowed in the command string.": "Alleen alfanumerieke karakters en streepjes zijn toegestaan in de commando string.",
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Oops! Houd vast! Je bestanden zijn nog steeds in de verwerkingsoven. We zijn ze aan het bereiden tot perfectie. Wees geduldig en we laten je weten wanneer ze klaar zijn.",
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Het lijkt erop dat de URL ongeldig is. Controleer het nogmaals en probeer opnieuw.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! Je gebruikt een niet-ondersteunde methode (alleen frontend). Serveer de WebUI vanuit de backend.",
"Open": "Open",
"Open AI": "Open AI",
"Open AI (Dall-E)": "",
"Open new chat": "Open nieuwe chat",
"OpenAI API": "OpenAI API",
"OpenAI API Key": "",
"OpenAI API Key is required.": "",
"or": "of",
"Parameters": "Parameters",
"Password": "Wachtwoord",
"PDF Extract Images (OCR)": "PDF Extract Afbeeldingen (OCR)",
"pending": "wachtend",
"Permission denied when accessing microphone: {{error}}": "Toestemming geweigerd bij toegang tot microfoon: {{error}}",
"Playground": "Speeltuin",
"Profile": "Profiel",
"Prompt Content": "Prompt Inhoud",
"Prompt suggestions": "Prompt suggesties",
"Prompts": "Prompts",
"Pull a model from Ollama.com": "Haal een model van Ollama.com",
"Pull Progress": "Haal Voortgang op",
"Query Params": "Query Params",
"RAG Template": "RAG Template",
"Raw Format": "Raw Formaat",
"Record voice": "Neem stem op",
"Redirecting you to OpenWebUI Community": "Je wordt doorgestuurd naar OpenWebUI Community",
"Release Notes": "Release Notes",
"Repeat Last N": "Herhaal Laatste N",
"Repeat Penalty": "Herhaal Straf",
"Request Mode": "Request Modus",
"Reset Vector Storage": "Reset Vector Opslag",
"Response AutoCopy to Clipboard": "Antwoord Automatisch Kopiëren naar Klembord",
"Role": "Rol",
"Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn",
"Save": "Opslaan",
"Save & Create": "Opslaan & Creëren",
"Save & Submit": "Opslaan & Verzenden",
"Save & Update": "Opslaan & Bijwerken",
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Chat logs direct opslaan in de opslag van je browser wordt niet langer ondersteund. Neem even de tijd om je chat logs te downloaden en te verwijderen door op de knop hieronder te klikken. Maak je geen zorgen, je kunt je chat logs eenvoudig opnieuw importeren naar de backend via",
"Scan": "Scan",
"Scan complete!": "Scan voltooid!",
"Scan for documents from {{path}}": "Scan voor documenten van {{path}}",
"Search": "Zoeken",
"Search Documents": "Zoek Documenten",
"Search Prompts": "Zoek Prompts",
"See readme.md for instructions": "Zie readme.md voor instructies",
"See what's new": "Zie wat er nieuw is",
"Seed": "Seed",
"Select a mode": "",
"Select a model": "Selecteer een model",
"Select an Ollama instance": "",
"Send a Message": "Stuur een Bericht",
"Send message": "Stuur bericht",
"Server connection verified": "Server verbinding geverifieerd",
"Set as default": "Stel in als standaard",
"Set Default Model": "Stel Standaard Model in",
"Set Image Size": "Stel Afbeelding Grootte in",
"Set Steps": "Stel Stappen in",
"Set Title Auto-Generation Model": "Stel Titel Auto-Generatie Model in",
"Set Voice": "Stel Stem in",
"Settings": "Instellingen",
"Settings saved successfully!": "Instellingen succesvol opgeslagen!",
"Share to OpenWebUI Community": "Deel naar OpenWebUI Community",
"short-summary": "korte-samenvatting",
"Show": "Toon",
"Show Additional Params": "Toon Extra Params",
"Show shortcuts": "Toon snelkoppelingen",
"sidebar": "sidebar",
"Sign in": "Inloggen",
"Sign Out": "Uitloggen",
"Sign up": "Registreren",
"Speech recognition error: {{error}}": "Spraakherkenning fout: {{error}}",
"Speech-to-Text Engine": "Spraak-naar-tekst Engine",
"SpeechRecognition API is not supported in this browser.": "SpeechRecognition API wordt niet ondersteund in deze browser.",
"Stop Sequence": "Stop Sequentie",
"STT Settings": "STT Instellingen",
"Submit": "Verzenden",
"Success": "Succes",
"Successfully updated.": "Succesvol bijgewerkt.",
"Sync All": "Synchroniseer Alles",
"System": "Systeem",
"System Prompt": "Systeem Prompt",
"Tags": "Tags",
"Temperature": "Temperatuur",
"Template": "Template",
"Text Completion": "Tekst Aanvulling",
"Text-to-Speech Engine": "Tekst-naar-Spraak Engine",
"Tfs Z": "Tfs Z",
"Theme": "Thema",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dit zorgt ervoor dat je waardevolle gesprekken veilig worden opgeslagen in je backend database. Dank je wel!",
"This setting does not sync across browsers or devices.": "Deze instelling wordt niet gesynchroniseerd tussen browsers of apparaten.",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tip: Werk meerdere variabele slots achtereenvolgens bij door op de tab-toets te drukken in de chat input na elke vervanging.",
"Title": "Titel",
"Title Auto-Generation": "Titel Auto-Generatie",
"Title Generation Prompt": "Titel Generatie Prompt",
"to": "naar",
"To access the available model names for downloading,": "Om de beschikbare modelnamen voor downloaden te openen,",
"To access the GGUF models available for downloading,": "Om toegang te krijgen tot de GGUF modellen die beschikbaar zijn voor downloaden,",
"to chat input.": "naar chat input.",
"Toggle settings": "Wissel instellingen",
"Toggle sidebar": "Wissel sidebar",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Problemen met toegang tot Ollama?",
"TTS Settings": "TTS instellingen",
"Type Hugging Face Resolve (Download) URL": "",
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! Er was een probleem met verbinden met {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Onbekend Bestandstype '{{file_type}}', maar accepteren en behandelen als platte tekst",
"Update password": "Wijzig wachtwoord",
"Upload a GGUF model": "Upload een GGUF model",
"Upload files": "Upload bestanden",
"Upload Progress": "Upload Voortgang",
"URL Mode": "URL Modus",
"Use '#' in the prompt input to load and select your documents.": "Gebruik '#' in de prompt input om je documenten te laden en te selecteren.",
"Use Gravatar": "",
"user": "user",
"User Permissions": "Gebruikers Rechten",
"Users": "Gebruikers",
"Utilize": "Utilize",
"Valid time units:": "Geldige tijdseenheden:",
"variable": "variabele",
"variable to have them replaced with clipboard content.": "variabele om ze te laten vervangen door klembord inhoud.",
"Version": "Versie",
"Web": "Web",
"WebUI Add-ons": "WebUI Add-ons",
"WebUI Settings": "WebUI Instellingen",
"WebUI will make requests to": "WebUI zal verzoeken doen naar",
"What’s New in": "Wat is nieuw in",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Wanneer geschiedenis is uitgeschakeld, zullen nieuwe chats op deze browser niet verschijnen in je geschiedenis op een van je apparaten.",
"Whisper (Local)": "Fluister (Lokaal)",
"Write a prompt suggestion (e.g. Who are you?)": "Schrijf een prompt suggestie (bijv. Wie ben je?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "Schrijf een samenvatting in 50 woorden die [onderwerp of trefwoord] samenvat.",
"You": "Jij",
"You're a helpful assistant.": "Jij bent een behulpzame assistent.",
"You're now logged in.": "Je bent nu ingelogd."
}
This diff is collapsed.
This diff is collapsed.
......@@ -2,17 +2,17 @@
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' 或 '-1' 表示無期限。",
"(Beta)": "(測試版)",
"(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`)",
"(latest)": "",
"(latest)": "(最新版)",
"{{modelName}} is thinking...": "{{modelName}} 正在思考...",
"{{webUIName}} Backend Required": "需要 {{webUIName}} 後台",
"a user": "",
"a user": "使用者",
"About": "關於",
"Account": "帳號",
"Action": "動作",
"Add a model": "新增模型",
"Add a model tag name": "新增模型標籤名稱",
"Add a short description about what this modelfile does": "新增關於此模型文件功能的簡短描述",
"Add a short title for this prompt": "為此提示新增一個簡短的標題",
"Add a model tag name": "新增模型標籤",
"Add a short description about what this modelfile does": "為這個 Modelfile 添加一段簡短描述",
"Add a short title for this prompt": "為這個提示詞添加一個簡短的標題",
"Add a tag": "新增標籤",
"Add Docs": "新增文件",
"Add Files": "新增檔案",
......@@ -26,16 +26,17 @@
"all": "所有",
"All Users": "所有使用者",
"Allow": "允許",
"Allow Chat Deletion": "允許刪除聊天",
"alphanumeric characters and hyphens": "字母數字字符和連字符",
"Allow Chat Deletion": "允許刪除聊天紀錄",
"alphanumeric characters and hyphens": "英文字母數字(0~9)和連字符(-)",
"Already have an account?": "已經有帳號了嗎?",
"an assistant": "",
"an assistant": "助手",
"and": "和",
"API Base URL": "API 基本 URL",
"API Key": "API 金鑰",
"API RPM": "API RPM",
"are allowed - Activate this command by typing": "是允許的 - 透過輸入來啟動此命令",
"are allowed - Activate this command by typing": "是允許的 - 透過輸入",
"Are you sure?": "你確定嗎?",
"assistant": "助手",
"Audio": "音訊",
"Auto-playback response": "自動播放回答",
"Auto-send input after 3 sec.": "3秒後自動傳送輸入內容",
......@@ -48,22 +49,22 @@
"Categories": "分類",
"Change Password": "修改密碼",
"Chat": "聊天",
"Chat History": "聊天歷史",
"Chat History is off for this browser.": "此瀏覽器已關閉聊天歷史。",
"Chat History": "聊天紀錄功能",
"Chat History is off for this browser.": "此瀏覽器已關閉聊天紀錄功能。",
"Chats": "聊天",
"Check Again": "重新檢查",
"Check for updates": "檢查更新",
"Checking for updates...": "正在檢查更新...",
"Choose a model before saving...": "儲存前選擇一個模型...",
"Chunk Overlap": "區塊重疊",
"Chunk Params": "區塊參數",
"Chunk Size": "區塊大小",
"Chunk Overlap": "Chunk Overlap",
"Chunk Params": "Chunk 參數",
"Chunk Size": "Chunk 大小",
"Click here for help.": "點擊這裡尋找幫助。",
"Click here to check other modelfiles.": "點擊這裡檢查其他模型文件。",
"Click here to check other modelfiles.": "點擊這裡檢查其他 Modelfiles。",
"Click here to select": "點擊這裡選擇",
"Click here to select documents.": "點擊這裡選擇文件。",
"click here.": "點擊這裡。",
"Click on the user role button to change a user's role.": "點擊使用者角色按鈕以更改使用者的角色。",
"Click on the user role button to change a user's role.": "點擊使用者 Role 按鈕以更改使用者的 Role。",
"Close": "關閉",
"Collection": "收藏",
"Command": "命令",
......@@ -76,14 +77,14 @@
"Copy last response": "複製最後一個回答",
"Copying to clipboard was successful!": "成功複製到剪貼簿!",
"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "為以下的查詢建立一個簡潔、3-5 個詞的短語作為標題,嚴格遵守 3-5 個詞的限制,避免使用「標題」這個詞:",
"Create a modelfile": "建立一個模型文件",
"Create a modelfile": "建立 Modelfile",
"Create Account": "建立帳號",
"Created at": "建立於",
"Created by": "建立者",
"Current Model": "目前模型",
"Current Password": "目前密碼",
"Custom": "自訂",
"Customize Ollama models for a specific purpose": "為特定目的自訂 Ollama 模型",
"Customize Ollama models for a specific purpose": "定制特定用途的 Ollama 模型",
"Dark": "暗色",
"Database": "資料庫",
"DD/MM/YYYY HH:mm": "DD/MM/YYYY HH:mm",
......@@ -91,28 +92,28 @@
"Default (Automatic1111)": "預設(Automatic1111)",
"Default (Web API)": "預設(Web API)",
"Default model updated": "預設模型已更新",
"Default Prompt Suggestions": "預設提示建議",
"Default User Role": "預設使用者角色",
"Default Prompt Suggestions": "預設提示建議",
"Default User Role": "預設用戶 Role",
"delete": "刪除",
"Delete a model": "刪除一個模型",
"Delete chat": "刪除聊天",
"Delete Chats": "刪除聊天",
"Delete chat": "刪除聊天紀錄",
"Delete Chats": "刪除聊天紀錄",
"Deleted {{deleteModelTag}}": "已刪除 {{deleteModelTag}}",
"Deleted {tagName}": "已刪除 {tagName}",
"Description": "描述",
"Desktop Notifications": "桌面通知",
"Disabled": "已停用",
"Discover a modelfile": "發現一個模型文件",
"Discover a prompt": "發現一個提示",
"Discover, download, and explore custom prompts": "發現、下載並探索自訂提示",
"Discover, download, and explore model presets": "發現、下載並探索模型預設",
"Discover a modelfile": "發現新 Modelfile",
"Discover a prompt": "發現提示",
"Discover, download, and explore custom prompts": "發現、下載並探索他人設置的提示",
"Discover, download, and explore model presets": "發現、下載並探索他人設置的模型",
"Display the username instead of You in the Chat": "在聊天中顯示使用者名稱而不是「你」",
"Document": "文件",
"Document Settings": "文件設定",
"Documents": "文件",
"does not make any external connections, and your data stays securely on your locally hosted server.": "不會與外部溝通,你的數據安全地留在你的本機伺服器上。",
"does not make any external connections, and your data stays securely on your locally hosted server.": "不會與外部溝通,你的數據安全地留在你的本機伺服器上。",
"Don't Allow": "不允許",
"Don't have an account?": "沒有帳號?",
"Don't have an account?": "沒有註冊帳號?",
"Download as a File": "下載為文件",
"Download Database": "下載資料庫",
"Drop any files here to add to the conversation": "拖拽文件到此處以新增至對話",
......@@ -121,18 +122,18 @@
"Edit User": "編輯使用者",
"Email": "電子郵件",
"Enable Chat History": "啟用聊天歷史",
"Enable New Sign Ups": "允許新使用者註冊",
"Enable New Sign Ups": "允許註冊新帳號",
"Enabled": "已啟用",
"Enter {{role}} message here": "在這裡輸入 {{role}} 訊息",
"Enter API Key": "輸入 API 金鑰",
"Enter Chunk Overlap": "輸入區塊重疊",
"Enter Chunk Size": "輸入區塊大小",
"Enter Chunk Overlap": "輸入 Chunk Overlap",
"Enter Chunk Size": "輸入 Chunk 大小",
"Enter Image Size (e.g. 512x512)": "輸入圖片大小(例如 512x512)",
"Enter LiteLLM API Base URL (litellm_params.api_base)": "輸入 LiteLLM API 基本 URL(litellm_params.api_base)",
"Enter LiteLLM API Key (litellm_params.api_key)": "輸入 LiteLLM API 金鑰(litellm_params.api_key)",
"Enter LiteLLM API RPM (litellm_params.rpm)": "輸入 LiteLLM API RPM(litellm_params.rpm)",
"Enter LiteLLM Model (litellm_params.model)": "輸入 LiteLLM 模型(litellm_params.model)",
"Enter Max Tokens (litellm_params.max_tokens)": "輸入最大令牌數(litellm_params.max_tokens)",
"Enter Max Tokens (litellm_params.max_tokens)": "輸入最大 Token 數(litellm_params.max_tokens)",
"Enter model tag (e.g. {{modelTag}})": "輸入模型標籤(例如 {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "輸入步數(例如 50)",
"Enter stop sequence": "輸入停止序列",
......@@ -141,39 +142,39 @@
"Enter Your Email": "輸入你的電子郵件",
"Enter Your Full Name": "輸入你的全名",
"Enter Your Password": "輸入你的密碼",
"Experimental": "實驗",
"Export All Chats (All Users)": "匯出所有聊天(所有使用者)",
"Export Chats": "匯出聊天",
"Experimental": "實驗功能",
"Export All Chats (All Users)": "匯出所有聊天紀錄(所有使用者)",
"Export Chats": "匯出聊天紀錄",
"Export Documents Mapping": "匯出文件映射",
"Export Modelfiles": "匯出模型文件",
"Export Prompts": "匯出提示",
"Export Modelfiles": "匯出 Modelfiles",
"Export Prompts": "匯出提示",
"Failed to read clipboard contents": "無法讀取剪貼簿內容",
"File Mode": "文件模式",
"File not found.": "找不到文件。",
"File Mode": "檔案模式",
"File not found.": "找不到檔案。",
"Focus chat input": "聚焦聊天輸入框",
"Format your variables using square brackets like this:": "使用這樣的方括號來格式化你的變數:",
"Format your variables using square brackets like this:": "像這樣使用方括號來格式化你的變數:",
"From (Base Model)": "來自(基礎模型)",
"Full Screen Mode": "全螢幕模式",
"General": "常用",
"General Settings": "常用設定",
"Hello, {{name}}": "你好, {{name}}",
"Hide": "隱藏",
"Hide Additional Params": "隱藏附加參數",
"Hide Additional Params": "隱藏額外參數",
"How can I help you today?": "今天能為你做什麼?",
"Image Generation (Experimental)": "圖片產生(實驗)",
"Image Generation Engine": "圖片產生引擎",
"Image Generation (Experimental)": "圖像生成(實驗功能)",
"Image Generation Engine": "圖像生成引擎",
"Image Settings": "圖片設定",
"Images": "圖片",
"Import Chats": "匯入聊天",
"Import Chats": "匯入聊天紀錄",
"Import Documents Mapping": "匯入文件映射",
"Import Modelfiles": "匯入模型文件",
"Import Prompts": "匯入提示",
"Include `--api` flag when running stable-diffusion-webui": "行 stable-diffusion-webui 時包含 `--api` 標誌",
"Import Modelfiles": "匯入 Modelfiles",
"Import Prompts": "匯入提示",
"Include `--api` flag when running stable-diffusion-webui": "在運行 stable-diffusion-webui 時加上 `--api` 標誌",
"Interface": "介面",
"join our Discord for help.": "加入我們的 Discord 尋找幫助。",
"JSON": "JSON",
"JWT Expiration": "JWT 過期",
"JWT Token": "JWT 令牌",
"JWT Expiration": "JWT 過期時間",
"JWT Token": "JWT Token",
"Keep Alive": "保持活躍",
"Keyboard shortcuts": "鍵盤快速鍵",
"Language": "語言",
......@@ -181,11 +182,11 @@
"Listening...": "正在聽取...",
"LLMs can make mistakes. Verify important information.": "LLM 可能會產生錯誤。請驗證重要資訊。",
"Made by OpenWebUI Community": "由 OpenWebUI 社區製作",
"Make sure to enclose them with": "確保用...圍起來",
"Make sure to enclose them with": "確保變數有被以下符號框住:",
"Manage LiteLLM Models": "管理 LiteLLM 模型",
"Manage Models": "",
"Manage Models": "管理模組",
"Manage Ollama Models": "管理 Ollama 模型",
"Max Tokens": "最大令牌數",
"Max Tokens": "最大 Token 數",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可以同時下載 3 個模型。請稍後再試。",
"Mirostat": "Mirostat",
"Mirostat Eta": "Mirostat Eta",
......@@ -197,20 +198,20 @@
"Model {{modelName}} already exists.": "模型 {{modelName}} 已存在。",
"Model Name": "模型名稱",
"Model not selected": "未選擇模型",
"Model Tag Name": "模型標籤名稱",
"Model Tag Name": "模型標籤",
"Model Whitelisting": "白名單模型",
"Model(s) Whitelisted": "模型已加入白名單",
"Modelfile": "模型文件",
"Modelfile Advanced Settings": "模型文件進階設定",
"Modelfile Content": "模型文件內容",
"Modelfiles": "模型文件",
"Modelfile": "Modelfile",
"Modelfile Advanced Settings": "Modelfile 進階設定",
"Modelfile Content": "Modelfile 內容",
"Modelfiles": "Modelfiles",
"Models": "模型",
"My Documents": "我的文件",
"My Modelfiles": "我的模型文件",
"My Prompts": "我的提示",
"My Modelfiles": "我的 Modelfiles",
"My Prompts": "我的提示",
"Name": "名稱",
"Name Tag": "名稱標籤",
"Name your modelfile": "命名你的模型文件",
"Name your modelfile": "命名你的 Modelfile",
"New Chat": "新增聊天",
"New Password": "新密碼",
"Not sure what to add?": "不確定要新增什麼嗎?",
......@@ -221,7 +222,7 @@
"Ollama Version": "Ollama 版本",
"On": "開啟",
"Only": "僅有",
"Only alphanumeric characters and hyphens are allowed in the command string.": "命令字串中只允許使用字母數字字符和連字符。",
"Only alphanumeric characters and hyphens are allowed in the command string.": "命令字串中只能包含英文字母數字(0~9)和連字符(-)。",
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "哎呀!請稍等!你的文件還在處理中。我們正最佳化文件,請耐心等待,一旦準備好,我們會通知你。",
"Oops! Looks like the URL is invalid. Please double-check and try again.": "哎呀!看起來 URL 無效。請仔細檢查後再試一次。",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "哎呀!你正在使用不支援的方法(僅有前台)。請從後台提供 WebUI。",
......@@ -235,14 +236,14 @@
"or": "或",
"Parameters": "參數",
"Password": "密碼",
"PDF Extract Images (OCR)": "PDF 圖像輸出(OCR 光學文字辨識)",
"pending": "等待中",
"PDF Extract Images (OCR)": "PDF 圖像擷取(OCR 光學文字辨識)",
"pending": "待審查",
"Permission denied when accessing microphone: {{error}}": "存取麥克風時被拒絕權限: {{error}}",
"Playground": "AI 對話遊樂場",
"Profile": "個人資料",
"Prompt Content": "提示內容",
"Prompt suggestions": "提示建議",
"Prompts": "提示",
"Prompt Content": "提示內容",
"Prompt suggestions": "提示建議",
"Prompts": "提示",
"Pull a model from Ollama.com": "從 Ollama.com 下載模型",
"Pull Progress": "下載進度",
"Query Params": "查詢參數",
......@@ -256,7 +257,7 @@
"Request Mode": "請求模式",
"Reset Vector Storage": "重置向量儲存空間",
"Response AutoCopy to Clipboard": "自動複製回答到剪貼簿",
"Role": "角色",
"Role": "Role",
"Rosé Pine": "玫瑰松",
"Rosé Pine Dawn": "黎明玫瑰松",
"Save": "儲存",
......@@ -269,7 +270,7 @@
"Scan for documents from {{path}}": "從 {{path}} 掃描文件",
"Search": "搜尋",
"Search Documents": "搜尋文件",
"Search Prompts": "搜尋提示",
"Search Prompts": "搜尋提示",
"See readme.md for instructions": "查看 readme.md 獲取指南",
"See what's new": "查看最新內容",
"Seed": "種子",
......@@ -283,7 +284,7 @@
"Set Default Model": "設定預設模型",
"Set Image Size": "設定圖片大小",
"Set Steps": "設定步數",
"Set Title Auto-Generation Model": "設定標題自動產生模型",
"Set Title Auto-Generation Model": "設定自動生成標題用模型",
"Set Voice": "設定語音",
"Settings": "設定",
"Settings saved successfully!": "成功儲存設定",
......@@ -306,31 +307,31 @@
"Successfully updated.": "更新成功。",
"Sync All": "全部同步",
"System": "系統",
"System Prompt": "系統提示",
"System Prompt": "系統提示",
"Tags": "標籤",
"Temperature": "溫度",
"Template": "模板",
"Text Completion": "文字完成",
"Text Completion": "文本補全(Text Completion)",
"Text-to-Speech Engine": "文字轉語音引擎",
"Tfs Z": "Tfs Z",
"Theme": "主題",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "這確保你寶貴的對話安全地儲存到你的後台資料庫。謝謝!",
"This setting does not sync across browsers or devices.": "此設定不會在瀏覽器或裝置間同步。",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "提示:透過在每次替換後在聊天輸入中按 Tab 鍵連續更新多個變。",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "提示:透過在每次替換後在聊天輸入中按 Tab 鍵連續更新多個變。",
"Title": "標題",
"Title Auto-Generation": "標題自動產生",
"Title Generation Prompt": "標題產生提示",
"Title Auto-Generation": "自動生成標題",
"Title Generation Prompt": "自動生成標題的提示",
"to": "到",
"To access the available model names for downloading,": "要存取可供下載的模型名稱,",
"To access the GGUF models available for downloading,": "要存取可供下載的 GGUF 模型,",
"to chat input.": "到聊天輸入。",
"To access the available model names for downloading,": "若想查看可供下載的模型名稱,",
"To access the GGUF models available for downloading,": "若想查看可供下載的 GGUF 模型名稱,",
"to chat input.": "到聊天輸入框來啟動此命令。",
"Toggle settings": "切換設定",
"Toggle sidebar": "切換側邊欄",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "存取 Ollama 時遇到問題?",
"TTS Settings": "文字轉語音設定",
"Type Hugging Face Resolve (Download) URL": "輸入 Hugging Face 解析(下載)URL",
"Type Hugging Face Resolve (Download) URL": "輸入 Hugging Face 解析後的(下載)URL",
"Uh-oh! There was an issue connecting to {{provider}}.": "哎呀!連線到 {{provider}} 時出現問題。",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "未知的文件類型 '{{file_type}}',但接受並視為純文字",
"Update password": "更新密碼",
......@@ -338,15 +339,15 @@
"Upload files": "上傳文件",
"Upload Progress": "上傳進度",
"URL Mode": "URL 模式",
"Use '#' in the prompt input to load and select your documents.": "使用 '#' 在提示輸入中以載入並選擇你的文件。",
"Use '#' in the prompt input to load and select your documents.": "在輸入框中輸入 '#' 以載入並選擇你的文件。",
"Use Gravatar": "使用 Gravatar",
"user": "使用者",
"User Permissions": "使用者權限",
"Users": "使用者",
"Utilize": "使用",
"Valid time units:": "有效時間單位:",
"variable": "變",
"variable to have them replaced with clipboard content.": "變將替換為剪貼簿內容。",
"variable": "變",
"variable to have them replaced with clipboard content.": "變將替換為剪貼簿內容。",
"Version": "版本",
"Web": "網頁",
"WebUI Add-ons": "WebUI 擴充套件",
......@@ -355,9 +356,9 @@
"What’s New in": "全新內容",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "當歷史被關閉時,這個瀏覽器上的新聊天將不會出現在任何裝置的歷史記錄中。",
"Whisper (Local)": "Whisper(本機)",
"Write a prompt suggestion (e.g. Who are you?)": "寫一個提示建議(例如:你是誰?)",
"Write a prompt suggestion (e.g. Who are you?)": "寫一個提示建議(例如:你是誰?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "寫一個50字的摘要來概括[主題或關鍵詞]。",
"You": "你",
"You're a helpful assistant.": "你是一個有幫助的助手。",
"You're now logged in.": "已登入。"
"You're a helpful assistant.": "你是一位善於協助他人的助手。",
"You're now logged in.": "已登入。"
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment