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