Commit e31cf081 authored by Jannik Streidl's avatar Jannik Streidl
Browse files

merged conflicts in PL locale

parents e57c0c30 e92311b4
...@@ -317,12 +317,13 @@ class GenerateImageForm(BaseModel): ...@@ -317,12 +317,13 @@ class GenerateImageForm(BaseModel):
def save_b64_image(b64_str): def save_b64_image(b64_str):
try: try:
image_id = str(uuid.uuid4())
if "," in b64_str:
header, encoded = b64_str.split(",", 1) header, encoded = b64_str.split(",", 1)
mime_type = header.split(";")[0] mime_type = header.split(";")[0]
img_data = base64.b64decode(encoded) img_data = base64.b64decode(encoded)
image_id = str(uuid.uuid4())
image_format = mimetypes.guess_extension(mime_type) image_format = mimetypes.guess_extension(mime_type)
image_filename = f"{image_id}{image_format}" image_filename = f"{image_id}{image_format}"
...@@ -330,6 +331,17 @@ def save_b64_image(b64_str): ...@@ -330,6 +331,17 @@ def save_b64_image(b64_str):
with open(file_path, "wb") as f: with open(file_path, "wb") as f:
f.write(img_data) f.write(img_data)
return image_filename return image_filename
else:
image_filename = f"{image_id}.png"
file_path = IMAGE_CACHE_DIR.joinpath(image_filename)
img_data = base64.b64decode(b64_str)
# Write the image data to a file
with open(file_path, "wb") as f:
f.write(img_data)
return image_filename
except Exception as e: except Exception as e:
log.exception(f"Error saving image: {e}") log.exception(f"Error saving image: {e}")
return None return None
...@@ -348,18 +360,20 @@ def save_url_image(url): ...@@ -348,18 +360,20 @@ def save_url_image(url):
if not image_format: if not image_format:
raise ValueError("Could not determine image type from MIME type") raise ValueError("Could not determine image type from MIME type")
file_path = IMAGE_CACHE_DIR.joinpath(f"{image_id}{image_format}") image_filename = f"{image_id}{image_format}"
file_path = IMAGE_CACHE_DIR.joinpath(f"{image_filename}")
with open(file_path, "wb") as image_file: with open(file_path, "wb") as image_file:
for chunk in r.iter_content(chunk_size=8192): for chunk in r.iter_content(chunk_size=8192):
image_file.write(chunk) image_file.write(chunk)
return image_id, image_format return image_filename
else: else:
log.error(f"Url does not point to an image.") log.error(f"Url does not point to an image.")
return None, None return None
except Exception as e: except Exception as e:
log.exception(f"Error saving image: {e}") log.exception(f"Error saving image: {e}")
return None, None return None
@app.post("/generations") @app.post("/generations")
...@@ -400,7 +414,7 @@ def generate_image( ...@@ -400,7 +414,7 @@ def generate_image(
for image in res["data"]: for image in res["data"]:
image_filename = save_b64_image(image["b64_json"]) image_filename = save_b64_image(image["b64_json"])
images.append({"url": f"/cache/image/generations/{image_filename}"}) images.append({"url": f"/cache/image/generations/{image_filename}"})
file_body_path = IMAGE_CACHE_DIR.joinpath(f"{image_id}.json") file_body_path = IMAGE_CACHE_DIR.joinpath(f"{image_filename}.json")
with open(file_body_path, "w") as f: with open(file_body_path, "w") as f:
json.dump(data, f) json.dump(data, f)
...@@ -435,11 +449,9 @@ def generate_image( ...@@ -435,11 +449,9 @@ def generate_image(
images = [] images = []
for image in res["data"]: for image in res["data"]:
image_id, image_format = save_url_image(image["url"]) image_filename = save_url_image(image["url"])
images.append( images.append({"url": f"/cache/image/generations/{image_filename}"})
{"url": f"/cache/image/generations/{image_id}{image_format}"} file_body_path = IMAGE_CACHE_DIR.joinpath(f"{image_filename}.json")
)
file_body_path = IMAGE_CACHE_DIR.joinpath(f"{image_id}.json")
with open(file_body_path, "w") as f: with open(file_body_path, "w") as f:
json.dump(data.model_dump(exclude_none=True), f) json.dump(data.model_dump(exclude_none=True), f)
...@@ -477,7 +489,7 @@ def generate_image( ...@@ -477,7 +489,7 @@ def generate_image(
for image in res["images"]: for image in res["images"]:
image_filename = save_b64_image(image) image_filename = save_b64_image(image)
images.append({"url": f"/cache/image/generations/{image_filename}"}) images.append({"url": f"/cache/image/generations/{image_filename}"})
file_body_path = IMAGE_CACHE_DIR.joinpath(f"{image_id}.json") file_body_path = IMAGE_CACHE_DIR.joinpath(f"{image_filename}.json")
with open(file_body_path, "w") as f: with open(file_body_path, "w") as f:
json.dump({**data, "info": res["info"]}, f) json.dump({**data, "info": res["info"]}, f)
......
...@@ -36,6 +36,10 @@ from config import ( ...@@ -36,6 +36,10 @@ from config import (
LITELLM_PROXY_HOST, LITELLM_PROXY_HOST,
) )
import warnings
warnings.simplefilter("ignore")
from litellm.utils import get_llm_provider from litellm.utils import get_llm_provider
import asyncio import asyncio
......
...@@ -31,7 +31,12 @@ from typing import Optional, List, Union ...@@ -31,7 +31,12 @@ from typing import Optional, List, Union
from apps.web.models.users import Users from apps.web.models.users import Users
from constants import ERROR_MESSAGES from constants import ERROR_MESSAGES
from utils.utils import decode_token, get_current_user, get_admin_user from utils.utils import (
decode_token,
get_current_user,
get_verified_user,
get_admin_user,
)
from config import ( from config import (
...@@ -164,7 +169,7 @@ async def get_all_models(): ...@@ -164,7 +169,7 @@ async def get_all_models():
@app.get("/api/tags") @app.get("/api/tags")
@app.get("/api/tags/{url_idx}") @app.get("/api/tags/{url_idx}")
async def get_ollama_tags( async def get_ollama_tags(
url_idx: Optional[int] = None, user=Depends(get_current_user) url_idx: Optional[int] = None, user=Depends(get_verified_user)
): ):
if url_idx == None: if url_idx == None:
models = await get_all_models() models = await get_all_models()
...@@ -563,7 +568,7 @@ async def delete_model( ...@@ -563,7 +568,7 @@ async def delete_model(
@app.post("/api/show") @app.post("/api/show")
async def show_model_info(form_data: ModelNameForm, user=Depends(get_current_user)): async def show_model_info(form_data: ModelNameForm, user=Depends(get_verified_user)):
if form_data.name not in app.state.MODELS: if form_data.name not in app.state.MODELS:
raise HTTPException( raise HTTPException(
status_code=400, status_code=400,
...@@ -612,7 +617,7 @@ class GenerateEmbeddingsForm(BaseModel): ...@@ -612,7 +617,7 @@ class GenerateEmbeddingsForm(BaseModel):
async def generate_embeddings( async def generate_embeddings(
form_data: GenerateEmbeddingsForm, form_data: GenerateEmbeddingsForm,
url_idx: Optional[int] = None, url_idx: Optional[int] = None,
user=Depends(get_current_user), user=Depends(get_verified_user),
): ):
if url_idx == None: if url_idx == None:
model = form_data.model model = form_data.model
...@@ -730,7 +735,7 @@ class GenerateCompletionForm(BaseModel): ...@@ -730,7 +735,7 @@ class GenerateCompletionForm(BaseModel):
async def generate_completion( async def generate_completion(
form_data: GenerateCompletionForm, form_data: GenerateCompletionForm,
url_idx: Optional[int] = None, url_idx: Optional[int] = None,
user=Depends(get_current_user), user=Depends(get_verified_user),
): ):
if url_idx == None: if url_idx == None:
...@@ -833,7 +838,7 @@ class GenerateChatCompletionForm(BaseModel): ...@@ -833,7 +838,7 @@ class GenerateChatCompletionForm(BaseModel):
async def generate_chat_completion( async def generate_chat_completion(
form_data: GenerateChatCompletionForm, form_data: GenerateChatCompletionForm,
url_idx: Optional[int] = None, url_idx: Optional[int] = None,
user=Depends(get_current_user), user=Depends(get_verified_user),
): ):
if url_idx == None: if url_idx == None:
...@@ -942,7 +947,7 @@ class OpenAIChatCompletionForm(BaseModel): ...@@ -942,7 +947,7 @@ class OpenAIChatCompletionForm(BaseModel):
async def generate_openai_chat_completion( async def generate_openai_chat_completion(
form_data: OpenAIChatCompletionForm, form_data: OpenAIChatCompletionForm,
url_idx: Optional[int] = None, url_idx: Optional[int] = None,
user=Depends(get_current_user), user=Depends(get_verified_user),
): ):
if url_idx == None: if url_idx == None:
...@@ -1241,7 +1246,9 @@ def upload_model(file: UploadFile = File(...), url_idx: Optional[int] = None): ...@@ -1241,7 +1246,9 @@ def upload_model(file: UploadFile = File(...), url_idx: Optional[int] = None):
@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"]) @app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"])
async def deprecated_proxy(path: str, request: Request, user=Depends(get_current_user)): async def deprecated_proxy(
path: str, request: Request, user=Depends(get_verified_user)
):
url = app.state.OLLAMA_BASE_URLS[0] url = app.state.OLLAMA_BASE_URLS[0]
target_url = f"{url}/{path}" target_url = f"{url}/{path}"
......
...@@ -93,6 +93,31 @@ async def get_archived_session_user_chat_list( ...@@ -93,6 +93,31 @@ async def get_archived_session_user_chat_list(
return Chats.get_archived_chat_list_by_user_id(user.id, skip, limit) return Chats.get_archived_chat_list_by_user_id(user.id, skip, limit)
############################
# GetSharedChatById
############################
@router.get("/share/{share_id}", response_model=Optional[ChatResponse])
async def get_shared_chat_by_id(share_id: str, user=Depends(get_current_user)):
if user.role == "pending":
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND
)
if user.role == "user":
chat = Chats.get_chat_by_share_id(share_id)
elif user.role == "admin":
chat = Chats.get_chat_by_id(share_id)
if chat:
return ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)})
else:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND
)
############################ ############################
# GetChats # GetChats
############################ ############################
...@@ -141,6 +166,55 @@ async def create_new_chat(form_data: ChatForm, user=Depends(get_current_user)): ...@@ -141,6 +166,55 @@ async def create_new_chat(form_data: ChatForm, user=Depends(get_current_user)):
) )
############################
# GetChatsByTags
############################
class TagNameForm(BaseModel):
name: str
skip: Optional[int] = 0
limit: Optional[int] = 50
@router.post("/tags", response_model=List[ChatTitleIdResponse])
async def get_user_chat_list_by_tag_name(
form_data: TagNameForm, user=Depends(get_current_user)
):
print(form_data)
chat_ids = [
chat_id_tag.chat_id
for chat_id_tag in Tags.get_chat_ids_by_tag_name_and_user_id(
form_data.name, user.id
)
]
chats = Chats.get_chat_list_by_chat_ids(chat_ids, form_data.skip, form_data.limit)
if len(chats) == 0:
Tags.delete_tag_by_tag_name_and_user_id(form_data.name, user.id)
return chats
############################
# GetAllTags
############################
@router.get("/tags/all", response_model=List[TagModel])
async def get_all_tags(user=Depends(get_current_user)):
try:
tags = Tags.get_tags_by_user_id(user.id)
return tags
except Exception as e:
log.exception(e)
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()
)
############################ ############################
# GetChatById # GetChatById
############################ ############################
...@@ -274,70 +348,6 @@ async def delete_shared_chat_by_id(id: str, user=Depends(get_current_user)): ...@@ -274,70 +348,6 @@ async def delete_shared_chat_by_id(id: str, user=Depends(get_current_user)):
) )
############################
# GetSharedChatById
############################
@router.get("/share/{share_id}", response_model=Optional[ChatResponse])
async def get_shared_chat_by_id(share_id: str, user=Depends(get_current_user)):
if user.role == "pending":
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND
)
if user.role == "user":
chat = Chats.get_chat_by_share_id(share_id)
elif user.role == "admin":
chat = Chats.get_chat_by_id(share_id)
if chat:
return ChatResponse(**{**chat.model_dump(), "chat": json.loads(chat.chat)})
else:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND
)
############################
# GetAllTags
############################
@router.get("/tags/all", response_model=List[TagModel])
async def get_all_tags(user=Depends(get_current_user)):
try:
tags = Tags.get_tags_by_user_id(user.id)
return tags
except Exception as e:
log.exception(e)
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT()
)
############################
# GetChatsByTags
############################
@router.get("/tags/tag/{tag_name}", response_model=List[ChatTitleIdResponse])
async def get_user_chat_list_by_tag_name(
tag_name: str, user=Depends(get_current_user), skip: int = 0, limit: int = 50
):
chat_ids = [
chat_id_tag.chat_id
for chat_id_tag in Tags.get_chat_ids_by_tag_name_and_user_id(tag_name, user.id)
]
chats = Chats.get_chat_list_by_chat_ids(chat_ids, skip, limit)
if len(chats) == 0:
Tags.delete_tag_by_tag_name_and_user_id(tag_name, user.id)
return chats
############################ ############################
# GetChatTagsById # GetChatTagsById
############################ ############################
......
...@@ -25,6 +25,8 @@ from apps.litellm.main import ( ...@@ -25,6 +25,8 @@ from apps.litellm.main import (
start_litellm_background, start_litellm_background,
shutdown_litellm_background, shutdown_litellm_background,
) )
from apps.audio.main import app as audio_app from apps.audio.main import app as audio_app
from apps.images.main import app as images_app from apps.images.main import app as images_app
from apps.rag.main import app as rag_app from apps.rag.main import app as rag_app
...@@ -74,7 +76,7 @@ class SPAStaticFiles(StaticFiles): ...@@ -74,7 +76,7 @@ class SPAStaticFiles(StaticFiles):
print( print(
f""" rf"""
___ __ __ _ _ _ ___ ___ __ __ _ _ _ ___
/ _ \ _ __ ___ _ __ \ \ / /__| |__ | | | |_ _| / _ \ _ __ ___ _ __ \ \ / /__| |__ | | | |_ _|
| | | | '_ \ / _ \ '_ \ \ \ /\ / / _ \ '_ \| | | || | | | | | '_ \ / _ \ '_ \ \ \ /\ / / _ \ '_ \| | | || |
......
...@@ -21,14 +21,14 @@ describe('Settings', () => { ...@@ -21,14 +21,14 @@ describe('Settings', () => {
// Click on the model selector // Click on the model selector
cy.get('button[aria-label="Select a model"]').click(); cy.get('button[aria-label="Select a model"]').click();
// Select the first model // Select the first model
cy.get('div[role="option"][data-value]').first().click(); cy.get('button[aria-label="model-item"]').first().click();
}); });
it('user can perform text chat', () => { it('user can perform text chat', () => {
// Click on the model selector // Click on the model selector
cy.get('button[aria-label="Select a model"]').click(); cy.get('button[aria-label="Select a model"]').click();
// Select the first model // Select the first model
cy.get('div[role="option"][data-value]').first().click(); cy.get('button[aria-label="model-item"]').first().click();
// Type a message // Type a message
cy.get('#chat-textarea').type('Hi, what can you do? A single sentence only please.', { cy.get('#chat-textarea').type('Hi, what can you do? A single sentence only please.', {
force: true force: true
......
import { WEBUI_API_BASE_URL } from '$lib/constants'; import { WEBUI_API_BASE_URL } from '$lib/constants';
import { getTimeRange } from '$lib/utils';
export const createNewChat = async (token: string, chat: object) => { export const createNewChat = async (token: string, chat: object) => {
let error = null; let error = null;
...@@ -59,7 +60,10 @@ export const getChatList = async (token: string = '') => { ...@@ -59,7 +60,10 @@ export const getChatList = async (token: string = '') => {
throw error; throw error;
} }
return res; return res.map((chat) => ({
...chat,
time_range: getTimeRange(chat.updated_at)
}));
}; };
export const getChatListByUserId = async (token: string = '', userId: string) => { export const getChatListByUserId = async (token: string = '', userId: string) => {
...@@ -90,7 +94,10 @@ export const getChatListByUserId = async (token: string = '', userId: string) => ...@@ -90,7 +94,10 @@ export const getChatListByUserId = async (token: string = '', userId: string) =>
throw error; throw error;
} }
return res; return res.map((chat) => ({
...chat,
time_range: getTimeRange(chat.updated_at)
}));
}; };
export const getArchivedChatList = async (token: string = '') => { export const getArchivedChatList = async (token: string = '') => {
...@@ -220,13 +227,16 @@ export const getAllChatTags = async (token: string) => { ...@@ -220,13 +227,16 @@ export const getAllChatTags = async (token: string) => {
export const getChatListByTagName = async (token: string = '', tagName: string) => { export const getChatListByTagName = async (token: string = '', tagName: string) => {
let error = null; let error = null;
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/tags/tag/${tagName}`, { const res = await fetch(`${WEBUI_API_BASE_URL}/chats/tags`, {
method: 'GET', method: 'POST',
headers: { headers: {
Accept: 'application/json', Accept: 'application/json',
'Content-Type': 'application/json', 'Content-Type': 'application/json',
...(token && { authorization: `Bearer ${token}` }) ...(token && { authorization: `Bearer ${token}` })
} },
body: JSON.stringify({
name: tagName
})
}) })
.then(async (res) => { .then(async (res) => {
if (!res.ok) throw await res.json(); if (!res.ok) throw await res.json();
...@@ -245,7 +255,10 @@ export const getChatListByTagName = async (token: string = '', tagName: string) ...@@ -245,7 +255,10 @@ export const getChatListByTagName = async (token: string = '', tagName: string)
throw error; throw error;
} }
return res; return res.map((chat) => ({
...chat,
time_range: getTimeRange(chat.updated_at)
}));
}; };
export const getChatById = async (token: string, id: string) => { export const getChatById = async (token: string, id: string) => {
......
...@@ -411,7 +411,9 @@ ...@@ -411,7 +411,9 @@
{#if dragged} {#if dragged}
<div <div
class="fixed lg:w-[calc(100%-260px)] w-full h-full flex z-50 touch-none pointer-events-none" class="fixed {$showSidebar
? 'left-0 lg:left-[260px] lg:w-[calc(100%-260px)]'
: 'left-0'} w-full h-full flex z-50 touch-none pointer-events-none"
id="dropzone" id="dropzone"
role="region" role="region"
aria-label="Drag and Drop Container" aria-label="Drag and Drop Container"
...@@ -763,6 +765,7 @@ ...@@ -763,6 +765,7 @@
bind:value={prompt} bind:value={prompt}
on:keypress={(e) => { on:keypress={(e) => {
if ( if (
window.innerWidth > 1024 ||
!( !(
'ontouchstart' in window || 'ontouchstart' in window ||
navigator.maxTouchPoints > 0 || navigator.maxTouchPoints > 0 ||
......
...@@ -25,7 +25,9 @@ ...@@ -25,7 +25,9 @@
export let items = [{ value: 'mango', label: 'Mango' }]; export let items = [{ value: 'mango', label: 'Mango' }];
export let className = 'max-w-lg'; export let className = ' w-[32rem]';
let show = false;
let selectedModel = ''; let selectedModel = '';
$: selectedModel = items.find((item) => item.value === value) ?? ''; $: selectedModel = items.find((item) => item.value === value) ?? '';
...@@ -181,6 +183,7 @@ ...@@ -181,6 +183,7 @@
</script> </script>
<DropdownMenu.Root <DropdownMenu.Root
bind:open={show}
onOpenChange={async () => { onOpenChange={async () => {
searchValue = ''; searchValue = '';
window.setTimeout(() => document.getElementById('model-search-input')?.focus(), 0); window.setTimeout(() => document.getElementById('model-search-input')?.focus(), 0);
...@@ -199,7 +202,7 @@ ...@@ -199,7 +202,7 @@
</div> </div>
</DropdownMenu.Trigger> </DropdownMenu.Trigger>
<DropdownMenu.Content <DropdownMenu.Content
class=" z-40 w-full {className} justify-start rounded-lg bg-white dark:bg-gray-900 dark:text-white shadow-lg border border-gray-300/30 dark:border-gray-700/50 outline-none " class=" z-40 {className} max-w-[calc(100vw-1rem)] justify-start rounded-lg bg-white dark:bg-gray-900 dark:text-white shadow-lg border border-gray-300/30 dark:border-gray-700/50 outline-none "
transition={flyAndScale} transition={flyAndScale}
side={'bottom-start'} side={'bottom-start'}
sideOffset={4} sideOffset={4}
...@@ -214,6 +217,7 @@ ...@@ -214,6 +217,7 @@
bind:value={searchValue} bind:value={searchValue}
class="w-full text-sm bg-transparent outline-none" class="w-full text-sm bg-transparent outline-none"
placeholder={searchPlaceholder} placeholder={searchPlaceholder}
autocomplete="off"
/> />
</div> </div>
...@@ -222,10 +226,13 @@ ...@@ -222,10 +226,13 @@
<div class="px-3 my-2 max-h-72 overflow-y-auto scrollbar-none"> <div class="px-3 my-2 max-h-72 overflow-y-auto scrollbar-none">
{#each filteredItems as item} {#each filteredItems as item}
<DropdownMenu.Item <button
class="flex w-full font-medium line-clamp-1 select-none items-center rounded-button py-2 pl-3 pr-1.5 text-sm text-gray-700 dark:text-gray-100 outline-none transition-all duration-75 hover:bg-gray-100 dark:hover:bg-gray-850 rounded-lg cursor-pointer data-[highlighted]:bg-muted" aria-label="model-item"
class="flex w-full text-left font-medium line-clamp-1 select-none items-center rounded-button py-2 pl-3 pr-1.5 text-sm text-gray-700 dark:text-gray-100 outline-none transition-all duration-75 hover:bg-gray-100 dark:hover:bg-gray-850 rounded-lg cursor-pointer data-[highlighted]:bg-muted"
on:click={() => { on:click={() => {
value = item.value; value = item.value;
show = false;
}} }}
> >
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
...@@ -294,7 +301,7 @@ ...@@ -294,7 +301,7 @@
<Check /> <Check />
</div> </div>
{/if} {/if}
</DropdownMenu.Item> </button>
{:else} {:else}
<div> <div>
<div class="block px-3 py-2 text-sm text-gray-700 dark:text-gray-100"> <div class="block px-3 py-2 text-sm text-gray-700 dark:text-gray-100">
...@@ -392,6 +399,9 @@ ...@@ -392,6 +399,9 @@
</div> </div>
{/each} {/each}
</div> </div>
<div class="hidden w-[42rem]" />
<div class="hidden w-[32rem]" />
</slot> </slot>
</DropdownMenu.Content> </DropdownMenu.Content>
</DropdownMenu.Root> </DropdownMenu.Root>
......
...@@ -209,6 +209,58 @@ ...@@ -209,6 +209,58 @@
</div> </div>
</div> </div>
</div> </div>
<div class=" flex justify-between dark:text-gray-300 px-5">
<div class=" text-lg font-medium self-center">{$i18n.t('Input commands')}</div>
</div>
<div class="flex flex-col md:flex-row w-full p-5 md:space-x-4 dark:text-gray-200">
<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
<div class="flex flex-col space-y-3 w-full self-start">
<div class="w-full flex justify-between items-center">
<div class=" text-sm">
{$i18n.t('Attach file')}
</div>
<div class="flex space-x-1 text-xs">
<div
class=" h-fit py-1 px-2 flex items-center justify-center rounded border border-black/10 capitalize text-gray-600 dark:border-white/10 dark:text-gray-300"
>
#
</div>
</div>
</div>
<div class="w-full flex justify-between items-center">
<div class=" text-sm">
{$i18n.t('Add custom prompt')}
</div>
<div class="flex space-x-1 text-xs">
<div
class=" h-fit py-1 px-2 flex items-center justify-center rounded border border-black/10 capitalize text-gray-600 dark:border-white/10 dark:text-gray-300"
>
/
</div>
</div>
</div>
<div class="w-full flex justify-between items-center">
<div class=" text-sm">
{$i18n.t('Select model')}
</div>
<div class="flex space-x-1 text-xs">
<div
class=" h-fit py-1 px-2 flex items-center justify-center rounded border border-black/10 capitalize text-gray-600 dark:border-white/10 dark:text-gray-300"
>
@
</div>
</div>
</div>
</div>
</div>
</div>
</div> </div>
</Modal> </Modal>
......
...@@ -3,11 +3,15 @@ ...@@ -3,11 +3,15 @@
addTagById, addTagById,
deleteTagById, deleteTagById,
getAllChatTags, getAllChatTags,
getChatList,
getChatListByTagName,
getTagsById, getTagsById,
updateChatById updateChatById
} from '$lib/apis/chats'; } from '$lib/apis/chats';
import { tags as _tags } from '$lib/stores'; import { tags as _tags, chats } from '$lib/stores';
import { onMount } from 'svelte'; import { createEventDispatcher, onMount } from 'svelte';
const dispatch = createEventDispatcher();
import Tags from '../common/Tags.svelte'; import Tags from '../common/Tags.svelte';
...@@ -39,7 +43,21 @@ ...@@ -39,7 +43,21 @@
tags: tags tags: tags
}); });
_tags.set(await getAllChatTags(localStorage.token)); console.log($_tags);
await _tags.set(await getAllChatTags(localStorage.token));
console.log($_tags);
if ($_tags.map((t) => t.name).includes(tagName)) {
await chats.set(await getChatListByTagName(localStorage.token, tagName));
if ($chats.find((chat) => chat.id === chatId)) {
dispatch('close');
}
} else {
await chats.set(await getChatList(localStorage.token));
}
}; };
onMount(async () => { onMount(async () => {
......
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
<button <button
class=" p-5" class=" p-5"
on:click={() => { on:click={() => {
downloadImage(src, 'Image.png'); downloadImage(src, src.substring(src.lastIndexOf('/') + 1));
}} }}
> >
<svg <svg
......
...@@ -44,6 +44,28 @@ ...@@ -44,6 +44,28 @@
let showDropdown = false; let showDropdown = false;
let isEditing = false; let isEditing = false;
let filteredChatList = [];
$: filteredChatList = $chats.filter((chat) => {
if (search === '') {
return true;
} else {
let title = chat.title.toLowerCase();
const query = search.toLowerCase();
let contentMatches = false;
// Access the messages within chat.chat.messages
if (chat.chat && chat.chat.messages && Array.isArray(chat.chat.messages)) {
contentMatches = chat.chat.messages.some((message) => {
// Check if message.content exists and includes the search query
return message.content && message.content.toLowerCase().includes(query);
});
}
return title.includes(query) || contentMatches;
}
});
onMount(async () => { onMount(async () => {
showSidebar.set(window.innerWidth > BREAKPOINT); showSidebar.set(window.innerWidth > BREAKPOINT);
await chats.set(await getChatList(localStorage.token)); await chats.set(await getChatList(localStorage.token));
...@@ -418,25 +440,17 @@ ...@@ -418,25 +440,17 @@
{/if} {/if}
<div class="pl-2 my-2 flex-1 flex flex-col space-y-1 overflow-y-auto scrollbar-none"> <div class="pl-2 my-2 flex-1 flex flex-col space-y-1 overflow-y-auto scrollbar-none">
{#each $chats.filter((chat) => { {#each filteredChatList as chat, idx}
if (search === '') { {#if idx === 0 || (idx > 0 && chat.time_range !== filteredChatList[idx - 1].time_range)}
return true; <div
} else { class="w-full pl-2.5 text-xs text-gray-500 dark:text-gray-500 font-medium {idx === 0
let title = chat.title.toLowerCase(); ? ''
const query = search.toLowerCase(); : 'pt-5'} pb-0.5"
>
let contentMatches = false; {chat.time_range}
// Access the messages within chat.chat.messages </div>
if (chat.chat && chat.chat.messages && Array.isArray(chat.chat.messages)) { {/if}
contentMatches = chat.chat.messages.some((message) => {
// Check if message.content exists and includes the search query
return message.content && message.content.toLowerCase().includes(query);
});
}
return title.includes(query) || contentMatches;
}
}) as chat, i}
<div class=" w-full pr-2 relative group"> <div class=" w-full pr-2 relative group">
{#if chatTitleEditId === chat.id} {#if chatTitleEditId === chat.id}
<div <div
...@@ -836,12 +850,12 @@ ...@@ -836,12 +850,12 @@
> >
<div class="flex h-6 w-6 flex-col items-center"> <div class="flex h-6 w-6 flex-col items-center">
<div <div
class="h-3 w-1 rounded-full bg-[#0f0f0f] dark:bg-white rotate-0 translate-y-[0.15rem] {show class="h-3 w-1 rounded-full bg-[#0f0f0f] dark:bg-white rotate-0 translate-y-[0.15rem] {$showSidebar
? 'group-hover:rotate-[15deg]' ? 'group-hover:rotate-[15deg]'
: 'group-hover:rotate-[-15deg]'}" : 'group-hover:rotate-[-15deg]'}"
/> />
<div <div
class="h-3 w-1 rounded-full bg-[#0f0f0f] dark:bg-white rotate-0 translate-y-[-0.15rem] {show class="h-3 w-1 rounded-full bg-[#0f0f0f] dark:bg-white rotate-0 translate-y-[-0.15rem] {$showSidebar
? 'group-hover:rotate-[-15deg]' ? 'group-hover:rotate-[-15deg]'
: 'group-hover:rotate-[15deg]'}" : 'group-hover:rotate-[15deg]'}"
/> />
......
...@@ -75,7 +75,13 @@ ...@@ -75,7 +75,13 @@
<hr class="border-gray-100 dark:border-gray-800 mt-2.5 mb-1.5" /> <hr class="border-gray-100 dark:border-gray-800 mt-2.5 mb-1.5" />
<div class="flex p-1"> <div class="flex p-1">
<Tags {chatId} /> <Tags
{chatId}
on:close={() => {
show = false;
onClose();
}}
/>
</div> </div>
</DropdownMenu.Content> </DropdownMenu.Content>
</div> </div>
......
{
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "",
"(Beta)": "(تجريبي)",
"(e.g. `sh webui.sh --api`)": "(مثال `sh webui.sh --api`)",
"(latest)": "(الأخير)",
"{{modelName}} is thinking...": "{{modelName}} ...يفكر",
"{{user}}'s Chats": "{{user}}' الدردشات",
"{{webUIName}} Backend Required": "",
"a user": "المستخدم",
"About": "عن",
"Account": "الحساب",
"Accurate information": "معلومات دقيقة",
"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 tag": "أضافة تاق",
"Add custom prompt": "",
"Add Docs": "إضافة المستندات",
"Add Files": "إضافة ملفات",
"Add message": "اضافة رسالة",
"Add Model": "اضافة موديل",
"Add Tags": "اضافة تاق",
"Add User": "اضافة مستخدم",
"Adjusting these settings will apply changes universally to all users.": "سيؤدي ضبط هذه الإعدادات إلى تطبيق التغييرات بشكل عام على كافة المستخدمين.",
"admin": "المشرف",
"Admin Panel": "لوحة التحكم",
"Admin Settings": "اعدادات المشرف",
"Advanced Parameters": "التعليمات المتقدمة",
"all": "الكل",
"All Users": "جميع المستخدمين",
"Allow": "يسمح",
"Allow Chat Deletion": "يستطيع حذف المحادثات",
"alphanumeric characters and hyphens": "الأحرف الأبجدية الرقمية والواصلات",
"Already have an account?": "هل تملك حساب ؟",
"an assistant": "مساعد",
"and": "و",
"API Base URL": "API الرابط الرئيسي",
"API Key": "API مفتاح",
"API Key created.": "API تم أنشاء المفتاح",
"API keys": "API المفاتيح",
"API RPM": "API RPM",
"Archive": "الأرشيف",
"Archived Chats": "الأرشيف المحادثات",
"are allowed - Activate this command by typing": "مسموح - قم بتنشيط هذا الأمر عن طريق الكتابة",
"Are you sure?": "هل أنت متأكد ؟",
"Attach file": "",
"Attention to detail": "انتبه للتفاصيل",
"Audio": "صوتي",
"Auto-playback response": "استجابة التشغيل التلقائي",
"Auto-send input after 3 sec.": "إرسال تلقائي للإدخال بعد 3 ثوانٍ.",
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 الرابط الرئيسي",
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 الرابط مطلوب",
"available!": "متاح",
"Back": "خلف",
"Bad Response": "استجابة خطاء",
"Being lazy": "كون كسول",
"Builder Mode": "بناء الموديل",
"Cancel": "اللغاء",
"Categories": "التصنيفات",
"Change Password": "تغير الباسورد",
"Chat": "المحادثة",
"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 تداخل",
"Chunk Params": "Chunk المتغيرات",
"Chunk Size": "Chunk حجم",
"Click here for help.": "أضغط هنا للمساعدة",
"Click here to check other modelfiles.": "انقر هنا للتحقق من ملفات الموديلات الأخرى.",
"Click here to select": "أضغط هنا للاختيار",
"Click here to select a csv file.": "أضغط هنا للاختيار ملف csv",
"Click here to select documents.": "انقر هنا لاختيار المستندات.",
"click here.": "أضغط هنا",
"Click on the user role button to change a user's role.": "أضغط على أسم الصلاحيات لتغيرها للمستخدم",
"Close": "أغلق",
"Collection": "مجموعة",
"ComfyUI": "ComfyUI",
"ComfyUI Base URL": "ComfyUI الرابط الافتراضي",
"ComfyUI Base URL is required.": "ComfyUI الرابط مطلوب",
"Command": "الأوامر",
"Confirm Password": "تأكيد كلمة المرور",
"Connections": "اتصالات",
"Content": "الاتصال",
"Context Length": "طول السياق",
"Continue Response": "متابعة الرد",
"Conversation Mode": "وضع المحادثة",
"Copied shared chat URL to clipboard!": "تم نسخ عنوان URL للدردشة المشتركة إلى الحافظة!",
"Copy": "نسخ",
"Copy last code block": "انسخ كتلة التعليمات البرمجية الأخيرة",
"Copy last response": "انسخ الرد الأخير",
"Copy Link": "أنسخ الرابط",
"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 Account": "إنشاء حساب",
"Created at": "أنشئت في",
"Created At": "أنشئت من",
"Current Model": "الموديل المختار",
"Current Password": "كلمة السر الحالية",
"Custom": "مخصص",
"Customize Ollama models for a specific purpose": "تخصيص الموديل Ollama لغرض محدد",
"Dark": "مظلم",
"Database": "قاعدة البيانات",
"DD/MM/YYYY HH:mm": "DD/MM/YYYY HH:mm",
"Default": "الإفتراضي",
"Default (Automatic1111)": "الإفتراضي (Automatic1111)",
"Default (SentenceTransformers)": "الإفتراضي (SentenceTransformers)",
"Default (Web API)": "الإفتراضي (Web API)",
"Default model updated": "الإفتراضي تحديث الموديل",
"Default Prompt Suggestions": "الإفتراضي Prompt الاقتراحات",
"Default User Role": "الإفتراضي صلاحيات المستخدم",
"delete": "حذف",
"Delete": "حذف.",
"Delete a model": "حذف الموديل",
"Delete chat": "حذف المحادثه",
"Delete Chat": "حذف المحادثه.",
"Delete Chats": "حذ المحادثات",
"Delete User": "حذف المستخدم",
"Deleted {{deleteModelTag}}": "حذف {{deleteModelTag}}",
"Deleted {{tagName}}": "حذف {{tagName}}",
"Description": "وصف",
"Didn't fully follow instructions": "لم أتبع التعليمات بشكل كامل",
"Disabled": "تعطيل",
"Discover a 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.": "لا يجري أي اتصالات خارجية، وتظل بياناتك آمنة على الخادم المستضاف محليًا.",
"Don't Allow": "لا تسمح بذلك",
"Don't have an account?": "ليس لديك حساب؟",
"Don't like the style": "لا أحب النمط",
"Download": "تحميل",
"Download Database": "تحميل قاعدة البيانات",
"Drop any files here to add to the conversation": "أسقط أية ملفات هنا لإضافتها إلى المحادثة",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "e.g. '30s','10m'. الوحدات الزمنية الصالحة هي 's', 'm', 'h'.",
"Edit": "تعديل",
"Edit Doc": "تعديل الملف",
"Edit User": "تعديل المستخدم",
"Email": "البريد",
"Embedding Model Engine": "تضمين محرك النموذج",
"Embedding model set to \"{{embedding_model}}\"": "تم تعيين نموذج التضمين على \"{{embedding_model}}\"",
"Enable Chat History": "تمكين سجل الدردشة",
"Enable New Sign Ups": "تفعيل عمليات التسجيل الجديدة",
"Enabled": "تفعيل",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "تأكد من أن ملف CSV الخاص بك يتضمن 4 أعمدة بهذا الترتيب: Name, Email, Password, Role.",
"Enter {{role}} message here": "أدخل رسالة {{role}} هنا",
"Enter Chunk Overlap": "أدخل Chunk المتداخل",
"Enter Chunk Size": "أدخل Chunk الحجم",
"Enter Image Size (e.g. 512x512)": "أدخل حجم الصورة (e.g. 512x512)",
"Enter LiteLLM API Base URL (litellm_params.api_base)": "أدخل عنوان URL الأساسي لواجهة برمجة تطبيقات LiteLLM (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 (litllm_params.rpm)",
"Enter LiteLLM Model (litellm_params.model)": "أدخل LiteLLM الموديل (litellm_params.model)",
"Enter Max Tokens (litellm_params.max_tokens)": "أدخل أكثر Tokens (litellm_params.max_tokens)",
"Enter model tag (e.g. {{modelTag}})": "أدخل الموديل تاق (e.g. {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "أدخل عدد الخطوات (e.g. 50)",
"Enter Score": "أدخل النتيجة",
"Enter stop sequence": "أدخل تسلسل التوقف",
"Enter Top K": "Enter Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "الرابط (e.g. http://127.0.0.1:7860/)",
"Enter Your Email": "أدخل البريد الاكتروني",
"Enter Your Full Name": "أدخل الاسم كامل",
"Enter Your Password": "ادخل كلمة المرور",
"Enter Your Role": "أدخل الصلاحيات",
"Experimental": "تجريبي",
"Export All Chats (All Users)": "تصدير جميع الدردشات (جميع المستخدمين)",
"Export Chats": "تصدير جميع الدردشات",
"Export Documents Mapping": "تصدير وثائق الخرائط",
"Export Modelfiles": "تصدير ملفات النماذج",
"Export Prompts": "مطالبات التصدير",
"Failed to create API Key.": "فشل في إنشاء مفتاح API.",
"Failed to read clipboard contents": "فشل في قراءة محتويات الحافظة",
"Feel free to add specific details": "لا تتردد في إضافة تفاصيل محددة",
"File Mode": "وضع الملف",
"File not found.": "لم يتم العثور على الملف.",
"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "تم اكتشاف انتحال بصمة الإصبع: غير قادر على استخدام الأحرف الأولى كصورة رمزية. الافتراضي لصورة الملف الشخصي الافتراضية.",
"Fluidly stream large external response chunks": "دفق قطع الاستجابة الخارجية الكبيرة بسلاسة",
"Focus chat input": "التركيز على إدخال الدردشة",
"Followed instructions perfectly": "اتبعت التعليمات على أكمل وجه",
"Format your variables using square brackets like this:": "قم بتنسيق المتغيرات الخاصة بك باستخدام الأقواس المربعة مثل هذا:",
"From (Base Model)": "من (الموديل الافتراضي)",
"Full Screen Mode": "وضع ملء الشاشة",
"General": "عام",
"General Settings": "الاعدادات العامة",
"Generation Info": "معلومات الجيل",
"Good Response": "استجابة جيدة",
"has no conversations.": "ليس لديه محادثات.",
"Hello, {{name}}": "مرحبا, {{name}}",
"Hide": "أخفاء",
"Hide Additional Params": "إخفاء المعلمات الإضافية",
"How can I help you today?": "كيف استطيع مساعدتك اليوم؟",
"Hybrid Search": "البحث الهجين",
"Image Generation (Experimental)": "توليد الصور (تجريبي)",
"Image Generation Engine": "محرك توليد الصور",
"Image Settings": "إعدادات الصورة",
"Images": "الصور",
"Import Chats": "استيراد الدردشات",
"Import Documents Mapping": "استيراد خرائط المستندات",
"Import Modelfiles": "استيراد ملفات النماذج",
"Import Prompts": "مطالبات الاستيراد",
"Include `--api` flag when running stable-diffusion-webui": "قم بتضمين علامة `-api` عند تشغيل Stable-diffusion-webui",
"Input commands": "",
"Interface": "واجهه المستخدم",
"join our Discord for help.": "انضم إلى Discord للحصول على المساعدة.",
"JSON": "JSON",
"JWT Expiration": "JWT تجريبي",
"JWT Token": "JWT Token",
"Keep Alive": "Keep Alive",
"Keyboard shortcuts": "اختصارات لوحة المفاتيح",
"Language": "اللغة",
"Last Active": "آخر نشاط",
"Light": "فاتح",
"Listening...": "جاري الاستماع...",
"LLMs can make mistakes. Verify important information.": "يمكن أن يرتكب LLM الأخطاء. التحقق من المعلومات الهامة.",
"Made by OpenWebUI Community": "تم إنشاؤه بواسطة مجتمع OpenWebUI",
"Make sure to enclose them with": "تأكد من إرفاقها",
"Manage LiteLLM Models": "إدارة نماذج LiteLLM",
"Manage Models": "إدارة النماذج",
"Manage Ollama Models": "إدارة موديلات Ollama",
"Max Tokens": "Max Tokens",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "يمكن تنزيل 3 نماذج كحد أقصى في وقت واحد. الرجاء معاودة المحاولة في وقت لاحق.",
"Minimum Score": "الحد الأدنى من النقاط",
"Mirostat": "Mirostat",
"Mirostat Eta": "Mirostat Eta",
"Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "MMMM DD, YYYY",
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
"Model '{{modelName}}' has been successfully downloaded.": "موديل '{{modelName}}'تم تحميله بنجاح",
"Model '{{modelTag}}' is already in queue for downloading.": "موديل '{{modelTag}}' جاري تحميلة الرجاء الانتظار",
"Model {{modelId}} not found": "موديل {{modelId}} لم يوجد",
"Model {{modelName}} already exists.": "موديل {{modelName}} موجود",
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "تم اكتشاف مسار نظام الملفات النموذجي. الاسم المختصر للنموذج مطلوب للتحديث، ولا يمكن الاستمرار.",
"Model Name": "أسم الموديل",
"Model not selected": "لم تختار موديل",
"Model Tag Name": "أسم التاق للموديل",
"Model Whitelisting": "القائمة البيضاء للموديل",
"Model(s) Whitelisted": "القائمة البيضاء الموديل",
"Modelfile": "ملف نموذجي",
"Modelfile Advanced Settings": "الإعدادات المتقدمة لملف النموذج",
"Modelfile Content": "محتوى الملف النموذجي",
"Modelfiles": "ملفات الموديل",
"Models": "الموديلات",
"More": "المزيد",
"My Documents": "مستنداتي",
"My Modelfiles": "ملفاتي النموذجية",
"My Prompts": "مطالباتي",
"Name": "الأسم",
"Name Tag": "أسم التاق",
"Name your modelfile": "قم بتسمية ملف النموذج الخاص بك",
"New Chat": "دردشة جديدة",
"New Password": "كلمة المرور الجديدة",
"Not factually correct": "ليس صحيحا من حيث الواقع",
"Not sure what to add?": "لست متأكدا ما يجب إضافته؟",
"Not sure what to write? Switch to": "لست متأكدا ماذا أكتب؟ التبديل إلى",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ملاحظة: إذا قمت بتعيين الحد الأدنى من النقاط، فلن يؤدي البحث إلا إلى إرجاع المستندات التي لها نقاط أكبر من أو تساوي الحد الأدنى من النقاط.",
"Notifications": "إشعارات",
"Off": "أغلاق",
"Okay, Let's Go!": "حسنا دعنا نذهب!",
"OLED Dark": "OLED داكن",
"Ollama": "Ollama",
"Ollama Base URL": "Ollama الرابط الافتراضي",
"Ollama Version": "Ollama الاصدار",
"On": "تشغيل",
"Only": "فقط",
"Only alphanumeric characters and hyphens are allowed in the command 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! 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 من الواجهة الخلفية.",
"Open": "فتح",
"Open AI": "فتح AI",
"Open AI (Dall-E)": "فتح AI (Dall-E)",
"Open new chat": "فتح محادثة جديده",
"OpenAI": "OpenAI",
"OpenAI API": "OpenAI API",
"OpenAI API Config": "OpenAI API إعدادات",
"OpenAI API Key is required.": "مطلوب مفتاح OpenAI API.",
"OpenAI URL/Key required.": "مطلوب عنوان URL/مفتاح OpenAI.",
"or": "أو",
"Other": "آخر",
"Parameters": "Parameters",
"Password": "الباسورد",
"PDF document (.pdf)": "PDF ملف (.pdf)",
"PDF Extract Images (OCR)": "PDF أستخرج الصور (OCR)",
"pending": "قيد الانتظار",
"Permission denied when accessing microphone: {{error}}": "تم رفض الإذن عند الوصول إلى الميكروفون: {{error}}",
"Plain text (.txt)": "نص عادي (.txt)",
"Playground": "مكان التجربة",
"Positive attitude": "موقف ايجابي",
"Profile Image": "صورة الملف الشخصي",
"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "موجه (على سبيل المثال: أخبرني بحقيقة ممتعة عن الإمبراطورية الرومانية)",
"Prompt Content": "محتوى عاجل",
"Prompt suggestions": "اقتراحات سريعة",
"Prompts": "حث",
"Pull a model from Ollama.com": "سحب الموديل من Ollama.com",
"Pull Progress": "سحب التقدم",
"Query Params": "Query Params",
"RAG Template": "RAG تنمبلت",
"Raw Format": "Raw فورمات",
"Read Aloud": "أقراء لي",
"Record voice": "سجل صوت",
"Redirecting you to OpenWebUI Community": "إعادة توجيهك إلى مجتمع OpenWebUI",
"Refused when it shouldn't have": "رفض عندما لا ينبغي أن يكون",
"Regenerate": "تجديد",
"Release Notes": "ملاحظات الإصدار",
"Remove": "إزالة",
"Repeat Last N": "كرر آخر N",
"Repeat Penalty": "كرر المخالفة",
"Request Mode": "وضع الطلب",
"Reranking model disabled": "تم تعطيل نموذج إعادة الترتيب",
"Reranking model set to \"{{reranking_model}}\"": "تم ضبط نموذج إعادة الترتيب على \"{{reranking_model}}\"",
"Reset Vector Storage": "إعادة تعيين تخزين المتجهات",
"Response AutoCopy to Clipboard": "النسخ التلقائي للاستجابة إلى الحافظة",
"Role": "منصب",
"Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn",
"Save": "حفظ",
"Save & Create": "حفظ وإنشاء",
"Save & Submit": "حفظ وإرسال",
"Save & Update": "حفظ وتحديث",
"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": "لم يعد حفظ سجلات الدردشة مباشرة في مساحة تخزين متصفحك مدعومًا. يرجى تخصيص بعض الوقت لتنزيل وحذف سجلات الدردشة الخاصة بك عن طريق النقر على الزر أدناه. لا تقلق، يمكنك بسهولة إعادة استيراد سجلات الدردشة الخاصة بك إلى الواجهة الخلفية من خلاله",
"Scan": "مسح",
"Scan complete!": "تم المسح",
"Scan for documents from {{path}}": " مسح على الملفات من {{path}}",
"Search": "البحث",
"Search a model": "البحث عن موديل",
"Search Documents": "البحث المستندات",
"Search Prompts": "أبحث حث",
"See readme.md for instructions": "راجع readme.md للحصول على التعليمات",
"See what's new": "ما الجديد",
"Seed": "Seed",
"Select a mode": "أختار موديل",
"Select a model": "أختار الموديل",
"Select an Ollama instance": "أختار سيرفر Ollama",
"Select model": "",
"Send a Message": "أرسل رسالة.",
"Send message": "أرسل رسالة",
"Server connection verified": "تم التحقق من اتصال الخادم",
"Set as default": "الافتراضي",
"Set Default Model": "تفعيد الموديل الافتراضي",
"Set Image Size": "حجم الصورة",
"Set Steps": "ضبط الخطوات",
"Set Title Auto-Generation Model": "قم بتعيين نموذج إنشاء العنوان تلقائيًا",
"Set Voice": "ضبط الصوت",
"Settings": "الاعدادات",
"Settings saved successfully!": "تم حفظ الاعدادات بنجاح",
"Share": "كشاركة",
"Share Chat": "مشاركة الدردشة",
"Share to OpenWebUI Community": "شارك في مجتمع OpenWebUI",
"short-summary": "ملخص قصير",
"Show": "عرض",
"Show Additional Params": "إظهار المعلمات الإضافية",
"Show shortcuts": "إظهار الاختصارات",
"Showcased creativity": "أظهر الإبداع",
"sidebar": "الشريط الجانبي",
"Sign in": "تسجيل الدخول",
"Sign Out": "تسجيل الخروج",
"Sign up": "تسجيل",
"Signing in": "جاري الدخول",
"Speech recognition error: {{error}}": "خطأ في التعرف على الكلام: {{error}}",
"Speech-to-Text Engine": "محرك تحويل الكلام إلى نص",
"SpeechRecognition API is not supported in this browser.": "API SpeechRecognition غير مدعومة في هذا المتصفح.",
"Stop Sequence": "وقف التسلسل",
"STT Settings": "STT اعدادات",
"Submit": "إرسال",
"Subtitle (e.g. about the Roman Empire)": "الترجمة (e.g. about the Roman Empire)",
"Success": "نجاح",
"Successfully updated.": "تم التحديث بنجاح.",
"Sync All": "مزامنة الكل",
"System": "النظام",
"System Prompt": "محادثة النظام",
"Tags": "الوسوم",
"Tell us more:": "أخبرنا المزيد:",
"Temperature": "درجة حرارة",
"Template": "نموذج",
"Text Completion": "اكتمال النص",
"Text-to-Speech Engine": "محرك تحويل النص إلى كلام",
"Tfs Z": "Tfs Z",
"Thanks for your feedback!": "شكرا لملاحظاتك!",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "يجب أن تكون النتيجة قيمة تتراوح بين 0.0 (0%) و1.0 (100%).",
"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.": "لا تتم مزامنة هذا الإعداد عبر المتصفحات أو الأجهزة.",
"Thorough explanation": "شرح شامل",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "ملاحضة: قم بتحديث عدة فتحات متغيرة على التوالي عن طريق الضغط على مفتاح tab في مدخلات الدردشة بعد كل استبدال.",
"Title": "العنوان",
"Title (e.g. Tell me a fun fact)": "العناون (e.g. Tell me a fun fact)",
"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.": "الى كتابة المحادثه",
"Toggle settings": "فتح وأغلاق الاعدادات",
"Toggle sidebar": "فتح وأغلاق الشريط الجانبي",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "هل تواجه مشكلة في الوصول إلى Olma؟",
"TTS Settings": "TTS اعدادات",
"Type Hugging Face Resolve (Download) URL": "اكتب عنوان 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 and Copy Link": "تحديث ونسخ الرابط",
"Update Embedding Model": "تحديث الموديل التضمين",
"Update embedding model (e.g. {{model}})": "تحديث الموديلات التضمين (e.g. {{model}})",
"Update password": "تحديث كلمة المرور",
"Update Reranking Model": "تحديث الموديل إعادة الترتيب",
"Update reranking model (e.g. {{model}})": "تحديث الموديل إعادة الترتيب (e.g. {{model}})",
"Upload a GGUF model": "رفع موديل نوع GGUF",
"Upload files": "رفع الملفات",
"Upload Progress": "جاري التحميل",
"URL Mode": "رابط الموديل",
"Use '#' in the prompt input to load and select your documents.": "أستخدم '#' في المحادثة لربطهامن المستندات",
"Use Gravatar": "أستخدم Gravatar",
"Use Initials": "أستخدم Initials",
"user": "مستخدم",
"User Permissions": "صلاحيات المستخدم",
"Users": "المستخدمين",
"Utilize": "يستخدم",
"Valid time units:": "وحدات زمنية صالحة:",
"variable": "المتغير",
"variable to have them replaced with clipboard content.": "متغير لاستبدالها بمحتوى الحافظة.",
"Version": "إصدار",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "تحذير: إذا قمت بتحديث أو تغيير نموذج التضمين الخاص بك، فستحتاج إلى إعادة استيراد كافة المستندات.",
"Web": "Web",
"Webhook URL": "Webhook الرابط",
"WebUI Add-ons": "WebUI الأضافات",
"WebUI Settings": "WebUI اعدادات",
"WebUI will make requests to": "سوف يقوم WebUI بتقديم طلبات ل",
"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 (Local)",
"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.": "لقد قمت الآن بتسجيل الدخول.",
"Youtube": "Youtube"
}
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
"Add a short description about what this modelfile does": "Добавяне на кратко описание за това какво прави този модфайл", "Add a short description about what this modelfile does": "Добавяне на кратко описание за това какво прави този модфайл",
"Add a short title for this prompt": "Добавяне на кратко заглавие за този промпт", "Add a short title for this prompt": "Добавяне на кратко заглавие за този промпт",
"Add a tag": "Добавяне на таг", "Add a tag": "Добавяне на таг",
"Add custom prompt": "",
"Add Docs": "Добавяне на Документи", "Add Docs": "Добавяне на Документи",
"Add Files": "Добавяне на Файлове", "Add Files": "Добавяне на Файлове",
"Add message": "Добавяне на съобщение", "Add message": "Добавяне на съобщение",
...@@ -44,6 +45,7 @@ ...@@ -44,6 +45,7 @@
"Archived Chats": "", "Archived Chats": "",
"are allowed - Activate this command by typing": "са разрешени - Активирайте тази команда чрез въвеждане", "are allowed - Activate this command by typing": "са разрешени - Активирайте тази команда чрез въвеждане",
"Are you sure?": "Сигурни ли сте?", "Are you sure?": "Сигурни ли сте?",
"Attach file": "",
"Attention to detail": "", "Attention to detail": "",
"Audio": "Аудио", "Audio": "Аудио",
"Auto-playback response": "Аувтоматично възпроизвеждане на Отговора", "Auto-playback response": "Аувтоматично възпроизвеждане на Отговора",
...@@ -214,6 +216,7 @@ ...@@ -214,6 +216,7 @@
"Import Modelfiles": "Импортване на модфайлове", "Import Modelfiles": "Импортване на модфайлове",
"Import Prompts": "Импортване на промптове", "Import Prompts": "Импортване на промптове",
"Include `--api` flag when running stable-diffusion-webui": "Включете флага `--api`, когато стартирате stable-diffusion-webui", "Include `--api` flag when running stable-diffusion-webui": "Включете флага `--api`, когато стартирате stable-diffusion-webui",
"Input commands": "",
"Interface": "Интерфейс", "Interface": "Интерфейс",
"join our Discord for help.": "свържете се с нашия Discord за помощ.", "join our Discord for help.": "свържете се с нашия Discord за помощ.",
"JSON": "JSON", "JSON": "JSON",
...@@ -350,6 +353,7 @@ ...@@ -350,6 +353,7 @@
"Select a mode": "Изберете режим", "Select a mode": "Изберете режим",
"Select a model": "Изберете модел", "Select a model": "Изберете модел",
"Select an Ollama instance": "Изберете Ollama инстанция", "Select an Ollama instance": "Изберете Ollama инстанция",
"Select model": "",
"Send a Message": "Изпращане на Съобщение", "Send a Message": "Изпращане на Съобщение",
"Send message": "Изпращане на съобщение", "Send message": "Изпращане на съобщение",
"Server connection verified": "Server connection verified", "Server connection verified": "Server connection verified",
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
"Add a short description about what this modelfile does": "এই মডেলফাইলটির সম্পর্কে সংক্ষিপ্ত বিবরণ যোগ করুন", "Add a short description about what this modelfile does": "এই মডেলফাইলটির সম্পর্কে সংক্ষিপ্ত বিবরণ যোগ করুন",
"Add a short title for this prompt": "এই প্রম্পটের জন্য একটি সংক্ষিপ্ত টাইটেল যোগ করুন", "Add a short title for this prompt": "এই প্রম্পটের জন্য একটি সংক্ষিপ্ত টাইটেল যোগ করুন",
"Add a tag": "একটি ট্যাগ যোগ করুন", "Add a tag": "একটি ট্যাগ যোগ করুন",
"Add custom prompt": "",
"Add Docs": "ডকুমেন্ট যোগ করুন", "Add Docs": "ডকুমেন্ট যোগ করুন",
"Add Files": "ফাইল যোগ করুন", "Add Files": "ফাইল যোগ করুন",
"Add message": "মেসেজ যোগ করুন", "Add message": "মেসেজ যোগ করুন",
...@@ -44,6 +45,7 @@ ...@@ -44,6 +45,7 @@
"Archived Chats": "চ্যাট ইতিহাস সংরক্ষণাগার", "Archived Chats": "চ্যাট ইতিহাস সংরক্ষণাগার",
"are allowed - Activate this command by typing": "অনুমোদিত - কমান্ডটি চালু করার জন্য লিখুন", "are allowed - Activate this command by typing": "অনুমোদিত - কমান্ডটি চালু করার জন্য লিখুন",
"Are you sure?": "আপনি নিশ্চিত?", "Are you sure?": "আপনি নিশ্চিত?",
"Attach file": "",
"Attention to detail": "", "Attention to detail": "",
"Audio": "অডিও", "Audio": "অডিও",
"Auto-playback response": "রেসপন্স অটো-প্লেব্যাক", "Auto-playback response": "রেসপন্স অটো-প্লেব্যাক",
...@@ -214,6 +216,7 @@ ...@@ -214,6 +216,7 @@
"Import Modelfiles": "মডেলফাইলগুলো ইমপোর্ট করুন", "Import Modelfiles": "মডেলফাইলগুলো ইমপোর্ট করুন",
"Import Prompts": "প্রম্পটগুলো ইমপোর্ট করুন", "Import Prompts": "প্রম্পটগুলো ইমপোর্ট করুন",
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui চালু করার সময় `--api` ফ্ল্যাগ সংযুক্ত করুন", "Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui চালু করার সময় `--api` ফ্ল্যাগ সংযুক্ত করুন",
"Input commands": "",
"Interface": "ইন্টারফেস", "Interface": "ইন্টারফেস",
"join our Discord for help.": "সাহায্যের জন্য আমাদের Discord-এ যুক্ত হোন", "join our Discord for help.": "সাহায্যের জন্য আমাদের Discord-এ যুক্ত হোন",
"JSON": "JSON", "JSON": "JSON",
...@@ -351,6 +354,7 @@ ...@@ -351,6 +354,7 @@
"Select a mode": "একটি মডেল নির্বাচন করুন", "Select a mode": "একটি মডেল নির্বাচন করুন",
"Select a model": "একটি মডেল নির্বাচন করুন", "Select a model": "একটি মডেল নির্বাচন করুন",
"Select an Ollama instance": "একটি Ollama ইন্সট্যান্স নির্বাচন করুন", "Select an Ollama instance": "একটি Ollama ইন্সট্যান্স নির্বাচন করুন",
"Select model": "",
"Send a Message": "একটি মেসেজ পাঠান", "Send a Message": "একটি মেসেজ পাঠান",
"Send message": "মেসেজ পাঠান", "Send message": "মেসেজ পাঠান",
"Server connection verified": "সার্ভার কানেকশন যাচাই করা হয়েছে", "Server connection verified": "সার্ভার কানেকশন যাচাই করা হয়েছে",
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
"Add a short description about what this modelfile does": "Afegeix una descripció curta del que fa aquest arxiu de model", "Add a short description about what this modelfile does": "Afegeix una descripció curta del que fa aquest arxiu de model",
"Add a short title for this prompt": "Afegeix un títol curt per aquest prompt", "Add a short title for this prompt": "Afegeix un títol curt per aquest prompt",
"Add a tag": "Afegeix una etiqueta", "Add a tag": "Afegeix una etiqueta",
"Add custom prompt": "",
"Add Docs": "Afegeix Documents", "Add Docs": "Afegeix Documents",
"Add Files": "Afegeix Arxius", "Add Files": "Afegeix Arxius",
"Add message": "Afegeix missatge", "Add message": "Afegeix missatge",
...@@ -44,6 +45,7 @@ ...@@ -44,6 +45,7 @@
"Archived Chats": "Arxiu d'historial de xat", "Archived Chats": "Arxiu d'historial de xat",
"are allowed - Activate this command by typing": "estan permesos - Activa aquesta comanda escrivint", "are allowed - Activate this command by typing": "estan permesos - Activa aquesta comanda escrivint",
"Are you sure?": "Estàs segur?", "Are you sure?": "Estàs segur?",
"Attach file": "",
"Attention to detail": "", "Attention to detail": "",
"Audio": "Àudio", "Audio": "Àudio",
"Auto-playback response": "Resposta de reproducció automàtica", "Auto-playback response": "Resposta de reproducció automàtica",
...@@ -214,6 +216,7 @@ ...@@ -214,6 +216,7 @@
"Import Modelfiles": "Importa Fitxers de Model", "Import Modelfiles": "Importa Fitxers de Model",
"Import Prompts": "Importa Prompts", "Import Prompts": "Importa Prompts",
"Include `--api` flag when running stable-diffusion-webui": "Inclou la bandera `--api` quan executis stable-diffusion-webui", "Include `--api` flag when running stable-diffusion-webui": "Inclou la bandera `--api` quan executis stable-diffusion-webui",
"Input commands": "",
"Interface": "Interfície", "Interface": "Interfície",
"join our Discord for help.": "uneix-te al nostre Discord per ajuda.", "join our Discord for help.": "uneix-te al nostre Discord per ajuda.",
"JSON": "JSON", "JSON": "JSON",
...@@ -351,6 +354,7 @@ ...@@ -351,6 +354,7 @@
"Select a mode": "Selecciona un mode", "Select a mode": "Selecciona un mode",
"Select a model": "Selecciona un model", "Select a model": "Selecciona un model",
"Select an Ollama instance": "Selecciona una instància d'Ollama", "Select an Ollama instance": "Selecciona una instància d'Ollama",
"Select model": "",
"Send a Message": "Envia un Missatge", "Send a Message": "Envia un Missatge",
"Send message": "Envia missatge", "Send message": "Envia missatge",
"Server connection verified": "Connexió al servidor verificada", "Server connection verified": "Connexió al servidor verificada",
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
"Add a short description about what this modelfile does": "Füge eine kurze Beschreibung hinzu, was dieses Modelfile kann", "Add a short description about what this modelfile does": "Füge eine kurze Beschreibung hinzu, was dieses Modelfile kann",
"Add a short title for this prompt": "Füge einen kurzen Titel für diesen Prompt hinzu", "Add a short title for this prompt": "Füge einen kurzen Titel für diesen Prompt hinzu",
"Add a tag": "Tag hinzufügen", "Add a tag": "Tag hinzufügen",
"Add custom prompt": "",
"Add Docs": "Dokumente hinzufügen", "Add Docs": "Dokumente hinzufügen",
"Add Files": "Dateien hinzufügen", "Add Files": "Dateien hinzufügen",
"Add message": "Nachricht eingeben", "Add message": "Nachricht eingeben",
...@@ -44,6 +45,7 @@ ...@@ -44,6 +45,7 @@
"Archived Chats": "Archivierte Chats", "Archived Chats": "Archivierte Chats",
"are allowed - Activate this command by typing": "sind erlaubt - Aktiviere diesen Befehl, indem du", "are allowed - Activate this command by typing": "sind erlaubt - Aktiviere diesen Befehl, indem du",
"Are you sure?": "Bist du sicher?", "Are you sure?": "Bist du sicher?",
"Attach file": "",
"Attention to detail": "Auge fürs Detail", "Attention to detail": "Auge fürs Detail",
"Audio": "Audio", "Audio": "Audio",
"Auto-playback response": "Automatische Wiedergabe der Antwort", "Auto-playback response": "Automatische Wiedergabe der Antwort",
...@@ -214,6 +216,7 @@ ...@@ -214,6 +216,7 @@
"Import Modelfiles": "Modelfiles importieren", "Import Modelfiles": "Modelfiles importieren",
"Import Prompts": "Prompts importieren", "Import Prompts": "Prompts importieren",
"Include `--api` flag when running stable-diffusion-webui": "Füge das `--api`-Flag hinzu, wenn Du stable-diffusion-webui nutzt", "Include `--api` flag when running stable-diffusion-webui": "Füge das `--api`-Flag hinzu, wenn Du stable-diffusion-webui nutzt",
"Input commands": "",
"Interface": "Benutzeroberfläche", "Interface": "Benutzeroberfläche",
"join our Discord for help.": "Trete unserem Discord bei, um Hilfe zu erhalten.", "join our Discord for help.": "Trete unserem Discord bei, um Hilfe zu erhalten.",
"JSON": "JSON", "JSON": "JSON",
...@@ -351,6 +354,7 @@ ...@@ -351,6 +354,7 @@
"Select a mode": "Einen Modus auswählen", "Select a mode": "Einen Modus auswählen",
"Select a model": "Ein Modell auswählen", "Select a model": "Ein Modell auswählen",
"Select an Ollama instance": "Eine Ollama Instanz auswählen", "Select an Ollama instance": "Eine Ollama Instanz auswählen",
"Select model": "",
"Send a Message": "Eine Nachricht senden", "Send a Message": "Eine Nachricht senden",
"Send message": "Nachricht senden", "Send message": "Nachricht senden",
"Server connection verified": "Serververbindung überprüft", "Server connection verified": "Serververbindung überprüft",
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
"Add a short description about what this modelfile does": "Add short description about what this modelfile does", "Add a short description about what this modelfile does": "Add short description about what this modelfile does",
"Add a short title for this prompt": "Add short title for this prompt", "Add a short title for this prompt": "Add short title for this prompt",
"Add a tag": "Add such tag", "Add a tag": "Add such tag",
"Add custom prompt": "",
"Add Docs": "Add Docs", "Add Docs": "Add Docs",
"Add Files": "Add Files", "Add Files": "Add Files",
"Add message": "Add Prompt", "Add message": "Add Prompt",
...@@ -44,6 +45,7 @@ ...@@ -44,6 +45,7 @@
"Archived Chats": "", "Archived Chats": "",
"are allowed - Activate this command by typing": "are allowed. Activate typing", "are allowed - Activate this command by typing": "are allowed. Activate typing",
"Are you sure?": "Such certainty?", "Are you sure?": "Such certainty?",
"Attach file": "",
"Attention to detail": "", "Attention to detail": "",
"Audio": "Audio", "Audio": "Audio",
"Auto-playback response": "Auto-playback response", "Auto-playback response": "Auto-playback response",
...@@ -214,6 +216,7 @@ ...@@ -214,6 +216,7 @@
"Import Modelfiles": "Import Modelfiles", "Import Modelfiles": "Import Modelfiles",
"Import Prompts": "Import Promptos", "Import Prompts": "Import Promptos",
"Include `--api` flag when running stable-diffusion-webui": "Include `--api` flag when running stable-diffusion-webui", "Include `--api` flag when running stable-diffusion-webui": "Include `--api` flag when running stable-diffusion-webui",
"Input commands": "",
"Interface": "Interface", "Interface": "Interface",
"join our Discord for help.": "join our Discord for help.", "join our Discord for help.": "join our Discord for help.",
"JSON": "JSON", "JSON": "JSON",
...@@ -351,6 +354,7 @@ ...@@ -351,6 +354,7 @@
"Select a mode": "Select a mode very choose", "Select a mode": "Select a mode very choose",
"Select a model": "Select a model much choice", "Select a model": "Select a model much choice",
"Select an Ollama instance": "Select an Ollama instance very choose", "Select an Ollama instance": "Select an Ollama instance very choose",
"Select model": "",
"Send a Message": "Send a Message much message", "Send a Message": "Send a Message much message",
"Send message": "Send message very send", "Send message": "Send message very send",
"Server connection verified": "Server connection verified much secure", "Server connection verified": "Server connection verified much secure",
......
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