"models/vscode:/vscode.git/clone" did not exist on "383dc795c9a4b8a7f2d75f76206be3dc70d47168"
Commit f5487628 authored by Morgan Blangeois's avatar Morgan Blangeois
Browse files

Resolve merge conflicts in French translations

parents 2fedd91e 2c061777
...@@ -162,7 +162,7 @@ ...@@ -162,7 +162,7 @@
.substring(1) .substring(1)
.startsWith('https://youtu.be'))} .startsWith('https://youtu.be'))}
<button <button
class="px-3 py-1.5 rounded-xl w-full text-left bg-gray-100 selected-command-option-button" class="px-3 py-1.5 rounded-xl w-full text-left bg-gray-50 dark:bg-gray-850 dark:text-gray-100 selected-command-option-button"
type="button" type="button"
on:click={() => { on:click={() => {
const url = prompt.split(' ')?.at(0)?.substring(1); const url = prompt.split(' ')?.at(0)?.substring(1);
...@@ -177,7 +177,7 @@ ...@@ -177,7 +177,7 @@
} }
}} }}
> >
<div class=" font-medium text-black line-clamp-1"> <div class=" font-medium text-black dark:text-gray-100 line-clamp-1">
{prompt.split(' ')?.at(0)?.substring(1)} {prompt.split(' ')?.at(0)?.substring(1)}
</div> </div>
...@@ -185,7 +185,7 @@ ...@@ -185,7 +185,7 @@
</button> </button>
{:else if prompt.split(' ')?.at(0)?.substring(1).startsWith('http')} {:else if prompt.split(' ')?.at(0)?.substring(1).startsWith('http')}
<button <button
class="px-3 py-1.5 rounded-xl w-full text-left bg-gray-100 selected-command-option-button" class="px-3 py-1.5 rounded-xl w-full text-left bg-gray-50 dark:bg-gray-850 dark:text-gray-100 selected-command-option-button"
type="button" type="button"
on:click={() => { on:click={() => {
const url = prompt.split(' ')?.at(0)?.substring(1); const url = prompt.split(' ')?.at(0)?.substring(1);
...@@ -200,7 +200,7 @@ ...@@ -200,7 +200,7 @@
} }
}} }}
> >
<div class=" font-medium text-black line-clamp-1"> <div class=" font-medium text-black dark:text-gray-100 line-clamp-1">
{prompt.split(' ')?.at(0)?.substring(1)} {prompt.split(' ')?.at(0)?.substring(1)}
</div> </div>
......
...@@ -100,64 +100,68 @@ ...@@ -100,64 +100,68 @@
class="flex snap-x snap-mandatory overflow-x-auto scrollbar-hidden" class="flex snap-x snap-mandatory overflow-x-auto scrollbar-hidden"
id="responses-container-{parentMessage.id}" id="responses-container-{parentMessage.id}"
> >
{#each Object.keys(groupedMessages) as model} {#key currentMessageId}
{#if groupedMessagesIdx[model] !== undefined && groupedMessages[model].messages.length > 0} {#each Object.keys(groupedMessages) as model}
<!-- svelte-ignore a11y-no-static-element-interactions --> {#if groupedMessagesIdx[model] !== undefined && groupedMessages[model].messages.length > 0}
<!-- svelte-ignore a11y-click-events-have-key-events --> <!-- svelte-ignore a11y-no-static-element-interactions -->
<!-- svelte-ignore a11y-click-events-have-key-events -->
<div {@const message = groupedMessages[model].messages[groupedMessagesIdx[model]]}
class=" snap-center min-w-80 w-full max-w-full m-1 border {history.messages[
currentMessageId <div
].model === model class=" snap-center min-w-80 w-full max-w-full m-1 border {history.messages[
? 'border-gray-100 dark:border-gray-850 border-[1.5px]' currentMessageId
: 'border-gray-50 dark:border-gray-850 '} transition p-5 rounded-3xl" ].model === model
on:click={() => { ? 'border-gray-100 dark:border-gray-800 border-[1.5px]'
currentMessageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id; : 'border-gray-50 dark:border-gray-850 '} transition p-5 rounded-3xl"
on:click={() => {
let messageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id; if (currentMessageId != message.id) {
currentMessageId = message.id;
console.log(messageId); let messageId = message.id;
let messageChildrenIds = history.messages[messageId].childrenIds; console.log(messageId);
while (messageChildrenIds.length !== 0) { //
messageId = messageChildrenIds.at(-1); let messageChildrenIds = history.messages[messageId].childrenIds;
messageChildrenIds = history.messages[messageId].childrenIds; while (messageChildrenIds.length !== 0) {
} messageId = messageChildrenIds.at(-1);
messageChildrenIds = history.messages[messageId].childrenIds;
history.currentId = messageId; }
dispatch('change');
}} history.currentId = messageId;
> dispatch('change');
<ResponseMessage }
message={groupedMessages[model].messages[groupedMessagesIdx[model]]}
siblings={groupedMessages[model].messages.map((m) => m.id)}
isLastMessage={true}
{updateChatMessages}
{confirmEditResponseMessage}
showPreviousMessage={() => showPreviousMessage(model)}
showNextMessage={() => showNextMessage(model)}
{readOnly}
{rateMessage}
{copyToClipboard}
{continueGeneration}
regenerateResponse={async (message) => {
regenerateResponse(message);
await tick();
groupedMessagesIdx[model] = groupedMessages[model].messages.length - 1;
}} }}
on:save={async (e) => { >
console.log('save', e); <ResponseMessage
message={groupedMessages[model].messages[groupedMessagesIdx[model]]}
const message = e.detail; siblings={groupedMessages[model].messages.map((m) => m.id)}
history.messages[message.id] = message; isLastMessage={true}
await updateChatById(localStorage.token, chatId, { {updateChatMessages}
messages: messages, {confirmEditResponseMessage}
history: history showPreviousMessage={() => showPreviousMessage(model)}
}); showNextMessage={() => showNextMessage(model)}
}} {readOnly}
/> {rateMessage}
</div> {copyToClipboard}
{/if} {continueGeneration}
{/each} regenerateResponse={async (message) => {
regenerateResponse(message);
await tick();
groupedMessagesIdx[model] = groupedMessages[model].messages.length - 1;
}}
on:save={async (e) => {
console.log('save', e);
const message = e.detail;
history.messages[message.id] = message;
await updateChatById(localStorage.token, chatId, {
messages: messages,
history: history
});
}}
/>
</div>
{/if}
{/each}
{/key}
</div> </div>
</div> </div>
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
import ManageModal from './Personalization/ManageModal.svelte'; import ManageModal from './Personalization/ManageModal.svelte';
import Tooltip from '$lib/components/common/Tooltip.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte';
import Spinner from '$lib/components/common/Spinner.svelte'; import Spinner from '$lib/components/common/Spinner.svelte';
import Switch from '$lib/components/common/Switch.svelte';
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
...@@ -185,7 +186,10 @@ ...@@ -185,7 +186,10 @@
class="p-1 px-3 text-xs flex rounded transition" class="p-1 px-3 text-xs flex rounded transition"
type="button" type="button"
on:click={() => { on:click={() => {
valves[property] = (valves[property] ?? null) === null ? '' : null; valves[property] =
(valves[property] ?? null) === null
? valvesSpec.properties[property]?.default ?? ''
: null;
}} }}
> >
{#if (valves[property] ?? null) === null} {#if (valves[property] ?? null) === null}
...@@ -203,16 +207,40 @@ ...@@ -203,16 +207,40 @@
</div> </div>
{#if (valves[property] ?? null) !== null} {#if (valves[property] ?? null) !== null}
<!-- {valves[property]} -->
<div class="flex mt-0.5 mb-1.5 space-x-2"> <div class="flex mt-0.5 mb-1.5 space-x-2">
<div class=" flex-1"> <div class=" flex-1">
<input {#if valvesSpec.properties[property]?.enum ?? null}
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none" <select
type="text" class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
placeholder={valvesSpec.properties[property].title} bind:value={valves[property]}
bind:value={valves[property]} >
autocomplete="off" {#each valvesSpec.properties[property].enum as option}
required <option value={option} selected={option === valves[property]}>
/> {option}
</option>
{/each}
</select>
{:else if (valvesSpec.properties[property]?.type ?? null) === 'boolean'}
<div class="flex justify-between items-center">
<div class="text-xs text-gray-500">
{valves[property] ? 'Enabled' : 'Disabled'}
</div>
<div class=" pr-2">
<Switch bind:state={valves[property]} />
</div>
</div>
{:else}
<input
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
type="text"
placeholder={valvesSpec.properties[property].title}
bind:value={valves[property]}
autocomplete="off"
required
/>
{/if}
</div> </div>
</div> </div>
{/if} {/if}
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
getTagsById, getTagsById,
updateChatById updateChatById
} from '$lib/apis/chats'; } from '$lib/apis/chats';
import { tags as _tags, chats } from '$lib/stores'; import { tags as _tags, chats, pinnedChats } from '$lib/stores';
import { createEventDispatcher, onMount } from 'svelte'; import { createEventDispatcher, onMount } from 'svelte';
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
...@@ -19,9 +19,11 @@ ...@@ -19,9 +19,11 @@
let tags = []; let tags = [];
const getTags = async () => { const getTags = async () => {
return await getTagsById(localStorage.token, chatId).catch(async (error) => { return (
return []; await getTagsById(localStorage.token, chatId).catch(async (error) => {
}); return [];
})
).filter((tag) => tag.name !== 'pinned');
}; };
const addTag = async (tagName) => { const addTag = async (tagName) => {
...@@ -33,6 +35,7 @@ ...@@ -33,6 +35,7 @@
}); });
_tags.set(await getAllChatTags(localStorage.token)); _tags.set(await getAllChatTags(localStorage.token));
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
}; };
const deleteTag = async (tagName) => { const deleteTag = async (tagName) => {
...@@ -44,19 +47,23 @@ ...@@ -44,19 +47,23 @@
}); });
console.log($_tags); console.log($_tags);
await _tags.set(await getAllChatTags(localStorage.token)); await _tags.set(await getAllChatTags(localStorage.token));
console.log($_tags); console.log($_tags);
if ($_tags.map((t) => t.name).includes(tagName)) { if ($_tags.map((t) => t.name).includes(tagName)) {
await chats.set(await getChatListByTagName(localStorage.token, tagName)); if (tagName === 'pinned') {
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
} else {
await chats.set(await getChatListByTagName(localStorage.token, tagName));
}
if ($chats.find((chat) => chat.id === chatId)) { if ($chats.find((chat) => chat.id === chatId)) {
dispatch('close'); dispatch('close');
} }
} else { } else {
await chats.set(await getChatList(localStorage.token)); await chats.set(await getChatList(localStorage.token));
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
} }
}; };
......
<script lang="ts">
export let className = 'w-4 h-4';
export let strokeWidth = '1.5';
</script>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width={strokeWidth}
stroke="currentColor"
class={className}
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M17.593 3.322c1.1.128 1.907 1.077 1.907 2.185V21L12 17.25 4.5 21V5.507c0-1.108.806-2.057 1.907-2.185a48.507 48.507 0 0 1 11.186 0Z"
/>
</svg>
<script lang="ts">
export let className = 'w-4 h-4';
export let strokeWidth = '1.5';
</script>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width={strokeWidth}
stroke="currentColor"
class={className}
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m3 3 1.664 1.664M21 21l-1.5-1.5m-5.485-1.242L12 17.25 4.5 21V8.742m.164-4.078a2.15 2.15 0 0 1 1.743-1.342 48.507 48.507 0 0 1 11.186 0c1.1.128 1.907 1.077 1.907 2.185V19.5M4.664 4.664 19.5 19.5"
/>
</svg>
<script lang="ts">
import { DropdownMenu } from 'bits-ui';
import { flyAndScale } from '$lib/utils/transitions';
import { getContext } from 'svelte';
import Dropdown from '$lib/components/common/Dropdown.svelte';
import GarbageBin from '$lib/components/icons/GarbageBin.svelte';
import Pencil from '$lib/components/icons/Pencil.svelte';
import Tooltip from '$lib/components/common/Tooltip.svelte';
import Tags from '$lib/components/chat/Tags.svelte';
import Share from '$lib/components/icons/Share.svelte';
import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte';
import DocumentDuplicate from '$lib/components/icons/DocumentDuplicate.svelte';
import Star from '$lib/components/icons/Star.svelte';
const i18n = getContext('i18n');
export let pinHandler: Function;
export let shareHandler: Function;
export let cloneChatHandler: Function;
export let archiveChatHandler: Function;
export let renameHandler: Function;
export let deleteHandler: Function;
export let onClose: Function;
export let chatId = '';
let show = false;
</script>
<Dropdown
bind:show
on:change={(e) => {
if (e.detail === false) {
onClose();
}
}}
>
<Tooltip content={$i18n.t('More')}>
<slot />
</Tooltip>
<div slot="content">
<DropdownMenu.Content
class="w-full max-w-[180px] rounded-xl px-1 py-1.5 border border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow"
sideOffset={-2}
side="bottom"
align="start"
transition={flyAndScale}
>
<DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
on:click={() => {
pinHandler();
}}
>
<Star strokeWidth="2" />
<div class="flex items-center">{$i18n.t('Pin')}</div>
</DropdownMenu.Item>
<DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
on:click={() => {
renameHandler();
}}
>
<Pencil strokeWidth="2" />
<div class="flex items-center">{$i18n.t('Rename')}</div>
</DropdownMenu.Item>
<DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
on:click={() => {
cloneChatHandler();
}}
>
<DocumentDuplicate strokeWidth="2" />
<div class="flex items-center">{$i18n.t('Clone')}</div>
</DropdownMenu.Item>
<DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
on:click={() => {
archiveChatHandler();
}}
>
<ArchiveBox strokeWidth="2" />
<div class="flex items-center">{$i18n.t('Archive')}</div>
</DropdownMenu.Item>
<DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
on:click={() => {
shareHandler();
}}
>
<Share />
<div class="flex items-center">{$i18n.t('Share')}</div>
</DropdownMenu.Item>
<DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
on:click={() => {
deleteHandler();
}}
>
<GarbageBin strokeWidth="2" />
<div class="flex items-center">{$i18n.t('Delete')}</div>
</DropdownMenu.Item>
<hr class="border-gray-100 dark:border-gray-800 mt-2.5 mb-1.5" />
<div class="flex p-1">
<Tags
{chatId}
on:close={() => {
show = false;
onClose();
}}
/>
</div>
</DropdownMenu.Content>
</div>
</Dropdown>
<script lang="ts">
export let className = 'w-4 h-4';
export let strokeWidth = '1.5';
</script>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width={strokeWidth}
stroke="currentColor"
class={className}
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M11.48 3.499a.562.562 0 0 1 1.04 0l2.125 5.111a.563.563 0 0 0 .475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 0 0-.182.557l1.285 5.385a.562.562 0 0 1-.84.61l-4.725-2.885a.562.562 0 0 0-.586 0L6.982 20.54a.562.562 0 0 1-.84-.61l1.285-5.386a.562.562 0 0 0-.182-.557l-4.204-3.602a.562.562 0 0 1 .321-.988l5.518-.442a.563.563 0 0 0 .475-.345L11.48 3.5Z"
/>
</svg>
...@@ -10,7 +10,8 @@ ...@@ -10,7 +10,8 @@
tags, tags,
showSidebar, showSidebar,
mobile, mobile,
showArchivedChats showArchivedChats,
pinnedChats
} from '$lib/stores'; } from '$lib/stores';
import { onMount, getContext, tick } from 'svelte'; import { onMount, getContext, tick } from 'svelte';
...@@ -46,6 +47,7 @@ ...@@ -46,6 +47,7 @@
let showDeleteConfirm = false; let showDeleteConfirm = false;
let showDropdown = false; let showDropdown = false;
let filteredChatList = []; let filteredChatList = [];
$: filteredChatList = $chats.filter((chat) => { $: filteredChatList = $chats.filter((chat) => {
...@@ -80,6 +82,8 @@ ...@@ -80,6 +82,8 @@
}); });
showSidebar.set(window.innerWidth > BREAKPOINT); showSidebar.set(window.innerWidth > BREAKPOINT);
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
await chats.set(await getChatList(localStorage.token)); await chats.set(await getChatList(localStorage.token));
let touchstart; let touchstart;
...@@ -412,7 +416,7 @@ ...@@ -412,7 +416,7 @@
</div> </div>
</div> </div>
{#if $tags.length > 0} {#if $tags.filter((t) => t.name !== 'pinned').length > 0}
<div class="px-2.5 mb-2 flex gap-1 flex-wrap"> <div class="px-2.5 mb-2 flex gap-1 flex-wrap">
<button <button
class="px-2.5 text-xs font-medium bg-gray-50 dark:bg-gray-900 dark:hover:bg-gray-800 transition rounded-full" class="px-2.5 text-xs font-medium bg-gray-50 dark:bg-gray-900 dark:hover:bg-gray-800 transition rounded-full"
...@@ -422,7 +426,7 @@ ...@@ -422,7 +426,7 @@
> >
{$i18n.t('all')} {$i18n.t('all')}
</button> </button>
{#each $tags as tag} {#each $tags.filter((t) => t.name !== 'pinned') as tag}
<button <button
class="px-2.5 text-xs font-medium bg-gray-50 dark:bg-gray-900 dark:hover:bg-gray-800 transition rounded-full" class="px-2.5 text-xs font-medium bg-gray-50 dark:bg-gray-900 dark:hover:bg-gray-800 transition rounded-full"
on:click={async () => { on:click={async () => {
...@@ -440,6 +444,38 @@ ...@@ -440,6 +444,38 @@
</div> </div>
{/if} {/if}
{#if $pinnedChats.length > 0}
<div class="pl-2 py-2 flex flex-col space-y-1">
<div class="">
<div class="w-full pl-2.5 text-xs text-gray-500 dark:text-gray-500 font-medium pb-1.5">
{$i18n.t('Pinned')}
</div>
{#each $pinnedChats as chat, idx}
<ChatItem
{chat}
{shiftKey}
selected={selectedChatId === chat.id}
on:select={() => {
selectedChatId = chat.id;
}}
on:unselect={() => {
selectedChatId = null;
}}
on:delete={(e) => {
if ((e?.detail ?? '') === 'shift') {
deleteChatHandler(chat.id);
} else {
deleteChat = chat;
showDeleteConfirm = true;
}
}}
/>
{/each}
</div>
</div>
{/if}
<div class="pl-2 my-2 flex-1 flex flex-col space-y-1 overflow-y-auto scrollbar-hidden"> <div class="pl-2 my-2 flex-1 flex flex-col space-y-1 overflow-y-auto scrollbar-hidden">
{#each filteredChatList as chat, idx} {#each filteredChatList as chat, idx}
{#if idx === 0 || (idx > 0 && chat.time_range !== filteredChatList[idx - 1].time_range)} {#if idx === 0 || (idx > 0 && chat.time_range !== filteredChatList[idx - 1].time_range)}
......
...@@ -11,9 +11,10 @@ ...@@ -11,9 +11,10 @@
cloneChatById, cloneChatById,
deleteChatById, deleteChatById,
getChatList, getChatList,
getChatListByTagName,
updateChatById updateChatById
} from '$lib/apis/chats'; } from '$lib/apis/chats';
import { chatId, chats, mobile, showSidebar } from '$lib/stores'; import { chatId, chats, mobile, pinnedChats, showSidebar } from '$lib/stores';
import ChatMenu from './ChatMenu.svelte'; import ChatMenu from './ChatMenu.svelte';
import ShareChatModal from '$lib/components/chat/ShareChatModal.svelte'; import ShareChatModal from '$lib/components/chat/ShareChatModal.svelte';
...@@ -40,6 +41,7 @@ ...@@ -40,6 +41,7 @@
title: _title title: _title
}); });
await chats.set(await getChatList(localStorage.token)); await chats.set(await getChatList(localStorage.token));
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
} }
}; };
...@@ -52,12 +54,14 @@ ...@@ -52,12 +54,14 @@
if (res) { if (res) {
goto(`/c/${res.id}`); goto(`/c/${res.id}`);
await chats.set(await getChatList(localStorage.token)); await chats.set(await getChatList(localStorage.token));
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
} }
}; };
const archiveChatHandler = async (id) => { const archiveChatHandler = async (id) => {
await archiveChatById(localStorage.token, id); await archiveChatById(localStorage.token, id);
await chats.set(await getChatList(localStorage.token)); await chats.set(await getChatList(localStorage.token));
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
}; };
const focusEdit = async (node: HTMLInputElement) => { const focusEdit = async (node: HTMLInputElement) => {
...@@ -233,6 +237,9 @@ ...@@ -233,6 +237,9 @@
onClose={() => { onClose={() => {
dispatch('unselect'); dispatch('unselect');
}} }}
on:change={async () => {
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
}}
> >
<button <button
aria-label="Chat Menu" aria-label="Chat Menu"
......
<script lang="ts"> <script lang="ts">
import { DropdownMenu } from 'bits-ui'; import { DropdownMenu } from 'bits-ui';
import { flyAndScale } from '$lib/utils/transitions'; import { flyAndScale } from '$lib/utils/transitions';
import { getContext } from 'svelte'; import { getContext, createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
import Dropdown from '$lib/components/common/Dropdown.svelte'; import Dropdown from '$lib/components/common/Dropdown.svelte';
import GarbageBin from '$lib/components/icons/GarbageBin.svelte'; import GarbageBin from '$lib/components/icons/GarbageBin.svelte';
...@@ -11,6 +13,9 @@ ...@@ -11,6 +13,9 @@
import Share from '$lib/components/icons/Share.svelte'; import Share from '$lib/components/icons/Share.svelte';
import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte'; import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte';
import DocumentDuplicate from '$lib/components/icons/DocumentDuplicate.svelte'; import DocumentDuplicate from '$lib/components/icons/DocumentDuplicate.svelte';
import Bookmark from '$lib/components/icons/Bookmark.svelte';
import BookmarkSlash from '$lib/components/icons/BookmarkSlash.svelte';
import { addTagById, deleteTagById, getTagsById } from '$lib/apis/chats';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
...@@ -24,6 +29,28 @@ ...@@ -24,6 +29,28 @@
export let chatId = ''; export let chatId = '';
let show = false; let show = false;
let pinned = false;
const pinHandler = async () => {
if (pinned) {
await deleteTagById(localStorage.token, chatId, 'pinned');
} else {
await addTagById(localStorage.token, chatId, 'pinned');
}
dispatch('change');
};
const checkPinned = async () => {
pinned = (
await getTagsById(localStorage.token, chatId).catch(async (error) => {
return [];
})
).find((tag) => tag.name === 'pinned');
};
$: if (show) {
checkPinned();
}
</script> </script>
<Dropdown <Dropdown
...@@ -46,6 +73,21 @@ ...@@ -46,6 +73,21 @@
align="start" align="start"
transition={flyAndScale} transition={flyAndScale}
> >
<DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
on:click={() => {
pinHandler();
}}
>
{#if pinned}
<BookmarkSlash strokeWidth="2" />
<div class="flex items-center">{$i18n.t('Unpin')}</div>
{:else}
<Bookmark strokeWidth="2" />
<div class="flex items-center">{$i18n.t('Pin')}</div>
{/if}
</DropdownMenu.Item>
<DropdownMenu.Item <DropdownMenu.Item
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md" class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
on:click={() => { on:click={() => {
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
} from '$lib/apis/functions'; } from '$lib/apis/functions';
import { getToolValvesById, getToolValvesSpecById, updateToolValvesById } from '$lib/apis/tools'; import { getToolValvesById, getToolValvesSpecById, updateToolValvesById } from '$lib/apis/tools';
import Spinner from '../../common/Spinner.svelte'; import Spinner from '../../common/Spinner.svelte';
import Switch from '$lib/components/common/Switch.svelte';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
...@@ -142,7 +143,10 @@ ...@@ -142,7 +143,10 @@
class="p-1 px-3 text-xs flex rounded transition" class="p-1 px-3 text-xs flex rounded transition"
type="button" type="button"
on:click={() => { on:click={() => {
valves[property] = (valves[property] ?? null) === null ? '' : null; valves[property] =
(valves[property] ?? null) === null
? valvesSpec.properties[property]?.default ?? ''
: null;
}} }}
> >
{#if (valves[property] ?? null) === null} {#if (valves[property] ?? null) === null}
...@@ -160,16 +164,40 @@ ...@@ -160,16 +164,40 @@
</div> </div>
{#if (valves[property] ?? null) !== null} {#if (valves[property] ?? null) !== null}
<!-- {valves[property]} -->
<div class="flex mt-0.5 mb-1.5 space-x-2"> <div class="flex mt-0.5 mb-1.5 space-x-2">
<div class=" flex-1"> <div class=" flex-1">
<input {#if valvesSpec.properties[property]?.enum ?? null}
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none" <select
type="text" class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
placeholder={valvesSpec.properties[property].title} bind:value={valves[property]}
bind:value={valves[property]} >
autocomplete="off" {#each valvesSpec.properties[property].enum as option}
required <option value={option} selected={option === valves[property]}>
/> {option}
</option>
{/each}
</select>
{:else if (valvesSpec.properties[property]?.type ?? null) === 'boolean'}
<div class="flex justify-between items-center">
<div class="text-xs text-gray-500">
{valves[property] ? 'Enabled' : 'Disabled'}
</div>
<div class=" pr-2">
<Switch bind:state={valves[property]} />
</div>
</div>
{:else}
<input
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
type="text"
placeholder={valvesSpec.properties[property].title}
bind:value={valves[property]}
autocomplete="off"
required
/>
{/if}
</div> </div>
</div> </div>
{/if} {/if}
......
...@@ -126,6 +126,7 @@ ...@@ -126,6 +126,7 @@
"Connections": "اتصالات", "Connections": "اتصالات",
"Contact Admin for WebUI Access": "", "Contact Admin for WebUI Access": "",
"Content": "الاتصال", "Content": "الاتصال",
"Content Extraction": "",
"Context Length": "طول السياق", "Context Length": "طول السياق",
"Continue Response": "متابعة الرد", "Continue Response": "متابعة الرد",
"Continue with {{provider}}": "", "Continue with {{provider}}": "",
...@@ -212,6 +213,7 @@ ...@@ -212,6 +213,7 @@
"Enable Community Sharing": "تمكين مشاركة المجتمع", "Enable Community Sharing": "تمكين مشاركة المجتمع",
"Enable New Sign Ups": "تفعيل عمليات التسجيل الجديدة", "Enable New Sign Ups": "تفعيل عمليات التسجيل الجديدة",
"Enable Web Search": "تمكين بحث الويب", "Enable Web Search": "تمكين بحث الويب",
"Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "تأكد من أن ملف CSV الخاص بك يتضمن 4 أعمدة بهذا الترتيب: Name, Email, Password, Role.", "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 {{role}} message here": "أدخل رسالة {{role}} هنا",
"Enter a detail about yourself for your LLMs to recall": "ادخل معلومات عنك تريد أن يتذكرها الموديل", "Enter a detail about yourself for your LLMs to recall": "ادخل معلومات عنك تريد أن يتذكرها الموديل",
...@@ -233,6 +235,7 @@ ...@@ -233,6 +235,7 @@
"Enter Serpstack API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serpstack", "Enter Serpstack API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serpstack",
"Enter stop sequence": "أدخل تسلسل التوقف", "Enter stop sequence": "أدخل تسلسل التوقف",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "",
"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)",
...@@ -409,6 +412,7 @@ ...@@ -409,6 +412,7 @@
"Open": "فتح", "Open": "فتح",
"Open AI (Dall-E)": "AI (Dall-E) فتح", "Open AI (Dall-E)": "AI (Dall-E) فتح",
"Open new chat": "فتح محادثة جديده", "Open new chat": "فتح محادثة جديده",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
"OpenAI API": "OpenAI API", "OpenAI API": "OpenAI API",
"OpenAI API Config": "OpenAI API إعدادات", "OpenAI API Config": "OpenAI API إعدادات",
...@@ -424,6 +428,8 @@ ...@@ -424,6 +428,8 @@
"Permission denied when accessing microphone": "", "Permission denied when accessing microphone": "",
"Permission denied when accessing microphone: {{error}}": "{{error}} تم رفض الإذن عند الوصول إلى الميكروفون ", "Permission denied when accessing microphone: {{error}}": "{{error}} تم رفض الإذن عند الوصول إلى الميكروفون ",
"Personalization": "التخصيص", "Personalization": "التخصيص",
"Pin": "",
"Pinned": "",
"Pipeline deleted successfully": "", "Pipeline deleted successfully": "",
"Pipeline downloaded successfully": "", "Pipeline downloaded successfully": "",
"Pipelines": "خطوط الانابيب", "Pipelines": "خطوط الانابيب",
...@@ -577,6 +583,8 @@ ...@@ -577,6 +583,8 @@
"This setting does not sync across browsers or devices.": "لا تتم مزامنة هذا الإعداد عبر المتصفحات أو الأجهزة.", "This setting does not sync across browsers or devices.": "لا تتم مزامنة هذا الإعداد عبر المتصفحات أو الأجهزة.",
"This will delete": "", "This will delete": "",
"Thorough explanation": "شرح شامل", "Thorough explanation": "شرح شامل",
"Tika": "",
"Tika Server URL required.": "",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "ملاحضة: قم بتحديث عدة فتحات متغيرة على التوالي عن طريق الضغط على مفتاح tab في مدخلات الدردشة بعد كل استبدال.", "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "ملاحضة: قم بتحديث عدة فتحات متغيرة على التوالي عن طريق الضغط على مفتاح tab في مدخلات الدردشة بعد كل استبدال.",
"Title": "العنوان", "Title": "العنوان",
"Title (e.g. Tell me a fun fact)": "(e.g. Tell me a fun fact) العناون", "Title (e.g. Tell me a fun fact)": "(e.g. Tell me a fun fact) العناون",
...@@ -611,6 +619,7 @@ ...@@ -611,6 +619,7 @@
"Uh-oh! There was an issue connecting to {{provider}}.": "{{provider}}خطاء أوه! حدثت مشكلة في الاتصال بـ ", "Uh-oh! There was an issue connecting to {{provider}}.": "{{provider}}خطاء أوه! حدثت مشكلة في الاتصال بـ ",
"UI": "", "UI": "",
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "", "Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "",
"Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "تحديث ونسخ الرابط", "Update and Copy Link": "تحديث ونسخ الرابط",
"Update password": "تحديث كلمة المرور", "Update password": "تحديث كلمة المرور",
......
...@@ -126,6 +126,7 @@ ...@@ -126,6 +126,7 @@
"Connections": "Връзки", "Connections": "Връзки",
"Contact Admin for WebUI Access": "", "Contact Admin for WebUI Access": "",
"Content": "Съдържание", "Content": "Съдържание",
"Content Extraction": "",
"Context Length": "Дължина на Контекста", "Context Length": "Дължина на Контекста",
"Continue Response": "Продължи отговора", "Continue Response": "Продължи отговора",
"Continue with {{provider}}": "", "Continue with {{provider}}": "",
...@@ -212,6 +213,7 @@ ...@@ -212,6 +213,7 @@
"Enable Community Sharing": "Разрешаване на споделяне в общност", "Enable Community Sharing": "Разрешаване на споделяне в общност",
"Enable New Sign Ups": "Вклюване на Нови Потребители", "Enable New Sign Ups": "Вклюване на Нови Потребители",
"Enable Web Search": "Разрешаване на търсене в уеб", "Enable Web Search": "Разрешаване на търсене в уеб",
"Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверете се, че вашият CSV файл включва 4 колони в следния ред: Име, Имейл, Парола, Роля.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверете се, че вашият CSV файл включва 4 колони в следния ред: Име, Имейл, Парола, Роля.",
"Enter {{role}} message here": "Въведете съобщение за {{role}} тук", "Enter {{role}} message here": "Въведете съобщение за {{role}} тук",
"Enter a detail about yourself for your LLMs to recall": "Въведете подробности за себе си, за да се herinnerат вашите LLMs", "Enter a detail about yourself for your LLMs to recall": "Въведете подробности за себе си, за да се herinnerат вашите LLMs",
...@@ -233,6 +235,7 @@ ...@@ -233,6 +235,7 @@
"Enter Serpstack API Key": "Въведете Serpstack API ключ", "Enter Serpstack API Key": "Въведете Serpstack API ключ",
"Enter stop sequence": "Въведете стоп последователност", "Enter stop sequence": "Въведете стоп последователност",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "",
"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)",
...@@ -409,6 +412,7 @@ ...@@ -409,6 +412,7 @@
"Open": "Отвори", "Open": "Отвори",
"Open AI (Dall-E)": "Open AI (Dall-E)", "Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "Отвори нов чат", "Open new chat": "Отвори нов чат",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
"OpenAI API": "OpenAI API", "OpenAI API": "OpenAI API",
"OpenAI API Config": "OpenAI API Config", "OpenAI API Config": "OpenAI API Config",
...@@ -424,6 +428,8 @@ ...@@ -424,6 +428,8 @@
"Permission denied when accessing microphone": "", "Permission denied when accessing microphone": "",
"Permission denied when accessing microphone: {{error}}": "Permission denied when accessing microphone: {{error}}", "Permission denied when accessing microphone: {{error}}": "Permission denied when accessing microphone: {{error}}",
"Personalization": "Персонализация", "Personalization": "Персонализация",
"Pin": "",
"Pinned": "",
"Pipeline deleted successfully": "", "Pipeline deleted successfully": "",
"Pipeline downloaded successfully": "", "Pipeline downloaded successfully": "",
"Pipelines": "Тръбопроводи", "Pipelines": "Тръбопроводи",
...@@ -573,6 +579,8 @@ ...@@ -573,6 +579,8 @@
"This setting does not sync across browsers or devices.": "Тази настройка не се синхронизира между браузъри или устройства.", "This setting does not sync across browsers or devices.": "Тази настройка не се синхронизира между браузъри или устройства.",
"This will delete": "", "This will delete": "",
"Thorough explanation": "Това е подробно описание.", "Thorough explanation": "Това е подробно описание.",
"Tika": "",
"Tika Server URL required.": "",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Съвет: Актуализирайте няколко слота за променливи последователно, като натискате клавиша Tab в чат входа след всяка подмяна.", "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Съвет: Актуализирайте няколко слота за променливи последователно, като натискате клавиша Tab в чат входа след всяка подмяна.",
"Title": "Заглавие", "Title": "Заглавие",
"Title (e.g. Tell me a fun fact)": "Заглавие (напр. Моля, кажете ми нещо забавно)", "Title (e.g. Tell me a fun fact)": "Заглавие (напр. Моля, кажете ми нещо забавно)",
...@@ -607,6 +615,7 @@ ...@@ -607,6 +615,7 @@
"Uh-oh! There was an issue connecting to {{provider}}.": "О, не! Възникна проблем при свързването с {{provider}}.", "Uh-oh! There was an issue connecting to {{provider}}.": "О, не! Възникна проблем при свързването с {{provider}}.",
"UI": "", "UI": "",
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "", "Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "",
"Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "Обнови и копирай връзка", "Update and Copy Link": "Обнови и копирай връзка",
"Update password": "Обновяване на парола", "Update password": "Обновяване на парола",
......
...@@ -126,6 +126,7 @@ ...@@ -126,6 +126,7 @@
"Connections": "কানেকশনগুলো", "Connections": "কানেকশনগুলো",
"Contact Admin for WebUI Access": "", "Contact Admin for WebUI Access": "",
"Content": "বিষয়বস্তু", "Content": "বিষয়বস্তু",
"Content Extraction": "",
"Context Length": "কনটেক্সটের দৈর্ঘ্য", "Context Length": "কনটেক্সটের দৈর্ঘ্য",
"Continue Response": "যাচাই করুন", "Continue Response": "যাচাই করুন",
"Continue with {{provider}}": "", "Continue with {{provider}}": "",
...@@ -212,6 +213,7 @@ ...@@ -212,6 +213,7 @@
"Enable Community Sharing": "সম্প্রদায় শেয়ারকরণ সক্ষম করুন", "Enable Community Sharing": "সম্প্রদায় শেয়ারকরণ সক্ষম করুন",
"Enable New Sign Ups": "নতুন সাইনআপ চালু করুন", "Enable New Sign Ups": "নতুন সাইনআপ চালু করুন",
"Enable Web Search": "ওয়েব অনুসন্ধান সক্ষম করুন", "Enable Web Search": "ওয়েব অনুসন্ধান সক্ষম করুন",
"Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "আপনার সিএসভি ফাইলটিতে এই ক্রমে 4 টি কলাম অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন: নাম, ইমেল, পাসওয়ার্ড, ভূমিকা।.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "আপনার সিএসভি ফাইলটিতে এই ক্রমে 4 টি কলাম অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন: নাম, ইমেল, পাসওয়ার্ড, ভূমিকা।.",
"Enter {{role}} message here": "{{role}} মেসেজ এখানে লিখুন", "Enter {{role}} message here": "{{role}} মেসেজ এখানে লিখুন",
"Enter a detail about yourself for your LLMs to recall": "আপনার এলএলএমগুলি স্মরণ করার জন্য নিজের সম্পর্কে একটি বিশদ লিখুন", "Enter a detail about yourself for your LLMs to recall": "আপনার এলএলএমগুলি স্মরণ করার জন্য নিজের সম্পর্কে একটি বিশদ লিখুন",
...@@ -233,6 +235,7 @@ ...@@ -233,6 +235,7 @@
"Enter Serpstack API Key": "Serpstack API কী লিখুন", "Enter Serpstack API Key": "Serpstack API কী লিখুন",
"Enter stop sequence": "স্টপ সিকোয়েন্স লিখুন", "Enter stop sequence": "স্টপ সিকোয়েন্স লিখুন",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "",
"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)",
...@@ -409,6 +412,7 @@ ...@@ -409,6 +412,7 @@
"Open": "খোলা", "Open": "খোলা",
"Open AI (Dall-E)": "Open AI (Dall-E)", "Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "নতুন চ্যাট খুলুন", "Open new chat": "নতুন চ্যাট খুলুন",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
"OpenAI API": "OpenAI এপিআই", "OpenAI API": "OpenAI এপিআই",
"OpenAI API Config": "OpenAI এপিআই কনফিগ", "OpenAI API Config": "OpenAI এপিআই কনফিগ",
...@@ -424,6 +428,8 @@ ...@@ -424,6 +428,8 @@
"Permission denied when accessing microphone": "", "Permission denied when accessing microphone": "",
"Permission denied when accessing microphone: {{error}}": "মাইক্রোফোন ব্যবহারের অনুমতি পাওয়া যায়নি: {{error}}", "Permission denied when accessing microphone: {{error}}": "মাইক্রোফোন ব্যবহারের অনুমতি পাওয়া যায়নি: {{error}}",
"Personalization": "ডিজিটাল বাংলা", "Personalization": "ডিজিটাল বাংলা",
"Pin": "",
"Pinned": "",
"Pipeline deleted successfully": "", "Pipeline deleted successfully": "",
"Pipeline downloaded successfully": "", "Pipeline downloaded successfully": "",
"Pipelines": "পাইপলাইন", "Pipelines": "পাইপলাইন",
...@@ -573,6 +579,8 @@ ...@@ -573,6 +579,8 @@
"This setting does not sync across browsers or devices.": "এই সেটিং অন্যন্য ব্রাউজার বা ডিভাইসের সাথে সিঙ্ক্রোনাইজ নয় না।", "This setting does not sync across browsers or devices.": "এই সেটিং অন্যন্য ব্রাউজার বা ডিভাইসের সাথে সিঙ্ক্রোনাইজ নয় না।",
"This will delete": "", "This will delete": "",
"Thorough explanation": "পুঙ্খানুপুঙ্খ ব্যাখ্যা", "Thorough explanation": "পুঙ্খানুপুঙ্খ ব্যাখ্যা",
"Tika": "",
"Tika Server URL required.": "",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "পরামর্শ: একাধিক ভেরিয়েবল স্লট একের পর এক রিপ্লেস করার জন্য চ্যাট ইনপুটে কিবোর্ডের Tab বাটন ব্যবহার করুন।", "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "পরামর্শ: একাধিক ভেরিয়েবল স্লট একের পর এক রিপ্লেস করার জন্য চ্যাট ইনপুটে কিবোর্ডের Tab বাটন ব্যবহার করুন।",
"Title": "শিরোনাম", "Title": "শিরোনাম",
"Title (e.g. Tell me a fun fact)": "শিরোনাম (একটি উপস্থিতি বিবরণ জানান)", "Title (e.g. Tell me a fun fact)": "শিরোনাম (একটি উপস্থিতি বিবরণ জানান)",
...@@ -607,6 +615,7 @@ ...@@ -607,6 +615,7 @@
"Uh-oh! There was an issue connecting to {{provider}}.": "ওহ-হো! {{provider}} এর সাথে কানেকশনে সমস্যা হয়েছে।", "Uh-oh! There was an issue connecting to {{provider}}.": "ওহ-হো! {{provider}} এর সাথে কানেকশনে সমস্যা হয়েছে।",
"UI": "", "UI": "",
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "", "Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "",
"Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "আপডেট এবং লিংক কপি করুন", "Update and Copy Link": "আপডেট এবং লিংক কপি করুন",
"Update password": "পাসওয়ার্ড আপডেট করুন", "Update password": "পাসওয়ার্ড আপডেট করুন",
......
...@@ -126,6 +126,7 @@ ...@@ -126,6 +126,7 @@
"Connections": "Connexions", "Connections": "Connexions",
"Contact Admin for WebUI Access": "Posat en contacte amb l'administrador per accedir a WebUI", "Contact Admin for WebUI Access": "Posat en contacte amb l'administrador per accedir a WebUI",
"Content": "Contingut", "Content": "Contingut",
"Content Extraction": "",
"Context Length": "Mida del context", "Context Length": "Mida del context",
"Continue Response": "Continuar la resposta", "Continue Response": "Continuar la resposta",
"Continue with {{provider}}": "Continuar amb {{provider}}", "Continue with {{provider}}": "Continuar amb {{provider}}",
...@@ -212,6 +213,7 @@ ...@@ -212,6 +213,7 @@
"Enable Community Sharing": "Activar l'ús compartit amb la comunitat", "Enable Community Sharing": "Activar l'ús compartit amb la comunitat",
"Enable New Sign Ups": "Permetre nous registres", "Enable New Sign Ups": "Permetre nous registres",
"Enable Web Search": "Activar la cerca web", "Enable Web Search": "Activar la cerca web",
"Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assegura't que els teus fitxers CSV inclouen 4 columnes en aquest ordre: Nom, Correu electrònic, Contrasenya, Rol.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assegura't que els teus fitxers CSV inclouen 4 columnes en aquest ordre: Nom, Correu electrònic, Contrasenya, Rol.",
"Enter {{role}} message here": "Introdueix aquí el missatge de {{role}}", "Enter {{role}} message here": "Introdueix aquí el missatge de {{role}}",
"Enter a detail about yourself for your LLMs to recall": "Introdueix un detall sobre tu què els teus models de llenguatge puguin recordar", "Enter a detail about yourself for your LLMs to recall": "Introdueix un detall sobre tu què els teus models de llenguatge puguin recordar",
...@@ -233,6 +235,7 @@ ...@@ -233,6 +235,7 @@
"Enter Serpstack API Key": "Introdueix la clau API Serpstack", "Enter Serpstack API Key": "Introdueix la clau API Serpstack",
"Enter stop sequence": "Introdueix la seqüència de parada", "Enter stop sequence": "Introdueix la seqüència de parada",
"Enter Tavily API Key": "Introdueix la clau API de Tavily", "Enter Tavily API Key": "Introdueix la clau API de Tavily",
"Enter Tika Server URL": "",
"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)",
...@@ -409,6 +412,7 @@ ...@@ -409,6 +412,7 @@
"Open": "Obre", "Open": "Obre",
"Open AI (Dall-E)": "Open AI (Dall-E)", "Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "Obre un xat nou", "Open new chat": "Obre un xat nou",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI", "OpenAI": "OpenAI",
"OpenAI API": "API d'OpenAI", "OpenAI API": "API d'OpenAI",
"OpenAI API Config": "Configuració de l'API d'OpenAI", "OpenAI API Config": "Configuració de l'API d'OpenAI",
...@@ -424,6 +428,8 @@ ...@@ -424,6 +428,8 @@
"Permission denied when accessing microphone": "Permís denegat en accedir al micròfon", "Permission denied when accessing microphone": "Permís denegat en accedir al micròfon",
"Permission denied when accessing microphone: {{error}}": "Permís denegat en accedir al micròfon: {{error}}", "Permission denied when accessing microphone: {{error}}": "Permís denegat en accedir al micròfon: {{error}}",
"Personalization": "Personalització", "Personalization": "Personalització",
"Pin": "",
"Pinned": "",
"Pipeline deleted successfully": "Pipeline eliminada correctament", "Pipeline deleted successfully": "Pipeline eliminada correctament",
"Pipeline downloaded successfully": "Pipeline descarregada correctament", "Pipeline downloaded successfully": "Pipeline descarregada correctament",
"Pipelines": "Pipelines", "Pipelines": "Pipelines",
...@@ -574,6 +580,8 @@ ...@@ -574,6 +580,8 @@
"This setting does not sync across browsers or devices.": "Aquesta preferència no es sincronitza entre navegadors ni dispositius.", "This setting does not sync across browsers or devices.": "Aquesta preferència no es sincronitza entre navegadors ni dispositius.",
"This will delete": "Això eliminarà", "This will delete": "Això eliminarà",
"Thorough explanation": "Explicació en detall", "Thorough explanation": "Explicació en detall",
"Tika": "",
"Tika Server URL required.": "",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Consell: Actualitza les diverses variables consecutivament prement la tecla de tabulació en l'entrada del xat després de cada reemplaçament.", "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Consell: Actualitza les diverses variables consecutivament prement la tecla de tabulació en l'entrada del xat després de cada reemplaçament.",
"Title": "Títol", "Title": "Títol",
"Title (e.g. Tell me a fun fact)": "Títol (p. ex. Digues-me quelcom divertit)", "Title (e.g. Tell me a fun fact)": "Títol (p. ex. Digues-me quelcom divertit)",
...@@ -608,6 +616,7 @@ ...@@ -608,6 +616,7 @@
"Uh-oh! There was an issue connecting to {{provider}}.": "Oh! Hi ha hagut un problema connectant a {{provider}}.", "Uh-oh! There was an issue connecting to {{provider}}.": "Oh! Hi ha hagut un problema connectant a {{provider}}.",
"UI": "UI", "UI": "UI",
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "Tipus de fitxer desconegut '{{file_type}}'. Continuant amb la càrrega del fitxer.", "Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "Tipus de fitxer desconegut '{{file_type}}'. Continuant amb la càrrega del fitxer.",
"Unpin": "",
"Update": "Actualitzar", "Update": "Actualitzar",
"Update and Copy Link": "Actualitzar i copiar l'enllaç", "Update and Copy Link": "Actualitzar i copiar l'enllaç",
"Update password": "Actualitzar la contrasenya", "Update password": "Actualitzar la contrasenya",
......
...@@ -126,6 +126,7 @@ ...@@ -126,6 +126,7 @@
"Connections": "Mga koneksyon", "Connections": "Mga koneksyon",
"Contact Admin for WebUI Access": "", "Contact Admin for WebUI Access": "",
"Content": "Kontento", "Content": "Kontento",
"Content Extraction": "",
"Context Length": "Ang gitas-on sa konteksto", "Context Length": "Ang gitas-on sa konteksto",
"Continue Response": "", "Continue Response": "",
"Continue with {{provider}}": "", "Continue with {{provider}}": "",
...@@ -212,6 +213,7 @@ ...@@ -212,6 +213,7 @@
"Enable Community Sharing": "", "Enable Community Sharing": "",
"Enable New Sign Ups": "I-enable ang bag-ong mga rehistro", "Enable New Sign Ups": "I-enable ang bag-ong mga rehistro",
"Enable Web Search": "", "Enable Web Search": "",
"Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "Pagsulod sa mensahe {{role}} dinhi", "Enter {{role}} message here": "Pagsulod sa mensahe {{role}} dinhi",
"Enter a detail about yourself for your LLMs to recall": "", "Enter a detail about yourself for your LLMs to recall": "",
...@@ -233,6 +235,7 @@ ...@@ -233,6 +235,7 @@
"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 Tavily API Key": "",
"Enter Tika Server URL": "",
"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)": "",
...@@ -409,6 +412,7 @@ ...@@ -409,6 +412,7 @@
"Open": "Bukas", "Open": "Bukas",
"Open AI (Dall-E)": "Buksan ang AI (Dall-E)", "Open AI (Dall-E)": "Buksan ang AI (Dall-E)",
"Open new chat": "Ablihi ang bag-ong diskusyon", "Open new chat": "Ablihi ang bag-ong diskusyon",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "", "OpenAI": "",
"OpenAI API": "OpenAI API", "OpenAI API": "OpenAI API",
"OpenAI API Config": "", "OpenAI API Config": "",
...@@ -424,6 +428,8 @@ ...@@ -424,6 +428,8 @@
"Permission denied when accessing microphone": "", "Permission denied when accessing microphone": "",
"Permission denied when accessing microphone: {{error}}": "Gidili ang pagtugot sa dihang nag-access sa mikropono: {{error}}", "Permission denied when accessing microphone: {{error}}": "Gidili ang pagtugot sa dihang nag-access sa mikropono: {{error}}",
"Personalization": "", "Personalization": "",
"Pin": "",
"Pinned": "",
"Pipeline deleted successfully": "", "Pipeline deleted successfully": "",
"Pipeline downloaded successfully": "", "Pipeline downloaded successfully": "",
"Pipelines": "", "Pipelines": "",
...@@ -573,6 +579,8 @@ ...@@ -573,6 +579,8 @@
"This setting does not sync across browsers or devices.": "Kini nga setting wala mag-sync tali sa mga browser o device.", "This setting does not sync across browsers or devices.": "Kini nga setting wala mag-sync tali sa mga browser o device.",
"This will delete": "", "This will delete": "",
"Thorough explanation": "", "Thorough explanation": "",
"Tika": "",
"Tika Server URL required.": "",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Sugyot: Pag-update sa daghang variable nga lokasyon nga sunud-sunod pinaagi sa pagpindot sa tab key sa chat entry pagkahuman sa matag puli.", "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Sugyot: Pag-update sa daghang variable nga lokasyon nga sunud-sunod pinaagi sa pagpindot sa tab key sa chat entry pagkahuman sa matag puli.",
"Title": "Titulo", "Title": "Titulo",
"Title (e.g. Tell me a fun fact)": "", "Title (e.g. Tell me a fun fact)": "",
...@@ -607,6 +615,7 @@ ...@@ -607,6 +615,7 @@
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! {{provider}}.", "Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! {{provider}}.",
"UI": "", "UI": "",
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "", "Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "",
"Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "", "Update and Copy Link": "",
"Update password": "I-update ang password", "Update password": "I-update ang password",
......
This diff is collapsed.
...@@ -126,6 +126,7 @@ ...@@ -126,6 +126,7 @@
"Connections": "Connections", "Connections": "Connections",
"Contact Admin for WebUI Access": "", "Contact Admin for WebUI Access": "",
"Content": "Content", "Content": "Content",
"Content Extraction": "",
"Context Length": "Context Length", "Context Length": "Context Length",
"Continue Response": "", "Continue Response": "",
"Continue with {{provider}}": "", "Continue with {{provider}}": "",
...@@ -212,6 +213,7 @@ ...@@ -212,6 +213,7 @@
"Enable Community Sharing": "", "Enable Community Sharing": "",
"Enable New Sign Ups": "Enable New Bark Ups", "Enable New Sign Ups": "Enable New Bark Ups",
"Enable Web Search": "", "Enable Web Search": "",
"Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "Enter {{role}} bork here", "Enter {{role}} message here": "Enter {{role}} bork here",
"Enter a detail about yourself for your LLMs to recall": "", "Enter a detail about yourself for your LLMs to recall": "",
...@@ -233,6 +235,7 @@ ...@@ -233,6 +235,7 @@
"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 Tavily API Key": "",
"Enter Tika Server URL": "",
"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)": "",
...@@ -409,6 +412,7 @@ ...@@ -409,6 +412,7 @@
"Open": "Open", "Open": "Open",
"Open AI (Dall-E)": "Open AI (Dall-E)", "Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "Open new bark", "Open new chat": "Open new bark",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "", "OpenAI": "",
"OpenAI API": "OpenAI API", "OpenAI API": "OpenAI API",
"OpenAI API Config": "", "OpenAI API Config": "",
...@@ -424,6 +428,8 @@ ...@@ -424,6 +428,8 @@
"Permission denied when accessing microphone": "", "Permission denied when accessing microphone": "",
"Permission denied when accessing microphone: {{error}}": "Permission denied when accessing microphone: {{error}}", "Permission denied when accessing microphone: {{error}}": "Permission denied when accessing microphone: {{error}}",
"Personalization": "Personalization", "Personalization": "Personalization",
"Pin": "",
"Pinned": "",
"Pipeline deleted successfully": "", "Pipeline deleted successfully": "",
"Pipeline downloaded successfully": "", "Pipeline downloaded successfully": "",
"Pipelines": "", "Pipelines": "",
...@@ -575,6 +581,8 @@ ...@@ -575,6 +581,8 @@
"This setting does not sync across browsers or devices.": "This setting does not sync across browsers or devices. Very not sync.", "This setting does not sync across browsers or devices.": "This setting does not sync across browsers or devices. Very not sync.",
"This will delete": "", "This will delete": "",
"Thorough explanation": "", "Thorough explanation": "",
"Tika": "",
"Tika Server URL required.": "",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement. Much tip!", "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement. Much tip!",
"Title": "Title very title", "Title": "Title very title",
"Title (e.g. Tell me a fun fact)": "", "Title (e.g. Tell me a fun fact)": "",
...@@ -609,6 +617,7 @@ ...@@ -609,6 +617,7 @@
"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!",
"UI": "", "UI": "",
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "", "Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "",
"Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "", "Update and Copy Link": "",
"Update password": "Update password much change", "Update password": "Update password much change",
......
...@@ -126,6 +126,7 @@ ...@@ -126,6 +126,7 @@
"Connections": "", "Connections": "",
"Contact Admin for WebUI Access": "", "Contact Admin for WebUI Access": "",
"Content": "", "Content": "",
"Content Extraction": "",
"Context Length": "", "Context Length": "",
"Continue Response": "", "Continue Response": "",
"Continue with {{provider}}": "", "Continue with {{provider}}": "",
...@@ -212,6 +213,7 @@ ...@@ -212,6 +213,7 @@
"Enable Community Sharing": "", "Enable Community Sharing": "",
"Enable New Sign Ups": "", "Enable New Sign Ups": "",
"Enable Web Search": "", "Enable Web Search": "",
"Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "", "Enter {{role}} message here": "",
"Enter a detail about yourself for your LLMs to recall": "", "Enter a detail about yourself for your LLMs to recall": "",
...@@ -233,6 +235,7 @@ ...@@ -233,6 +235,7 @@
"Enter Serpstack API Key": "", "Enter Serpstack API Key": "",
"Enter stop sequence": "", "Enter stop sequence": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "",
"Enter Top K": "", "Enter Top K": "",
"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)": "",
...@@ -409,6 +412,7 @@ ...@@ -409,6 +412,7 @@
"Open": "", "Open": "",
"Open AI (Dall-E)": "", "Open AI (Dall-E)": "",
"Open new chat": "", "Open new chat": "",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "", "OpenAI": "",
"OpenAI API": "", "OpenAI API": "",
"OpenAI API Config": "", "OpenAI API Config": "",
...@@ -424,6 +428,8 @@ ...@@ -424,6 +428,8 @@
"Permission denied when accessing microphone": "", "Permission denied when accessing microphone": "",
"Permission denied when accessing microphone: {{error}}": "", "Permission denied when accessing microphone: {{error}}": "",
"Personalization": "", "Personalization": "",
"Pin": "",
"Pinned": "",
"Pipeline deleted successfully": "", "Pipeline deleted successfully": "",
"Pipeline downloaded successfully": "", "Pipeline downloaded successfully": "",
"Pipelines": "", "Pipelines": "",
...@@ -573,6 +579,8 @@ ...@@ -573,6 +579,8 @@
"This setting does not sync across browsers or devices.": "", "This setting does not sync across browsers or devices.": "",
"This will delete": "", "This will delete": "",
"Thorough explanation": "", "Thorough explanation": "",
"Tika": "",
"Tika Server URL required.": "",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "", "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "",
"Title": "", "Title": "",
"Title (e.g. Tell me a fun fact)": "", "Title (e.g. Tell me a fun fact)": "",
...@@ -607,6 +615,7 @@ ...@@ -607,6 +615,7 @@
"Uh-oh! There was an issue connecting to {{provider}}.": "", "Uh-oh! There was an issue connecting to {{provider}}.": "",
"UI": "", "UI": "",
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "", "Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "",
"Unpin": "",
"Update": "", "Update": "",
"Update and Copy Link": "", "Update and Copy Link": "",
"Update password": "", "Update password": "",
......
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