mirror of
https://github.com/open-webui/open-webui
synced 2025-04-02 12:09:06 +00:00
Merge 84714981e7
into 5ce6c8ced3
This commit is contained in:
commit
100d2c9f10
145
src/lib/components/common/SortOptions.svelte
Normal file
145
src/lib/components/common/SortOptions.svelte
Normal file
@ -0,0 +1,145 @@
|
||||
<script context="module" lang="ts">
|
||||
export type SortDirection = 'asc' | 'desc' | 'none';
|
||||
|
||||
export interface SortState {
|
||||
field: string;
|
||||
direction: SortDirection;
|
||||
initialLoad: boolean;
|
||||
}
|
||||
|
||||
export function sortItems<T>(items: T[], sortState: SortState): T[] {
|
||||
if (sortState.initialLoad || sortState.direction === 'none') {
|
||||
return [...items];
|
||||
}
|
||||
|
||||
return [...items].sort((a, b) => {
|
||||
const valueA = getNestedValue(a, sortState.field);
|
||||
const valueB = getNestedValue(b, sortState.field);
|
||||
|
||||
const compareA = typeof valueA === 'string' ? valueA.toLowerCase() : valueA;
|
||||
const compareB = typeof valueB === 'string' ? valueB.toLowerCase() : valueB;
|
||||
|
||||
const comparableA = compareA as string | number | boolean | Date;
|
||||
const comparableB = compareB as string | number | boolean | Date;
|
||||
|
||||
if (sortState.direction === 'asc') {
|
||||
return comparableA > comparableB ? 1 : comparableA < comparableB ? -1 : 0;
|
||||
} else {
|
||||
return comparableA < comparableB ? 1 : comparableA > comparableB ? -1 : 0;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function getNestedValue(obj: unknown, path: string): unknown {
|
||||
if (!obj) return '';
|
||||
if (!path) return obj;
|
||||
|
||||
const keys = path.split('.');
|
||||
let value = obj as Record<string, unknown>;
|
||||
|
||||
for (const key of keys) {
|
||||
if (value === null || value === undefined || typeof value !== 'object') {
|
||||
return '';
|
||||
}
|
||||
value = value[key] as Record<string, unknown>;
|
||||
}
|
||||
|
||||
return value === null || value === undefined ? '' : value;
|
||||
}
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
import ChevronDown from '../icons/ChevronDown.svelte';
|
||||
import ChevronUp from '../icons/ChevronUp.svelte';
|
||||
import { getContext, createEventDispatcher, tick } from 'svelte';
|
||||
import type { Readable } from 'svelte/store';
|
||||
import { onMount } from 'svelte';
|
||||
|
||||
interface I18nStore extends Readable<{
|
||||
t: (key: string) => string;
|
||||
}> {}
|
||||
|
||||
const i18n = getContext<I18nStore>('i18n');
|
||||
const dispatch = createEventDispatcher<{
|
||||
change: { sortedItems: any[]; sortState: SortState };
|
||||
}>();
|
||||
|
||||
export let sortState: SortState = {
|
||||
field: '',
|
||||
direction: 'none',
|
||||
initialLoad: true
|
||||
};
|
||||
|
||||
export let items: any[] = [];
|
||||
export let options: { value: string; label: string }[] = [];
|
||||
|
||||
export let sortedItems: any[] = [];
|
||||
|
||||
export let isSorting: boolean = false;
|
||||
|
||||
$: if (options.length > 0 && sortState.initialLoad) {
|
||||
sortState.field = options[0].value;
|
||||
}
|
||||
|
||||
onMount(() => {
|
||||
if (options.length > 0 && sortState.field === '') {
|
||||
sortState.field = options[0].value;
|
||||
}
|
||||
});
|
||||
|
||||
$: if (items && items.length >= 0) {
|
||||
sortedItems = sortItems(items, sortState);
|
||||
}
|
||||
|
||||
$: if (sortedItems) {
|
||||
dispatch('change', { sortedItems, sortState });
|
||||
}
|
||||
|
||||
function changeSortField(field: string) {
|
||||
isSorting = true;
|
||||
|
||||
sortState.initialLoad = false;
|
||||
|
||||
if (sortState.field === field) {
|
||||
if (sortState.direction === 'asc') {
|
||||
sortState.direction = 'desc';
|
||||
} else if (sortState.direction === 'desc') {
|
||||
sortState.direction = 'none';
|
||||
} else {
|
||||
sortState.direction = 'asc';
|
||||
}
|
||||
} else {
|
||||
sortState.field = field;
|
||||
sortState.direction = 'asc';
|
||||
}
|
||||
|
||||
tick().then(() => {
|
||||
isSorting = false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="flex items-center space-x-2 mr-2">
|
||||
<div class="text-sm text-gray-500 dark:text-gray-300">{$i18n.t('Sort by')}:</div>
|
||||
<div class="flex space-x-1">
|
||||
{#each options as option}
|
||||
<button
|
||||
class="px-2 py-1 text-xs rounded-lg {sortState.field === option.value ? 'bg-gray-100 dark:bg-gray-700' : 'hover:bg-gray-50 dark:hover:bg-gray-800'} transition"
|
||||
on:click={() => changeSortField(option.value)}
|
||||
>
|
||||
{option.label}
|
||||
{#if sortState.field === option.value}
|
||||
<span class="ml-1">
|
||||
{#if sortState.direction === 'asc'}
|
||||
<ChevronUp className="w-3 h-3 inline" />
|
||||
{:else if sortState.direction === 'desc'}
|
||||
<ChevronDown className="w-3 h-3 inline" />
|
||||
{:else}
|
||||
<span class="text-xs text-gray-400">•</span>
|
||||
{/if}
|
||||
</span>
|
||||
{/if}
|
||||
</button>
|
||||
{/each}
|
||||
</div>
|
||||
</div>
|
@ -26,6 +26,7 @@
|
||||
import Spinner from '../common/Spinner.svelte';
|
||||
import { capitalizeFirstLetter } from '$lib/utils';
|
||||
import Tooltip from '../common/Tooltip.svelte';
|
||||
import SortOptions, { type SortDirection, type SortState } from '../common/SortOptions.svelte';
|
||||
|
||||
let loaded = false;
|
||||
|
||||
@ -36,8 +37,10 @@
|
||||
let fuse = null;
|
||||
|
||||
let knowledgeBases = [];
|
||||
|
||||
let originalItems = [];
|
||||
let filteredItems = [];
|
||||
|
||||
|
||||
$: if (knowledgeBases) {
|
||||
fuse = new Fuse(knowledgeBases, {
|
||||
keys: ['name', 'description']
|
||||
@ -45,7 +48,7 @@
|
||||
}
|
||||
|
||||
$: if (fuse) {
|
||||
filteredItems = query
|
||||
originalItems = query
|
||||
? fuse.search(query).map((e) => {
|
||||
return e.item;
|
||||
})
|
||||
@ -107,6 +110,17 @@
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center space-x-2 mr-2">
|
||||
<SortOptions
|
||||
items={originalItems}
|
||||
bind:sortedItems={filteredItems}
|
||||
options={[
|
||||
{ value: 'name', label: $i18n.t('Name') },
|
||||
{ value: 'updated_at', label: $i18n.t('Updated') }
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<button
|
||||
class=" px-2 py-2 rounded-xl hover:bg-gray-700/10 dark:hover:bg-gray-100/10 dark:text-gray-300 dark:hover:text-white transition font-medium text-sm flex items-center space-x-1"
|
||||
|
@ -34,6 +34,7 @@
|
||||
import Switch from '../common/Switch.svelte';
|
||||
import Spinner from '../common/Spinner.svelte';
|
||||
import { capitalizeFirstLetter } from '$lib/utils';
|
||||
import SortOptions from '../common/SortOptions.svelte';
|
||||
|
||||
let shiftKey = false;
|
||||
|
||||
@ -50,14 +51,15 @@
|
||||
|
||||
let group_ids = [];
|
||||
|
||||
$: if (models) {
|
||||
filteredModels = models.filter(
|
||||
$: filteredItems = models.filter(
|
||||
(m) => searchValue === '' || m.name.toLowerCase().includes(searchValue.toLowerCase())
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
let searchValue = '';
|
||||
|
||||
let isSorting = false;
|
||||
|
||||
const deleteModelHandler = async (model) => {
|
||||
const res = await deleteModelById(localStorage.token, model.id).catch((e) => {
|
||||
toast.error(`${e}`);
|
||||
@ -222,21 +224,34 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" flex flex-1 items-center w-full space-x-2">
|
||||
<div class="flex flex-1 items-center w-full space-x-2">
|
||||
<div class="flex flex-1 items-center">
|
||||
<div class=" self-center ml-1 mr-3">
|
||||
<div class="self-center ml-1 mr-3">
|
||||
<Search className="size-3.5" />
|
||||
</div>
|
||||
<input
|
||||
class=" w-full text-sm py-1 rounded-r-xl outline-hidden bg-transparent"
|
||||
class="w-full text-sm py-1 rounded-r-xl outline-hidden bg-transparent"
|
||||
bind:value={searchValue}
|
||||
placeholder={$i18n.t('Search Models')}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center space-x-2 mr-2">
|
||||
<SortOptions
|
||||
items={filteredItems}
|
||||
bind:sortedItems={filteredModels}
|
||||
bind:isSorting={isSorting}
|
||||
options={[
|
||||
{ value: 'id', label: 'ID' },
|
||||
{ value: 'name', label: $i18n.t('Name') },
|
||||
{ value: 'updated_at', label: $i18n.t('Updated') }
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<a
|
||||
class=" px-2 py-2 rounded-xl hover:bg-gray-700/10 dark:hover:bg-gray-100/10 dark:text-gray-300 dark:hover:text-white transition font-medium text-sm flex items-center space-x-1"
|
||||
class="px-2 py-2 rounded-xl hover:bg-gray-700/10 dark:hover:bg-gray-100/10 dark:text-gray-300 dark:hover:text-white transition font-medium text-sm flex items-center space-x-1"
|
||||
href="/workspace/models/create"
|
||||
>
|
||||
<Plus className="size-3.5" />
|
||||
@ -380,6 +395,8 @@
|
||||
<Switch
|
||||
bind:state={model.is_active}
|
||||
on:change={async (e) => {
|
||||
if (isSorting) return;
|
||||
|
||||
toggleModelById(localStorage.token, model.id);
|
||||
_models.set(
|
||||
await getModels(
|
||||
|
@ -23,6 +23,7 @@
|
||||
import Spinner from '../common/Spinner.svelte';
|
||||
import Tooltip from '../common/Tooltip.svelte';
|
||||
import { capitalizeFirstLetter } from '$lib/utils';
|
||||
import SortOptions from '../common/SortOptions.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
let promptsImportInputElement: HTMLInputElement;
|
||||
@ -36,8 +37,12 @@
|
||||
let showDeleteConfirm = false;
|
||||
let deletePrompt = null;
|
||||
|
||||
let originalItems = [];
|
||||
let filteredItems = [];
|
||||
$: filteredItems = prompts.filter((p) => query === '' || p.command.includes(query));
|
||||
|
||||
$: {
|
||||
originalItems = prompts.filter((p) => query === '' || p.command.includes(query));
|
||||
}
|
||||
|
||||
const shareHandler = async (prompt) => {
|
||||
toast.success($i18n.t('Redirecting you to Open WebUI Community'));
|
||||
@ -128,6 +133,17 @@
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center space-x-2 mr-2">
|
||||
<SortOptions
|
||||
items={originalItems }
|
||||
bind:sortedItems={filteredItems}
|
||||
options={[
|
||||
{ value: 'title', label: $i18n.t('Title') },
|
||||
{ value: 'command', label: $i18n.t('Command') }
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<a
|
||||
class=" px-2 py-2 rounded-xl hover:bg-gray-700/10 dark:hover:bg-gray-100/10 dark:text-gray-300 dark:hover:text-white transition font-medium text-sm flex items-center space-x-1"
|
||||
|
@ -31,6 +31,7 @@
|
||||
import ChevronRight from '../icons/ChevronRight.svelte';
|
||||
import Spinner from '../common/Spinner.svelte';
|
||||
import { capitalizeFirstLetter } from '$lib/utils';
|
||||
import SortOptions from '../common/SortOptions.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@ -50,14 +51,18 @@
|
||||
let showDeleteConfirm = false;
|
||||
|
||||
let tools = [];
|
||||
let filteredItems = [];
|
||||
|
||||
$: filteredItems = tools.filter(
|
||||
(t) =>
|
||||
query === '' ||
|
||||
t.name.toLowerCase().includes(query.toLowerCase()) ||
|
||||
t.id.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
let filteredItems = [];
|
||||
let originalItems = [];
|
||||
|
||||
$: {
|
||||
originalItems = tools.filter(
|
||||
(t) =>
|
||||
query === '' ||
|
||||
t.name.toLowerCase().includes(query.toLowerCase()) ||
|
||||
t.id.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
}
|
||||
|
||||
const shareHandler = async (tool) => {
|
||||
const item = await getToolById(localStorage.token, tool.id).catch((error) => {
|
||||
@ -196,9 +201,20 @@
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center space-x-2 mr-2">
|
||||
<SortOptions
|
||||
items={originalItems}
|
||||
bind:sortedItems={filteredItems}
|
||||
options={[
|
||||
{ value: 'id', label: 'ID' },
|
||||
{ value: 'name', label: $i18n.t('Name') }
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<a
|
||||
class=" px-2 py-2 rounded-xl hover:bg-gray-700/10 dark:hover:bg-gray-100/10 dark:text-gray-300 dark:hover:text-white transition font-medium text-sm flex items-center space-x-1"
|
||||
class="px-2 py-2 rounded-xl hover:bg-gray-700/10 dark:hover:bg-gray-100/10 dark:text-gray-300 dark:hover:text-white transition font-medium text-sm flex items-center space-x-1"
|
||||
href="/workspace/tools/create"
|
||||
>
|
||||
<Plus className="size-3.5" />
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "المصدر",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "{{error}} خطأ في التعرف على الكلام",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Регистрирайте се в {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Вписване в {{WEBUI_NAME}}",
|
||||
"sk-1234": "sk-1234",
|
||||
"Sort by": "",
|
||||
"Source": "Източник",
|
||||
"Speech Playback Speed": "Скорост на възпроизвеждане на речта",
|
||||
"Speech recognition error: {{error}}": "Грешка при разпознаване на реч: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "উৎস",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "স্পিচ রিকগনিশনে সমস্যা: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Registrar-se a {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Iniciant sessió a {{WEBUI_NAME}}",
|
||||
"sk-1234": "sk-1234",
|
||||
"Sort by": "",
|
||||
"Source": "Font",
|
||||
"Speech Playback Speed": "Velocitat de la parla",
|
||||
"Speech recognition error: {{error}}": "Error de reconeixement de veu: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Tinubdan",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "Sayop sa pag-ila sa tingog: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Zaregistrujte se na {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Přihlašování do {{WEBUI_NAME}}",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Zdroj",
|
||||
"Speech Playback Speed": "Rychlost přehrávání řeči",
|
||||
"Speech recognition error: {{error}}": "Chyba rozpoznávání řeči: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Tilmeld dig {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Logger ind på {{WEBUI_NAME}}",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Kilde",
|
||||
"Speech Playback Speed": "Talehastighed",
|
||||
"Speech recognition error: {{error}}": "Talegenkendelsesfejl: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Bei {{WEBUI_NAME}} registrieren",
|
||||
"Signing in to {{WEBUI_NAME}}": "Wird bei {{WEBUI_NAME}} angemeldet",
|
||||
"sk-1234": "sk-1234",
|
||||
"Sort by": "",
|
||||
"Source": "Quelle",
|
||||
"Speech Playback Speed": "Sprachwiedergabegeschwindigkeit",
|
||||
"Speech recognition error: {{error}}": "Spracherkennungsfehler: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Source",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "Speech recognition error: {{error}} so error",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Εγγραφή στο {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Σύνδεση στο {{WEBUI_NAME}}",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Πηγή",
|
||||
"Speech Playback Speed": "Ταχύτητα Αναπαραγωγής Ομιλίας",
|
||||
"Speech recognition error: {{error}}": "Σφάλμα αναγνώρισης ομιλίας: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Crear una cuenta en {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Iniciando sesión en {{WEBUI_NAME}}",
|
||||
"sk-1234": "sk-1234",
|
||||
"Sort by": "",
|
||||
"Source": "Fuente",
|
||||
"Speech Playback Speed": "Velocidad de reproducción de voz",
|
||||
"Speech recognition error: {{error}}": "Error de reconocimiento de voz: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Erregistratu {{WEBUI_NAME}}-n",
|
||||
"Signing in to {{WEBUI_NAME}}": "{{WEBUI_NAME}}-n saioa hasten",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Iturria",
|
||||
"Speech Playback Speed": "Ahots erreprodukzio abiadura",
|
||||
"Speech recognition error: {{error}}": "Ahots ezagutze errorea: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "منبع",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "خطای تشخیص گفتار: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Rekisteröidy palveluun {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Kirjaudutaan sisään palveluun {{WEBUI_NAME}}",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Lähde",
|
||||
"Speech Playback Speed": "Puhetoiston nopeus",
|
||||
"Speech recognition error: {{error}}": "Puheentunnistusvirhe: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Source",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale\u00a0: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Inscrivez-vous à {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Connexion à {{WEBUI_NAME}}",
|
||||
"sk-1234": "sk-1234",
|
||||
"Sort by": "",
|
||||
"Source": "Source",
|
||||
"Speech Playback Speed": "Vitesse de lecture de la parole",
|
||||
"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "מקור",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "שגיאת תחקור שמע: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "स्रोत",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "वाक् पहचान त्रुटि: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Izvor",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "Pogreška prepoznavanja govora: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Regisztráció ide: {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Bejelentkezés ide: {{WEBUI_NAME}}",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Forrás",
|
||||
"Speech Playback Speed": "Beszéd lejátszási sebesség",
|
||||
"Speech recognition error: {{error}}": "Beszédfelismerési hiba: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Sumber",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "Kesalahan pengenalan suara: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Cláraigh le {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Ag síniú isteach ar {{WEBUI_NAME}}",
|
||||
"sk-1234": "sk-1234",
|
||||
"Sort by": "",
|
||||
"Source": "Foinse",
|
||||
"Speech Playback Speed": "Luas Athsheinm Urlabhra",
|
||||
"Speech recognition error: {{error}}": "Earráid aitheantais cainte: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Fonte",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "Errore di riconoscimento vocale: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "ソース",
|
||||
"Speech Playback Speed": "音声の再生速度",
|
||||
"Speech recognition error: {{error}}": "音声認識エラー: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "წყარო",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "საუბრის ამოცნობის შეცდომა: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "{{WEBUI_NAME}}로 가입",
|
||||
"Signing in to {{WEBUI_NAME}}": "{{WEBUI_NAME}}로 가입중",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "출처",
|
||||
"Speech Playback Speed": "음성 재생 속도",
|
||||
"Speech recognition error: {{error}}": "음성 인식 오류: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Šaltinis",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "Balso atpažinimo problema: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Sumber",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "Ralat pengecaman pertuturan: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Registrer deg for {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Logger på {{WEBUI_NAME}}",
|
||||
"sk-1234": "sk-1234",
|
||||
"Sort by": "",
|
||||
"Source": "Kilde",
|
||||
"Speech Playback Speed": "Hastighet på avspilling av tale",
|
||||
"Speech recognition error: {{error}}": "Feil ved talegjenkjenning: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Meld je aan bij {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Aan het inloggen bij {{WEBUI_NAME}}",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Bron",
|
||||
"Speech Playback Speed": "Afspeelsnelheid spraak",
|
||||
"Speech recognition error: {{error}}": "Spraakherkenning fout: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "ਸਰੋਤ",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "ਬੋਲ ਪਛਾਣ ਗਲਤੀ: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Zarejestruj się w {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Logowanie do {{WEBUI_NAME}}",
|
||||
"sk-1234": "sk-1234",
|
||||
"Sort by": "",
|
||||
"Source": "Źródło",
|
||||
"Speech Playback Speed": "Prędkość odtwarzania mowy",
|
||||
"Speech recognition error: {{error}}": "Błąd rozpoznawania mowy: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Inscreva-se em {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Fazendo login em {{WEBUI_NAME}}",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Fonte",
|
||||
"Speech Playback Speed": "Velocidade de reprodução de fala",
|
||||
"Speech recognition error: {{error}}": "Erro de reconhecimento de fala: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Fonte",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "Erro de reconhecimento de fala: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Înregistrează-te la {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Autentificare în {{WEBUI_NAME}}",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Sursă",
|
||||
"Speech Playback Speed": "Viteza de redare a vorbirii",
|
||||
"Speech recognition error: {{error}}": "Eroare de recunoaștere vocală: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Войти в {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Зарегистрироваться в {{WEBUI_NAME}}",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Источник",
|
||||
"Speech Playback Speed": "Скорость воспроизведения речи",
|
||||
"Speech recognition error: {{error}}": "Ошибка распознавания речи: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Zaregistrujte sa na {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Prihlasovanie do {{WEBUI_NAME}}",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Zdroj",
|
||||
"Speech Playback Speed": "Rýchlosť prehrávania reči",
|
||||
"Speech recognition error: {{error}}": "Chyba rozpoznávania reči: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Извор",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "Грешка у препознавању говора: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Källa",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "Fel vid taligenkänning: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "แหล่งที่มา",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "ข้อผิดพลาดในการรู้จำเสียง: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "{{WEBUI_NAME}}'e kaydol",
|
||||
"Signing in to {{WEBUI_NAME}}": "{{WEBUI_NAME}}'e giriş yapılıyor",
|
||||
"sk-1234": "sk-1234",
|
||||
"Sort by": "",
|
||||
"Source": "Kaynak",
|
||||
"Speech Playback Speed": "Konuşma Oynatma Hızı",
|
||||
"Speech recognition error: {{error}}": "Konuşma tanıma hatası: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "Зареєструватися в {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "Увійти в {{WEBUI_NAME}}",
|
||||
"sk-1234": "sk-1234",
|
||||
"Sort by": "",
|
||||
"Source": "Джерело",
|
||||
"Speech Playback Speed": "Швидкість відтворення мовлення",
|
||||
"Speech recognition error: {{error}}": "Помилка розпізнавання мови: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "{{WEBUI_NAME}} میں سائن اپ کریں",
|
||||
"Signing in to {{WEBUI_NAME}}": "{{WEBUI_NAME}} میں سائن اِن کر رہے ہیں",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "ماخذ",
|
||||
"Speech Playback Speed": "تقریر پلے بیک کی رفتار",
|
||||
"Speech recognition error: {{error}}": "تقریر کی پہچان کی خرابی: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "",
|
||||
"Signing in to {{WEBUI_NAME}}": "",
|
||||
"sk-1234": "",
|
||||
"Sort by": "",
|
||||
"Source": "Nguồn",
|
||||
"Speech Playback Speed": "",
|
||||
"Speech recognition error: {{error}}": "Lỗi nhận dạng giọng nói: {{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "注册 {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "正在登录 {{WEBUI_NAME}}",
|
||||
"sk-1234": "sk-1234",
|
||||
"Sort by": "",
|
||||
"Source": "来源",
|
||||
"Speech Playback Speed": "语音播放速度",
|
||||
"Speech recognition error: {{error}}": "语音识别错误:{{error}}",
|
||||
|
@ -981,6 +981,7 @@
|
||||
"Sign up to {{WEBUI_NAME}}": "註冊 {{WEBUI_NAME}}",
|
||||
"Signing in to {{WEBUI_NAME}}": "正在登入 {{WEBUI_NAME}}",
|
||||
"sk-1234": "sk-1234",
|
||||
"Sort by": "",
|
||||
"Source": "來源",
|
||||
"Speech Playback Speed": "語音播放速度",
|
||||
"Speech recognition error: {{error}}": "語音辨識錯誤:{{error}}",
|
||||
|
Loading…
Reference in New Issue
Block a user