This commit is contained in:
hurxxxx 2025-03-31 11:07:10 +02:00 committed by GitHub
commit 100d2c9f10
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
54 changed files with 275 additions and 18 deletions

View 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>

View File

@ -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"

View File

@ -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(

View File

@ -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"

View File

@ -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" />

View File

@ -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}} خطأ في التعرف على الكلام",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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",

View File

@ -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}}",

View File

@ -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}}": "",

View File

@ -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}}": "",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}": "",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",

View File

@ -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}}",