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 @@
.substring(1)
.startsWith('https://youtu.be'))}
<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"
on:click={() => {
const url = prompt.split(' ')?.at(0)?.substring(1);
......@@ -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)}
</div>
......@@ -185,7 +185,7 @@
</button>
{:else if prompt.split(' ')?.at(0)?.substring(1).startsWith('http')}
<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"
on:click={() => {
const url = prompt.split(' ')?.at(0)?.substring(1);
......@@ -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)}
</div>
......
......@@ -100,25 +100,27 @@
class="flex snap-x snap-mandatory overflow-x-auto scrollbar-hidden"
id="responses-container-{parentMessage.id}"
>
{#key currentMessageId}
{#each Object.keys(groupedMessages) as model}
{#if groupedMessagesIdx[model] !== undefined && groupedMessages[model].messages.length > 0}
<!-- svelte-ignore a11y-no-static-element-interactions -->
<!-- svelte-ignore a11y-click-events-have-key-events -->
{@const message = groupedMessages[model].messages[groupedMessagesIdx[model]]}
<div
class=" snap-center min-w-80 w-full max-w-full m-1 border {history.messages[
currentMessageId
].model === model
? 'border-gray-100 dark:border-gray-850 border-[1.5px]'
? 'border-gray-100 dark:border-gray-800 border-[1.5px]'
: 'border-gray-50 dark:border-gray-850 '} transition p-5 rounded-3xl"
on:click={() => {
currentMessageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id;
let messageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id;
if (currentMessageId != message.id) {
currentMessageId = message.id;
let messageId = message.id;
console.log(messageId);
let messageChildrenIds = history.messages[messageId].childrenIds;
//
let messageChildrenIds = history.messages[messageId].childrenIds;
while (messageChildrenIds.length !== 0) {
messageId = messageChildrenIds.at(-1);
messageChildrenIds = history.messages[messageId].childrenIds;
......@@ -126,6 +128,7 @@
history.currentId = messageId;
dispatch('change');
}
}}
>
<ResponseMessage
......@@ -159,5 +162,6 @@
</div>
{/if}
{/each}
{/key}
</div>
</div>
......@@ -18,6 +18,7 @@
import ManageModal from './Personalization/ManageModal.svelte';
import Tooltip from '$lib/components/common/Tooltip.svelte';
import Spinner from '$lib/components/common/Spinner.svelte';
import Switch from '$lib/components/common/Switch.svelte';
const dispatch = createEventDispatcher();
......@@ -185,7 +186,10 @@
class="p-1 px-3 text-xs flex rounded transition"
type="button"
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}
......@@ -203,8 +207,31 @@
</div>
{#if (valves[property] ?? null) !== null}
<!-- {valves[property]} -->
<div class="flex mt-0.5 mb-1.5 space-x-2">
<div class=" flex-1">
{#if valvesSpec.properties[property]?.enum ?? null}
<select
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
bind:value={valves[property]}
>
{#each valvesSpec.properties[property].enum as option}
<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"
......@@ -213,6 +240,7 @@
autocomplete="off"
required
/>
{/if}
</div>
</div>
{/if}
......
......@@ -8,7 +8,7 @@
getTagsById,
updateChatById
} 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';
const dispatch = createEventDispatcher();
......@@ -19,9 +19,11 @@
let tags = [];
const getTags = async () => {
return await getTagsById(localStorage.token, chatId).catch(async (error) => {
return (
await getTagsById(localStorage.token, chatId).catch(async (error) => {
return [];
});
})
).filter((tag) => tag.name !== 'pinned');
};
const addTag = async (tagName) => {
......@@ -33,6 +35,7 @@
});
_tags.set(await getAllChatTags(localStorage.token));
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
};
const deleteTag = async (tagName) => {
......@@ -44,19 +47,23 @@
});
console.log($_tags);
await _tags.set(await getAllChatTags(localStorage.token));
console.log($_tags);
if ($_tags.map((t) => t.name).includes(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)) {
dispatch('close');
}
} else {
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 @@
tags,
showSidebar,
mobile,
showArchivedChats
showArchivedChats,
pinnedChats
} from '$lib/stores';
import { onMount, getContext, tick } from 'svelte';
......@@ -46,6 +47,7 @@
let showDeleteConfirm = false;
let showDropdown = false;
let filteredChatList = [];
$: filteredChatList = $chats.filter((chat) => {
......@@ -80,6 +82,8 @@
});
showSidebar.set(window.innerWidth > BREAKPOINT);
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
await chats.set(await getChatList(localStorage.token));
let touchstart;
......@@ -412,7 +416,7 @@
</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">
<button
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 @@
>
{$i18n.t('all')}
</button>
{#each $tags as tag}
{#each $tags.filter((t) => t.name !== 'pinned') as tag}
<button
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 () => {
......@@ -440,6 +444,38 @@
</div>
{/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">
{#each filteredChatList as chat, idx}
{#if idx === 0 || (idx > 0 && chat.time_range !== filteredChatList[idx - 1].time_range)}
......
......@@ -11,9 +11,10 @@
cloneChatById,
deleteChatById,
getChatList,
getChatListByTagName,
updateChatById
} 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 ShareChatModal from '$lib/components/chat/ShareChatModal.svelte';
......@@ -40,6 +41,7 @@
title: _title
});
await chats.set(await getChatList(localStorage.token));
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
}
};
......@@ -52,12 +54,14 @@
if (res) {
goto(`/c/${res.id}`);
await chats.set(await getChatList(localStorage.token));
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
}
};
const archiveChatHandler = async (id) => {
await archiveChatById(localStorage.token, id);
await chats.set(await getChatList(localStorage.token));
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
};
const focusEdit = async (node: HTMLInputElement) => {
......@@ -233,6 +237,9 @@
onClose={() => {
dispatch('unselect');
}}
on:change={async () => {
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
}}
>
<button
aria-label="Chat Menu"
......
<script lang="ts">
import { DropdownMenu } from 'bits-ui';
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 GarbageBin from '$lib/components/icons/GarbageBin.svelte';
......@@ -11,6 +13,9 @@
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 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');
......@@ -24,6 +29,28 @@
export let chatId = '';
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>
<Dropdown
......@@ -46,6 +73,21 @@
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();
}}
>
{#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
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={() => {
......
......@@ -12,6 +12,7 @@
} from '$lib/apis/functions';
import { getToolValvesById, getToolValvesSpecById, updateToolValvesById } from '$lib/apis/tools';
import Spinner from '../../common/Spinner.svelte';
import Switch from '$lib/components/common/Switch.svelte';
const i18n = getContext('i18n');
const dispatch = createEventDispatcher();
......@@ -142,7 +143,10 @@
class="p-1 px-3 text-xs flex rounded transition"
type="button"
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}
......@@ -160,8 +164,31 @@
</div>
{#if (valves[property] ?? null) !== null}
<!-- {valves[property]} -->
<div class="flex mt-0.5 mb-1.5 space-x-2">
<div class=" flex-1">
{#if valvesSpec.properties[property]?.enum ?? null}
<select
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
bind:value={valves[property]}
>
{#each valvesSpec.properties[property].enum as option}
<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"
......@@ -170,6 +197,7 @@
autocomplete="off"
required
/>
{/if}
</div>
</div>
{/if}
......
......@@ -126,6 +126,7 @@
"Connections": "اتصالات",
"Contact Admin for WebUI Access": "",
"Content": "الاتصال",
"Content Extraction": "",
"Context Length": "طول السياق",
"Continue Response": "متابعة الرد",
"Continue with {{provider}}": "",
......@@ -212,6 +213,7 @@
"Enable Community Sharing": "تمكين مشاركة المجتمع",
"Enable New Sign Ups": "تفعيل عمليات التسجيل الجديدة",
"Enable Web Search": "تمكين بحث الويب",
"Engine": "",
"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 a detail about yourself for your LLMs to recall": "ادخل معلومات عنك تريد أن يتذكرها الموديل",
......@@ -233,6 +235,7 @@
"Enter Serpstack API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serpstack",
"Enter stop sequence": "أدخل تسلسل التوقف",
"Enter Tavily API Key": "",
"Enter Tika Server URL": "",
"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://localhost:11434)": "URL (e.g. http://localhost:11434)",
......@@ -409,6 +412,7 @@
"Open": "فتح",
"Open AI (Dall-E)": "AI (Dall-E) فتح",
"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 إعدادات",
......@@ -424,6 +428,8 @@
"Permission denied when accessing microphone": "",
"Permission denied when accessing microphone: {{error}}": "{{error}} تم رفض الإذن عند الوصول إلى الميكروفون ",
"Personalization": "التخصيص",
"Pin": "",
"Pinned": "",
"Pipeline deleted successfully": "",
"Pipeline downloaded successfully": "",
"Pipelines": "خطوط الانابيب",
......@@ -577,6 +583,8 @@
"This setting does not sync across browsers or devices.": "لا تتم مزامنة هذا الإعداد عبر المتصفحات أو الأجهزة.",
"This will delete": "",
"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 في مدخلات الدردشة بعد كل استبدال.",
"Title": "العنوان",
"Title (e.g. Tell me a fun fact)": "(e.g. Tell me a fun fact) العناون",
......@@ -611,6 +619,7 @@
"Uh-oh! There was an issue connecting to {{provider}}.": "{{provider}}خطاء أوه! حدثت مشكلة في الاتصال بـ ",
"UI": "",
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "",
"Unpin": "",
"Update": "",
"Update and Copy Link": "تحديث ونسخ الرابط",
"Update password": "تحديث كلمة المرور",
......
......@@ -126,6 +126,7 @@
"Connections": "Връзки",
"Contact Admin for WebUI Access": "",
"Content": "Съдържание",
"Content Extraction": "",
"Context Length": "Дължина на Контекста",
"Continue Response": "Продължи отговора",
"Continue with {{provider}}": "",
......@@ -212,6 +213,7 @@
"Enable Community Sharing": "Разрешаване на споделяне в общност",
"Enable New Sign Ups": "Вклюване на Нови Потребители",
"Enable Web Search": "Разрешаване на търсене в уеб",
"Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверете се, че вашият CSV файл включва 4 колони в следния ред: Име, Имейл, Парола, Роля.",
"Enter {{role}} message here": "Въведете съобщение за {{role}} тук",
"Enter a detail about yourself for your LLMs to recall": "Въведете подробности за себе си, за да се herinnerат вашите LLMs",
......@@ -233,6 +235,7 @@
"Enter Serpstack API Key": "Въведете Serpstack API ключ",
"Enter stop sequence": "Въведете стоп последователност",
"Enter Tavily API Key": "",
"Enter Tika Server URL": "",
"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://localhost:11434)": "Въведете URL (напр. http://localhost:11434)",
......@@ -409,6 +412,7 @@
"Open": "Отвори",
"Open AI (Dall-E)": "Open AI (Dall-E)",
"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 @@
"Permission denied when accessing microphone": "",
"Permission denied when accessing microphone: {{error}}": "Permission denied when accessing microphone: {{error}}",
"Personalization": "Персонализация",
"Pin": "",
"Pinned": "",
"Pipeline deleted successfully": "",
"Pipeline downloaded successfully": "",
"Pipelines": "Тръбопроводи",
......@@ -573,6 +579,8 @@
"This setting does not sync across browsers or devices.": "Тази настройка не се синхронизира между браузъри или устройства.",
"This will delete": "",
"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 в чат входа след всяка подмяна.",
"Title": "Заглавие",
"Title (e.g. Tell me a fun fact)": "Заглавие (напр. Моля, кажете ми нещо забавно)",
......@@ -607,6 +615,7 @@
"Uh-oh! There was an issue connecting to {{provider}}.": "О, не! Възникна проблем при свързването с {{provider}}.",
"UI": "",
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "",
"Unpin": "",
"Update": "",
"Update and Copy Link": "Обнови и копирай връзка",
"Update password": "Обновяване на парола",
......
......@@ -126,6 +126,7 @@
"Connections": "কানেকশনগুলো",
"Contact Admin for WebUI Access": "",
"Content": "বিষয়বস্তু",
"Content Extraction": "",
"Context Length": "কনটেক্সটের দৈর্ঘ্য",
"Continue Response": "যাচাই করুন",
"Continue with {{provider}}": "",
......@@ -212,6 +213,7 @@
"Enable Community Sharing": "সম্প্রদায় শেয়ারকরণ সক্ষম করুন",
"Enable New Sign Ups": "নতুন সাইনআপ চালু করুন",
"Enable Web Search": "ওয়েব অনুসন্ধান সক্ষম করুন",
"Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "আপনার সিএসভি ফাইলটিতে এই ক্রমে 4 টি কলাম অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন: নাম, ইমেল, পাসওয়ার্ড, ভূমিকা।.",
"Enter {{role}} message here": "{{role}} মেসেজ এখানে লিখুন",
"Enter a detail about yourself for your LLMs to recall": "আপনার এলএলএমগুলি স্মরণ করার জন্য নিজের সম্পর্কে একটি বিশদ লিখুন",
......@@ -233,6 +235,7 @@
"Enter Serpstack API Key": "Serpstack API কী লিখুন",
"Enter stop sequence": "স্টপ সিকোয়েন্স লিখুন",
"Enter Tavily API Key": "",
"Enter Tika Server URL": "",
"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://localhost:11434)": "ইউআরএল দিন (যেমন http://localhost:11434)",
......@@ -409,6 +412,7 @@
"Open": "খোলা",
"Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "নতুন চ্যাট খুলুন",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "OpenAI",
"OpenAI API": "OpenAI এপিআই",
"OpenAI API Config": "OpenAI এপিআই কনফিগ",
......@@ -424,6 +428,8 @@
"Permission denied when accessing microphone": "",
"Permission denied when accessing microphone: {{error}}": "মাইক্রোফোন ব্যবহারের অনুমতি পাওয়া যায়নি: {{error}}",
"Personalization": "ডিজিটাল বাংলা",
"Pin": "",
"Pinned": "",
"Pipeline deleted successfully": "",
"Pipeline downloaded successfully": "",
"Pipelines": "পাইপলাইন",
......@@ -573,6 +579,8 @@
"This setting does not sync across browsers or devices.": "এই সেটিং অন্যন্য ব্রাউজার বা ডিভাইসের সাথে সিঙ্ক্রোনাইজ নয় না।",
"This will delete": "",
"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 বাটন ব্যবহার করুন।",
"Title": "শিরোনাম",
"Title (e.g. Tell me a fun fact)": "শিরোনাম (একটি উপস্থিতি বিবরণ জানান)",
......@@ -607,6 +615,7 @@
"Uh-oh! There was an issue connecting to {{provider}}.": "ওহ-হো! {{provider}} এর সাথে কানেকশনে সমস্যা হয়েছে।",
"UI": "",
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "",
"Unpin": "",
"Update": "",
"Update and Copy Link": "আপডেট এবং লিংক কপি করুন",
"Update password": "পাসওয়ার্ড আপডেট করুন",
......
......@@ -126,6 +126,7 @@
"Connections": "Connexions",
"Contact Admin for WebUI Access": "Posat en contacte amb l'administrador per accedir a WebUI",
"Content": "Contingut",
"Content Extraction": "",
"Context Length": "Mida del context",
"Continue Response": "Continuar la resposta",
"Continue with {{provider}}": "Continuar amb {{provider}}",
......@@ -212,6 +213,7 @@
"Enable Community Sharing": "Activar l'ús compartit amb la comunitat",
"Enable New Sign Ups": "Permetre nous registres",
"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.",
"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",
......@@ -233,6 +235,7 @@
"Enter Serpstack API Key": "Introdueix la clau API Serpstack",
"Enter stop sequence": "Introdueix la seqüència de parada",
"Enter Tavily API Key": "Introdueix la clau API de Tavily",
"Enter Tika Server URL": "",
"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://localhost:11434)": "Introdueix l'URL (p. ex. http://localhost:11434)",
......@@ -409,6 +412,7 @@
"Open": "Obre",
"Open AI (Dall-E)": "Open AI (Dall-E)",
"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 API": "API d'OpenAI",
"OpenAI API Config": "Configuració de l'API d'OpenAI",
......@@ -424,6 +428,8 @@
"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}}",
"Personalization": "Personalització",
"Pin": "",
"Pinned": "",
"Pipeline deleted successfully": "Pipeline eliminada correctament",
"Pipeline downloaded successfully": "Pipeline descarregada correctament",
"Pipelines": "Pipelines",
......@@ -574,6 +580,8 @@
"This setting does not sync across browsers or devices.": "Aquesta preferència no es sincronitza entre navegadors ni dispositius.",
"This will delete": "Això eliminarà",
"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.",
"Title": "Títol",
"Title (e.g. Tell me a fun fact)": "Títol (p. ex. Digues-me quelcom divertit)",
......@@ -608,6 +616,7 @@
"Uh-oh! There was an issue connecting to {{provider}}.": "Oh! Hi ha hagut un problema connectant a {{provider}}.",
"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.",
"Unpin": "",
"Update": "Actualitzar",
"Update and Copy Link": "Actualitzar i copiar l'enllaç",
"Update password": "Actualitzar la contrasenya",
......
......@@ -126,6 +126,7 @@
"Connections": "Mga koneksyon",
"Contact Admin for WebUI Access": "",
"Content": "Kontento",
"Content Extraction": "",
"Context Length": "Ang gitas-on sa konteksto",
"Continue Response": "",
"Continue with {{provider}}": "",
......@@ -212,6 +213,7 @@
"Enable Community Sharing": "",
"Enable New Sign Ups": "I-enable ang bag-ong mga rehistro",
"Enable Web Search": "",
"Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "Pagsulod sa mensahe {{role}} dinhi",
"Enter a detail about yourself for your LLMs to recall": "",
......@@ -233,6 +235,7 @@
"Enter Serpstack API Key": "",
"Enter stop sequence": "Pagsulod sa katapusan nga han-ay",
"Enter Tavily API Key": "",
"Enter Tika Server URL": "",
"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://localhost:11434)": "",
......@@ -409,6 +412,7 @@
"Open": "Bukas",
"Open AI (Dall-E)": "Buksan ang AI (Dall-E)",
"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 API": "OpenAI API",
"OpenAI API Config": "",
......@@ -424,6 +428,8 @@
"Permission denied when accessing microphone": "",
"Permission denied when accessing microphone: {{error}}": "Gidili ang pagtugot sa dihang nag-access sa mikropono: {{error}}",
"Personalization": "",
"Pin": "",
"Pinned": "",
"Pipeline deleted successfully": "",
"Pipeline downloaded successfully": "",
"Pipelines": "",
......@@ -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 will delete": "",
"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.",
"Title": "Titulo",
"Title (e.g. Tell me a fun fact)": "",
......@@ -607,6 +615,7 @@
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! {{provider}}.",
"UI": "",
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "",
"Unpin": "",
"Update": "",
"Update and Copy Link": "",
"Update password": "I-update ang password",
......
This diff is collapsed.
......@@ -126,6 +126,7 @@
"Connections": "Connections",
"Contact Admin for WebUI Access": "",
"Content": "Content",
"Content Extraction": "",
"Context Length": "Context Length",
"Continue Response": "",
"Continue with {{provider}}": "",
......@@ -212,6 +213,7 @@
"Enable Community Sharing": "",
"Enable New Sign Ups": "Enable New Bark Ups",
"Enable Web Search": "",
"Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "Enter {{role}} bork here",
"Enter a detail about yourself for your LLMs to recall": "",
......@@ -233,6 +235,7 @@
"Enter Serpstack API Key": "",
"Enter stop sequence": "Enter stop bark",
"Enter Tavily API Key": "",
"Enter Tika Server URL": "",
"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://localhost:11434)": "",
......@@ -409,6 +412,7 @@
"Open": "Open",
"Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "Open new bark",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "",
"OpenAI API": "OpenAI API",
"OpenAI API Config": "",
......@@ -424,6 +428,8 @@
"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 downloaded successfully": "",
"Pipelines": "",
......@@ -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 will delete": "",
"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!",
"Title": "Title very title",
"Title (e.g. Tell me a fun fact)": "",
......@@ -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!",
"UI": "",
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "",
"Unpin": "",
"Update": "",
"Update and Copy Link": "",
"Update password": "Update password much change",
......
......@@ -126,6 +126,7 @@
"Connections": "",
"Contact Admin for WebUI Access": "",
"Content": "",
"Content Extraction": "",
"Context Length": "",
"Continue Response": "",
"Continue with {{provider}}": "",
......@@ -212,6 +213,7 @@
"Enable Community Sharing": "",
"Enable New Sign Ups": "",
"Enable Web Search": "",
"Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "",
"Enter a detail about yourself for your LLMs to recall": "",
......@@ -233,6 +235,7 @@
"Enter Serpstack API Key": "",
"Enter stop sequence": "",
"Enter Tavily API Key": "",
"Enter Tika Server URL": "",
"Enter Top K": "",
"Enter URL (e.g. http://127.0.0.1:7860/)": "",
"Enter URL (e.g. http://localhost:11434)": "",
......@@ -409,6 +412,7 @@
"Open": "",
"Open AI (Dall-E)": "",
"Open new chat": "",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
"OpenAI": "",
"OpenAI API": "",
"OpenAI API Config": "",
......@@ -424,6 +428,8 @@
"Permission denied when accessing microphone": "",
"Permission denied when accessing microphone: {{error}}": "",
"Personalization": "",
"Pin": "",
"Pinned": "",
"Pipeline deleted successfully": "",
"Pipeline downloaded successfully": "",
"Pipelines": "",
......@@ -573,6 +579,8 @@
"This setting does not sync across browsers or devices.": "",
"This will delete": "",
"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.": "",
"Title": "",
"Title (e.g. Tell me a fun fact)": "",
......@@ -607,6 +615,7 @@
"Uh-oh! There was an issue connecting to {{provider}}.": "",
"UI": "",
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "",
"Unpin": "",
"Update": "",
"Update and Copy Link": "",
"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