diff --git a/public/intl/messages/ar-SA.json b/public/intl/messages/ar-SA.json index 2632c0a19..6a6119d28 100644 --- a/public/intl/messages/ar-SA.json +++ b/public/intl/messages/ar-SA.json @@ -442,6 +442,7 @@ "go-to-settings": "الذهاب إلى الإعدادات", "incorrect-username-password": "اسم المستخدم او كلمة المرور غير صحيحة.", "invalid-domain": "النطاق غير صحيح", + "invalid-value": "قيمة غير صالحة", "min-password-length": "اقل عدد مسموح به {n} حرف/أحرف", "new-version-available": "إصدار جديد من Umami {version} متاح!", "no-data-available": "لا توجد بيانات متاحة.", diff --git a/public/intl/messages/be-BY.json b/public/intl/messages/be-BY.json index 8c3a4dc33..e225f6280 100644 --- a/public/intl/messages/be-BY.json +++ b/public/intl/messages/be-BY.json @@ -442,6 +442,7 @@ "go-to-settings": "Да налад", "incorrect-username-password": "Некарэктнае імя карыстальніка/пароль.", "invalid-domain": "Некарэктны дамен", + "invalid-value": "Некарэктнае значэнне", "min-password-length": "Мінімальная даўжыня {n} знакаў", "new-version-available": "Даступная новая версія Umami {version}!", "no-data-available": "Няма дадзеных.", diff --git a/public/intl/messages/bg-BG.json b/public/intl/messages/bg-BG.json index 62b28b8a3..221d07c69 100644 --- a/public/intl/messages/bg-BG.json +++ b/public/intl/messages/bg-BG.json @@ -442,6 +442,7 @@ "go-to-settings": "Отидете в настройките", "incorrect-username-password": "Неправилно потребителско име и/или парола.", "invalid-domain": "Невалиден домейн. Не включвайте http/https.", + "invalid-value": "Невалидна стойност", "min-password-length": "Минимална дължина от {n} символа", "new-version-available": "Има нова версия на Umami {version}!", "no-data-available": "Няма налични данни.", diff --git a/public/intl/messages/bn-BD.json b/public/intl/messages/bn-BD.json index 36a0a0df7..cf6b0b618 100644 --- a/public/intl/messages/bn-BD.json +++ b/public/intl/messages/bn-BD.json @@ -442,6 +442,7 @@ "go-to-settings": "সেটিংস এ যান", "incorrect-username-password": "ভুল ব্যবহারকারীর নাম/পাসওয়ার্ড।", "invalid-domain": "ভুল ডোমেন", + "invalid-value": "অবৈধ মান", "min-password-length": "সর্বনিম্ন {n} অক্ষর", "new-version-available": "Umami {version}-এর নতুন সংস্করণ পাওয়া যাচ্ছে!", "no-data-available": "কোন তথ্য নেই।", diff --git a/public/intl/messages/bs-BA.json b/public/intl/messages/bs-BA.json index 615004bec..f8e3d1aeb 100644 --- a/public/intl/messages/bs-BA.json +++ b/public/intl/messages/bs-BA.json @@ -442,6 +442,7 @@ "go-to-settings": "Idi na postavke", "incorrect-username-password": "Pogrešno korisničko ime i/ili šifra.", "invalid-domain": "Nevalidna domena. Ne uključujte http/https.", + "invalid-value": "Nevažeća vrijednost", "min-password-length": "Minimalna dužina od {n} karaktera", "new-version-available": "Nova verzija Umami {version} je dostupna!", "no-data-available": "Nema dostupnih podataka.", diff --git a/public/intl/messages/ca-ES.json b/public/intl/messages/ca-ES.json index 80a93bfa6..33e0343da 100644 --- a/public/intl/messages/ca-ES.json +++ b/public/intl/messages/ca-ES.json @@ -442,6 +442,7 @@ "go-to-settings": "Vés a la configuració", "incorrect-username-password": "Nom d'usuari o contrasenya incorrectes.", "invalid-domain": "Domini invàlid", + "invalid-value": "Valor no vàlid", "min-password-length": "Longitud mínima de {n} caràcters", "new-version-available": "Una nova versió d'Umami {version} està disponible!", "no-data-available": "No hi ha dades disponibles.", diff --git a/public/intl/messages/cs-CZ.json b/public/intl/messages/cs-CZ.json index 75c5d1ac4..398ca0b2e 100644 --- a/public/intl/messages/cs-CZ.json +++ b/public/intl/messages/cs-CZ.json @@ -442,6 +442,7 @@ "go-to-settings": "Jít do nastavení", "incorrect-username-password": "Nesprávné jméno/heslo.", "invalid-domain": "Neplatná doména", + "invalid-value": "Neplatná hodnota", "min-password-length": "Minimální délka {n} znaků", "new-version-available": "Je k dispozici nová verze Umami {version}!", "no-data-available": "Žádná data.", diff --git a/public/intl/messages/da-DK.json b/public/intl/messages/da-DK.json index 7e9e3ee3b..83adebc71 100644 --- a/public/intl/messages/da-DK.json +++ b/public/intl/messages/da-DK.json @@ -442,6 +442,7 @@ "go-to-settings": "Gå til betjeningspanel", "incorrect-username-password": "Ugyldigt brugernavn/adgangskode.", "invalid-domain": "Ugyldigt domæne", + "invalid-value": "Ugyldig værdi", "min-password-length": "Minimumlængde på {n} tegn", "new-version-available": "En ny version af Umami {version} er tilgængelig!", "no-data-available": "Ingen data tilgængelig.", diff --git a/public/intl/messages/de-CH.json b/public/intl/messages/de-CH.json index c9583d6e5..05e9e0164 100644 --- a/public/intl/messages/de-CH.json +++ b/public/intl/messages/de-CH.json @@ -442,6 +442,7 @@ "go-to-settings": "Zu de Istellige", "incorrect-username-password": "Falsches Passwort oder Benutzername.", "invalid-domain": "Ungültigi Domain", + "invalid-value": "Ungültiger Wärt", "min-password-length": "Miminamli längi vo {n} Zeiche", "new-version-available": "Es isch en neue Version vo Umami {version} verfügbar!", "no-data-available": "Kei Date vorhande.", diff --git a/public/intl/messages/de-DE.json b/public/intl/messages/de-DE.json index c6567872b..cab9c9567 100644 --- a/public/intl/messages/de-DE.json +++ b/public/intl/messages/de-DE.json @@ -442,6 +442,7 @@ "go-to-settings": "Zu den Einstellungen", "incorrect-username-password": "Falsches Passwort oder Benutzername.", "invalid-domain": "Ungültige Domain", + "invalid-value": "Ungültiger Wert", "min-password-length": "Minimale Länge von {n} Zeichen", "new-version-available": "Eine neue Version von Umami ist verfügbar: {version}", "no-data-available": "Keine Daten vorhanden.", diff --git a/public/intl/messages/el-GR.json b/public/intl/messages/el-GR.json index ef113050d..427a97638 100644 --- a/public/intl/messages/el-GR.json +++ b/public/intl/messages/el-GR.json @@ -442,6 +442,7 @@ "go-to-settings": "Μεταβείτε στις ρυθμίσεις", "incorrect-username-password": "Εσφαλμένο όνομα χρήστη / κωδικός πρόσβασης.", "invalid-domain": "Μη έγκυρος τομέας", + "invalid-value": "Μη έγκυρη τιμή", "min-password-length": "Ελάχιστο μήκος {n} χαρακτήρων", "new-version-available": "Μια νέα έκδοση του Umami {version} είναι διαθέσιμη!", "no-data-available": "Δεν υπάρχουν διαθέσιμα δεδομένα.", diff --git a/public/intl/messages/en-GB.json b/public/intl/messages/en-GB.json index d246d40f9..877612bcc 100644 --- a/public/intl/messages/en-GB.json +++ b/public/intl/messages/en-GB.json @@ -442,6 +442,7 @@ "go-to-settings": "Go to settings", "incorrect-username-password": "Incorrect username/password.", "invalid-domain": "Invalid domain", + "invalid-value": "Invalid value", "min-password-length": "Minimum length of {n} characters", "new-version-available": "A new version of Umami {version} is available!", "no-data-available": "No data available.", diff --git a/public/intl/messages/es-ES.json b/public/intl/messages/es-ES.json index bfbb49793..d931c61c1 100644 --- a/public/intl/messages/es-ES.json +++ b/public/intl/messages/es-ES.json @@ -442,6 +442,7 @@ "go-to-settings": "Ir a la configuración", "incorrect-username-password": "Nombre de usuario o contraseña incorrectos.", "invalid-domain": "Dominio inválido", + "invalid-value": "Valor no válido", "min-password-length": "Longitud mínima de {n} caracteres", "new-version-available": "Una nueva versión de Umami {version} está disponible", "no-data-available": "No hay información disponible.", diff --git a/public/intl/messages/fa-IR.json b/public/intl/messages/fa-IR.json index 8955d166a..ef6ce9f51 100644 --- a/public/intl/messages/fa-IR.json +++ b/public/intl/messages/fa-IR.json @@ -443,6 +443,7 @@ "go-to-settings": "رفتن به تنظیمات", "incorrect-username-password": "نام کاربری / رمز نادرست است.", "invalid-domain": "دامنه نامعتبر است.", + "invalid-value": "مقدار نامعتبر", "min-password-length": "حداقل طول {n} کاراکتر است.", "new-version-available": "نسخه‌ی جدیدی از Umami {version} در دسترس است.", "no-data-available": "اطلاعاتی موجود نیست.", diff --git a/public/intl/messages/fi-FI.json b/public/intl/messages/fi-FI.json index 756b20064..71cdf534a 100644 --- a/public/intl/messages/fi-FI.json +++ b/public/intl/messages/fi-FI.json @@ -442,6 +442,7 @@ "go-to-settings": "Mene asetuksiin", "incorrect-username-password": "Väärä käyttäjänimi/salasana.", "invalid-domain": "Virheellinen verkkotunnus", + "invalid-value": "Virheellinen arvo", "min-password-length": "Vähimmäispituus {n} merkkiä", "new-version-available": "Umamista on saatavilla uusi versio {version}!", "no-data-available": "Tietoja ei ole käytettävissä.", diff --git a/public/intl/messages/fo-FO.json b/public/intl/messages/fo-FO.json index 3697ff641..c2de794fe 100644 --- a/public/intl/messages/fo-FO.json +++ b/public/intl/messages/fo-FO.json @@ -442,6 +442,7 @@ "go-to-settings": "Far til stillingar", "incorrect-username-password": "Skeivt brúkaranavn/loyniorð.", "invalid-domain": "Ógilt økisnavn", + "invalid-value": "Ógilt virði", "min-password-length": "Minsta longd er {n} tekn", "new-version-available": "Nýggj útgáva av Umami {version} er tøk!", "no-data-available": "Einki data tøk.", diff --git a/public/intl/messages/fr-FR.json b/public/intl/messages/fr-FR.json index 8457abbc7..aa002bf54 100644 --- a/public/intl/messages/fr-FR.json +++ b/public/intl/messages/fr-FR.json @@ -442,6 +442,7 @@ "go-to-settings": "Aller aux paramètres", "incorrect-username-password": "Nom d'utilisateur/Mot de passe incorrect.", "invalid-domain": "Domaine invalide", + "invalid-value": "Valeur invalide", "min-password-length": "Taille minimale de {n} caractères", "new-version-available": "Une nouvelle version d'Umami {version} est disponible !", "no-data-available": "Aucune donnée disponible.", diff --git a/public/intl/messages/ga-ES.json b/public/intl/messages/ga-ES.json index 55ebfb943..bf79723f6 100644 --- a/public/intl/messages/ga-ES.json +++ b/public/intl/messages/ga-ES.json @@ -442,6 +442,7 @@ "go-to-settings": "Ir aos axustes", "incorrect-username-password": "Credenciais incorrectas.", "invalid-domain": "Dominio non válido", + "invalid-value": "Valor non válido", "min-password-length": "Lonxitude mínima de {n} caracteres", "new-version-available": "Unha nova versión de Umami {version} está dispoñible!", "no-data-available": "Sen datos dispoñibles.", diff --git a/public/intl/messages/he-IL.json b/public/intl/messages/he-IL.json index f7ff0ceb1..6cdb40a28 100644 --- a/public/intl/messages/he-IL.json +++ b/public/intl/messages/he-IL.json @@ -442,6 +442,7 @@ "go-to-settings": "להדרותג", "incorrect-username-password": "שם משתמש או סיסמה לא נכונים", "invalid-domain": "דומיין לא תקין", + "invalid-value": "ערך לא תקין", "min-password-length": "אורך מינימלי של {n} תווים", "new-version-available": "גרסה חדשה של Umami {version} זמינה!", "no-data-available": "אין מידע זמין", diff --git a/public/intl/messages/hi-IN.json b/public/intl/messages/hi-IN.json index a7a956ec2..efc6bf1a3 100644 --- a/public/intl/messages/hi-IN.json +++ b/public/intl/messages/hi-IN.json @@ -442,6 +442,7 @@ "go-to-settings": "समायोजन में जाइए", "incorrect-username-password": "ग़लत उपयोगकर्ता नाम / पासवर्ड।", "invalid-domain": "अमान्य डोमेन", + "invalid-value": "अमान्य मान", "min-password-length": "न्यूनतम {n} वर्ण", "new-version-available": "Umami {version} का नया संस्करण उपलब्ध है!", "no-data-available": "कोई डेटा उपलब्ध नहीं है।", diff --git a/public/intl/messages/hr-HR.json b/public/intl/messages/hr-HR.json index 14a7b315b..a11c30851 100644 --- a/public/intl/messages/hr-HR.json +++ b/public/intl/messages/hr-HR.json @@ -442,6 +442,7 @@ "go-to-settings": "Idi u postavke", "incorrect-username-password": "Neispravno korisničke ime/lozinka.", "invalid-domain": "Nevaljana domena. Ne uključujte http/https.", + "invalid-value": "Nevaljana vrijednost", "min-password-length": "Minimalna duljina od {n} znakova", "new-version-available": "Dostupna je nova verzija Umami {version}!", "no-data-available": "Nema dostupnih podataka.", diff --git a/public/intl/messages/hu-HU.json b/public/intl/messages/hu-HU.json index 3bff7afc2..bd568f4b2 100644 --- a/public/intl/messages/hu-HU.json +++ b/public/intl/messages/hu-HU.json @@ -442,6 +442,7 @@ "go-to-settings": "Tovább a beállításokhoz", "incorrect-username-password": "Érvénytelen felhasználónév/jelszó.", "invalid-domain": "Érvénytelen domain", + "invalid-value": "Érvénytelen érték", "min-password-length": "Minimum {n} karakter hosszúság", "new-version-available": "Elérhető az Umami {version} új verziója!", "no-data-available": "Nincs rendelkezésre álló adat.", diff --git a/public/intl/messages/id-ID.json b/public/intl/messages/id-ID.json index ae29c97ea..c877786f2 100644 --- a/public/intl/messages/id-ID.json +++ b/public/intl/messages/id-ID.json @@ -442,6 +442,7 @@ "go-to-settings": "Pergi ke pengaturan", "incorrect-username-password": "Nama pengguna/kata sandi salah.", "invalid-domain": "Domain tidak valid", + "invalid-value": "Nilai tidak valid", "min-password-length": "Minimal {n} karakter", "new-version-available": "Versi baru dari Umami {version} telah tersedia!", "no-data-available": "Tidak ada data.", diff --git a/public/intl/messages/it-IT.json b/public/intl/messages/it-IT.json index ea522db08..6c7ff6bd6 100644 --- a/public/intl/messages/it-IT.json +++ b/public/intl/messages/it-IT.json @@ -442,6 +442,7 @@ "go-to-settings": "Vai alle impostazioni", "incorrect-username-password": "Username o password non corretti.", "invalid-domain": "Dominio non valido", + "invalid-value": "Valore non valido", "min-password-length": "Lunghezza minima di {n} caratteri", "new-version-available": "È disponibile una nuova versione di Umami {version}!", "no-data-available": "Nessun dato disponibile.", diff --git a/public/intl/messages/ja-JP.json b/public/intl/messages/ja-JP.json index 025f373ae..94ef7ed82 100644 --- a/public/intl/messages/ja-JP.json +++ b/public/intl/messages/ja-JP.json @@ -442,6 +442,7 @@ "go-to-settings": "設定に移動する", "incorrect-username-password": "ユーザー名またはパスワードが間違っています。", "invalid-domain": "無効なドメインです。http/httpsを含めないでください。", + "invalid-value": "無効な値", "min-password-length": "最小文字数は{n}文字です", "new-version-available": "Umamiの新しいバージョン{version}が利用可能です!", "no-data-available": "データがありません。", diff --git a/public/intl/messages/km-KH.json b/public/intl/messages/km-KH.json index 9a462e865..57732fc92 100644 --- a/public/intl/messages/km-KH.json +++ b/public/intl/messages/km-KH.json @@ -442,6 +442,7 @@ "go-to-settings": "ការកំណត់", "incorrect-username-password": "ឈ្មោះអ្នកប្រើឬពាក្យសម្ងាត់មិនត្រឹមត្រូវ។", "invalid-domain": "Domain មិន​ត្រឹមត្រូវ", + "invalid-value": "តម្លៃមិនត្រឹមត្រូវ", "min-password-length": "តិចបំផុតដែលមានអក្សរ {n} តួអក្សរ", "new-version-available": "Version ថ្មីនៃ Umami {version} អាចប្រើប្រាស់បានហើយ!", "no-data-available": "មិនមានទិន្នន័យ។", diff --git a/public/intl/messages/ko-KR.json b/public/intl/messages/ko-KR.json index e0a7c0228..0e83bcf0a 100644 --- a/public/intl/messages/ko-KR.json +++ b/public/intl/messages/ko-KR.json @@ -442,6 +442,7 @@ "go-to-settings": "설정으로 이동", "incorrect-username-password": "사용자 이름 또는 비밀번호를 잘못 입력했습니다.", "invalid-domain": "잘못된 도메인입니다. http/https를 포함하지 마세요.", + "invalid-value": "잘못된 값", "min-password-length": "최소 {n}자여야 합니다", "new-version-available": "Umami의 새 버전 {version}을(를) 사용할 수 있습니다!", "no-data-available": "사용할 수 있는 데이터가 없습니다.", diff --git a/public/intl/messages/lt-LT.json b/public/intl/messages/lt-LT.json index 8c54f9afb..f7c283ffb 100644 --- a/public/intl/messages/lt-LT.json +++ b/public/intl/messages/lt-LT.json @@ -442,6 +442,7 @@ "go-to-settings": "Eiti į nustatymus", "incorrect-username-password": "Neteisingas vartotojo vardas/slaptažodis.", "invalid-domain": "Klaidingas domenas", + "invalid-value": "Netinkama reikšmė", "min-password-length": "Reikia bent {n} simbolių", "new-version-available": "Išleista nauja 'Umami' {version} versija!", "no-data-available": "Nėra jokių duomenų.", diff --git a/public/intl/messages/mn-MN.json b/public/intl/messages/mn-MN.json index 7be8aace1..aaa03aff3 100644 --- a/public/intl/messages/mn-MN.json +++ b/public/intl/messages/mn-MN.json @@ -442,6 +442,7 @@ "go-to-settings": "Тохиргоо руу очих", "incorrect-username-password": "Буруу хэрэглэгчийн нэр/нууц үг.", "invalid-domain": "Буруу домэйн", + "invalid-value": "Буруу утга", "min-password-length": "Хамгийн багадаа {n} тэмдэгт", "new-version-available": "Umami-н шинэ хувилбар {version} гарсан байна!", "no-data-available": "Өгөгдөл алга.", diff --git a/public/intl/messages/ms-MY.json b/public/intl/messages/ms-MY.json index 000b38a5a..f45c6afac 100644 --- a/public/intl/messages/ms-MY.json +++ b/public/intl/messages/ms-MY.json @@ -442,6 +442,7 @@ "go-to-settings": "Pergi ke tetapan", "incorrect-username-password": "Pengguna/kata laluan tidak betul.", "invalid-domain": "Domain tidak sah", + "invalid-value": "Nilai tidak sah", "min-password-length": "Panjang minimum {n} aksara", "new-version-available": "Versi baharu Umami {version} tersedia!", "no-data-available": "Tiada data yang boleh didapati.", diff --git a/public/intl/messages/my-MM.json b/public/intl/messages/my-MM.json index 0eeb69b74..a2f6d883a 100644 --- a/public/intl/messages/my-MM.json +++ b/public/intl/messages/my-MM.json @@ -442,6 +442,7 @@ "go-to-settings": "ဆက်တင်သို့ သွားရန်", "incorrect-username-password": "အသုံးပြုသူအမည် သို့မဟုတ် စကားဝှက် မှားနေသည်", "invalid-domain": "ဒိုမိန်း မမှန်ပါ http/https. မပါရပါ", + "invalid-value": "မမှန်ကန်သော တန်ဖိုး", "min-password-length": "အနည်းဆုံး {n} character ရှိရမည်", "new-version-available": "အူမာမီ {version} အသစ်ထွက်နေပါပြီ", "no-data-available": "ဒေတာ မရှိပါ", diff --git a/public/intl/messages/nb-NO.json b/public/intl/messages/nb-NO.json index bb7a972cd..65bec2340 100644 --- a/public/intl/messages/nb-NO.json +++ b/public/intl/messages/nb-NO.json @@ -442,6 +442,7 @@ "go-to-settings": "Gå til innstillinger", "incorrect-username-password": "Ugyldig brukernavn/passord.", "invalid-domain": "Ugyldig domene", + "invalid-value": "Ugyldig verdi", "min-password-length": "Minimumslengde på {n} tegn", "new-version-available": "En ny versjon av Umami {version} er tilgjengelig!", "no-data-available": "Ingen data tilgjengelig.", diff --git a/public/intl/messages/nl-NL.json b/public/intl/messages/nl-NL.json index fe774c589..0eb2214f6 100644 --- a/public/intl/messages/nl-NL.json +++ b/public/intl/messages/nl-NL.json @@ -442,6 +442,7 @@ "go-to-settings": "Naar instellingen", "incorrect-username-password": "Incorrecte gebruikersnaam/wachtwoord.", "invalid-domain": "Ongeldig domein", + "invalid-value": "Ongeldige waarde", "min-password-length": "Minimale lengte van {n} tekens", "new-version-available": "Een nieuwe versie van Umami {version} is beschikbaar!", "no-data-available": "Geen gegevens beschikbaar.", diff --git a/public/intl/messages/pl-PL.json b/public/intl/messages/pl-PL.json index 875cfc12c..4f7fc2468 100644 --- a/public/intl/messages/pl-PL.json +++ b/public/intl/messages/pl-PL.json @@ -442,6 +442,7 @@ "go-to-settings": "Przejdź do ustawień", "incorrect-username-password": "Nieprawidłowa nazwa użytkownika lub hasło.", "invalid-domain": "Nieprawidłowa witryna", + "invalid-value": "Nieprawidłowa wartość", "min-password-length": "Minimalna długość {n} znaków", "new-version-available": "Nowa wersja Umami {version} jest dostępna!", "no-data-available": "Brak dostępnych danych.", diff --git a/public/intl/messages/pt-BR.json b/public/intl/messages/pt-BR.json index e820bb2ad..e35af328e 100644 --- a/public/intl/messages/pt-BR.json +++ b/public/intl/messages/pt-BR.json @@ -442,6 +442,7 @@ "go-to-settings": "Ir para as configurações", "incorrect-username-password": "Nome de usuário ou senha incorretos.", "invalid-domain": "Domínio inválido", + "invalid-value": "Valor inválido", "min-password-length": "A senha deve ter no mínimo {n} caracteres", "new-version-available": "Uma nova versão {version} do Umami está disponível!", "no-data-available": "Não há dados disponíveis.", diff --git a/public/intl/messages/pt-PT.json b/public/intl/messages/pt-PT.json index ed24581b1..962f9f06e 100644 --- a/public/intl/messages/pt-PT.json +++ b/public/intl/messages/pt-PT.json @@ -442,6 +442,7 @@ "go-to-settings": "Ir para as definições", "incorrect-username-password": "Nome de utilizador/senha incorretos.", "invalid-domain": "Domínio inválido", + "invalid-value": "Valor inválido", "min-password-length": "Comprimento mínimo de {n} caracteres", "new-version-available": "Uma nova versão do Umami {version} está disponível!", "no-data-available": "Sem dados disponíveis.", diff --git a/public/intl/messages/ro-RO.json b/public/intl/messages/ro-RO.json index cc5947e15..625ccdead 100644 --- a/public/intl/messages/ro-RO.json +++ b/public/intl/messages/ro-RO.json @@ -442,6 +442,7 @@ "go-to-settings": "Mergi la Setări", "incorrect-username-password": "Nume utilizator / parolă incorecte.", "invalid-domain": "Domeniul nu este valid", + "invalid-value": "Valoare invalidă", "min-password-length": "Lungimea minimă este de {n} caractere", "new-version-available": "O nouă versiune de Umami {version} este disponibilă!", "no-data-available": "Nicio informație disponibilă.", diff --git a/public/intl/messages/ru-RU.json b/public/intl/messages/ru-RU.json index 275035659..a884a97fe 100644 --- a/public/intl/messages/ru-RU.json +++ b/public/intl/messages/ru-RU.json @@ -442,6 +442,7 @@ "go-to-settings": "Перейти к настройкам", "incorrect-username-password": "Неверное имя пользователя/пароль.", "invalid-domain": "Некорректный домен", + "invalid-value": "Некорректное значение", "min-password-length": "Минимальная длина {n} символов", "new-version-available": "Вышла новая версия Umami {version}!", "no-data-available": "Нет данных.", diff --git a/public/intl/messages/si-LK.json b/public/intl/messages/si-LK.json index 5efdb319f..23538a45c 100644 --- a/public/intl/messages/si-LK.json +++ b/public/intl/messages/si-LK.json @@ -442,6 +442,7 @@ "go-to-settings": "සැකසීම් වෙත යන්න", "incorrect-username-password": "වැරදි පරිශීලක නාමය/මුරපදය.", "invalid-domain": "වලංගු නොවන ඩොමේනයකි. http/https ඇතුළත් නොකරන්න.", + "invalid-value": "වලංගු නොවන අගයකි", "min-password-length": "අවම {n} අක්ෂර දිග", "new-version-available": "Umami හි නව අනුවාදයක් {version} ලබා ගත හැකිය!", "no-data-available": "පෙන්වීමට දත්ත නොමැත.", diff --git a/public/intl/messages/sk-SK.json b/public/intl/messages/sk-SK.json index a70b8b9e0..30cf72f66 100644 --- a/public/intl/messages/sk-SK.json +++ b/public/intl/messages/sk-SK.json @@ -442,6 +442,7 @@ "go-to-settings": "Ísť do nastavení", "incorrect-username-password": "Nesprávné meno/heslo.", "invalid-domain": "Neplatná doména", + "invalid-value": "Neplatná hodnota", "min-password-length": "Minimálna dĺžka {n} znakov", "new-version-available": "K dispozícii je nová verzia Umami {version}!", "no-data-available": "Žiadne data.", diff --git a/public/intl/messages/sl-SI.json b/public/intl/messages/sl-SI.json index d2f0e3821..c21b8237f 100644 --- a/public/intl/messages/sl-SI.json +++ b/public/intl/messages/sl-SI.json @@ -442,6 +442,7 @@ "go-to-settings": "Pojdi v nastavitve", "incorrect-username-password": "Nepravilno uporabniško ime/geslo.", "invalid-domain": "Neveljavna domena", + "invalid-value": "Neveljavna vrednost", "min-password-length": "Najmanjša dolžina je {n} znakov", "new-version-available": "Na voljo je nova verzija programa Umami {version}!", "no-data-available": "Podatki niso na voljo.", diff --git a/public/intl/messages/sv-SE.json b/public/intl/messages/sv-SE.json index 3c2a69ee3..15aa2c096 100644 --- a/public/intl/messages/sv-SE.json +++ b/public/intl/messages/sv-SE.json @@ -442,6 +442,7 @@ "go-to-settings": "Gå till inställningar", "incorrect-username-password": "Felaktigt användarnamn/lösenord.", "invalid-domain": "Ogiltig domän", + "invalid-value": "Ogiltigt värde", "min-password-length": "Minst {n} tecken", "new-version-available": "En ny version av Umami {version} är tillgänglig!", "no-data-available": "Ingen data tillgänglig.", diff --git a/public/intl/messages/ta-IN.json b/public/intl/messages/ta-IN.json index 6095947b7..44e6db5bd 100644 --- a/public/intl/messages/ta-IN.json +++ b/public/intl/messages/ta-IN.json @@ -442,6 +442,7 @@ "go-to-settings": "அமைப்புகளுக்குச் செல்லவும்", "incorrect-username-password": "தவறான பயனர்பெயர் / கடவுச்சொல்.", "invalid-domain": "தவறான கள முகவரி", + "invalid-value": "தவறான மதிப்பு", "min-password-length": "குறைந்தபட்சம் {n} எழுத்துகள் தேவை", "new-version-available": "Umami {version} புதிய பதிப்பு கிடைக்கிறது!", "no-data-available": "தரவு எதுவும் கிடைக்கவில்லை.", diff --git a/public/intl/messages/th-TH.json b/public/intl/messages/th-TH.json index fe42f6abf..6e8eda790 100644 --- a/public/intl/messages/th-TH.json +++ b/public/intl/messages/th-TH.json @@ -442,6 +442,7 @@ "go-to-settings": "ไปที่การตั้งค่า", "incorrect-username-password": "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง.", "invalid-domain": "โดเมนไม่ถูกต้อง", + "invalid-value": "ค่าไม่ถูกต้อง", "min-password-length": "ความยาวขั้นต่ำ {n} ตัวอักษร", "new-version-available": "Umami เวอร์ชันใหม่ {version} พร้อมใช้งานแล้ว!", "no-data-available": "ไม่มีข้อมูล.", diff --git a/public/intl/messages/tr-TR.json b/public/intl/messages/tr-TR.json index 47480a3fd..2c36fa280 100644 --- a/public/intl/messages/tr-TR.json +++ b/public/intl/messages/tr-TR.json @@ -442,6 +442,7 @@ "go-to-settings": "Ayarlara git", "incorrect-username-password": "Hatalı kullanıcı adı ya da parola.", "invalid-domain": "Geçersiz alan adı", + "invalid-value": "Geçersiz değer", "min-password-length": "Minimum {n} karakter uzunluğu", "new-version-available": "Yeni versiyon Umami {version} mevcut!", "no-data-available": "Henüz hiç veri yok.", diff --git a/public/intl/messages/uk-UA.json b/public/intl/messages/uk-UA.json index 9c52ce6bf..b93cfdfb9 100644 --- a/public/intl/messages/uk-UA.json +++ b/public/intl/messages/uk-UA.json @@ -442,6 +442,7 @@ "go-to-settings": "Перейти до налаштувань", "incorrect-username-password": "Невірне ім'я користувача або пароль.", "invalid-domain": "Некоректний домен", + "invalid-value": "Некоректне значення", "min-password-length": "Мінімальна довжина {n} символів", "new-version-available": "Вийшла нова версія Umami {version}!", "no-data-available": "Немає даних.", diff --git a/public/intl/messages/ur-PK.json b/public/intl/messages/ur-PK.json index 04f1879a0..741486dab 100644 --- a/public/intl/messages/ur-PK.json +++ b/public/intl/messages/ur-PK.json @@ -442,6 +442,7 @@ "go-to-settings": "ترتیبات پر جائیں", "incorrect-username-password": "غلط صارف نام/پاس ورڈ۔", "invalid-domain": "غلط ڈومین", + "invalid-value": "غلط قدر", "min-password-length": "کم از کم {n} حروف کی لمبائی", "new-version-available": "Umami کا نیا ورژن {version} دستیاب ہے!", "no-data-available": "مواد موجود نہیں ہے.", diff --git a/public/intl/messages/uz-UZ.json b/public/intl/messages/uz-UZ.json index aacd48927..972e0d2aa 100644 --- a/public/intl/messages/uz-UZ.json +++ b/public/intl/messages/uz-UZ.json @@ -442,6 +442,7 @@ "go-to-settings": "Sozlamalarga oʻtish", "incorrect-username-password": "Notoʻgʻri foydalanuvchi nomi va/yoki parol.", "invalid-domain": "Notoʻgʻri domen. http/https qoʻshmang.", + "invalid-value": "Notoʻgʻri qiymat", "min-password-length": "Minimal uzunligi {n} belgidan", "new-version-available": "Umami'ning yangi **{version}** versiyasi mavjud!", "no-data-available": "Ma'lumotlar mavjud emas.", diff --git a/public/intl/messages/vi-VN.json b/public/intl/messages/vi-VN.json index 98c4a72c8..d8f45c969 100644 --- a/public/intl/messages/vi-VN.json +++ b/public/intl/messages/vi-VN.json @@ -442,6 +442,7 @@ "go-to-settings": "Chuyển đến cài đặt", "incorrect-username-password": "Sai tên đăng nhập/mật khẩu.", "invalid-domain": "Tên miền không hợp lệ", + "invalid-value": "Giá trị không hợp lệ", "min-password-length": "Độ dài tối thiểu {n} ký tự", "new-version-available": "Có phiên bản mới của Umami {version}!", "no-data-available": "Không có dữ liệu.", diff --git a/public/intl/messages/zh-CN.json b/public/intl/messages/zh-CN.json index f5880634f..e868a6728 100644 --- a/public/intl/messages/zh-CN.json +++ b/public/intl/messages/zh-CN.json @@ -442,6 +442,7 @@ "go-to-settings": "去设置", "incorrect-username-password": "用户名或密码不正确。", "invalid-domain": "无效域名", + "invalid-value": "无效值", "min-password-length": "密码最短长度为 {n} 个字符", "new-version-available": "Umami 新版本 {version} 已发布!", "no-data-available": "暂无数据。", diff --git a/public/intl/messages/zh-TW.json b/public/intl/messages/zh-TW.json index 246689b61..3fd6b61b4 100644 --- a/public/intl/messages/zh-TW.json +++ b/public/intl/messages/zh-TW.json @@ -442,6 +442,7 @@ "go-to-settings": "前往設定", "incorrect-username-password": "使用者名稱或密碼不正確。", "invalid-domain": "無效的網域。請勿包含 http/https。", + "invalid-value": "無效的值", "min-password-length": "密碼長度至少需 {n} 個字元", "new-version-available": "Umami {version} 的新版本已推出!", "no-data-available": "沒有可用的資料。", diff --git a/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx b/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx index 555aeec9c..8c086a963 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/funnels/Funnel.tsx @@ -30,31 +30,31 @@ export function Funnel({ id, name, type, parameters, websiteId, allowEdit = true const operatorLabels = useOperatorLabels(); return ( - - - - - - - {name} - - + + + + + + {name} + + + + {allowEdit && !isSharePage && ( + + + {({ close }) => } + - {allowEdit && !isSharePage && ( - - - {({ close }) => } - - - )} - + )} + + {data?.map( ( { type, value, filters, visitors, previous, dropped, dropoff, remaining }: FunnelResult, @@ -142,7 +142,7 @@ export function Funnel({ id, name, type, parameters, websiteId, allowEdit = true ); }, )} - - + + ); } diff --git a/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx b/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx index 13d7a389e..5d0293d9d 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/goals/Goal.tsx @@ -46,63 +46,61 @@ export function Goal({ const isPage = parameters?.type === 'path'; return ( - - {data && ( - - - - - - {name} - - - - {allowEdit && !isSharePage && ( - - - {({ close }) => } - - - )} - - - {t(isPage ? labels.viewedPage : labels.triggeredEvent)} - {t(labels.conversionRate)} - - - - {parameters.type === 'path' ? : } - {parameters.value} - - - - - - {`${formatLongNumber( - data?.num, - )} / ${formatLongNumber(data?.total)}`} - - - - - - {data?.total ? Math.round((+data?.num / +data?.total) * 100) : '0'}% + + + + + + {name} - - )} - + + {allowEdit && !isSharePage && ( + + + {({ close }) => } + + + )} + + + + {t(isPage ? labels.viewedPage : labels.triggeredEvent)} + {t(labels.conversionRate)} + + + + {parameters.type === 'path' ? : } + {parameters.value} + + + + + + {`${formatLongNumber( + data?.num, + )} / ${formatLongNumber(data?.total)}`} + + + + + + {data?.total ? Math.round((+data?.num / +data?.total) * 100) : '0'}% + + + + ); } diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts index 5c76aef4a..2a09c6ad0 100644 --- a/src/lib/prisma.ts +++ b/src/lib/prisma.ts @@ -847,7 +847,7 @@ function transaction(input: any, options?: any) { return client.$transaction(input, options); } -function getSchema() { +export function getSchema() { const databaseUrl = process.env.DATABASE_URL; if (!databaseUrl) { diff --git a/src/queries/prisma/website.test.ts b/src/queries/prisma/website.test.ts new file mode 100644 index 000000000..a1a993174 --- /dev/null +++ b/src/queries/prisma/website.test.ts @@ -0,0 +1,192 @@ +import { beforeEach, describe, expect, test, vi } from 'vitest'; +import { deleteWebsite, resetWebsite } from './website'; + +const { transactionMock, redisDelMock, redisSetMock } = vi.hoisted(() => ({ + transactionMock: vi.fn(), + redisDelMock: vi.fn(), + redisSetMock: vi.fn(), +})); + +vi.mock('@/lib/prisma', () => ({ + default: { + transaction: transactionMock, + }, + getSchema: () => new URL(process.env.DATABASE_URL || '').searchParams.get('schema'), +})); + +vi.mock('@/lib/redis', () => ({ + default: { + client: { + del: redisDelMock, + set: redisSetMock, + }, + }, +})); + +function createDeleteTx(calls: string[]) { + return { + sessionReplaySaved: { + deleteMany: vi.fn(async () => { + calls.push('sessionReplaySaved'); + }), + }, + sessionReplay: { + deleteMany: vi.fn(async () => { + calls.push('sessionReplay'); + }), + }, + heatmapEvent: { + deleteMany: vi.fn(async () => { + calls.push('heatmapEvent'); + }), + }, + revenue: { + deleteMany: vi.fn(async () => { + calls.push('revenue'); + }), + }, + eventData: { + deleteMany: vi.fn(async () => { + calls.push('eventData'); + }), + }, + $executeRawUnsafe: vi.fn(async () => { + calls.push('rawSql'); + }), + sessionData: { + deleteMany: vi.fn(async () => { + calls.push('sessionData'); + }), + }, + sessionLink: { + deleteMany: vi.fn(async () => { + calls.push('sessionLink'); + }), + }, + websiteEvent: { + deleteMany: vi.fn(async () => { + calls.push('websiteEvent'); + }), + }, + session: { + deleteMany: vi.fn(async () => { + calls.push('session'); + }), + }, + report: { + deleteMany: vi.fn(async () => { + calls.push('report'); + }), + }, + segment: { + deleteMany: vi.fn(async () => { + calls.push('segment'); + }), + }, + share: { + deleteMany: vi.fn(async () => { + calls.push('share'); + }), + }, + website: { + delete: vi.fn(async () => { + calls.push('websiteDelete'); + return { id: 'website-1' }; + }), + update: vi.fn(async () => { + calls.push('websiteUpdate'); + return { id: 'website-1' }; + }), + }, + }; +} + +describe('website delete dependencies', () => { + beforeEach(() => { + transactionMock.mockReset(); + redisDelMock.mockReset(); + redisSetMock.mockReset(); + delete process.env.CLOUD_MODE; + process.env.DATABASE_URL = 'postgresql://user:pass@localhost:5432/umami?schema=public'; + }); + + test('deleteWebsite runs fast event-data cleanup, a relational safety pass, and heatmap cleanup before deleting website events', async () => { + const calls: string[] = []; + const tx = createDeleteTx(calls); + + transactionMock.mockImplementation(async callback => callback(tx)); + + await deleteWebsite('website-1'); + + expect(tx.eventData.deleteMany).toHaveBeenCalledWith({ + where: { websiteId: 'website-1' }, + }); + expect(tx.heatmapEvent.deleteMany).toHaveBeenCalledWith({ + where: { websiteId: 'website-1' }, + }); + expect(tx.$executeRawUnsafe).toHaveBeenNthCalledWith(1, 'SET search_path TO "public";'); + expect(tx.$executeRawUnsafe).toHaveBeenNthCalledWith( + 2, + expect.stringContaining('delete from event_data'), + 'website-1', + ); + expect(tx.$executeRawUnsafe).toHaveBeenNthCalledWith( + 2, + expect.stringContaining('website_event.website_id = $1'), + 'website-1', + ); + expect(calls).toEqual([ + 'sessionReplaySaved', + 'sessionReplay', + 'heatmapEvent', + 'revenue', + 'eventData', + 'rawSql', + 'rawSql', + 'sessionData', + 'sessionLink', + 'websiteEvent', + 'session', + 'report', + 'segment', + 'share', + 'websiteDelete', + ]); + }); + + test('resetWebsite uses the same two-pass event-data cleanup before resetting the website', async () => { + const calls: string[] = []; + const tx = createDeleteTx(calls); + + transactionMock.mockImplementation(async callback => callback(tx)); + + await resetWebsite('website-1'); + + expect(tx.eventData.deleteMany).toHaveBeenCalledWith({ + where: { websiteId: 'website-1' }, + }); + expect(tx.heatmapEvent.deleteMany).toHaveBeenCalledWith({ + where: { websiteId: 'website-1' }, + }); + expect(tx.$executeRawUnsafe).toHaveBeenNthCalledWith(1, 'SET search_path TO "public";'); + expect(tx.$executeRawUnsafe).toHaveBeenNthCalledWith( + 2, + expect.stringContaining('website_event.website_id = $1'), + 'website-1', + ); + expect(calls).toEqual([ + 'sessionReplaySaved', + 'sessionReplay', + 'heatmapEvent', + 'revenue', + 'eventData', + 'rawSql', + 'rawSql', + 'sessionData', + 'sessionLink', + 'websiteEvent', + 'session', + 'websiteUpdate', + ]); + }); +}); diff --git a/src/queries/prisma/website.ts b/src/queries/prisma/website.ts index 5c2117827..612aca09a 100644 --- a/src/queries/prisma/website.ts +++ b/src/queries/prisma/website.ts @@ -1,6 +1,6 @@ import type { Prisma, Website } from '@/generated/prisma/client'; import { ROLES } from '@/lib/constants'; -import prisma from '@/lib/prisma'; +import prisma, { getSchema } from '@/lib/prisma'; import redis from '@/lib/redis'; import { sanitizeSortFilters } from '@/lib/sort'; import type { QueryFilters } from '@/lib/types'; @@ -8,6 +8,62 @@ import { z } from 'zod'; const WEBSITE_SORT_FIELDS = ['name', 'domain', 'createdAt'] as const; +async function deleteWebsiteDependentData(tx: any, websiteId: string) { + await tx.sessionReplaySaved.deleteMany({ + where: { websiteId }, + }); + + await tx.sessionReplay.deleteMany({ + where: { websiteId }, + }); + + await tx.heatmapEvent.deleteMany({ + where: { websiteId }, + }); + + await tx.revenue.deleteMany({ + where: { websiteId }, + }); + + await tx.eventData.deleteMany({ + where: { websiteId }, + }); + + // Follow the real EventData -> WebsiteEvent dependency to clean up any legacy rows + // whose duplicated websiteId drifted from the parent event row. + const schema = getSchema(); + + if (schema) { + await tx.$executeRawUnsafe(`SET search_path TO "${schema}";`); + } + + await tx.$executeRawUnsafe( + ` + delete from event_data + using website_event + where event_data.website_event_id = website_event.event_id + and website_event.website_id = $1 + `, + websiteId, + ); + + await tx.sessionData.deleteMany({ + where: { websiteId }, + }); + + await tx.sessionLink.deleteMany({ + where: { websiteId }, + }); + + await tx.websiteEvent.deleteMany({ + where: { websiteId }, + }); + + await tx.session.deleteMany({ + where: { websiteId }, + }); +} + export async function findWebsite(criteria: Prisma.WebsiteFindUniqueArgs) { return prisma.client.website.findUnique(criteria); } @@ -142,33 +198,7 @@ export async function resetWebsite(websiteId: string) { return transaction( async tx => { - await tx.sessionReplaySaved.deleteMany({ - where: { websiteId }, - }); - - await tx.sessionReplay.deleteMany({ - where: { websiteId }, - }); - - await tx.revenue.deleteMany({ - where: { websiteId }, - }); - - await tx.eventData.deleteMany({ - where: { websiteId }, - }); - - await tx.sessionData.deleteMany({ - where: { websiteId }, - }); - - await tx.websiteEvent.deleteMany({ - where: { websiteId }, - }); - - await tx.session.deleteMany({ - where: { websiteId }, - }); + await deleteWebsiteDependentData(tx, websiteId); const website = await tx.website.update({ where: { id: websiteId }, @@ -197,33 +227,7 @@ export async function deleteWebsite(websiteId: string) { return transaction( async tx => { - await tx.sessionReplaySaved.deleteMany({ - where: { websiteId }, - }); - - await tx.sessionReplay.deleteMany({ - where: { websiteId }, - }); - - await tx.revenue.deleteMany({ - where: { websiteId }, - }); - - await tx.eventData.deleteMany({ - where: { websiteId }, - }); - - await tx.sessionData.deleteMany({ - where: { websiteId }, - }); - - await tx.websiteEvent.deleteMany({ - where: { websiteId }, - }); - - await tx.session.deleteMany({ - where: { websiteId }, - }); + await deleteWebsiteDependentData(tx, websiteId); await tx.report.deleteMany({ where: { websiteId },