From 914ac6849429fa9a841a793975ef3f16112f5c49 Mon Sep 17 00:00:00 2001 From: cc1234475 Date: Sat, 22 Aug 2026 10:04:38 +0100 Subject: [PATCH 1/2] Add Visage v2.7.0 - facial recognition plugin --- plugins/visage/visage.css | 43 ++++ plugins/visage/visage.js | 491 +++++++++++++++++++++++++++++++++++++- plugins/visage/visage.yml | 2 +- 3 files changed, 534 insertions(+), 2 deletions(-) diff --git a/plugins/visage/visage.css b/plugins/visage/visage.css index d63d7851..eb6f03eb 100644 --- a/plugins/visage/visage.css +++ b/plugins/visage/visage.css @@ -2420,6 +2420,49 @@ background: rgba(0, 0, 0, 0.12); } +.visage-backend-settings-sync { + border-top: 1px solid var(--v-border); + padding-top: 1rem; +} + +.visage-sync-info { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.visage-sync-last { + font-size: 0.72rem; + color: var(--v-text-2); +} + +.visage-sync-count { + font-size: 0.72rem; + color: var(--v-text-3); +} + +.visage-sync-actions { + display: flex; + align-items: center; + gap: 0.6rem; + margin-top: 0.5rem; +} + +.visage-sync-note { + font-size: 0.7rem; + color: var(--v-good); +} + +.visage-sync-error { + font-size: 0.7rem; + color: var(--v-uncertain); +} + +.visage-syncing { + opacity: 0.7; + cursor: wait; +} + @media (max-width: 768px) { .visage-modal { diff --git a/plugins/visage/visage.js b/plugins/visage/visage.js index 96926b12..5412a552 100644 --- a/plugins/visage/visage.js +++ b/plugins/visage/visage.js @@ -8123,6 +8123,26 @@ return true; return false; } + async function getStashStatus(endpoint = getApiEndpoint()) { + try { + const res = await fetch(`${endpoint}/api/stash/status`, { method: 'GET' }); + if (!res.ok) + return null; + return (await res.json()); + } + catch (_a) { + return null; + } + } + async function triggerStashSync(endpoint = getApiEndpoint()) { + const res = await fetch(`${endpoint}/api/stash/sync`, { method: 'POST' }); + if (res.status === 409) + throw new Error('already_running'); + if (!res.ok) + throw new Error(`Sync failed: ${res.status}`); + const data = await res.json(); + return data.event_id; + } function dataUrlToBlob(dataUrl) { const arr = dataUrl.split(','); const mime = arr[0].match(/:(.*?);/)[1]; @@ -8909,6 +8929,16 @@ 'backendSettings.feedback.reachable': 'Connection successful. Backend is ready.', 'backendSettings.feedback.degraded': 'Backend reachable but degraded (models or index not loaded).', 'backendSettings.feedback.unreachable': 'Backend unreachable. Check the URL and that the backend is running.', + 'backendSettings.sync.title': 'Stash Sync', + 'backendSettings.sync.lastSynced': 'Last synced: {time}', + 'backendSettings.sync.neverSynced': 'Never synced', + 'backendSettings.sync.performers': '{count} performers in index', + 'backendSettings.sync.button': 'Sync', + 'backendSettings.sync.syncing': 'Syncing…', + 'backendSettings.sync.done': 'Done', + 'backendSettings.sync.alreadyRunning': 'Sync already in progress', + 'backendSettings.sync.error': 'Sync failed', + 'backendSettings.sync.connectionLost': 'Connection lost', // ---- FaceMatchModal.tsx ---- 'faceMatch.title': 'CURRENT FRAME', 'faceMatch.close': 'Close', @@ -9979,6 +10009,9 @@ return current || LOCAL_DEFAULT; }); const [testStatus, setTestStatus] = useState$3(null); + const [stashStatus, setStashStatus] = useState$3(null); + const [syncStatus, setSyncStatus] = useState$3('idle'); + const [syncError, setSyncError] = useState$3(''); useEffect$4(() => { function onKey(e) { if (e.key === 'Escape') { @@ -9990,6 +10023,34 @@ document.addEventListener('keydown', onKey, true); return () => document.removeEventListener('keydown', onKey, true); }, [onClose]); + useEffect$4(() => { + if (mode !== 'local') { + setStashStatus(null); + return; + } + let cancelled = false; + const timer = setTimeout(() => { + getStashStatus(url.trim()).then((status) => { + if (cancelled) + return; + if (status && status.stash_url) { + setStashStatus({ + configured: true, + lastSyncAt: status.last_sync_at, + performerCount: status.performer_count, + linkedCount: status.linked_count, + }); + } + else { + setStashStatus({ configured: false, lastSyncAt: null, performerCount: 0, linkedCount: 0 }); + } + }).catch(() => { + if (!cancelled) + setStashStatus(null); + }); + }, 300); + return () => { cancelled = true; clearTimeout(timer); }; + }, [mode, url]); function selectMode(next) { setMode(next); if (next === 'cloud') { @@ -10031,6 +10092,50 @@ setApiEndpoint(url.trim()); onClose(); } + async function handleSync() { + setSyncStatus('syncing'); + setSyncError(''); + try { + const eventId = await triggerStashSync(url.trim()); + const sseUrl = `${url.trim()}/api/stash/sync/${eventId}`; + const evtSource = new EventSource(sseUrl); + evtSource.addEventListener('complete', () => { + evtSource.close(); + setSyncStatus('done'); + // Re-fetch status to update counts + getStashStatus(url.trim()).then((s) => { + if (s && s.stash_url) { + setStashStatus({ configured: true, lastSyncAt: s.last_sync_at, performerCount: s.performer_count, linkedCount: s.linked_count }); + } + }); + setTimeout(() => setSyncStatus('idle'), 2000); + }); + evtSource.addEventListener('error', (e) => { + evtSource.close(); + let data = null; + try { + data = e.data ? JSON.parse(e.data) : null; + } + catch ( /* ignore */_a) { /* ignore */ } + setSyncStatus('error'); + setSyncError((data === null || data === void 0 ? void 0 : data.error) || t('backendSettings.sync.error')); + }); + evtSource.onerror = () => { + evtSource.close(); + setSyncStatus('error'); + setSyncError(t('backendSettings.sync.connectionLost')); + }; + } + catch (err) { + if (err.message === 'already_running') { + setSyncStatus('already_running'); + } + else { + setSyncStatus('error'); + setSyncError(err.message || t('backendSettings.sync.error')); + } + } + } const statusText = testStatus === 'testing' ? t('backendSettings.testing') : (testStatus ? t(TEST_FEEDBACK[testStatus]) : ''); @@ -10067,7 +10172,17 @@ : React$9.createElement('div', { className: 'visage-backend-settings-cloud-url' }, url)), showNonLocalhostWarn && React$9.createElement('div', { className: 'visage-backend-settings-warn' }, t('backendSettings.csp1'), React$9.createElement('code', null, 'http://localhost:7860'), t('backendSettings.csp2'), React$9.createElement('code', null, 'connect-src'), t('backendSettings.csp3'), React$9.createElement('code', null, 'visage.yml'), t('backendSettings.csp4'), React$9.createElement('code', null, 'visage.yml'), t('backendSettings.csp5')), React$9.createElement('div', { className: `visage-backend-settings-status${testStatus ? ` visage-backend-${testStatus}` : ''}`, role: 'status', - }, statusText)), React$9.createElement('div', { className: 'visage-backend-settings-actions' }, React$9.createElement('button', { + }, statusText), (stashStatus === null || stashStatus === void 0 ? void 0 : stashStatus.configured) && React$9.createElement('div', { className: 'visage-backend-settings-sync' }, React$9.createElement('div', { className: 'visage-backend-settings-field' }, React$9.createElement('span', { className: 'visage-backend-settings-label' }, t('backendSettings.sync.title')), React$9.createElement('div', { className: 'visage-sync-info' }, React$9.createElement('div', { className: 'visage-sync-last' }, stashStatus.lastSyncAt + ? t('backendSettings.sync.lastSynced', { time: new Date(stashStatus.lastSyncAt).toLocaleString() }) + : t('backendSettings.sync.neverSynced')), React$9.createElement('div', { className: 'visage-sync-count' }, t('backendSettings.sync.performers', { count: String(stashStatus.performerCount) }))), React$9.createElement('div', { className: 'visage-sync-actions' }, React$9.createElement('button', { + className: `visage-btn visage-btn-secondary${syncStatus === 'syncing' ? ' visage-syncing' : ''}`, + onClick: handleSync, + disabled: syncStatus === 'syncing', + }, syncStatus === 'syncing' + ? t('backendSettings.sync.syncing') + : syncStatus === 'done' + ? t('backendSettings.sync.done') + : t('backendSettings.sync.button')), syncStatus === 'already_running' && React$9.createElement('span', { className: 'visage-sync-note' }, t('backendSettings.sync.alreadyRunning')), syncStatus === 'error' && React$9.createElement('span', { className: 'visage-sync-error' }, syncError))))), React$9.createElement('div', { className: 'visage-backend-settings-actions' }, React$9.createElement('button', { className: 'visage-btn visage-btn-secondary', onClick: handleTest, disabled: testStatus === 'testing', @@ -11135,6 +11250,17 @@ 'backendSettings.feedback.reachable': `Verbinding geslaagd. De backend is klaar.`, 'backendSettings.feedback.degraded': `Backend bereikbaar maar gedegradeerd (modellen of index niet geladen).`, 'backendSettings.feedback.unreachable': `Backend niet bereikbaar. Controleer de URL en of de backend actief is.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, // ---- FaceMatchModal.tsx ---- 'faceMatch.title': `HUIDIG FRAME`, 'faceMatch.close': `Sluiten`, @@ -11282,6 +11408,17 @@ 'backendSettings.feedback.reachable': `החיבור הצליח. צד-השרת מוכן.`, 'backendSettings.feedback.degraded': `צד-השרת נגיש אך מוגבל (המודלים או המדד אינם נטענים).`, 'backendSettings.feedback.unreachable': `צד-השרת אינו נגיש. בדוק את ה-URL וודא שצד-השרת פועל.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `הפריים הנוכחי`, 'faceMatch.close': `סגירה`, 'faceMatch.facesSelected': `נמצאו {faces} פנים · נבחרו {selected}`, @@ -11418,6 +11555,17 @@ 'backendSettings.feedback.reachable': `Ryšys sėkmingas. Pamatinė sistema paruošta.`, 'backendSettings.feedback.degraded': `Pamatinė sistema pasiekiama, bet sumažintu režimu (modeliai arba indeksas neįkelti).`, 'backendSettings.feedback.unreachable': `Pamatinė sistema nepasiekiama. Patikrinkite URL ir įsitikinkite, kad sistema veikia.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `DABARTINIS KADRAS`, 'faceMatch.close': `Uždaryti`, 'faceMatch.facesSelected': `Rasta veidų: {faces} · pasirinkta: {selected}`, @@ -11556,6 +11704,17 @@ 'backendSettings.feedback.reachable': `Conexión exitosa. El backend está listo.`, 'backendSettings.feedback.degraded': `Backend accesible pero degradado (modelos o índice no cargados).`, 'backendSettings.feedback.unreachable': `Backend inaccesible. Comprueba la URL y que el backend esté en ejecución.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, // ---- FaceMatchModal.tsx ---- 'faceMatch.title': `FOTO ACTUAL`, 'faceMatch.close': `Cerrar`, @@ -11703,6 +11862,17 @@ 'backendSettings.feedback.reachable': `تم الاتصال بنجاح. الواجهة الخلفية جاهزة.`, 'backendSettings.feedback.degraded': `الواجهة الخلفية قابلة للوصول لكنها متدهورة (النماذج أو الفهرس غير محمّل).`, 'backendSettings.feedback.unreachable': `الواجهة الخلفية غير قابلة للوصول. تحقق من URL وتأكد من أن الواجهة الخلفية تعمل.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `الإطار الحالي`, 'faceMatch.close': `إغلاق`, 'faceMatch.facesSelected': `تم العثور على {faces} وجهًا · تم اختيار {selected}`, @@ -11841,6 +12011,17 @@ 'backendSettings.feedback.reachable': `Connexion réussie. Le backend est prêt.`, 'backendSettings.feedback.degraded': `Backend joignable mais dégradé (modèles ou index non chargés).`, 'backendSettings.feedback.unreachable': `Backend injoignable. Vérifiez l'URL et que le backend est en cours d'exécution.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, // ---- FaceMatchModal.tsx ---- 'faceMatch.title': `IMAGE ACTUELLE`, 'faceMatch.close': `Fermer`, @@ -11989,6 +12170,17 @@ 'backendSettings.feedback.reachable': `Tilkopling vellukka. Backend er klar.`, 'backendSettings.feedback.degraded': `Backend er tilgjengeleg, men redusert (modellar eller indeks er ikkje lasta inn).`, 'backendSettings.feedback.unreachable': `Backend er utilgjengeleg. Sjekk URL-en og at backend køyrer.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `GJELDANDE RAME`, 'faceMatch.close': `Lukk`, 'faceMatch.facesSelected': `{faces} andlet funne · {selected} valt`, @@ -12125,6 +12317,17 @@ 'backendSettings.feedback.reachable': `연결에 성공했습니다. 백엔드가 준비되었습니다.`, 'backendSettings.feedback.degraded': `백엔드에 연결할 수 있지만 성능이 저하되었습니다(모델 또는 인덱스가 로드되지 않음).`, 'backendSettings.feedback.unreachable': `백엔드에 연결할 수 없습니다. URL을 확인하고 백엔드가 실행 중인지 확인하세요.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `현재 프레임`, 'faceMatch.close': `닫기`, 'faceMatch.facesSelected': `얼굴 {faces}개 발견 · {selected}개 선택됨`, @@ -12261,6 +12464,17 @@ 'backendSettings.feedback.reachable': `连接成功。后端已就绪。`, 'backendSettings.feedback.degraded': `后端可访问但已降级(模型或索引未加载)。`, 'backendSettings.feedback.unreachable': `后端不可访问。请检查 URL 并确认后端正在运行。`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `当前帧`, 'faceMatch.close': `关闭`, 'faceMatch.facesSelected': `发现 {faces} 张人脸 · 已选择 {selected}`, @@ -12397,6 +12611,17 @@ 'backendSettings.feedback.reachable': `Връзката е успешна. Бекендът е готов.`, 'backendSettings.feedback.degraded': `Бекендът е достъпен, но деградиран (моделите или индексът не са заредени).`, 'backendSettings.feedback.unreachable': `Бекендът е недостъпен. Проверете URL адреса и се уверете, че бекендът работи.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `ТЕКУЩ КАДЪР`, 'faceMatch.close': `Затваряне`, 'faceMatch.facesSelected': `Намерени лица: {faces} · избрани: {selected}`, @@ -12533,6 +12758,17 @@ 'backendSettings.feedback.reachable': `Подключение успешно. Бэкенд готов.`, 'backendSettings.feedback.degraded': `Бэкенд доступен, но работает с ограничениями (модели или индекс не загружены).`, 'backendSettings.feedback.unreachable': `Бэкенд недоступен. Проверьте URL и убедитесь, что бэкенд запущен.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `ТЕКУЩИЙ КАДР`, 'faceMatch.close': `Закрыть`, 'faceMatch.facesSelected': `Найдено лиц: {faces} · выбрано: {selected}`, @@ -12669,6 +12905,17 @@ 'backendSettings.feedback.reachable': `Koneksi berhasil. Backend siap.`, 'backendSettings.feedback.degraded': `Backend terjangkau tetapi menurun (model atau indeks tidak dimuat).`, 'backendSettings.feedback.unreachable': `Backend tidak terjangkau. Periksa URL dan pastikan backend berjalan.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `BINGKAI SAAT INI`, 'faceMatch.close': `Tutup`, 'faceMatch.facesSelected': `{faces} wajah ditemukan · {selected} dipilih`, @@ -12805,6 +13052,17 @@ 'backendSettings.feedback.reachable': `Připojení úspěšné. Backend je připraven.`, 'backendSettings.feedback.degraded': `Backend dosažitelný, ale degradovaný (modely nebo index nejsou načteny).`, 'backendSettings.feedback.unreachable': `Backend je nedosažitelný. Zkontrolujte URL a ujistěte se, že backend běží.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `AKTUÁLNÍ SNÍMEK`, 'faceMatch.close': `Zavřít`, 'faceMatch.facesSelected': `Nalezeno tváří: {faces} · vybráno: {selected}`, @@ -12941,6 +13199,17 @@ 'backendSettings.feedback.reachable': `Veza uspješna. Pozadinski poslužitelj je spreman.`, 'backendSettings.feedback.degraded': `Pozadinski poslužitelj je dostupan, ali smanjenih performansi (modeli ili indeks nisu učitani).`, 'backendSettings.feedback.unreachable': `Pozadinski poslužitelj je nedostupan. Provjerite URL i uvjerite se da poslužitelj radi.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `TRENUTNI OKVIR`, 'faceMatch.close': `Zatvori`, 'faceMatch.facesSelected': `Pronađena lica: {faces} · odabrano: {selected}`, @@ -13077,6 +13346,17 @@ 'backendSettings.feedback.reachable': `เชื่อมต่อสำเร็จ แบ็กเอนด์พร้อมใช้งานแล้ว`, 'backendSettings.feedback.degraded': `เข้าถึงแบ็กเอนด์ได้แต่ประสิทธิภาพลดลง (โมเดลหรือดัชนียังไม่โหลด)`, 'backendSettings.feedback.unreachable': `ไม่สามารถเข้าถึงแบ็กเอนด์ได้ ตรวจสอบ URL และยืนยันว่าแบ็กเอนด์กำลังทำงาน`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `เฟรมปัจจุบัน`, 'faceMatch.close': `ปิด`, 'faceMatch.facesSelected': `พบใบหน้า {faces} ใบ · เลือกแล้ว {selected}`, @@ -13215,6 +13495,17 @@ 'backendSettings.feedback.reachable': `Conexão bem-sucedida. O backend está pronto.`, 'backendSettings.feedback.degraded': `Backend acessível, mas degradado (modelos ou índice não carregados).`, 'backendSettings.feedback.unreachable': `Backend inacessível. Verifique a URL e se o backend está em execução.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, // ---- FaceMatchModal.tsx ---- 'faceMatch.title': `QUADRO ATUAL`, 'faceMatch.close': `Fechar`, @@ -13363,6 +13654,17 @@ 'backendSettings.feedback.reachable': `Forbindelsen lykkedes. Backend er klar.`, 'backendSettings.feedback.degraded': `Backend er tilgængelig, men forringet (modeller eller indeks er ikke indlæst).`, 'backendSettings.feedback.unreachable': `Backend er utilgængelig. Tjek URL'en, og at backend kører.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `AKTUELLE RAMME`, 'faceMatch.close': `Luk`, 'faceMatch.facesSelected': `{faces} ansigter fundet · {selected} valgt`, @@ -13500,6 +13802,17 @@ 'backendSettings.feedback.reachable': `A kapcsolat sikeres. A backend készen áll.`, 'backendSettings.feedback.degraded': `A backend elérhető, de korlátozott (a modellek vagy az index nincs betöltve).`, 'backendSettings.feedback.unreachable': `A backend nem érhető el. Ellenőrizd az URL-t, és hogy a backend fut-e.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `AKTUÁLIS KERET`, 'faceMatch.close': `Bezárás`, 'faceMatch.facesSelected': `{faces} arc található · {selected} kiválasztva`, @@ -13636,6 +13949,17 @@ 'backendSettings.feedback.reachable': `Підключення успішне. Бекенд готовий.`, 'backendSettings.feedback.degraded': `Бекенд доступний, але працює з обмеженнями (моделі або індекс не завантажені).`, 'backendSettings.feedback.unreachable': `Бекенд недоступний. Перевірте URL і переконайтеся, що бекенд запущено.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `ПОТОЧНИЙ КАДР`, 'faceMatch.close': `Закрити`, 'faceMatch.facesSelected': `Знайдено облич: {faces} · вибрано: {selected}`, @@ -13774,6 +14098,17 @@ 'backendSettings.feedback.reachable': `Verbindung erfolgreich. Das Backend ist bereit.`, 'backendSettings.feedback.degraded': `Backend erreichbar, aber eingeschränkt (Modelle oder Index nicht geladen).`, 'backendSettings.feedback.unreachable': `Backend nicht erreichbar. Prüfe die URL und ob das Backend läuft.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, // ---- FaceMatchModal.tsx ---- 'faceMatch.title': `AKTUELLES BILD`, 'faceMatch.close': `Schließen`, @@ -13922,6 +14257,17 @@ 'backendSettings.feedback.reachable': `Yhteys onnistui. Backend on valmis.`, 'backendSettings.feedback.degraded': `Backend on tavoitettavissa mutta heikentynyt (mallit tai indeksi ei ole ladattu).`, 'backendSettings.feedback.unreachable': `Backend ei ole tavoitettavissa. Tarkista URL ja että backend on käynnissä.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `NYKYINEN RUUTU`, 'faceMatch.close': `Sulje`, 'faceMatch.facesSelected': `{faces} kasvoa löydetty · {selected} valittu`, @@ -14058,6 +14404,17 @@ 'backendSettings.feedback.reachable': `Savienojums izdevies. Pamata pakalpojums ir gatavs.`, 'backendSettings.feedback.degraded': `Pamata pakalpojums sasniedzams, bet samazinātā režīmā (modeļi vai indekss nav ielādēti).`, 'backendSettings.feedback.unreachable': `Pamata pakalpojums nesasniedzams. Pārbaudiet URL un pārliecinieties, ka pakalpojums darbojas.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `PAŠREIZĒJAIS KADRĪTIS`, 'faceMatch.close': `Aizvērt`, 'faceMatch.facesSelected': `Atrastas sejas: {faces} · atlasītas: {selected}`, @@ -14194,6 +14551,17 @@ 'backendSettings.feedback.reachable': `Kết nối thành công. Backend đã sẵn sàng.`, 'backendSettings.feedback.degraded': `Backend truy cập được nhưng bị suy giảm (mô hình hoặc chỉ mục chưa được tải).`, 'backendSettings.feedback.unreachable': `Không thể truy cập backend. Kiểm tra URL và đảm bảo backend đang chạy.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `KHUNG HÌNH HIỆN TẠI`, 'faceMatch.close': `Đóng`, 'faceMatch.facesSelected': `Tìm thấy {faces} khuôn mặt · đã chọn {selected}`, @@ -14331,6 +14699,17 @@ 'backendSettings.feedback.reachable': `Ühendus õnnestus. Backend on valmis.`, 'backendSettings.feedback.degraded': `Backend on kättesaadav, kuid halvendatud (mudelid või indeks pole laaditud).`, 'backendSettings.feedback.unreachable': `Backend ei ole kättesaadav. Kontrolli URL-i ja et backend töötab.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `PRAEGUNE KAADER`, 'faceMatch.close': `Sule`, 'faceMatch.facesSelected': `Leitud {faces} nägu · valitud {selected}`, @@ -14468,6 +14847,17 @@ 'backendSettings.feedback.reachable': `Tilkobling vellykket. Backend er klar.`, 'backendSettings.feedback.degraded': `Backend er tilgjengelig, men redusert (modeller eller indeks er ikke lastet inn).`, 'backendSettings.feedback.unreachable': `Backend er utilgjengelig. Sjekk URL-en og at backend kjører.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `GJELDENDE RAMME`, 'faceMatch.close': `Lukk`, 'faceMatch.facesSelected': `{faces} ansikter funnet · {selected} valgt`, @@ -14605,6 +14995,17 @@ 'backendSettings.feedback.reachable': `Bağlantı başarılı. Backend hazır.`, 'backendSettings.feedback.degraded': `Backend erişilebilir ancak düşük performanslı (modeller veya dizin yüklenmemiş).`, 'backendSettings.feedback.unreachable': `Backend\u2019e ulaşılamıyor. URL'yi ve backend\u2019in çalıştığını kontrol edin.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `MEVCUT KARE`, 'faceMatch.close': `Kapat`, 'faceMatch.facesSelected': `{faces} yüz bulundu · {selected} seçildi`, @@ -14741,6 +15142,17 @@ 'backendSettings.feedback.reachable': `連線成功。後端已就緒。`, 'backendSettings.feedback.degraded': `後端可連線但已降級(模型或索引未載入)。`, 'backendSettings.feedback.unreachable': `後端無法連線。請檢查 URL 並確認後端正在執行。`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `目前影格`, 'faceMatch.close': `關閉`, 'faceMatch.facesSelected': `找到 {faces} 張臉 · 已選擇 {selected}`, @@ -14878,6 +15290,17 @@ 'backendSettings.feedback.reachable': `Conexiune reușită. Backend-ul este pregătit.`, 'backendSettings.feedback.degraded': `Backend-ul este accesibil, dar degradat (modelele sau indexul nu sunt încărcate).`, 'backendSettings.feedback.unreachable': `Backend-ul este inaccesibil. Verifică URL-ul și că backend-ul rulează.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `CADRUL CURENT`, 'faceMatch.close': `Închide`, 'faceMatch.facesSelected': `{faces} fețe găsite · {selected} selectate`, @@ -15014,6 +15437,17 @@ 'backendSettings.feedback.reachable': `Pripojenie úspešné. Backend je pripravený.`, 'backendSettings.feedback.degraded': `Backend dosiahnuteľný, ale degradovaný (modely alebo index nie sú načítané).`, 'backendSettings.feedback.unreachable': `Backend je nedosiahnuteľný. Skontrolujte URL a uistite sa, že backend beží.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `AKTUÁLNY SNÍMOK`, 'faceMatch.close': `Zavrieť`, 'faceMatch.facesSelected': `Nájdených tvárí: {faces} · vybratých: {selected}`, @@ -15150,6 +15584,17 @@ 'backendSettings.feedback.reachable': `Połączenie udane. Backend jest gotowy.`, 'backendSettings.feedback.degraded': `Backend osiągalny, ale zdegradowany (modele lub indeks nie zostały załadowane).`, 'backendSettings.feedback.unreachable': `Backend nieosiągalny. Sprawdź URL i upewnij się, że backend działa.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `AKTUALNA KLATKA`, 'faceMatch.close': `Zamknij`, 'faceMatch.facesSelected': `Znaleziono twarzy: {faces} · wybrano: {selected}`, @@ -15287,6 +15732,17 @@ 'backendSettings.feedback.reachable': `Η σύνδεση ήταν επιτυχής. Το backend είναι έτοιμο.`, 'backendSettings.feedback.degraded': `Το backend είναι προσβάσιμο αλλά υποβαθμισμένο (τα μοντέλα ή το ευρετήριο δεν έχουν φορτωθεί).`, 'backendSettings.feedback.unreachable': `Το backend δεν είναι προσβάσιμο. Ελέγξτε το URL και ότι το backend εκτελείται.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `ΤΡΕΧΟΝ ΚΑΡΕ`, 'faceMatch.close': `Κλείσιμο`, 'faceMatch.facesSelected': `{faces} πρόσωπα βρέθηκαν · {selected} επιλέχθηκαν`, @@ -15423,6 +15879,17 @@ 'backendSettings.feedback.reachable': `接続に成功しました。バックエンドは利用可能です。`, 'backendSettings.feedback.degraded': `バックエンドには接続できますが、機能が制限されています(モデルまたはインデックスが読み込まれていません)。`, 'backendSettings.feedback.unreachable': `バックエンドに接続できません。URL を確認し、バックエンドが実行中であることを確認してください。`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `現在のフレーム`, 'faceMatch.close': `閉じる`, 'faceMatch.facesSelected': `{faces} 個の顔を検出 · {selected} 個を選択`, @@ -15560,6 +16027,17 @@ 'backendSettings.feedback.reachable': `Anslutningen lyckades. Backend är redo.`, 'backendSettings.feedback.degraded': `Backend är nåbar men försämrad (modeller eller index är inte inlästa).`, 'backendSettings.feedback.unreachable': `Backend är onåbar. Kontrollera URL:en och att backend körs.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, 'faceMatch.title': `AKTUELL RUTA`, 'faceMatch.close': `Stäng`, 'faceMatch.facesSelected': `{faces} ansikten hittade · {selected} valda`, @@ -15698,6 +16176,17 @@ 'backendSettings.feedback.reachable': `Connessione riuscita. Il backend è pronto.`, 'backendSettings.feedback.degraded': `Backend raggiungibile ma degradato (modelli o indice non caricati).`, 'backendSettings.feedback.unreachable': `Backend non raggiungibile. Controlla l'URL e che il backend sia in esecuzione.`, + // ---- Stash Sync ---- + 'backendSettings.sync.title': `Stash Sync`, + 'backendSettings.sync.lastSynced': `Last synced: {time}`, + 'backendSettings.sync.neverSynced': `Never synced`, + 'backendSettings.sync.performers': `{count} performers in index`, + 'backendSettings.sync.button': `Sync`, + 'backendSettings.sync.syncing': `Syncing\u2026`, + 'backendSettings.sync.done': `Done`, + 'backendSettings.sync.alreadyRunning': `Sync already in progress`, + 'backendSettings.sync.error': `Sync failed`, + 'backendSettings.sync.connectionLost': `Connection lost`, // ---- FaceMatchModal.tsx ---- 'faceMatch.title': `FOTO CORRENTE`, 'faceMatch.close': `Chiudi`, diff --git a/plugins/visage/visage.yml b/plugins/visage/visage.yml index 94e9adb0..db9e6393 100644 --- a/plugins/visage/visage.yml +++ b/plugins/visage/visage.yml @@ -1,6 +1,6 @@ name: Visage description: Use facial recognition to lookup performers from scene sprites -version: 2.6.2 +version: 2.7.0 url: https://discourse.stashapp.cc/t/visage/11785 ui: javascript: From c815ad55101ec4b23fa8004491a20f3b8f6d52a6 Mon Sep 17 00:00:00 2001 From: cc1234475 Date: Sat, 22 Aug 2026 11:10:09 +0100 Subject: [PATCH 2/2] fix: translate sync UI strings to all 34 locales --- plugins/visage/visage.js | 612 +++++++++++++++++++-------------------- 1 file changed, 306 insertions(+), 306 deletions(-) diff --git a/plugins/visage/visage.js b/plugins/visage/visage.js index 5412a552..c35291c5 100644 --- a/plugins/visage/visage.js +++ b/plugins/visage/visage.js @@ -11252,15 +11252,15 @@ 'backendSettings.feedback.unreachable': `Backend niet bereikbaar. Controleer de URL en of de backend actief is.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Laatst gesynchroniseerd: {time}`, + 'backendSettings.sync.neverSynced': `Nooit gesynchroniseerd`, + 'backendSettings.sync.performers': `{count} performers in de index`, + 'backendSettings.sync.button': `Synchroniseren`, + 'backendSettings.sync.syncing': `Synchroniseren\u2026`, + 'backendSettings.sync.done': `Klaar`, + 'backendSettings.sync.alreadyRunning': `Synchronisatie is al bezig`, + 'backendSettings.sync.error': `Synchronisatie mislukt`, + 'backendSettings.sync.connectionLost': `Verbinding verbroken`, // ---- FaceMatchModal.tsx ---- 'faceMatch.title': `HUIDIG FRAME`, 'faceMatch.close': `Sluiten`, @@ -11410,15 +11410,15 @@ 'backendSettings.feedback.unreachable': `צד-השרת אינו נגיש. בדוק את ה-URL וודא שצד-השרת פועל.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `סנכרון אחרון: {time}`, + 'backendSettings.sync.neverSynced': `לא סונכרן מעולם`, + 'backendSettings.sync.performers': `{count} מבצעים באינדקס`, + 'backendSettings.sync.button': `סנכרון`, + 'backendSettings.sync.syncing': `מסנכרן\u2026`, + 'backendSettings.sync.done': `בוצע`, + 'backendSettings.sync.alreadyRunning': `הסנכרון כבר מתבצע`, + 'backendSettings.sync.error': `הסנכרון נכשל`, + 'backendSettings.sync.connectionLost': `החיבור אבד`, 'faceMatch.title': `הפריים הנוכחי`, 'faceMatch.close': `סגירה`, 'faceMatch.facesSelected': `נמצאו {faces} פנים · נבחרו {selected}`, @@ -11557,15 +11557,15 @@ 'backendSettings.feedback.unreachable': `Pamatinė sistema nepasiekiama. Patikrinkite URL ir įsitikinkite, kad sistema veikia.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Paskutinė sinchronizacija: {time}`, + 'backendSettings.sync.neverSynced': `Dar nebuvo sinchronizuota`, + 'backendSettings.sync.performers': `{count} atlikėjų indekse`, + 'backendSettings.sync.button': `Sinchronizuoti`, + 'backendSettings.sync.syncing': `Sinchronizuojama\u2026`, + 'backendSettings.sync.done': `Atlikta`, + 'backendSettings.sync.alreadyRunning': `Sinchronizacija jau vykdoma`, + 'backendSettings.sync.error': `Sinchronizacija nepavyko`, + 'backendSettings.sync.connectionLost': `Prarastas ryšys`, 'faceMatch.title': `DABARTINIS KADRAS`, 'faceMatch.close': `Uždaryti`, 'faceMatch.facesSelected': `Rasta veidų: {faces} · pasirinkta: {selected}`, @@ -11706,15 +11706,15 @@ 'backendSettings.feedback.unreachable': `Backend inaccesible. Comprueba la URL y que el backend esté en ejecución.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Última sincronización: {time}`, + 'backendSettings.sync.neverSynced': `Nunca sincronizado`, + 'backendSettings.sync.performers': `{count} intérpretes en el índice`, + 'backendSettings.sync.button': `Sincronizar`, + 'backendSettings.sync.syncing': `Sincronizando\u2026`, + 'backendSettings.sync.done': `Listo`, + 'backendSettings.sync.alreadyRunning': `Sincronización ya en curso`, + 'backendSettings.sync.error': `Error de sincronización`, + 'backendSettings.sync.connectionLost': `Conexión perdida`, // ---- FaceMatchModal.tsx ---- 'faceMatch.title': `FOTO ACTUAL`, 'faceMatch.close': `Cerrar`, @@ -11864,15 +11864,15 @@ 'backendSettings.feedback.unreachable': `الواجهة الخلفية غير قابلة للوصول. تحقق من URL وتأكد من أن الواجهة الخلفية تعمل.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `آخر مزامنة: {time}`, + 'backendSettings.sync.neverSynced': `لم تتم المزامنة بعد`, + 'backendSettings.sync.performers': `{count} ممثلين في الفهرس`, + 'backendSettings.sync.button': `مزامنة`, + 'backendSettings.sync.syncing': `جارٍ المزامنة\u2026`, + 'backendSettings.sync.done': `تم`, + 'backendSettings.sync.alreadyRunning': `المزامنة جارية بالفعل`, + 'backendSettings.sync.error': `فشلت المزامنة`, + 'backendSettings.sync.connectionLost': `فُقد الاتصال`, 'faceMatch.title': `الإطار الحالي`, 'faceMatch.close': `إغلاق`, 'faceMatch.facesSelected': `تم العثور على {faces} وجهًا · تم اختيار {selected}`, @@ -12013,15 +12013,15 @@ 'backendSettings.feedback.unreachable': `Backend injoignable. Vérifiez l'URL et que le backend est en cours d'exécution.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Dernière synchronisation\u00A0: {time}`, + 'backendSettings.sync.neverSynced': `Jamais synchronisé`, + 'backendSettings.sync.performers': `{count} interprètes dans l'index`, + 'backendSettings.sync.button': `Synchroniser`, + 'backendSettings.sync.syncing': `Synchronisation\u2026`, + 'backendSettings.sync.done': `Terminé`, + 'backendSettings.sync.alreadyRunning': `Synchronisation déjà en cours`, + 'backendSettings.sync.error': `Échec de la synchronisation`, + 'backendSettings.sync.connectionLost': `Connexion perdue`, // ---- FaceMatchModal.tsx ---- 'faceMatch.title': `IMAGE ACTUELLE`, 'faceMatch.close': `Fermer`, @@ -12172,15 +12172,15 @@ 'backendSettings.feedback.unreachable': `Backend er utilgjengeleg. Sjekk URL-en og at backend køyrer.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Sist synkronisert: {time}`, + 'backendSettings.sync.neverSynced': `Aldri synkronisert`, + 'backendSettings.sync.performers': `{count} performarar i indeksen`, + 'backendSettings.sync.button': `Synkroniser`, + 'backendSettings.sync.syncing': `Synkroniserer\u2026`, + 'backendSettings.sync.done': `Ferdig`, + 'backendSettings.sync.alreadyRunning': `Synkroniseringa held allereie på`, + 'backendSettings.sync.error': `Synkronisering mislukkast`, + 'backendSettings.sync.connectionLost': `Tilkopling tapt`, 'faceMatch.title': `GJELDANDE RAME`, 'faceMatch.close': `Lukk`, 'faceMatch.facesSelected': `{faces} andlet funne · {selected} valt`, @@ -12319,15 +12319,15 @@ 'backendSettings.feedback.unreachable': `백엔드에 연결할 수 없습니다. URL을 확인하고 백엔드가 실행 중인지 확인하세요.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `마지막 동기화: {time}`, + 'backendSettings.sync.neverSynced': `동기화된 적 없음`, + 'backendSettings.sync.performers': `인덱스 내 출연자: {count}명`, + 'backendSettings.sync.button': `동기화`, + 'backendSettings.sync.syncing': `동기화 중\u2026`, + 'backendSettings.sync.done': `완료`, + 'backendSettings.sync.alreadyRunning': `동기화가 이미 진행 중입니다`, + 'backendSettings.sync.error': `동기화 실패`, + 'backendSettings.sync.connectionLost': `연결이 끊어졌습니다`, 'faceMatch.title': `현재 프레임`, 'faceMatch.close': `닫기`, 'faceMatch.facesSelected': `얼굴 {faces}개 발견 · {selected}개 선택됨`, @@ -12466,15 +12466,15 @@ 'backendSettings.feedback.unreachable': `后端不可访问。请检查 URL 并确认后端正在运行。`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `上次同步:{time}`, + 'backendSettings.sync.neverSynced': `从未同步`, + 'backendSettings.sync.performers': `索引中有 {count} 位表演者`, + 'backendSettings.sync.button': `同步`, + 'backendSettings.sync.syncing': `同步中\u2026`, + 'backendSettings.sync.done': `完成`, + 'backendSettings.sync.alreadyRunning': `同步已在进行中`, + 'backendSettings.sync.error': `同步失败`, + 'backendSettings.sync.connectionLost': `连接已断开`, 'faceMatch.title': `当前帧`, 'faceMatch.close': `关闭`, 'faceMatch.facesSelected': `发现 {faces} 张人脸 · 已选择 {selected}`, @@ -12613,15 +12613,15 @@ 'backendSettings.feedback.unreachable': `Бекендът е недостъпен. Проверете URL адреса и се уверете, че бекендът работи.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Последна синхронизация: {time}`, + 'backendSettings.sync.neverSynced': `Никога не е синхронизирано`, + 'backendSettings.sync.performers': `{count} изпълнители в индекса`, + 'backendSettings.sync.button': `Синхронизирай`, + 'backendSettings.sync.syncing': `Синхронизиране\u2026`, + 'backendSettings.sync.done': `Готово`, + 'backendSettings.sync.alreadyRunning': `Синхронизацията вече е в ход`, + 'backendSettings.sync.error': `Синхронизацията е неуспешна`, + 'backendSettings.sync.connectionLost': `Връзката е прекъсната`, 'faceMatch.title': `ТЕКУЩ КАДЪР`, 'faceMatch.close': `Затваряне`, 'faceMatch.facesSelected': `Намерени лица: {faces} · избрани: {selected}`, @@ -12760,15 +12760,15 @@ 'backendSettings.feedback.unreachable': `Бэкенд недоступен. Проверьте URL и убедитесь, что бэкенд запущен.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Последняя синхронизация: {time}`, + 'backendSettings.sync.neverSynced': `Никогда не синхронизировалось`, + 'backendSettings.sync.performers': `{count} исполнителей в индексе`, + 'backendSettings.sync.button': `Синхронизировать`, + 'backendSettings.sync.syncing': `Синхронизация\u2026`, + 'backendSettings.sync.done': `Готово`, + 'backendSettings.sync.alreadyRunning': `Синхронизация уже выполняется`, + 'backendSettings.sync.error': `Ошибка синхронизации`, + 'backendSettings.sync.connectionLost': `Соединение потеряно`, 'faceMatch.title': `ТЕКУЩИЙ КАДР`, 'faceMatch.close': `Закрыть`, 'faceMatch.facesSelected': `Найдено лиц: {faces} · выбрано: {selected}`, @@ -12907,15 +12907,15 @@ 'backendSettings.feedback.unreachable': `Backend tidak terjangkau. Periksa URL dan pastikan backend berjalan.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Terakhir disinkronkan: {time}`, + 'backendSettings.sync.neverSynced': `Belum pernah disinkronkan`, + 'backendSettings.sync.performers': `{count} pemain dalam indeks`, + 'backendSettings.sync.button': `Sinkronkan`, + 'backendSettings.sync.syncing': `Menyinkronkan\u2026`, + 'backendSettings.sync.done': `Selesai`, + 'backendSettings.sync.alreadyRunning': `Sinkronisasi sedang berlangsung`, + 'backendSettings.sync.error': `Sinkronisasi gagal`, + 'backendSettings.sync.connectionLost': `Koneksi terputus`, 'faceMatch.title': `BINGKAI SAAT INI`, 'faceMatch.close': `Tutup`, 'faceMatch.facesSelected': `{faces} wajah ditemukan · {selected} dipilih`, @@ -13054,15 +13054,15 @@ 'backendSettings.feedback.unreachable': `Backend je nedosažitelný. Zkontrolujte URL a ujistěte se, že backend běží.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Poslední synchronizace: {time}`, + 'backendSettings.sync.neverSynced': `Nikdy nesynchronizováno`, + 'backendSettings.sync.performers': `{count} performerů v indexu`, + 'backendSettings.sync.button': `Synchronizovat`, + 'backendSettings.sync.syncing': `Synchronizace\u2026`, + 'backendSettings.sync.done': `Hotovo`, + 'backendSettings.sync.alreadyRunning': `Synchronizace již probíhá`, + 'backendSettings.sync.error': `Synchronizace selhala`, + 'backendSettings.sync.connectionLost': `Připojení ztraceno`, 'faceMatch.title': `AKTUÁLNÍ SNÍMEK`, 'faceMatch.close': `Zavřít`, 'faceMatch.facesSelected': `Nalezeno tváří: {faces} · vybráno: {selected}`, @@ -13201,15 +13201,15 @@ 'backendSettings.feedback.unreachable': `Pozadinski poslužitelj je nedostupan. Provjerite URL i uvjerite se da poslužitelj radi.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Zadnja sinkronizacija: {time}`, + 'backendSettings.sync.neverSynced': `Nikada sinkronizirano`, + 'backendSettings.sync.performers': `{count} izvođača u indeksu`, + 'backendSettings.sync.button': `Sinkroniziraj`, + 'backendSettings.sync.syncing': `Sinkronizacija\u2026`, + 'backendSettings.sync.done': `Gotovo`, + 'backendSettings.sync.alreadyRunning': `Sinkronizacija je već u tijeku`, + 'backendSettings.sync.error': `Sinkronizacija nije uspjela`, + 'backendSettings.sync.connectionLost': `Veza je izgubljena`, 'faceMatch.title': `TRENUTNI OKVIR`, 'faceMatch.close': `Zatvori`, 'faceMatch.facesSelected': `Pronađena lica: {faces} · odabrano: {selected}`, @@ -13348,15 +13348,15 @@ 'backendSettings.feedback.unreachable': `ไม่สามารถเข้าถึงแบ็กเอนด์ได้ ตรวจสอบ URL และยืนยันว่าแบ็กเอนด์กำลังทำงาน`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `ซิงค์ล่าสุด: {time}`, + 'backendSettings.sync.neverSynced': `ยังไม่เคยซิงค์`, + 'backendSettings.sync.performers': `{count} นักแสดงในดัชนี`, + 'backendSettings.sync.button': `ซิงค์`, + 'backendSettings.sync.syncing': `กำลังซิงค์\u2026`, + 'backendSettings.sync.done': `เสร็จสิ้น`, + 'backendSettings.sync.alreadyRunning': `กำลังซิงค์อยู่แล้ว`, + 'backendSettings.sync.error': `การซิงค์ล้มเหลว`, + 'backendSettings.sync.connectionLost': `การเชื่อมต่อขาดหาย`, 'faceMatch.title': `เฟรมปัจจุบัน`, 'faceMatch.close': `ปิด`, 'faceMatch.facesSelected': `พบใบหน้า {faces} ใบ · เลือกแล้ว {selected}`, @@ -13497,15 +13497,15 @@ 'backendSettings.feedback.unreachable': `Backend inacessível. Verifique a URL e se o backend está em execução.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Última sincronização: {time}`, + 'backendSettings.sync.neverSynced': `Nunca sincronizado`, + 'backendSettings.sync.performers': `{count} artistas no índice`, + 'backendSettings.sync.button': `Sincronizar`, + 'backendSettings.sync.syncing': `Sincronizando\u2026`, + 'backendSettings.sync.done': `Concluído`, + 'backendSettings.sync.alreadyRunning': `Sincronização já em andamento`, + 'backendSettings.sync.error': `Falha na sincronização`, + 'backendSettings.sync.connectionLost': `Conexão perdida`, // ---- FaceMatchModal.tsx ---- 'faceMatch.title': `QUADRO ATUAL`, 'faceMatch.close': `Fechar`, @@ -13656,15 +13656,15 @@ 'backendSettings.feedback.unreachable': `Backend er utilgængelig. Tjek URL'en, og at backend kører.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Sidst synkroniseret: {time}`, + 'backendSettings.sync.neverSynced': `Aldrig synkroniseret`, + 'backendSettings.sync.performers': `{count} performere i indeks`, + 'backendSettings.sync.button': `Synkroniser`, + 'backendSettings.sync.syncing': `Synkroniserer\u2026`, + 'backendSettings.sync.done': `Færdig`, + 'backendSettings.sync.alreadyRunning': `Synkronisering allerede i gang`, + 'backendSettings.sync.error': `Synkronisering mislykkedes`, + 'backendSettings.sync.connectionLost': `Forbindelsen mistet`, 'faceMatch.title': `AKTUELLE RAMME`, 'faceMatch.close': `Luk`, 'faceMatch.facesSelected': `{faces} ansigter fundet · {selected} valgt`, @@ -13804,15 +13804,15 @@ 'backendSettings.feedback.unreachable': `A backend nem érhető el. Ellenőrizd az URL-t, és hogy a backend fut-e.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Utoljára szinkronizálva: {time}`, + 'backendSettings.sync.neverSynced': `Még nem szinkronizálva`, + 'backendSettings.sync.performers': `{count} előadó az indexben`, + 'backendSettings.sync.button': `Szinkronizálás`, + 'backendSettings.sync.syncing': `Szinkronizálás\u2026`, + 'backendSettings.sync.done': `Kész`, + 'backendSettings.sync.alreadyRunning': `A szinkronizálás már folyamatban van`, + 'backendSettings.sync.error': `Szinkronizálás sikertelen`, + 'backendSettings.sync.connectionLost': `Kapcsolat megszakadt`, 'faceMatch.title': `AKTUÁLIS KERET`, 'faceMatch.close': `Bezárás`, 'faceMatch.facesSelected': `{faces} arc található · {selected} kiválasztva`, @@ -13951,15 +13951,15 @@ 'backendSettings.feedback.unreachable': `Бекенд недоступний. Перевірте URL і переконайтеся, що бекенд запущено.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Останнє синхронізування: {time}`, + 'backendSettings.sync.neverSynced': `Ніколи не синхронізовано`, + 'backendSettings.sync.performers': `{count} виконавців в індексі`, + 'backendSettings.sync.button': `Синхронізувати`, + 'backendSettings.sync.syncing': `Синхронізація\u2026`, + 'backendSettings.sync.done': `Готово`, + 'backendSettings.sync.alreadyRunning': `Синхронізація вже виконується`, + 'backendSettings.sync.error': `Помилка синхронізації`, + 'backendSettings.sync.connectionLost': `З'єднання втрачено`, 'faceMatch.title': `ПОТОЧНИЙ КАДР`, 'faceMatch.close': `Закрити`, 'faceMatch.facesSelected': `Знайдено облич: {faces} · вибрано: {selected}`, @@ -14100,15 +14100,15 @@ 'backendSettings.feedback.unreachable': `Backend nicht erreichbar. Prüfe die URL und ob das Backend läuft.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Zuletzt synchronisiert: {time}`, + 'backendSettings.sync.neverSynced': `Noch nie synchronisiert`, + 'backendSettings.sync.performers': `{count} Performer im Index`, + 'backendSettings.sync.button': `Synchronisieren`, + 'backendSettings.sync.syncing': `Synchronisierung\u2026`, + 'backendSettings.sync.done': `Fertig`, + 'backendSettings.sync.alreadyRunning': `Synchronisierung bereits aktiv`, + 'backendSettings.sync.error': `Synchronisierung fehlgeschlagen`, + 'backendSettings.sync.connectionLost': `Verbindung verloren`, // ---- FaceMatchModal.tsx ---- 'faceMatch.title': `AKTUELLES BILD`, 'faceMatch.close': `Schließen`, @@ -14259,15 +14259,15 @@ 'backendSettings.feedback.unreachable': `Backend ei ole tavoitettavissa. Tarkista URL ja että backend on käynnissä.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Viimeksi synkronoitu: {time}`, + 'backendSettings.sync.neverSynced': `Ei koskaan synkronoitu`, + 'backendSettings.sync.performers': `{count} esiintyjää indeksissä`, + 'backendSettings.sync.button': `Synkronoi`, + 'backendSettings.sync.syncing': `Synkronoidaan\u2026`, + 'backendSettings.sync.done': `Valmis`, + 'backendSettings.sync.alreadyRunning': `Synkronointi käynnissä`, + 'backendSettings.sync.error': `Synkronointi epäonnistui`, + 'backendSettings.sync.connectionLost': `Yhteys katkennut`, 'faceMatch.title': `NYKYINEN RUUTU`, 'faceMatch.close': `Sulje`, 'faceMatch.facesSelected': `{faces} kasvoa löydetty · {selected} valittu`, @@ -14406,15 +14406,15 @@ 'backendSettings.feedback.unreachable': `Pamata pakalpojums nesasniedzams. Pārbaudiet URL un pārliecinieties, ka pakalpojums darbojas.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Pēdējā sinhronizācija: {time}`, + 'backendSettings.sync.neverSynced': `Nekad nav sinhronizēts`, + 'backendSettings.sync.performers': `{count} izpildītāji indeksā`, + 'backendSettings.sync.button': `Sinhronizēt`, + 'backendSettings.sync.syncing': `Sinhronizē\u2026`, + 'backendSettings.sync.done': `Gatavs`, + 'backendSettings.sync.alreadyRunning': `Sinhronizēšana jau notiek`, + 'backendSettings.sync.error': `Sinhronizēšana neizdevās`, + 'backendSettings.sync.connectionLost': `Savienojums zaudēts`, 'faceMatch.title': `PAŠREIZĒJAIS KADRĪTIS`, 'faceMatch.close': `Aizvērt`, 'faceMatch.facesSelected': `Atrastas sejas: {faces} · atlasītas: {selected}`, @@ -14553,15 +14553,15 @@ 'backendSettings.feedback.unreachable': `Không thể truy cập backend. Kiểm tra URL và đảm bảo backend đang chạy.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Lần đồng bộ cuối: {time}`, + 'backendSettings.sync.neverSynced': `Chưa từng đồng bộ`, + 'backendSettings.sync.performers': `{count} diễn viên trong chỉ mục`, + 'backendSettings.sync.button': `Đồng bộ`, + 'backendSettings.sync.syncing': `Đang đồng bộ\u2026`, + 'backendSettings.sync.done': `Xong`, + 'backendSettings.sync.alreadyRunning': `Đồng bộ đang chạy`, + 'backendSettings.sync.error': `Đồng bộ thất bại`, + 'backendSettings.sync.connectionLost': `Mất kết nối`, 'faceMatch.title': `KHUNG HÌNH HIỆN TẠI`, 'faceMatch.close': `Đóng`, 'faceMatch.facesSelected': `Tìm thấy {faces} khuôn mặt · đã chọn {selected}`, @@ -14701,15 +14701,15 @@ 'backendSettings.feedback.unreachable': `Backend ei ole kättesaadav. Kontrolli URL-i ja et backend töötab.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Viimati sünkroonitud: {time}`, + 'backendSettings.sync.neverSynced': `Pole kunagi sünkroonitud`, + 'backendSettings.sync.performers': `{count} esinejat indeksis`, + 'backendSettings.sync.button': `Sünkrooni`, + 'backendSettings.sync.syncing': `Sünkroonimine\u2026`, + 'backendSettings.sync.done': `Valmis`, + 'backendSettings.sync.alreadyRunning': `Sünkroonimine juba käib`, + 'backendSettings.sync.error': `Sünkroonimine ebaõnnestus`, + 'backendSettings.sync.connectionLost': `Ühendus kadus`, 'faceMatch.title': `PRAEGUNE KAADER`, 'faceMatch.close': `Sule`, 'faceMatch.facesSelected': `Leitud {faces} nägu · valitud {selected}`, @@ -14849,15 +14849,15 @@ 'backendSettings.feedback.unreachable': `Backend er utilgjengelig. Sjekk URL-en og at backend kjører.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Sist synkronisert: {time}`, + 'backendSettings.sync.neverSynced': `Aldri synkronisert`, + 'backendSettings.sync.performers': `{count} performere i indeksen`, + 'backendSettings.sync.button': `Synkroniser`, + 'backendSettings.sync.syncing': `Synkroniserer\u2026`, + 'backendSettings.sync.done': `Ferdig`, + 'backendSettings.sync.alreadyRunning': `Synkronisering pågår allerede`, + 'backendSettings.sync.error': `Synkronisering mislyktes`, + 'backendSettings.sync.connectionLost': `Tilkobling tapt`, 'faceMatch.title': `GJELDENDE RAMME`, 'faceMatch.close': `Lukk`, 'faceMatch.facesSelected': `{faces} ansikter funnet · {selected} valgt`, @@ -14997,15 +14997,15 @@ 'backendSettings.feedback.unreachable': `Backend\u2019e ulaşılamıyor. URL'yi ve backend\u2019in çalıştığını kontrol edin.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Son senkronizasyon: {time}`, + 'backendSettings.sync.neverSynced': `Hiç senkronize edilmedi`, + 'backendSettings.sync.performers': `{count} oyuncu dizinde`, + 'backendSettings.sync.button': `Senkronize et`, + 'backendSettings.sync.syncing': `Senkronize ediliyor\u2026`, + 'backendSettings.sync.done': `Bitti`, + 'backendSettings.sync.alreadyRunning': `Senkronizasyon zaten devam ediyor`, + 'backendSettings.sync.error': `Senkronizasyon başarısız`, + 'backendSettings.sync.connectionLost': `Bağlantı kesildi`, 'faceMatch.title': `MEVCUT KARE`, 'faceMatch.close': `Kapat`, 'faceMatch.facesSelected': `{faces} yüz bulundu · {selected} seçildi`, @@ -15144,15 +15144,15 @@ 'backendSettings.feedback.unreachable': `後端無法連線。請檢查 URL 並確認後端正在執行。`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `上次同步:{time}`, + 'backendSettings.sync.neverSynced': `從未同步`, + 'backendSettings.sync.performers': `索引中有 {count} 位表演者`, + 'backendSettings.sync.button': `同步`, + 'backendSettings.sync.syncing': `同步中\u2026`, + 'backendSettings.sync.done': `完成`, + 'backendSettings.sync.alreadyRunning': `同步已在執行中`, + 'backendSettings.sync.error': `同步失敗`, + 'backendSettings.sync.connectionLost': `連線已中斷`, 'faceMatch.title': `目前影格`, 'faceMatch.close': `關閉`, 'faceMatch.facesSelected': `找到 {faces} 張臉 · 已選擇 {selected}`, @@ -15292,15 +15292,15 @@ 'backendSettings.feedback.unreachable': `Backend-ul este inaccesibil. Verifică URL-ul și că backend-ul rulează.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Ultima sincronizare: {time}`, + 'backendSettings.sync.neverSynced': `Nec sincronizat niciodată`, + 'backendSettings.sync.performers': `{count} performeri în index`, + 'backendSettings.sync.button': `Sincronizează`, + 'backendSettings.sync.syncing': `Se sincronizează\u2026`, + 'backendSettings.sync.done': `Gata`, + 'backendSettings.sync.alreadyRunning': `Sincronizare deja în desfășurare`, + 'backendSettings.sync.error': `Sincronizare eșuată`, + 'backendSettings.sync.connectionLost': `Conexiune pierdută`, 'faceMatch.title': `CADRUL CURENT`, 'faceMatch.close': `Închide`, 'faceMatch.facesSelected': `{faces} fețe găsite · {selected} selectate`, @@ -15439,15 +15439,15 @@ 'backendSettings.feedback.unreachable': `Backend je nedosiahnuteľný. Skontrolujte URL a uistite sa, že backend beží.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Posledná synchronizácia: {time}`, + 'backendSettings.sync.neverSynced': `Nikdy nesynchronizované`, + 'backendSettings.sync.performers': `{count} performerov v indexe`, + 'backendSettings.sync.button': `Synchronizovať`, + 'backendSettings.sync.syncing': `Synchronizácia\u2026`, + 'backendSettings.sync.done': `Hotovo`, + 'backendSettings.sync.alreadyRunning': `Synchronizácia už prebieha`, + 'backendSettings.sync.error': `Synchronizácia zlyhala`, + 'backendSettings.sync.connectionLost': `Strata pripojenia`, 'faceMatch.title': `AKTUÁLNY SNÍMOK`, 'faceMatch.close': `Zavrieť`, 'faceMatch.facesSelected': `Nájdených tvárí: {faces} · vybratých: {selected}`, @@ -15586,15 +15586,15 @@ 'backendSettings.feedback.unreachable': `Backend nieosiągalny. Sprawdź URL i upewnij się, że backend działa.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Ostatnia synchronizacja: {time}`, + 'backendSettings.sync.neverSynced': `Nigdy nie synchronizowano`, + 'backendSettings.sync.performers': `{count} wykonawców w indeksie`, + 'backendSettings.sync.button': `Synchronizuj`, + 'backendSettings.sync.syncing': `Synchronizowanie\u2026`, + 'backendSettings.sync.done': `Gotowe`, + 'backendSettings.sync.alreadyRunning': `Synchronizacja już trwa`, + 'backendSettings.sync.error': `Synchronizacja nie powiodła się`, + 'backendSettings.sync.connectionLost': `Utracono połączenie`, 'faceMatch.title': `AKTUALNA KLATKA`, 'faceMatch.close': `Zamknij`, 'faceMatch.facesSelected': `Znaleziono twarzy: {faces} · wybrano: {selected}`, @@ -15734,15 +15734,15 @@ 'backendSettings.feedback.unreachable': `Το backend δεν είναι προσβάσιμο. Ελέγξτε το URL και ότι το backend εκτελείται.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Τελευταίος συγχρονισμός: {time}`, + 'backendSettings.sync.neverSynced': `Δεν έγινε ποτέ συγχρονισμός`, + 'backendSettings.sync.performers': `{count} ερμηνευτές στο ευρετήριο`, + 'backendSettings.sync.button': `Συγχρονισμός`, + 'backendSettings.sync.syncing': `Συγχρονισμός\u2026`, + 'backendSettings.sync.done': `Ολοκληρώθηκε`, + 'backendSettings.sync.alreadyRunning': `Ο συγχρονισμός είναι ήδη σε εξέλιξη`, + 'backendSettings.sync.error': `Ο συγχρονισμός απέτυχε`, + 'backendSettings.sync.connectionLost': `Η σύνδεση χάθηκε`, 'faceMatch.title': `ΤΡΕΧΟΝ ΚΑΡΕ`, 'faceMatch.close': `Κλείσιμο`, 'faceMatch.facesSelected': `{faces} πρόσωπα βρέθηκαν · {selected} επιλέχθηκαν`, @@ -15881,15 +15881,15 @@ 'backendSettings.feedback.unreachable': `バックエンドに接続できません。URL を確認し、バックエンドが実行中であることを確認してください。`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `最終同期: {time}`, + 'backendSettings.sync.neverSynced': `未同期`, + 'backendSettings.sync.performers': `インデックス内のパフォーマー: {count}人`, + 'backendSettings.sync.button': `同期`, + 'backendSettings.sync.syncing': `同期中\u2026`, + 'backendSettings.sync.done': `完了`, + 'backendSettings.sync.alreadyRunning': `同期はすでに進行中です`, + 'backendSettings.sync.error': `同期に失敗しました`, + 'backendSettings.sync.connectionLost': `接続が切断されました`, 'faceMatch.title': `現在のフレーム`, 'faceMatch.close': `閉じる`, 'faceMatch.facesSelected': `{faces} 個の顔を検出 · {selected} 個を選択`, @@ -16029,15 +16029,15 @@ 'backendSettings.feedback.unreachable': `Backend är onåbar. Kontrollera URL:en och att backend körs.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Senast synkroniserad: {time}`, + 'backendSettings.sync.neverSynced': `Aldrig synkroniserad`, + 'backendSettings.sync.performers': `{count} performers i index`, + 'backendSettings.sync.button': `Synkronisera`, + 'backendSettings.sync.syncing': `Synkroniserar\u2026`, + 'backendSettings.sync.done': `Klar`, + 'backendSettings.sync.alreadyRunning': `Synkronisering pågår redan`, + 'backendSettings.sync.error': `Synkronisering misslyckades`, + 'backendSettings.sync.connectionLost': `Anslutningen bröts`, 'faceMatch.title': `AKTUELL RUTA`, 'faceMatch.close': `Stäng`, 'faceMatch.facesSelected': `{faces} ansikten hittade · {selected} valda`, @@ -16178,15 +16178,15 @@ 'backendSettings.feedback.unreachable': `Backend non raggiungibile. Controlla l'URL e che il backend sia in esecuzione.`, // ---- Stash Sync ---- 'backendSettings.sync.title': `Stash Sync`, - 'backendSettings.sync.lastSynced': `Last synced: {time}`, - 'backendSettings.sync.neverSynced': `Never synced`, - 'backendSettings.sync.performers': `{count} performers in index`, - 'backendSettings.sync.button': `Sync`, - 'backendSettings.sync.syncing': `Syncing\u2026`, - 'backendSettings.sync.done': `Done`, - 'backendSettings.sync.alreadyRunning': `Sync already in progress`, - 'backendSettings.sync.error': `Sync failed`, - 'backendSettings.sync.connectionLost': `Connection lost`, + 'backendSettings.sync.lastSynced': `Ultima sincronizzazione: {time}`, + 'backendSettings.sync.neverSynced': `Mai sincronizzato`, + 'backendSettings.sync.performers': `{count} performer nell'indice`, + 'backendSettings.sync.button': `Sincronizza`, + 'backendSettings.sync.syncing': `Sincronizzazione\u2026`, + 'backendSettings.sync.done': `Fatto`, + 'backendSettings.sync.alreadyRunning': `Sincronizzazione già in corso`, + 'backendSettings.sync.error': `Sincronizzazione non riuscita`, + 'backendSettings.sync.connectionLost': `Connessione persa`, // ---- FaceMatchModal.tsx ---- 'faceMatch.title': `FOTO CORRENTE`, 'faceMatch.close': `Chiudi`,