Unverified Commit 7e061d19 authored by perfectra1n's avatar perfectra1n Committed by GitHub
Browse files

Merge branch 'open-webui:main' into feature-external-db-reconnect

parents 81b24169 9e4dd4b8
<script lang="ts"> <script lang="ts">
import { DropdownMenu } from 'bits-ui'; import { DropdownMenu } from 'bits-ui';
import { marked } from 'marked';
import { flyAndScale } from '$lib/utils/transitions'; import { flyAndScale } from '$lib/utils/transitions';
import { createEventDispatcher, onMount, getContext, tick } from 'svelte'; import { createEventDispatcher, onMount, getContext, tick } from 'svelte';
...@@ -333,9 +334,12 @@ ...@@ -333,9 +334,12 @@
{#if item.model?.info?.meta?.description} {#if item.model?.info?.meta?.description}
<Tooltip <Tooltip
content={`${sanitizeResponseContent( content={`${marked.parse(
item.model?.info?.meta?.description sanitizeResponseContent(item.model?.info?.meta?.description).replaceAll(
).replaceAll('\n', '<br>')}`} '\n',
'<br>'
)
)}`}
> >
<div class=""> <div class="">
<svg <svg
......
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
top_p: null, top_p: null,
tfs_z: null, tfs_z: null,
num_ctx: null, num_ctx: null,
num_batch: null,
num_keep: null,
max_tokens: null, max_tokens: null,
use_mmap: null, use_mmap: null,
use_mlock: null, use_mlock: null,
...@@ -565,6 +567,98 @@ ...@@ -565,6 +567,98 @@
{/if} {/if}
</div> </div>
<div class=" py-0.5 w-full justify-between">
<div class="flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('Batch Size (num_batch)')}</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.num_batch = (params?.num_batch ?? null) === null ? 512 : null;
}}
>
{#if (params?.num_batch ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
{/if}
</button>
</div>
{#if (params?.num_batch ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
id="steps-range"
type="range"
min="256"
max="8192"
step="256"
bind:value={params.num_batch}
class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
/>
</div>
<div class="">
<input
bind:value={params.num_batch}
type="number"
class=" bg-transparent text-center w-14"
min="256"
step="256"
/>
</div>
</div>
{/if}
</div>
<div class=" py-0.5 w-full justify-between">
<div class="flex w-full justify-between">
<div class=" self-center text-xs font-medium">
{$i18n.t('Tokens To Keep On Context Refresh (num_keep)')}
</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.num_keep = (params?.num_keep ?? null) === null ? 24 : null;
}}
>
{#if (params?.num_keep ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
{/if}
</button>
</div>
{#if (params?.num_keep ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
id="steps-range"
type="range"
min="-1"
max="10240000"
step="1"
bind:value={params.num_keep}
class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
/>
</div>
<div class="">
<input
bind:value={params.num_keep}
type="number"
class=" bg-transparent text-center w-14"
min="-1"
step="1"
/>
</div>
</div>
{/if}
</div>
<div class=" py-0.5 w-full justify-between"> <div class=" py-0.5 w-full justify-between">
<div class="flex w-full justify-between"> <div class="flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('Max Tokens (num_predict)')}</div> <div class=" self-center text-xs font-medium">{$i18n.t('Max Tokens (num_predict)')}</div>
......
...@@ -55,6 +55,8 @@ ...@@ -55,6 +55,8 @@
stop: null, stop: null,
tfs_z: null, tfs_z: null,
num_ctx: null, num_ctx: null,
num_batch: null,
num_keep: null,
max_tokens: null max_tokens: null
}; };
...@@ -308,6 +310,8 @@ ...@@ -308,6 +310,8 @@
top_p: params.top_p !== null ? params.top_p : undefined, top_p: params.top_p !== null ? params.top_p : undefined,
tfs_z: params.tfs_z !== null ? params.tfs_z : undefined, tfs_z: params.tfs_z !== null ? params.tfs_z : undefined,
num_ctx: params.num_ctx !== null ? params.num_ctx : undefined, num_ctx: params.num_ctx !== null ? params.num_ctx : undefined,
num_batch: params.num_batch !== null ? params.num_batch : undefined,
num_keep: params.num_keep !== null ? params.num_keep : undefined,
max_tokens: params.max_tokens !== null ? params.max_tokens : undefined, max_tokens: params.max_tokens !== null ? params.max_tokens : undefined,
use_mmap: params.use_mmap !== null ? params.use_mmap : undefined, use_mmap: params.use_mmap !== null ? params.use_mmap : undefined,
use_mlock: params.use_mlock !== null ? params.use_mlock : undefined, use_mlock: params.use_mlock !== null ? params.use_mlock : undefined,
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
import { createEventDispatcher, onMount, getContext } from 'svelte'; import { createEventDispatcher, onMount, getContext } from 'svelte';
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
import Tooltip from '$lib/components/common/Tooltip.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte';
import { updateUserInfo } from '$lib/apis/users';
import { getUserPosition } from '$lib/utils';
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
const i18n = getContext('i18n'); const i18n = getContext('i18n');
...@@ -16,13 +18,17 @@ ...@@ -16,13 +18,17 @@
let responseAutoCopy = false; let responseAutoCopy = false;
let widescreenMode = false; let widescreenMode = false;
let splitLargeChunks = false; let splitLargeChunks = false;
let userLocation = false;
// Interface // Interface
let defaultModelId = ''; let defaultModelId = '';
let showUsername = false; let showUsername = false;
let chatBubble = true; let chatBubble = true;
let chatDirection: 'LTR' | 'RTL' = 'LTR'; let chatDirection: 'LTR' | 'RTL' = 'LTR';
let showEmojiInCall = false;
const toggleSplitLargeChunks = async () => { const toggleSplitLargeChunks = async () => {
splitLargeChunks = !splitLargeChunks; splitLargeChunks = !splitLargeChunks;
saveSettings({ splitLargeChunks: splitLargeChunks }); saveSettings({ splitLargeChunks: splitLargeChunks });
...@@ -43,6 +49,31 @@ ...@@ -43,6 +49,31 @@
saveSettings({ showUsername: showUsername }); saveSettings({ showUsername: showUsername });
}; };
const toggleEmojiInCall = async () => {
showEmojiInCall = !showEmojiInCall;
saveSettings({ showEmojiInCall: showEmojiInCall });
};
const toggleUserLocation = async () => {
userLocation = !userLocation;
if (userLocation) {
const position = await getUserPosition().catch((error) => {
toast.error(error.message);
return null;
});
if (position) {
await updateUserInfo(localStorage.token, { location: position });
toast.success('User location successfully retrieved.');
} else {
userLocation = false;
}
}
saveSettings({ userLocation });
};
const toggleTitleAutoGenerate = async () => { const toggleTitleAutoGenerate = async () => {
titleAutoGenerate = !titleAutoGenerate; titleAutoGenerate = !titleAutoGenerate;
saveSettings({ saveSettings({
...@@ -88,12 +119,17 @@ ...@@ -88,12 +119,17 @@
onMount(async () => { onMount(async () => {
titleAutoGenerate = $settings?.title?.auto ?? true; titleAutoGenerate = $settings?.title?.auto ?? true;
responseAutoCopy = $settings.responseAutoCopy ?? false; responseAutoCopy = $settings.responseAutoCopy ?? false;
showUsername = $settings.showUsername ?? false; showUsername = $settings.showUsername ?? false;
showEmojiInCall = $settings.showEmojiInCall ?? false;
chatBubble = $settings.chatBubble ?? true; chatBubble = $settings.chatBubble ?? true;
widescreenMode = $settings.widescreenMode ?? false; widescreenMode = $settings.widescreenMode ?? false;
splitLargeChunks = $settings.splitLargeChunks ?? false; splitLargeChunks = $settings.splitLargeChunks ?? false;
chatDirection = $settings.chatDirection ?? 'LTR'; chatDirection = $settings.chatDirection ?? 'LTR';
userLocation = $settings.userLocation ?? false;
defaultModelId = ($settings?.models ?? ['']).at(0); defaultModelId = ($settings?.models ?? ['']).at(0);
}); });
...@@ -130,6 +166,26 @@ ...@@ -130,6 +166,26 @@
</div> </div>
</div> </div>
<div>
<div class=" py-0.5 flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('Widescreen Mode')}</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
on:click={() => {
togglewidescreenMode();
}}
type="button"
>
{#if widescreenMode === true}
<span class="ml-2 self-center">{$i18n.t('On')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Off')}</span>
{/if}
</button>
</div>
</div>
<div> <div>
<div class=" py-0.5 flex w-full justify-between"> <div class=" py-0.5 flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('Title Auto-Generation')}</div> <div class=" self-center text-xs font-medium">{$i18n.t('Title Auto-Generation')}</div>
...@@ -174,16 +230,36 @@ ...@@ -174,16 +230,36 @@
<div> <div>
<div class=" py-0.5 flex w-full justify-between"> <div class=" py-0.5 flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('Widescreen Mode')}</div> <div class=" self-center text-xs font-medium">{$i18n.t('Allow User Location')}</div>
<button <button
class="p-1 px-3 text-xs flex rounded transition" class="p-1 px-3 text-xs flex rounded transition"
on:click={() => { on:click={() => {
togglewidescreenMode(); toggleUserLocation();
}} }}
type="button" type="button"
> >
{#if widescreenMode === true} {#if userLocation === true}
<span class="ml-2 self-center">{$i18n.t('On')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Off')}</span>
{/if}
</button>
</div>
</div>
<div>
<div class=" py-0.5 flex w-full justify-between">
<div class=" self-center text-xs font-medium">{$i18n.t('Display Emoji in Call')}</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
on:click={() => {
toggleEmojiInCall();
}}
type="button"
>
{#if showEmojiInCall === true}
<span class="ml-2 self-center">{$i18n.t('On')}</span> <span class="ml-2 self-center">{$i18n.t('On')}</span>
{:else} {:else}
<span class="ml-2 self-center">{$i18n.t('Off')}</span> <span class="ml-2 self-center">{$i18n.t('Off')}</span>
......
...@@ -2,13 +2,12 @@ ...@@ -2,13 +2,12 @@
import { createEventDispatcher, getContext } from 'svelte'; import { createEventDispatcher, getContext } from 'svelte';
import Modal from '$lib/components/common/Modal.svelte'; import Modal from '$lib/components/common/Modal.svelte';
import { addNewMemory } from '$lib/apis/memories'; import { addNewMemory, updateMemoryById } from '$lib/apis/memories';
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
export let show; export let show;
const i18n = getContext('i18n'); const i18n = getContext('i18n');
let loading = false; let loading = false;
...@@ -38,7 +37,9 @@ ...@@ -38,7 +37,9 @@
<Modal bind:show size="sm"> <Modal bind:show size="sm">
<div> <div>
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-2"> <div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-2">
<div class=" text-lg font-medium self-center">{$i18n.t('Add Memory')}</div> <div class=" text-lg font-medium self-center">
{$i18n.t('Add Memory')}
</div>
<button <button
class="self-center" class="self-center"
on:click={() => { on:click={() => {
......
<script>
import { createEventDispatcher, getContext } from 'svelte';
import { toast } from 'svelte-sonner';
import { updateMemoryById } from '$lib/apis/memories';
import Modal from '$lib/components/common/Modal.svelte';
const dispatch = createEventDispatcher();
export let show;
export let memory = {};
const i18n = getContext('i18n');
let loading = false;
let content = '';
$: if (show) {
setContent();
}
const setContent = () => {
content = memory.content;
};
const submitHandler = async () => {
loading = true;
const res = await updateMemoryById(localStorage.token, memory.id, content).catch((error) => {
toast.error(error);
return null;
});
if (res) {
console.log(res);
toast.success('Memory updated successfully');
dispatch('save');
show = false;
}
loading = false;
};
</script>
<Modal bind:show size="sm">
<div>
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-2">
<div class=" text-lg font-medium self-center">
{$i18n.t('Edit Memory')}
</div>
<button
class="self-center"
on:click={() => {
show = false;
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-5 h-5"
>
<path
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
/>
</svg>
</button>
</div>
<div class="flex flex-col md:flex-row w-full px-5 pb-4 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">
<form
class="flex flex-col w-full"
on:submit|preventDefault={() => {
submitHandler();
}}
>
<div class="">
<textarea
bind:value={content}
class=" bg-transparent w-full text-sm resize-none rounded-xl p-3 outline outline-1 outline-gray-100 dark:outline-gray-800"
rows="3"
placeholder={$i18n.t('Enter a detail about yourself for your LLMs to recall')}
/>
<div class="text-xs text-gray-500">
ⓘ {$i18n.t('Refer to yourself as "User" (e.g., "User is learning Spanish")')}
</div>
</div>
<div class="flex justify-end pt-1 text-sm font-medium">
<button
class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-3xl flex flex-row space-x-1 items-center {loading
? ' cursor-not-allowed'
: ''}"
type="submit"
disabled={loading}
>
{$i18n.t('Update')}
{#if loading}
<div class="ml-2 self-center">
<svg
class=" w-4 h-4"
viewBox="0 0 24 24"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
><style>
.spinner_ajPY {
transform-origin: center;
animation: spinner_AtaB 0.75s infinite linear;
}
@keyframes spinner_AtaB {
100% {
transform: rotate(360deg);
}
}
</style><path
d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
opacity=".25"
/><path
d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
class="spinner_ajPY"
/></svg
>
</div>
{/if}
</button>
</div>
</form>
</div>
</div>
</div>
</Modal>
...@@ -10,18 +10,24 @@ ...@@ -10,18 +10,24 @@
import { deleteMemoriesByUserId, deleteMemoryById, getMemories } from '$lib/apis/memories'; import { deleteMemoriesByUserId, deleteMemoryById, getMemories } from '$lib/apis/memories';
import Tooltip from '$lib/components/common/Tooltip.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte';
import { error } from '@sveltejs/kit'; import { error } from '@sveltejs/kit';
import EditMemoryModal from './EditMemoryModal.svelte';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
export let show = false; export let show = false;
let memories = []; let memories = [];
let loading = true;
let showAddMemoryModal = false; let showAddMemoryModal = false;
let showEditMemoryModal = false;
$: if (show) { let selectedMemory = null;
$: if (show && memories.length === 0 && loading) {
(async () => { (async () => {
memories = await getMemories(localStorage.token); memories = await getMemories(localStorage.token);
loading = false;
})(); })();
} }
</script> </script>
...@@ -62,7 +68,9 @@ ...@@ -62,7 +68,9 @@
> >
<tr> <tr>
<th scope="col" class="px-3 py-2"> {$i18n.t('Name')} </th> <th scope="col" class="px-3 py-2"> {$i18n.t('Name')} </th>
<th scope="col" class="px-3 py-2 hidden md:flex"> {$i18n.t('Created At')} </th> <th scope="col" class="px-3 py-2 hidden md:flex">
{$i18n.t('Last Modified')}
</th>
<th scope="col" class="px-3 py-2 text-right" /> <th scope="col" class="px-3 py-2 text-right" />
</tr> </tr>
</thead> </thead>
...@@ -76,11 +84,38 @@ ...@@ -76,11 +84,38 @@
</td> </td>
<td class=" px-3 py-1 hidden md:flex h-[2.5rem]"> <td class=" px-3 py-1 hidden md:flex h-[2.5rem]">
<div class="my-auto whitespace-nowrap"> <div class="my-auto whitespace-nowrap">
{dayjs(memory.created_at * 1000).format($i18n.t('MMMM DD, YYYY'))} {dayjs(memory.updated_at * 1000).format(
$i18n.t('MMMM DD, YYYY hh:mm:ss A')
)}
</div> </div>
</td> </td>
<td class="px-3 py-1"> <td class="px-3 py-1">
<div class="flex justify-end w-full"> <div class="flex justify-end w-full">
<Tooltip content="Edit">
<button
class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
on:click={() => {
selectedMemory = memory;
showEditMemoryModal = true;
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="w-4 h-4 s-FoVA_WMOgxUD"
><path
stroke-linecap="round"
stroke-linejoin="round"
d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125"
class="s-FoVA_WMOgxUD"
/></svg
>
</button>
</Tooltip>
<Tooltip content="Delete"> <Tooltip content="Delete">
<button <button
class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl" class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
...@@ -163,3 +198,11 @@ ...@@ -163,3 +198,11 @@
memories = await getMemories(localStorage.token); memories = await getMemories(localStorage.token);
}} }}
/> />
<EditMemoryModal
bind:show={showEditMemoryModal}
memory={selectedMemory}
on:save={async () => {
memories = await getMemories(localStorage.token);
}}
/>
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
export let title = 'Confirm your action'; export let title = 'Confirm your action';
export let message = 'This action cannot be undone. Do you wish to continue?'; export let message = 'This action cannot be undone. Do you wish to continue?';
export let cancelLabel = 'Cancel';
export let confirmLabel = 'Confirm';
export let show = false; export let show = false;
let modalElement = null; let modalElement = null;
let mounted = false; let mounted = false;
...@@ -70,7 +73,7 @@ ...@@ -70,7 +73,7 @@
}} }}
type="button" type="button"
> >
Cancel {cancelLabel}
</button> </button>
<button <button
class="bg-gray-900 hover:bg-gray-850 text-gray-100 dark:bg-gray-100 dark:hover:bg-white dark:text-gray-800 font-medium w-full py-2.5 rounded-lg transition" class="bg-gray-900 hover:bg-gray-850 text-gray-100 dark:bg-gray-100 dark:hover:bg-white dark:text-gray-800 font-medium w-full py-2.5 rounded-lg transition"
...@@ -80,7 +83,7 @@ ...@@ -80,7 +83,7 @@
}} }}
type="button" type="button"
> >
Confirm {confirmLabel}
</button> </button>
</div> </div>
</div> </div>
......
<script lang="ts"> <script lang="ts">
import { onDestroy } from 'svelte'; import { onDestroy } from 'svelte';
import { marked } from 'marked';
import tippy from 'tippy.js'; import tippy from 'tippy.js';
export let placement = 'top'; export let placement = 'top';
......
<script lang="ts"> <script lang="ts">
import { toast } from 'svelte-sonner';
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
import { import {
user, user,
...@@ -11,10 +12,11 @@ ...@@ -11,10 +12,11 @@
mobile, mobile,
showArchivedChats showArchivedChats
} from '$lib/stores'; } from '$lib/stores';
import { onMount, getContext } from 'svelte'; import { onMount, getContext, tick } from 'svelte';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
import { updateUserSettings } from '$lib/apis/users';
import { import {
deleteChatById, deleteChatById,
getChatList, getChatList,
...@@ -25,37 +27,25 @@ ...@@ -25,37 +27,25 @@
archiveChatById, archiveChatById,
cloneChatById cloneChatById
} from '$lib/apis/chats'; } from '$lib/apis/chats';
import { toast } from 'svelte-sonner';
import { fade, slide } from 'svelte/transition';
import { WEBUI_BASE_URL } from '$lib/constants'; import { WEBUI_BASE_URL } from '$lib/constants';
import Tooltip from '../common/Tooltip.svelte';
import ChatMenu from './Sidebar/ChatMenu.svelte';
import ShareChatModal from '../chat/ShareChatModal.svelte';
import ArchiveBox from '../icons/ArchiveBox.svelte';
import ArchivedChatsModal from './Sidebar/ArchivedChatsModal.svelte'; import ArchivedChatsModal from './Sidebar/ArchivedChatsModal.svelte';
import UserMenu from './Sidebar/UserMenu.svelte'; import UserMenu from './Sidebar/UserMenu.svelte';
import { updateUserSettings } from '$lib/apis/users'; import ChatItem from './Sidebar/ChatItem.svelte';
import DeleteConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
const BREAKPOINT = 768; const BREAKPOINT = 768;
let show = false;
let navElement; let navElement;
let title: string = 'UI';
let search = ''; let search = '';
let shareChatId = null; let shiftKey = false;
let selectedChatId = null; let selectedChatId = null;
let deleteChat = null;
let chatDeleteId = null; let showDeleteConfirm = false;
let chatTitleEditId = null;
let chatTitle = '';
let showShareChatModal = false;
let showDropdown = false; let showDropdown = false;
let isEditing = false;
let filteredChatList = []; let filteredChatList = [];
$: filteredChatList = $chats.filter((chat) => { $: filteredChatList = $chats.filter((chat) => {
...@@ -78,13 +68,6 @@ ...@@ -78,13 +68,6 @@
} }
}); });
mobile;
const onResize = () => {
if ($showSidebar && window.innerWidth < BREAKPOINT) {
showSidebar.set(false);
}
};
onMount(async () => { onMount(async () => {
mobile.subscribe((e) => { mobile.subscribe((e) => {
if ($showSidebar && e) { if ($showSidebar && e) {
...@@ -125,12 +108,43 @@ ...@@ -125,12 +108,43 @@
checkDirection(); checkDirection();
}; };
const onKeyDown = (e) => {
if (e.key === 'Shift') {
shiftKey = true;
}
};
const onKeyUp = (e) => {
if (e.key === 'Shift') {
shiftKey = false;
}
};
const onFocus = () => {};
const onBlur = () => {
shiftKey = false;
selectedChatId = null;
};
window.addEventListener('keydown', onKeyDown);
window.addEventListener('keyup', onKeyUp);
window.addEventListener('touchstart', onTouchStart); window.addEventListener('touchstart', onTouchStart);
window.addEventListener('touchend', onTouchEnd); window.addEventListener('touchend', onTouchEnd);
window.addEventListener('focus', onFocus);
window.addEventListener('blur', onBlur);
return () => { return () => {
window.removeEventListener('keydown', onKeyDown);
window.removeEventListener('keyup', onKeyUp);
window.removeEventListener('touchstart', onTouchStart); window.removeEventListener('touchstart', onTouchStart);
window.removeEventListener('touchend', onTouchEnd); window.removeEventListener('touchend', onTouchEnd);
window.removeEventListener('focus', onFocus);
window.removeEventListener('blur', onBlur);
}; };
}); });
...@@ -149,69 +163,29 @@ ...@@ -149,69 +163,29 @@
await chats.set(enrichedChats); await chats.set(enrichedChats);
}; };
const loadChat = async (id) => { const saveSettings = async (updated) => {
goto(`/c/${id}`); await settings.set({ ...$settings, ...updated });
}; await updateUserSettings(localStorage.token, { ui: $settings });
location.href = '/';
const editChatTitle = async (id, _title) => {
if (_title === '') {
toast.error($i18n.t('Title cannot be an empty string.'));
} else {
title = _title;
await updateChatById(localStorage.token, id, {
title: _title
});
await chats.set(await getChatList(localStorage.token));
}
}; };
const deleteChat = async (id) => { const deleteChatHandler = async (id) => {
const res = await deleteChatById(localStorage.token, id).catch((error) => { const res = await deleteChatById(localStorage.token, id).catch((error) => {
toast.error(error); toast.error(error);
chatDeleteId = null;
return null; return null;
}); });
if (res) { if (res) {
if ($chatId === id) { if ($chatId === id) {
await chatId.set('');
await tick();
goto('/'); goto('/');
} }
await chats.set(await getChatList(localStorage.token));
}
};
const cloneChatHandler = async (id) => {
const res = await cloneChatById(localStorage.token, id).catch((error) => {
toast.error(error);
return null;
});
if (res) {
goto(`/c/${res.id}`);
await chats.set(await getChatList(localStorage.token)); await chats.set(await getChatList(localStorage.token));
} }
}; };
const saveSettings = async (updated) => {
await settings.set({ ...$settings, ...updated });
await updateUserSettings(localStorage.token, { ui: $settings });
location.href = '/';
};
const archiveChatHandler = async (id) => {
await archiveChatById(localStorage.token, id);
await chats.set(await getChatList(localStorage.token));
};
const focusEdit = async (node: HTMLInputElement) => {
node.focus();
};
</script> </script>
<ShareChatModal bind:show={showShareChatModal} chatId={shareChatId} />
<ArchivedChatsModal <ArchivedChatsModal
bind:show={$showArchivedChats} bind:show={$showArchivedChats}
on:change={async () => { on:change={async () => {
...@@ -219,6 +193,18 @@ ...@@ -219,6 +193,18 @@
}} }}
/> />
<DeleteConfirmDialog
bind:show={showDeleteConfirm}
title="Delete chat?"
on:confirm={() => {
deleteChatHandler(deleteChat.id);
}}
>
<div class=" text-sm text-gray-500">
This will delete <span class=" font-semibold">{deleteChat.title}</span>.
</div>
</DeleteConfirmDialog>
<!-- svelte-ignore a11y-no-static-element-interactions --> <!-- svelte-ignore a11y-no-static-element-interactions -->
{#if $showSidebar} {#if $showSidebar}
...@@ -252,12 +238,10 @@ ...@@ -252,12 +238,10 @@
draggable="false" draggable="false"
on:click={async () => { on:click={async () => {
selectedChatId = null; selectedChatId = null;
await goto('/'); await goto('/');
const newChatButton = document.getElementById('new-chat-button'); const newChatButton = document.getElementById('new-chat-button');
setTimeout(() => { setTimeout(() => {
newChatButton?.click(); newChatButton?.click();
if ($mobile) { if ($mobile) {
showSidebar.set(false); showSidebar.set(false);
} }
...@@ -486,215 +470,25 @@ ...@@ -486,215 +470,25 @@
</div> </div>
{/if} {/if}
<div class=" w-full pr-2 relative group"> <ChatItem
{#if chatTitleEditId === chat.id} {chat}
<div {shiftKey}
class=" w-full flex justify-between rounded-xl px-3 py-2 {chat.id === $chatId || selected={selectedChatId === chat.id}
chat.id === chatTitleEditId || on:select={() => {
chat.id === chatDeleteId
? 'bg-gray-200 dark:bg-gray-900'
: chat.id === selectedChatId
? 'bg-gray-100 dark:bg-gray-950'
: 'group-hover:bg-gray-100 dark:group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis"
>
<input
use:focusEdit
bind:value={chatTitle}
class=" bg-transparent w-full outline-none mr-10"
/>
</div>
{:else}
<a
class=" w-full flex justify-between rounded-xl px-3 py-2 {chat.id === $chatId ||
chat.id === chatTitleEditId ||
chat.id === chatDeleteId
? 'bg-gray-200 dark:bg-gray-900'
: chat.id === selectedChatId
? 'bg-gray-100 dark:bg-gray-950'
: ' group-hover:bg-gray-100 dark:group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis"
href="/c/{chat.id}"
on:click={() => {
selectedChatId = chat.id; selectedChatId = chat.id;
if ($mobile) {
showSidebar.set(false);
}
}}
on:dblclick={() => {
chatTitle = chat.title;
chatTitleEditId = chat.id;
}}
draggable="false"
>
<div class=" flex self-center flex-1 w-full">
<div class=" text-left self-center overflow-hidden w-full h-[20px]">
{chat.title}
</div>
</div>
</a>
{/if}
<div
class="
{chat.id === $chatId || chat.id === chatTitleEditId || chat.id === chatDeleteId
? 'from-gray-200 dark:from-gray-900'
: chat.id === selectedChatId
? 'from-gray-100 dark:from-gray-950'
: 'invisible group-hover:visible from-gray-100 dark:from-gray-950'}
absolute right-[10px] top-[10px] pr-2 pl-5 bg-gradient-to-l from-80%
to-transparent"
>
{#if chatTitleEditId === chat.id}
<div class="flex self-center space-x-1.5 z-10">
<button
class=" self-center dark:hover:text-white transition"
on:click={() => {
editChatTitle(chat.id, chatTitle);
chatTitleEditId = null;
chatTitle = '';
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4"
>
<path
fill-rule="evenodd"
d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
clip-rule="evenodd"
/>
</svg>
</button>
<button
class=" self-center dark:hover:text-white transition"
on:click={() => {
chatTitleEditId = null;
chatTitle = '';
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
/>
</svg>
</button>
</div>
{:else if chatDeleteId === chat.id}
<div class="flex self-center space-x-1.5 z-10">
<button
class=" self-center dark:hover:text-white transition"
on:click={() => {
deleteChat(chat.id);
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4"
>
<path
fill-rule="evenodd"
d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
clip-rule="evenodd"
/>
</svg>
</button>
<button
class=" self-center dark:hover:text-white transition"
on:click={() => {
chatDeleteId = null;
}} }}
> on:unselect={() => {
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
/>
</svg>
</button>
</div>
{:else}
<div class="flex self-center space-x-1 z-10">
<ChatMenu
chatId={chat.id}
cloneChatHandler={() => {
cloneChatHandler(chat.id);
}}
shareHandler={() => {
shareChatId = selectedChatId;
showShareChatModal = true;
}}
archiveChatHandler={() => {
archiveChatHandler(chat.id);
}}
renameHandler={() => {
chatTitle = chat.title;
chatTitleEditId = chat.id;
}}
deleteHandler={() => {
chatDeleteId = chat.id;
}}
onClose={() => {
selectedChatId = null; selectedChatId = null;
}} }}
> on:delete={(e) => {
<button if ((e?.detail ?? '') === 'shift') {
aria-label="Chat Menu" deleteChatHandler(chat.id);
class=" self-center dark:hover:text-white transition" } else {
on:click={() => { deleteChat = chat;
selectedChatId = chat.id; showDeleteConfirm = true;
}} }
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M2 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM6.5 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM12.5 6.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Z"
/>
</svg>
</button>
</ChatMenu>
{#if chat.id === $chatId}
<button
id="delete-chat-button"
class="hidden"
on:click={() => {
chatDeleteId = chat.id;
}} }}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M2 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM6.5 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM12.5 6.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Z"
/> />
</svg>
</button>
{/if}
</div>
{/if}
</div>
</div>
{/each} {/each}
</div> </div>
</div> </div>
......
<script lang="ts">
import { toast } from 'svelte-sonner';
import { goto, invalidate, invalidateAll } from '$app/navigation';
import { onMount, getContext, createEventDispatcher, tick } from 'svelte';
const i18n = getContext('i18n');
const dispatch = createEventDispatcher();
import {
archiveChatById,
cloneChatById,
deleteChatById,
getChatList,
updateChatById
} from '$lib/apis/chats';
import { chatId, chats, mobile, showSidebar } from '$lib/stores';
import ChatMenu from './ChatMenu.svelte';
import ShareChatModal from '$lib/components/chat/ShareChatModal.svelte';
import GarbageBin from '$lib/components/icons/GarbageBin.svelte';
import Tooltip from '$lib/components/common/Tooltip.svelte';
import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte';
export let chat;
export let selected = false;
export let shiftKey = false;
let mouseOver = false;
let showShareChatModal = false;
let confirmEdit = false;
let chatTitle = chat.title;
const editChatTitle = async (id, _title) => {
if (_title === '') {
toast.error($i18n.t('Title cannot be an empty string.'));
} else {
await updateChatById(localStorage.token, id, {
title: _title
});
await chats.set(await getChatList(localStorage.token));
}
};
const cloneChatHandler = async (id) => {
const res = await cloneChatById(localStorage.token, id).catch((error) => {
toast.error(error);
return null;
});
if (res) {
goto(`/c/${res.id}`);
await chats.set(await getChatList(localStorage.token));
}
};
const archiveChatHandler = async (id) => {
await archiveChatById(localStorage.token, id);
await chats.set(await getChatList(localStorage.token));
};
const focusEdit = async (node: HTMLInputElement) => {
node.focus();
};
</script>
<ShareChatModal bind:show={showShareChatModal} chatId={chat.id} />
<div class=" w-full pr-2 relative group">
{#if confirmEdit}
<div
class=" w-full flex justify-between rounded-xl px-3 py-2 {chat.id === $chatId || confirmEdit
? 'bg-gray-200 dark:bg-gray-900'
: selected
? 'bg-gray-100 dark:bg-gray-950'
: 'group-hover:bg-gray-100 dark:group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis"
>
<input
use:focusEdit
bind:value={chatTitle}
class=" bg-transparent w-full outline-none mr-10"
/>
</div>
{:else}
<a
class=" w-full flex justify-between rounded-xl px-3 py-2 {chat.id === $chatId || confirmEdit
? 'bg-gray-200 dark:bg-gray-900'
: selected
? 'bg-gray-100 dark:bg-gray-950'
: ' group-hover:bg-gray-100 dark:group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis"
href="/c/{chat.id}"
on:click={() => {
dispatch('select');
if ($mobile) {
showSidebar.set(false);
}
}}
on:dblclick={() => {
chatTitle = chat.title;
confirmEdit = true;
}}
on:mouseenter={(e) => {
mouseOver = true;
}}
on:mouseleave={(e) => {
mouseOver = false;
}}
on:focus={(e) => {}}
draggable="false"
>
<div class=" flex self-center flex-1 w-full">
<div class=" text-left self-center overflow-hidden w-full h-[20px]">
{chat.title}
</div>
</div>
</a>
{/if}
<!-- svelte-ignore a11y-no-static-element-interactions -->
<div
class="
{chat.id === $chatId || confirmEdit
? 'from-gray-200 dark:from-gray-900'
: selected
? 'from-gray-100 dark:from-gray-950'
: 'invisible group-hover:visible from-gray-100 dark:from-gray-950'}
absolute right-[10px] top-[10px] pr-2 pl-5 bg-gradient-to-l from-80%
to-transparent"
on:mouseenter={(e) => {
mouseOver = true;
}}
on:mouseleave={(e) => {
mouseOver = false;
}}
>
{#if confirmEdit}
<div class="flex self-center space-x-1.5 z-10">
<Tooltip content="Confirm">
<button
class=" self-center dark:hover:text-white transition"
on:click={() => {
editChatTitle(chat.id, chatTitle);
confirmEdit = false;
chatTitle = '';
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4"
>
<path
fill-rule="evenodd"
d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
clip-rule="evenodd"
/>
</svg>
</button>
</Tooltip>
<Tooltip content="Cancel">
<button
class=" self-center dark:hover:text-white transition"
on:click={() => {
confirmEdit = false;
chatTitle = '';
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
/>
</svg>
</button>
</Tooltip>
</div>
{:else if shiftKey && mouseOver}
<div class=" flex items-center self-center space-x-1.5">
<Tooltip content="Archive" className="flex items-center">
<button
class=" self-center dark:hover:text-white transition"
on:click={() => {
archiveChatHandler(chat.id);
}}
type="button"
>
<ArchiveBox className="size-4 translate-y-[0.5px]" strokeWidth="2" />
</button>
</Tooltip>
<Tooltip content="Delete">
<button
class=" self-center dark:hover:text-white transition"
on:click={() => {
dispatch('delete', 'shift');
}}
type="button"
>
<GarbageBin strokeWidth="2" />
</button>
</Tooltip>
</div>
{:else}
<div class="flex self-center space-x-1 z-10">
<ChatMenu
chatId={chat.id}
cloneChatHandler={() => {
cloneChatHandler(chat.id);
}}
shareHandler={() => {
showShareChatModal = true;
}}
archiveChatHandler={() => {
archiveChatHandler(chat.id);
}}
renameHandler={() => {
chatTitle = chat.title;
confirmEdit = true;
}}
deleteHandler={() => {
dispatch('delete');
}}
onClose={() => {
dispatch('unselect');
}}
>
<button
aria-label="Chat Menu"
class=" self-center dark:hover:text-white transition"
on:click={() => {
dispatch('select');
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M2 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM6.5 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM12.5 6.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Z"
/>
</svg>
</button>
</ChatMenu>
{#if chat.id === $chatId}
<!-- Shortcut support using "delete-chat-button" id -->
<button
id="delete-chat-button"
class="hidden"
on:click={() => {
dispatch('delete');
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M2 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM6.5 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM12.5 6.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Z"
/>
</svg>
</button>
{/if}
</div>
{/if}
</div>
</div>
...@@ -17,15 +17,19 @@ ...@@ -17,15 +17,19 @@
import EllipsisHorizontal from '../icons/EllipsisHorizontal.svelte'; import EllipsisHorizontal from '../icons/EllipsisHorizontal.svelte';
import ModelMenu from './Models/ModelMenu.svelte'; import ModelMenu from './Models/ModelMenu.svelte';
import ModelDeleteConfirmDialog from '../common/ConfirmDialog.svelte';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
let showModelDeleteConfirm = false;
let localModelfiles = []; let localModelfiles = [];
let importFiles; let importFiles;
let modelsImportInputElement: HTMLInputElement; let modelsImportInputElement: HTMLInputElement;
let _models = []; let _models = [];
let selectedModel = null;
let sortable = null; let sortable = null;
let searchValue = ''; let searchValue = '';
...@@ -199,6 +203,13 @@ ...@@ -199,6 +203,13 @@
</title> </title>
</svelte:head> </svelte:head>
<ModelDeleteConfirmDialog
bind:show={showModelDeleteConfirm}
on:confirm={() => {
deleteModelHandler(selectedModel);
}}
/>
<div class=" text-lg font-semibold mb-3">{$i18n.t('Models')}</div> <div class=" text-lg font-semibold mb-3">{$i18n.t('Models')}</div>
<div class=" flex w-full space-x-2"> <div class=" flex w-full space-x-2">
...@@ -339,7 +350,8 @@ ...@@ -339,7 +350,8 @@
hideModelHandler(model); hideModelHandler(model);
}} }}
deleteHandler={() => { deleteHandler={() => {
deleteModelHandler(model); selectedModel = model;
showModelDeleteConfirm = true;
}} }}
onClose={() => {}} onClose={() => {}}
> >
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
"Allow": "يسمح", "Allow": "يسمح",
"Allow Chat Deletion": "يستطيع حذف المحادثات", "Allow Chat Deletion": "يستطيع حذف المحادثات",
"Allow non-local voices": "", "Allow non-local voices": "",
"Allow User Location": "",
"alphanumeric characters and hyphens": "الأحرف الأبجدية الرقمية والواصلات", "alphanumeric characters and hyphens": "الأحرف الأبجدية الرقمية والواصلات",
"Already have an account?": "هل تملك حساب ؟", "Already have an account?": "هل تملك حساب ؟",
"an assistant": "مساعد", "an assistant": "مساعد",
...@@ -69,6 +70,7 @@ ...@@ -69,6 +70,7 @@
"Bad Response": "استجابة خطاء", "Bad Response": "استجابة خطاء",
"Banners": "لافتات", "Banners": "لافتات",
"Base Model (From)": "النموذج الأساسي (من)", "Base Model (From)": "النموذج الأساسي (من)",
"Batch Size (num_batch)": "",
"before": "قبل", "before": "قبل",
"Being lazy": "كون كسول", "Being lazy": "كون كسول",
"Brave Search API Key": "مفتاح واجهة برمجة تطبيقات البحث الشجاع", "Brave Search API Key": "مفتاح واجهة برمجة تطبيقات البحث الشجاع",
...@@ -160,6 +162,7 @@ ...@@ -160,6 +162,7 @@
"Discover, download, and explore custom prompts": "اكتشاف وتنزيل واستكشاف المطالبات المخصصة", "Discover, download, and explore custom prompts": "اكتشاف وتنزيل واستكشاف المطالبات المخصصة",
"Discover, download, and explore model presets": "اكتشاف وتنزيل واستكشاف الإعدادات المسبقة للنموذج", "Discover, download, and explore model presets": "اكتشاف وتنزيل واستكشاف الإعدادات المسبقة للنموذج",
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "",
"Display the username instead of You in the Chat": "اعرض اسم المستخدم بدلاً منك في الدردشة", "Display the username instead of You in the Chat": "اعرض اسم المستخدم بدلاً منك في الدردشة",
"Document": "المستند", "Document": "المستند",
"Document Settings": "أعدادات المستند", "Document Settings": "أعدادات المستند",
...@@ -176,6 +179,7 @@ ...@@ -176,6 +179,7 @@
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "e.g. '30s','10m'. الوحدات الزمنية الصالحة هي 's', 'm', 'h'.", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "e.g. '30s','10m'. الوحدات الزمنية الصالحة هي 's', 'm', 'h'.",
"Edit": "تعديل", "Edit": "تعديل",
"Edit Doc": "تعديل الملف", "Edit Doc": "تعديل الملف",
"Edit Memory": "",
"Edit User": "تعديل المستخدم", "Edit User": "تعديل المستخدم",
"Email": "البريد", "Email": "البريد",
"Embedding Batch Size": "", "Embedding Batch Size": "",
...@@ -205,6 +209,7 @@ ...@@ -205,6 +209,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serpstack", "Enter Serpstack API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serpstack",
"Enter stop sequence": "أدخل تسلسل التوقف", "Enter stop sequence": "أدخل تسلسل التوقف",
"Enter Tavily API Key": "",
"Enter Top K": "أدخل Top K", "Enter Top K": "أدخل Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "الرابط (e.g. http://127.0.0.1:7860/)", "Enter URL (e.g. http://127.0.0.1:7860/)": "الرابط (e.g. http://127.0.0.1:7860/)",
"Enter URL (e.g. http://localhost:11434)": "URL (e.g. http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "URL (e.g. http://localhost:11434)",
...@@ -280,6 +285,7 @@ ...@@ -280,6 +285,7 @@
"Knowledge": "", "Knowledge": "",
"Language": "اللغة", "Language": "اللغة",
"Last Active": "آخر نشاط", "Last Active": "آخر نشاط",
"Last Modified": "",
"Light": "فاتح", "Light": "فاتح",
"Listening...": "", "Listening...": "",
"LLMs can make mistakes. Verify important information.": "يمكن أن تصدر بعض الأخطاء. لذلك يجب التحقق من المعلومات المهمة", "LLMs can make mistakes. Verify important information.": "يمكن أن تصدر بعض الأخطاء. لذلك يجب التحقق من المعلومات المهمة",
...@@ -304,6 +310,7 @@ ...@@ -304,6 +310,7 @@
"Mirostat Tau": "Mirostat Tau", "Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "MMMM DD, YYYY", "MMMM DD, YYYY": "MMMM DD, YYYY",
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm", "MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
"MMMM DD, YYYY hh:mm:ss A": "",
"Model '{{modelName}}' has been successfully downloaded.": "تم تحميل النموذج '{{modelName}}' بنجاح", "Model '{{modelName}}' has been successfully downloaded.": "تم تحميل النموذج '{{modelName}}' بنجاح",
"Model '{{modelTag}}' is already in queue for downloading.": "النموذج '{{modelTag}}' موجود بالفعل في قائمة الانتظار للتحميل", "Model '{{modelTag}}' is already in queue for downloading.": "النموذج '{{modelTag}}' موجود بالفعل في قائمة الانتظار للتحميل",
"Model {{modelId}} not found": "لم يتم العثور على النموذج {{modelId}}.", "Model {{modelId}} not found": "لم يتم العثور على النموذج {{modelId}}.",
...@@ -492,6 +499,8 @@ ...@@ -492,6 +499,8 @@
"System": "النظام", "System": "النظام",
"System Prompt": "محادثة النظام", "System Prompt": "محادثة النظام",
"Tags": "الوسوم", "Tags": "الوسوم",
"Tap to interrupt": "",
"Tavily API Key": "",
"Tell us more:": "أخبرنا المزيد:", "Tell us more:": "أخبرنا المزيد:",
"Temperature": "درجة حرارة", "Temperature": "درجة حرارة",
"Template": "نموذج", "Template": "نموذج",
...@@ -522,6 +531,7 @@ ...@@ -522,6 +531,7 @@
"Today": "اليوم", "Today": "اليوم",
"Toggle settings": "فتح وأغلاق الاعدادات", "Toggle settings": "فتح وأغلاق الاعدادات",
"Toggle sidebar": "فتح وأغلاق الشريط الجانبي", "Toggle sidebar": "فتح وأغلاق الشريط الجانبي",
"Tokens To Keep On Context Refresh (num_keep)": "",
"Tools": "", "Tools": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
...@@ -533,8 +543,10 @@ ...@@ -533,8 +543,10 @@
"Type Hugging Face Resolve (Download) URL": "اكتب عنوان URL لحل مشكلة الوجه (تنزيل).", "Type Hugging Face Resolve (Download) URL": "اكتب عنوان URL لحل مشكلة الوجه (تنزيل).",
"Uh-oh! There was an issue connecting to {{provider}}.": "{{provider}}خطاء أوه! حدثت مشكلة في الاتصال بـ ", "Uh-oh! There was an issue connecting to {{provider}}.": "{{provider}}خطاء أوه! حدثت مشكلة في الاتصال بـ ",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "نوع ملف غير معروف '{{file_type}}', ولكن القبول والتعامل كنص عادي ", "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "نوع ملف غير معروف '{{file_type}}', ولكن القبول والتعامل كنص عادي ",
"Update": "",
"Update and Copy Link": "تحديث ونسخ الرابط", "Update and Copy Link": "تحديث ونسخ الرابط",
"Update password": "تحديث كلمة المرور", "Update password": "تحديث كلمة المرور",
"Updated at": "",
"Upload a GGUF model": "GGUF رفع موديل نوع", "Upload a GGUF model": "GGUF رفع موديل نوع",
"Upload Files": "تحميل الملفات", "Upload Files": "تحميل الملفات",
"Upload Pipeline": "", "Upload Pipeline": "",
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
"Allow": "Позволи", "Allow": "Позволи",
"Allow Chat Deletion": "Позволи Изтриване на Чат", "Allow Chat Deletion": "Позволи Изтриване на Чат",
"Allow non-local voices": "", "Allow non-local voices": "",
"Allow User Location": "",
"alphanumeric characters and hyphens": "алфанумерични знаци и тире", "alphanumeric characters and hyphens": "алфанумерични знаци и тире",
"Already have an account?": "Вече имате акаунт? ", "Already have an account?": "Вече имате акаунт? ",
"an assistant": "асистент", "an assistant": "асистент",
...@@ -69,6 +70,7 @@ ...@@ -69,6 +70,7 @@
"Bad Response": "Невалиден отговор от API", "Bad Response": "Невалиден отговор от API",
"Banners": "Банери", "Banners": "Банери",
"Base Model (From)": "Базов модел (от)", "Base Model (From)": "Базов модел (от)",
"Batch Size (num_batch)": "",
"before": "преди", "before": "преди",
"Being lazy": "Да бъдеш мързелив", "Being lazy": "Да бъдеш мързелив",
"Brave Search API Key": "Смел ключ за API за търсене", "Brave Search API Key": "Смел ключ за API за търсене",
...@@ -160,6 +162,7 @@ ...@@ -160,6 +162,7 @@
"Discover, download, and explore custom prompts": "Откриване, сваляне и преглед на персонализирани промптове", "Discover, download, and explore custom prompts": "Откриване, сваляне и преглед на персонализирани промптове",
"Discover, download, and explore model presets": "Откриване, сваляне и преглед на пресетове на модели", "Discover, download, and explore model presets": "Откриване, сваляне и преглед на пресетове на модели",
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "",
"Display the username instead of You in the Chat": "Показване на потребителското име вместо Вие в чата", "Display the username instead of You in the Chat": "Показване на потребителското име вместо Вие в чата",
"Document": "Документ", "Document": "Документ",
"Document Settings": "Документ Настройки", "Document Settings": "Документ Настройки",
...@@ -176,6 +179,7 @@ ...@@ -176,6 +179,7 @@
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "напр. '30с','10м'. Валидни единици са 'с', 'м', 'ч'.", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "напр. '30с','10м'. Валидни единици са 'с', 'м', 'ч'.",
"Edit": "Редактиране", "Edit": "Редактиране",
"Edit Doc": "Редактиране на документ", "Edit Doc": "Редактиране на документ",
"Edit Memory": "",
"Edit User": "Редактиране на потребител", "Edit User": "Редактиране на потребител",
"Email": "Имейл", "Email": "Имейл",
"Embedding Batch Size": "", "Embedding Batch Size": "",
...@@ -205,6 +209,7 @@ ...@@ -205,6 +209,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "Въведете Serpstack API ключ", "Enter Serpstack API Key": "Въведете Serpstack API ключ",
"Enter stop sequence": "Въведете стоп последователност", "Enter stop sequence": "Въведете стоп последователност",
"Enter Tavily API Key": "",
"Enter Top K": "Въведете Top K", "Enter Top K": "Въведете Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Въведете URL (напр. http://127.0.0.1:7860/)", "Enter URL (e.g. http://127.0.0.1:7860/)": "Въведете URL (напр. http://127.0.0.1:7860/)",
"Enter URL (e.g. http://localhost:11434)": "Въведете URL (напр. http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "Въведете URL (напр. http://localhost:11434)",
...@@ -280,6 +285,7 @@ ...@@ -280,6 +285,7 @@
"Knowledge": "", "Knowledge": "",
"Language": "Език", "Language": "Език",
"Last Active": "Последни активни", "Last Active": "Последни активни",
"Last Modified": "",
"Light": "Светъл", "Light": "Светъл",
"Listening...": "", "Listening...": "",
"LLMs can make mistakes. Verify important information.": "LLMs могат да правят грешки. Проверете важните данни.", "LLMs can make mistakes. Verify important information.": "LLMs могат да правят грешки. Проверете важните данни.",
...@@ -304,6 +310,7 @@ ...@@ -304,6 +310,7 @@
"Mirostat Tau": "Mirostat Tau", "Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "MMMM DD, YYYY", "MMMM DD, YYYY": "MMMM DD, YYYY",
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm", "MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
"MMMM DD, YYYY hh:mm:ss A": "",
"Model '{{modelName}}' has been successfully downloaded.": "Моделът '{{modelName}}' беше успешно свален.", "Model '{{modelName}}' has been successfully downloaded.": "Моделът '{{modelName}}' беше успешно свален.",
"Model '{{modelTag}}' is already in queue for downloading.": "Моделът '{{modelTag}}' е вече в очакване за сваляне.", "Model '{{modelTag}}' is already in queue for downloading.": "Моделът '{{modelTag}}' е вече в очакване за сваляне.",
"Model {{modelId}} not found": "Моделът {{modelId}} не е намерен", "Model {{modelId}} not found": "Моделът {{modelId}} не е намерен",
...@@ -488,6 +495,8 @@ ...@@ -488,6 +495,8 @@
"System": "Система", "System": "Система",
"System Prompt": "Системен Промпт", "System Prompt": "Системен Промпт",
"Tags": "Тагове", "Tags": "Тагове",
"Tap to interrupt": "",
"Tavily API Key": "",
"Tell us more:": "Повече информация:", "Tell us more:": "Повече информация:",
"Temperature": "Температура", "Temperature": "Температура",
"Template": "Шаблон", "Template": "Шаблон",
...@@ -518,6 +527,7 @@ ...@@ -518,6 +527,7 @@
"Today": "днес", "Today": "днес",
"Toggle settings": "Toggle settings", "Toggle settings": "Toggle settings",
"Toggle sidebar": "Toggle sidebar", "Toggle sidebar": "Toggle sidebar",
"Tokens To Keep On Context Refresh (num_keep)": "",
"Tools": "", "Tools": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
...@@ -529,8 +539,10 @@ ...@@ -529,8 +539,10 @@
"Type Hugging Face Resolve (Download) URL": "Въведете Hugging Face Resolve (Download) URL", "Type Hugging Face Resolve (Download) URL": "Въведете Hugging Face Resolve (Download) URL",
"Uh-oh! There was an issue connecting to {{provider}}.": "О, не! Възникна проблем при свързването с {{provider}}.", "Uh-oh! There was an issue connecting to {{provider}}.": "О, не! Възникна проблем при свързването с {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Непознат файлов тип '{{file_type}}', но се приема и обработва като текст", "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Непознат файлов тип '{{file_type}}', но се приема и обработва като текст",
"Update": "",
"Update and Copy Link": "Обнови и копирай връзка", "Update and Copy Link": "Обнови и копирай връзка",
"Update password": "Обновяване на парола", "Update password": "Обновяване на парола",
"Updated at": "",
"Upload a GGUF model": "Качване на GGUF модел", "Upload a GGUF model": "Качване на GGUF модел",
"Upload Files": "Качване на файлове", "Upload Files": "Качване на файлове",
"Upload Pipeline": "", "Upload Pipeline": "",
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
"Allow": "অনুমোদন", "Allow": "অনুমোদন",
"Allow Chat Deletion": "চ্যাট ডিলিট করতে দিন", "Allow Chat Deletion": "চ্যাট ডিলিট করতে দিন",
"Allow non-local voices": "", "Allow non-local voices": "",
"Allow User Location": "",
"alphanumeric characters and hyphens": "ইংরেজি অক্ষর, সংখ্যা এবং হাইফেন", "alphanumeric characters and hyphens": "ইংরেজি অক্ষর, সংখ্যা এবং হাইফেন",
"Already have an account?": "আগে থেকেই একাউন্ট আছে?", "Already have an account?": "আগে থেকেই একাউন্ট আছে?",
"an assistant": "একটা এসিস্ট্যান্ট", "an assistant": "একটা এসিস্ট্যান্ট",
...@@ -69,6 +70,7 @@ ...@@ -69,6 +70,7 @@
"Bad Response": "খারাপ প্রতিক্রিয়া", "Bad Response": "খারাপ প্রতিক্রিয়া",
"Banners": "ব্যানার", "Banners": "ব্যানার",
"Base Model (From)": "বেস মডেল (থেকে)", "Base Model (From)": "বেস মডেল (থেকে)",
"Batch Size (num_batch)": "",
"before": "পূর্ববর্তী", "before": "পূর্ববর্তী",
"Being lazy": "অলস হওয়া", "Being lazy": "অলস হওয়া",
"Brave Search API Key": "সাহসী অনুসন্ধান API কী", "Brave Search API Key": "সাহসী অনুসন্ধান API কী",
...@@ -160,6 +162,7 @@ ...@@ -160,6 +162,7 @@
"Discover, download, and explore custom prompts": "কাস্টম প্রম্পটগুলো আবিস্কার, ডাউনলোড এবং এক্সপ্লোর করুন", "Discover, download, and explore custom prompts": "কাস্টম প্রম্পটগুলো আবিস্কার, ডাউনলোড এবং এক্সপ্লোর করুন",
"Discover, download, and explore model presets": "মডেল প্রিসেটগুলো আবিস্কার, ডাউনলোড এবং এক্সপ্লোর করুন", "Discover, download, and explore model presets": "মডেল প্রিসেটগুলো আবিস্কার, ডাউনলোড এবং এক্সপ্লোর করুন",
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "",
"Display the username instead of You in the Chat": "চ্যাটে 'আপনি'-র পরবর্তে ইউজারনেম দেখান", "Display the username instead of You in the Chat": "চ্যাটে 'আপনি'-র পরবর্তে ইউজারনেম দেখান",
"Document": "ডকুমেন্ট", "Document": "ডকুমেন্ট",
"Document Settings": "ডকুমেন্ট সেটিংসমূহ", "Document Settings": "ডকুমেন্ট সেটিংসমূহ",
...@@ -176,6 +179,7 @@ ...@@ -176,6 +179,7 @@
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "যেমন '30s','10m'. সময়ের অনুমোদিত অনুমোদিত এককগুলি হচ্ছে 's', 'm', 'h'.", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "যেমন '30s','10m'. সময়ের অনুমোদিত অনুমোদিত এককগুলি হচ্ছে 's', 'm', 'h'.",
"Edit": "এডিট করুন", "Edit": "এডিট করুন",
"Edit Doc": "ডকুমেন্ট এডিট করুন", "Edit Doc": "ডকুমেন্ট এডিট করুন",
"Edit Memory": "",
"Edit User": "ইউজার এডিট করুন", "Edit User": "ইউজার এডিট করুন",
"Email": "ইমেইল", "Email": "ইমেইল",
"Embedding Batch Size": "", "Embedding Batch Size": "",
...@@ -205,6 +209,7 @@ ...@@ -205,6 +209,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "Serpstack API কী লিখুন", "Enter Serpstack API Key": "Serpstack API কী লিখুন",
"Enter stop sequence": "স্টপ সিকোয়েন্স লিখুন", "Enter stop sequence": "স্টপ সিকোয়েন্স লিখুন",
"Enter Tavily API Key": "",
"Enter Top K": "Top K লিখুন", "Enter Top K": "Top K লিখুন",
"Enter URL (e.g. http://127.0.0.1:7860/)": "ইউআরএল দিন (যেমন http://127.0.0.1:7860/)", "Enter URL (e.g. http://127.0.0.1:7860/)": "ইউআরএল দিন (যেমন http://127.0.0.1:7860/)",
"Enter URL (e.g. http://localhost:11434)": "ইউআরএল দিন (যেমন http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "ইউআরএল দিন (যেমন http://localhost:11434)",
...@@ -280,6 +285,7 @@ ...@@ -280,6 +285,7 @@
"Knowledge": "", "Knowledge": "",
"Language": "ভাষা", "Language": "ভাষা",
"Last Active": "সর্বশেষ সক্রিয়", "Last Active": "সর্বশেষ সক্রিয়",
"Last Modified": "",
"Light": "লাইট", "Light": "লাইট",
"Listening...": "", "Listening...": "",
"LLMs can make mistakes. Verify important information.": "LLM ভুল করতে পারে। গুরুত্বপূর্ণ তথ্য যাচাই করে নিন।", "LLMs can make mistakes. Verify important information.": "LLM ভুল করতে পারে। গুরুত্বপূর্ণ তথ্য যাচাই করে নিন।",
...@@ -304,6 +310,7 @@ ...@@ -304,6 +310,7 @@
"Mirostat Tau": "Mirostat Tau", "Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "MMMM DD, YYYY", "MMMM DD, YYYY": "MMMM DD, YYYY",
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm", "MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
"MMMM DD, YYYY hh:mm:ss A": "",
"Model '{{modelName}}' has been successfully downloaded.": "'{{modelName}}' মডেল সফলভাবে ডাউনলোড হয়েছে।", "Model '{{modelName}}' has been successfully downloaded.": "'{{modelName}}' মডেল সফলভাবে ডাউনলোড হয়েছে।",
"Model '{{modelTag}}' is already in queue for downloading.": "{{modelTag}} ডাউনলোডের জন্য আগে থেকেই অপেক্ষমান আছে।", "Model '{{modelTag}}' is already in queue for downloading.": "{{modelTag}} ডাউনলোডের জন্য আগে থেকেই অপেক্ষমান আছে।",
"Model {{modelId}} not found": "{{modelId}} মডেল পাওয়া যায়নি", "Model {{modelId}} not found": "{{modelId}} মডেল পাওয়া যায়নি",
...@@ -488,6 +495,8 @@ ...@@ -488,6 +495,8 @@
"System": "সিস্টেম", "System": "সিস্টেম",
"System Prompt": "সিস্টেম প্রম্পট", "System Prompt": "সিস্টেম প্রম্পট",
"Tags": "ট্যাগসমূহ", "Tags": "ট্যাগসমূহ",
"Tap to interrupt": "",
"Tavily API Key": "",
"Tell us more:": "আরও বলুন:", "Tell us more:": "আরও বলুন:",
"Temperature": "তাপমাত্রা", "Temperature": "তাপমাত্রা",
"Template": "টেম্পলেট", "Template": "টেম্পলেট",
...@@ -518,6 +527,7 @@ ...@@ -518,6 +527,7 @@
"Today": "আজ", "Today": "আজ",
"Toggle settings": "সেটিংস টোগল", "Toggle settings": "সেটিংস টোগল",
"Toggle sidebar": "সাইডবার টোগল", "Toggle sidebar": "সাইডবার টোগল",
"Tokens To Keep On Context Refresh (num_keep)": "",
"Tools": "", "Tools": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
...@@ -529,8 +539,10 @@ ...@@ -529,8 +539,10 @@
"Type Hugging Face Resolve (Download) URL": "Hugging Face থেকে ডাউনলোড করার ইউআরএল টাইপ করুন", "Type Hugging Face Resolve (Download) URL": "Hugging Face থেকে ডাউনলোড করার ইউআরএল টাইপ করুন",
"Uh-oh! There was an issue connecting to {{provider}}.": "ওহ-হো! {{provider}} এর সাথে কানেকশনে সমস্যা হয়েছে।", "Uh-oh! There was an issue connecting to {{provider}}.": "ওহ-হো! {{provider}} এর সাথে কানেকশনে সমস্যা হয়েছে।",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "অপরিচিত ফাইল ফরম্যাট '{{file_type}}', তবে প্লেইন টেক্সট হিসেবে গ্রহণ করা হলো", "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "অপরিচিত ফাইল ফরম্যাট '{{file_type}}', তবে প্লেইন টেক্সট হিসেবে গ্রহণ করা হলো",
"Update": "",
"Update and Copy Link": "আপডেট এবং লিংক কপি করুন", "Update and Copy Link": "আপডেট এবং লিংক কপি করুন",
"Update password": "পাসওয়ার্ড আপডেট করুন", "Update password": "পাসওয়ার্ড আপডেট করুন",
"Updated at": "",
"Upload a GGUF model": "একটি GGUF মডেল আপলোড করুন", "Upload a GGUF model": "একটি GGUF মডেল আপলোড করুন",
"Upload Files": "ফাইল আপলোড করুন", "Upload Files": "ফাইল আপলোড করুন",
"Upload Pipeline": "", "Upload Pipeline": "",
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
"Allow": "Permet", "Allow": "Permet",
"Allow Chat Deletion": "Permet la Supressió del Xat", "Allow Chat Deletion": "Permet la Supressió del Xat",
"Allow non-local voices": "", "Allow non-local voices": "",
"Allow User Location": "",
"alphanumeric characters and hyphens": "caràcters alfanumèrics i guions", "alphanumeric characters and hyphens": "caràcters alfanumèrics i guions",
"Already have an account?": "Ja tens un compte?", "Already have an account?": "Ja tens un compte?",
"an assistant": "un assistent", "an assistant": "un assistent",
...@@ -69,6 +70,7 @@ ...@@ -69,6 +70,7 @@
"Bad Response": "Resposta Erroni", "Bad Response": "Resposta Erroni",
"Banners": "Banners", "Banners": "Banners",
"Base Model (From)": "Model base (des de)", "Base Model (From)": "Model base (des de)",
"Batch Size (num_batch)": "",
"before": "abans", "before": "abans",
"Being lazy": "Ser l'estupidez", "Being lazy": "Ser l'estupidez",
"Brave Search API Key": "Clau API Brave Search", "Brave Search API Key": "Clau API Brave Search",
...@@ -160,6 +162,7 @@ ...@@ -160,6 +162,7 @@
"Discover, download, and explore custom prompts": "Descobreix, descarrega i explora prompts personalitzats", "Discover, download, and explore custom prompts": "Descobreix, descarrega i explora prompts personalitzats",
"Discover, download, and explore model presets": "Descobreix, descarrega i explora presets de models", "Discover, download, and explore model presets": "Descobreix, descarrega i explora presets de models",
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "",
"Display the username instead of You in the Chat": "Mostra el nom d'usuari en lloc de 'Tu' al Xat", "Display the username instead of You in the Chat": "Mostra el nom d'usuari en lloc de 'Tu' al Xat",
"Document": "Document", "Document": "Document",
"Document Settings": "Configuració de Documents", "Document Settings": "Configuració de Documents",
...@@ -176,6 +179,7 @@ ...@@ -176,6 +179,7 @@
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p. ex. '30s','10m'. Les unitats de temps vàlides són 's', 'm', 'h'.", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p. ex. '30s','10m'. Les unitats de temps vàlides són 's', 'm', 'h'.",
"Edit": "Editar", "Edit": "Editar",
"Edit Doc": "Edita Document", "Edit Doc": "Edita Document",
"Edit Memory": "",
"Edit User": "Edita Usuari", "Edit User": "Edita Usuari",
"Email": "Correu electrònic", "Email": "Correu electrònic",
"Embedding Batch Size": "", "Embedding Batch Size": "",
...@@ -205,6 +209,7 @@ ...@@ -205,6 +209,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "Introduïu la clau de l'API Serpstack", "Enter Serpstack API Key": "Introduïu la clau de l'API Serpstack",
"Enter stop sequence": "Introdueix la seqüència de parada", "Enter stop sequence": "Introdueix la seqüència de parada",
"Enter Tavily API Key": "",
"Enter Top K": "Introdueix Top K", "Enter Top K": "Introdueix Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Introdueix l'URL (p. ex. http://127.0.0.1:7860/)", "Enter URL (e.g. http://127.0.0.1:7860/)": "Introdueix l'URL (p. ex. http://127.0.0.1:7860/)",
"Enter URL (e.g. http://localhost:11434)": "Introdueix l'URL (p. ex. http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "Introdueix l'URL (p. ex. http://localhost:11434)",
...@@ -280,6 +285,7 @@ ...@@ -280,6 +285,7 @@
"Knowledge": "", "Knowledge": "",
"Language": "Idioma", "Language": "Idioma",
"Last Active": "Últim Actiu", "Last Active": "Últim Actiu",
"Last Modified": "",
"Light": "Clar", "Light": "Clar",
"Listening...": "", "Listening...": "",
"LLMs can make mistakes. Verify important information.": "Els LLMs poden cometre errors. Verifica la informació important.", "LLMs can make mistakes. Verify important information.": "Els LLMs poden cometre errors. Verifica la informació important.",
...@@ -304,6 +310,7 @@ ...@@ -304,6 +310,7 @@
"Mirostat Tau": "Tau de Mirostat", "Mirostat Tau": "Tau de Mirostat",
"MMMM DD, YYYY": "DD de MMMM, YYYY", "MMMM DD, YYYY": "DD de MMMM, YYYY",
"MMMM DD, YYYY HH:mm": "DD de MMMM, YYYY HH:mm", "MMMM DD, YYYY HH:mm": "DD de MMMM, YYYY HH:mm",
"MMMM DD, YYYY hh:mm:ss A": "",
"Model '{{modelName}}' has been successfully downloaded.": "El model '{{modelName}}' s'ha descarregat amb èxit.", "Model '{{modelName}}' has been successfully downloaded.": "El model '{{modelName}}' s'ha descarregat amb èxit.",
"Model '{{modelTag}}' is already in queue for downloading.": "El model '{{modelTag}}' ja està en cua per ser descarregat.", "Model '{{modelTag}}' is already in queue for downloading.": "El model '{{modelTag}}' ja està en cua per ser descarregat.",
"Model {{modelId}} not found": "Model {{modelId}} no trobat", "Model {{modelId}} not found": "Model {{modelId}} no trobat",
...@@ -489,6 +496,8 @@ ...@@ -489,6 +496,8 @@
"System": "Sistema", "System": "Sistema",
"System Prompt": "Prompt del Sistema", "System Prompt": "Prompt del Sistema",
"Tags": "Etiquetes", "Tags": "Etiquetes",
"Tap to interrupt": "",
"Tavily API Key": "",
"Tell us more:": "Dóna'ns més informació:", "Tell us more:": "Dóna'ns més informació:",
"Temperature": "Temperatura", "Temperature": "Temperatura",
"Template": "Plantilla", "Template": "Plantilla",
...@@ -519,6 +528,7 @@ ...@@ -519,6 +528,7 @@
"Today": "Avui", "Today": "Avui",
"Toggle settings": "Commuta configuracions", "Toggle settings": "Commuta configuracions",
"Toggle sidebar": "Commuta barra lateral", "Toggle sidebar": "Commuta barra lateral",
"Tokens To Keep On Context Refresh (num_keep)": "",
"Tools": "", "Tools": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
...@@ -530,8 +540,10 @@ ...@@ -530,8 +540,10 @@
"Type Hugging Face Resolve (Download) URL": "Escriu URL de Resolució (Descàrrega) de Hugging Face", "Type Hugging Face Resolve (Download) URL": "Escriu URL de Resolució (Descàrrega) de Hugging Face",
"Uh-oh! There was an issue connecting to {{provider}}.": "Uf! Hi va haver un problema connectant-se a {{provider}}.", "Uh-oh! There was an issue connecting to {{provider}}.": "Uf! Hi va haver un problema connectant-se a {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipus d'Arxiu Desconegut '{{file_type}}', però acceptant i tractant com a text pla", "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipus d'Arxiu Desconegut '{{file_type}}', però acceptant i tractant com a text pla",
"Update": "",
"Update and Copy Link": "Actualitza i Copia enllaç", "Update and Copy Link": "Actualitza i Copia enllaç",
"Update password": "Actualitza contrasenya", "Update password": "Actualitza contrasenya",
"Updated at": "",
"Upload a GGUF model": "Puja un model GGUF", "Upload a GGUF model": "Puja un model GGUF",
"Upload Files": "Pujar fitxers", "Upload Files": "Pujar fitxers",
"Upload Pipeline": "", "Upload Pipeline": "",
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
"Allow": "Sa pagtugot", "Allow": "Sa pagtugot",
"Allow Chat Deletion": "Tugoti nga mapapas ang mga chat", "Allow Chat Deletion": "Tugoti nga mapapas ang mga chat",
"Allow non-local voices": "", "Allow non-local voices": "",
"Allow User Location": "",
"alphanumeric characters and hyphens": "alphanumeric nga mga karakter ug hyphen", "alphanumeric characters and hyphens": "alphanumeric nga mga karakter ug hyphen",
"Already have an account?": "Naa na kay account ?", "Already have an account?": "Naa na kay account ?",
"an assistant": "usa ka katabang", "an assistant": "usa ka katabang",
...@@ -69,6 +70,7 @@ ...@@ -69,6 +70,7 @@
"Bad Response": "", "Bad Response": "",
"Banners": "", "Banners": "",
"Base Model (From)": "", "Base Model (From)": "",
"Batch Size (num_batch)": "",
"before": "", "before": "",
"Being lazy": "", "Being lazy": "",
"Brave Search API Key": "", "Brave Search API Key": "",
...@@ -160,6 +162,7 @@ ...@@ -160,6 +162,7 @@
"Discover, download, and explore custom prompts": "Pagdiskubre, pag-download ug pagsuhid sa mga naandan nga pag-aghat", "Discover, download, and explore custom prompts": "Pagdiskubre, pag-download ug pagsuhid sa mga naandan nga pag-aghat",
"Discover, download, and explore model presets": "Pagdiskobre, pag-download, ug pagsuhid sa mga preset sa template", "Discover, download, and explore model presets": "Pagdiskobre, pag-download, ug pagsuhid sa mga preset sa template",
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "",
"Display the username instead of You in the Chat": "Ipakita ang username imbes nga 'Ikaw' sa Panaghisgutan", "Display the username instead of You in the Chat": "Ipakita ang username imbes nga 'Ikaw' sa Panaghisgutan",
"Document": "Dokumento", "Document": "Dokumento",
"Document Settings": "Mga Setting sa Dokumento", "Document Settings": "Mga Setting sa Dokumento",
...@@ -176,6 +179,7 @@ ...@@ -176,6 +179,7 @@
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p. ", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p. ",
"Edit": "", "Edit": "",
"Edit Doc": "I-edit ang dokumento", "Edit Doc": "I-edit ang dokumento",
"Edit Memory": "",
"Edit User": "I-edit ang tiggamit", "Edit User": "I-edit ang tiggamit",
"Email": "E-mail", "Email": "E-mail",
"Embedding Batch Size": "", "Embedding Batch Size": "",
...@@ -205,6 +209,7 @@ ...@@ -205,6 +209,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "", "Enter Serpstack API Key": "",
"Enter stop sequence": "Pagsulod sa katapusan nga han-ay", "Enter stop sequence": "Pagsulod sa katapusan nga han-ay",
"Enter Tavily API Key": "",
"Enter Top K": "Pagsulod sa Top K", "Enter Top K": "Pagsulod sa Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Pagsulod sa URL (e.g. http://127.0.0.1:7860/)", "Enter URL (e.g. http://127.0.0.1:7860/)": "Pagsulod sa URL (e.g. http://127.0.0.1:7860/)",
"Enter URL (e.g. http://localhost:11434)": "", "Enter URL (e.g. http://localhost:11434)": "",
...@@ -280,6 +285,7 @@ ...@@ -280,6 +285,7 @@
"Knowledge": "", "Knowledge": "",
"Language": "Pinulongan", "Language": "Pinulongan",
"Last Active": "", "Last Active": "",
"Last Modified": "",
"Light": "Kahayag", "Light": "Kahayag",
"Listening...": "", "Listening...": "",
"LLMs can make mistakes. Verify important information.": "Ang mga LLM mahimong masayop. ", "LLMs can make mistakes. Verify important information.": "Ang mga LLM mahimong masayop. ",
...@@ -304,6 +310,7 @@ ...@@ -304,6 +310,7 @@
"Mirostat Tau": "Mirostat Tau", "Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "MMMM DD, YYYY", "MMMM DD, YYYY": "MMMM DD, YYYY",
"MMMM DD, YYYY HH:mm": "", "MMMM DD, YYYY HH:mm": "",
"MMMM DD, YYYY hh:mm:ss A": "",
"Model '{{modelName}}' has been successfully downloaded.": "Ang modelo'{{modelName}}' malampuson nga na-download.", "Model '{{modelName}}' has been successfully downloaded.": "Ang modelo'{{modelName}}' malampuson nga na-download.",
"Model '{{modelTag}}' is already in queue for downloading.": "Ang modelo'{{modelTag}}' naa na sa pila para ma-download.", "Model '{{modelTag}}' is already in queue for downloading.": "Ang modelo'{{modelTag}}' naa na sa pila para ma-download.",
"Model {{modelId}} not found": "Modelo {{modelId}} wala makit-an", "Model {{modelId}} not found": "Modelo {{modelId}} wala makit-an",
...@@ -488,6 +495,8 @@ ...@@ -488,6 +495,8 @@
"System": "Sistema", "System": "Sistema",
"System Prompt": "Madasig nga Sistema", "System Prompt": "Madasig nga Sistema",
"Tags": "Mga tag", "Tags": "Mga tag",
"Tap to interrupt": "",
"Tavily API Key": "",
"Tell us more:": "", "Tell us more:": "",
"Temperature": "Temperatura", "Temperature": "Temperatura",
"Template": "Modelo", "Template": "Modelo",
...@@ -518,6 +527,7 @@ ...@@ -518,6 +527,7 @@
"Today": "", "Today": "",
"Toggle settings": "I-toggle ang mga setting", "Toggle settings": "I-toggle ang mga setting",
"Toggle sidebar": "I-toggle ang sidebar", "Toggle sidebar": "I-toggle ang sidebar",
"Tokens To Keep On Context Refresh (num_keep)": "",
"Tools": "", "Tools": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Ibabaw nga P", "Top P": "Ibabaw nga P",
...@@ -529,8 +539,10 @@ ...@@ -529,8 +539,10 @@
"Type Hugging Face Resolve (Download) URL": "Pagsulod sa resolusyon (pag-download) URL Hugging Face", "Type Hugging Face Resolve (Download) URL": "Pagsulod sa resolusyon (pag-download) URL Hugging Face",
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! {{provider}}.", "Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Wala mailhi nga tipo sa file '{{file_type}}', apan gidawat ug gitratar ingon yano nga teksto", "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Wala mailhi nga tipo sa file '{{file_type}}', apan gidawat ug gitratar ingon yano nga teksto",
"Update": "",
"Update and Copy Link": "", "Update and Copy Link": "",
"Update password": "I-update ang password", "Update password": "I-update ang password",
"Updated at": "",
"Upload a GGUF model": "Pag-upload ug modelo sa GGUF", "Upload a GGUF model": "Pag-upload ug modelo sa GGUF",
"Upload Files": "", "Upload Files": "",
"Upload Pipeline": "", "Upload Pipeline": "",
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
"Allow": "Erlauben", "Allow": "Erlauben",
"Allow Chat Deletion": "Chat Löschung erlauben", "Allow Chat Deletion": "Chat Löschung erlauben",
"Allow non-local voices": "Nicht-lokale Stimmen erlauben", "Allow non-local voices": "Nicht-lokale Stimmen erlauben",
"Allow User Location": "",
"alphanumeric characters and hyphens": "alphanumerische Zeichen und Bindestriche", "alphanumeric characters and hyphens": "alphanumerische Zeichen und Bindestriche",
"Already have an account?": "Hast du vielleicht schon ein Account?", "Already have an account?": "Hast du vielleicht schon ein Account?",
"an assistant": "ein Assistent", "an assistant": "ein Assistent",
...@@ -69,6 +70,7 @@ ...@@ -69,6 +70,7 @@
"Bad Response": "Schlechte Antwort", "Bad Response": "Schlechte Antwort",
"Banners": "Banner", "Banners": "Banner",
"Base Model (From)": "Basismodell (von)", "Base Model (From)": "Basismodell (von)",
"Batch Size (num_batch)": "",
"before": "bereits geteilt", "before": "bereits geteilt",
"Being lazy": "Faul sein", "Being lazy": "Faul sein",
"Brave Search API Key": "API-Schlüssel für die Brave-Suche", "Brave Search API Key": "API-Schlüssel für die Brave-Suche",
...@@ -160,6 +162,7 @@ ...@@ -160,6 +162,7 @@
"Discover, download, and explore custom prompts": "Benutzerdefinierte Prompts entdecken, herunterladen und erkunden", "Discover, download, and explore custom prompts": "Benutzerdefinierte Prompts entdecken, herunterladen und erkunden",
"Discover, download, and explore model presets": "Modellvorgaben entdecken, herunterladen und erkunden", "Discover, download, and explore model presets": "Modellvorgaben entdecken, herunterladen und erkunden",
"Dismissible": "ausblendbar", "Dismissible": "ausblendbar",
"Display Emoji in Call": "",
"Display the username instead of You in the Chat": "Den Benutzernamen anstelle von 'du' im Chat anzeigen", "Display the username instead of You in the Chat": "Den Benutzernamen anstelle von 'du' im Chat anzeigen",
"Document": "Dokument", "Document": "Dokument",
"Document Settings": "Dokumenteinstellungen", "Document Settings": "Dokumenteinstellungen",
...@@ -176,6 +179,7 @@ ...@@ -176,6 +179,7 @@
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "z.B. '30s','10m'. Gültige Zeiteinheiten sind 's', 'm', 'h'.", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "z.B. '30s','10m'. Gültige Zeiteinheiten sind 's', 'm', 'h'.",
"Edit": "Bearbeiten", "Edit": "Bearbeiten",
"Edit Doc": "Dokument bearbeiten", "Edit Doc": "Dokument bearbeiten",
"Edit Memory": "",
"Edit User": "Benutzer bearbeiten", "Edit User": "Benutzer bearbeiten",
"Email": "E-Mail", "Email": "E-Mail",
"Embedding Batch Size": "Embedding Batch Größe", "Embedding Batch Size": "Embedding Batch Größe",
...@@ -205,6 +209,7 @@ ...@@ -205,6 +209,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "Geben Sie den Serpstack-API-Schlüssel ein", "Enter Serpstack API Key": "Geben Sie den Serpstack-API-Schlüssel ein",
"Enter stop sequence": "Stop-Sequenz eingeben", "Enter stop sequence": "Stop-Sequenz eingeben",
"Enter Tavily API Key": "",
"Enter Top K": "Gib Top K ein", "Enter Top K": "Gib Top K ein",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Gib die URL ein (z.B. http://127.0.0.1:7860/)", "Enter URL (e.g. http://127.0.0.1:7860/)": "Gib die URL ein (z.B. http://127.0.0.1:7860/)",
"Enter URL (e.g. http://localhost:11434)": "Gib die URL ein (z.B. http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "Gib die URL ein (z.B. http://localhost:11434)",
...@@ -280,6 +285,7 @@ ...@@ -280,6 +285,7 @@
"Knowledge": "", "Knowledge": "",
"Language": "Sprache", "Language": "Sprache",
"Last Active": "Zuletzt aktiv", "Last Active": "Zuletzt aktiv",
"Last Modified": "",
"Light": "Hell", "Light": "Hell",
"Listening...": "", "Listening...": "",
"LLMs can make mistakes. Verify important information.": "LLMs können Fehler machen. Überprüfe wichtige Informationen.", "LLMs can make mistakes. Verify important information.": "LLMs können Fehler machen. Überprüfe wichtige Informationen.",
...@@ -304,6 +310,7 @@ ...@@ -304,6 +310,7 @@
"Mirostat Tau": "Mirostat Tau", "Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "DD MMMM YYYY", "MMMM DD, YYYY": "DD MMMM YYYY",
"MMMM DD, YYYY HH:mm": "DD MMMM YYYY HH:mm", "MMMM DD, YYYY HH:mm": "DD MMMM YYYY HH:mm",
"MMMM DD, YYYY hh:mm:ss A": "",
"Model '{{modelName}}' has been successfully downloaded.": "Modell '{{modelName}}' wurde erfolgreich heruntergeladen.", "Model '{{modelName}}' has been successfully downloaded.": "Modell '{{modelName}}' wurde erfolgreich heruntergeladen.",
"Model '{{modelTag}}' is already in queue for downloading.": "Modell '{{modelTag}}' befindet sich bereits in der Warteschlange zum Herunterladen.", "Model '{{modelTag}}' is already in queue for downloading.": "Modell '{{modelTag}}' befindet sich bereits in der Warteschlange zum Herunterladen.",
"Model {{modelId}} not found": "Modell {{modelId}} nicht gefunden", "Model {{modelId}} not found": "Modell {{modelId}} nicht gefunden",
...@@ -488,6 +495,8 @@ ...@@ -488,6 +495,8 @@
"System": "System", "System": "System",
"System Prompt": "System-Prompt", "System Prompt": "System-Prompt",
"Tags": "Tags", "Tags": "Tags",
"Tap to interrupt": "",
"Tavily API Key": "",
"Tell us more:": "Erzähl uns mehr", "Tell us more:": "Erzähl uns mehr",
"Temperature": "Temperatur", "Temperature": "Temperatur",
"Template": "Vorlage", "Template": "Vorlage",
...@@ -518,6 +527,7 @@ ...@@ -518,6 +527,7 @@
"Today": "Heute", "Today": "Heute",
"Toggle settings": "Einstellungen umschalten", "Toggle settings": "Einstellungen umschalten",
"Toggle sidebar": "Seitenleiste umschalten", "Toggle sidebar": "Seitenleiste umschalten",
"Tokens To Keep On Context Refresh (num_keep)": "",
"Tools": "", "Tools": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
...@@ -529,8 +539,10 @@ ...@@ -529,8 +539,10 @@
"Type Hugging Face Resolve (Download) URL": "Gib die Hugging Face Resolve (Download) URL ein", "Type Hugging Face Resolve (Download) URL": "Gib die Hugging Face Resolve (Download) URL ein",
"Uh-oh! There was an issue connecting to {{provider}}.": "Ups! Es gab ein Problem bei der Verbindung mit {{provider}}.", "Uh-oh! There was an issue connecting to {{provider}}.": "Ups! Es gab ein Problem bei der Verbindung mit {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Unbekannter Dateityp '{{file_type}}', wird jedoch akzeptiert und als einfacher Text behandelt.", "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Unbekannter Dateityp '{{file_type}}', wird jedoch akzeptiert und als einfacher Text behandelt.",
"Update": "",
"Update and Copy Link": "Erneuern und kopieren", "Update and Copy Link": "Erneuern und kopieren",
"Update password": "Passwort aktualisieren", "Update password": "Passwort aktualisieren",
"Updated at": "",
"Upload a GGUF model": "GGUF Model hochladen", "Upload a GGUF model": "GGUF Model hochladen",
"Upload Files": "Dateien hochladen", "Upload Files": "Dateien hochladen",
"Upload Pipeline": "", "Upload Pipeline": "",
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
"Allow": "Allow", "Allow": "Allow",
"Allow Chat Deletion": "Allow Delete Chats", "Allow Chat Deletion": "Allow Delete Chats",
"Allow non-local voices": "", "Allow non-local voices": "",
"Allow User Location": "",
"alphanumeric characters and hyphens": "so alpha, many hyphen", "alphanumeric characters and hyphens": "so alpha, many hyphen",
"Already have an account?": "Such account exists?", "Already have an account?": "Such account exists?",
"an assistant": "such assistant", "an assistant": "such assistant",
...@@ -69,6 +70,7 @@ ...@@ -69,6 +70,7 @@
"Bad Response": "", "Bad Response": "",
"Banners": "", "Banners": "",
"Base Model (From)": "", "Base Model (From)": "",
"Batch Size (num_batch)": "",
"before": "", "before": "",
"Being lazy": "", "Being lazy": "",
"Brave Search API Key": "", "Brave Search API Key": "",
...@@ -160,6 +162,7 @@ ...@@ -160,6 +162,7 @@
"Discover, download, and explore custom prompts": "Discover, download, and explore custom prompts", "Discover, download, and explore custom prompts": "Discover, download, and explore custom prompts",
"Discover, download, and explore model presets": "Discover, download, and explore model presets", "Discover, download, and explore model presets": "Discover, download, and explore model presets",
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "",
"Display the username instead of You in the Chat": "Display username instead of You in Chat", "Display the username instead of You in the Chat": "Display username instead of You in Chat",
"Document": "Document", "Document": "Document",
"Document Settings": "Document Settings", "Document Settings": "Document Settings",
...@@ -176,6 +179,7 @@ ...@@ -176,6 +179,7 @@
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "e.g. '30s','10m'. Much time units are 's', 'm', 'h'.", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "e.g. '30s','10m'. Much time units are 's', 'm', 'h'.",
"Edit": "", "Edit": "",
"Edit Doc": "Edit Doge", "Edit Doc": "Edit Doge",
"Edit Memory": "",
"Edit User": "Edit Wowser", "Edit User": "Edit Wowser",
"Email": "Email", "Email": "Email",
"Embedding Batch Size": "", "Embedding Batch Size": "",
...@@ -205,6 +209,7 @@ ...@@ -205,6 +209,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "", "Enter Serpstack API Key": "",
"Enter stop sequence": "Enter stop bark", "Enter stop sequence": "Enter stop bark",
"Enter Tavily API Key": "",
"Enter Top K": "Enter Top Wow", "Enter Top K": "Enter Top Wow",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Enter URL (e.g. http://127.0.0.1:7860/)", "Enter URL (e.g. http://127.0.0.1:7860/)": "Enter URL (e.g. http://127.0.0.1:7860/)",
"Enter URL (e.g. http://localhost:11434)": "", "Enter URL (e.g. http://localhost:11434)": "",
...@@ -280,6 +285,7 @@ ...@@ -280,6 +285,7 @@
"Knowledge": "", "Knowledge": "",
"Language": "Doge Speak", "Language": "Doge Speak",
"Last Active": "", "Last Active": "",
"Last Modified": "",
"Light": "Light", "Light": "Light",
"Listening...": "", "Listening...": "",
"LLMs can make mistakes. Verify important information.": "LLMs can make borks. Verify important info.", "LLMs can make mistakes. Verify important information.": "LLMs can make borks. Verify important info.",
...@@ -304,6 +310,7 @@ ...@@ -304,6 +310,7 @@
"Mirostat Tau": "Mirostat Tau", "Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "MMMM DD, YYYY", "MMMM DD, YYYY": "MMMM DD, YYYY",
"MMMM DD, YYYY HH:mm": "", "MMMM DD, YYYY HH:mm": "",
"MMMM DD, YYYY hh:mm:ss A": "",
"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' has been successfully downloaded.", "Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' has been successfully downloaded.",
"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' is already in queue for downloading.", "Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' is already in queue for downloading.",
"Model {{modelId}} not found": "Model {{modelId}} not found", "Model {{modelId}} not found": "Model {{modelId}} not found",
...@@ -488,6 +495,8 @@ ...@@ -488,6 +495,8 @@
"System": "System very system", "System": "System very system",
"System Prompt": "System Prompt much prompt", "System Prompt": "System Prompt much prompt",
"Tags": "Tags very tags", "Tags": "Tags very tags",
"Tap to interrupt": "",
"Tavily API Key": "",
"Tell us more:": "", "Tell us more:": "",
"Temperature": "Temperature very temp", "Temperature": "Temperature very temp",
"Template": "Template much template", "Template": "Template much template",
...@@ -518,6 +527,7 @@ ...@@ -518,6 +527,7 @@
"Today": "", "Today": "",
"Toggle settings": "Toggle settings much toggle", "Toggle settings": "Toggle settings much toggle",
"Toggle sidebar": "Toggle sidebar much toggle", "Toggle sidebar": "Toggle sidebar much toggle",
"Tokens To Keep On Context Refresh (num_keep)": "",
"Tools": "", "Tools": "",
"Top K": "Top K very top", "Top K": "Top K very top",
"Top P": "Top P very top", "Top P": "Top P very top",
...@@ -529,8 +539,10 @@ ...@@ -529,8 +539,10 @@
"Type Hugging Face Resolve (Download) URL": "Type Hugging Face Resolve (Download) URL much download", "Type Hugging Face Resolve (Download) URL": "Type Hugging Face Resolve (Download) URL much download",
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! There was an issue connecting to {{provider}}. Much uh-oh!", "Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! There was an issue connecting to {{provider}}. Much uh-oh!",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Unknown File Type '{{file_type}}', but accepting and treating as plain text very unknown", "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Unknown File Type '{{file_type}}', but accepting and treating as plain text very unknown",
"Update": "",
"Update and Copy Link": "", "Update and Copy Link": "",
"Update password": "Update password much change", "Update password": "Update password much change",
"Updated at": "",
"Upload a GGUF model": "Upload a GGUF model very upload", "Upload a GGUF model": "Upload a GGUF model very upload",
"Upload Files": "", "Upload Files": "",
"Upload Pipeline": "", "Upload Pipeline": "",
......
This diff is collapsed.
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